Может кто подсказать как разобраться с проблемой? Вчера обнаружил что MQS в каких-то случаях выполняет задачу в двойном размере. Я завел топик и выложил там более полное описание, возможно, что название не совсем корректное. Сегодня на другом инструменте столкнулся опять с той же самой проблемой. Судя по журналу MQS пытается переставить заявку в данном случае 42133045, а она к этому моменту уже выполнена. Причем получив ошибку "Вы не можете снять данную заявку" выставляет новую заявку.
13:13:01.880 | | MQS | Перекотирование зарегистрировано для заявки 42133045на Buy с ценой 30295 объемом 1. 13:13:02.145 | Error | MQS | Заявка 42133045 не была принята по причине System.InvalidOperationException: Сервер для транзакции 'ACTION=MOVE_ORDERS; TRANS_ID=42133045; CLASSCODE=SPBFUT; SECCODE=SiH2; MODE=0; FIRST_ORDER_NUMBER=0; FIRST_ORDER_NEW_PRICE=30295; FIRST_ORDER_NEW_QUANTITY=1;' вернул неправильное сообщение 'Вы не можете снять данную заявку' по передвинутым заявкам.. 13:13:02.176 | Error | MQS | Заявка 42133045 не принята биржей по причине 'Сервер для транзакции 'ACTION=MOVE_ORDERS; TRANS_ID=42133045; CLASSCODE=SPBFUT; SECCODE=SiH2; MODE=0; FIRST_ORDER_NUMBER=0; FIRST_ORDER_NEW_PRICE=30295; FIRST_ORDER_NEW_QUANTITY=1;' вернул неправильное сообщение 'Вы не можете снять данную заявку' по передвинутым заявкам.'. 13:13:02.239 | | MQS | Цена текущей NULL и лучшей 30295. 13:13:02.301 | | MQS | Лучший бид 30295 и лучший аск 30297. 13:13:02.411 | | MQS | Регистрация новой заявки на Buy с ценой 30295 и объемом 1.
ps: если можно взглянуть на фрагмент MarketQuotingStrategy, который выполняет действия в приложенном логе, попытаюсь сам найти ответ
Комментарии (25)
Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий
Столкнулся с такой же проблемой дважды причем подряд (QuikTrader, 4.0.17).
Один раз для TP стратегии, второй раз для SL - симптомы те же, исполняются 2 одинаковые по цене заявки с минимальной разницей во времени. Лог одного из случаев (SL):
Кто может помочь советом, как починить?
Кто может помочь советом, как починить?
А что чинить? Заявка зарегистрирована на бирже. Нужно сделать так, чтобы она не могла зарегистрироваться?
По проблеме автора этого топика отписал в той ссылке, которую он привел изначально. Не понятно, зачем было кросс посты вводить.
var takeProfit = new TakeProfitStrategy(trade, this.TakeProfitUnit) ; var stopLoss = new StopLossStrategy(trade, StopLossUnit) ;
ChildStrategies.Add(new TakeProfitStopLossStrategy(takeProfit, stopLoss));
А можно посмотреть код MarketQuotingStrategy? если это квик то тут скорее всего проблема с тем что приходит раньше(заявка/сделка).
OK. Михаил, поясните пожалуйста еще раз.
Есть стратегия:
Я предполагаю, что выставив фалг UseQuoting, при касании ценой StopLossUnit, стратегия SLS создаст стратегию MQS, которая, выставляя лимитные ордера, и двигая их по необходимости, добьется исполнения защитного ордера. Затем завершится сама MQS (поражденная SLS стратегией), а затем и родительская SLS.
По факту исполняется 2а ордера с одинаковым объемом, причем:
1ый ордер создается MQS стратегией:
2ой ордер создается SLS стратегией:
Естественно, если выставить флаг UseQuoting в false, никакого дублирования не происходит. Так же как и обычные (не защитные) MQS стратегии отрабатывают нормально.
Откуда берется второй ордер?
Благодарю за совет, обязательно попробую! Но вероятно у меня все же другая ошибка, потому что обычные MQS, созданные мной, вроде этой:
работают нормально, происходит переставление ордера (без ошибок, которые появлялись у вас) и исполнение приказа без дублирования ордеров. А вот внутри защитных стратегий - дублируются.
Важное дополнение: при использовании RealTimeEmulationTrader<QuikTrader> вместо QuikTrader ошибка не реплицируется. На QuikTrader повторяется в 100% случаев у меня.
Проблема сохраняется, флаг Security.Exchange.IsSupportAtomicReRegister = false не помог.
_
MQS конкурирует со своими заявками. Хотя в этом посте написано что нет.
IsSupportAtomicReRegister = false IsAsyncMode = false
Это хорошо видно вечером или на неликвиде, когда стакан не двигается. Допустим мне надо скотировать один лот на продажу. Создается MQS, PriceOffset = Security.MinStepSize Например лучший бид 90, оффер 100, стакан не двигается. Так MQS будет постоянно снимать и переставлять заявку на 99,98,97. Т.е не держит ее на 99. Бывает что стратегия отрабатывает нормально, но в основном завершается с ошибкой
Плюс вопрос в конце данного поста тоже никак не решился.
Думал что что нибудь изменится в последней сборке 4.0.20 но ничего не изменилось.
А в чем ошибка? Эта сообщение о невозможности переставить заявку. Она уже исполнена. Нормальная ситуация.
_
В этом посте. Но я думаю он уже устарел.
Moadip, спасибо, я даже этого не заметил.
Михаил, Александр! но все таки можно было бы получить код котирования по волатильности, маркет котирования? мне бы туда задержку ввести для ордера, чтоб можно было тестировать более реально приближенно к реальности. Если все таки это не возможно - не могли бы Вы вести данную логику в алгоритмы котирования, думаю для многих актуально это! все таки тест должен быть максимально приближен к способу соединения! Спасибо!
Переопределите RegisterQuotingOrder
_
Можно. Надо понимать с какой целью только :) Может то что вы хотите сделать стоит делать без самого котирования, как в случае с задержкой для маркет котирования.
_
Готовы предоставить код котирования по волатильности в обмен на 1) пункт. Этот код (по 1 пункту) для внутреннего пользования, в S# включён не будет. Интересно посмотреть на код.
_
amukhanchikov и mika_soukhov. Лучше Михаилу, меня вечером может не быть.
Т.е когда стратегия завершается с ошибкой это нормальная ситуация?
Допустим выставил quotingVolume = 5, Volume = 1. Запускается MQS. После того как скотировано 2 лота, стратегия останавливается.
Т.е. в основной стратегии надо выставить
чтобы после остановки дочерняя стратегия не удалялась.
У MQS подписаться на событие Stopped и в нем смотреть LeftVolume, если больше нуля, то повторно запускать с quotingVolume = LeftVolume?
Если так ставить условия, то да, это ошибка. Но котирование не прекращает свою работу при возникновении ошибки при снятии или перерегистрации стратегии (см логи того же vfreeman, где у него таких ошибок было несколько). У вас что-то еще.
Вот еще один скрин, скотировалось 2 лота из 5, после чего MQS остановилась.
Код, проще некуда, для того чтобы проверить работу MQS. В чем проблема я понять не могу.
Выкладываю полностью весь код.
MainWindow.xaml.cs
myStrategy.cs
MainWindow.xaml
Михаил, посмотрите пожалуйста что я не так делаю?
Асинхронный режим включите.
Мда. Решение как всегда лежит на поверхности, но почему то его не видишь.
Я думал что чтобы наверняка заявки выставлялись/снимались лучше делать это в синхронном режиме. Оказалось нет.
Михаил, спасибо за ответ. А то я уже какой день мучаюсь с MQS.