← Zurück

Систематически не происходит обновление статуса заявки

Столкнулся с проблемой, когда заявка в stocksharp висит со статусом None, хотя реально она уже была исполнена (видно в SmartX), происходит не с каждой заявкой, но с очень многими. Как можно отследить причину подобного явления? Версия SmartCom последняя (пробовал переустановить - не помогло). Версия S# 3.2.5

War dieses Thema hilfreich?

Thema teilen

Kommentare (12)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

Ortn
Ortn Autor

Логика работы программы такая

  1. Создаю SmartTrader
  2. Подписываюсь на получение сделок (NewTrades) и делаю connect
  3. Когда приходит новая сделка в той же нитке создаю Order (если он не был создан или старый Order отработал), или если есть активный ордер я его двигаю. Двигаю я его следующим образом: а) Беру старый Order (в коде называется order) б) Вызываю order = _trader.ReRegisterOrder(order, updatedprice, order.Balance); в) При этом старый order я нигде не сохраняю, а пишу поверх новый.

Т.к. я торгую на ФОРТС и количество контрактов в Order не меняется, то должен сработать moveorder (который поддерживается на бирже) верно? У меня такое ощущение что именно при перемещении Order происходит такая проблема. Завтра попробую проверить, но если то, как я это сейчас делаю в принципе не правильно, скажите мне об этом. Благодарю за потраченное время!

p.s. У подвисшей заявки есть в extensioninfo smartid, по которому я вижу, что заявка была уже давно исполнена, но при этом status == None, как так?

Mikhail Sukhov
Mikhail Sukhov

Ortn: в) При этом старый order я нигде не сохраняю, а пишу поверх новый.

Может быть еще и в этом причина, но лучше отследите события через SmartComWrapper

Ortn
Ortn Autor

Mikhail Sukhov:

Ortn: в) При этом старый order я нигде не сохраняю, а пишу поверх новый.

Может быть еще и в этом причина, но лучше отследите события через SmartComWrapper

Спасибо, попробую и отпишусь о результатах.

Mikhail Sukhov
Mikhail Sukhov

Ortn: Столкнулся с проблемой, когда заявка в stocksharp висит со статусом None, хотя реально она уже была исполнена (видно в SmartX), происходит не с каждой заявкой, но с очень многими. Как можно отследить причину подобного явления? Версия SmartCom последняя (пробовал переустановить - не помогло). Версия S# 3.2.5

http://stocksharp.com/doc/html/535227b6-0338-44c9-9a9b-9baf9bab10b4.htm

Ortn
Ortn
Ortn Autor

В общем, ситуация такая:

У моего 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**" (номер тот же)

Как такое могло произойти?

Alexander
Alexander

Так Order исполнился, поля изменились...

Ortn
Ortn Autor

Alexander: Так Order исполнился, поля изменились...

Вы не поняли. У меня в один момент времени есть два ордера с одним id и различными статусами(!), при этом то который хранится в trader правильный (тк показывает, что заявка исполнена и это действительно так) а у другого статус неверный.

p.s. Прикрутил апдейт подвисших заявок на основе orders в trader, посмотрим может так заработает

Alexander
Alexander

Ortn:

Alexander: Так Order исполнился, поля изменились...

Вы не поняли. У меня в один момент времени есть два ордера с одним id и различными статусами(!), при этом то который хранится в trader правильный (тк показывает, что заявка исполнена и это действительно так) а у другого статус неверный.

Я понял. Очевидно значит что вы не так сохраняете Order. Напишите как сохраняете, как копируете.

Ortn
Ortn Autor

Alexander:

Ortn:

Alexander: Так Order исполнился, поля изменились...

Вы не поняли. У меня в один момент времени есть два ордера с одним id и различными статусами(!), при этом то который хранится в trader правильный (тк показывает, что заявка исполнена и это действительно так) а у другого статус неверный.

Я понял. Очевидно значит что вы не так сохраняете Order. Напишите как сохраняете, как копируете.

Я уже выше написал, но могу написать максимально подробно, если это поможет.

У меня создается только одна заявка (пока тестирую автоматическое оптимальное исполнение больших заявок).

Т.е. в классе робота есть одно поле

Order activeorder;

Создается она так:


activeorder = new Order
                {
                    Type = OrderTypes.Limit,
                    Portfolio = _portfolio,
                    Price = sell,
                    Security = _security,
                    Volume = _size,
                    Direction = OrderDirections.Sell,
                };
_trader.RegisterOrder(activeorder);

Затем когда у меня в _trader происходит событие NewTrades и я решаю что заявку надо передвинуть я делаю следующее:


// блокирую нитку
mut.WaitOne();
if ((activeOrder.State == OrderStates.Active || activeOrder.State == OrderStates.None) && (activeorder.Balance > 0))
    activeorder = _trader.ReRegisterOrder(activeorder , sell, activeorder .Balance);
mut.ReleaseMutex();

Так вот в некоторых случаях activeorder висит со статусом None и Balance = 1 хотя заявка уже была исполнена. И это происходит не всегда (примерно в 30% случаях)

зы по OrdersChanged приходит обновление Balance == 0 по заявке но в той заявке, которая сохраняется у меня (activeorder) ничего не меняется (в некоторых случаях)

Mikhail Sukhov
Mikhail Sukhov

Ortn: Так вот в некоторых случаях activeorder висит со статусом None и Balance = 1 хотя заявка уже была исполнена. И это происходит не всегда (примерно в 30% случаях)

А что SmartComWrapper говорит в этом случае? Он данные какие-то шлет? Вы должны четко понимать, что если СмартКом ничего не присылает, значит S# и не будет ничего обновлять.

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

Ortn
Ortn Autor

Mikhail Sukhov:

Ortn: Так вот в некоторых случаях activeorder висит со статусом None и Balance = 1 хотя заявка уже была исполнена. И это происходит не всегда (примерно в 30% случаях)

А что SmartComWrapper говорит в этом случае? Он данные какие-то шлет? Вы должны четко понимать, что если СмартКом ничего не присылает, значит S# и не будет ничего обновлять.

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

Скажите, а можно подписаться на события SmartComWrapper, если программа работает с самим SmartTrader? Они не будут кофликтовать? Т.е. если я буду вызывать connect на SmartTrader, будут ли мне приходить события и по SmartComWrapper и SmartTrader? А то не знаю как лучше организовать проверку

Mikhail Sukhov
Mikhail Sukhov

Ortn: Скажите, а можно подписаться на события SmartComWrapper, если программа работает с самим SmartTrader? Они не будут кофликтовать? Т.е. если я буду вызывать connect на SmartTrader, будут ли мне приходить события и по SmartComWrapper и SmartTrader? А то не знаю как лучше организовать проверку

Конфликта не будет, так как SmartComWrapper является ядром коннектора. Что SmartTrader, что ваш код для него равнозначны.