Параллельное тестирование разных интервалов времени

Параллельное тестирование разных интервалов времени
Atom
10/21/2014
vladch8


Создаю несколько потоков тестирования, в каждом свой HistoryEmulationConnector со своими настройками (инструменты RIM2, RIM3, RIU2 и т.д., соответственно, разные временные интервалы). Один, иногда два - три, потока выполняются нормально, остальные выдают ошибку:


2013/09/16 00:00:00.000|Debug  |HistoryEmulationConnector|BP:Error,T=2013.09.16 00:00:00.000,Error=Элемент с тем же ключом уже был добавлен.
2013/09/16 00:00:00.000|Error  |HistoryEmulationConnector|System.ArgumentException: Элемент с тем же ключом уже был добавлен.
   в System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)
   в System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
   в System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value)
   в Ecng.Common.MathHelper.GetCachedDecimals(Decimal value)
   в StockSharp.Algo.Testing.MarketEmulator.#=qh1ZPidasARRg00NQf$sYjQX6A5pJSOEq4NH0ij$ONbs=.#=qnsQljlGqreo$Nyl8gora5Q==(Message #=q5iaVPc$F6hSLTNF1QH0JcA==, ICollection`1 #=qzIhA_j$b5yBI7rmxuSunwQ==)
   в StockSharp.Algo.Testing.MarketEmulator.#=qh1ZPidasARRg00NQf$sYjQX6A5pJSOEq4NH0ij$ONbs=.#=q7c$sqXM9_4BnhBWBfQdQJPfqNrto39GyW7ZGSuU7dATJMptYfjghXHCHDGeYtAvYvbZdrmJ_PsTBmLzXx4bbDQ==(Message #=qZPTtD$kY54AFaC8HpusqHg==)
   в StockSharp.Algo.Testing.MarketEmulator.#=qBRCpsJ52rTsW3$nd7Na$JNW9ns9arLvM6$wzd8S3ekSb0DK5Cja$PWbDeio8Z0Nhqh7xdvMGmwRbdUdevVqBOQ==(Message #=qvIToI5VzogMn$7w9dERplw==)
   в StockSharp.Algo.Testing.EmulationMessageAdapter.OnSendInMessage(Message message)
   в StockSharp.Messages.MessageAdapter`1.OnInMessageProcessor(Message message, IMessageAdapter adapter)

Не пойму, с чем может быть связана эта ошибка?


Tags:


Thanks:


Mikhail Sukhov

Avatar
Date: 10/21/2014
Reply


Вот эту dll замените.

Ecng.Common.dll.zip 44 KB (545)
Thanks: vladch8

vladch8

Avatar
Date: 10/22/2014
Reply


Спасибо за dll, помогло. Если не сложно, объясните в чем было дело.

Thanks:

ilmir

Avatar
Date: 12/9/2014
Reply


Я хотел узнать как тестировать с помощью HistoryEmulationConnector , одну и ту же стратегию с одними и теми же историческими данными несколько раз , не читая заново с жесткого диска историю . При повторном старте один и тот HistoryEmulationConnector завершает работу без тестирования приходит в состояние EmulationStates.Stopped Версия используемой библиотеки : 4.2.2.15

Можно ли как то тестировать без повторных перезагрузок данных и с помощью разных потоков (при тестировании на разных потоках с перезагрузкой истории) и избежав ошибку описанную выше пользователем vladch8

       var strategy = new Str_2222();

        var SecId = @"ROSN-9.13_FT@EQBR";
        var secIdParts = SecId.Split('@');
        var secCode = secIdParts[0];
        var board = ExchangeBoard.GetOrCreateBoard(secIdParts[1]);

        Security securityForTest = new Security
            {
                Id = SecId,
                // по идентификатору инструмента будет искаться папка с историческими маркет данными
                Code = secCode,
                PriceStep = 1,
                MinPrice = 1,
                MaxPrice = 1000000,
                MarginBuy = 10000, // задаем ГО
                MarginSell = 10000,
                Board = board,
            };

        StorageRegistry onStorageRegistry = new StorageRegistry()
        {
            DefaultDrive = new LocalMarketDataDrive(@"D:\Storages\ITInvest\Out2"),
        };
            


     //   strategy.Security = securityForTest;

        AllStatisticks allStatisticks = new AllStatisticks();
        List<TotalStat> stats = new List<TotalStat>();
        
        List<HistoryEmulationConnector> conns  = new List<HistoryEmulationConnector>();

// strategy.AddConnectorForTesting(securityForTest, onStorageRegistry, // new DateTime(2013, 1, 1), new DateTime(2014, 1, 1), new ProcessCount(), // conns, allStatisticks, stats);

        Portfolio portfolio = new Portfolio
        {
            Name = "test account",
            BeginValue = 1000000,
        };

        var iConnector = new HistoryEmulationConnector(
            new[] { securityForTest },
            new[] { portfolio })
        {
            StorageRegistry = onStorageRegistry,

            MarketEmulator =
            {
                Settings =
                {
                    //                        UseCandlesTimeFrame = timeFrame,
                    MatchOnTouch = false,
                }
            },
        };

        Connector connector = iConnector;
        
        iConnector.NewSecurities += sec =>
        {
            if (sec.All(s => s != securityForTest))
                return;
            strategy.Security = sec.First(s => s.Name == securityForTest.Name);
            strategy.Security.WhenMarketDepthChanged().Do(strategy.MarketDephtChanged).Apply(strategy);
            iConnector.RegisterMarketDepth(strategy.Security);
            
        };

        

// Security.Connector = Connector;

        //            Connector.RegisterMarketDepth(Security);

// iConnector.MarketDataAdapter.SessionHolder.MarketTimeChangedInterval = timeFrame; // iConnector.NewSecurities += securities => // { // }; iConnector.Connect(); iConnector.StartExport(); iConnector.StateChanged += (oldState, newState) => { if (iConnector.State == EmulationStates.Stopped) { if (iConnector.IsFinished) { // this.Start();

                    //iConnector.RegisteredSecurities

                  //  iConnector.Stop();

                    strategy.Dispose();

// ПОПЫТКА ПОВТОРНОГО Запуска новой стратегии но с загруженными ранее истрическими данными strategy = new Str_2222(); strategy.Security = iConnector.Securities.First(); strategy.Connector = iConnector; strategy.Portfolio = new Portfolio() { Name = "test account", BeginValue = 1000000, }; // iConnector.Portfolios = new[] ; iConnector.Start(new DateTime(2013, 1, 1), new DateTime(2014, 1, 1)); // strategy.Stop();

                    //                        allStatisticks.AddOneState1(this, stats);
                    //                        processCount.iCount--;
                    //                            MessageBox.Show(string.Format(@"BB {0}  Std Dev {1}  pnl  {2}",allParams[0].Value.ToString(),allParams[1].Value.ToString(),this.PnL.ToString()));
                }
            }

            if (iConnector.State == EmulationStates.Started)
            //                    && this.ProcessState != ProcessStates.Started)
            {
                var sssa = strategy.ProcessState;
                strategy.Start();
            }
        };

        iConnector.Start(new DateTime(2013, 1, 1), new DateTime(2014, 1, 1));
Thanks:


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

loading
clippy