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


Ошибка защитных стратегий - коллекция котировок пуста
Atom Ответить
19.04.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). Что я неправильно делаю?
Спасибо

Теги:


Спасибо:




64 Ответов
1 2 3  >
Mikhail Sukhov

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


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

Евгений

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


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


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

Code
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);

А добавление стратегии и регистрация заявки через базовый класс не влияет на получение информации со стакана?
Code
base.RegisterOrder(order);
...
base.ChildStrategies.Add(batch);



Автор топика
Спасибо:

Mikhail Sukhov

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


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


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

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



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

Евгений

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


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


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

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



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


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

Code
if (_strategy.ProcessState == StrategyProcessStates.Stopped)
{
_trader.RegisterQuotes(_strategy.Security);

MarketDepth md = _trader.GetMarketDepth(_strategy.Security);

if (md.Count!=0)
_strategy.Start();
}
Автор топика
Спасибо:

Евгений

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


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

Mikhail Sukhov

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


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


А в чем проблема?
Спасибо:

Евгений

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


Mikhail Sukhov Go to
Евгений Go to
Помогите, пожалуйста, разобраться Huh Наверника ж кто-то сталкивался с такой же проблемой, код из примера...


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


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

Mikhail Sukhov

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


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


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

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


Это как?

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


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

Евгений

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


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


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


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

Mikhail Sukhov Go to


Это как?


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


Mikhail Sukhov Go to


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


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

Mikhail Sukhov

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


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


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

Евгений

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


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


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


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

Mikhail Sukhov

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


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


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


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


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

Евгений

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


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 = "Старт";
}



Автор топика
Спасибо:

Mikhail Sukhov

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


Евгений Go to

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

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


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

Евгений

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


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

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

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


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


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

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


_trader - это RealTimeTestTrader.
Автор топика
Спасибо:

Mikhail Sukhov

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


Евгений 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.


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

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

Евгений

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


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 может изменить ситуацию?
Автор топика
Спасибо:

Mikhail Sukhov

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


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


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

Евгений

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


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


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


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


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

Евгений

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


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

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;






Автор топика
Спасибо:

Евгений

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


Хелп ми плиз
Автор топика
Спасибо:

Mikhail Sukhov

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


Евгений Go to
Хелп ми плиз


Есть стратегия на S#, которая работает только при наличие стакана. Стакан отсутствует. Но торговать все равно хотите. Вывод, или вам нужна другая стратегия, или доводите до ума эта. OnProcess правильно переопределили. Видимо нужно что-то еще.
Спасибо:

InsiderHSE

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


Евгений Go to
Хелп ми плиз

Думаю можно попробовать отнаследоваться от защитной стратегии и точно так же переопределить OnProcess
Спасибо:

Евгений

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


InsiderHSE Go to
Евгений Go to
Хелп ми плиз

Думаю можно попробовать отнаследоваться от защитной стратегии и точно так же переопределить OnProcess


Спасибо, я так и сделал, тестирую
Автор топика
Спасибо:

Евгений

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


А как задать время работы защитных стратегий в версии 3.2.5? До этого я переопределял OnProcess и там указывал.

Автор топика
Спасибо:
1 2 3  >

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

loading
clippy