第二十七章 处理优化结果

用于组织 策略测试器 中的优化结果的自定义处理的函数。它们可以在测试代理程序的优化期间调用,也可以在EA 和 脚本中本地调用。

在策略测试程序中运行EA交易时,可以根据 简单类型 或 简单结构(它们不包含字符串,类对象 或 动态数组对象)创建自己的数据数组。可以使用FrameAdd()函数在称为 帧 的特殊结构中保存此数据集。在优化EA交易期间,每个代理可以向终端发送一系列 帧。所有收到的 帧 都写在terminal.directory \ MQL5 \ Files \ Tester文件夹中名为EA的 * .MQD文件中。它们按照从代理处收到的顺序编写。从测试代理接收客户终端中的 帧 会生成TesterPass事件。

这些 帧 可以存储在计算机内存和指定名称的文件中。MQL5语言对帧数无设限。

函数 功能
FrameFirst 将读取 帧 的指针移动到开头并重置先前设置的过滤器
FrameFilter 设置 帧 读取过滤器并将指针移动到开头的位置
FrameNext 读取 帧 并移动指针到下一个
FrameInputs 接收形成 帧 的输入参数
FrameAdd 添加数据帧
ParameterGetRange 在 策略测试器 中优化EA时,接收 输入变量 的取值范围和更改步骤的数据
ParameterSetRange 在 策略测试器 中优化EA时,设置 输入变量 的取值范围和更改步骤的数据

相关参考 测试统计, 运行MQL5 程序的属性

# 27.1 FrameFirst

将读取 帧 的指针移动到开头并重置先前设置的过滤器

bool FrameFirst();

返回值

如果成功返回 true,否则 false。想获得有关错误的详细信息,可调用 GetLastError() 函数。

# 27.2 FrameFilter

设置 帧 读取过滤器并将指针移动到开头的位置

bool  FrameFilter( 
   const string  name,         // 公共名称/标签 
   long          id            // 公共 ID 
   );
1
2
3
4

返回值

如果成功返回 true,否则 false。想获得有关错误的详细信息,可调用 GetLastError() 函数。

注意

如果传递给第一个形式参数(name) 的值为 空字符串,那么过滤器将只处理数值参数,例如只能查看指定id的帧。如果第二个形式参数的值是ULONG_MAX,那么只有文本过滤器工作。

例:调用 FrameFilter("", ULONG_MAX) 相当于调用 FrameFirst(),表示不使用任何过滤器。

# 27.3 FrameNext

读取 帧 并移动指针到下一个。此函数有2个版本。

  1. 调用接收一个数值
bool  FrameNext( 
   ulong&   pass,      // 添加帧时的优化传递数 
   string&  name,      // 公共名称/标签 
   long&    id,        // 公共 ID 
   double&  value      // 值 
   );
1
2
3
4
5
6
  1. 调用接收 帧 的所有数据
bool  FrameNext( 
   ulong&   pass,      // 添加帧时的优化传递数 
   string&  name,      // 公共名称/标签 
   long&    id,        // 公共 ID 
   double&  value,     // 值 
   void&    data[]     // 任何类型的数组 
   );
1
2
3
4
5
6
7

参数

pass

[out] 策略测试器 中优化期间的传递的次数。

name

[out] 标识符名称。

id

[out] 标识符的值。

value

[out] 单一数值。

data

[out] 任何类型的数组。

返回值

如果成功返回 true,否则 false。想获得有关错误的详细信息,可调用 GetLastError() 函数。

注意

用第二个版本调用时,您必须正确处理data[]数组中接收的数据。

# 27.4 FrameInputs

接收形成 帧 的输入参数

bool  FrameInputs( 
   ulong    pass,                // 优化传递数 
   string&  parameters[],        // 形成"parameterN=valueN"字符串的数组  
   uint&    parameters_count     // 参数总数 
   );
1
2
3
4
5

参数

pass

[out] 策略测试器 中优化期间的传递的次数。

parameters

[out] 描述名称和参数值的字符串数组。

parameters_count

[out] 数组parameters[]的元素数量。

返回值

如果成功返回 true,否则 false。想获得有关错误的详细信息,可调用 GetLastError() 函数。

注意

获得parameters[]数组中的parameters_count字符串数以后,您可以通过所有记录组织一个循环。这将帮您找到指定传递数的EA输入参数的值。

# 27.5 FrameAdd

添加数据帧。此函数有2个版本。

  1. 添加文件数据
bool  FrameAdd( 
   const string  name,        // 公共名称/标签 
   long          id,          // 公共 ID 
   double        value,       // 值 
   const string  filename     // 数据文件的名称 
   );
1
2
3
4
5
6
  1. 添加任何类型数组的数据
bool  FrameAdd( 
   const string  name,        // 公共名称/标签 
   long          id,          // 公共 ID 
   double        value,       // 值 
   const void&   data[]       // 任何类型的数组 
   );
1
2
3
4
5
6

参数

name

[in] 公共帧标签。它可以被用于FrameFilter()函数的过滤器。

id

[in] 帧的公共标识符。它可以被用于FrameFilter()函数的过滤器。

value

[in] 写入帧的数值。它被用来发送像OnTester()函数的单一传递结果。

filename

[in] 包含添加到帧的数据的文件名称。文件必须位于MQL5/Files文件夹。

data

[in] 写入帧的任何类型的数组。通过引用传递。

返回值

如果成功返回 true,否则 false。想获得有关错误的详细信息,可调用 GetLastError() 函数。

# 27.6 ParameterGetRange

在 策略测试器 中优化EA时,接收 输入变量 的取值范围和更改步骤的数据。此函数有2个版本。

  1. 接收整型输入参数的数据
bool  ParameterGetRange( 
   const string  name,          // 参数 (输入变量) 名称 
   bool&         enable,        // 启用参数优化 
   long&         value,         // 参数值 
   long&         start,         // 初始值 
   long&         step,          // 改变步骤 
   long&         stop           // 最终值 
   );
1
2
3
4
5
6
7
8
  1. 接收真实类型输入参数的数据vv
bool  ParameterGetRange( 
   const string  name,          // 参数(输入变量)名称 
   double&       enable,        // 启用参数优化 
   double&       value,         // 参数值 
   double&       start,         // 初始值 
   double&       step,          // 改变步骤 
   double&       stop           // 最终值 
   );
1
2
3
4
5
6
7
8

参数

name

[in] 输入变量 ID。这些变量是应用程序的外部参数。它们的值可以在启动图表时 或 单一测试时指定。

enable

[out] 策略测试优化期间,该参数可以用于枚举值的标识。

value

[out] 参数值。

start

[out] 优化期间的初始参数值。

step

[out] 枚举值时的参数变换步骤。

stop

[out] 优化期间的最终参数值。

返回值

如果成功返回 true,否则 false。想获得有关错误的详细信息,可调用 GetLastError() 函数。

注意

函数仅能从 OnTesterInit(), OnTesterPass() 和 OnTesterDeinit() 处理程序调用。它已被引入接收EA输入参数值和策略测试优化期间的变量范围。

当调用OnTesterInit()时,获得的数据可以通过ParameterSetRange()函数被用于重新定义任何输入变量的枚举规则。因此,可以设置新的Start,Stop 和 Step值并且无论策略测试如何设置,输入参数甚至可以完全脱离优化。这可以使您根据EA交易的关键参数值,通过排除一些优化参数,管理优化输入参数的区域。

例如:

#property description "Expert Advisor for ParameterGetRange() function demonstration." 
#property description "Should be launched in the optimization mode of the Strategy Tester" 
//--- 输入参数 
input int                 Input1=1; 
input double              Input2=2.0; 
input bool                Input3=false; 
input ENUM_DAY_OF_WEEK    Input4=SUNDAY;
 
//+------------------------------------------------------------------+ 
//| 专家初始化函数                                                     | 
//+------------------------------------------------------------------+ 
int OnInit() 
  { 
//--- EA是只为策略测试操作而设计的 
   if(!MQL5InfoInteger(MQL5_OPTIMIZATION)) 
     { 
      MessageBox("Should be launched in the optimization mode of the Strategy Tester!"); 
      //--- 提前完成EA操作并从图表删除 
      return(INIT_FAILED); 
     } 
//--- 成功完成初始化 
   return(INIT_SUCCEEDED); 
  } 
//+------------------------------------------------------------------+ 
//| TesterInit 函数                                                   | 
//+------------------------------------------------------------------+ 
void OnTesterInit() 
  { 
//--- 长整型输入参数的示例 
   string name="Input1"; 
   bool enable; 
   long par1,par1_start,par1_step,par1_stop; 
   ParameterGetRange(name,enable,par1,par1_start,par1_step,par1_stop); 
   Print("First parameter"); 
   PrintFormat("%s=%d  enable=%s  from %d to %d with step=%d", 
               name,par1,(string)enable,par1_start,par1_stop,par1_step); 
//--- 双精度型输入参数的示例 
   name="Input2"; 
   double par2,par2_start,par2_step,par2_stop; 
   ParameterGetRange(name,enable,par2,par2_start,par2_step,par2_stop); 
   Print("Second parameter"); 
   PrintFormat("%s=%G  enable=%s  from %G to %G with step=%G", 
               name,par2,(string)enable,par2_start,par2_stop,par2_step);
 
//--- 布尔型输入参数的示例 
   name="Input3"; 
   long par3,par3_start,par3_step,par3_stop; 
   ParameterGetRange(name,enable,par3,par3_start,par3_step,par3_stop); 
   Print("Third parameter"); 
   PrintFormat("%s=%s  enable=%s  from %s to %s", 
               name,(string)par3,(string)enable, 
               (string)par3_start,(string)par3_stop); 
//--- 枚举型输入参数的示例 
   name="Input4"; 
   long par4,par4_start,par4_step,par4_stop; 
   ParameterGetRange(name,enable,par4,par4_start,par4_step,par4_stop); 
   Print("Fourth parameter"); 
   PrintFormat("%s=%s  enable=%s  from %s to %s", 
               name,EnumToString((ENUM_DAY_OF_WEEK)par4),(string)enable, 
               EnumToString((ENUM_DAY_OF_WEEK)par4_start), 
               EnumToString((ENUM_DAY_OF_WEEK)par4_stop)); 
  } 
//+------------------------------------------------------------------+ 
//| TesterDeinit函数                                                 | 
//+------------------------------------------------------------------+ 
void OnTesterDeinit() 
  { 
//--- 优化完成后将会显示该信息 
   Print(__FUNCTION__," Optimization completed"); 
  }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70

# 27.7 ParameterSetRange

在 策略测试器 中优化EA时,设置 输入变量 的取值范围和更改步骤的数据。此函数有2个版本。

  1. 指定整型输入参数的数据
bool  ParameterSetRange( 
   const string  name,          // 参数 (输入变量) 名称 
   bool          enable,        // 启用参数优化 
   long          value,         // 参数值 
   long          start,         // 初始值 
   long          step,          // 改变步骤 
   long          stop           // 最终值 
   );
1
2
3
4
5
6
7
8
  1. 指定真实类型输入参数的数据
bool  ParameterSetRange( 
   const string  name,          // 参数(输入变量)名称 
   double        enable,        // 启用参数优化 
   double        value,         // 参数值 
   double        start,         // 初始值 
   double        step,          // 改变步骤 
   double        stop           // 最终值 
   );
1
2
3
4
5
6
7
8

参数

name

[in] 输入或sinput 变量 ID。这些变量是应用程序的外部参数。它们的值可以在启动程序时指定。

enable

v[in] 在策略测试优化期间启用该参数以枚举值。

value

[in] 参数值。

start

[in] 优化期间的初始参数值。

step

[in] 枚举值时的参数变换步骤。

stop

[in] 优化期间的最终参数值。

返回值

如果成功返回 true,否则 false。想获得有关错误的详细信息,可调用 GetLastError() 函数。

注意

从策略测试启动优化时,函数仅能从 OnTesterInit() 处理程序调用。它专为指定参数范围和变换步骤而设计的。参数可以从优化完全脱离,而无论策略测试如何设置。它也允许使用优化进程中sinput标识符声明的变量。

根据关键参数值,ParameterSetRange() 函数允许您管理策略测试的EA优化,包括或不包括所需的优化输入参数和设置所需的范围和变换步骤。