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


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

Теги:


Спасибо:




12 Ответов
Ortn

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


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

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

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


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


https://stocksharp.ru/do...c9-9a9b-9baf9bab10b4.htm
Спасибо: Ortn

Mikhail Sukhov

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


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


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

Ortn

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


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


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



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

Ortn

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


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


У моего 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

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


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

Ortn

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


Alexander Перейти
Так Order исполнился, поля изменились...



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


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

Alexander

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


Ortn Перейти
Alexander Перейти
Так Order исполнился, поля изменились...



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


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

Ortn

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


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

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


Ortn Перейти

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


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

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

Ortn

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


Mikhail Sukhov Перейти
Ortn Перейти

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


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

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



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

Mikhail Sukhov

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


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


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


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

loading
clippy