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

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


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

Code

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 (303)
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[] { strategy.Portfolio };
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