← Voltar

Котирование убивает стратегию

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

в логе имеем

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 Стратегия остановлена.

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

Este tópico foi útil?

Compartilhar tópico

Comentários (9)

Entrar ou Criar conta, Faça login ou cadastre-se para deixar um comentário

Mikhail Sukhov
Mikhail Sukhov

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

sklementiev
sklementiev Autor

Mikhail Sukhov: Может привести участки кода, где работаете со свойством Strategy.ChildStrategies? хм... после перечитывания лога и танцев с бубном понял что это видимо моя ошибка - исключение генерится в корневой стратегии буду разбираться

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

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

Спасибо

Mikhail Sukhov
Mikhail Sukhov

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

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

sklementiev
sklementiev Autor

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()) ; 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
Mikhail Sukhov

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

sklementiev
sklementiev Autor

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

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

Mikhail Sukhov
Mikhail Sukhov

sklementiev:

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

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

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

sklementiev
sklementiev Autor

Mikhail Sukhov:

sklementiev:

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

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

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

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

Mikhail Sukhov
Mikhail Sukhov

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

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