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

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


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

Цитата:

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;
}

Лог такой:

Цитата:

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 секунд.

Теги:


Спасибо:


< 1 2 3 4  >
profts

Фотография
Дата: 24.11.2011
Ответить


Цитата:

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

Цитата:

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


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

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

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

frontman

Фотография
Дата: 24.11.2011
Ответить


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

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

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

kenota

Фотография
Дата: 24.11.2011
Ответить


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

frontman

Фотография
Дата: 24.11.2011
Ответить


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

frontman

Фотография
Дата: 24.11.2011
Ответить


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

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

profts

Фотография
Дата: 24.11.2011
Ответить


Цитата:

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


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


Спасибо:

frontman

Фотография
Дата: 24.11.2011
Ответить


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

frontman

Фотография
Дата: 24.11.2011
Ответить


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

frontman

Фотография
Дата: 24.11.2011
Ответить


Без пол литра в этом коде точно не разобраться))
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);
};
};
Спасибо: profts

profts

Фотография
Дата: 24.11.2011
Ответить


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

Цитата:

private void Takeprofit1()
{

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

}



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

Цитата:

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



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

Цитата:

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


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

Цитата:

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.


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


Спасибо:
< 1 2 3 4  >

Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy