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


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

Теги:


Спасибо:


<< < 5 6 7 
Евгений

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


Alexander Перейти
Да, доступ по [] не поддерживается, уже обсуждалось.

По поводу кросс-заявок - поискал в гугле, наткнулся на наш же топик ну и как обычно на форуме квика.
в общем проблема не со стороны S#.


Я читал на форуме, но там реально ставится вопрос, когда есть заявка и выставляется еще одна. А у меня не было никаких противоположных, вообще никаких не было. Ну раз разработчики говорят что проблема не со стороны S#, значит тому и быть [smile]

А вот про защитные стратегии запутался.

Мне нужно было их удалять или останавливать. Выяснилось, что удалить не получится, нужно использовать метод Stop(). Я его использовал, но защитная стратегии создавала две заявки на продажу. Вы посоветовали:

Alexander;10250 написал:
Евгений;10248 написал:
Публиковал код и видимо случайно удалил собственно строчку - base.ChildStrategies[i].Stop();
Распечатайте ProcessState до и после этой строчки.

Я пытаюсь распечатать, но возникает ошибка System.NotSupportedException: Указанный метод не поддерживается.

А как тогда проверить, остановились ли стратегии?


Спасибо:

Serg

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


по поводу кроссзаявок может проблема быть на стороне брокера. у некоторых реализован механизм исполнения кросссделок между субсчетами, у некоторых нет(в основном у мелких)
Спасибо:

Alexander

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


Serg Перейти
по поводу кроссзаявок может проблема быть на стороне брокера. у некоторых реализован механизм исполнения кросссделок между субсчетами, у некоторых нет(в основном у мелких)


У того же Открытия 100% запрещены кросс-сделки по разным субсчетам. Сам с этим сталкивался пару раз.
Лучше этот вопрос уточнить непосредственно у брокера - почему не прошла сделка.
Спасибо:

Евгений

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


Alexander Перейти
Serg Перейти
по поводу кроссзаявок может проблема быть на стороне брокера. у некоторых реализован механизм исполнения кросссделок между субсчетами, у некоторых нет(в основном у мелких)


У того же Открытия 100% запрещены кросс-сделки по разным субсчетам. Сам с этим сталкивался пару раз.
Лучше этот вопрос уточнить непосредственно у брокера - почему не прошла сделка.


Это демо-счет, но думаю есть смысл все-равно спросить.

Так, а как все-таки проверить останавливается стратегия или нет?
Спасибо:
<< < 5 6 7 

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

loading
clippy