Использую стандартный код из примеров по котированию,тейк профиту и стоп лоссу
в логе имеем
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.List1.Enumerator.MoveNextRare() at System.Collections.Generic.List1.Enumerator.MoveNext()
at System.Linq.Enumerable.WhereEnumerableIterator1.MoveNext() at Ecng.Collections.CollectionHelper.ForEach(IEnumerable1 source, Action1 action) at Ecng.Trading.Algo.Strategies.Strategy.#=qHRMcFvqXR6j1q2Pr47dle9WfGbTEUreeM3kX0H1_iFw=.#=qOGzxZJdfi6loaGsGVxccBNBAIRdJXv0lLePvgsj7dig=(IStrategyChildStrategyList #=qrDB7Xd_Rb1RSIq0SI7l3XA==) at Ecng.Collections.CollectionHelper.SyncGet[TCollection,TResult](TCollection collection, Func2 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 Стратегия остановлена.
То есть перекотирование эффектно убивает все дочерние стратегии все это выглядит как злобный баг... Михаил?
Comentarios (9)
Iniciar sesión o Crear cuenta, Inicie sesión o regístrese para dejar un comentario
Может привести участки кода, где работаете со свойством Strategy.ChildStrategies?
немного не в тему, но все же - заметил что везде в доках мы только добавляем дочерние стратегии и никогда не чистим коллекцию ChildStrategies подозреваю, что большинство народа который запускает дочерние стратегии по торговому сигналу (например котирование) делают так же и имеют массу мертвых стрaтегий в памяти (aka memory leak)
было бы неплохо сказать об этом в доках
Спасибо
После отработки они удаляются.
Понял, это было не очевидно
Возвращаясь к первоначальной проблеме, не смог найти причину Вот отрывки кода
котирование var price = Security.GetMarketPrice(direction); TargetOrder = CreateOrder(direction, price, Volume); Quoter = new MarketQuotingStrategy(TargetOrder, new Unit(), new Unit()) ; ChildStrategies.Clear(); ChildStrategies.Add(Quoter);
и код внутри OnNewMyTrades
как видишь код взят из примеров
Мысли?
Ошибка стабильная? Можно ее выслать с кодом?
Ошибка спорадическая. :( Очень похоже что два потока пытаются одновременно читать-менять коллекцию
batch переменная на каком уровне?
локальная переменная внутри OnNewMyTrades хэндлера
Без минимального кода не понять.