Стоп-ордер
Atom
5/25/2012


Как определить срабатывание (выставление и собственно исполнение) стоп ордера? Иногда, по понятным причинам, возникает ситуация когда стоп-ордер срабатывает но не исполняется. СЦена уходит дальше и стоп остается открытым. В обработчик StopOrdersChanged приходит ордер со state=Done status=Accepted. Других событий не возникает. Может другие события надо обрабатывать для уведомления по сделки от стоп ордера?

Tags:


Thanks:




1 2  >
esper

Avatar
Date: 5/25/2012
Reply


В документации все описано.
Thanks:

Memory

Avatar
Date: 5/25/2012
Reply


Т.е. через Order.DerivedOrder? Его отслеживать? И все равно не понятно почему по исполнению стоп зяаявки не создается событие NewMyTrade? ИМХО это вполне логично.
Thanks:

paveld

Avatar
Date: 5/26/2012
Reply


Memory GoTo
Как определить срабатывание (выставление и собственно исполнение) стоп ордера? Иногда, по понятным причинам, возникает ситуация когда стоп-ордер срабатывает но не исполняется. СЦена уходит дальше и стоп остается открытым. В обработчик StopOrdersChanged приходит ордер со state=Done status=Accepted. Других событий не возникает. Может другие события надо обрабатывать для уведомления по сделки от стоп ордера?


Можно создать соответствующие правила для заявки, например так:
Code

      stopOrder.WhenMatched().Do(StopOrderMatched).Once().Sync(new object()).Apply(this); // Полное исполнение
      stopOrder.WhenPartiallyMatched().Do(StopOrderPartiallyMatched).Apply(this); // Частичное исполнение
Thanks:

esper

Avatar
Date: 5/26/2012
Reply


Memory GoTo
Т.е. через Order.DerivedOrder? Его отслеживать?

Да, при срабатывании стопа выставляется новая лимитка, которая записывается в DerivedOrder, и именно по ней уже будут приходить сделки.

Memory GoTo
И все равно не понятно почему по исполнению стоп зяаявки не создается событие NewMyTrade? ИМХО это вполне логично.

При использовании правила Order.WhenNewTrades должно все работать.

paveld GoTo
Можно создать соответствующие правила для заявки, например так:
Code

      stopOrder.WhenMatched().Do(StopOrderMatched).Once().Sync(new object()).Apply(this); // Полное исполнение
      stopOrder.WhenPartiallyMatched().Do(StopOrderPartiallyMatched).Apply(this); // Частичное исполнение

Эти правила сработают тоже только при активации стопа, а не при исполнении порожденной заявки.
Thanks:

Mikhail Sukhov

Avatar
Date: 5/26/2012
Reply


Есть еще правило WhenActivated
Thanks:

Memory

Avatar
Date: 5/26/2012
Reply


Ага. Но, все это хорошо работаяет совместно со Strategy. А вот в BaseTrader и производных как отследить MyTrade по стоп ордеру? DerivedOrder можно отследить однако, в моем понимании, если приходит событие на создание, на изменение, то по сделке по стопу должно срабатывать и NewMyTrade в BaseTrader.
Thanks:

Alexander

Avatar
Date: 6/3/2012
Reply


esper GoTo
paveld GoTo
Можно создать соответствующие правила для заявки, например так:
Code

      stopOrder.WhenMatched().Do(StopOrderMatched).Once().Sync(new object()).Apply(this); // Полное исполнение
      stopOrder.WhenPartiallyMatched().Do(StopOrderPartiallyMatched).Apply(this); // Частичное исполнение

Эти правила сработают тоже только при активации стопа, а не при исполнении порожденной заявки.


Для квика и для смарта это правила срабатывает именно при полном и частичном исполнении порождённой заявки, Павел всё верно написал.
Thanks:

Alexander

Avatar
Date: 6/3/2012
Reply


Memory GoTo
Ага. Но, все это хорошо работаяет совместно со Strategy. А вот в BaseTrader и производных как отследить MyTrade по стоп ордеру? DerivedOrder можно отследить однако, в моем понимании, если приходит событие на создание, на изменение, то по сделке по стопу должно срабатывать и NewMyTrade в BaseTrader.


Надо отслеживать NewMyTrade, и смотреть чтоб myTrade.Order == stopOrder.DerivedOrder
Thanks:

esper

Avatar
Date: 6/4/2012
Reply


Alexander Mukhanchikov GoTo
Для квика и для смарта это правила срабатывает именно при полном и частичном исполнении порождённой заявки, Павел всё верно написал.

Век живи - век учись :) Всегда делал двойную проверку с учетом DerivedOrder, а оказывается не стоило.
Thanks:

Slepoy

Avatar
Date: 1/13/2017
Reply


В общем, я тут добрался до изучения серверных стопов. И я в печали. Не знаю, как там было в 2012, но точно знаю как всё работает сейчас. Исходные данные: демо-квик версия 7.6.1.1, винда 7х32 бита, свежее API 4.3.19.5, плюс для контроля старенькое API 4.3.13. Ну погнали. Сперва рассмотрим, что не работает из вышеописанного.

Memory GoTo
Т.е. через Order.DerivedOrder? Его отслеживать? И все равно не понятно почему по исполнению стоп зяаявки не создается событие NewMyTrade? ИМХО это вполне логично.
Всё верно, в API 4.3.19.5 событие NewMyTrade после срабатывания лимитки, которую породил стоп, не реагирует никак. Зато в старом API 4.3.13 - всё работает как надо, т.е. после срабатывания лимитки, даннео соыбтие отрабатывает сделки по ней.


esper GoTo
Да, при срабатывании стопа выставляется новая лимитка, которая записывается в DerivedOrder, и именно по ней уже будут приходить сделки.
Данное свойство всё время нулл. Даже после того как реальная лимитка, которую породил стоп, - исполнилась, свойство всё равно нулл.

esper GoTo
При использовании правила Order.WhenNewTrades должно все работать.
Должно, но не работает ))). Правило не реагирует никак. Вообще никак.

Mikhail Sukhov GoTo
Есть еще правило WhenActivated
Не работает, как в API 4.3.13, так и в API 4.3.19.5. Данное правило вообще никак не реагирует на стоп. В иходниках данного правила заложена проверка свойства Order.DerivedOrder. Но данное свойство всегда нулл: как до срабатывания стопа, так и после срабатывания стопа и выставления реальной лимитки. Данное свойство всегда нулл. Судя по исходникам, как я понял, данное свойство должен наполнять именно коннектор, оно вроде как не рассчётное.

Alexander GoTo
esper GoTo
paveld GoTo
Можно создать соответствующие правила для заявки, например так:
Code

      stopOrder.WhenMatched().Do(StopOrderMatched).Once().Sync(new object()).Apply(this); // Полное исполнение
      stopOrder.WhenPartiallyMatched().Do(StopOrderPartiallyMatched).Apply(this); // Частичное исполнение

Эти правила сработают тоже только при активации стопа, а не при исполнении порожденной заявки.

Для квика и для смарта это правила срабатывает именно при полном и частичном исполнении порождённой заявки, Павел всё верно написал.
Нет. Выше было верно сказало: правила сработают лишь при активации стопа. Порождённую заявку они никак не учитывают.


Вот такая вот ситуация. Как я высянял всё вышеописанное? Вообще, мне как и автору поста, нужна была обратная связь об исполнении стопа. Изучив документацию, я решил воспользоватсья свойством Order.DerivedOrder, ну чтобы получить реальную лимитную заявку для последующего отслеживания её состояния. Для этого я через метод WhenActivated() создал "правило на событие активации стоп-заявки", заснулул туда логику с Order.DerivedOrder и тупо начал ждать счастия ))). Ждал час, два, сутки, год - так и не дождался ))). Не сработало данное событие. Тогда я дополнительно подписался на 8 событий и начал ждать чуда там ))). В итоге, получились следующие подписки:
1. var oslRule = orderServerStopLoss.WhenActivated(Connector)...
2. var oslRule2 = orderServerStopLoss.WhenMatched(Connector)...
3. var oslRule3 = orderServerStopLoss.WhenNewTrade(Connector)...
4. var oslRule4 = orderServerStopLoss.WhenAllTrades(Connector)...
5. Connector.NewOrders += (newOrdersCollArg) => ...
6. Connector.NewStopOrders += (newStopOrdersCollArg) => ...
7. Connector.StopOrdersChanged += (stopOrdersChangedArg) =>...
8. Connector.NewMyTrades += (newMyTradesCollArg) => ...
9. Connector.NewTrades += (newTradesCollArg) =>...

В 8ми вышеописанных событиях, я поставил по точке останова для изучения поведения всей системы. В 9м событии - не стал пока ставить точку останова, я её поставлю позднее, для итогового контроля содержимых коллекции. Стратегия была простая: выставляем лимитку на покупку, по лучшему биду, объёмом 1 конь. После её исполнения выставляется стоп с ценой активации на 5 шагов ниже. Причём, чтобы отследить отработку всех событий, я цену селл-лимитки, которую стоп отправит в стакан - загнул не ниже цены активаци стопа, ну как все делают обычно, а выше - чтобы стопик повисел в стакане какое-то время. То есть, при активации стопа, порождённая селл-лимитка не исполнится мгновенно, т.к. будет выставлена на 5 шагов выше лучшего аска. Чтобы её исполнить, цене надо будет подрасти.

Что получилось в итоге?
Этап 1. После запуска робота, лимитка на покупку ушла в стакан. После её исполнения, отработало событие "Connector.NewMyTrades += (newMyTradesCollArg) => ..." ну как положено. Следом выставился серверный стоп и отработали события "Connector.NewStopOrders += (newStopOrdersCollArg) => ..." и "Connector.StopOrdersChanged += (stopOrdersChangedArg) =>..."
Этап 2. Спустя пару минут сработал стоп. И в стакан полетела лимитка, которую он породил. Сразу сработало 2 события: "var oslRule2 = orderServerStopLoss.WhenMatched(Connector)..." и "Connector.StopOrdersChanged += (stopOrdersChangedArg) =>..."
Этап 3. Спустя 10-15 минут, лимитку которую породил стоп - скушали. При этом никаких событий вызвано не было.

Вот такие дела, обстоят с новым API 4.3.19.5. Ниже я приложил скрин со всем этим безобразием. На втором этапе, когда стоп породил лимитку, СтокШарп на неё никак не отреагировал, т.е. не было вызвано событие "Connector.NewOrders += (newOrdersCollArg) =>...", хотя в старом API 4.3.13 - оно вызывается, как и положено и данная лимитка нормально отображается в системе, т.е. через данное событие раньше можно было поймать лимитку которую выставил стоп. Но в API 4.3.19.5 её как бы и нет. Хотя если после отрабатотки стратегии, поставить точку останова на 9м событии и глянуть коллекцию Connector.Orders, то там мы найдём 5 заявок, из которых последние три штуки: это как раз какие-то битые клоны данной заявки, но со статусом "Ноне", типа биржа их отвергла. Причём, данные битые клоны не отображаются в стандартной табличке OrderGrid, там мы найдём лишь одну заяву на покупку. А вторую стоп-заявку найдём в другой таблице OrderConditionalGrid. То есть, эти три полу-пустых объекта заявок, кроме коллекции Connector.Orders - больше нигде не видно. Вот какие дела. То же самое и с третим этапом, после того как лимитку скушали, в новом API 4.3.19.5 не было никакой реакции. Вообще ничего. Хотя в старом API 4.3.13 было вызвано событие "Connector.NewMyTrades += (newMyTradesCollArg) => ..." через которое прошли сделки от этой лимитки. В новом API ничего такого не было: лимитку скушали, а СтокШарп этого не заметил. Если заглянуть в коллекцию Connector.Trades то там мы обнаружим всего 1 сделку, ту которая открывала позу. Сделки от лимитки, которую породил стоп, и которая закрыла позу - там нет. То есть, СтокШарп проморгал и её.

Вот такие дела. Больше никакие события не срабатывали. Свойство Order.DerivedOrder - всегда было нулл, как на новом, так и на старом API. Соотвевенно никак не срабатывало и правило созданное методом WhenActivated. События не работают, реальные заявки(попадают битыми) и сделки - не попадают в коллекции. В общем, надо править данные баги. Ниже я представил скрин, как всё работает в новом API 4.3.19.5.
https://stocksharp.ru/file/104085
Thanks:
1 2  >

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

loading
clippy