第二十七章 处理优化结果
用于组织 策略测试器 中的优化结果的自定义处理的函数。它们可以在测试代理程序的优化期间调用,也可以在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
);
2
3
4
返回值
如果成功返回 true,否则 false。想获得有关错误的详细信息,可调用 GetLastError() 函数。
注意
如果传递给第一个形式参数(name) 的值为 空字符串,那么过滤器将只处理数值参数,例如只能查看指定id的帧。如果第二个形式参数的值是ULONG_MAX,那么只有文本过滤器工作。
例:调用 FrameFilter("", ULONG_MAX) 相当于调用 FrameFirst(),表示不使用任何过滤器。
# 27.3 FrameNext
读取 帧 并移动指针到下一个。此函数有2个版本。
- 调用接收一个数值
bool FrameNext(
ulong& pass, // 添加帧时的优化传递数
string& name, // 公共名称/标签
long& id, // 公共 ID
double& value // 值
);
2
3
4
5
6
- 调用接收 帧 的所有数据
bool FrameNext(
ulong& pass, // 添加帧时的优化传递数
string& name, // 公共名称/标签
long& id, // 公共 ID
double& value, // 值
void& data[] // 任何类型的数组
);
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 // 参数总数
);
2
3
4
5
参数
pass
[out] 策略测试器 中优化期间的传递的次数。
parameters
[out] 描述名称和参数值的字符串数组。
parameters_count
[out] 数组parameters[]的元素数量。
返回值
如果成功返回 true,否则 false。想获得有关错误的详细信息,可调用 GetLastError() 函数。
注意
获得parameters[]数组中的parameters_count字符串数以后,您可以通过所有记录组织一个循环。这将帮您找到指定传递数的EA输入参数的值。
# 27.5 FrameAdd
添加数据帧。此函数有2个版本。
- 添加文件数据
bool FrameAdd(
const string name, // 公共名称/标签
long id, // 公共 ID
double value, // 值
const string filename // 数据文件的名称
);
2
3
4
5
6
- 添加任何类型数组的数据
bool FrameAdd(
const string name, // 公共名称/标签
long id, // 公共 ID
double value, // 值
const void& data[] // 任何类型的数组
);
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个版本。
- 接收整型输入参数的数据
bool ParameterGetRange(
const string name, // 参数 (输入变量) 名称
bool& enable, // 启用参数优化
long& value, // 参数值
long& start, // 初始值
long& step, // 改变步骤
long& stop // 最终值
);
2
3
4
5
6
7
8
- 接收真实类型输入参数的数据vv
bool ParameterGetRange(
const string name, // 参数(输入变量)名称
double& enable, // 启用参数优化
double& value, // 参数值
double& start, // 初始值
double& step, // 改变步骤
double& stop // 最终值
);
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");
}
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个版本。
- 指定整型输入参数的数据
bool ParameterSetRange(
const string name, // 参数 (输入变量) 名称
bool enable, // 启用参数优化
long value, // 参数值
long start, // 初始值
long step, // 改变步骤
long stop // 最终值
);
2
3
4
5
6
7
8
- 指定真实类型输入参数的数据
bool ParameterSetRange(
const string name, // 参数(输入变量)名称
double enable, // 启用参数优化
double value, // 参数值
double start, // 初始值
double step, // 改变步骤
double stop // 最终值
);
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优化,包括或不包括所需的优化输入参数和设置所需的范围和变换步骤。