Обсуждение статьи "Непрерывная скользящая оптимизация (Часть 8): Доработка программы и исправление найденных недочетов" - страница 3

 
fxsaber:
Прошу Автора записать видео, в котором видны различные варианты использования данного проекта.

Если будет время свободное. Но в целом просьба от Вас несколько неожиданна, Вы с самой первой статьи видели публикации мои (хотя возможно не за всеми из них следили).

 

Hello, 

Amazing project.  Thank you so much for this. 

I have a problem with compiling the DealHistoryGetter.mqh and the error message is:  'calcContracts' - member function not defined line 488.


Thank you very much again.

Documentation on MQL5: Constants, Enumerations and Structures / Named Constants / Predefined Macro Substitutions
Documentation on MQL5: Constants, Enumerations and Structures / Named Constants / Predefined Macro Substitutions
  • www.mql5.com
Predefined Macro Substitutions - Named Constants - Constants, Enumerations and Structures - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5
 
Franco87:

Hello, 

Amazing project.  Thank you so much for this. 

I have a problem with compiling the DealHistoryGetter.mqh and the error message is:  'calcContracts' - member function not defined line 488.


Thank you very much again.

Hello, I recently conpiled my expert that is using this file and everything was ok.

 
If i compile the .mq5 files you sent from your expert advisor named "New uploading variant" its showing a lot of errors as you can see in the image below. Ive just downloaded the lastest version posted (8th article).

What shoul i do to solve this?





Regards
 

Здравствуйте, Андрей. Я решил вернуться к поискам грааля и был рад найти ваш оптимизатор работающим и доработанным. Решения, собранные полностью на Mql5 оказались требовательны к поддержке автора и сошли с дистанции. А ваш оптимизатор будет работать пока есть С# и окно тестера стратегий в МТ5 будет неизменным. Странно, что нет массового спроса на бэк-форвард оптимизацию. В любом случае, огромное вам спасибо за труд!


Тестер уже рабочий, но я озвучу несколько пожеланий. Может даже кто другой продолжит доработку проекта и выложит в кодебазу.
1. Хотелось бы всплывающие подсказки с пояснениями, в заголовке таблиц с результатами. Что такое: var 90, var 95, mx....
2. Значения PL и DD в окнах 1 и 3 вкладки "results" не совпадают. Ну, и единицы измерения?
3. Функция OnTester() не компилируется, потому что определена в файлах оптимизатора, так что совсем кастомные критерии отменяются. Из стандартных программа позволяет набрать любой набор.
4. Как же без графиков баланса? Можно же склеить все форварды и запустить на тестере, напр. А лучше - грубый график в окне оптимизатора сразу, для оценки достойности советника дальнейшей траты времени. Как минимум, в оптимизаторе должен отряжаться итоговый результат всех форвард-проходов.
5. Расчёт прибыли в пипсах нужен. Особенно учитывая, как тестер работает с криптой. Добавить чекбокс.
6. Ну и напоследок, помечтаю о возможности добавления нескольких ТФ. Подобно возможности добавления нескольких активов.
Ну, и много, много денег....

 
Good Beer #:

Здравствуйте, Андрей. Я решил вернуться к поискам грааля и был рад найти ваш оптимизатор работающим и доработанным. Решения, собранные полностью на Mql5 оказались требовательны к поддержке автора и сошли с дистанции. А ваш оптимизатор будет работать пока есть С# и окно тестера стратегий в МТ5 будет неизменным. Странно, что нет массового спроса на бэк-форвард оптимизацию. В любом случае, огромное вам спасибо за труд!


Тестер уже рабочий, но я озвучу несколько пожеланий. Может даже кто другой продолжит доработку проекта и выложит в кодебазу.
1. Хотелось бы всплывающие подсказки с пояснениями, в заголовке таблиц с результатами. Что такое: var 90, var 95, mx....
2. Значения PL и DD в окнах 1 и 3 вкладки "results" не совпадают. Ну, и единицы измерения?
3. Функция OnTester() не компилируется, потому что определена в файлах оптимизатора, так что совсем кастомные критерии отменяются. Из стандартных программа позволяет набрать любой набор.
4. Как же без графиков баланса? Можно же склеить все форварды и запустить на тестере, напр. А лучше - грубый график в окне оптимизатора сразу, для оценки достойности советника дальнейшей траты времени. Как минимум, в оптимизаторе должен отряжаться итоговый результат всех форвард-проходов.
5. Расчёт прибыли в пипсах нужен. Особенно учитывая, как тестер работает с криптой. Добавить чекбокс.
6. Ну и напоследок, помечтаю о возможности добавления нескольких ТФ. Подобно возможности добавления нескольких активов.
Ну, и много, много денег....

Благодарю за отзыв, я не поддерживаю данный проект, но да он должен быть рабочим долгое время. 

Если у кого либо будет желание доработать, подправить  проект - то занимайтесь)
https://github.com/AndreyKrivcov/MetaTrader-Auto-Optimiser

GitHub - AndreyKrivcov/MetaTrader-Auto-Optimiser
GitHub - AndreyKrivcov/MetaTrader-Auto-Optimiser
  • AndreyKrivcov
  • github.com
Experts mast use class CAutoUploader (CustomInclude/History manager/AutoLoader.mqh)
 
EDUARDO RODRIGUES NASCIMENTO #:
If i compile the .mq5 files you sent from your expert advisor named "New uploading variant" its showing a lot of errors as you can see in the image below. Ive just downloaded the lastest version posted (8th article).

What shoul i do to solve this?





Regards

Итак. Загружаем себе архив, прилагаемый к статье и видим в нём две папки:

So. We download the archive attached to the article and see two folders in it:


Папку MetaTrader-Auto-Optimiser переносим из архива в корневой каталог, где расположен MetaTrader 5:

Move the MetaTrader-Auto-Optimiser folder from the archive to the root directory where MetaTrader 5 is located:


В архиве, в папке MQL5 лежат две папки - их копируем в папку MQL5 Вашего терминала. Соответственно - в папку MQL5\Experts будет скопирована папка Test Expert, а в папку MQL\Include будут скопированы две папки: CustomGeneric и History manager.

Компилируем файл SimpleMA.mq5, лежащий в папке Experts\Test Expert\New uploading variant:

There are two folders in the archive, in the MQL5 folder - copy them to the MQL5 folder of your terminal. Accordingly, the Test Expert folder will be copied to the MQL5\Experts folder, and two folders will be copied to the MQL\Include folder: CustomGeneric and History manager.

Compile the SimpleMA.mq5 file located in the Experts\Test Expert\New uploading variant folder:


Получаем 100 ошибок и 60 предупреждений:

We get 100 errors and 60 warnings:


Переходим к самой первой ошибке и видим, что это не закрытый импорт:

Let's move on to the very first error and see that this is not a closed import:


Дважды щёлкаем по надписи об ошибке и попадаем в файл UploadersEntities.mqh на строку с ошибкой:

Double-click on the inscription about the error and get into the UploadersEntities.mqh file on the line with the error:


Что видим? А видим действительно не закрытый импорт. Исправляем:

What do we see? And we see really not closed import. We fix:

//+------------------------------------------------------------------+
//|                                            UploadersEntities.mqh |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"

#include "ReportCreator.mqh"
#import "ReportManager.dll"
#import
//+------------------------------------------------------------------+
//| Структура хранящая данные по входным параметрам                  |
//+------------------------------------------------------------------+
struct BotParams
  {
   string            name,value;
  };

// Добавление нового значения к динамичесому массиву
#define ADD_TO_ARR(arr, value) \
{\
   int s = ArraySize(arr);\
   ArrayResize(arr,s+1,s+1);\
   arr[s] = value;\
}

// добавление нового параметра робота к динамическому массиву параметрв
#define APPEND_BOT_PARAM(Var,BotParamArr) \
{\
   BotParams param;\
   param.name = #Var;\
   param.value = (string)Var;\
   \
   ADD_TO_ARR(BotParamArr,param);\
}

//+------------------------------------------------------------------+
//| Функция копирующая список массивов                               |
//+------------------------------------------------------------------+
void CopyBotParams(BotParams &dest[], const BotParams &src[])
  {
   int total = ArraySize(src);
   for(int i=0; i<total; i++)
     {
      ADD_TO_ARR(dest,src[i]);
     }
  }

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double GetAverageCoef(CoefChartType type, CReportCreator &report_manager)
  {
   CoefChart_item coef_chart[];
   report_manager.GetCoefChart(false,type,coef_chart);

   double ans= 0;
   int total = ArraySize(coef_chart);
   for(int i=0; i<total; i++)
      ans+=coef_chart[i].coef;

   ArrayFree(coef_chart);
   return (ans/(double)total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string get_path_to_expert(void)
  {
   string arr[];
   StringSplit(MQLInfoString(MQL_PROGRAM_PATH),'\\',arr);
   string relative_dir=NULL;

   int total= ArraySize(arr);
   bool save= false;
   for(int i=0; i<total; i++)
     {
      if(save)
        {
         if(relative_dir== NULL)
            relative_dir=arr[i];
         else
            relative_dir+="\\"+arr[i];
        }

      if(StringCompare("Experts",arr[i])==0)
         save=true;
     }

   return relative_dir;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
typedef void(*TCallback)();
typedef double(*TCustomFilter)();
typedef int (*TOnTesterInit)();


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void EmptyCallback() {}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double EmptyCustomCoefCallback() {return 0;}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int EmptyOnTesterInit() {return(INIT_SUCCEEDED);}

enum ENUM_CALLBACK_TYPE
  {
   CB_ON_TICK,
   CB_ON_TESTER_DEINIT
  };

struct Data
  {
   int tf, // ReportItem.TF
       laverage, // ReportReader.Laverage
       totalTrades, // ReportItem.OptimisationCoefficients.TotalTrades
       totalProfitTrades, // ReportItem.OptimisationCoefficients.MaxPLDD.Profit.TotalTrades
       totalLooseTrades, // ReportItem.OptimisationCoefficients.MaxPLDD.DD.TotalTrades
       consecutiveWins, // ReportItem.OptimisationCoefficients.MaxPLDD.Profit.ConsecutivesTrades
       consequtiveLoose, // ReportItem.OptimisationCoefficients.MaxPLDD.DD.ConsecutivesTrades
       numberProfitTrades_mn, // ReportItem.OptimisationCoefficients.TradingDays[Mn].Profit.Trades
       numberProfitTrades_tu, // ReportItem.OptimisationCoefficients.TradingDays[Tu].Profit.Trades
       numberProfitTrades_we, // ReportItem.OptimisationCoefficients.TradingDays[We].Profit.Trades
       numberProfitTrades_th, // ReportItem.OptimisationCoefficients.TradingDays[Th].Profit.Trades
       numberProfitTrades_fr, // ReportItem.OptimisationCoefficients.TradingDays[Fr].Profit.Trades
       numberLooseTrades_mn, // ReportItem.OptimisationCoefficients.TradingDays[Mn].DD.Trades
       numberLooseTrades_tu, // ReportItem.OptimisationCoefficients.TradingDays[Tu].DD.Trades
       numberLooseTrades_we, // ReportItem.OptimisationCoefficients.TradingDays[We].DD.Trades
       numberLooseTrades_th, // ReportItem.OptimisationCoefficients.TradingDays[Th].DD.Trades
       numberLooseTrades_fr; // ReportItem.OptimisationCoefficients.TradingDays[Fr].DD.Trades
   ulong startDT, // ReportItem.DateBorders.From
         finishDT; // ReportItem.DateBorders.Till
   double payoff, // ReportItem.OptimisationCoefficients.Payoff
          profitFactor, // ReportItem.OptimisationCoefficients.ProfitFactor
          averageProfitFactor, // ReportItem.OptimisationCoefficients.AverageProfitFactor
          recoveryFactor, // ReportItem.OptimisationCoefficients.RecoveryFactor
          averageRecoveryFactor, // ReportItem.OptimisationCoefficients.AverageRecoveryFactor
          pl, // ReportItem.OptimisationCoefficients.PL
          dd, // ReportItem.OptimisationCoefficients.DD
          altmanZScore, // ReportItem.OptimisationCoefficients.AltmanZScore
          var_90, // ReportItem.OptimisationCoefficients.VaR.Q_90
          var_95, // ReportItem.OptimisationCoefficients.VaR.Q_95
          var_99, // ReportItem.OptimisationCoefficients.VaR.Q_99
          mx, // ReportItem.OptimisationCoefficients.VaR.Mx
          std, // ReportItem.OptimisationCoefficients.VaR.Std
          max_profit, // ReportItem.OptimisationCoefficients.MaxPLDD.Profit.Value
          max_dd, // ReportItem.OptimisationCoefficients.MaxPLDD.DD.Value
          averagePl_mn, // ReportItem.OptimisationCoefficients.TradingDays[Mn].Profit.Value
          averagePl_tu, // ReportItem.OptimisationCoefficients.TradingDays[Tu].Profit.Value
          averagePl_we, // ReportItem.OptimisationCoefficients.TradingDays[We].Profit.Value
          averagePl_th, // ReportItem.OptimisationCoefficients.TradingDays[Th].Profit.Value
          averagePl_fr, // ReportItem.OptimisationCoefficients.TradingDays[Fr].Profit.Value
          averageDd_mn, // ReportItem.OptimisationCoefficients.TradingDays[Mn].DD.Value
          averageDd_tu, // ReportItem.OptimisationCoefficients.TradingDays[Tu].DD.Value
          averageDd_we, // ReportItem.OptimisationCoefficients.TradingDays[We].DD.Value
          averageDd_th, // ReportItem.OptimisationCoefficients.TradingDays[Th].DD.Value
          averageDd_fr, // ReportItem.OptimisationCoefficients.TradingDays[Fr].DD.Value
          balance; // ReportReader.Balance
   char              currency[100];
  };
//+------------------------------------------------------------------+

Компилируем опять. Ошибка импорта ушла, но теперь компилятор не видит функций и методов из импортированного файла:

Let's compile again. The import error is gone, but now the compiler does not see the functions and methods from the imported file:


Вспоминаем, что мы импортируем методы и классы из сторонней dll. И она должна лежать в папке MQL5\Libraries.

Открываем папку MetaTrader-Auto-Optimiser, скопированную из архива в корневой каталог MetaTrader 5. Видим в ней файл Metatrader Auto Optimiser.sln:

We recall that we are importing methods and classes from a third-party dll. And it should be in the MQL5\Libraries folder.

Open the MetaTrader-Auto-Optimiser folder copied from the archive to the MetaTrader 5 root directory. We see the file Metatrader Auto Optimiser.sln in it:


Дважды щёлкаем по этому файлу, чтобы открыть проект в MS Visual Studio.

При открытии проекта видим, что он для устаревшей платформы:

Double click on this file to open the project in MS Visual Studio.

When opening the project, we see that it is for an outdated platform:


Оставляем флажок на "Обновить цель до платформы .NET Framefork 4.8" и жмём кнопку "Продолжить".

Далее ещё раз для второго проекта:

Leave the checkbox "Upgrade target to .NET Framefork 4.8 platform" and click the "Continue" button.

Then again for the second project:


После загрузки проектов выбираем "Релиз" и Any CPU:

After loading the projects, select "Release" and Any CPU:


И нажимаем Ctrl+F5 для компиляции и сборки проектов.

После компиляции проекта в MS Visual Studio идём в корневой каталог терминала и в нём в папку \MetaTrader-Auto-Optimiser\ReportManager\bin\Release. Копируем из этой папки файл собранной библиотеки ReportManager.dll в каталог терминала MQL5\Libraries.

Теперь опять компилируем файл SimpleMA.mq5 из папки MQL5\Experts\Test Expert\New uploading variant.

Готово, ошибок нет:

And press Ctrl+F5 to compile and build projects.

After compiling the project in MS Visual Studio, go to the root directory of the terminal and in it to the \MetaTrader-Auto-Optimiser\ReportManager\bin\Release folder. Copy the compiled library file ReportManager.dll from this folder to the MQL5\Libraries directory of the terminal.

Now let's compile the SimpleMA.mq5 file from the MQL5\Experts\Test Expert\New uploading variant folder again.

Done, no errors:


Enjoy

Файлы:
 
Artyom Trishkin #:

Итак. Загружаем себе архив, прилагаемый к статье и видим в нём две папки:

So. We download the archive attached to the article and see two folders in it:


Папку MetaTrader-Auto-Optimiser переносим из архива в корневой каталог, где расположен MetaTrader 5:

Move the MetaTrader-Auto-Optimiser folder from the archive to the root directory where MetaTrader 5 is located:


В архиве, в папке MQL5 лежат две папки - их копируем в папку MQL5 Вашего терминала. Соответственно - в папку MQL5\Experts будет скопирована папка Test Expert, а в папку MQL\Include будут скопированы две папки: CustomGeneric и History manager.

Компилируем файл SimpleMA.mq5, лежащий в папке Experts\Test Expert\New uploading variant:

There are two folders in the archive, in the MQL5 folder - copy them to the MQL5 folder of your terminal. Accordingly, the Test Expert folder will be copied to the MQL5\Experts folder, and two folders will be copied to the MQL\Include folder: CustomGeneric and History manager.

Compile the SimpleMA.mq5 file located in the Experts\Test Expert\New uploading variant folder:


Получаем 100 ошибок и 60 предупреждений:

We get 100 errors and 60 warnings:


Переходим к самой первой ошибке и видим, что это не закрытый импорт:

Let's move on to the very first error and see that this is not a closed import:


Спасибо, обновил исходники, приложенные к статье

Причина обращения: