sergun
|
Дата: 28.10.2010
|
|
|
|
Mikhail SukhovsergunКстати по задумке NewOrders вызывается и нужен только для асинхронного режима? Нет, для обоих... Я проверил сценарий. Все вызывается. Можете как-то локализовать проблему? Потому что, если я создаю стратегию, и регистрирую в ней заявку по рыночной цене, то все события вызыываются на ура. IsAsyncMode = true. Есть еще подозрения, что может быть где-то обработчик на данные события еще есть и он кидает исключение. А с событиями такая ситуация. Если впереди стоящий в цепочке подписки выбросил исключение, то дальше уже никто событие не получит. Если не в этом дело, то надо выделать проблемное место путем тестов. Снова возникла такая ситуация. Но уже в синхронном режиме. Симптом - по заявке не приходят никакие события у стратегии (NewMyTrades, NewOrder, OrderChanged).. У QuikTrader пришло событие NewMyTrades, остальные события у трейдера не обрабатывал. Сейчас добавил обработчики и логирование. Если еще возникнет ситуация скажу вызвались ли.. Но вот у Strategy- глухо.
|
|
Спасибо:
|
|
|
|
|
sergun
|
Дата: 01.11.2010
Mikhail SukhovDmitriy KlimovMikhail SukhovСтойте, это не Вам ответ. Сорри что убрал цетирование. Это ответ sergun-у. С Вашей ошибкой все понятно, нашел и ее устраняю. Михаил, простите что беспокою понапрасну. Но когда можно ожидать исправление ошибки? Чуть выше я писал, что на этой неделе. Теперь точнее - пятница. Снова проявился баг (пока я на 2.4). Выставляю заявку, происходит полное исполнение разом. В квике вижу одну сделку. Трейдер и стратегия подписаны на всевозможные события (свои новые сделки, новые заявки, изменение заявок). Судя по логу вызывается только следующее: 2010-11-01 11:40:06,581 ITrader.NewOrder 2010-11-01 11:40:06,590 ITrader.OrderChanged 2010-11-01 11:40:06,590 ITrader.OrderChanged 2010-11-01 11:40:06,591 ITrader.OrderChanged 2010-11-01 11:40:06,618 Strategy.NewOrder Про сделки - НИЧЕГО. Михаил, может это даст какую-нибудь наводку?
|
|
Спасибо:
|
|
|
|
|
Dmitriy Klimov
|
Дата: 01.11.2010
Михаил, проблема с условными стоп-заявками так и не решилась. После выставления чере стратегию заявки типа QuikStopConditionTypes.TakeProfitStopLimit и совершения сделки по этой заявки, у меня не возникают события Strategy.StopOrderChanged и Strategy.NewMyTrades. Соответственно, Strategy.PositionManager тоже не в курсе, что стратегия уже не в позиции.
Как быть? Самому пока дописывать класс Strategy, или вам недолго поправить эту ошибку?
|
|
Спасибо:
|
|
|
|
|
Mikhail Sukhov
|
Дата: 02.11.2010
|
|
|
|
Dmitriy KlimovМихаил, проблема с условными стоп-заявками так и не решилась. После выставления чере стратегию заявки типа QuikStopConditionTypes.TakeProfitStopLimit и совершения сделки по этой заявки, у меня не возникают события Strategy.StopOrderChanged и Strategy.NewMyTrades. Соответственно, Strategy.PositionManager тоже не в курсе, что стратегия уже не в позиции.
Как быть? Самому пока дописывать класс Strategy, или вам недолго поправить эту ошибку? Я проверял на таком примере: Кодprivate class MyStrategy : ActionStrategy { public void CreateOrder() { Order order = base.CreateOrder(OrderDirections.Buy, 1600, 1); order.Type = OrderTypes.Conditional; order.StopCondition = new QuikStopCondition { Type = QuikStopConditionTypes.TakeProfitStopLimit, StopPrice = 1600, StopLimitPrice = 1600, Offset = new Unit(), Spread = new Unit() }; } }
...
_strategy.NewStopOrder += o => Debug.WriteLine("NewStopOrder " + o.Id); _strategy.StopOrderChanged += o => Debug.WriteLine("StopOrderChanged " + o.Id);
_strategy.CrateOrder(); Событие вызывалось. Такой пример у Вас работает?
|
|
Спасибо:
|
|
|
|
|
Mikhail Sukhov
|
Дата: 02.11.2010
sergun Судя по логу вызывается только следующее: 2010-11-01 11:40:06,581 ITrader.NewOrder 2010-11-01 11:40:06,590 ITrader.OrderChanged 2010-11-01 11:40:06,590 ITrader.OrderChanged 2010-11-01 11:40:06,591 ITrader.OrderChanged 2010-11-01 11:40:06,618 Strategy.NewOrder
Михаил, может это даст какую-нибудь наводку?
Даст, например то, что Strategy.NewOrder вызывается после Trader.OrderChanged, а такое быть не может. Событие одного типа вызывается непрерывно, тоесть после ITrader.NewOrder должно было идти Strategy.NewOrder. Все же мне кажется надо идти по пути упрощения кода. Выделить проблемный участок путем убирания и тестирования. Так какая то фантастика получается, в которой уже просто сложно разобраться. Где глючит, что боит - не понятно. Выделите стратегию в отдельный проект и потестируйте ее под нагрузкой на демо счете.
|
|
Спасибо:
|
|
|
|
|
Dmitriy Klimov
|
Дата: 02.11.2010
|
|
|
|
Mikhail SukhovЯ проверял на таком примере: Кодprivate class MyStrategy : ActionStrategy { public void CreateOrder() { Order order = base.CreateOrder(OrderDirections.Buy, 1600, 1); order.Type = OrderTypes.Conditional; order.StopCondition = new QuikStopCondition { Type = QuikStopConditionTypes.TakeProfitStopLimit, StopPrice = 1600, StopLimitPrice = 1600, Offset = new Unit(), Spread = new Unit() }; } }
...
_strategy.NewStopOrder += o => Debug.WriteLine("NewStopOrder " + o.Id); _strategy.StopOrderChanged += o => Debug.WriteLine("StopOrderChanged " + o.Id);
_strategy.CrateOrder(); Событие вызывалось. Такой пример у Вас работает? Да, по сути делаю все то же самое. Написал даже отдельную тестовую стратегию, которая после котирования выставляет такую условную заявку. В Квике заявка появляется и срабатывает, но в стратегии ни одно событие на нее не реагирует. Ума не приложу, что не так. Привожу полный код стратегии на всякий случай: Кодusing System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text;
using Ecng.Collections; using Ecng.Trading.Algo; using Ecng.Trading.Algo.Strategies; using Ecng.Trading.BusinessEntities; using Ecng.Trading.Quik;
namespace VolumeStrategy { class StopOrderStrategy : Strategy { public double StopLoss = 20; public double TakeProfit = 40; public double Offset = 5; public double Spread = 5; public int Slippage = 5;
public StopOrderStrategy() : base() { base.Volume = 1; }
protected override void OnRunning() { base.NewMyTrades += OnNewMyTrades; base.StopOrderChanged += OnStopOrderChanged;
base.OnRunning(); }
protected override void OnStopping() { base.NewMyTrades -= OnNewMyTrades; base.StopOrderChanged -= OnStopOrderChanged;
base.OnStopping(); }
protected override bool OnProcess() { if (base.ProcessState == StrategyProcessStates.Stopping) { base.CancelActiveOrders();
return false; }
return true; }
public void MakeTrade(OrderDirections direction) { double price = base.Security.GetMarketPrice(direction, MarketPriceTypes.Following);
Order order = base.CreateOrder(direction, price, this.Volume);
var strategy = new MarketQuotingStrategy(order, new Unit(), new Unit()); strategy.IsForts = true; strategy.Start(); base.ChildStrategies.Add(strategy); }
private void OnNewMyTrades(IEnumerable<MyTrade> trades) { foreach (var trade in trades) { File.AppendAllText("Trades.txt", trade.Trade.Time.ToString() + " " + trade.Order.Direction.ToString() + " " + trade.Trade.Price.ToString() + Environment.NewLine); }
if (base.PositionManager.Position != 0) { // protect current position with stop order CreateTakeProfitAndStopLimit(); } }
private void OnStopOrderChanged(Order order) { File.AppendAllText("StopOrders.txt", "Stop Order: " + base.StopOrders.Count.ToString() + ": " + Environment.NewLine); File.AppendAllText("StopOrders.txt", order.Time.ToString() + " " + order.Direction.ToString() + " " + order.Price.ToString() + Environment.NewLine); }
private void CreateTakeProfitAndStopLimit() { MyTrade myTrade = base.MyTrades.Last<MyTrade>(); Trade trade = myTrade.Trade; OrderDirections tradeDirection = myTrade.Order.Direction;
Unit offsetUnit = new Unit(this.Offset); Unit spreadtUnit = new Unit(this.Spread);
OrderDirections direction = (tradeDirection == OrderDirections.Buy ? OrderDirections.Sell : OrderDirections.Buy); double takeProfitPrice = trade.Price; double stopLossLimitPrice = trade.Price; double stopLossPrice = trade.Price;
if (tradeDirection == OrderDirections.Buy) { takeProfitPrice += this.TakeProfit; stopLossLimitPrice -= this.StopLoss; stopLossPrice = stopLossLimitPrice - this.Spread; } else { takeProfitPrice -= this.TakeProfit; stopLossLimitPrice += this.StopLoss; stopLossPrice = stopLossLimitPrice + this.Spread; }
Order order = base.CreateOrder(direction, stopLossPrice, trade.Volume); order.Type = OrderTypes.Conditional; order.StopCondition = new QuikStopCondition { Type = QuikStopConditionTypes.TakeProfitStopLimit, StopPrice = takeProfitPrice, StopLimitPrice = stopLossLimitPrice, Offset = offsetUnit, Spread = spreadtUnit };
base.RegisterOrder(order); } } }
Котирование инициализирую после запуска стратегии методом MakeTrade из главного окна.
|
|
Спасибо:
|
|
|
|
|
Mikhail Sukhov
|
Дата: 05.11.2010
[quote=Dmitriy Klimov] Да, по сути делаю все то же самое. Написал даже отдельную тестовую стратегию, которая после котирования выставляет такую условную заявку. В Квике заявка появляется и срабатывает, но в стратегии ни одно событие на нее не реагирует. Ума не приложу, что не так. Привожу полный код стратегии на всякий случай: [/code]
Нашел ситуацию, когда NewOrder + NewMyTrades у Strategy не вызывалось (бывает иногда так, что заявки приходят быстрее чем обновляет стоп). Если это Ваша ошибка, то хорошо. В остальном код рабочий. У меня стабильно вызывалось событие Strategy.StopOrderChanged. Если оно у Вас не вызывается, то я бы порекомендовал посмотреть на QuikTrader.ProcessDataError.
К понедельнику выложу обновление.
|
|
Спасибо:
|
|
|
|
|
Dmitriy Klimov
|
Дата: 08.11.2010
|
|
|
|
Mikhail SukhovНашел ситуацию, когда NewOrder + NewMyTrades у Strategy не вызывалось (бывает иногда так, что заявки приходят быстрее чем обновляет стоп). Если это Ваша ошибка, то хорошо. В остальном код рабочий. У меня стабильно вызывалось событие Strategy.StopOrderChanged. Если оно у Вас не вызывается, то я бы порекомендовал посмотреть на QuikTrader.ProcessDataError.
К понедельнику выложу обновление.
Михаил, я обновился до последней версии S#, но у меня события Strategy.NewStopOrder и Strategy.StopOrderChanged так и не возникают. QuikTrader.ProcessDataError выводит только это: КодSystem.ArgumentException: Элемент с тем же ключом уже был добавлен. в System.ThrowHelper.ThrowArgumentException(ExceptionResource resource) в System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add) в Ecng.Trading.Quik.QuikTrader.#=qXtQgb_1Ivhr4cZlEBJS4ADM1O1bKVoCg9CtJr5uqcrk=.#=qwlIQWfo3qufLtkzLgdg_0w==(IList`1 #=qxm4X8NPgjxU5efFmY7R3Lw==, Func`2 #=qVtb7jPsPoFV1EKgfGAxHlw==) в Ecng.Trading.Quik.DdeTable.#=qy8NUWUI7mXZMNnXZFsWcYg==(IList`1 #=qkc1RQGHvGXkONrB1lfHMpw==, Action`2 #=qe7FTlw34xv_zxSllAk2THw==, Action`1 #=qyr$xSlYGt0D7OlEnBcjGtw==) System.InvalidOperationException: Инструмент с кодом MRKHG для бумажной позиции не найден. в Ecng.Trading.Quik.QuikTrader.#=qXtQgb_1Ivhr4cZlEBJS4ADM1O1bKVoCg9CtJr5uqcrk=.#=qXkUJcA3Ro6L4MDrPNg5BmA==(IList`1 #=qHmE5DnVpWK_g0VXdi3KT9A==, Func`2 #=qNjk1r8Yt4irfrN9i3uAhYw==) в Ecng.Trading.Quik.DdeTable.#=qy8NUWUI7mXZMNnXZFsWcYg==(IList`1 #=qkc1RQGHvGXkONrB1lfHMpw==, Action`2 #=qe7FTlw34xv_zxSllAk2THw==, Action`1 #=qyr$xSlYGt0D7OlEnBcjGtw==)
Подписался еще на Strategy.Log. В нем тоже нет событий о выставлении стоп-заявки и ее исполнении. Хотя эта заявка успешно в Квик выставляется и исполняется. Уже не знаю, в какую сторону копать. Мистика какая-то. У вас работает, у меня - нет. Еще есть идеи?
|
|
Спасибо:
|
|
|
|
|
Mikhail Sukhov
|
Дата: 08.11.2010
|
|
|
|
Dmitriy Klimov Михаил, я обновился до последней версии S#, но у меня события Strategy.NewStopOrder и Strategy.StopOrderChanged так и не возникают.
На Вашем примере тестил. Так что видимо ошибка где-то в другом месте. Dmitriy Klimov QuikTrader.ProcessDataError выводит только это:
QuikTrader.ProcessDataError - это сигнал к тому, что что-то не то в программе. Тут не может быть только. Dmitriy KlimovКодSystem.ArgumentException: Элемент с тем же ключом уже был добавлен. в System.ThrowHelper.ThrowArgumentException(ExceptionResource resource) в System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add) в Ecng.Trading.Quik.QuikTrader. в Ecng.Trading.Quik.DdeTable.
Говорит о том, что по ДДЕ пришла два раза информация об одной и той же заявки (мало вероятно) или у вас в колонке TransId имеются дублирующиеся значения (более вероятно). Dmitriy KlimovКодSystem.InvalidOperationException: Инструмент с кодом MRKHG для бумажной позиции не найден. в Ecng.Trading.Quik.QuikTrader.#=qXtQgb_1Ivhr4cZlEBJS4ADM1O1bKVoCg9CtJr5uqcrk=.#=qXkUJcA3Ro6L4MDrPNg5BmA==(IList`1 #=qHmE5DnVpWK_g0VXdi3KT9A==, Func`2 #=qNjk1r8Yt4irfrN9i3uAhYw==) в Ecng.Trading.Quik.DdeTable.#=qy8NUWUI7mXZMNnXZFsWcYg==(IList`1 #=qkc1RQGHvGXkONrB1lfHMpw==, Action`2 #=qe7FTlw34xv_zxSllAk2THw==, Action`1 #=qyr$xSlYGt0D7OlEnBcjGtw==)
Как насчет того, чтобы добавить инструмент в таблицу Инструментов?
|
|
Спасибо:
|
|
|
|
|
Dmitriy Klimov
|
Дата: 09.11.2010
Mikhail SukhovQuikTrader.ProcessDataError - это сигнал к тому, что что-то не то в программе. Тут не может быть только. Отфильтровал таблицу "Позиции по бумагам" по счетам депо, ошибки исчезли. Но события от стоп-заявок так и не возникают. Что еще можно попробовать?
|
|
Спасибо:
|
|
|
|