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

Теги:


Спасибо:




64 Ответов
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();
}
Автор топика
Спасибо:

Евгений

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


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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 27.04.2011
Ответить


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


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

Евгений

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


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


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


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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 27.04.2011
Ответить


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


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

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


Это как?

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


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

Евгений

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


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


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


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

Mikhail Sukhov Перейти


Это как?


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


Mikhail Sukhov Перейти


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


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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 28.04.2011
Ответить


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


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

Евгений

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


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


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


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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 29.04.2011
Ответить


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


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


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


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

Евгений

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


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


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


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


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


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

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

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

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

_trader.RegisterQuotes(_rim1);

};)
}


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

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

Код
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
Ответить


Евгений Перейти

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

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


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

Евгений

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


Mikhail Sukhov Перейти
Евгений Перейти

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

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


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


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

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


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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 17.05.2011
Ответить


Евгений Перейти
Mikhail Sukhov Перейти
Евгений Перейти

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

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


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


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

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


_trader - это RealTimeTestTrader.


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

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

Евгений

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


Mikhail Sukhov Перейти
Евгений Перейти
Mikhail Sukhov Перейти
Евгений Перейти

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

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


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


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

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


_trader - это RealTimeTestTrader.


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

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


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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 17.05.2011
Ответить


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


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

Евгений

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


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


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


И не говорите, написал теперь вот покоя людям не даю Smile Ну тогда получается, что ситуация останется той же...
А сообщение я вывел так
Код
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()

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






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

Евгений

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


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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 03.06.2011
Ответить


Евгений Перейти
Хелп ми плиз


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

InsiderHSE

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


Евгений Перейти
Хелп ми плиз

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

Евгений

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


InsiderHSE Перейти
Евгений Перейти
Хелп ми плиз

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


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

Евгений

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


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

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

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

loading
clippy