← Atrás

[BLOCKER] [S#3.0beta] трейды не регистрируются под статегией

Есть стратегия унаследованная от 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е ошибки:

  1. ордера не всегда добавляются в список ордеров стратегии (чаще не добавляются)
  2. в одном случае стоп ордер добавляется в Orders и StopOrders, в другом только в StopOrders

Что я делаю не так?

¿Le resultó útil este tema?

Compartir tema

Comentarios (34)

Iniciar sesión o Crear cuenta, Inicie sesión o regístrese para dejar un comentario

Mikhail Sukhov
Mikhail Sukhov

ITrader.Orders возвращает и обычные заявки, и стоп заявки. В отличие от Strategy.Orders, где только обычные заявки. Плюс СмартКом асинхронен. Тоесть заявки добавляются только тогда, когда они успешно регистрируются.

В свете этого проблема прояснилась?

Greene-nsk
Greene-nsk Autor

Немного прояснилась. Значит главная проблема в следующем: больше чем в половине случаев заявки регистрируются в реале но не регистрируются в SmartTrade.

Я думаю, это может происходить из-за того, что StartTrade регистрирует заявку только после OrderSucceeded и затем UpdateOrder. Если событие UpdateOrder приходит раньше, чем OrderSucceeded (в SmartCOM это происходит в половине случаев) - заявка не появляется в Startegy.StopOrders.

И еще такой вопрос ради любопытства. Зачем такая разница? Что в Trader.Orders одно, а в Startegy.Orders другое.

Mikhail Sukhov
Mikhail Sukhov

Greene-nsk: Немного прояснилась. Значит главная проблема в следующем: больше чем в половине случаев заявки регистрируются в реале но не регистрируются в SmartTrade.

Я думаю, это может происходить из-за того, что StartTrade регистрирует заявку только после OrderSucceeded и затем UpdateOrder. Если событие UpdateOrder приходит раньше, чем OrderSucceeded (в SmartCOM это происходит в половине случаев) - заявка не появляется в Startegy.StopOrders.

Это Вы проверили через SmartComWrapper? Вообще я уже сталкивался сам с подобным, поэтому такая ситуация должна разруливаться.

Greene-nsk: И еще такой вопрос ради любопытства. Зачем такая разница? Что в Trader.Orders одно, а в Startegy.Orders другое.

Исторически сложилось. Сейчас уже проблемно менять.

Greene-nsk
Greene-nsk Autor

сейчас проверю через врапер, но факт остается фактом. Приходит событие NewOrders и не приходят UpdateOrders - заявка регистрируется только в Trader.StopOrders, но не в Startegy.StopOrders. И это происходит часто.

Mikhail Sukhov
Mikhail Sukhov

Greene-nsk: сейчас проверю через врапер, но факт остается фактом. Приходит событие NewOrders и не приходят UpdateOrders - заявка регистрируется только в Trader.StopOrders, но не в Startegy.StopOrders. И это происходит часто.

ITrader.NewOrders? Тоесть заявка получает номер от Смарта? А ITrader.NewStopOrders?

Greene-nsk
Greene-nsk Autor

Выставлено 6 заявок. В ITrader.Orders и ITrader.StopOrders пришли все 6. В 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

Greene-nsk
Greene-nsk Autor

А. стоп. Вы про события? Я раньше думал, что Orders и StopOrders нигде не пересекаются, поэтому лил обе: this.Trader.NewOrders += Smart_NewOrders; this.Trader.NewStopOrders += Smart_NewOrders;

Приходит только одно из них. А должны приходить оба?

Mikhail Sukhov
Mikhail Sukhov

Greene-nsk: А. стоп. Вы про события? Я раньше думал, что Orders и StopOrders нигде не пересекаются, поэтому лил обе: this.Trader.NewOrders += Smart_NewOrders; this.Trader.NewStopOrders += Smart_NewOrders;

Приходит только одно из них. А должны приходить оба?

Вообще да. В первом приходит для всех заявок. Во втором, только для обычных... А как Вы создаете стоп заявку?

Greene-nsk
Greene-nsk Autor

base.RegisterOrder(a.ToOrder());

        static public Order ToOrder(this Alert a)
        {
            OrderDirections orderDirection;
            string comment = "";
            switch (a.AlertType)
            {
                case TradeType.Buy:
                    orderDirection = OrderDirections.Buy;
                    break;
                case TradeType.Cover:
                    orderDirection = OrderDirections.Buy;
                    comment = a.Position.PositionID.ToString();
                    break;
                case TradeType.Short:
                    orderDirection = OrderDirections.Sell;
                    break;
                case TradeType.Sell:
                    orderDirection = OrderDirections.Sell;
                    comment = a.Position.PositionID.ToString();
                    break;
                default:
                    Log.OutErrorFatal("Такое направление не поддерживается: " + a.AlertType);
                    return null;
            }

            OrderTypes orderType;
            double price = 0.0;
            StopCondition stopCond = null;

            switch (a.OrderType)
            {
                case OrderType.Limit:
                    orderType = OrderTypes.Limit;
                    price = a.Price;
                    break;
                case OrderType.Market:
                    orderType = OrderTypes.Market;
                    break;
                case OrderType.Stop:
                    orderType = OrderTypes.Conditional;
                    price = a.Bars.SymbolInfo.WorseOnTicks(
                        a.Price, 
                        (orderDirection == OrderDirections.Buy) ? PositionType.Long : PositionType.Short,
                        2);
                    stopCond = new SmartStopCondition
                    {
                        IsOneDay = false,
                        StopPrice = a.Price,
                    };
                    break;
                default:
                    Log.OutErrorFatal("Такой тип не поддерживается: " + a.OrderType);
                    return null;
            }

            return new Order
            {
                Type = orderType,
                Portfolio = Const.SmartInstance.Portfolio(Const.Params.PortfolioName),
                Volume = a.Shares,
                Price = price,
                Security = Const.SmartInstance.Security(a.Symbol),
                Direction = orderDirection,
                StopCondition = stopCond,
                Comment = comment,
            };

Mikhail Sukhov
Mikhail Sukhov

Так, код явно не тривиален. А вот когда приходят только ITrader.NewOrders Вы уверены, что это стоп заявки? Плюс, отключит SmartTrader.AutoSave.

Greene-nsk
Greene-nsk Autor

Mikhail Sukhov: Так, код явно не тривиален. А вот когда приходят только ITrader.NewOrders Вы уверены, что это стоп заявки? Плюс, отключит SmartTrader.AutoSave.

Я не говорил, что приходят только ITrader.NewOrders. Как видно из последнего теста как раз наоборот, они и не приходят. Приходили только ITrader.NewStopOrders, хотя регистрация идет в оба списка.

Mikhail Sukhov
Mikhail Sukhov

Greene-nsk:

Mikhail Sukhov: Так, код явно не тривиален. А вот когда приходят только ITrader.NewOrders Вы уверены, что это стоп заявки? Плюс, отключит SmartTrader.AutoSave.

Я не говорил, что приходят только ITrader.NewOrders. Как видно из последнего теста как раз наоборот, они и не приходят. Приходили только ITrader.NewStopOrders, хотя регистрация идет в оба списка.

Так, я видимо сам ошибку. Посмотрел в документацию, ITrader.NewOrders для стоп заявок не должен вызываться. Так что это правильно. Термин "в оба списка" мне не совсем понятен.

Greene-nsk
Greene-nsk Autor

Mikhail Sukhov: Так, я видимо сам ошибку. Посмотрел в документацию, ITrader.NewOrders для стоп заявок не должен вызываться. Так что это правильно. Термин "в оба списка" мне не совсем понятен.

Имел ввиду эти: ITrader.Orders и ITrader.StopOrders.

Про основную ошибку, что трейды не добавляются в strategy.NewStopOrders посмотрите? Я могу еще как-нибудь помочь?

Mikhail Sukhov
Mikhail Sukhov

Greene-nsk:

Mikhail Sukhov: Так, я видимо сам ошибку. Посмотрел в документацию, ITrader.NewOrders для стоп заявок не должен вызываться. Так что это правильно. Термин "в оба списка" мне не совсем понятен.

Имел ввиду эти: ITrader.Orders и ITrader.StopOrders.

Про основную ошибку, что трейды не добавляются в strategy.NewStopOrders посмотрите? Я могу еще как-нибудь помочь?

Да, посмотрю, конечно. Только нужно все четко выяснить. Проблема в стоп заявках и только? Обычные работают номрмально? ITrader.NewStopOrders вызывается? Strategy.NewStopOrders не вызывается? SmartTrader.AutoSave = false?

Greene-nsk
Greene-nsk Autor

Mikhail Sukhov:

Greene-nsk:

Mikhail Sukhov: Так, я видимо сам ошибку. Посмотрел в документацию, ITrader.NewOrders для стоп заявок не должен вызываться. Так что это правильно. Термин "в оба списка" мне не совсем понятен.

Имел ввиду эти: ITrader.Orders и ITrader.StopOrders.

Про основную ошибку, что трейды не добавляются в strategy.NewStopOrders посмотрите? Я могу еще как-нибудь помочь?

Да, посмотрю, конечно. Только нужно все четко выяснить. Проблема в стоп заявках и только? Обычные работают номрмально? ITrader.NewStopOrders вызывается? Strategy.NewStopOrders не вызывается? SmartTrader.AutoSave = false?

  1. другие заявки не смотрел. использую только стоп пока.
  2. ITrader.NewStopOrders вызывается
  3. когда проблема случается, Strategy.NewStopOrders не вызывается
  4. Trader.IsAutoSaveOrders = false;
Mikhail Sukhov
Mikhail Sukhov

Greene-nsk:

  1. другие заявки не смотрел. использую только стоп пока.
  2. ITrader.NewStopOrders вызывается
  3. когда проблема случается, Strategy.NewStopOrders не вызывается
  4. Trader.IsAutoSaveOrders = false;

Вы писали до этого что работаете с ITrader.Orders и ITrader.StopOrders, поэтому вполне мог подумать, что и с обычными глючит. Можете еще показать код, как Вы регистрируете стратегию?

Greene-nsk
Greene-nsk Autor

Это стоп заявки, через веб интрефейс на них смотрю - у них все в порядке.

Проверил через врапер. Я подписан на события: ITrader.NewOrders += Smart_NewOrders; strategy.NewOrder += OnNewOrder; strategy.NewStopOrder += OnNewOrder; strategy.OrderChanged += OnOrderChanged; strategy.StopOrderChanged += OnOrderChanged;


10.02.2011 20:01:54 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] ПОСЛЕ отмены приказов
10.02.2011 20:01:54 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Strategy.Orders 0
10.02.2011 20:01:54 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Strategy.StopOrders 0
10.02.2011 20:01:54 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Strategy.Orders active 0
10.02.2011 20:01:54 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Strategy.StopOrders active 0
10.02.2011 20:01:54 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Trader.Orders 0
10.02.2011 20:01:54 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Trader.StopOrders 0
10.02.2011 20:01:55 [OpenWealth.StockSharp.SmartCOM.<Init>b__0] Wrapper new order: 71839626 544268683
10.02.2011 20:01:56 [OpenWealth.StockSharp.SmartCOM.<Init>b__1] Wrapper order changed: BP5758-RF-01 RTS-3.11_FT StOrder_State_Pending StOrder_Action_Buy StOrder_Type_StopLimit False
10.02.2011 20:01:56 [OpenWealth.StockSharp.SmartCOM.<Init>b__1] Wrapper order changed: BP5758-RF-01 RTS-3.11_FT StOrder_State_Pending StOrder_Action_Buy StOrder_Type_StopLimit False
10.02.2011 20:01:56 [OpenWealth.HeadRealTradeStockSharp.OnOrderChanged] Ордер изменен. Состояние: Active статус: ReceiveByServer время снятия:  бумага: RTS-3.11 b/s: Buy средняя цена: 0 тип: Conditional
10.02.2011 20:01:56 [OpenWealth.StockSharp.SmartCOM.<Init>b__1] Wrapper order changed: BP5758-RF-01 RTS-3.11_FT StOrder_State_Pending StOrder_Action_Sell StOrder_Type_StopLimit False
10.02.2011 20:01:56 [OpenWealth.StockSharp.SmartCOM.<Init>b__0] Wrapper new order: 71839625 544268689
10.02.2011 20:01:56 [OpenWealth.StockSharp.SmartCOM.<Init>b__1] Wrapper order changed: BP5758-RF-01 RTS-3.11_FT StOrder_State_Pending StOrder_Action_Sell StOrder_Type_StopLimit False
10.02.2011 20:02:04 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] ПОСЛЕ регистрации новых приказов
10.02.2011 20:02:05 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Strategy.Orders 0
10.02.2011 20:02:05 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Strategy.StopOrders 1
10.02.2011 20:02:05 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Strategy.Orders active 0
10.02.2011 20:02:05 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Strategy.StopOrders active 1
10.02.2011 20:02:05 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Trader.Orders 2
10.02.2011 20:02:05 [OpenWealth.StockSharp.StrategyAdapter.OnProcess] Trader.StopOrders 2

После выполнения:

  1. в itinvest веб интрефейсе обе заявки, которые и должны быть
  2. в Trader.Orders и Trader.StopOrders 2 стоп заявки sell и buy какие и должны быть 3!!! Пришло только одно событие strategy.StopOrderChanged для стоп ордера buy. для sell не пришло. 4!!! Не пришло ни одного события ITrader.NewOrders

Видно, что для события sell врапер orderChanged метод пришел раньше, чем NewOrder. Но это только предположение. Может быть это совпадение.

Greene-nsk
Greene-nsk Autor


    public class StrategyAdapter : TimeFrameStrategy
    {
        ...
    }
                // создаем менеджер стратегий
                StrategyManager = new RealTimeStrategyManager(Const.SmartInstance.Trader);
                ...
                foreach (WealthScript strategy in StrategiesInfo.Strategies)
                {
                    StrategyAdapter sAdapter = new StrategyAdapter(strategy);
                    ...
                    Log.Out("Регистрируем стратегию: " + sAdapter.StrategyInstance.strategyID);
                    StrategyManager.Register(sAdapter, portfolio, security);
                    ...
                    sAdapter.Start();
                }


Mikhail Sukhov
Mikhail Sukhov

Greene-nsk: ...

Я так понимаю, StrategyAdapter - это наследник от Strategy? А список заявок вы смотрите в sAdapter или в переданном strategy?

Greene-nsk
Greene-nsk Autor

Mikhail Sukhov:

Greene-nsk: ...

Я так понимаю, StrategyAdapter - это наследник от Strategy? А список заявок вы смотрите в sAdapter или в переданном strategy?

Все смотрю и заявки исполняю из StrategyAdapter sAdapter (производный от TimeFrameStrategy). Из WealthScript strategy берется только инфа о приказах на исполнение.

Mikhail Sukhov
Mikhail Sukhov

Greene-nsk:

Mikhail Sukhov:

Greene-nsk: ...

Я так понимаю, StrategyAdapter - это наследник от Strategy? А список заявок вы смотрите в sAdapter или в переданном strategy?

Все смотрю и заявки исполняю из StrategyAdapter sAdapter (производный от TimeFrameStrategy). Из WealthScript strategy берется только инфа о приказах на исполнение.

Багу(-и) подтверждаю. Фикс будет в 3.0.2.

Mikhail Sukhov
Mikhail Sukhov

Mikhail Sukhov: Багу(-и) подтверждаю. Фикс будет в 3.0.2.

Кстати, если есть соображения, то готов обсудить. Суть проблемы как раз та, которую Вы писали - UpdateOrder приходит раньше OrderSucceeded. Из-за этого создается новый объект Order, не тот, который был зарегистрирован в Strategy. Соответственно, событие ITrader вызывается, но сама заявку в стратегию не попадает.

Все было бы ничего, но в UpdateOrder нет параметра, который передается пользователем при регистрации (он есть только у OrderSucceeded).

Greene-nsk
Greene-nsk Autor

Mikhail Sukhov:

Mikhail Sukhov: Багу(-и) подтверждаю. Фикс будет в 3.0.2.

Кстати, если есть соображения, то готов обсудить. Суть проблемы как раз та, которую Вы писали - UpdateOrder приходит раньше OrderSucceeded. Из-за этого создается новый объект Order, не тот, который был зарегистрирован в Strategy. Соответственно, событие ITrader вызывается, но сама заявку в стратегию не попадает.

Все было бы ничего, но в UpdateOrder нет параметра, который передается пользователем при регистрации (он есть только у OrderSucceeded).

Да, там коряво, конечно, получается. При UpdateOrder пусть создается новый объект с orderID, который приходит из SmartCOM, потом при OrderSucceeded можно проверить, есть уже такой orderID или нет. Если нет - значит Update еще не приходил. Если есть - скрещиваем ордер из стратегии с ордером из UpdateOrder. По-моему больше никак.

Mikhail Sukhov
Mikhail Sukhov

Greene-nsk: Да, там коряво, конечно, получается. При UpdateOrder пусть создается новый объект с orderID, который приходит из SmartCOM, потом при OrderSucceeded можно проверить, есть уже такой orderID или нет. Если нет - значит Update еще не приходил. Если есть - скрещиваем ордер из стратегии с ордером из UpdateOrder. По-моему больше никак.

Вот это в C# работать не будет. У вас ссылка в коде на один объект, а реально будет создан другой.

Greene-nsk
Greene-nsk Autor

Mikhail Sukhov:

Greene-nsk: Да, там коряво, конечно, получается. При UpdateOrder пусть создается новый объект с orderID, который приходит из SmartCOM, потом при OrderSucceeded можно проверить, есть уже такой orderID или нет. Если нет - значит Update еще не приходил. Если есть - скрещиваем ордер из стратегии с ордером из UpdateOrder. По-моему больше никак.

Вот это в C# работать не будет. У вас ссылка в коде на один объект, а реально будет создан другой.

Ну я же условно говоря.. В SmartServer_OrderSucceeded приходят cookie (т.е. вы знаете из какой этот ордер стратегии) и system_order_id (по нему вы знаете, приходил ли UpdateOrder, и если приходил, то какой). Т.е. вся нужная информация есть. В один из ордеров сливаем всю инфу, другой удаляем.

Greene-nsk
Greene-nsk Autor

Михаил, использую 3.0.3, где эта проблема должна быть исправлена. Но трейды до сих пор не всегда регистрируеются.

Вот сегодня. Strategy.NewMyTrades НЕ пришел.


28.02.2011 14:34:49 [OpenWealth.StockSharp.SmartCOM.<Init>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.<Init>b__0] Wrapper new order: 49696158 562337947
28.02.2011 14:34:50 [OpenWealth.StockSharp.SmartCOM.<Init>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.<Init>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 -1*0 Market
28.02.2011 14:34:50 [OpenWealth.StockSharp.SmartCOM.<Init>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 -1*193275
28.02.2011 14:34:50 [OpenWealth.StockSharp.SmartCOM.<Init>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.<Init>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

Mikhail Sukhov
Mikhail Sukhov

Greene-nsk: Михаил, использую 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 -10 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 -10 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


Я глаза сломал, пока пытался понять, что к чему.🙂 А можно чуть нагляднее лог сделать? Что нужно. Номер заявки, номер транзакции, номер смарта у заявки (+ объяснить, что в каком порядке выводиться).
Greene-nsk
Greene-nsk Autor

Mikhail Sukhov: Я глаза сломал, пока пытался понять, что к чему.🙂 А можно чуть нагляднее лог сделать? Что нужно. Номер заявки, номер транзакции, номер смарта у заявки (+ объяснить, что в каком порядке выводиться).

Вывод был с помощью этих функций, т.е. все по порядку как приходит, так и выводится:


 (this.Trader as SmartTrader).Wrapper.NewOrder += ((i, s) =>
 {
     Log.Out("Wrapper new order: " + i + " " + s);
 });

 (this.Trader as SmartTrader).Wrapper.OrderChanged += ((s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14) =>
 {
     Log.Out("Wrapper order changed: " + s1 + " " + s2 + " " + s3 + " " + s4 + " " + s5 + " " + s6 + " " + s7 + " " + s8 + " " + s9 + " " + s10 + " " + s11 + " " + s12 + " " + s13 + " " + s14);
 });

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)

Mikhail Sukhov
Mikhail Sukhov

По логу увидел следующее. Почему то Смарт сначала присылает что заявка matched, а затем что она опять открыта. Видимо надо сделать проверку. Можете сказать, как часто так делает Смарт?

Еще, не понял, что такое <Smart_NewOrders>b__21. Это ITrader.NewOrders? А Вы делаете лог из Strategy событий? Плюс не плохо было бы в этих событиях так же выводить Order.Id

Не понятно, почему время снятие инициализировано. Вы его из Order.CancelTime берете?

Greene-nsk
Greene-nsk Autor

Mikhail Sukhov: По логу увидел следующее. Почему то Смарт сначала присылает что заявка matched, а затем что она опять открыта. Видимо надо сделать проверку. Можете сказать, как часто так делает Смарт? Не могу сказать.

Mikhail Sukhov: Еще, не понял, что такое <Smart_NewOrders>b__21. Это ITrader.NewOrders? Да. Это оно.

Mikhail Sukhov: А Вы делаете лог из Strategy событий? Плюс не плохо было бы в этих событиях так же выводить Order.Id Да, вывожу (уверен процентов на 80% - тот кусок кода уже переделал, лог удален). Лог стратегии в этом куске "не задет". Order.Id добавил. В следующий раз будет.

Mikhail Sukhov: Не понятно, почему время снятие инициализировано. Вы его из Order.CancelTime берете? Да, это CancelTime. Тоже непонятно. Вывод ITrader.OrdersChanged:


orders.ForEach(o => Log.Out(o.ToStringLong()));

        static public string ToStringLong(this Order o)
        {
            string sign = (o.Direction == OrderDirections.Buy) ? "+" : "-";
            return o.Security.Name + " " + sign + o.Volume + "*" + o.Price + " " + o.Type + " " +
                o.Portfolio.Name + " " + o.State + " " + o.Status + " остаток: " + o.Balance + " время снятия: " + o.CancelTime;
        }

Mikhail Sukhov
Mikhail Sukhov

Greene-nsk: Да, вывожу (уверен процентов на 80% - тот кусок кода уже переделал, лог удален). Лог стратегии в этом куске "не задет". Order.Id добавил. В следующий раз будет.

И еще не забудьте номер транзакции, Order.TransactionId + сразу выведите его в лог после метода RegisterOrder... Пока по логу я исправил несколько косяков. Но в целом лог говорит о том, что заявки должны были прийти в стратегию.

Greene-nsk
Greene-nsk Autor

Возможно последняя "не регистрация" произошла по моей вине. Моя стратегия останавливается после регистрации приказа, но иногда ДО того, как придет событие NewMyTrades. Это может быть причиной не прихода события NewMyTrades? Если да, то похоже вопрос закрыт.

Лог трейда, который не зарегистрировался:


02.03.2011 18:03:26 [OpenWealth.StockSharp.StrategySimpleQuoting.OnRunning] Регистрируем приказ: RTS-3.11 -1*0 Market
02.03.2011 18:03:26 [OpenWealth.StockSharp.StrategySimpleQuoting.OnRunning] Приказ сразу после RegisterOrder: RTS-3.11 -1*0 Market ST3276-RF-01 None  остаток: 1 ID: 0 transactionID: 64153703 время снятия:
02.03.2011 18:03:26 [OpenWealth.StockSharp.StrategyProcessOrder.OnLog] ЛОГ стратегии SSQ str: Стратегия запущена.
02.03.2011 18:03:26 [OpenWealth.StockSharp.TraderInitializator.<Init>b__1] Wrapper order changed: ST3276-RF-01 RTS-3.11_FT StOrder_State_Pending StOrder_Action_Sell StOrder_Type_Market True 0 1 0 1 02.03.2011 18:03:14 67124253 0 1
02.03.2011 18:03:26 [OpenWealth.StockSharp.TraderInitializator.<Init>b__0] Wrapper new order: 64153703 67124253
02.03.2011 18:03:26 [OpenWealth.StockSharp.TraderInitializator.<Init>b__1] Wrapper order changed: ST3276-RF-01 RTS-3.11_FT StOrder_State_Open StOrder_Action_Sell StOrder_Type_Market True 0 1 0 1 02.03.2011 18:03:14 67124253 367308489 2089884016
02.03.2011 18:03:26 [OpenWealth.StockSharp.TraderInitializator.<Terminal_NewOrders>b__19] RTS-3.11 -1*0 Market
02.03.2011 18:03:26 [OpenWealth.StockSharp.StrategyProcessOrder.OnNewOrder] Strategy.NewOrder: RTS-3.11 -1*0 Market ST3276-RF-01 Active Done остаток: 1 ID: 367308489 transactionID: 64153703 время снятия: 02.03.2011 18:03:14
02.03.2011 18:03:26 [OpenWealth.StockSharp.StrategyProcessOrder.OnLog] ЛОГ стратегии SSQ str: Стратегия останавливается.
02.03.2011 18:03:27 [OpenWealth.StockSharp.TraderInitializator.<Init>b__1] Wrapper order changed: ST3276-RF-01 RTS-3.11_FT StOrder_State_Filled StOrder_Action_Sell StOrder_Type_Market True 189390 1 0 0 02.03.2011 18:03:31 67124253 367308489 0
02.03.2011 18:03:27 [OpenWealth.StockSharp.TraderInitializator.<Terminal_OrdersChanged>b__1d] RTS-3.11 -1*0 Market ST3276-RF-01 Done Done остаток: 0 ID: 367308489 transactionID: 64153703 время снятия: 02.03.2011 18:03:14
02.03.2011 18:03:27 [OpenWealth.StockSharp.StrategyProcessOrder.OnLog] ЛОГ стратегии SSQ str: Стратегия остановлена.
02.03.2011 18:03:27 [OpenWealth.StockSharp.TraderInitializator.<Terminal_NewMyTrades>b__17] 12854674 RTS-3.11 -1*196280

Mikhail Sukhov
Mikhail Sukhov

Greene-nsk: Возможно последняя "не регистрация" произошла по моей вине. Моя стратегия останавливается после регистрации приказа, но иногда ДО того, как придет событие NewMyTrades. Это может быть причиной не прихода события NewMyTrades? Если да, то похоже вопрос закрыт.

Все равно должно. А точно после 18:03:27 событие не вызывалось?

Greene-nsk
Greene-nsk Autor

Mikhail Sukhov:

Greene-nsk: Возможно последняя "не регистрация" произошла по моей вине. Моя стратегия останавливается после регистрации приказа, но иногда ДО того, как придет событие NewMyTrades. Это может быть причиной не прихода события NewMyTrades? Если да, то похоже вопрос закрыт.

Все равно должно. А точно после 18:03:27 событие не вызывалось?

Точно. Ломалось 2 раза, первый раз после 2 сделок, второй раз после 10. 5 минут ждал. Потом переделал, чтобы стратегия останавливалась только после прихода Strategy.NewMyTrades и 100 сделок прошло без проблем. Т.е. пока не могу повторить.

Ломалась стратегия вида:


    class StrategySimpleQuoting : Strategy
    {
        private Order _Order;

        public StrategySimpleQuoting(Order order)
        {
            _Order = order;
            _Order.Price = 0.0;
            _Order.Type = OrderTypes.Market;
        }

        protected override void OnRunning()
        {
            OpenWealth.Log.Out("Регистрируем приказ: " + _Order.ToStringShort());
            base.RegisterOrder(_Order);
            OpenWealth.Log.Out("Приказ сразу после RegisterOrder: " + _Order.ToStringLong());
            base.OnRunning();
        }

        protected override StrategyProcessResults OnProcess()
        {
                return StrategyProcessResults.Stop;
        }
    }

Могу поповторять, если надо.