Проблема с котированием
Atom Ответить
02.09.2011


mdv

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

Теги:


Спасибо:




21 Ответов
Mikhail Sukhov

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


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

mdv

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


Написал вот так (на всякий случай):
Код
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);


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


Дальше ничего... Confused
Автор топика
Спасибо:

Mikhail Sukhov

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


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

mdv

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


Код
                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));

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

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

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

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

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

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

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

Mikhail Sukhov

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


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


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

mdv

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


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

Mikhail Sukhov

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


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


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

mdv

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


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)
Автор топика
Спасибо:

Mikhail Sukhov

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


mdv Перейти
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)


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

Alexander

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


Спасибо:

mdv

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


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

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


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

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


Код
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)


Подскажите, пожалуйста, как действовать дальше.
Автор топика
Спасибо:

mdv

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


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

Mikhail Sukhov

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


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


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

Mikhail Sukhov

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


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


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

Alexander

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


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


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

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


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

mdv

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


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

А что нужно посмотреть в данных из Quik? Вот я распечатал названия таблиц.
Код
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.
Автор топика
Спасибо:

Alexander

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


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

mdv

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


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

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

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

mdv

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


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

Код
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. Кусок лога, следующий сразу за предыдущим.

Код
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значные номера - как они используются? Дело в том, что у меня выставляются стопы параллельно с котированием.
И вот мне кажется, что некоторые номера из этой последовательности уходят на мои стопы, и из-за этого происходят ошибки.
Как с этим бороться? Стопы выставляются просто по изменению позиции.
Автор топика
Спасибо:

mdv

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


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

Alexander

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


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


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

loading
clippy