S# 4.1.18, не приходит OrderRegistered при тестировании в EmulationTrader
Добрый день!
Прошу помощи. У меня здесь даже две проблемы.
1. Просто не приходит OrderRegistered в стратегию:
Code
protected override void OnStarted()
{
// настраиваем получение данных,
this.Trader.MarketDepthsChanged += (depths) =>
{
depths.ForEach(depth =>
{
if (depth.Security.Equals(this.Security))
ProcessDepth(depth);
});
};
this.OrderRegistered += (order) =>
{
Chart_DrawOrder(order);
};
this.OrderRegisterFailed += (o) =>
{
this._Log.Error(this.Name, "Order registering failed: " + o.Error.ToString());
};
this.NewMyTrades += (trades) =>
{
trades.ForEach((t) => Chart_DrawTrade(t.Trade));
};
// workaround
this.Trader.NewOrders += (orders) =>
{
orders.ForEach((o) => Chart_DrawOrder(o));
};
base.OnStarted();
}
Здесь я получаю MarketDepthsChanged, где в обработчике ProcessDepth() делаю такую заявку:
Code
var order = this.CreateOrder(dir, depth.BestPair.MiddlePrice, 1); // (здесь я пробовал цену двигать и вверх, и вниз от MiddlePrice на много пунктов, но ничего не менялось)
this.RegisterOrder(order);
После чего я получаю только событие NewMyTrades, а OrderRegistered или OrderRegisterFailed не идут. :-\
Вместе с тем исправно приходят и другие события, если на них подписаться:
Code
strategy.PnLChanged += () =>
{
this.GuiAsync(() => chartCurveItems.Add(new EquityData { Time = strategy.GetMarketTime(), Value = strategy.PnL, }));
};
strategy.PositionChanged += () =>
{
this.GuiAsync(() => chartPosItems.Add(new EquityData { Time = strategy.GetMarketTime(), Value = strategy.Position }));
};
В логах видно, что позиция изменяется (все заявки Sell/Buy проходят одинаковый жизненный цикл):
Code
...
2013.09.10 17:49:54 (Info) [PriceTimeAverage] 22.08.2013 10:00:28 Регистрация новой Limit (0x24CBD2A) заявки на Buy с ценой 129650 и объемом 1.
2013.09.10 17:49:54 (Info) [PriceTimeAverage] 22.08.2013 10:00:28 Правило 'Полное исполнение 64190751/0 (0x1934CBE)'. Подписалось на события.
2013.09.10 17:49:54 (Info) [PriceTimeAverage] 22.08.2013 10:00:28 Правило 'Отмена заявки 64190751/0 (0x1CC1659)'. Подписалось на события.
2013.09.10 17:49:54 (Info) [PriceTimeAverage] 22.08.2013 10:00:28 Правило 'Ошибка регистрации заявки 64190751/0 (0x270F9F2)'. Подписалось на события.
2013.09.10 17:49:54 (Info) [PriceTimeAverage] 22.08.2013 10:00:28 Новая Buy сделка 1 по цене 129560 на 1 заявки 64190751.
2013.09.10 17:49:54 (Info) [PriceTimeAverage] 22.08.2013 10:00:28 Новая позиция: test account-RIU3@FORTS=1.
2013.09.10 17:49:54 (Info) [PriceTimeAverage] 22.08.2013 10:00:28 Правило 'Отмена заявки 64190751/0 (0x1CC1659) OR Полное исполнение 64190751/0 (0x1934CBE) OR Ошибка регистрации заявки 64190751/0 (0x270F9F2)'. Активация.
2013.09.10 17:49:54 (Info) [PriceTimeAverage] 22.08.2013 10:00:28 Заявка 64190751 больше не активна.
2013.09.10 17:49:54 (Info) [PriceTimeAverage] 22.08.2013 10:00:28 Правило 'Отмена заявки 64190751/0 (0x1CC1659) OR Полное исполнение 64190751/0 (0x1934CBE) OR Ошибка регистрации заявки 64190751/0 (0x270F9F2)'. Удаляется.
2013.09.10 17:49:54 (Info) [PriceTimeAverage] 22.08.2013 10:00:28 Правило 'Отмена заявки 64190751/0 (0x1CC1659)'. Освободило ресурсы.
2013.09.10 17:49:54 (Info) [PriceTimeAverage] 22.08.2013 10:00:28 Правило 'Полное исполнение 64190751/0 (0x1934CBE)'. Освободило ресурсы.
2013.09.10 17:49:54 (Info) [PriceTimeAverage] 22.08.2013 10:00:28 Правило 'Ошибка регистрации заявки 64190751/0 (0x270F9F2)'. Освободило ресурсы.
2013.09.10 17:49:54 (Info) [PriceTimeAverage] 22.08.2013 10:00:28 Правило 'Отмена заявки 64190751/0 (0x1CC1659) OR Полное исполнение 64190751/0 (0x1934CBE) OR Ошибка регистрации заявки 64190751/0 (0x270F9F2)'. Освободило ресурсы.
2013.09.10 17:49:54 (Info) [PriceTimeAverage] 22.08.2013 10:00:28 Правило 'Отмена заявки 64190751/0 (0x1CC1659) OR Полное исполнение 64190751/0 (0x1934CBE) OR Ошибка регистрации заявки 64190751/0 (0x270F9F2)'. Удаление.
...
2. Если же заявки кидать из дочерней стратегии MarketQuotingStrategy, то постоянно приходит OrderRegisterFailed, где "Элемент с тем же ключом уже был добавлен.":
Code
22.08.2013 10:00:28 Заявка 0 (0x2BFF0FC) не была принята по причине System.ArgumentException: Элемент с тем же ключом уже был добавлен.
в System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)
в System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
в System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value)
в Ecng.Collections.SynchronizedDictionary`2.Add(TKey key, TValue value)
в StockSharp.Algo.Slippage.SlippageManager.ReRegistering(Order oldOrder, Order newOrder)
в StockSharp.Algo.Strategies.Strategy.ReRegisterSlippage(Order oldOrder, Order newOrder)
в StockSharp.Algo.Strategies.Strategy.#=qbIRUWiEU8CQqWDdjRkfgkvfps6OAx7vD2Kqx82Rxd2I=(Order #=qKmmNADXEA1y6G4xj6oHNDA==, Order #=qRatAMf_6Pq77ALgggiLSJg==)
в StockSharp.Algo.Strategies.Strategy.#=qnMkTDK$vgFXAHD_jnQqUoemJ0xATFxaqCLg1EscWz7E=(Order #=qDdHQIfKqKsvs3l4L2CQFkw==, Order #=q93_Szosd58yZODoC0qE$DA==, Action`2 #=qILlzwmip4x798LunUOS2Uw==).
Дочернюю стратегию создаю так:
Code
var strategyChild = new MarketQuotingStrategy(dir, 1) { PriceOffset = 10 };
strategyChild.LogLevel = LogLevels.Error;
strategyChild.WaitAllTrades = true;
strategyChild.OrderRegistered += (order) => {
Chart_DrawOrder(order);
};
this.OrderRegisterFailed += (o) => {
this._Log.Error(this.Name, "Order registering failed: " + o.Error.ToString());
};
strategyChild.NewMyTrades += (trades) =>
{
trades.ForEach((t) => Chart_DrawTrade(t.Trade));
};
this.ChildStrategies.Add(strategyChild);
Здесь приходят сообщения NewMyTrades и OrderRegisterFailed, и у родительской стратегии приходят PnLChanged и PositionChanged.
OrderRegistered не случается ни разу.
На какой-то предыдущей версии S# этот код работал, но я не помню, на какой именно.