Помогите разобраться с TakeProfitStrategy...

Помогите разобраться с TakeProfitStrategy...
Atom
11/23/2011


Сделал как в примерах...

Quote:

private void OnNewMyTrades(IEnumerable<MyTrade> trades)
{
// фильтруем сделки, чтобы найти те, которые произошли для заявки MyOrder
trades = trades.Where(t => t.Order == MyOrder);
// если не найдена ни одна сделка для заявки MyOrder
if (trades.Count() == 0)
return;
// сама пакетная стратегия так же является параллельной, чтобы она не блокирована основной код робота
var Basket = new BasketStrategy(BasketStrategyFinishModes.All);
// для каждой сделки добавляем для защиты по пакетной стратегии
Basket.ChildStrategies.AddRange(trades.Select(CreateBasket).Cast<Strategy>());
base.ChildStrategies.Add(Basket);
}

BasketStrategy CreateBasket(MyTrade t)
{
var s = new BasketStrategy(BasketStrategyFinishModes.First);
// выставляет тейк-профит в 45 пунктов
var takeProfit = new TakeProfitStrategy(t, 45);
s.ChildStrategies.Add(takeProfit);
return s;
}

Лог такой:

Quote:

16:33:51.023 | | OS | Стратегия запущена.
16:34:41.639 | | OS | Новая Buy сделка 458108237 по цене 140960 на 1 заявки 59619294.
16:34:41.665 | | BS | Стратегия запущена.
16:34:41.666 | | BS | Стратегия запущена.
16:34:41.666 | | TPS | Стратегия запущена.
16:35:48.452 | | TPS | Регистрация новой заявки на Sell с ценой 141005 и объемом 1.
16:35:48.455 | | TPS | Заявка 59619295 на Sell отправлена с ценой 141005 объемом 1.
16:35:48.489 | Warning | TPS | Заявка 59619295 не имеет состояния.
16:35:51.464 | | OS | Новая Sell сделка 458109666 по цене 141005 на 1 заявки 59619295.
16:35:51.465 | | TPS | Позиция изменилась на -1.
16:35:51.465 | | TPS | Заканчиваем котирование с неисполненным объемом равный 0.
16:35:51.465 | | BS | Новая Sell сделка 458109666 по цене 141005 на 1 заявки 59619295.
16:35:51.465 | | BS | Новая Sell сделка 458109666 по цене 141005 на 1 заявки 59619295.
16:35:51.465 | | TPS | Новая Sell сделка 458109666 по цене 141005 на 1 заявки 59619295.
16:35:51.466 | | BS | Стратегия останавливается.
16:35:51.467 | | TPS | Заканчиваем котирование с неисполненным объемом равный 0.
16:35:51.467 | | TPS | Заканчиваем котирование с неисполненным объемом равный 0.
16:35:51.469 | | BS | Стратегия останавливается.
16:35:51.470 | | TPS | Стратегия останавливается.
16:35:51.470 | | TPS | Заканчиваем котирование с неисполненным объемом равный 0.
16:35:51.473 | | BS | Стратегия остановлена.



Никак не разберусь, что делает TPS целую минуту от момента запуска до регистрации заявки. Сколько пробовал запускать - наименьший интервал был 6 секунд.

Tags:


Thanks:


< 1 2 3 4  >
profts

Avatar
Date: 11/24/2011
Reply


Quote:

Может быть в этом проблема, два потока могут одновременно зайти и оба прочитать что position = 0 и поставить ордер.

Quote:

Это говорит о том что событие не генерируются несколько раз...


Видимо так и есть... NewTrades генерируется один раз, но одновременно в разных потоках. )

Странно только то, что заявка на покупку выставляется только один раз, хотя следуя этой логике она также должна выставляться несколько раз из разных потоков.

Тогда встает вопрос как это можно обойти, если расчет у меня происходит с частотой появления новых сделок и на основе него появляется условие на совершение сделки. Мне казалось, что .When(base.Security.Changed()) .Do(raschet); выполняется следующий раз только после того, как заканчивается предыдущий расчет, а не одновременно в нескольких потоках.
Thanks:

frontman

Avatar
Date: 11/24/2011
Reply


В смысле одновременно в разных потоках?
Оно генерируется столько раз сколько вы на него подписались.
Если я напишу вот так

his
.When(order_buy1.NewTrades())
.Do(Takeprofit1);
his
.When(order_buy1.NewTrades())
.Do(Takeprofit1);

То конечно оно несколько раз вызовется.
То же будет и в случае с потоками.
Thanks:

kenota

Avatar
Date: 11/24/2011
Reply


Внутри метода raschet делайте все в блоке блокировки, например lock(this)
Thanks:

frontman

Avatar
Date: 11/24/2011
Reply


base.Security.Changed() - вообще какое то странное правило.
Вам что нужно ловить новые сделки по инструменту?Тогда исп Security.SecurityNewTrades()
Thanks:

frontman

Avatar
Date: 11/24/2011
Reply


kenota Go to
Внутри метода raschet делайте все в блоке блокировки, например lock(this)

Почитайте MSDN по поводу этого оператора.
lock(this) - вообще не самый хороший вариант.
Thanks:

profts

Avatar
Date: 11/24/2011
Reply


Quote:

В смысле одновременно в разных потоках?
Оно генерируется столько раз сколько вы на него подписались.


Немного не так меня поняли...
появились две сделки по ризу, в двух разных потоках вызывается метод raschet, в каждом из которых генерируется .When(order_buy1.NewTrades())
.Do(Takeprofit1);


Thanks:

frontman

Avatar
Date: 11/24/2011
Reply


Нет я вас так понял.
order_buy1 - у вас в разных потоках все равно разный. Это разные заявки. Поэтому и сделка на них приходят разные.
Thanks:

frontman

Avatar
Date: 11/24/2011
Reply


Тьфу ты... Или у вас order_buy1 - глобальный параметр?
Thanks:

frontman

Avatar
Date: 11/24/2011
Reply


Без пол литра в этом коде точно не разобраться))
f (position == 1)
{
this
.When(order_buy1.NewTrades())
.Do(Takeprofit1);
}
Это зачем? Ну вешайте вы сразу тейк профит без проверки позиций и все хорошо тогда будет.
Т.е как то так
if (position == 0)
{
if (условие на сделку)
{
position = 1;
order_buy1 = this.CreateOrder(OrderDirections.Buy, base.Security.GetMarketPrice(OrderDirections.Buy), 1);
this.RegisterOrder(order_buy1);
this
.When(order_buy1.NewTrades())
.Do(Takeprofit1);
};
};
Thanks: profts

profts

Avatar
Date: 11/24/2011
Reply


Дело в том, что position = 2 присваивается только после отправки тэйка:

Quote:

private void Takeprofit1()
{

order_takeprofit1 = this.CreateOrder(OrderDirections.Sell, order_buy1.Price + 45, 1);
this.RegisterOrder(order_takeprofit1);
position = 2;

}



Видимо пока position =1 из разных потоков вызывается метод отправки тэйка:

Quote:

if (position == 1)
{
this
.When(order_buy1.NewTrades())
.Do(Takeprofit1);
}



Если меняю на :

Quote:

if (position == 1)
{
position = 2;
this
.When(order_buy1.NewTrades())
.Do(Takeprofit1);
}


Тэйкпрофит выставляется один раз:

Quote:

16:34:56.403 | | OS | Стратегия запущена.
16:35:28.929 | | OS | pos = 1
16:35:28.950 | | OS | pos = 2
16:36:02.496 | | OS | Новая Buy сделка 459071315 по цене 140285 на 1 заявки 59689492.
16:36:03.776 | | OS | Новая Sell сделка 459071339 по цене 140330 на 1 заявки 59689493.


Вообще конечно странно...


Thanks:
< 1 2 3 4  >

Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy