Использую стандартный код из примеров по котированию,тейк профиту и стоп лоссу
в логе имеем
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 Стратегия остановлена.
То есть перекотирование эффектно убивает все дочерние стратегии все это выглядит как злобный баг... Михаил?
コメント (9)
ログイン または アカウントを作成, コメントを残すにはログインまたは新規登録してください
Может привести участки кода, где работаете со свойством 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 хэндлера
Без минимального кода не понять.