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

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


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

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 Стратегия остановлена.

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

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  > >>
Mikhail Sukhov

Avatar
Date: 4/20/2011
Reply


Перед запуском стратегии проверьте стакан.

Thanks:

Евгений

Avatar
Date: 4/22/2011
Reply


Mikhail Sukhov: Перед запуском стратегии проверьте стакан.

Да я проверил, экспорт происходит

  if (_strategy.ProcessState == StrategyProcessStates.Stopped)
            {
                // запускаем процесс получения стакана, необходимый для работы алгоритма котирования
                _trader.RegisterQuotes(_strategy.Security);
                _strategy.Start();
                this.Start.Content = "Стоп";
            }

Заявка зарегистрированная через котирование исполняется,

                var strategy = new MarketQuotingStrategy(order, new Unit(), new Unit());
                strategy.IsParallel = true;
                base.ChildStrategies.Add(strategy);

А добавление стратегии и регистрация заявки через базовый класс не влияет на получение информации со стакана?

base.RegisterOrder(order);
...
base.ChildStrategies.Add(batch);
Thanks:

Mikhail Sukhov

Avatar
Date: 4/22/2011
Reply


Евгений:

Mikhail Sukhov: Перед запуском стратегии проверьте стакан.

Да я проверил, экспорт происходит

if (_strategy.ProcessState == StrategyProcessStates.Stopped) { // запускаем процесс получения стакана, необходимый для работы алгоритма котирования _trader.RegisterQuotes(_strategy.Security); _strategy.Start(); this.Start.Content = "Стоп"; }


Вы лишь проверили, что экспорт запускается. А идет или нет - не проверили. Сразу видна ошибка. Запустили стакан и тут же стратеги. Пришел стакан или нет вы не проверяете.
Thanks:

Евгений

Avatar
Date: 4/25/2011
Reply


Mikhail Sukhov:

Евгений:

Mikhail Sukhov: Перед запуском стратегии проверьте стакан.

Да я проверил, экспорт происходит

if (_strategy.ProcessState == StrategyProcessStates.Stopped) { // запускаем процесс получения стакана, необходимый для работы алгоритма котирования _trader.RegisterQuotes(_strategy.Security); _strategy.Start(); this.Start.Content = "Стоп"; }

> 
> Вы лишь проверили, что экспорт запускается. А идет или нет - не проверили. Сразу видна ошибка. Запустили стакан и тут же стратеги. Пришел стакан или нет вы не проверяете.

Так защитные стратегии выдают ошибку, потому что нет проверки на получение стакана? Да, программно я не сделал проверки, но регистрация через котирование работает и я решил, что следовательно стакан получается... Михаил, правильно я делаю проверку? 

           ```
     if (_strategy.ProcessState == StrategyProcessStates.Stopped)
                  {
                     _trader.RegisterQuotes(_strategy.Security);
              
                     MarketDepth md = _trader.GetMarketDepth(_strategy.Security);

                     if (md.Count!=0)
                      _strategy.Start();
                  }
Thanks:

Евгений

Avatar
Date: 4/28/2011
Reply


Помогите, пожалуйста, разобраться [huh] Наверника ж кто-то сталкивался с такой же проблемой, код из примера...

Thanks:

Mikhail Sukhov

Avatar
Date: 4/28/2011
Reply


Евгений: Помогите, пожалуйста, разобраться [huh] Наверника ж кто-то сталкивался с такой же проблемой, код из примера...

А в чем проблема?

Thanks:

Евгений

Avatar
Date: 4/28/2011
Reply


Mikhail Sukhov:

Евгений: Помогите, пожалуйста, разобраться [huh] Наверника ж кто-то сталкивался с такой же проблемой, код из примера...

А в чем проблема?

Как сделать, чтобы стакан заполнялся и защитные стратегии отрабатывали и не выдавали ошибку, которую я описал выше. Я сделал проверку при запуске экспорта стакана, но чего-то я не уверен, что правильно. Проверку нужно делать в событии QuotesChanged? И что нужно сделать, если не пришел стакан, чтобы выполнились защитные стратегии?[blush]

Thanks:

Mikhail Sukhov

Avatar
Date: 4/28/2011
Reply


Евгений: Как сделать, чтобы стакан заполнялся и защитные стратегии отрабатывали и не выдавали ошибку, которую я описал выше. Я сделал проверку при запуске экспорта стакана, но чего-то я не уверен, что правильно.

Запустите и проверьте.

Евгений: Проверку нужно делать в событии QuotesChanged?

Это как?

Евгений: И что нужно сделать, если не пришел стакан, чтобы выполнились защитные стратегии?[blush]

Если нет стакана, то какой смысл защищать (нет ни продавцов, ни покупателей)? Вы на неликвиде работаете?

Thanks:

Евгений

Avatar
Date: 4/28/2011
Reply


Mikhail Sukhov:

Евгений: Как сделать, чтобы стакан заполнялся и защитные стратегии отрабатывали и не выдавали ошибку, которую я описал выше. Я сделал проверку при запуске экспорта стакана, но чего-то я не уверен, что правильно.

Запустите и проверьте.

Проверка проходит, а ситуацию, чтобы сработал стоп еще не отлавил.

Mikhail Sukhov: Это как?

Это мои предположения ничем не подкрепленные[smile]

Mikhail Sukhov: Если нет стакана, то какой смысл защищать (нет ни продавцов, ни покупателей)? Вы на неликвиде работаете?

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

Thanks:

Mikhail Sukhov

Avatar
Date: 4/28/2011
Reply


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

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

Thanks:
1 2 3  > >>

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

loading
clippy