public void TestUnsafeMustFail() { var lines = new string[10000]; for (int i = 0; i < lines.Length; i++) { lines[i] = "a"; } var storage = new UnsafeStorage(lines); var tasks = new List <Task>(); for (int i = 0; i < lines.Length; i++) { var task = new Task(() => storage.ReplaceFirst("a", "")); task.Start(); tasks.Add(task); } Task.WaitAll(tasks.ToArray()); }
public bool InitiateTest() { nextOrderId = 1; lastTestStart = DateTime.Now; firstDateOfTest = null; startModelTime = null; endModelTime = null; hwm = 0; maxAbsDrawdown = 0; maxDailyDrawdown = 0; maxDrawdown = 0; // начальная инициализация robotLogEntries.Clear(); previousQuotes = new UnsafeStorage <string, QuoteData>(); quotesStorage = new UnsafeStorage <string, QuoteData>(); InitTradeLib(); // запомнить баланс торгового счета и вернуть его в исходное состояние // по завершению теста initialTestBalance = AccountInfo.Balance; historyStartoffPassed = false; OnRobotMessage -= LogRobotMessages; if (LogRobots) { OnRobotMessage += LogRobotMessages; } // получить от гроботов используемые тикеры и старт истории // роботы сами указывают используемые тикеры, плюс также берутся тикеры из параметра Graphics var usedTickers = GetUserTickersAndStartTime(); if (usedTickers.Count == 0) { Logger.DebugFormat("Бэк-тест портфеля из {0} роботов: не указаны используемые и торгуемые котировки", listRobots.Count); return(false); } if (UpdateTickerCache) { updateTickersCacheForRobots(usedTickers, 3); } // открыть файловые потоки testCursor = new BacktestTickerCursor(); // !! path !! var path = ExecutablePath.ExecPath + "\\quotes"; try { var cursorStart = usedTickers.Min(t => t.Value); if (!testCursor.SetupCursor(path, usedTickers.Keys.ToList(), cursorStart)) { testCursor.Close(); testCursor = null; Logger.DebugFormat( "Бэк-тест портфеля из {0} роботов: не удалось установить курсор, путь \"{1}\"", listRobots.Count, path); return(false); } } catch (Exception ex) { if (testCursor != null) { testCursor.Close(); } testCursor = null; Logger.Error("Ошибка в SetupTest", ex); return(false); } return(true); }