Ошибка защитных стратегий - коллекция котировок пуста

Ошибка защитных стратегий - коллекция котировок пуста
Atom
4/19/2011


Выводится в логи следующая ошибка (правильно я понял, что логируется только то, что описывается через AddLog()) :

Code
IS_01:00:10 10:12:00.1564059 Стратегия запущена.
IS_01:00:10 16:00:01.3877441 Регистрация заявки - цена 193245, направление Buy, объем 5
IS_01:00:10 16:00:02.9208318 Прошла сделка по цене 192375, объём 5, направление Buy.
IS_01:00:10 16:00:02.9618341 Регистрация стоп-лосс по цене 190550
IS_01:00:10 16:00:02.9618341 Регистрация тейк-профит по цене 192640
BS 16:00:02.9628342 Стратегия запущена.
BS 16:00:02.9628342 Стратегия запущена.
TPS 16:00:02.9628342 Стратегия запущена.
SLS 16:00:02.9628342 Стратегия запущена.
TPS 18:45:25.8543911 [h]System.ArgumentException: Коллекция котировок пуста.
Имя параметра: quotes
в Ecng.Trading.Algo.TraderHelper.GetFilteredQuotes(IEnumerable`1 quotes, Order currentOrder)
в Ecng.Trading.Algo.TraderHelper.GetFilteredQuotes(MarketDepth depth, OrderDirections orderDirection, Order currentOrder)
в Ecng.Trading.Algo.TraderHelper.GetFilteredQuotes(Security security, OrderDirections orderDirection, Order currentOrder)
в Ecng.Trading.Algo.Strategies.ProtectiveStrategy.GetNewPrice()
в Ecng.Trading.Algo.Strategies.TakeProfitStrategy.CanRegister()
в Ecng.Trading.Algo.Strategies.QuotingStrategy.OnProcess()
в Ecng.Trading.Algo.Strategies.Strategy.#=qnMN_PMdUfHysEK$_tfQ8grn_QTjzOIMGPiv$tYCH2Bw=.#=q3rD2zIrUx4ViUbhRH66B2w==()[/h]
TPS 18:45:25.8543911 Стратегия останавливается.
SLS 18:45:25.8543911 System.ArgumentException: Коллекция котировок пуста.
Имя параметра: quotes
в Ecng.Trading.Algo.TraderHelper.GetFilteredQuotes(IEnumerable`1 quotes, Order currentOrder)
в Ecng.Trading.Algo.TraderHelper.GetFilteredQuotes(MarketDepth depth, OrderDirections orderDirection, Order currentOrder)
в Ecng.Trading.Algo.TraderHelper.GetFilteredQuotes(Security security, OrderDirections orderDirection, Order currentOrder)
в Ecng.Trading.Algo.Strategies.ProtectiveStrategy.GetNewPrice()
в Ecng.Trading.Algo.Strategies.StopLossStrategy.CanRegister()
в Ecng.Trading.Algo.Strategies.QuotingStrategy.OnProcess()
в Ecng.Trading.Algo.Strategies.Strategy.#=qnMN_PMdUfHysEK$_tfQ8grn_QTjzOIMGPiv$tYCH2Bw=.#=q3rD2zIrUx4ViUbhRH66B2w==()
SLS 18:45:25.8543911 Стратегия останавливается.
TPS 18:45:26.8554483 Котирование закончилось.
TPS 18:45:26.8564484 Стратегия остановлена.
SLS 18:45:26.8574485 Котирование закончилось.
SLS 18:45:26.8574485 Стратегия остановлена.
BS 18:45:26.8794497 Стратегия останавливается.
BS 18:45:27.8795069 Стратегия остановлена.
BS 18:45:27.8795069 Стратегия останавливается.
BS 18:45:28.8795641 Стратегия остановлена.


Стратегии регистрирую как в примере:

Code
private void OnNewMyTrades(IEnumerable<MyTrade> trades)
{
foreach (var trade in trades)
{
AddLog(StrategyErrorStates.None, "Прошла сделка по цене {0}, объём {1}, направление {2}.",
trade.Trade.Price, trade.Trade.Volume, trade.Order.Direction);
}
// фильтруем сделки, чтобы найти те, которые произошли для заявки TargetOrder// сделать проверку не на последнюю заявку а на все заявки которые
trades = trades.Where(t => t.Order == TargetOrder);

// если не найдена ни одна сделка для заявки TargetOrder
if (trades.Count() == 0)
return;

// сама пакетная стратегия так же является параллельной, чтобы она не блокирована основной код робота
var batch = new BatchStrategy(BatchFinishModes.All) { IsParallel = true };

// для каждой сделки добавляем для защиты по пакетной стратегии
batch.ChildStrategies.AddRange(trades.Select(t =>
{

var s = new BatchStrategy(BatchFinishModes.First) { IsParallel = true };

// выставляет тейк-профит в N пунктов
var takeProfit = new TakeProfitStrategy(t,new Unit((decimal)Fractal.Up) + _takeDelta.Pips(Security));

// выставляет стоп-лосс в M пунктов
var stopLoss = new StopLossStrategy(t, new Unit((decimal)Fractal.Down) - _stopDelta.Pips(Security));

takeProfit.PriceDelta=stopLoss.PriceDelta = _priceDelta;

// делаем стратегии параллельными, чтобы они не блокировали работу контролирующей BatchStrategy
takeProfit.IsParallel = stopLoss.IsParallel = true;

s.ChildStrategies.Add(takeProfit);
s.ChildStrategies.Add(stopLoss);

AddLog(StrategyErrorStates.None, "Регистрация стоп-лосс по цене {0}", stopLoss.ProtectiveDelta);
AddLog(StrategyErrorStates.None, "Регистрация тейк-профит по цене {0}", takeProfit.ProtectiveDelta);

return s;
}).Cast<Strategy>());

if (batch.ChildStrategies.Count > 0)
{
base.ChildStrategies.Add(batch);
}
TargetOrder = null;
}


Заявки выставляю лимитированные через base.RegisterOrder(order).Процесс получения стакана происходит - _trader.RegisterQuotes(_strategy.Security). Что я неправильно делаю?
Спасибо

Tags:


Thanks:


< 1 2 3 4  > >>
Евгений

Avatar
Date: 4/29/2011
Reply


Mikhail Sukhov Go to
Евгений Go to
Я запускаю стратегию для Rim1. И еще повторюсь, что когда заявку выставляю через котирование, она исполняется, значит стакан грузится, как я понял. Но я выставляю лимитировано, заявка исполняется, а защитные стратегии выдают ошибку, что коллекция котировок пуста... Информация по стакану с одного места берется?


Стакан не успевает прийти.


А как сделать, чтобы успевал или хотя бы отрабатывали с задержкой защитные стратегии?
Thanks:

Mikhail Sukhov

Avatar
Date: 4/29/2011
Reply


Евгений Go to
Mikhail Sukhov Go to
Евгений Go to
Я запускаю стратегию для Rim1. И еще повторюсь, что когда заявку выставляю через котирование, она исполняется, значит стакан грузится, как я понял. Но я выставляю лимитировано, заявка исполняется, а защитные стратегии выдают ошибку, что коллекция котировок пуста... Информация по стакану с одного места берется?


Стакан не успевает прийти.


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


Запускать стакан раньше стратегий.
Thanks:

Евгений

Avatar
Date: 5/17/2011
Reply


Mikhail Sukhov Go to
Евгений Go to
Mikhail Sukhov Go to
Евгений Go to
Я запускаю стратегию для Rim1. И еще повторюсь, что когда заявку выставляю через котирование, она исполняется, значит стакан грузится, как я понял. Но я выставляю лимитировано, заявка исполняется, а защитные стратегии выдают ошибку, что коллекция котировок пуста... Информация по стакану с одного места берется?


Стакан не успевает прийти.


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


Запускать стакан раньше стратегий.


Михаил, запускаю стакан сразу после того как экспорт дде закончен и определен инструмент

Code
var rim1 = securities.FirstOrDefault(s => s.Code == "RIM1");

if (rim1 != null)
{
_rim1 = rim1;

this.GuiAsync(() =>
{
this.Start.IsEnabled = true;

_trader.RegisterQuotes(_rim1);

};)
}


А стратегию уже потом при нажатии на кнопку. Но все равно та же ошибка вознкикает :(

Пробовал также ставить задержку, но та же ошибка...

Code
if (_strategy.ProcessState == StrategyProcessStates.Stopped)
{

_trader.RegisterQuotes(_strategy.Security);

Thread.Sleep(5000);

_strategy.Start();

this.Start.Content = "Стоп";
}
else
{
_trader.UnRegisterQuotes(_strategy.Security);
_strategy.Stop();
this.Start.Content = "Старт";
}



Thanks:

Mikhail Sukhov

Avatar
Date: 5/17/2011
Reply


Евгений Go to

Михаил, запускаю стакан сразу после того как экспорт дде закончен и определен инструмент

А стратегию уже потом при нажатии на кнопку. Но все равно та же ошибка вознкикает :(


Проверьте, событие ITrader.QuotesChanged передается стакан для RIM1.
Thanks:

Евгений

Avatar
Date: 5/17/2011
Reply


Mikhail Sukhov Go to
Евгений Go to

Михаил, запускаю стакан сразу после того как экспорт дде закончен и определен инструмент

А стратегию уже потом при нажатии на кнопку. Но все равно та же ошибка вознкикает :(


Проверьте, событие ITrader.QuotesChanged передается стакан для RIM1.


Да, в коллекции MarketDepth есть один стакан для инструмента RIM1.

А эти записи идентичны?
Code
_trader.QuotesChanged += Trader_QuotesChanged;
_trader.Trader.QuotesChanged += Trader_QuotesChangedReal;


_trader - это RealTimeTestTrader.
Thanks:

Mikhail Sukhov

Avatar
Date: 5/17/2011
Reply


Евгений Go to
Mikhail Sukhov Go to
Евгений Go to

Михаил, запускаю стакан сразу после того как экспорт дде закончен и определен инструмент

А стратегию уже потом при нажатии на кнопку. Но все равно та же ошибка вознкикает :(


Проверьте, событие ITrader.QuotesChanged передается стакан для RIM1.


Да, в коллекции MarketDepth есть один стакан для инструмента RIM1.

А эти записи идентичны?
Code
_trader.QuotesChanged += Trader_QuotesChanged;
_trader.Trader.QuotesChanged += Trader_QuotesChangedReal;


_trader - это RealTimeTestTrader.


Да идентичны.

И что, после того, как пришли изменения по стакану (допустим вы вывели куда-то сообщение об этом) стратегия все равно пишет такое сообщение?
Thanks:

Евгений

Avatar
Date: 5/17/2011
Reply


Mikhail Sukhov Go to
Евгений Go to
Mikhail Sukhov Go to
Евгений Go to

Михаил, запускаю стакан сразу после того как экспорт дде закончен и определен инструмент

А стратегию уже потом при нажатии на кнопку. Но все равно та же ошибка вознкикает :(


Проверьте, событие ITrader.QuotesChanged передается стакан для RIM1.


Да, в коллекции MarketDepth есть один стакан для инструмента RIM1.

А эти записи идентичны?
Code
_trader.QuotesChanged += Trader_QuotesChanged;
_trader.Trader.QuotesChanged += Trader_QuotesChangedReal;


_trader - это RealTimeTestTrader.


Да идентичны.

И что, после того, как пришли изменения по стакану (допустим вы вывели куда-то сообщение об этом) стратегия все равно пишет такое сообщение?


Еще не отловил такой ситуации, чтобы отработали защитные стратегии - пробую. А подписка на событие QuotesChanged может изменить ситуацию?
Thanks:

Mikhail Sukhov

Avatar
Date: 5/17/2011
Reply


Евгений Go to
Еще не отловил такой ситуации, чтобы отработали защитные стратегии - пробую. А подписка на событие QuotesChanged может изменить ситуацию?


Она не меняет ничего. Просто она мне покажет, что вы там такого понаписали и почему не работает.[smile]
Thanks:

Евгений

Avatar
Date: 5/18/2011
Reply


Mikhail Sukhov Go to
Евгений Go to
Еще не отловил такой ситуации, чтобы отработали защитные стратегии - пробую. А подписка на событие QuotesChanged может изменить ситуацию?


Она не меняет ничего. Просто она мне покажет, что вы там такого понаписали и почему не работает.[smile]


И не говорите, написал теперь вот покоя людям не даю [smile] Ну тогда получается, что ситуация останется той же...
А сообщение я вывел так
Code
private void Trader_QuotesChanged(IEnumerable<MarketDepth> obj)
{
MessageBox.Show(obj.First().Security.Code);
}


Так регистрацию стакана нужно делать до запуска стратегии, а насколько до по времени? И принципиально ли место регистрации стакана, если я зарегистрирую ее в Running? Я уже думаю может причина не в том что стакан не приходит, а в самих защитных стратегиях. Может ли повлиять то, что я не снимаю стратегию, после того как сделка совершится по сигналу?
Thanks:

Евгений

Avatar
Date: 5/31/2011
Reply


Михаил, я кажется понял, почему происходит эта ошибка:

TPS 14:11:52.7958984 System.ArgumentException: Коллекция котировок пуста.
Имя параметра: quotes....

TPS 18:45:26.1187618 System.ArgumentException: Коллекция котировок пуста.
Имя параметра: quotes...

Стратегии продолжают работать во время клиринга, собственно, когда стакан пуст. Но тогда вопрос, как сделать, чтобы защитные стратегии не работали в это время? Для базовой стратегии условие на время работы выставлено в OnProcess()

Code
if (base.Security.Exchange.IsTradeTime(base.Trader.MarketTime) == false)
return StrategyProcessResults.Continue;






Thanks:
< 1 2 3 4  > >>

Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy