День добрый.
Вчера обновил StockSharp до версии 4.1.4 и обнаружил, что перестало приходить событие OnNewMyTrades. До обновления все работало. Делаю так:
- В методе OnStarted() стратегии подписываюсь на события:
this
.WhenNewMyTrades()
.Do(ProcessNewTrades)
.Apply(this);
- Метод ProcessNewTrades() определен так:
protected void ProcessNewTrades(IEnumerable<MyTrade> trades)
{
}
- Позицию открываю через котирование:
protected void PositionOpen(OrderDirections direction)
{
var strategy = new BestByPriceQuotingStrategy(direction, Volume);
strategy.LogLevel = LogLevels.Info;
ChildStrategies.Add(strategy);
}
До обновления у меня был переопределен метод OnNewMyTrades() - после обновления он также перестал вызываться.
Это я что-то неправильно делаю, или в библиотеке баг?
Еще из мелкого:
- пропал extension method LastValue() для индикаторов.
- в окошке StockSharp.Xaml.Monitor() отключили автоматическое изменение ширины колонок под их содержимое. Приходится теперь руками растаскивать. :)
Kommentare (30)
Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen
Неудачный релиз, там много ошибок. Лучше сразу 4.1.5. Скоро его выложим на бокс.
Там теперь по другому. Это не беда, а изменился дизайн.
Скачал версию 4.1.5 с Codeplex - сообщения OnNewMyTrades по-прежнему не приходят. :(
Видимо какие-то другие ошибки.
Михаил, Вы имеете в виду ошибки в моем коде или в библиотеке? Я уверен, что это ошибка в StockSharp, т.к.:
Я размещаю заявки через котирование, возможно, проблема в этом?
По подробнее схему работы. На обработчики ошибок подписывались?
Схема работы в принципе описана в первом сообщении. Работаю через SmartCOM. Нужны ли еще какие-либо подробности? Сейчас я перекрыл метод OnNewMyTrades - он тоже не вызывается (в версии 4.1.3 - вызывался):
Повесил обработчики на Strategy.Error, Strategy.OrderCancelFailed, Strategy.OrderRegisterFailed в родительской стратегии - они не вызываются, ошибок в логе нет, исключений в процессе работы тоже не возникает.
Пробовали Strategy.WaitAllTrades в true поставить?
Попробовал, не помогло. Выставлял одновременно и для основной стратегии, и для стратегии, через которую осуществляется котирование.
P.S.: Причем стратегия сделки видит, размер позиции при исполнении заявки изменяется.
Спасибо, попробую. В предыдущих версиях библиотеки этого свойства не было.
Если для котирования выставить WaitAllTrades и смотреть NewMyTrades именно для стратегии котирования, сделки придут? Еще может помочь разобраться лог стартегий (корневой и котирования), где в обработчиках будет выводиться информация о сделках и заявках.
Ok, попробую. Заметил, что иногда метод вызывается. 🤨
Если в кратце, то стратегия останавливается при наборе нужной позиции, позиция по умолчанию учитывается по балансу заявок. Когда стратегия останавливается, она удаляется из дочерних и отписывается от получения данных. Т.к. сделки могут придти уже после, то они никуда не попадут. Эта ситуация уже описывалась на форуме.
Судя по логам, проблема возникает при одновременном запуске нескольких дочерних стратегий на котирование. У меня основная стратегия переворачивает позицию, размещая две отдельные заявки через котирование. Обе стратегии отрабатывают без ошибок, я вижу изменение позиции. Однако, OnNewMyTrades вызывается только для последней дочерней стратегии. WaitAllTrades для всех стратегий установлен в true. Кусок лога:
Что касается учета позиции по балансу заявок - а что делать в том случае, если позиция переносится через ночь? Статью в документации на эту тему я читал. Как я понял, предлагается загружать имеющиеся заявки из терминала, и определять, какие из них принадлежать текущей стратегии. Но при переносе позиции на следующий день мне например вчерашние заявки уже недоступны. Сейчас я при изменении состояния стратегии тупо сбрасываю его в файл вместе с размером позиции и параметрами, необходимыми для восстановления работы при перезапуске робота. При загрузке размер позиции считывается из этого файла. Допустим ли такой подход?
P.S.: Посмотрел еще сегодня утром - событие не приходит, если позиция закрывается. По сделкам, открывающим позицию, событие приходит.
По логу не понятно, где была первая стратегия, где вторая. Имена у них одинаковые.
Можете сделать проект с минимальным кодом, который воспроизводит эту проблему?
Отправил проект в личку.
P.S.: Да, действительно выставление Strategy.WaitAllTrades в true проблему решило. Спасибо за помощь! :)
У меня другая проблема сборка 19868
В методе OnStarted() стратегии подписываюсь на события: WhenNewMyTrades().Do<IEnumerable<MyTrade>>(Overlap).Apply(this);
Overlap у меня вызывается несколько раз на каждую сделку
Логи?
Я под дебагом это выяснил... если до конца сессии успею, попробую сделать логи
У меня внутри процедуры стоит свой счетчик, так вот он не совпадает с позицией, те по логам и по эксель отчету количество сделок все правильно, а счетчик не сходится. Причем иногда приходит все правильно, а иногда 2 раза, иногда 7... Торгую через плазу
Значит счетчик считает что-то не то.
2012.10.10 21:33:39.272| |PHS_RIZ2@RTS |Номер трейда 644087326: 73879377/9145599581 Покупка Цена=146930 Объем=10 Сост=Active Бал=10 2012.10.10 21:33:41.267| |PHS_RIZ2@RTS |Номер трейда 644087326: 73879377/9145599581 Покупка Цена=146930 Объем=10 Сост=Active Бал=10 2012.10.10 21:33:41.267| |PS_RIZ2@RTS |Новая Buy сделка 644087326 по цене 146540 на 1 заявки 73879377. 2012.10.10 21:33:41.267| |PS_RIZ2@RTS |Заменяемая заявка: 73879377/9145599581 Покупка Цена=146930 Объем=10 Сост=Active Бал=10 2012.10.10 21:33:41.267| |PS_RIZ2@RTS |Перемещаем заявку, новая заявка: 0/0 Покупка Цена=146900 Объем=10 Сост=None Бал=0 2012.10.10 21:33:43.168| |PHS_RIZ2@RTS |Номер трейда 644087327: 73879377/9145599581 Покупка Цена=146930 Объем=10 Сост=Active Бал=10 2012.10.10 21:33:43.839| |PHS_RIZ2@RTS |Номер трейда 644087327: 73879377/9145599581 Покупка Цена=146930 Объем=10 Сост=Active Бал=10 2012.10.10 21:33:43.839| |PS_RIZ2@RTS |Новая Buy сделка 644087327 по цене 146540 на 1 заявки 73879377. 2012.10.10 21:33:44.244| |PHS_RIZ2@RTS |Номер трейда 644087328: 73879377/9145599581 Покупка Цена=146930 Объем=10 Сост=Active Бал=10 2012.10.10 21:33:44.415| |PHS_RIZ2@RTS |Номер трейда 644087328: 73879377/9145599581 Покупка Цена=146930 Объем=10 Сост=Active Бал=10 2012.10.10 21:33:44.415| |PS_RIZ2@RTS |Новая Buy сделка 644087328 по цене 146540 на 1 заявки 73879377. 2012.10.10 21:33:44.587| |PHS_RIZ2@RTS |Номер трейда 644087329: 73879377/9145599581 Покупка Цена=146930 Объем=10 Сост=Active Бал=10 2012.10.10 21:33:44.743| |PHS_RIZ2@RTS |Номер трейда 644087329: 73879377/9145599581 Покупка Цена=146930 Объем=10 Сост=Active Бал=10 2012.10.10 21:33:44.743| |PS_RIZ2@RTS |Новая Buy сделка 644087329 по цене 146540 на 1 заявки 73879377. 2012.10.10 21:33:44.883| |PHS_RIZ2@RTS |Номер трейда 644087330: 73879377/9145599581 Покупка Цена=146930 Объем=10 Сост=Active Бал=10 2012.10.10 21:33:45.039| |PHS_RIZ2@RTS |Номер трейда 644087330: 73879377/9145599581 Покупка Цена=146930 Объем=10 Сост=Active Бал=10 2012.10.10 21:33:45.039| |PS_RIZ2@RTS |Новая Buy сделка 644087330 по цене 146550 на 1 заявки 73879377. 2012.10.10 21:33:45.179| |PHS_RIZ2@RTS |Номер трейда 644087331: 73879377/9145599581 Покупка Цена=146930 Объем=10 Сост=Active Бал=10 2012.10.10 21:33:45.335| |PHS_RIZ2@RTS |Номер трейда 644087331: 73879377/9145599581 Покупка Цена=146930 Объем=10 Сост=Active Бал=10 2012.10.10 21:33:45.335| |PS_RIZ2@RTS |Новая Buy сделка 644087331 по цене 146550 на 1 заявки 73879377. 2012.10.10 21:33:45.460| |PHS_RIZ2@RTS |Номер трейда 644087332: 73879377/9145599581 Покупка Цена=146930 Объем=10 Сост=Active Бал=10 2012.10.10 21:33:47.548| |PHS_RIZ2@RTS |Номер трейда644087332: 73879377/9145599581 Покупка Цена=146930 Объем=10 Сост=Active Бал=10 2012.10.10 21:33:47.548| |PS_RIZ2@RTS |Новая Buy сделка 644087332 по цене 146550 на 4 заявки 73879377. 2012.10.10 21:33:47.548| |PS_RIZ2@RTS |Новая позиция: 0700N60-RIZ2@RTS=11. 2012.10.10 21:33:47.548| |PS_RIZ2@RTS |Новая позиция: 0700N60-RIZ2@RTS=12. 2012.10.10 21:33:47.548| |PS_RIZ2@RTS |Новая позиция: 0700N60-RIZ2@RTS=13. 2012.10.10 21:33:47.548| |PS_RIZ2@RTS |Новая позиция: 0700N60-RIZ2@RTS=14. 2012.10.10 21:33:47.564| |PS_RIZ2@RTS |Новая позиция: 0700N60-RIZ2@RTS=15. 2012.10.10 21:33:47.564| |PS_RIZ2@RTS |Новая позиция: 0700N60-RIZ2@RTS=16. 2012.10.10 21:33:47.564| |PS_RIZ2@RTS |Новая позиция: 0700N60-RIZ2@RTS=20.
У меня все нормально работает на 4.1 уже полгода, сегодня решил посмотреть 4.1.5.
Время между приходом повторных трейдов вначале лога большое тк под дебагом делал, там брейкпоинты стояли - во второй половине лога реальное
Что есть PS, PHS? Правило точно один раз создается?
Давайте предоставлять больше информации, чтобы не тратить кучу времени на выяснение обстоятельств. Время - деньги.
Пока вопрос снят, похоже это ДО 4.1.5 было немного неправильно организовано и у меня под это было построено.