/// <summary>
        /// Метод смены оптимизатора
        /// </summary>
        /// <param name="optimiserName">Имя выбранного оптимизатора</param>
        /// <returns>true в слечае успеха</returns>
        public bool ChangeOptimiser(string optimiserName, string terminalName)
        {
            // Еслизапущен процесс оптимизации или же запущен терминалл - то не чего не делаем
            if (Optimiser != null &&
                (Optimiser.IsOptimisationInProcess || Optimiser.TerminalManager.IsActive))
            {
                return(false);
            }

            // Если текущий оптимизатор не пуст
            if (Optimiser != null)
            {
                // Отписываемся от событий прошлого оптимизатора
                Optimiser.ProcessStatus -= Optimiser_ProcessStatus;
                Optimiser.OptimisationProcessFinished -= Optimiser_OptimisationProcessFinished;
                Optimiser.ClearOptimiser();
                Optimiser.CloseSettingsWindow();

                // Создаем новый оптимизатор и копируем старый менеджер терминалла
                Optimiser = optimiserCreators.First(x => x.Name == optimiserName).Create(Optimiser.TerminalManager);
            }
            else
            {
                try
                {
                    // Создаем новый оптимизатор и создаем менеджер терминалла
                    Optimiser = optimiserCreators.First(x => x.Name == optimiserName)
                                .Create(new TerminalManager(terminalDirectory.Terminals.First(x => x.Name == terminalName)));
                }
                catch (Exception e)
                {
                    // В случае ошибки - переадресоввываем её текст в графический интерфейс
                    ThrowException(e.Message);
                    return(false);
                }
            }

            // Подписываемся на события нового оптимизатора
            Optimiser.ProcessStatus += Optimiser_ProcessStatus;
            Optimiser.OptimisationProcessFinished += Optimiser_OptimisationProcessFinished;
            return(true);
        }
        /// <summary>
        /// Коллбек окончания процеса оптимизации
        /// </summary>
        /// <param name="obj">Оптимизатор</param>
        private void Optimiser_OptimisationProcessFinished(IOptimiser optimiser)
        {
            DirectoryInfo cachDir = optimiser.TerminalManager.TerminalChangeableDirectory
                                    .GetDirectory("Tester")
                                    .GetDirectory("cache", true);

            workingDirectory.Tester.GetDirectory("cache", true).GetFiles().ToList()
            .ForEach(x =>
            {
                string path = Path.Combine(cachDir.FullName, x.Name);
                if (!File.Exists(path))
                {
                    x.MoveTo(path);
                }
            });

            SaveOptimisations(optimiser);
            if (LoadingOptimisationTougle)
            {
                LoadSavedOptimisation(optimiser.OptimiserWorkingDirectory);
            }
            OptimisationStoped();
            Optimiser.ClearOptimiser();
        }
        private void StartOptimisation(OptimiserInputData optimiserInputData, bool isAppend, string dirPrefix)
        {
            if ((optimiserInputData.HistoryBorders.Count == 0 && optimiserInputData.ForwardBorders.Count == 0))
            {
                ThrowException("Fill in date borders");
                OnPropertyChanged("ResumeEnablingTogle");
                return;
            }

            if (Optimiser.TerminalManager.IsActive)
            {
                ThrowException("Terminal already running");
                return;
            }

            if (optimiserInputData.OptimisationMode == ENUM_OptimisationMode.Disabled)
            {
                StartTest(optimiserInputData);
                return;
            }

            if (!isAppend)
            {
                var dir = workingDirectory.GetOptimisationDirectory(optimiserInputData.Symb,
                                                                    Path.GetFileNameWithoutExtension(optimiserInputData.RelativePathToBot),
                                                                    dirPrefix, Optimiser.Name);
                List <FileInfo> data = dir.GetFiles().ToList();
                data.ForEach(x => x.Delete());
                List <DirectoryInfo> dirData = dir.GetDirectories().ToList();
                dirData.ForEach(x => x.Delete());
            }

            Optimiser.CloseSettingsWindow();

            try
            {
                DirectoryInfo cachDir = Optimiser.TerminalManager.TerminalChangeableDirectory
                                        .GetDirectory("Tester")
                                        .GetDirectory("cache", true);
                DirectoryInfo cacheCopy = workingDirectory.Tester.GetDirectory("cache", true);
                cacheCopy.GetFiles().ToList().ForEach(x => x.Delete());
                cachDir.GetFiles().ToList()
                .ForEach(x => x.MoveTo(Path.Combine(cacheCopy.FullName, x.Name)));

                ClearResults();
                Optimiser.ClearOptimiser();

                int ind = optimiserInputData.BotParams.FindIndex(x => x.Variable == Fixed_Input_Settings.Params[InputParamName.CloseTerminalFromBot]);
                if (ind > -1)
                {
                    var item = optimiserInputData.BotParams[ind];
                    item.Value      = "true";
                    item.IsOptimize = false;
                    optimiserInputData.BotParams[ind] = item;
                }
                var botParams = optimiserInputData.BotParams.ToList(); // Copy expert settings

                Optimiser.Start(optimiserInputData,
                                Path.Combine(terminalDirectory.Common.FullName,
                                             $"{Path.GetFileNameWithoutExtension(optimiserInputData.RelativePathToBot)}_Report.xml"), dirPrefix);

                SetFileManager fileManager = new SetFileManager(
                    Path.Combine(workingDirectory.GetOptimisationDirectory(optimiserInputData.Symb,
                                                                           Path.GetFileNameWithoutExtension(optimiserInputData.RelativePathToBot),
                                                                           dirPrefix, Optimiser.Name).FullName, "OptimisationSettings.set"), true)
                {
                    Params = botParams
                };
                fileManager.SaveParams();

                Optimiser.TerminalManager.WaitForStop();
            }
            catch (Exception e)
            {
                Optimiser.Stop();
                throw e;
            }
        }