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

Синхронное тестирование на истории двух разных TimeFrameCandle
Atom
5/30/2016
suglosta


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

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

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

Code

            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:
Code

   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)




Thanks:


Иван З.

Avatar
Date: 5/30/2016
Reply


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

suglosta

Avatar
Date: 5/30/2016
Reply


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

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

Инициализировать только один CandleManager. Это принципиально.
Code

            var candleManager = new CandleManager(connector);


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

            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 разных процедуры, по желанию.
Code

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

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

            base.OnStarted();
        }


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

            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();
            };



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

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

Avatar
Date: 6/1/2016
Reply


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


Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy