← Zurück

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

Создаю несколько потоков тестирования, в каждом свой 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)

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

War dieses Thema hilfreich?

Thema teilen

Kommentare (3)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

Mikhail Sukhov
Mikhail Sukhov

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

vladch8
vladch8
vladch8 Autor

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

ilmir
ilmir

Я хотел узнать как тестировать с помощью 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));