Столкнулся с проблемой, когда заявка в stocksharp висит со статусом None, хотя реально она уже была исполнена (видно в SmartX), происходит не с каждой заявкой, но с очень многими. Как можно отследить причину подобного явления? Версия SmartCom последняя (пробовал переустановить - не помогло). Версия S# 3.2.5
Comments (12)
Login or Create account, Log in or register to leave a comment
Логика работы программы такая
Т.к. я торгую на ФОРТС и количество контрактов в Order не меняется, то должен сработать moveorder (который поддерживается на бирже) верно? У меня такое ощущение что именно при перемещении Order происходит такая проблема. Завтра попробую проверить, но если то, как я это сейчас делаю в принципе не правильно, скажите мне об этом. Благодарю за потраченное время!
p.s. У подвисшей заявки есть в extensioninfo smartid, по которому я вижу, что заявка была уже давно исполнена, но при этом status == None, как так?
Может быть еще и в этом причина, но лучше отследите события через SmartComWrapper
Спасибо, попробую и отпишусь о результатах.
http://stocksharp.com/doc/html/535227b6-0338-44c9-9a9b-9baf9bab10b4.htm
В общем, ситуация такая:
У моего Order (который я сохраняю) следующие поля:
Balance 1 Latency {00:00:00} Id 0 State None
В ExtensionInfo одна запись:
"OrderSmartId" "711872**" (номер заявки)
НО! В самом trader (если смотреть в Order.trader) в массиве orders значится следующий Order
Balance 0 Latency {00:00:00.1796921} State Done Status Accepted
В ExtensionInfo следующая запись:
"OrderSmartId" "711872**" (номер тот же)
Как такое могло произойти?
Так Order исполнился, поля изменились...
Вы не поняли. У меня в один момент времени есть два ордера с одним id и различными статусами(!), при этом то который хранится в trader правильный (тк показывает, что заявка исполнена и это действительно так) а у другого статус неверный.
p.s. Прикрутил апдейт подвисших заявок на основе orders в trader, посмотрим может так заработает
Я понял. Очевидно значит что вы не так сохраняете Order. Напишите как сохраняете, как копируете.
Я уже выше написал, но могу написать максимально подробно, если это поможет.
У меня создается только одна заявка (пока тестирую автоматическое оптимальное исполнение больших заявок).
Т.е. в классе робота есть одно поле
Создается она так:
Затем когда у меня в _trader происходит событие NewTrades и я решаю что заявку надо передвинуть я делаю следующее:
Так вот в некоторых случаях activeorder висит со статусом None и Balance = 1 хотя заявка уже была исполнена. И это происходит не всегда (примерно в 30% случаях)
зы по OrdersChanged приходит обновление Balance == 0 по заявке но в той заявке, которая сохраняется у меня (activeorder) ничего не меняется (в некоторых случаях)
А что SmartComWrapper говорит в этом случае? Он данные какие-то шлет? Вы должны четко понимать, что если СмартКом ничего не присылает, значит S# и не будет ничего обновлять.
И да, перезапись старого ордера плохой стиль кодирования. Ведет к багам. Не удивлюсь, если в этом причина и вы смотрите не ту заявку.
Скажите, а можно подписаться на события SmartComWrapper, если программа работает с самим SmartTrader? Они не будут кофликтовать? Т.е. если я буду вызывать connect на SmartTrader, будут ли мне приходить события и по SmartComWrapper и SmartTrader? А то не знаю как лучше организовать проверку
Конфликта не будет, так как SmartComWrapper является ядром коннектора. Что SmartTrader, что ваш код для него равнозначны.