← 返回

Синхронное тестирование на истории двух разных TimeFrameCandle

Здравствуйте.

Скачал при помощи гидры свечки 5-минутки и часовики. Попробовал загрузить разными HistoryEmulationConnector в разные графики - все работает. Теперь пробую через один HistoryEmulationConnector загрузить оба набора свечей. Пробовал и через один CandleManager и через разные, но подключенные к одному HistoryEmulationConnector. Выскакивает одна и та-же ошибка - "An item with the same key has already been added." Ругается на выделенную строку. Причем в Series у СandleManager этот _series60m успевает добавиться.

Хочется понять я странного хочу или есть возможность синхронной симуляции двух разных TimeFrameCandle для одного инструмента. Заранее спасибо за ответ.


            connector.NewSecurities += securities =>
            {
                if (securities.All(s => s != security))
                    return;

                // start strategy before emulation started
                strategy.Start();
                candleManager.Start(_series5m);
                candleManager.Start(_series60m); <-------------------------------- Проблема тут

                // start historical data loading when connection established successfully and all data subscribed
                connector.Start();
            };


StackTrace:


   at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)
   at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
   at System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value)
   at Ecng.Collections.SynchronizedDictionary`2.Add(TKey key, TValue value)
   at StockSharp.Algo.Testing.HistoryEmulationConnector.StockSharp.Algo.Candles.IExternalCandleSource.SubscribeCandles(CandleSeries series, DateTimeOffset from, DateTimeOffset to)
   at StockSharp.Algo.Candles.CandleManager.ExternalCandleSource.StockSharp.Algo.Candles.ICandleSource<StockSharp.Algo.Candles.Candle>.Start(CandleSeries series, DateTimeOffset from, DateTimeOffset to)
   at StockSharp.Algo.Candles.CandleSourceEnumerator`2.Start()
   at StockSharp.Algo.Candles.CandleManager.Start(CandleSeries series, DateTimeOffset from, DateTimeOffset to)
   at StockSharp.Algo.Candles.CandleHelper.Start(ICandleManager manager, CandleSeries series)
   at SimpleStrategy.MainWindow.<>c__DisplayClass19_0.<Window_Loaded>b__0(IEnumerable`1 securities) in C:\Users\xxxxxxx\Stock\Stage\SimpleStrategy\SimpleStrategy\MainWindow.xaml.cs:line 258
   at Ecng.Common.DelegateHelper.SafeInvoke[T](Action`1 handler, T arg)
   at StockSharp.Algo.Connector.GetSecurity(String id, Func`2 changeSecurity)
   at StockSharp.Algo.Connector.ProcessSecurityMessage(SecurityMessage message)
   at StockSharp.Algo.Connector.OnProcessMessage(Message message)

本主题对您有帮助吗?

分享主题

评论 (3)

登录创建账户, 登录或注册以发表评论

Иван З.
Иван З.

Если вы свечи из тиков собирать будете то у вас получиться то что вы хотите, но это медленно. А вот как из готовых свечей сложно сказать.

suglosta
suglosta 作者

Только что попробовал вопроизвести на версии 4.3.14.2 (до этого делал на 4.3.13) После применения всех необходимых корректировок все равно не заработало, но проблемы стали другими и в голову пришла идея. В общем - все получилось.

Итак, чтобы протестировать на исторических свечках стратегию, где нужны несколько разных Series (в моем случае 5m и 60m) нужно: Инициализировать только один CandleManager. Это принципиально.


            var candleManager = new CandleManager(connector);

Создать нужные Series:


            var timeFrame5m = TimeSpan.FromMinutes(5);
            var timeFrame60m = TimeSpan.FromMinutes(60);

            _series5m = new CandleSeries(typeof(TimeFrameCandle), security, timeFrame5m);
            _series60m = new CandleSeries(typeof(TimeFrameCandle), security, timeFrame60m);

Передать CandleManager и нужные Series в стратегию, где подписаться на свечки: Можно подписать одно событие и в нем определять тип свечи по candle.arg или сделать 2 разных процедуры, по желанию.


        protected override void OnStarted()
        {
            _candleManager
                .WhenCandlesFinished(_series5m)
                .Do(ProcessCandle)
                .Apply(this);

            _candleManager
                .WhenCandlesFinished(_series60m)
                .Do(ProcessCandle)
                .Apply(this);

            base.OnStarted();
        }

При добавлении Security в коннектор запустить генерацию на обе(все) Series:


            connector.NewSecurities += securities =>
            {
                if (securities.All(s => s != security))
                    return;


                // start strategy before emulation started
                strategy.Start();
                candleManager.Start(_series5m);
                candleManager.Start(_series60m);
                // start historical data loading when connection established successfully and all data subscribed
                connector.Start();
            };


И будет вам счастье.

Сергей Гаврилов

Такая ошибка может быть, если при этом график отрисовывается