Проблема с котированием


Проблема с котированием
Atom Reply
9/2/2011


mdv

Avatar
Здравствуйте! Проблема такая. Стратегия котирования запускается, пишет в лог, что запустилась и на этом зависает, не выставляя никакие заявки.
Что характерно, этот же самый код отлично работает под QUIK JUNIOR котирование выполняется и завершается. Под нормальным квиком обычные заявки работают правильно, то есть настройки базовой стратегии правильные. Экспорт стакана запускаю (иначе бы под джуниором не работало). Может кто сталкивался? Я чувствую, что тут какая-то совсем глупая ошибка, но не могу понять даже, с какого боку копать ее. Может есть возможность посмотреть более подробные логи стратегии?...

Tags:


Thanks:




21 Answers
Mikhail Sukhov

Avatar
Date: 9/2/2011
Reply


Установить для каждого Strategy.Rules EnableLog = true.
Thanks:

mdv

Avatar
Date: 9/5/2011
Reply


Написал вот так (на всякий случай):
Code
OrderDirections od = volume > 0 ? OrderDirections.Buy : OrderDirections.Sell;

MarketQuotingStrategy quotingStrategy = new MarketQuotingStrategy(od, Math.Abs(volume))
{
    PriceType = MarketPriceTypes.Opposite,
    PriceOffset = 1000,
};

quotingStrategy.Rules.ForEach(r => r.EnableLog(true));
quotingStrategy.Log += (st, es, s) => printLine("Котирование: " + st + " || " + es + " || " + s);

this.Rules.ForEach(r => r.EnableLog(true));
this.Log += (st, es, s) => printLine("Стратегия: " + st + " || " + es + " || " + s);

this.ChildStrategies.Add(quotingStrategy);


Получил только это:
Code
Котирование: MQS || None || Стратегия запущена.
Стратегия: TLS || None || [MQS] Стратегия запущена.


Дальше ничего... Confused
Topic starter
Thanks:

Mikhail Sukhov

Avatar
Date: 9/5/2011
Reply


В котировании правила создаются в OnStarting. Сделайте сначала добавление стратегии (только убедитесь, что и после этого правил > 0), а затем уже включение для правил логирование.
Thanks:

mdv

Avatar
Date: 9/5/2011
Reply


Code
                OrderDirections od = volume > 0 ? OrderDirections.Buy : OrderDirections.Sell;
                quotingStrategy = new MarketQuotingStrategy(od, Math.Abs(volume))
                {
                    PriceType = MarketPriceTypes.Opposite,
                    PriceOffset = 1000,
                };

                printLine("В стратегии правил " + this.Rules.Count);
                printLine("В котировании правил " + quotingStrategy.Rules.Count);

                quotingStrategy.Log += (st, es, s) => printLine("Котирование: " + st + " || " + es + " || " + s);
                this.Log += (st, es, s) => printLine("Стратегия: " + st + " || " + es + " || " + s);  

                this.ChildStrategies.Add(quotingStrategy);

                printLine("В стратегии правил " + this.Rules.Count);
                printLine("В котировании правил " + quotingStrategy.Rules.Count);

                quotingStrategy.Rules.ForEach(r => r.EnableLog(true));
                this.Rules.ForEach(r => r.EnableLog(true));

Вывод такой:
Code
В стратегии правил 1

В котировании правил 0

Котирование: MQS || None || Стратегия запущена.

Стратегия: TLS || None || [MQS] Стратегия запущена.

В стратегии правил 2

В котировании правил 3

Однако, насколько я понимаю, какое-то сообщение (всмысле ошибка) могло появиться в потоке дочерней стратегии раньше, чем я включил для правил логирование из потока родительской стратегии. Нет ли способа включить логирование после создания правил, но до запуска стратегии?
Topic starter
Thanks:

Mikhail Sukhov

Avatar
Date: 9/5/2011
Reply


mdv Go to
Однако, насколько я понимаю, какое-то сообщение (всмысле ошибка) могло появиться в потоке дочерней стратегии раньше, чем я включил для правил логирование из потока родительской стратегии. Нет ли способа включить логирование после создания правил, но до запуска стратегии?


В текущей версии только через переопределение MarketQuotingStrategy.OnStarting Но в случае ошибок вы получите информацию через ProcessDataError или Strategy.Log.
Thanks:

mdv

Avatar
Date: 9/6/2011
Reply


ProcessDataError помог сдвинуться с мертвой точки. С периодом порядка секунды вылетает System.ArgumentException "An item with the same key has already been added."
Вы понимаете, почему это может происходить? Или куда копать дальше?
Topic starter
Thanks:

Mikhail Sukhov

Avatar
Date: 9/6/2011
Reply


mdv Go to
ProcessDataError помог сдвинуться с мертвой точки. С периодом порядка секунды вылетает System.ArgumentException "An item with the same key has already been added."
Вы понимаете, почему это может происходить? Или куда копать дальше?


Полный стек ошибки приведите.
Thanks:

mdv

Avatar
Date: 9/6/2011
Reply


at StockSharp.Quik.QuikTrader.#=qb8UK6OIUIbJMVeHlbOI65jq9T0y5i1xFvpi9bwfv_5k=.#=qyDUX5HBx_RonawnavrhbQw==(Exception #=qJGoxPFUzgnr6CSAPMnl52Q==)\r\n at #=qcHY9fPFm5xqxdHpgEdv8N_FH3JjHn$UY1TnoF9bcYJwclTD9DAZWJnJhLed70G8K.#=qvqiiUmdD8eJCMhhy$DCE3A==(DdeTable #=qwv6c0ugxXuL7ObO0x8XKGA==, IList`1 #=qqsMwosJewabRBWbSGqFU7Q==, Action`2 #=q1GmEBNmz2CVGWiCKhcsWPA==, Action`1 #=qtPK2$9KjpId7xK1QohVWEg==)\r\n at StockSharp.Quik.QuikTrader.#=qb8UK6OIUIbJMVeHlbOI65jq9T0y5i1xFvpi9bwfv_5k=.#=qhiRmc7JSZYbx7AaRjum3jQ==()\r\n at StockSharp.Algo.BaseTrader.ProcessEvents(Action handler)
Topic starter
Thanks:

Mikhail Sukhov

Avatar
Date: 9/6/2011
Reply


mdv Go to
at StockSharp.Quik.QuikTrader.#=qb8UK6OIUIbJMVeHlbOI65jq9T0y5i1xFvpi9bwfv_5k=.#=qyDUX5HBx_RonawnavrhbQw==(Exception #=qJGoxPFUzgnr6CSAPMnl52Q==)\r\n at #=qcHY9fPFm5xqxdHpgEdv8N_FH3JjHn$UY1TnoF9bcYJwclTD9DAZWJnJhLed70G8K.#=qvqiiUmdD8eJCMhhy$DCE3A==(DdeTable #=qwv6c0ugxXuL7ObO0x8XKGA==, IList`1 #=qqsMwosJewabRBWbSGqFU7Q==, Action`2 #=q1GmEBNmz2CVGWiCKhcsWPA==, Action`1 #=qtPK2$9KjpId7xK1QohVWEg==)\r\n at StockSharp.Quik.QuikTrader.#=qb8UK6OIUIbJMVeHlbOI65jq9T0y5i1xFvpi9bwfv_5k=.#=qhiRmc7JSZYbx7AaRjum3jQ==()\r\n at StockSharp.Algo.BaseTrader.ProcessEvents(Action handler)


Похоже что такая же проблема что и здесь. Попробуйте так же сделать, как я написал там.
Thanks:

Alexander

Avatar
Date: 9/6/2011
Reply


Thanks:

mdv

Avatar
Date: 10/5/2011
Reply


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

Quote:
Проблема решена в привате - помогла совокупность мер:
1) удаление лишних вкладок в квике
2) обновление квика
3) запуск квика от имени администратора
4) запуск робота от имени администратора.


Все эти условия выполняются. Quik версии 5.24.0.58 от БКС (на запрос обновления говорит, что версия актуальная). Вкладка одна. Работаю под администратором.
Повторюсь: ту же скомпилированную программу запускаю под Quik junior и котирование работает.

Запускаю экспорт всего.
В таблице "Портфели по деривативам" ранее дублировались счета, но я оставил только показ денежных средств и теперь дублирования нет.
Тем не менее в Trader.ProcessDataError вижу исключение "An item with the same key has already been added."


Code
at StockSharp.Quik.QuikTrader.#=q83RC8QjwGE06bYxuClwq92LhVOvhOqg1Ibb6sc3fM$w=.#=qHtaS6txU5q5s$pGByXL11A==(Exception #=q3EX0jksDxWU3FAj8z3Iysg==)
at #=qp_fbLTJnFE2othouXvioeCpaCgoD026MlkJsD2ZqOQGLb6nfpDLyRuo5lZzqRlei.#=qAUA7Once2I3cbE7dXu$MZg==(DdeTable #=qSWwYAwvcL$D4KIHt_5bG3w==, IList`1 #=q6IUmIWmvvdbuHixc5eXkyQ==, Action`2 #=qTX0q2c4E$ISj79rZpKw6vA==, Action`1 #=qs7PROwMpZp9zzgPyrFElhg==, Boolean #=qTJVmId$bLpcrK$siTqKJ3A==)
at StockSharp.Quik.QuikTrader.#=q83RC8QjwGE06bYxuClwq92LhVOvhOqg1Ibb6sc3fM$w=.#=qai1UIIPXichyJylDPEZbQA==()
at StockSharp.Algo.BaseTrader.ProcessEvents(Action handler)


Подскажите, пожалуйста, как действовать дальше.
Topic starter
Thanks:

mdv

Avatar
Date: 10/5/2011
Reply


И еще вопрос, возможно не для этой темы. Так как котирование у меня не работает, я использую обычные заявки. А в них нужно указать цену. Раньше я брал ее из LastTrade, а теперь LastTrade равен null. Где брать цену? Получаю стакан - там тоже BestAsk/BeatBid null. Чтобы получить руками последнюю сделку, надо подождать, пока все сделки загрузятся (через событие новых сделок), а их очень много. И что значит "по умолчонию равен null"? Можно где-то включить что-то, чтобы это поле было не null?
Topic starter
Thanks:

Mikhail Sukhov

Avatar
Date: 10/5/2011
Reply


mdv Go to
И еще вопрос, возможно не для этой темы. Так как котирование у меня не работает, я использую обычные заявки. А в них нужно указать цену. Раньше я брал ее из LastTrade, а теперь LastTrade равен null. Где брать цену? Получаю стакан - там тоже BestAsk/BeatBid null. Чтобы получить руками последнюю сделку, надо подождать, пока все сделки загрузятся (через событие новых сделок), а их очень много. И что значит "по умолчонию равен null"? Можно где-то включить что-то, чтобы это поле было не null?


Значит раньше вы брали нулевую цени и тогда по определению работать должно было неправильно. Запустите экспорт стакана.
Thanks:

Mikhail Sukhov

Avatar
Date: 10/5/2011
Reply


mdv Go to
В таблице "Портфели по деривативам" ранее дублировались счета, но я оставил только показ денежных средств и теперь дублирования нет.
Тем не менее в Trader.ProcessDataError вижу исключение "An item with the same key has already been added."


Выведите данные, что приходят через QuikTrader.PreProcessDdeData.
Thanks: mdv

Alexander

Avatar
Date: 10/5/2011
Reply


mdv Go to
И еще вопрос, возможно не для этой темы. Так как котирование у меня не работает, я использую обычные заявки. А в них нужно указать цену. Раньше я брал ее из LastTrade, а теперь LastTrade равен null. Где брать цену? Получаю стакан - там тоже BestAsk/BeatBid null. Чтобы получить руками последнюю сделку, надо подождать, пока все сделки загрузятся (через событие новых сделок), а их очень много. И что значит "по умолчонию равен null"? Можно где-то включить что-то, чтобы это поле было не null?


Цену брать из последней сделки. Как придёт - так установится не в null. Тоже самое с BestAsk.
И то и то устанавливается как приходит первая сделка \ появляется стакан.
Для последнего - необходим экспорт стакана.

Quote:
И что значит "по умолчонию равен null"? Можно где-то включить что-то, чтобы это поле было не null?


А чему вы хотите чтобы это поле было равно? :))
Если нет сделок - нет последней цены. Раньше цена равнялась 0, что неверно.
Хотите произвольную цену - создайте и задайте LastTrade сами, указав в нём Price.
Thanks:

mdv

Avatar
Date: 10/5/2011
Reply


Экспорт стакана запущен. Но Trader.GetMarketDepth(Security).BestAsk == null.
Решил проблему добавив в Quik в таблицу Инструментов нужные поля.

А что нужно посмотреть в данных из Quik? Вот я распечатал названия таблиц.
Code
12:11:23.965 |            | MQS             | Стратегия запущена.
12:11:24.015 | Error      | TLS             | An item with the same key has already been added.
12:11:24.249 | Warning    | TLS             | все сделки
12:11:24.507 | Warning    | TLS             | [стакан]RIZ1@RTS
12:11:24.627 | Error      | TLS             | An item with the same key has already been added.
12:11:24.979 | Warning    | TLS             | инструменты
12:11:24.994 | Warning    | TLS             | инструменты
12:11:25.014 | Warning    | TLS             | инструменты
12:11:25.185 | Warning    | TLS             | все сделки
12:11:25.216 | Warning    | TLS             | инструменты
12:11:25.217 | Warning    | TLS             | инструменты
12:11:25.287 | Warning    | TLS             | [стакан]RIZ1@RTS
12:11:25.309 | Warning    | TLS             | инструменты
12:11:25.340 | Error      | TLS             | An item with the same key has already been added.
12:11:25.369 | Warning    | TLS             | инструменты
12:11:25.370 | Warning    | TLS             | инструменты
12:11:25.419 | Warning    | TLS             | инструменты
12:11:25.525 | Warning    | TLS             | инструменты
12:11:25.851 | Warning    | TLS             | инструменты
12:11:26.067 | Warning    | TLS             | инструменты
12:11:26.091 | Warning    | TLS             | все сделки
12:11:26.300 | Warning    | TLS             | [стакан]RIZ1@RTS
12:11:26.322 | Error      | TLS             | An item with the same key has already been added.
12:11:26.672 | Warning    | TLS             | инструменты
12:11:27.283 | Warning    | TLS             | инструменты
12:11:27.291 | Warning    | TLS             | инструменты
12:11:27.315 | Warning    | TLS             | [стакан]RIZ1@RTS
12:11:27.366 | Error      | TLS             | An item with the same key has already been added.
12:11:27.477 | Warning    | TLS             | все сделки
12:11:27.486 | Warning    | TLS             | инструменты
12:11:27.691 | Warning    | TLS             | инструменты
12:11:28.329 | Warning    | TLS             | [стакан]RIZ1@RTS
12:11:28.368 | Error      | TLS             | An item with the same key has already been added.
12:11:28.743 | Warning    | TLS             | все сделки
12:11:29.343 | Warning    | TLS             | [стакан]RIZ1@RTS
12:11:29.383 | Error      | TLS             | An item with the same key has already been added.
12:11:29.671 | Warning    | TLS             | инструменты
12:11:29.888 | Warning    | TLS             | инструменты
12:11:30.015 | Warning    | TLS             | все сделки
12:11:30.091 | Warning    | TLS             | инструменты
12:11:30.108 | Warning    | TLS             | инструменты
12:11:30.227 | Warning    | TLS             | инструменты
12:11:30.233 | Warning    | TLS             | инструменты
12:11:30.355 | Warning    | TLS             | [стакан]RIZ1@RTS
12:11:30.376 | Error      | TLS             | An item with the same key has already been added.
12:11:30.429 | Warning    | TLS             | инструменты
12:11:30.628 | Warning    | TLS             | инструменты
12:11:30.642 | Warning    | TLS             | инструменты
12:11:31.050 | Warning    | TLS             | инструменты
12:11:31.362 | Warning    | TLS             | все сделки
12:11:31.377 | Warning    | TLS             | [стакан]RIZ1@RTS
12:11:31.393 | Error      | TLS             | An item with the same key has already been added.
12:11:31.424 | Warning    | TLS             | инструменты
12:11:31.643 | Warning    | TLS             | инструменты
12:11:31.858 | Warning    | TLS             | инструменты
12:11:32.063 | Warning    | TLS             | инструменты
12:11:32.387 | Warning    | TLS             | [стакан]RIZ1@RTS
12:11:32.443 | Error      | TLS             | An item with the same key has already been added.
12:11:32.683 | Warning    | TLS             | инструменты
12:11:32.831 | Warning    | TLS             | все сделки
12:11:33.411 | Warning    | TLS             | [стакан]RIZ1@RTS
12:11:33.443 | Error      | TLS             | An item with the same key has already been added.
Topic starter
Thanks:

Alexander

Avatar
Date: 10/5/2011
Reply


И да, Verifier что пишет?
Версия 4.0.1?
Thanks: mdv

mdv

Avatar
Date: 10/5/2011
Reply


Все, мужики, каюсь. Столбцы были перепутаны в стакане. Спасибо вам огромное за помощь!
Сейчас и в стакане не null-ы =))

Alexander Mukhanchikov Go to
А чему вы хотите чтобы это поле было равно? :))
Если нет сделок - нет последней цены. Раньше цена равнялась 0, что неверно.
Хотите произвольную цену - создайте и задайте LastTrade сами, указав в нём Price.

Я неправильно понял слово "По умолчанию", так то естественно, что 0 - это неправильно.
Topic starter
Thanks:

mdv

Avatar
Date: 10/17/2011
Reply


Столкнулся еще вот с какой проблемой при котировании.

Code
20:33:01.477 |            | TLS             | Стратегия хочет продать 2.
20:33:01.533 |            | MQS             | Стратегия запущена.
20:33:01.674 |            | MQS             | Регистрация новой заявки на Sell с ценой 139600 и объемом 2.
20:33:01.794 |            | MQS             | Заявка 73798096 на Sell отправлена с ценой 139600 объемом 2.
20:33:02.024 |            | MQS             | Обработка Limit заявки 73798096 на Sell с номером 5467784981.
20:33:02.693 |            | MQS             | Цена текущей 139600 и лучшей 139550.
20:33:02.695 |            | MQS             | Лучший бид 139560 и лучший аск 139590.
20:33:02.766 |            | MQS             | Котирование заявки 73798096 на Sell с ценой 139600 объемом 2.
20:33:02.829 |            | MQS             | Перекотирование зарегистрировано для заявки 73798097 на Sell с ценой 139550 объемом 2.
20:33:03.051 | Error      | MQS             | Заявка 73798097 не была принята по причине System.InvalidOperationException: Сервер для транзакции 'ACTION=MOVE_ORDERS; TRANS_ID=73798097; CLASSCODE=SPBFUT; SECCODE=RIZ1; MODE=0; FIRST_ORDER_NUMBER=5467784981; FIRST_ORDER_NEW_PRICE=139550; FIRST_ORDER_NEW_QUANTITY=2;' вернул неправильное сообщение 'Ошибка перестановки заявок. [FORTS] "Не найдена заявка для перестановки.".' по передвинутым заявкам..
20:33:03.986 | Error      | MQS             | Котируемая заявка 73798097 не принята биржей по причине 'Сервер для транзакции 'ACTION=MOVE_ORDERS; TRANS_ID=73798097; CLASSCODE=SPBFUT; SECCODE=RIZ1; MODE=0; FIRST_ORDER_NUMBER=5467784981; FIRST_ORDER_NEW_PRICE=139550; FIRST_ORDER_NEW_QUANTITY=2;' вернул неправильное сообщение 'Ошибка перестановки заявок. [FORTS] "Не найдена заявка для перестановки.".' по передвинутым заявкам.'.


Если я правильно понимаю, вместо заявки 73798096 стратегия начала перекотировать заявку 73798097.
Прокомментируйте, пожалуйста, как такое возможно? Или эти номера вообще к делу не относятся, а относится только 5467784981?
Кстати, после такой ошибки, какое поведение должно быть у стратегии котирования? У меня сложилось впечатление,
что она забыла про заявку 73798096, ибо продала она в результате 4 вместо 2. Кусок лога, следующий сразу за предыдущим.

Code
20:33:03.987 |            | MQS             | Регистрация новой заявки на Sell с ценой 139550 и объемом 2.
20:33:04.040 |            | MQS             | Заявка 73798100 на Sell отправлена с ценой 139550 объемом 2.
20:33:04.080 | Warning    | MQS             | Заявка 73798100 не имеет состояния.
20:33:04.088 |            | MQS             | Обработка Conditional заявки 73798099 на Buy с номером 6628110.
20:33:04.174 |            | MQS             | Позиция изменилась на -2.
20:33:04.195 |            | MQS             | Новая Sell сделка 426260967 на 1 заявки 73798096.
20:33:04.196 |            | MQS             | Заканчиваем котирование с неисполненным объемом равный 0.
20:33:04.197 |            | MQS             | Стратегия останавливается.
20:33:04.198 |            | MQS             | Заканчиваем котирование с неисполненным объемом равный 0.
20:33:04.198 |            | MQS             | Новая Sell сделка 426260968 на 1 заявки 73798096.
20:33:04.203 |            | MQS             | Заканчиваем котирование с неисполненным объемом равный 0.
20:33:04.247 |            | MQS             | Обработка Limit заявки 73798100 на Sell с номером 5467785811.
20:33:04.387 |            | MQS             | Новая Sell сделка 426261019 на 1 заявки 73798100.
20:33:04.428 |            | MQS             | Новая Sell сделка 426261020 на 1 заявки 73798100.


Вот эти 8значные номера - как они используются? Дело в том, что у меня выставляются стопы параллельно с котированием.
И вот мне кажется, что некоторые номера из этой последовательности уходят на мои стопы, и из-за этого происходят ошибки.
Как с этим бороться? Стопы выставляются просто по изменению позиции.
Topic starter
Thanks:

mdv

Avatar
Date: 10/21/2011
Reply


Отключил выставление стопов вообще, ситуация не изменилась. Уважаемые разработчики, у вас есть какие-нибудь предположения на счет этой ошибки про отсутствие заявки для перестановки?
Мне кажется, это очень важный момент, так как такая же проблема описывалась тут: https://stocksharp.com/posts/m/10521/ и насколько я понял, не была решена.
Topic starter
Thanks:

Alexander

Avatar
Date: 11/11/2011
Reply


Было довольно много фиксов последнее время, попробуйте 4.0.5.
Если у кого-то будет наблюдаться подобное в последней версии - пишите.
Thanks:


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

loading
clippy