← 戻る

Стоп-ордер

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

このトピックは参考になりましたか?

トピックを共有

コメント (16)

ログイン または アカウントを作成, コメントを残すにはログインまたは新規登録してください

esper
esper

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

Memory
Memory 著者

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

esper
esper

Memory: Т.е. через Order.DerivedOrder? Его отслеживать? Да, при срабатывании стопа выставляется новая лимитка, которая записывается в DerivedOrder, и именно по ней уже будут приходить сделки.

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

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

  stopOrder.WhenMatched().Do(StopOrderMatched).Once().Sync(new object()).Apply(this); // Полное исполнение
  stopOrder.WhenPartiallyMatched().Do(StopOrderPartiallyMatched).Apply(this); // Частичное исполнение
Эти правила сработают тоже только при активации стопа, а не при исполнении порожденной заявки.
Mikhail Sukhov
Mikhail Sukhov

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

Alexander
Alexander

esper:

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

  stopOrder.WhenMatched().Do(StopOrderMatched).Once().Sync(new object()).Apply(this); // Полное исполнение
  stopOrder.WhenPartiallyMatched().Do(StopOrderPartiallyMatched).Apply(this); // Частичное исполнение
> Эти правила сработают тоже только при активации стопа, а не при исполнении порожденной заявки.

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

Alexander Mukhanchikov: Для квика и для смарта это правила срабатывает именно при полном и частичном исполнении порождённой заявки, Павел всё верно написал. Век живи - век учись :) Всегда делал двойную проверку с учетом DerivedOrder, а оказывается не стоило.

Slepoy
Slepoy

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

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

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

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

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

Alexander:

esper:

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

  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 шагов выше лучшего аска. Чтобы её исполнить, цене надо будет подрасти.  

<u>Что получилось в итоге</u>?
**Этап 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. 
http://stocksharp.ru/file/104085
paveld
paveld

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

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


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

Memory
Memory 著者

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

Alexander
Alexander

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

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

Slepoy
Slepoy

Ау....Ау... Ауууууууууууууууууу ))). Разработчики, чего вы меня игнорите! Слепой, в печали. <u>Вы хоть дайте какуй-либо обратную связь, по принципу:</u>

  1. Проблема ясна, разбираемся
  2. Ты чайник, т.к. у нас всё работает. Открой через нас счёт, тогда поможем
  3. Даже не читали твоё сообщение и пока не откроешь счёт - читать не собираемся

Чего-нибудь ответить-то надо. Без обратной связи ничего не понятно. Может вы вообще сообщение не видели, а может умышленно игнорите. Я нашёл баг в API, а они молчат. Причём подробно описал с картинками, а они молчат. Так не делается. Нужно чего-то отвечать. А то ничего не понятно.

Mikhail Sukhov
Mikhail Sukhov

Рекомендую открыть счёт http://stocksharp.ru/articles/7809/support-20/ чтобы ваши письма начали поступать на ящик саппорту. На форуме только я, но этими вопросами не занимаюсь.

Slepoy
Slepoy

Mikhail Sukhov: Рекомендую открыть счёт http://stocksharp.ru/articles/7809/support-20/ чтобы ваши письма начали поступать на ящик саппорту. На форуме только я, но этими вопросами не занимаюсь.

Так это был не вопрос для технической поддержки. Это не вопрос из разряда: типа вот у меня не работает, помогите мне. Тут сообщение о баге в механизмах работы стопов на Квике. Это обратная связь о работе платфомы. Ну вы сами прикиньте, завтра у вас зарегался новый чел, он нашёл глюк в платформе. Чтобы сообщить о глюке он что должен открыть счёт у брокера? Допустим он не хочет открывать счёт и глюк его особо не касается, ну он ему индефферентен. И что будет в итоге. Сообщить о баге он не может - не охота открывать счёт, следовательно вы не узнаете о глюке в ваше платформе. В итоге, всем плохо. Так как быть в таких ситуациях? Я знаю, что баги можно оформлять как-то в гитхабе, но там надо заводить аккаунт и разбираться в тонкостях работы сайта. Я думаю, большинству проще будет написать сообщение на форуме, или по емейл написать. Так как всё же быть в таких ситуациях? Писать на мыло? Или разбираться в гитхабе? Я не знаю. Предложите свой алгоритм для таких ситуаций и желательно его где-то описать публично, ну чтобы народ точно знал как поступать в таких случах. К примеру, можно дописать в посте о техподдрежкею, ну в конце приписать строчку: если вы обнаружили глюк в API то сообщите нам любым из нижеприведённых способов:

  1. емейл
  2. гитхаб
  3. почтой России )))

Заведите какое-нибудь спец мыло, конкретно для багов, типа bug@stocksharp.com

Mikhail Sukhov
Mikhail Sukhov

Как я уже озвучил выше, если хотите, чтобы ваши сообщения были видны не только вам или другим пользователям, но еще и команде, которая работает с багами и фичами, то решение выше.

Slepoy
Slepoy

Mikhail Sukhov: Как я уже озвучил выше, если хотите, чтобы ваши сообщения были видны не только вам или другим пользователям, но еще и команде, которая работает с багами и фичами, то решение выше. Я вас понял. Обратная связь по багам вам не особо и нужна. Ну ладно, это ваш бизнес, вам виднее. Я то думал, что стабильность платформы превыше административных барьеров. А тут оказывается всё как везде в России. Я как дебил старался, делал скрины, подробно всё описал, всё ньюансы, провёл тест с старым API, показал различия. Все разложил по полочкам, старался чтобы вам меньше работы было. Мог же просто написать одно предложение: не работает то и то, или просто ничего не писать. И вместо - спасибо братан, меня отправили открывать счёт ))). Да на зло, не открою! Из принципа не открою! Не хотите добротной обратной связи, ну и ладно. Хотел как лучше, получилось как всегда. Только зря время потратил. Но ничего, это будет мне уроком.

Slepoy
Slepoy

Mikhail Sukhov: Михаил, как я понимаю, судя по движухе на Гитхабе по части рефакторинга, всё идёт к тому, что скоро выйдет новый API 4.3.20. Так вот, сам вопрос: в нём поправят работу обратной связи по серверным стопам Квика или нет? Вообще какая-либо работа ведётся по этому поводу? Я уже как бы собирался писать боевого бота, а проблема стопов не решена. Вы сейчас выпустите новый API, в котором будет тот же глюк и чего тогда делать? Писать бота на стaром API 4.3.13 не особо хочется. Я напомню глюки: поcле активации стопа, когда сервер Квика создаёт реальную лимитку, которая летит в стакан - API 4.3.19.5 на это никак не реагирует. Событие появление новых заявок - не срабатывает. После исполнения реальной лимитки - событие появление моих сделок - тоже не срабатывает. Вообще ничего не работает, кроме первого события исполнения заявки - момента активации стопа. В старом API 4.3.13 - всё работает как надо, в новом не работает ничего. Прошу прояснить ситуацию по решению данной проблемы. Ведутся ли какие-либо работы по устранению багов?