Есть стратегия унаследованная от TimeFrameStrategy.
Для каждой новой свечки делается следующее:
OpenWealth.Log.Out("ДО отмены приказов");
OpenWealth.Log.Out("Strategy.Orders " + base.Orders.Count);
OpenWealth.Log.Out("Strategy.StopOrders " + base.StopOrders.Count);
OpenWealth.Log.Out("Strategy.Orders active " + base.Orders.Count(o => o.State == OrderStates.Active));
OpenWealth.Log.Out("Strategy.StopOrders active " + base.StopOrders.Count(o => o.State == OrderStates.Active));
OpenWealth.Log.Out("Trader.Orders " + Const.SmartInstance.Trader.Orders.Count());
OpenWealth.Log.Out("Trader.StopOrders " + Const.SmartInstance.Trader.StopOrders.Count());
// отменяем активные заявки
base.CancelActiveOrders();
OpenWealth.Log.Out("ПОСЛЕ отмены приказов");
OpenWealth.Log.Out("Strategy.Orders " + base.Orders.Count);
OpenWealth.Log.Out("Strategy.StopOrders " + base.StopOrders.Count);
OpenWealth.Log.Out("Strategy.Orders active " + base.Orders.Count(o => o.State == OrderStates.Active));
OpenWealth.Log.Out("Strategy.StopOrders active " + base.StopOrders.Count(o => o.State == OrderStates.Active));
OpenWealth.Log.Out("Trader.Orders " + Const.SmartInstance.Trader.Orders.Count());
OpenWealth.Log.Out("Trader.StopOrders " + Const.SmartInstance.Trader.StopOrders.Count());
// регистрируем заявки (обычным способом, без котирования)
StrategyInstance.Alerts.ForEach(a => base.RegisterOrder(Translations.AlertToOrder(a)));
System.Threading.Thread.Sleep(10000);
OpenWealth.Log.Out("ПОСЛЕ регистрации новых приказов");
OpenWealth.Log.Out("Strategy.Orders " + base.Orders.Count);
OpenWealth.Log.Out("Strategy.StopOrders " + base.StopOrders.Count);
OpenWealth.Log.Out("Strategy.Orders active " + base.Orders.Count(o => o.State == OrderStates.Active));
OpenWealth.Log.Out("Strategy.StopOrders active " + base.StopOrders.Count(o => o.State == OrderStates.Active));
OpenWealth.Log.Out("Trader.Orders " + Const.SmartInstance.Trader.Orders.Count());
OpenWealth.Log.Out("Trader.StopOrders " + Const.SmartInstance.Trader.StopOrders.Count());
Для каждой свечки (для одной итерации) создаются два ордера. Вывод на второй свечке (на первой аналогично добавились только в общий список):
09.02.2011 19:41:35 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] ДО отмены приказов
09.02.2011 19:41:35 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Strategy.Orders 0
09.02.2011 19:41:35 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Strategy.StopOrders 0
09.02.2011 19:41:35 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Strategy.Orders active 0
09.02.2011 19:41:35 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Strategy.StopOrders active 0
09.02.2011 19:41:35 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Trader.Orders 2
09.02.2011 19:41:35 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Trader.StopOrders 2
09.02.2011 19:41:35 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] ПОСЛЕ отмены приказов
09.02.2011 19:41:35 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Strategy.Orders 0
09.02.2011 19:41:35 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Strategy.StopOrders 0
09.02.2011 19:41:35 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Strategy.Orders active 0
09.02.2011 19:41:35 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Strategy.StopOrders active 0
09.02.2011 19:41:35 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Trader.Orders 2
09.02.2011 19:41:35 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Trader.StopOrders 2
09.02.2011 19:41:35 [OpenWealth.StockSharp.SmartCOM.<Smart_NewOrders>b__18] RTS-3.11 -1 Conditional
09.02.2011 19:41:35 [OpenWealth.StockSharp.SmartCOM.<Smart_NewOrders>b__18] RTS-3.11 +1 Conditional
09.02.2011 19:41:45 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] ПОСЛЕ регистрации новых приказов
09.02.2011 19:41:45 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Strategy.Orders 0
09.02.2011 19:41:45 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Strategy.StopOrders 0
09.02.2011 19:41:45 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Strategy.Orders active 0
09.02.2011 19:41:45 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Strategy.StopOrders active 0
09.02.2011 19:41:45 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Trader.Orders 4
09.02.2011 19:41:45 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Trader.StopOrders 4
На третьей свечке добавляются наконец в список стратегии, но только в стоп ордера:
09.02.2011 19:51:36 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] ДО отмены приказов
09.02.2011 19:51:36 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Strategy.Orders 0
09.02.2011 19:51:36 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Strategy.StopOrders 0
09.02.2011 19:51:36 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Strategy.Orders active 0
09.02.2011 19:51:36 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Strategy.StopOrders active 0
09.02.2011 19:51:36 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Trader.Orders 4
09.02.2011 19:51:36 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Trader.StopOrders 4
09.02.2011 19:51:36 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] ПОСЛЕ отмены приказов
09.02.2011 19:51:36 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Strategy.Orders 0
09.02.2011 19:51:36 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Strategy.StopOrders 0
09.02.2011 19:51:36 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Strategy.Orders active 0
09.02.2011 19:51:37 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Strategy.StopOrders active 0
09.02.2011 19:51:37 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Trader.Orders 4
09.02.2011 19:51:37 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Trader.StopOrders 4
09.02.2011 19:51:37 [OpenWealth.StockSharp.SmartCOM.<Smart_NewOrders>b__18] RTS-3.11 -1 Conditional
09.02.2011 19:51:37 [OpenWealth.HeadRealTradeStockSharp.OnOrderChanged] Ордер изменен. Состояние: Active статус: ReceiveByServer время снятия: бумага: RTS-3.11 b/s: Sell средняя цена: 0 тип: Conditional
09.02.2011 19:51:37 [OpenWealth.StockSharp.SmartCOM.<Smart_NewOrders>b__18] RTS-3.11 +1 Conditional
09.02.2011 19:51:37 [OpenWealth.HeadRealTradeStockSharp.OnOrderChanged] Ордер изменен. Состояние: Active статус: ReceiveByServer время снятия: бумага: RTS-3.11 b/s: Buy средняя цена: 0 тип: Conditional
09.02.2011 19:51:47 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] ПОСЛЕ регистрации новых приказов
09.02.2011 19:51:47 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Strategy.Orders 0
09.02.2011 19:51:47 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Strategy.StopOrders 2
09.02.2011 19:51:47 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Strategy.Orders active 0
09.02.2011 19:51:47 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Strategy.StopOrders active 2
09.02.2011 19:51:47 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Trader.Orders 6
09.02.2011 19:51:47 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Trader.StopOrders 6
Т.е. 2е ошибки:
- ордера не всегда добавляются в список ордеров стратегии (чаще не добавляются)
- в одном случае стоп ордер добавляется в Orders и StopOrders, в другом только в StopOrders
Что я делаю не так?
Kommentare (34)
Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen
ITrader.Orders возвращает и обычные заявки, и стоп заявки. В отличие от Strategy.Orders, где только обычные заявки. Плюс СмартКом асинхронен. Тоесть заявки добавляются только тогда, когда они успешно регистрируются.
В свете этого проблема прояснилась?
Немного прояснилась. Значит главная проблема в следующем: больше чем в половине случаев заявки регистрируются в реале но не регистрируются в SmartTrade.
Я думаю, это может происходить из-за того, что StartTrade регистрирует заявку только после OrderSucceeded и затем UpdateOrder. Если событие UpdateOrder приходит раньше, чем OrderSucceeded (в SmartCOM это происходит в половине случаев) - заявка не появляется в Startegy.StopOrders.
И еще такой вопрос ради любопытства. Зачем такая разница? Что в Trader.Orders одно, а в Startegy.Orders другое.
Это Вы проверили через SmartComWrapper? Вообще я уже сталкивался сам с подобным, поэтому такая ситуация должна разруливаться.
Исторически сложилось. Сейчас уже проблемно менять.
сейчас проверю через врапер, но факт остается фактом. Приходит событие NewOrders и не приходят UpdateOrders - заявка регистрируется только в Trader.StopOrders, но не в Startegy.StopOrders. И это происходит часто.
ITrader.NewOrders? Тоесть заявка получает номер от Смарта? А ITrader.NewStopOrders?
Выставлено 6 заявок. В ITrader.Orders и ITrader.StopOrders пришли все 6. В Strategy.StopOrders только 2. Хотя все зарегистрированы одинаково через стратегию.
А. стоп. Вы про события? Я раньше думал, что Orders и StopOrders нигде не пересекаются, поэтому лил обе: this.Trader.NewOrders += Smart_NewOrders; this.Trader.NewStopOrders += Smart_NewOrders;
Приходит только одно из них. А должны приходить оба?
Вообще да. В первом приходит для всех заявок. Во втором, только для обычных... А как Вы создаете стоп заявку?
Так, код явно не тривиален. А вот когда приходят только ITrader.NewOrders Вы уверены, что это стоп заявки? Плюс, отключит SmartTrader.AutoSave.
Я не говорил, что приходят только ITrader.NewOrders. Как видно из последнего теста как раз наоборот, они и не приходят. Приходили только ITrader.NewStopOrders, хотя регистрация идет в оба списка.
Так, я видимо сам ошибку. Посмотрел в документацию, ITrader.NewOrders для стоп заявок не должен вызываться. Так что это правильно. Термин "в оба списка" мне не совсем понятен.
Имел ввиду эти: ITrader.Orders и ITrader.StopOrders.
Про основную ошибку, что трейды не добавляются в strategy.NewStopOrders посмотрите? Я могу еще как-нибудь помочь?
Да, посмотрю, конечно. Только нужно все четко выяснить. Проблема в стоп заявках и только? Обычные работают номрмально? ITrader.NewStopOrders вызывается? Strategy.NewStopOrders не вызывается? SmartTrader.AutoSave = false?
Вы писали до этого что работаете с ITrader.Orders и ITrader.StopOrders, поэтому вполне мог подумать, что и с обычными глючит. Можете еще показать код, как Вы регистрируете стратегию?
Это стоп заявки, через веб интрефейс на них смотрю - у них все в порядке.
Проверил через врапер. Я подписан на события: ITrader.NewOrders += Smart_NewOrders; strategy.NewOrder += OnNewOrder; strategy.NewStopOrder += OnNewOrder; strategy.OrderChanged += OnOrderChanged; strategy.StopOrderChanged += OnOrderChanged;
После выполнения:
Видно, что для события sell врапер orderChanged метод пришел раньше, чем NewOrder. Но это только предположение. Может быть это совпадение.
Я так понимаю, StrategyAdapter - это наследник от Strategy? А список заявок вы смотрите в sAdapter или в переданном strategy?
Все смотрю и заявки исполняю из StrategyAdapter sAdapter (производный от TimeFrameStrategy). Из WealthScript strategy берется только инфа о приказах на исполнение.
Багу(-и) подтверждаю. Фикс будет в 3.0.2.
Кстати, если есть соображения, то готов обсудить. Суть проблемы как раз та, которую Вы писали - UpdateOrder приходит раньше OrderSucceeded. Из-за этого создается новый объект Order, не тот, который был зарегистрирован в Strategy. Соответственно, событие ITrader вызывается, но сама заявку в стратегию не попадает.
Все было бы ничего, но в UpdateOrder нет параметра, который передается пользователем при регистрации (он есть только у OrderSucceeded).
Да, там коряво, конечно, получается. При UpdateOrder пусть создается новый объект с orderID, который приходит из SmartCOM, потом при OrderSucceeded можно проверить, есть уже такой orderID или нет. Если нет - значит Update еще не приходил. Если есть - скрещиваем ордер из стратегии с ордером из UpdateOrder. По-моему больше никак.
Вот это в C# работать не будет. У вас ссылка в коде на один объект, а реально будет создан другой.
Ну я же условно говоря.. В SmartServer_OrderSucceeded приходят cookie (т.е. вы знаете из какой этот ордер стратегии) и system_order_id (по нему вы знаете, приходил ли UpdateOrder, и если приходил, то какой). Т.е. вся нужная информация есть. В один из ордеров сливаем всю инфу, другой удаляем.
Михаил, использую 3.0.3, где эта проблема должна быть исправлена. Но трейды до сих пор не всегда регистрируеются.
Вот сегодня. Strategy.NewMyTrades НЕ пришел.
28.02.2011 14:34:49 [OpenWealth.StockSharp.SmartCOM.b__1] Wrapper order changed: BPxxx-RF-01 RTS-3.11_FT StOrder_State_Pending StOrder_Action_Sell StOrder_Type_Market True 0 1 0 1 28.02.2011 10:34:46 562337947 0 1534632
28.02.2011 14:34:49 [OpenWealth.StockSharp.SmartCOM.b__0] Wrapper new order: 49696158 562337947
28.02.2011 14:34:50 [OpenWealth.StockSharp.SmartCOM.b__1] Wrapper order changed: BPxxx-RF-01 RTS-3.11_FT StOrder_State_Pending StOrder_Action_Sell StOrder_Type_Market True 0 1 0 1 28.02.2011 10:34:46 562337947 0 1534632
28.02.2011 14:34:50 [OpenWealth.StockSharp.SmartCOM.b__1] Wrapper order changed: BPxxx-RF-01 RTS-3.11_FT StOrder_State_Open StOrder_Action_Sell StOrder_Type_Market True 0 1 0 1 28.02.2011 10:34:46 562337947 3266781688 1534632
28.02.2011 14:34:50 [OpenWealth.StockSharp.SmartCOM.<Smart_NewOrders>b__21] RTS-3.11 -10 Market
28.02.2011 14:34:50 [OpenWealth.StockSharp.SmartCOM.b__1] Wrapper order changed: BPxxx-RF-01 RTS-3.11_FT StOrder_State_Filled StOrder_Action_Sell StOrder_Type_Market True 185605 1 0 0 28.02.2011 10:34:46 562337947 3266781688 1534632
28.02.2011 14:34:50 [OpenWealth.StockSharp.SmartCOM.<Smart_OrdersChanged>b__25] RTS-3.11 -1 0 Market BP5758-RF-01 Done Done отстаток: 0 время снятия: 28.02.2011 10:34:46
28.02.2011 14:34:50 [OpenWealth.StockSharp.SmartCOM.<Smart_NewMyTrades>b__1f] 277321446 RTS-3.11 -1193275
28.02.2011 14:34:50 [OpenWealth.StockSharp.SmartCOM.b__1] Wrapper order changed: BPxxx-RF-01 RTS-3.11_FT StOrder_State_Open StOrder_Action_Sell StOrder_Type_Market True 0 1 0 1 28.02.2011 10:34:46 562337947 3266781688 1534632
28.02.2011 14:34:51 [OpenWealth.StockSharp.SmartCOM.<Smart_OrdersChanged>b__25] RTS-3.11 -1 0 Market BP5758-RF-01 Active Done отстаток: 1 время снятия: 28.02.2011 10:34:46
28.02.2011 14:34:51 [OpenWealth.StockSharp.SmartCOM.b__1] Wrapper order changed: BPxxx-RF-01 RTS-3.11_FT StOrder_State_Filled StOrder_Action_Sell StOrder_Type_Market True 185605 1 0 0 28.02.2011 10:34:46 562337947 3266781688 1534632
28.02.2011 14:34:51 [OpenWealth.StockSharp.SmartCOM.<Smart_OrdersChanged>b__25] RTS-3.11 -1*0 Market BPxxx-RF-01 Done Done отстаток: 0 время снятия: 28.02.2011 10:34:46
Вывод был с помощью этих функций, т.е. все по порядку как приходит, так и выводится:
SmartCOM_2_0_manual: void UpdateOrder(string portfolio, string symbol, StClientLib.StOrder_State state, StClientLib.StOrder_Action action, StClientLib.StOrder_Type type, StClientLib.StOrder_Validity validity, double price, double amount, double stop, double filled, System.DateTime datetime, string orderid, string orderno, int status_mask)
По логу увидел следующее. Почему то Смарт сначала присылает что заявка matched, а затем что она опять открыта. Видимо надо сделать проверку. Можете сказать, как часто так делает Смарт?
Еще, не понял, что такое <Smart_NewOrders>b__21. Это ITrader.NewOrders? А Вы делаете лог из Strategy событий? Плюс не плохо было бы в этих событиях так же выводить Order.Id
Не понятно, почему время снятие инициализировано. Вы его из Order.CancelTime берете?
И еще не забудьте номер транзакции, Order.TransactionId + сразу выведите его в лог после метода RegisterOrder... Пока по логу я исправил несколько косяков. Но в целом лог говорит о том, что заявки должны были прийти в стратегию.
Возможно последняя "не регистрация" произошла по моей вине. Моя стратегия останавливается после регистрации приказа, но иногда ДО того, как придет событие NewMyTrades. Это может быть причиной не прихода события NewMyTrades? Если да, то похоже вопрос закрыт.
Лог трейда, который не зарегистрировался:
Все равно должно. А точно после 18:03:27 событие не вызывалось?
Точно. Ломалось 2 раза, первый раз после 2 сделок, второй раз после 10. 5 минут ждал. Потом переделал, чтобы стратегия останавливалась только после прихода Strategy.NewMyTrades и 100 сделок прошло без проблем. Т.е. пока не могу повторить.
Ломалась стратегия вида:
Могу поповторять, если надо.