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 http://stocksharp.com/do...c9-9a9b-9baf9bab10b4.htm
|
|
|
|
|
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
|
Дата: 24.08.2011
|
|
|
|
Alexander Ortn Alexander Так Order исполнился, поля изменились... Вы не поняли. У меня в один момент времени есть два ордера с одним id и различными статусами(!), при этом то который хранится в trader правильный (тк показывает, что заявка исполнена и это действительно так) а у другого статус неверный. Я понял. Очевидно значит что вы не так сохраняете Order. Напишите как сохраняете, как копируете. Я уже выше написал, но могу написать максимально подробно, если это поможет. У меня создается только одна заявка (пока тестирую автоматическое оптимальное исполнение больших заявок). Т.е. в классе робота есть одно поле Создается она так: Код
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# и не будет ничего обновлять. И да, перезапись старого ордера плохой стиль кодирования. Ведет к багам. Не удивлюсь, если в этом причина и вы смотрите не ту заявку.
|
|
Спасибо:
|
|
|
|