Стоп-ордер
Atom Ответить
25.05.2012


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

Теги:


Спасибо:




16 Ответов
esper

Фотография
Программист
Дата: 25.05.2012
Ответить


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

Memory

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


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

paveld

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


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


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

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

esper

Фотография
Программист
Дата: 26.05.2012
Ответить


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

Фотография
Автор статей Программист Трейдер
Дата: 26.05.2012
Ответить


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

Memory

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


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

Alexander

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


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

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

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


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

Alexander

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


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


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

esper

Фотография
Программист
Дата: 04.06.2012
Ответить


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

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

Slepoy

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


В общем, я тут добрался до изучения серверных стопов. И я в печали. Не знаю, как там было в 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 шагов выше лучшего аска. Чтобы её исполнить, цене надо будет подрасти.

Что получилось в итоге?
Этап 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
Спасибо:

Slepoy

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


Ау....Ау... Ауууууууууууууууууу ))). Разработчики, чего вы меня игнорите! Слепой, в печали.
Вы хоть дайте какуй-либо обратную связь, по принципу:
1. Проблема ясна, разбираемся
2. Ты чайник, т.к. у нас всё работает. Открой через нас счёт, тогда поможем
3. Даже не читали твоё сообщение и пока не откроешь счёт - читать не собираемся

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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 17.01.2017
Ответить


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

Slepoy

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


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


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

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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 17.01.2017
Ответить


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

Slepoy

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


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

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

Slepoy

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


Mikhail Sukhov Перейти

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


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

loading
clippy