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


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


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

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

Теги:


Спасибо:


1 2 3  > >>
Mikhail Sukhov

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


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

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

Greene-nsk

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


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

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

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

Mikhail Sukhov

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


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

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


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

Greene-nsk Перейти

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


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

Greene-nsk

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


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

Mikhail Sukhov

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


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


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

Greene-nsk

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


Выставлено 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

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


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

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

Mikhail Sukhov

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


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

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


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

Greene-nsk

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


Код

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

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


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

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

loading
clippy