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


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

Теги:


Спасибо:

Именинники: konydima

1 2 3  > >>
Mikhail Sukhov

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


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

Евгений

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


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



Спасибо:

Mikhail Sukhov

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


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


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

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



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

Евгений

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


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();
}
Спасибо:

Евгений

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


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

Mikhail Sukhov

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


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


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

Евгений

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


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


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


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

Mikhail Sukhov

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


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


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

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


Это как?

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


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

Евгений

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


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


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


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

Mikhail Sukhov Перейти


Это как?


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


Mikhail Sukhov Перейти


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


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

Mikhail Sukhov

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


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


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

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

loading
clippy