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

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


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

Скачал при помощи гидры свечки 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)




Спасибо:


Иван З.

Фотография
Дата: 30.05.2016
Ответить


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

suglosta

Фотография
Дата: 30.05.2016
Ответить


Только что попробовал вопроизвести на версии 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();
            };



И будет вам счастье.
Спасибо:

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

Фотография
Дата: 01.06.2016
Ответить


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


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy