← 返回

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

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

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

本主题对您有帮助吗?

分享主题

评论 (3)

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

Mikhail Sukhov
Mikhail Sukhov

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

vladch8
vladch8
vladch8 作者

Спасибо за 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));