![Expert Advisor 参数的测试(优化)技术和一些选择条件](https://c.mql5.com/i/articles/overlay.png)
Expert Advisor 参数的测试(优化)技术和一些选择条件
简介
选择适当参数并不比选择交易战术和创建 Expert Advisor 稍显次要,这显然不是什么秘密。 许多论坛上正在以这样或那样的方式进行有关自动交易的讨论,就可以证明这一点。 尽管交易操作的自动化相当清晰和透明,然而,我还没有遇到任何有用的自动化算法能够处理在逻辑上完整的链路中进行编译的优化结果。
我们需要承认,这个过程很困难,而且相当耗时,因此值得付出努力来最大限度地自动执行所有交易并将这些压缩为一个算法。 下文将介绍这种途径和方法。
概念
任务。 对在优化期间接收的已知对实际交易无效的 Expert Advisor 参数进行分析和筛选。 最大限度地使用终端性能和自动化手动操作。
整个过程包括多个阶段。 这样划分与连续自动算法的实现复杂性没有多大关系,因为无法在优化阶段早期定义系统参数的所需要求(公差和过滤)。 一般来说,并不需要这样。
我认为,让机器做出战略性的决策不是“最好的主意”。 而选择参数(参数组)是一项策略。 计算,交易,让我们的生活更轻松 - 这些是功能,但决定硬件应遵循的操作规则的是交易者。
在可行的程度内,每个阶段和每个阶段之间 的过渡已最大限度实现自动化。
第 1 阶段。 优化。 包含可选用户设置的标准变体。
这一点也不是秘密,但是不能排除在外。
遗传学一定是有用的东西,但在合理的限制范围之内。 事实是,其算法可以玩一个欺骗的把戏 - 当找到一组其认为可获利的参数时,整个优化过程将从那时起到结束都将围绕其运行。 我相信你肯定知道最后的结果。 大部分 工作 在优化区域以外的优良变体都将排除在外,未记载在“优化结果”表格中。
有几个方法摆脱这种状况。 一种极端的方法是不使用遗传算法进行优化。 然而,由于这样或那样的原因,这种方法并不总是合适。 下面两种方法是折衷办法,但总比没有办法强:
- 优化不止运行一次,而是运行两次甚至多次。 第一次,按“余额”进行优化,第二次按“最大亏损”或其他参数进行优化。 Expert Advisor 属性的“测试”选项卡中的“优化参数”窗口提供此类选择。 然后,合并接收的结果表格并制定一个综合表格。
- 最大程度减少参数组合的数量。
实施优化时要考虑另一个细微差别。 有人可能会发现这种方法有用。
可以在 Expert Advisor 属性的“优化”选项卡中设置各种限制,我想简要说说其中一项 -“最大亏损”。 使用此参数,应牢记这是 当前余 额亏损的百分比。 在这里需要考虑什么? 例如,如果我们设置了 10% 的限制并且初始余额为 10000,则在优化过程中,当余额至少达到 15000,初始 1000 将变成 1500 - 显然,它们是不同的数据。 初始 保证金 (谁可以保证交易一开始不会出现此类亏损?) 将针对它们做出不同的响应。 如果设置了 1000000 的初始保证金和 0,1% 的限制,则这 1000 仍为 1000 左右。
第 2 阶段。 处理“优化结果”。 所有结果将被复制到 Excel 中并在此处进行处理。 这里将有很多集合,应对它们进行缩减。 可对报告的任何列进行“缩减” - 这取决于交易者。
第 3 阶段。 测试。 我们选择了一部分历史记录进行测试,并对通过上一阶段筛选的集合执行自动分组测试。 我指出: 分组测试。 在此阶段,无需单独考虑每个测试,关键点是立刻获得所有剩余集合的测试结果。 实际上,终端将实现相同的优化,但它将使用来自预创建文件的参数。
与第 2 阶段类似,所有收到的结果将被复制到包含优化结果的同一 Excel 表格。
第 4 阶段。 分析和筛选。
显然,将无情地丢弃负结果(删除行)。 问题是如何评估剩余的结果?
你们中的许多人必定已经注意到,与报告中的数字相比,余额图表的视觉感知能够针对系统特性提供同等甚至更好的看法。 通常,如果曲线看起来"很好",报告中的数字也会"很好",然而,如果缺少持续增长趋势,则没有数字足以说明曲线看起来"很好"。
问题是剩余相当多的变体,要单独测试它们以分析报告和查看每个变体的图表,这非常困难... 尽管如此,如果有人很固执,那么...
为了避免上述问题并进一步减少集合数量,我制定了一个适用于比较区域的“比率”标准。 将比较三个值: 分别在优化和测试区域的“每日盈利”、“每日交易次数”、“最大亏损”。 如果它们大体在某个容许极限内并且相互之间保持一致,则此集合仍有效,否则将从进一步分析中排除此集合。 此外,在某些情况下,更具体地说 - 如果测试区域不是很长,则上述三个值可能会在一定程度上产生一个“平缓的”余额曲线的观点。
在历史的不同部分中,第 3 阶段和第 4 阶段能够也应当多次重复,首先是为了确认选定结果的可靠性,其次是为了最大限度缩减选定结果的数量。 剩余 3 到 5 个变体将足以作出知情最终选择。
第 3、4 阶段 的完成内容包括从剩余集合生成集合文件、在历史的任何部分实现单个测试、在测试之间比较、进行选择等等。
基本上,这是每个交易者的素质、品味和偏好方面的问题,不在本文讨论的范围之内。
技术
这里没有任何困难和稀奇古怪的问题,你所需要的只是注意力和准确性。 我们开始吧。
1. 计算机配置 -控制面板/区域和语言选项/区域选项/俄语 - 自定义/数字/小数点 - 你需要选择“点”,而不是“逗号” - 这是为了在将(测试)优化结果从终端复制到 Excel 表格之后准确地反映数据;
- 你将在计算机上安装 Microsoft Office(需要包括 Excel)- 2000 版和更高版本。
- Excel 安全设置中应启用宏,并且应导入 Analise.bas 模块(已随附于本文)。 本文没有提供有关此模块及其结构的审核,因为一般用户无需在其中更改或编辑任何内容,而“非一般”用户自身会去了解这些操作(如果需要)。
2. Expert Advisor 准备
附件中有一个已准备好的 Expert Advisor 示例。
在代码的最开头部分,应在外部参数之前插入以下内容:
// Test and optimization parameters extern int VarOptimTest = 0; // 0 - standard optimization (normal operation of the Expert Advisor) // 1 - test run of the selected sets // 2 - generation of set-files extern int Counter = 1; // counter extern string nameEA = "MA"; // Expert Advisor name
这些变量将控制优化和测试模式。
Init() 函数应如下所示:
int init() { // BLOCK OF THE OPTImizaTION AND TESTING FUNCTION CALL if(IsOptimization() && VarOptimTest !=0) { if (VarOptimTest == 1 && Counter !=0) _ReadParametrs(); if (VarOptimTest == 2 && Counter !=0) {_ReadParametrs(); _WriteSet();} } ........... ........... return (0); }
将从此处调用两个函数,以确保整个过程的自动化。
将下行添加到 Start() 函数中:
int start() { if(IsOptimization() && VarOptimTest ==2) return(0); ..........
1. 在分析(测试)优化结果之后创建了用于读取 Excel 文件的参数读取函数。
此函数的变量部分显示为粗体。 需要准确仔细地遵循相同的结构和语法,列出 Expert Advisor 的所有输入参数,但前三个负责优化和测试的参数以及 bool- 和 string 类型的变量(如有)除外。
void _ReadParametrs() { string FileName="test.csv"; int handle=FileOpen(FileName,FILE_READ||FILE_CSV);//,''); if(handle<1) return(0); FileSeek(handle,0,SEEK_SET); int str = StrToInteger(FileReadString(handle)); int data = StrToInteger(FileReadString(handle)); if (data < Counter) { Alert("Incorrect number of test runs entered. Sorry"); return(0); } for (int y=1; y <=Counter; y++) { for (int x=1; x <= str; x++) { string s = FileReadString(handle); string ds = FileReadString(handle); if (y != Counter) continue; s=StringTrimLeft(s);s=StringTrimRight(s); ds = StringTrimLeft(ds);ds=StringTrimRight(ds); double d = StrToDouble(ds); if (s == "Lots"){Lots=d;continue;} if (s == "MaximumRisk"){MaximumRisk=d;continue;} if (s == "DecreaseFactor"){DecreaseFactor=d;continue;} if (s == "MovingPeriod"){MovingPeriod=d;continue;} if (s == "MovingShift"){MovingShift=d;continue;} } } FileClose(handle); return(0); }
2. 集合-文件生成和编写函数。 其结构应映射 Expert Advisor 集合文件结构。 此函数的变量部分显示为粗体。
void _WriteSet () { string FileName=nameEA+"_"+Symbol()+Period()+"_"+Counter+".set"; int handle=FileOpen(FileName,FILE_WRITE|FILE_CSV); if(handle<1) return(0); FileWrite(handle,"VarOptimTest="+0); FileWrite(handle,"VarOptimTest,F="+0); FileWrite(handle,"VarOptimTest,1="+0); FileWrite(handle,"VarOptimTest,2="+0); FileWrite(handle,"VarOptimTest,3="+0); FileWrite(handle,"Counter="+0); FileWrite(handle,"Counter,F="+0); FileWrite(handle,"Counter,1="+1); FileWrite(handle,"Counter,2="+1); FileWrite(handle,"Counter,3="+100); FileWrite(handle,"nameEA="+nameEA+"_"+Symbol()+Period()+"_"+Counter); FileWrite(handle,"Lots="+Lots); FileWrite(handle,"Lots,F="+0); FileWrite(handle,"Lots,1="+0.00000000); FileWrite(handle,"Lots,2="+0.00000000); FileWrite(handle,"Lots,3="+0.00000000); ................................. FileWrite(handle,"MovingShift="+MovingShift); FileWrite(handle,"MovingShift,F="+1); FileWrite(handle,"MovingShift,1="+2); FileWrite(handle,"MovingShift,2="+1); FileWrite(handle,"MovingShift,3="+4); FileClose(handle); return(0); }
3. 过程
注意! 我强烈 建议你在执行任何操作之前复制工作表或整个工作簿。 在 Excel 中运行宏是不可逆的操作,如果出现错误,将会丢失优化结果,这意味着浪费时间。 不时保存中间结果没有任何坏处。
3.1. 优化
有足够的信息了解优化的特点,现在我们来看看是如何进行优化的。 应按屏幕截图所示设置 Expert Advisor 属性中的优化和测试参数:
图 1 Expert Advisor 属性,“输入参数”选项卡 优化和测试参数
3.2. 优化结果分析和初步参数筛选
完成优化后,应将结果复制到剪贴板:
图 2 复制优化结果
启动 Excel 并将复制的数据粘贴到新的工作表中。
复制后,应运行 Optim_1 宏。 如果一切正确,工作表将类似于下表:
图 3 运行 Excel 宏
在运行宏时,需要在对话框中输入优化时段的天数。 需要此项来计算其他标准。
图 4 天数的输入对话框
正如你所看到的,产生的表格中没有列名称。 这样做是有原因的。 首先,更容易避免在输入参数数量(稍后需要)时出现错误,其次,它们没有特别需要。 在这里所有内容都很熟悉,两列 - 蓝色列和绿色列除外。 从左到右依次为: 传递数、盈利、每日盈利、总交易次数、每日交易次数、盈利因子、预期收益、亏损(美元)、亏损 %。
当表格仅包含选定用于进一步工作的参数(即已删除不必要的行)时,我们将进入下一步。
为了便于排序,模块中有一组允许按各个列排序的宏。 指定热键和 ....
3.3. 将参数保存为文件
你应运行 “Write” 宏,并在弹出对话框中输入参数文件将 保存的路径 (.... terminal\tester\files\)
图 5 保存参数文件的对话框
“文件名”窗户有一个预定义名称 “test”,请不要进行更改,除非非常有必要,但如果你进行更改,你需要在添加到 Expert Advisor 的函数中进行同样的更改。
完成此操作后,指定目录中将出现“test.csv”文件(或者如果此前已存在此文件,此文件将被覆盖)。
注意, 这一点很重要。 创建此文件之后,不要在表格中更改行位置,否则测试结果将不再绑定到测试中使用的参数。
3.4. 测试
Expert Advisor 设置:
图 6-8 Expert Advisor 用于实现分组测试的设置
我认为,如果有需要说明的内容,只占极小部分: 没有集合限制,遗传算法已停用, 计数器 变量设置介于 1 到 N 之间,其中 N 为表格中的剩余行数,优化仅由此参数启用。
还有另一个设置:
图 9 “优化结果”选项卡的设置
现在,如果设置了测试周期和其他必要的优化参数,你可以单击“开始”按钮并在“优化”模式下运行策略测试程序。
测试可能需要一段相当长的时间才能完成,尤其是在表格仍然较大的第一次运行,完成测试后,我们可以进入下一步。
3.5. 处理测试结果
首先,我们应为新数据输入准备 Excel 表格,为此,我们将运行 “Optim_2" 宏,表格左侧将因此出现 7 个空白列。 接收的结果应按传递数以升序排序:
图 10 测试结果的排序
之后,应将结果复制(如同步骤 2)并粘贴到一个新的 Excel 工作表中,接着,将前 7 列复制粘贴到工作表中之前为表格准备的区域。
现在,运行一系列 “Optim_3" 和 “Optim_4”宏。 如果一切正确,表格将获得以下结构:
图 11 保存并处理优化和测试结果之后的表格结构
我们已经讨论了 L-T 列、 D-K 列类似于 М-T 列,但它们的数据涉及的是测试区域。
但在我们处理前三列之前,显然,应解释为什么引入了“每日盈利”和“每日交易次数”作为条件。
优化周期和测试周期在时长上可能会有所不同。 在这种情况下,出现了一个合理的问题:我们应如何比较结果? 这两个参数用于至少在一定程度上解决这个问题,并且能够加快结果比较的过程。
因此,列: А = N/E (每日盈利比率), B = P/G (每天交易次数比率), С =S/J (亏损比率)。
可以看出,这些列中的值当前由 1 表示 - 此值为仅当历史记录中的测试区域与优化区域重合时的理想变量。 这并不是疏忽,而是经过深思熟虑的操作,用于展示检查是否已正确准备 Expert Advisor 的方式之一。 同样,也可以检查是否正确创建集合文件。
因此,所有的分析准备工作都已就绪。 已提供所有信息。 一切都在交易者的手中,他知道 Expert Advisor 的所有秘密特性,可设置结果范围的必要容许极限以筛选参数。
继续。 表格已进一步缩减,但这仍不足够。 没有什么能够阻止我们执行另一个测试。
移除 A-K 列并返回到步骤 3。
接着,执行 3 到 4 次测试,我们将拥有一个包含 3-5-8 行的表格。 这已经足够,因此我们进入下一步。
3.6. 生成集合文件。
有人可能会说,这没有必要, 而且 可手动处理 5-8 组参数。 如果你喜欢这样,我不反对。 但是我更喜欢机器为我执行常规工作。 我们需要做的是运行 “Write” 宏,并最后一次在“优化”模式下运行带以下 Expert Advisor 设置的策略测试程序:
图12 Expert Advisor 用于生成集合文件的设置
这些设置与测试模式下的设置基本相同,唯一的区别是一个变量的值和最终计数器的值。
完成优化过程之后,将在目录 tester\files 中生成 Expert Advisor 集合文件。 名称中的最后一个数字为该行在表格中的编号。
图13 生成的集合文件
可以将它们作为标准 Expert Advisor 集合文件进行处理。
事实上,本文的主题现在已经谈得差不多了。
总结
以上信息并不能称得上通常被称为“优化理论”方面的新发现.... 这只是纯粹的实践指导,不多也 不少... 以下内容可能很明显,但是我认为还是有必要说一说。
这里介绍的所有内容都只不过是旨在最大限度促进交易者工作的工具。 任何人都不能 100% 的保证,图表右侧以外的余额曲线就与图表的可见部分中的一样好。
还有一点。 不要被各种文字和图片所吓跑。 事实上,一切都很简单,当你执行了多次此类优化之后,你就会自觉地进行优化。
我觉得有人可能会有如何使优化和测试窗口更有效的想法.... 如果 :)
祝你好运,获利丰厚。
附言: 我从未想过会要用这么多文字来介绍几十个“鼠标”操控。 :)
本文由MetaQuotes Ltd译自俄文
原文地址: https://www.mql5.com/ru/articles/1347
![交易者的黄金法则](https://c.mql5.com/2/12/1021_34.png)
![计量经济学 EURUSD 先行预测](https://c.mql5.com/2/12/1003_13.png)
![关于技术分析和市场预测的方法](https://c.mql5.com/2/17/982_30.gif)
![图形界面 II: 分隔线和上下文菜单元件 (第二章)](https://c.mql5.com/2/22/Graphic-interface-part2__1.png)