文章 "连续前行优化 (第八部分): 程序改进和修复" - 页 3

 
fxsaber:
我请求作者录制一段视频,展示这个项目的不同用途。

如果您有时间的话。但总的来说,您的要求有点出乎我的意料,因为从第一篇文章开始,您就看到了我发表的文章(虽然可能并没有全部关注)。

 

您好、

这个项目太棒了,非常感谢

我在编译DealHistoryGetter.mqh 时 遇到一个问题,错误信息是: "calcContracts" - 成员函数 未定义 ,第 488 行。


再次感谢您。

 

您好、

这个项目太棒了,非常感谢

我在编译DealHistoryGetter.mqh 时 遇到一个问题 错误信息是: " calcContracts" - 成员函数 未定义 ,第 488


再次感谢您。

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:

你好

了不起的项目,非常感谢

我在编译DealHistoryGetter.mqh 时 遇到一个问题 错误信息是: " calcContracts" - 成员函数 未定义 ,第 488


再次感谢您。

你好,我最近编译了使用该文件的专家程序,一切正常。

 
如果我编译您从专家顾问发送的名为 "新上传变体 "的 .mq5 文件,就会出现很多错误,如下图所示。我刚刚下载了最新发布的版本(第 8 篇文章)。

我该如何解决这个问题?



 

你好,安德烈。我决定重返寻找圣杯的旅程,很高兴发现您的优化器已投入使用并最终定稿。完全建立在 Mql5 基础上的解决方案对作者的支持要求很高,结果出了问题。只要有 C#,您的优化器就能正常工作,MT5 中的策略测试窗口将保持不变。奇怪的是,没有大众对前向优化的 需求。无论如何,非常感谢你们的辛勤工作!


测试仪已经在工作了,但我还是想表达一些愿望。
1. 我希望在有结果的表头有带解释的工具提示。什么是:var 90、var 95、mx....
2. "结果 "选项卡窗口 1 和 3 中的 PL 和 DD 值不匹配。
3. OnTester()函数没有编译,因为它是在优化器文件中定义的,所以完全自定义的标准被取消了。
4. 没有平衡图表怎么行?没有平衡图表怎么行?您可以将所有前锋粘合在一起,在测试仪上运行,或者在优化器窗口中显示粗略图表,以评估 EA 是否值得继续浪费时间。至少,优化器应该显示所有前向传递的最终结果。
5. 以点为单位计算利润是必要的。特别是考虑到测试器如何使用加密货币。添加一个复选框。
6.最后,我想梦想一下添加多个 TF 的可能性。类似于添加多个资产的可能性。
好吧,还有很多很多钱....。

 
Good Beer 优化的 需求。无论如何,非常感谢你们的劳动!


测试仪已经在工作了,但我还是要表达一些愿望。
1. 我希望在有结果的表头有带解释的工具提示。什么是:var 90、var 95、mx....
2. "结果 "选项卡窗口 1 和 3 中的 PL 和 DD 值不匹配。
3. OnTester()函数没有编译,因为它是在优化器文件中定义的,所以完全自定义的标准被取消了。
4. 没有平衡图表怎么行?没有平衡图表怎么行?您可以将所有前锋粘合在一起,在测试仪上运行,或者在优化器窗口中显示粗略图表,以评估 EA 是否值得继续浪费时间。至少,优化器应该显示所有前向传递的最终结果。
5. 以点为单位计算利润是必要的。特别是考虑到测试器如何使用加密货币。添加一个复选框。
6.最后,我想梦想一下添加多个 TF 的可能性。类似于添加多个资产的可能性。
好吧,还有很多很多钱....。

感谢您的反馈,我不支持这个项目,但它应该可以长期运行。

如果有人想完善、调整这个项目--那就去做)
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 #:
如果我编译您从专家顾问发送的名为 "新上传变体 "的 .mq5 文件,就会出现很多错误,如下图所示。我刚刚下载了最新发布的版本(第 8 篇文章)。 我该如何解决这个问题? 致 谢







那么。下载文章所附的压缩包,查看其中的两个文件夹:

So.我们下载了文章所附的压缩包,看到其中有两个文件夹:


将存档中的 MetaTrader-Auto-Optimiser 文件夹移至 MetaTrader 5 所在的根目录:

将存档中的 MetaTrader-Auto-Optimiser 文件夹移至 MetaTrader 5 所在的根目录:


存档中的 MQL5 文件夹中有两个文件夹 - 将其复制到终端的 MQL5 文件夹中。相应地,测试专家文件夹将复制到 MQL5 文件夹,两个文件夹:CustomGeneric 和 History manager 将复制到 MQL5 文件夹。

在 Experts\Test Expert\New 上传变体文件夹中编译 SimpleMA.mq5 文件:

存档中有两个文件夹,位于 MQL5 文件夹中 - 将它们复制到您终端的 MQL5 文件夹中。

编译位于 Experts\Test Expert\New uploading variant 文件夹中的 SimpleMA.mq5 文件:


我们得到 100 个错误和 60 个警告:

我们得到 100 个错误和 60 个警告


让我们继续处理第一个错误,看看它是不是一个封闭的导入:

我们继续查看第一个错误,发现这不是一个关闭的导入:


双击关于该错误的说明,并在出现错误的一行找到文件 UploadersEntities.mqh:

双击有关该错误的说明,并进入有该错误行的 UploadersEntities.mqh 文件:


我们看到了什么?我们看到确实没有关闭导入。让我们修复 它:

我们看到了什么?And we see really not closed import.我们修复 它:

//+------------------------------------------------------------------+
//|上传者实体。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];
  };
//+------------------------------------------------------------------+

再次编译。导入错误消失了,但现在编译器看不到导入文件中的函数和方法:

再次编译。导入错误消失了,但现在编译器看不到导入文件中的函数和方法:


请记住,我们是从第三方 dll 中导入方法和类的。它应该位于 MQL5/Libraries 文件夹中。

打开从压缩包复制到 MetaTrader 5 根目录下的 MetaTrader-Auto-Optimiser 文件夹。我们可以在其中看到 Metatrader Auto Optimiser.sln 文件:

我们记得,我们是从第三方 dll 中导入方法和类的。

打开从压缩包复制到 MetaTrader 5 根目录的 MetaTrader-Auto-Optimiser 文件夹。我们会在其中看到 Metatrader Auto Optimiser.sln 文件:


双击该文件,在 MS Visual Studio 中打开项目。

打开该项目后,我们会发现它适用于过时的平台:

双击该文件,在 MS Visual Studio 中打开项目。

打开项目时,我们会发现它适用于过时的平台:


选中 "将目标升级到 .NET Framefork 4.8 平台 "复选框,然后点击 "继续 "按钮。

然后再查看第二个项目:

保留 "将目标升级到 .NET Framefork 4.8 平台 "复选框,然后单击 "继续 "按钮。

,然后再次加载第二个项目:


加载项目后,选择 "Release(发布)",然后选择 "Any CPU":

加载项目后,选择 "Release"(发布)和 Any CPU:


然后按 Ctrl+F5 来编译和构建项目。

在 MS Visual Studio 中编译完项目后,转到终端的根目录,并在其中的 \MetaTrader-AutoOptimiser\ReportManager\bin\Release 文件夹中。将该文件夹中已构建的 ReportManager.dll 库文件复制到终端的 MQL5/Libraries 目录中。

现在再次编译 MQL5\Experts\Test Expert\New uploading variant 文件夹中的 SimpleMA.mq5 文件。

完成,没有错误:

然后按 Ctrl+F5 来编译和构建项目。

在 MS Visual Studio 中编译项目后,转到终端的根目录,并在其中转到 \MetaTrader-Auto-Optimiser\ReportManager\bin\Release 文件夹。

现在让我们再次从 MQL5\Experts\Test Expert\New uploading variant 文件夹中编译 SimpleMA.mq5 文件。

完成,没有错误:


尽情享受

附加的文件:
 
Artyom Trishkin #:

那么。下载文章所附的压缩包,可以看到其中有两个文件夹:

所以。我们下载文章所附的存档,看到其中有两个文件夹:


将存档中的 MetaTrader-Auto-Optimiser 文件夹转移到 MetaTrader 5 所在的根目录下:

将存档中的 MetaTrader-Auto-Optimiser 文件夹移至 MetaTrader 5 所在的根目录:


存档中的 MQL5 文件夹中有两个文件夹 - 将其复制到终端的 MQL5 文件夹中。相应地,测试专家文件夹将复制到 MQL5 文件夹,两个文件夹:CustomGeneric 和 History Manager 将复制到 MQL5 文件夹。

编译位于 Experts\Test Expert\New 上传变体文件夹中的 SimpleMA.mq5 文件:

存档中有两个文件夹,位于 MQL5 文件夹中 - 将它们复制到终端的 MQL5 文件夹中。

编译位于 Experts\Test Expert\New uploading variant 文件夹中的 SimpleMA.mq5 文件:


我们得到 100 个错误和 60 个警告:

我们得到 100 个错误和 60 个警告


查看第一个错误,发现它不是一个封闭的导入:

让我们继续查看第一个错误,看看这是不是一个封闭的导入:


谢谢,更新了文章所附的来源