/// <summary> /// Clear fields with optimisations /// </summary> void ClearOptimisationFields() { if (HistoryOptimisations.Count > 0) { dispatcher.Invoke(() => HistoryOptimisations.Clear()); } if (ForwardOptimisations.Count > 0) { dispatcher.Invoke(() => ForwardOptimisations.Clear()); } if (AllOptimisationResults.AllOptimisationResults.Count > 0) { AllOptimisationResults.AllOptimisationResults.Clear(); AllOptimisationResults = new ReportData { AllOptimisationResults = new Dictionary <DateBorders, List <OptimisationResult> >() }; } GC.Collect(); }
/// <summary> /// Загрузка оптимизаций из файлов /// </summary> /// <param name="optimisationName">Имя директории с оптимизациями</param> public async void LoadSavedOptimisation(string optimisationName) { double step = 100.0 / 4.0; // Выбор директории с оптимизациями DirectoryInfo selectedDir = workingDirectory.Reports.GetDirectory(optimisationName); // Проверка директории на существование #region Check if (selectedDir == null) { ThrowException("Can`t get directory"); return; } #endregion // Отчистка ранее созраненных результатов ClearOptimisationFields(); // ЗАпуск вторичного потока с загрузкой результатов из файлов await Task.Run(() => { try { PBUpdate("Getting files", step); // Получаем список файлов с расширением (*xml) FileInfo[] files = selectedDir.GetFiles("*.xml"); // Если существуют все 3 файла - загружаем оптимизации if (files.Any(x => x.Name == "Report.xml") && files.Any(x => x.Name == "History.xml") && files.Any(x => x.Name == "Forward.xml")) { // Создаем новый отчет всех прозведенных оптимизаций ReportData reportData = new ReportData { AllOptimisationResults = new Dictionary <DateBorders, List <OptimisationResult> >() }; PBUpdate("Results.xml", step * 2); // Читаем файл со всеми произведенными оптимизациями и занвсим результаты в соответствующие переменные List <OptimisationResult> report = GetItems(files.First(x => x.Name == "Report.xml"), out string expert, out double deposit, out string currency, out int laverage); reportData.Expert = expert; reportData.Deposit = deposit; reportData.Currency = currency; reportData.Laverage = laverage; #region Check // Локальная функция проверяющая верность настроек тестера для всех файлов void CompareTestersettings() { if (expert != reportData.Expert) { throw new Exception("Experts are different"); } if (deposit != reportData.Deposit) { throw new Exception("Deposits are different"); } if (currency != reportData.Currency) { throw new Exception("Currencies are different"); } if (laverage != reportData.Laverage) { throw new Exception("Lavreges are different"); } } // Проверяем существуют ли записи в файле с настройками оптимизаций if (report.Count == 0) { throw new Exception("File 'Report.xml' is empty or can`t be read"); } #endregion // Добавляем разбитую на даты историю оптимизаций из файла List <DateBorders> dates = report.Select(x => x.report.DateBorders).Distinct().ToList(); foreach (var item in dates) { reportData.AllOptimisationResults.Add(item, new List <OptimisationResult>(report.Where(x => x.report.DateBorders == item))); } // Созраняем прочтенную историю всех произведенных оптимизаций AllOptimisationResults = reportData; // СОзраняем историю исторических тестов и производим проверку на корректность настроек тестера PBUpdate("History.xml", step * 3); dispatcher.Invoke(() => GetItems(files.First(x => x.Name == "History.xml"), out expert, out deposit, out currency, out laverage).OrderBy(x => x.report.DateBorders) .ToList().ForEach(x => HistoryOptimisations.Add(x))); #region Check CompareTestersettings(); #endregion // СОзраняем историю форвардных тестов и производим проверку на корректность настроек тестера PBUpdate("Forward.xml", step * 4); dispatcher.Invoke(() => GetItems(files.First(x => x.Name == "Forward.xml"), out expert, out deposit, out currency, out laverage).OrderBy(x => x.report.DateBorders) .ToList().ForEach(x => ForwardOptimisations.Add(x))); #region Check CompareTestersettings(); if (HistoryOptimisations.Count == 0) { throw new Exception("File 'History.xml' is empty or can`t be read"); } if (ForwardOptimisations.Count == 0) { throw new Exception("File 'Forward.xml' is empty or can`t be read"); } /* * foreach (var item in ForwardOptimisations) * { * if (!HistoryOptimisations.Contains(item) && item.report.BotParams.Count > 0) * throw new Exception("Can`t find forward item in History Optimisations array"); * }*/ #endregion } } catch (Exception e) { // В случае ошибки все чистим ClearOptimisationFields(); ThrowException(e.Message); } }); PBUpdate(null, 0); // Информируем графику о произведенной перезаписи результатов оптимизации OnPropertyChanged("AllOptimisationResults"); }