Котирование убивает стратегию
Atom Ответить
12.04.2011


Использую стандартный код из примеров по котированию,тейк профиту и стоп лоссу

в логе имеем

EIS_01:00:05 15:44:45.5952531 Стратегия запущена.
MQS 15:51:16.2822579 Стратегия запущена.
MQS 15:51:17.1258459 Регистрация новой заявки на Sell с ценой 202940 и объемом 1.
MQS 15:51:17.7038599 Заявка 56596292 на Sell отправлена с ценой 202940 объемом 1.
MQS 15:51:22.7341439 Цена текущей 202940 и лучшей 202930.
MQS 15:51:22.7341439 Котирование заявки 56596292 на Sell с ценой 202940 объемом 1.
BS 15:51:24.4213199 Стратегия запущена.
BS 15:51:24.4213199 Стратегия запущена.
TPS 15:51:24.4213199 Стратегия запущена.
SLS 15:51:24.4213199 Стратегия запущена.
MQS 15:51:24.4213199 Перекотирование зарегистрировано для заявки 56596293 на Sell с ценой 202930 объемом 1.
EIS_01:00:05 15:51:27.2176579 System.InvalidOperationException: Collection was modified; enumeration operation may not execute.
at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
at System.Collections.Generic.List`1.Enumerator.MoveNextRare()
at System.Collections.Generic.List`1.Enumerator.MoveNext()
at System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext()
at Ecng.Collections.CollectionHelper.ForEach[T](IEnumerable`1 source, Action`1 action)
at Ecng.Trading.Algo.Strategies.Strategy.#=qHRMcFvqXR6j1q2Pr47dle9WfGbTEUreeM3kX0H1_iFw=.#=qOGzxZJdfi6loaGsGVxccBNBAIRdJXv0lLePvgsj7dig=(IStrategyChildStrategyList #=qrDB7Xd_Rb1RSIq0SI7l3XA==)
at Ecng.Collections.CollectionHelper.SyncGet[TCollection,TResult](TCollection collection, Func`2 func)
at Ecng.Trading.Algo.Strategies.Strategy.#=qzh$zLa7ho1TkxaD0haVAuU8l0ywEYoKg8dEBpjVnC6k=(DateTime #=qKCPgKC6dqIek9OjPJFhtfw==)
at Ecng.Trading.Algo.Strategies.Strategy.#=qnMN_PMdUfHysEK$_tfQ8grn_QTjzOIMGPiv$tYCH2Bw=.#=q3rD2zIrUx4ViUbhRH66B2w==()
EIS_01:00:05 15:51:27.2176579 Стратегия останавливается.
MQS 15:51:27.2176579 Стратегия останавливается.
BS 15:51:27.2176579 Стратегия останавливается.
BS 15:51:27.2176579 Стратегия останавливается.
TPS 15:51:27.2176579 Стратегия останавливается.
SLS 15:51:27.2176579 Стратегия останавливается.
MQS 15:51:27.7175619 Стратегия остановлена.
TPS 15:51:27.7175619 Котирование закончилось.
TPS 15:51:27.7175619 Стратегия остановлена.
SLS 15:51:27.7175619 Котирование закончилось.
SLS 15:51:27.7175619 Стратегия остановлена.
BS 15:51:27.9675139 Стратегия остановлена.
BS 15:51:27.9675139 Стратегия остановлена.

То есть перекотирование эффектно убивает все дочерние стратегии
все это выглядит как злобный баг...
Михаил?

Теги:


Спасибо:




9 Ответов
Mikhail Sukhov

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


Может привести участки кода, где работаете со свойством Strategy.ChildStrategies?
Спасибо:

sklementiev

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


Mikhail Sukhov Перейти
Может привести участки кода, где работаете со свойством Strategy.ChildStrategies?

хм... после перечитывания лога и танцев с бубном понял что это видимо моя ошибка - исключение генерится в корневой стратегии
буду разбираться

немного не в тему, но все же - заметил что везде в доках мы только добавляем дочерние стратегии и никогда не чистим коллекцию ChildStrategies
подозреваю, что большинство народа который запускает дочерние стратегии по торговому сигналу (например котирование) делают так же и имеют массу мертвых стрaтегий в памяти
(aka memory leak)

было бы неплохо сказать об этом в доках

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

Mikhail Sukhov

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


sklementiev Перейти

подозреваю, что большинство народа который запускает дочерние стратегии по торговому сигналу (например котирование) делают так же и имеют массу мертвых стрaтегий в памяти
(aka memory leak)


После отработки они удаляются.
Спасибо:

sklementiev

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


Mikhail Sukhov Перейти
sklementiev Перейти

подозреваю, что большинство народа который запускает дочерние стратегии по торговому сигналу (например котирование) делают так же и имеют массу мертвых стрaтегий в памяти
(aka memory leak)


После отработки они удаляются.


Понял, это было не очевидно

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

котирование
var price = Security.GetMarketPrice(direction);
TargetOrder = CreateOrder(direction, price, Volume);
Quoter = new MarketQuotingStrategy(TargetOrder, new Unit(), new Unit())
{
IsForts = true
};
ChildStrategies.Clear();
ChildStrategies.Add(Quoter);

и код внутри OnNewMyTrades

batch.ChildStrategies.AddRange(trades.Select(t =>
{
var s = new BatchStrategy(BatchFinishModes.First) { IsParallel = true };

var takeProfit = new TakeProfitStrategy(t, takeProfitPoints) { IsForts = true };

var stopLoss = new StopLossStrategy(t, stopLossPoints) { IsForts = true };

takeProfit.IsParallel = stopLoss.IsParallel = true;

s.ChildStrategies.Add(takeProfit);
s.ChildStrategies.Add(stopLoss);
return s;
}));

ChildStrategies.Add(batch);

как видишь код взят из примеров

Мысли?

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

Mikhail Sukhov

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


Ошибка стабильная? Можно ее выслать с кодом?
Спасибо:

sklementiev

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


Mikhail Sukhov Перейти
Ошибка стабильная? Можно ее выслать с кодом?


Ошибка спорадическая. :(
Очень похоже что два потока пытаются одновременно читать-менять коллекцию
Автор топика
Спасибо:

Mikhail Sukhov

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


sklementiev Перейти
Mikhail Sukhov Перейти
Ошибка стабильная? Можно ее выслать с кодом?


Ошибка спорадическая. :(
Очень похоже что два потока пытаются одновременно читать-менять коллекцию


batch переменная на каком уровне?
Спасибо:

sklementiev

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


Mikhail Sukhov Перейти
sklementiev Перейти
Mikhail Sukhov Перейти
Ошибка стабильная? Можно ее выслать с кодом?


Ошибка спорадическая. :(
Очень похоже что два потока пытаются одновременно читать-менять коллекцию


batch переменная на каком уровне?


локальная переменная внутри OnNewMyTrades хэндлера

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

Mikhail Sukhov

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


sklementiev Перейти

локальная переменная внутри OnNewMyTrades хэндлера


Без минимального кода не понять.
Спасибо:


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

loading
clippy