/// <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");
        }