
测试可视化: 功能增强
1. 动机
从196构建号(build 196)开始, MetaTrader 4客户终端提供了测试可视化功能. 它使得EA交易的测试控制达到了一个崭新的水平. 现在, 交易程序员可以在他或她的EA交易在历史上运行时看到EA交易的每一个行为!
您可以在名为在MetaTrader 4客户终端中的测试:简单一瞥的文章中了解如何使用可视化. 我们的文章描述了如何使策略测试器和终端非常接近.
那么, 测试器的主要特殊之处是什么呢?在可视化中还缺少什么?最主要的是缺少了"交易"页面.
已经建立了多少个仓位?挂单会有多快被触发?仓位的止损移动了吗?当时还有多少保证金?离暴仓还有多远?在终端的"交易"页面我们可以回答诸如此类以及许多其他的问题. 但是当测试时我们能做什么呢?
本文就致力于找到解决此问题的方案.
2. 技术层面
和以往一样, 我们先从定义问题开始写代码. 我们想得到什么样的结果呢?
- 就像我们之前说过的, 我们需要实现与"交易"页面类似的功能, 把所有建立的仓位和挂单的信息显示出来.
- 信息必须一直更新和具有良好的可读性.
- 程序必须非常易于使用 - 它与EA交易的关联不需要太多麻烦.
现在我们可以讨论技术层面了. 程序应该怎样构成呢: 是一个指标还是外部函数库?
很显然, 在独立窗口中的指标是最好的解决方案. 它一直可见, 不会被价格图表掩盖, 并且每个订单时刻都可以更新. 但是当使用指标时我们会面临一个新的问题 - 它是从普通终端中, 而不是从'虚拟'(测试)终端中取得订单数据, 也就是说, 它将显示当前账户的信息而不会对测试本身做出反应.
所以我们必须要找到替代方案, 一种后路, 来解决我们的问题i.
我们还是会创建一个指标, 但是它只是完成"图表子窗口创建者"的功能. 它不会显示任何内容, 也就是说, 我们将在图表上有一个'保留'部分. 这是很有必要的, 创建的字窗口可以使用唯一名称保存于tester.pl模板或者<EA交易名称>.tpl模板中.
信息的显示与更新将置于一个包含(include)文件组成的函数库中.
3. 投入使用
首先, 必须创建一个图表模板用于之后的可视化测试器中. 只要调整图表(颜色, 网格, 缩放), 把 vTerminal.mq4 附加到图表并使用"保存模板"命令:
为了可视化测试的目的, 会使用名为tester.pl或者<EA交易名称>.tpl的模板. 故模板就按此名称保存.
4. 与EA交易集成
用于显示仓位信息的函数保存于名为VisualTestingTools.mq4的包含文件中, 它位于...\MetaTrader 4\experts\include\ 目录. 首先, 它必须被加到EA交易当中 - 在 start 函数前插入 #include <VisualTestingTools.mq4> 这行代码. 它看起来如下 (CrossMACD_DeLuxe实例):
... double _Commission = 0.0; string _Comment = ""; datetime _Expiration = -1; #include <VisualTestingTools.mq4> int start() { if ( FastEMAPeriod >= SlowEMAPeriod ) { return(-1); } int _GetLastError = 0; ...
现在我们就可以在程序的任意部分使用函数了. 调用其中一个 - vTerminalInit() - 置于EA交易的 init() 函数中, 因为它必须并且只能被调用一次, 因为它的任务就是创建用于显示信息的对象. 另外一个 - vTerminalRefresh() - 必须每个订单时刻都要调用. 它将更新所建立仓位的信息. 使用了这些函数的EA交易代码如下:
... double _Commission = 0.0; string _Comment = ""; datetime _Expiration = -1; #include <VisualTestingTools.mq4> int init() { if ( FastEMAPeriod >= SlowEMAPeriod ) { return(-1); } vTerminalInit(); return(0); } int start() { if ( FastEMAPeriod >= SlowEMAPeriod ) { return(-1); } vTerminalRefresh(); int _GetLastError = 0; ...
您可以下载EA交易 CrossMACD_DeLuxe_Visual.mq4, 所需的代码都已经修改了.
5. 测试
现在让我们看一下得到了什么.
首先, EA交易中加上了新的外部变量:
它们的目的很直观, 但是我还是想详细解释一下它们:
- Rows - 显示的最大行数. 对于大多数策略来说, 10行就足够了;
- BigText - 如果您想放大字体, 就设为true;
- SignalPoints - 距离点数, 当距离止损, 获利, 或者挂单的价格达到这个点数时会高亮显示. 例如, 如果 SignalPoints = 10, 那么当价格距离止损小于等于10个点的时候, 止损区域会改变颜色;
- MainColor - 终端顶部, 柱信息以及账户信息 (余额, 净值, ...)的颜色.
- BuyColor - 买入仓位信息的颜色;
- BuyOPColor - 买入建仓价格栏位的颜色, 当目前价格接近了止损买入或限价买入的价格, 会用此颜色替换主色(MainColor);
- BuySLColor - 当价格接近买入仓位的止损水平, 会用此颜色替换主色(MainColor);
- BuyTPColor - 当价格接近买入仓位的获利水平, 会用此颜色替换主色(MainColor).
- SellOPColor, SellSLColor 和 SellTPColor - 类似的对应卖出仓位的颜色.
让我们设置 MainColor = Black 并按下 OK. EA交易现在可以测试了. 在按下"开始"按钮之前, 要选中"可视化", 然后就可以欣赏结果了:
没有开启仓位的时候, 我们的"终端"只是显示头部和账户状态栏的信息. 让我们一直等到有信号出现, EA交易建立了一个仓位.
第一个是一个卖出仓位. 您可以看到, 线是红色的.
请把注意力放到账户状态栏. 它包含了我们曾经在终端的"交易"页面上看到的所有信息. 全部信息在每个订单时刻都会更新, 所以您可以看到仓位利润是如何改变的:
当价格接近了仓位的止损水平时, 止损栏位的颜色改成了用户预先设置的颜色
6. 可能的问题
使用包含vTerminal指标的 tester.tpl有一个特性应该说明: 在测试时, 用于寻找指标窗口的函数(WIndowFind())是不能用的. 这就是子窗口编号必须在代码中写明的原因:
win = WindowFind( "vTerminal" ); if ( IsTesting() ) { win = 1; }
如果模板中包含其他的绘制于独立窗口的指标, 所有有关它们的信息都会显示在上面的窗口中. 也就是说, 您必须把vTerminal 放在最顶上, 或者写成 win = 子窗口编号; 而不是 win = 1; .
在使用此指标时没有发现其它的问题.
7. 结论
为了给出一个优美的结论, 我想展示一些屏幕截图.



本文由MetaQuotes Ltd译自俄文
原文地址: https://www.mql5.com/ru/articles/1420
注意: MetaQuotes Ltd.将保留所有关于这些材料的权利。全部或部分复制或者转载这些材料将被禁止。
This article was written by a user of the site and reflects their personal views. MetaQuotes Ltd is not responsible for the accuracy of the information presented, nor for any consequences resulting from the use of the solutions, strategies or recommendations described.
