← Назад

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

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

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

Комментарии (37)

Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий

esper
esper

Ждет, пока выполнится условие, что цена вырастет/упадет на заданное значение

profts
profts
profts Автор

Невнимательно документацию прочитал ) для HFT стратегии такое явно не подходит )

тогда возникает вопрос - как из события NewMyTrades определить какая именно сделка прошла? допустим есть условие, по которому выставляются несколько заявок на покупку и по мере их исполнения для каждой покупки выставляется тэйк.

как по событию NewMyTrades определить чем является данная сделка - исполненной покупкой или тэйком? можно ли в комментарии к заявке добавлять buy или Take, к примеру...

esper
esper

У MyTrade есть поле Order, это заявка по которой пришли сделки, при создании заявко можно где-то запоминать их, а потом проверять

profts
profts Автор

Что-то вроде этого?:

MyBuy = this.CreateOrder(); this.RegisterOrder(MyBuy); MyTake = this.CreateOrder(); this.RegisterOrder(MyTake); ...

 private void OnNewMyTrades(IEnumerable<MyTrade> trades)
    {
       trades = trades.Where(t => t.Order == MyBuy);
         if (trades.Count() == 1)
            {
            //прошла покупка
            }
           else
            {
              trades = trades.Where(t => t.Order == MyTake);
              if (trades.Count() == 1)
                {
                 // исполнился тэйк
                }
            }
    }

По-моему можно как-то более красиво сделать )))

frontman
frontman

Ну например у каждой заявки есть правило order.NewTrades() и if тогда нафик не нужен. И странное какое то у вас условие... А что если например MyBuy сделка была на 2 лота и они прошли в разных сделках? Тогда у вас условие не выполниться явно...

profts
profts Автор

А что если например MyBuy сделка была на 2 лота и они прошли в разных сделках? Можно изменить на: if (trades.Count() > 0) , но в любом случае order.NewTrades() более удобно использовать. Спасибо!

profts
profts Автор

Сделал подобным образом:

if (position == 0) {

            if (условие на сделку)
            {
                position = 1;
                order_buy1 = this.CreateOrder(OrderDirections.Buy, base.Security.GetMarketPrice(OrderDirections.Buy), 1);
                this.RegisterOrder(order_buy1);
             };
        };

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

private void Takeprofit1() { order_takeprofit1 = this.CreateOrder(OrderDirections.Sell, order_buy1.Price + 45, 1); this.RegisterOrder(order_takeprofit1); position = 2; }

получаю следующий лог:

13:09:44.264 | | OS | Новая Buy сделка 458811146 по цене 140605 на 1 заявки 47354464. 13:09:44.592 | Error | OS | Заявка 47354476 не была принята по причине StockSharp.Quik.ApiException: Код ошибки Failed Сообщение Ошибка создания заявки. [FORTS] "Нехватка средств по лимитам клиента.".. 13:09:44.592 | Error | OS | Заявка 47354475 не была принята по причине StockSharp.Quik.ApiException: Код ошибки Failed Сообщение Ошибка создания заявки. [FORTS] "Нехватка средств по лимитам клиента.".. 13:09:44.592 | Error | OS | Заявка 47354477 не была принята по причине StockSharp.Quik.ApiException: Код ошибки Failed Сообщение Ошибка создания заявки. [FORTS] "Нехватка средств по лимитам клиента.".. 13:09:44.592 | Error | OS | Заявка 47354478 не была принята по причине StockSharp.Quik.ApiException: Код ошибки Failed Сообщение Ошибка создания заявки. [FORTS] "Нехватка средств по лимитам клиента.".. 13:09:44.593 | Error | OS | Заявка 47354479 не была принята по причине StockSharp.Quik.ApiException: Код ошибки Failed Сообщение Ошибка создания заявки. [FORTS] "Нехватка средств по лимитам клиента.".. 13:09:44.593 | Error | OS | Заявка 47354480 не была принята по причине StockSharp.Quik.ApiException: Код ошибки Failed Сообщение Ошибка создания заявки. [FORTS] "Нехватка средств по лимитам клиента.".. 13:09:44.643 | Error | OS | Заявка 47354481 не была принята по причине StockSharp.Quik.ApiException: Код ошибки Failed Сообщение Ошибка создания заявки. [FORTS] "Нехватка средств по лимитам клиента.".. 13:09:44.643 | Error | OS | Заявка 47354483 не была принята по причине StockSharp.Quik.ApiException: Код ошибки Failed Сообщение Ошибка создания заявки. [FORTS] "Нехватка средств по лимитам клиента.".. 13:09:44.805 | Error | OS | Заявка 47354482 не была принята по причине StockSharp.Quik.ApiException: Код ошибки Failed Сообщение Ошибка создания заявки. [FORTS] "Нехватка средств по лимитам клиента.".. 13:09:44.805 | Error | OS | Заявка 47354484 не была принята по причине StockSharp.Quik.ApiException: Код ошибки Failed Сообщение Ошибка создания заявки. [FORTS] "Нехватка средств по лимитам клиента.".. 13:09:44.805 | Error | OS | Заявка 47354485 не была принята по причине StockSharp.Quik.ApiException: Код ошибки Failed Сообщение Ошибка создания заявки. [FORTS] "Нехватка средств по лимитам клиента.".. 13:09:44.805 | Error | OS | Заявка 47354486 не была принята по причине StockSharp.Quik.ApiException: Код ошибки Failed Сообщение Ошибка создания заявки. [FORTS] "Нехватка средств по лимитам клиента.".. 13:09:47.748 | | OS | Стратегия останавливается. 13:09:47.753 | | OS | Стратегия остановлена. 13:09:52.752 | | OS | Новая Sell сделка 458811274 по цене 140650 на 1 заявки 47354465. 13:09:52.754 | | OS | Новая Sell сделка 458811275 по цене 140650 на 1 заявки 47354466. 13:09:52.755 | | OS | Новая Sell сделка 458811276 по цене 140650 на 1 заявки 47354467. 13:09:52.755 | | OS | Новая Sell сделка 458811277 по цене 140650 на 1 заявки 47354468. 13:09:52.755 | | OS | Новая Sell сделка 458811278 по цене 140650 на 1 заявки 47354470. 13:09:52.756 | | OS | Новая Sell сделка 458811279 по цене 140650 на 1 заявки 47354471. 13:09:52.756 | | OS | Новая Sell сделка 458811280 по цене 140650 на 1 заявки 47354473. 13:09:52.756 | | OS | Новая Sell сделка 458811281 по цене 140650 на 1 заявки 47354474.

Почему событие .When(order_buy1.NewTrades()) возникает несколько раз? Изменил на .When(order_buy1.Matched()) - то же самое... просто начинают выставляться тейкпрофиты без остановок.

frontman
frontman

Ну судя по логам у вас события срабатывают для разных заявок 13:09:52.752 | | OS | Новая Sell сделка 458811274 по цене 140650 на 1 заявки 47354465. 13:09:52.754 | | OS | Новая Sell сделка 458811275 по цене 140650 на 1 заявки 47354466. 13:09:52.755 | | OS | Новая Sell сделка 458811276 по цене 140650 на 1 заявки 47354467. 13:09:52.755 | | OS | Новая Sell сделка 458811277 по цене 140650 на 1 заявки 47354468. 13:09:52.755 | | OS | Новая Sell сделка 458811278 по цене 140650 на 1 заявки 47354470. 13:09:52.756 | | OS | Новая Sell сделка 458811279 по цене 140650 на 1 заявки 47354471. 13:09:52.756 | | OS | Новая Sell сделка 458811280 по цене 140650 на 1 заявки 47354473. 13:09:52.756 | | OS | Новая Sell сделка 458811281 по цене 140650 на 1 заявки 47354474.

frontman
frontman

Сколько контрактов у вас в первоначальной заявке?

profts
profts Автор

Да объем везде 1 контракт... Да и на покупку выставляется только одна заявка order_buy1...

Может причина в том, что условия if внутри метода raschet, который вызывается по событию:

protected override void OnStarting() { this .When(base.Security.Changed()) .Do(raschet); base.OnStarting(); }

frontman
frontman

Ну могу вам сказать что это правило я сам лично использую и оно 100% верно. Ищите ошибку в логике программы самой.

profts
profts Автор

Ну собственно вот вся логика:

protected override void OnStarting() { this .When(base.Security.Changed()) .Do(raschet); base.OnStarting(); }

private void raschet() { ... //расчет условия на сделку ... if (position == 0) { if (условие на сделку) { position = 1; order_buy1 = this.CreateOrder(OrderDirections.Buy, base.Security.GetMarketPrice(OrderDirections.Buy), 1); this.RegisterOrder(order_buy1); }; };

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

private void Takeprofit1() { order_takeprofit1 = this.CreateOrder(OrderDirections.Sell, order_buy1.Price + 45, 1); this.RegisterOrder(order_takeprofit1); position = 2; }

frontman
frontman

Давай те вы так сделаете : В методе OnStarting() Оставите только this.AddInfoLog("Создаю"); order_buy1 = this.CreateOrder(OrderDirections.Buy, base.Security.GetMarketPrice(OrderDirections.Buy), 1); this .When(order_buy1.NewTrades()) .Do(() => this.AddInfoLog("Новая сделка")); this.AddInfoLog("Регистрирую"); this.RegisterOrder(order_buy1);

И выложите здесь полученные в результате логи.

profts
profts Автор

Сделал...

15:27:53.484 | | OS | Стратегия запущена. 15:27:53.493 | | OS | Создаю 15:27:53.501 | | OS | Регистрирую 15:27:54.061 | | OS | Новая Buy сделка 459004723 по цене 140345 на 1 заявки 55665883. 15:27:54.074 | | OS | Новая сделка

frontman
frontman

Сделал...

15:27:53.484 | | OS | Стратегия запущена. 15:27:53.493 | | OS | Создаю 15:27:53.501 | | OS | Регистрирую 15:27:54.061 | | OS | Новая Buy сделка 459004723 по цене 140345 на 1 заявки 55665883. 15:27:54.074 | | OS | Новая сделка Это говорит о том что событие не генерируются несколько раз...

profts
profts Автор

А вообще может быть, что событие .When(base.Security.Changed()) .Do(raschet);

возникает очень часто и вызывается одновременно в нескольких потоках и из разных потоков выставляется тэйк?

profts
profts Автор

и еще добавил логи след. образом:

if (position == 0) { if (условие на сделку) { position = 1; order_buy1 = this.CreateOrder(OrderDirections.Buy, base.Security.GetMarketPrice(OrderDirections.Buy), 1); this.RegisterOrder(order_buy1); }; };

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

private void Takeprofit1() { this.AddInfoLog("создается тэйк"); order_takeprofit1 = this.CreateOrder(OrderDirections.Sell, order_buy1.Price + 45, 1); this.RegisterOrder(order_takeprofit1); position = 2; this.AddInfoLog("pos=2"); }

В итоге получаю следующий лог:

15:36:36.917 | | OS | Стратегия запущена. 15:37:05.590 | | OS | pos = 1 15:37:05.917 | | OS | pos = 1 15:37:06.686 | | OS | pos = 1 15:37:06.794 | | OS | pos = 1 15:37:07.224 | | OS | pos = 1 15:37:08.215 | | OS | pos = 1 15:37:08.242 | | OS | Новая Buy сделка 459012183 по цене 140190 на 1 заявки 56189139. 15:37:08.254 | | OS | pos = 1 15:37:08.255 | | OS | создается тэйк 15:37:08.255 | | OS | pos=2 15:37:08.255 | | OS | создается тэйк 15:37:08.255 | | OS | pos=2 15:37:08.255 | | OS | создается тэйк 15:37:08.256 | | OS | pos=2 15:37:08.256 | | OS | создается тэйк 15:37:08.256 | | OS | pos=2 15:37:08.256 | | OS | создается тэйк 15:37:08.256 | | OS | pos=2 15:37:08.256 | | OS | создается тэйк 15:37:08.256 | | OS | pos=2 15:37:10.644 | | OS | Новая Sell сделка 459012259 по цене 140235 на 1 заявки 56189140. 15:37:10.645 | | OS | Новая Sell сделка 459012260 по цене 140235 на 1 заявки 56189141. 15:37:10.645 | | OS | Новая Sell сделка 459012261 по цене 140235 на 1 заявки 56189142. 15:37:10.645 | | OS | Новая Sell сделка 459012262 по цене 140235 на 1 заявки 56189143. 15:37:10.878 | | OS | Новая Sell сделка 459012268 по цене 140235 на 1 заявки 56189144. 15:37:10.878 | | OS | Новая Sell сделка 459012269 по цене 140235 на 1 заявки 56189145.

kenota
kenota

profts: Ваш метод raschet() откуда вызывается? :)

profts
profts Автор

Ваш метод raschet() откуда вызывается? :)

protected override void OnStarting() { this .When(base.Security.Changed()) .Do(raschet); base.OnStarting(); }

kenota
kenota

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

Что же касается вызовов метода NewTrades несколько раз, попробуйте вместо него использовать событие ордера Matched. Т.е. this.When(order_buy1.Matched()).Do(TakeProfit1);

profts
profts Автор

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

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

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

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

frontman
frontman

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

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

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

kenota
kenota

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

frontman
frontman

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

frontman
frontman

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

profts
profts Автор

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

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

frontman
frontman

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

frontman
frontman

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

frontman
frontman

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

Дело в том, что 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.

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

profts
profts Автор

Это зачем? Ну вешайте вы сразу тейк профит без проверки позиций и все хорошо тогда будет.

Если честно сам сейчас задумался для чего я сделал еще одно условие и так и не понял )))

Исправил - все заработало :)))

16:48:16.783 | | OS | Стратегия запущена. 16:48:50.342 | | OS | pos = 1 16:48:51.771 | | OS | Новая Buy сделка 459079937 по цене 140245 на 1 заявки 60489183. 16:48:51.784 | | OS | создается тэйк 16:48:51.784 | | OS | pos=2

За такую помощь и поллитра не жалко ))) Спасибо!

profts
profts Автор

Выставляю заявку с помощью MarketQuotingStrategy. Объем 1 лот. В итоге проходит покупка 2-х лотов. лог:

18:22:42.323 | | OS | Стратегия запущена. 18:23:23.043 | | OS | лонг 18:23:23.050 | | MQS | Стратегия запущена. 18:23:23.475 | | MQS | Регистрация новой заявки на Buy с ценой 138660 и объемом 1. 18:23:23.493 | | MQS | Заявка 66144576 на Buy отправлена с ценой 138660 объемом 1. 18:23:23.545 | Warning | MQS | Заявка 66144576 не имеет состояния. 18:23:23.668 | | MQS | Цена текущей 138660 и лучшей 138670. 18:23:23.668 | | MQS | Лучший бид 138665 и лучший аск 138670. 18:23:23.668 | | MQS | Котирование заявки 66144576 на Buy с ценой 138660 объемом 1. 18:23:23.673 | | MQS | Перекотирование зарегистрировано для заявки 66144577 на Buy с ценой 138670 объемом 1. 18:23:23.740 | Error | MQS | Заявка 66144577 не была принята по причине System.InvalidOperationException: Сервер для транзакции 'ACTION=MOVE_ORDERS; TRANS_ID=66144577; CLASSCODE=SPBFUT; SECCODE=RIZ1; MODE=0; FIRST_ORDER_NUMBER=6019530259; FIRST_ORDER_NEW_PRICE=138670; FIRST_ORDER_NEW_QUANTITY=1;' вернул неправильное сообщение 'Ошибка перестановки заявок. [FORTS] "Не найдена заявка для перестановки.".' по передвинутым заявкам.. 18:23:23.780 | Error | MQS | Котируемая заявка 66144577 не принята биржей по причине 'Сервер для транзакции 'ACTION=MOVE_ORDERS; TRANS_ID=66144577; CLASSCODE=SPBFUT; SECCODE=RIZ1; MODE=0; FIRST_ORDER_NUMBER=6019530259; FIRST_ORDER_NEW_PRICE=138670; FIRST_ORDER_NEW_QUANTITY=1;' вернул неправильное сообщение 'Ошибка перестановки заявок. [FORTS] "Не найдена заявка для перестановки.".' по передвинутым заявкам.'. 18:23:23.780 | | MQS | Регистрация новой заявки на Buy с ценой 138670 и объемом 1. 18:23:23.783 | | MQS | Заявка 66144578 на Buy отправлена с ценой 138670 объемом 1. 18:23:23.868 | | OS | Новая Buy сделка 460128443 по цене 138660 на 1 заявки 66144576. 18:23:23.883 | Warning | MQS | Заявка 66144578 не имеет состояния. 18:23:23.968 | | MQS | Позиция изменилась на 1. 18:23:23.968 | | MQS | Заканчиваем котирование с неисполненным объемом равный 0. 18:23:23.968 | | MQS | Отмена заявки 66144578. 18:23:23.968 | | OS | Новая Buy сделка 460128451 по цене 138670 на 1 заявки 66144578. 18:23:23.970 | | OS | создается тэйк 18:23:23.970 | | OS | тэйк1 18:23:23.973 | | MQS | Стратегия останавливается. 18:23:23.973 | | MQS | Заканчиваем котирование с неисполненным объемом равный 0. 18:23:23.973 | | MQS | Заканчиваем котирование с неисполненным объемом равный 0. 18:23:23.975 | | MQS | Стратегия остановлена.

Подобная ошибка появилась впервые. По какой причине стратегия не смогла найти заявку для перестановки? и не совсем понятно по какой причине исполнилось две заявки на покупку.

Alexander
Alexander

Попробуйте Security.Exchange.Rts выставить IsSupportAtomicReRegister в false на move посмотрим

profts
profts Автор

Правильно понял? Сделал следующим образом:

_secRIZ1.Exchange.IsSupportAtomicReRegister = false; order_buy1 = this.CreateOrder(OrderDirections.Buy, _secRIZ1.BestAsk.Price, 1); order_buy1.Security = _secRIZ1;

var strategy1 = new MarketQuotingStrategy(order_buy1, 1, 5); strategy1.Security = _secRIZ1;

                        base.ChildStrategies.Add(strategy1);

                        this
                           .When(strategy1.StrategyNewMyTrades())

                           .Do(Takeprofit1);

В итоге след лог:

12:35:54.283 | | OS | Стратегия запущена. 12:36:05.438 | | OS | лонг 12:36:05.446 | | MQS | Стратегия запущена. 12:36:06.276 | | MQS | Регистрация новой заявки на Buy с ценой 145005 и объемом 1. 12:36:06.293 | | MQS | Заявка 45347685 на Buy отправлена с ценой 145005 объемом 1. 12:36:07.134 | | OS | Новая Buy сделка 460581557 по цене 145005 на 1 заявки 45347685. 12:36:07.138 | | MQS | Котируемая заявка 45347685 исполнилась. 12:36:07.138 | | MQS | Регистрация новой заявки на Buy с ценой 145005 и объемом 1. 12:36:07.141 | | MQS | Заявка 45347686 на Buy отправлена с ценой 145005 объемом 1. 12:36:07.145 | | MQS | Позиция изменилась на 1. 12:36:07.145 | | MQS | Заканчиваем котирование с неисполненным объемом равный 0. 12:36:07.147 | | MQS | Стратегия останавливается. 12:36:07.149 | | MQS | Заканчиваем котирование с неисполненным объемом равный 0. 12:36:07.149 | | MQS | Заканчиваем котирование с неисполненным объемом равный 0. 12:36:07.151 | | MQS | Стратегия остановлена.

Сделка продит два раза - первый из основной стратегии, второй раз из котирования. Плюс не срабатывает событие новых сделок по стратегии.

Alexander
Alexander

Правильно понял? Сделал следующим образом:

_secRIZ1.Exchange.IsSupportAtomicReRegister = false; order_buy1 = this.CreateOrder(OrderDirections.Buy, _secRIZ1.BestAsk.Price, 1); order_buy1.Security = _secRIZ1;

var strategy1 = new MarketQuotingStrategy(order_buy1, 1, 5); strategy1.Security = _secRIZ1;

                        base.ChildStrategies.Add(strategy1);

                        this
                           .When(strategy1.StrategyNewMyTrades())

                           .Do(Takeprofit1);

В итоге след лог:

12:35:54.283 | | OS | Стратегия запущена. 12:36:05.438 | | OS | лонг 12:36:05.446 | | MQS | Стратегия запущена. 12:36:06.276 | | MQS | Регистрация новой заявки на Buy с ценой 145005 и объемом 1. 12:36:06.293 | | MQS | Заявка 45347685 на Buy отправлена с ценой 145005 объемом 1. 12:36:07.134 | | OS | Новая Buy сделка 460581557 по цене 145005 на 1 заявки 45347685. 12:36:07.138 | | MQS | Котируемая заявка 45347685 исполнилась. 12:36:07.138 | | MQS | Регистрация новой заявки на Buy с ценой 145005 и объемом 1. 12:36:07.141 | | MQS | Заявка 45347686 на Buy отправлена с ценой 145005 объемом 1. 12:36:07.145 | | MQS | Позиция изменилась на 1. 12:36:07.145 | | MQS | Заканчиваем котирование с неисполненным объемом равный 0. 12:36:07.147 | | MQS | Стратегия останавливается. 12:36:07.149 | | MQS | Заканчиваем котирование с неисполненным объемом равный 0. 12:36:07.149 | | MQS | Заканчиваем котирование с неисполненным объемом равный 0. 12:36:07.151 | | MQS | Стратегия остановлена.

Сделка продит два раза - первый из основной стратегии, второй раз из котирования. Плюс не срабатывает событие новых сделок по стратегии.

Будет фикс для защитных стратегий.

profts
profts Автор

Обновился до 4.0.6. Котирование вообще перестало работать.

order_buy1 = this.CreateOrder(OrderDirections.Buy, base.Security.BestAsk.Price, 1); var strategy1 = new MarketQuotingStrategy(order_buy1, new Unit(5), new Unit(5)); base.ChildStrategies.Add(strategy1);

Лог:

17:28:14.692 | | OS | Стратегия запущена. 17:28:35.209 | | MQS | Стратегия запущена.

Alexander
Alexander

Обновитесь до 4.0.7 с codeplex