Beispiel #1
0
        public void RunTrainingIteration(INetwork localNetwork, IOptimiser localOptimiser, IRegistry localRegistry, IComputationHandler handler)
        {
            if (localNetwork == null)
            {
                throw new ArgumentNullException(nameof(localNetwork));
            }
            if (localOptimiser == null)
            {
                throw new ArgumentNullException(nameof(localOptimiser));
            }
            if (localRegistry == null)
            {
                throw new ArgumentNullException(nameof(localRegistry));
            }
            if (handler == null)
            {
                throw new ArgumentNullException(nameof(handler));
            }

            CheckInitialised();

            localOptimiser.PrepareRun(localNetwork, handler);
            localNetwork.Run(handler, trainingPass: true);
            localOptimiser.Run(localNetwork, handler);
            ApplyValueModifiers(localRegistry, handler);
        }
Beispiel #2
0
        /// <summary>
        /// Deep copy this object.
        /// </summary>
        /// <returns>A deep copy of this object.</returns>
        public object DeepCopy()
        {
            IOptimiser copy = ShallowCopy();

            copy.Registry.AddAll((IDictionary <string, object>)copy.Registry.DeepCopy());

            return(copy);
        }
Beispiel #3
0
 public HillClimber(int NeighbourHoodSize, int gPopSize, int Dim, OptimisationFunctionSet func, IOptimiser optimiser)
 {
     NeighbourhoodSize = NeighbourHoodSize;
     GuessedPopSize    = gPopSize;
     Dimension         = Dim;
     Functions         = func;
     Optimiser         = optimiser;
 }
Beispiel #4
0
        /// <summary>
        /// Get a shallow copy of this optimiser with the same parameters (etc. learning / decay rates, filters).
        /// </summary>
        /// <returns>A shallow copy of this optimiser.</returns>
        public IOptimiser ShallowCopy()
        {
            IOptimiser    copy        = ShallowCopyParameters();
            ISet <string> filterMasks = Registry.Get <ISet <string> >("filter_masks");

            foreach (string filterMask in filterMasks)
            {
                copy.AddFilter(filterMask);
            }

            return(copy);
        }
        /// <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();
        }
        /// <summary>
        /// Метод созраняющий оптимизации в локальной директории
        /// </summary>
        /// <param name="optimiser">Оптимизатор</param>
        private void SaveOptimisations(IOptimiser optimiser)
        {
            // Проверка на существование имени директории с оптимизациями
            if (string.IsNullOrEmpty(optimiser.OptimiserWorkingDirectory) ||
                string.IsNullOrWhiteSpace(optimiser.OptimiserWorkingDirectory))
            {
                return;
            }

            // Создаем массивы с результатами оптимизации
            List <OptimisationResult> AllOptimisationResults = new List <OptimisationResult>();
            List <OptimisationResult> ForwardOptimisations   = new List <OptimisationResult>();
            List <OptimisationResult> HistoryOptimisations   = new List <OptimisationResult>();

            // Получаем список всех файлов с расширением (*.xml) в локальной директории с оптимизациями
            List <FileInfo> files = Directory.GetFiles(optimiser.OptimiserWorkingDirectory, "*.xml").Select(x => new FileInfo(x)).ToList();

            // Вложенная функция заполняющая созданные выше массивы ранее созраненными результатами оптимизации
            // Работает лишь если мы дополняем существующие, в случае когда мы перезаписываем старые результаты - не вызывается
            bool FillIn(List <OptimisationResult> results, IEnumerable <DateBorders> currentBorders, string fileName)
            {
                // Заполнение массива и получение имени эксперкта, депозита, валюты депозита и плеча
                results.AddRange(GetItems(files.Find(x => x.Name == fileName),
                                          out string expert, out double deposit, out string currency, out int laverage));

                // Проверка имени эксперта, депозита, валюты депозита и плеча
                // на соответствие заданным при старте текущей оптимищации оптимизации
                if (expert != optimiser.PathToBot || deposit != optimiser.Balance ||
                    currency != optimiser.Currency || laverage != optimiser.Laverage)
                {
                    System.Windows.MessageBox.Show("Can`t append data into files with different optimiser settings (path to bot / balance / currency / laverage)");
                    return(false);
                }

                // Отчищаем из старых массивов те резальтаты что соответствующи датам уже имеющимся в новой оптимизации
                foreach (var item in currentBorders)
                {
                    results.RemoveAll(x => x.report.DateBorders == item);
                }

                return(true);
            }

            // Задаем шаг обновления Прогресс бара
            double step = 100.0 / 4;

            // Если существуют все 3 файла с оптимизациями в локальной директории с оптимизаациями
            // заполняем их через описанную выше локальную функцию
            if (files.Any(x => x.Name == "Report.xml") &&
                files.Any(x => x.Name == "History.xml") &&
                files.Any(x => x.Name == "Forward.xml"))
            {
                PBUpdate("Reading files", step);
                if (!FillIn(AllOptimisationResults, optimiser.AllOptimisationResults.Select(x => x.report.DateBorders).Distinct(), "Report.xml"))
                {
                    return;
                }
                if (!FillIn(ForwardOptimisations, optimiser.ForwardOptimisations.Select(x => x.report.DateBorders).Distinct(), "Forward.xml"))
                {
                    return;
                }
                if (!FillIn(HistoryOptimisations, optimiser.HistoryOptimisations.Select(x => x.report.DateBorders).Distinct(), "History.xml"))
                {
                    return;
                }
            }
            else
            {
                PBUpdate("Saving files", step);
            }
            // Учаляем все (*xml) файлы из локальной директории с файлами оптимизациями
            files.ForEach(x => x.Delete());

            // Копируем в локальные копии результатов оптимизации - все прооптимизированные результаты из оптимизатора
            AllOptimisationResults.AddRange(optimiser.AllOptimisationResults);
            HistoryOptimisations.AddRange(optimiser.HistoryOptimisations);
            ForwardOptimisations.AddRange(optimiser.ForwardOptimisations);

            // Локальная функция созраняющая результаты оптимизации в файл
            void WriteFile(List <OptimisationResult> results, string fileName)
            {
                results.ReportWriter(optimiser.PathToBot, optimiser.Currency, optimiser.Balance, optimiser.Laverage,
                                     Path.Combine(optimiser.OptimiserWorkingDirectory, fileName));
            }

            PBUpdate("Save All optimisations", step * 2);

            // Проверяем список всех проведенных оптимизаций и созраняем их если таковые были найдены
            if (AllOptimisationResults.Count > 0)
            {
                WriteFile(AllOptimisationResults, "Report.xml");
            }
            else
            {
                System.Windows.MessageBox.Show("There are no optimisation data to save");
                return;
            }

            // Создаем пустую запись оптимизации - нужна для того что бы что то бы созранить что то в файл
            var emptyItem = new OptimisationResult
            {
                report = new ReportManager.ReportItem
                {
                    BotParams   = new Dictionary <string, string>(),
                    DateBorders = new DateBorders(DTExtention.UnixEpoch, DTExtention.UnixEpoch.AddDays(1)),
                    OptimisationCoefficients = new Coefficients
                    {
                        TradingDays = new Dictionary <DayOfWeek, DailyData>
                        {
                            { DayOfWeek.Monday, new DailyData() },
                            { DayOfWeek.Tuesday, new DailyData() },
                            { DayOfWeek.Wednesday, new DailyData() },
                            { DayOfWeek.Thursday, new DailyData() },
                            { DayOfWeek.Friday, new DailyData() }
                        }
                    }
                }
            };

            // Созраняем пустую строку оптимизации если не было не одной оптимизации
            if (HistoryOptimisations.Count == 0)
            {
                HistoryOptimisations.Add(emptyItem);
            }
            if (ForwardOptimisations.Count == 0)
            {
                ForwardOptimisations.Add(emptyItem);
            }

            // Созраняем в файл рещультаты тестов форвардных и исторических
            PBUpdate("Save History tests", step * 3);
            WriteFile(HistoryOptimisations, "History.xml");

            PBUpdate("Save Forward tests", step * 4);
            WriteFile(ForwardOptimisations, "Forward.xml");
        }