测试可视化: 功能增强

Andrey Khatimlianskii | 22 一月, 2016

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交易中加上了新的外部变量:



新的外部变量是在VisualTestingTools.mq4文件中的, 它们也已被加入到EA交易的代码中


它们的目的很直观, 但是我还是想详细解释一下它们:
- Rows - 显示的最大行数. 对于大多数策略来说, 10行就足够了;
- BigText - 如果您想放大字体, 就设为true;
- SignalPoints - 距离点数, 当距离止损, 获利, 或者挂单的价格达到这个点数时会高亮显示. 例如, 如果 SignalPoints = 10, 那么当价格距离止损小于等于10个点的时候, 止损区域会改变颜色;
- MainColor - 终端顶部, 柱信息以及账户信息 (余额, 净值, ...)的颜色.
- BuyColor - 买入仓位信息的颜色;
- BuyOPColor - 买入建仓价格栏位的颜色, 当目前价格接近了止损买入或限价买入的价格, 会用此颜色替换主色(MainColor);
- BuySLColor - 当价格接近买入仓位的止损水平, 会用此颜色替换主色(MainColor);
- BuyTPColor - 当价格接近买入仓位的获利水平, 会用此颜色替换主色(MainColor).
- SellOPColor, SellSLColorSellTPColor - 类似的对应卖出仓位的颜色.

让我们设置 MainColor = Black 并按下 OK. EA交易现在可以测试了. 在按下"开始"按钮之前, 要选中"可视化", 然后就可以欣赏结果了:

没有开启仓位的时候, 我们的"终端"只是显示头部和账户状态栏的信息. 让我们一直等到有信号出现, EA交易建立了一个仓位.

第一个是一个卖出仓位. 您可以看到, 线是红色的.

请把注意力放到账户状态栏. 它包含了我们曾经在终端的"交易"页面上看到的所有信息. 全部信息在每个订单时刻都会更新, 所以您可以看到仓位利润是如何改变的:

当价格接近了仓位的止损水平时, 止损栏位的颜色改成了用户预先设置的颜色

对我来说, 这非常好.

6. 可能的问题

使用包含vTerminal指标的 tester.tpl有一个特性应该说明: 在测试时, 用于寻找指标窗口的函数(WIndowFind())是不能用的. 这就是子窗口编号必须在代码中写明的原因:

    win = WindowFind( "vTerminal" );
    if ( IsTesting() ) { win = 1; }

如果模板中包含其他的绘制于独立窗口的指标, 所有有关它们的信息都会显示在上面的窗口中. 也就是说, 您必须把vTerminal 放在最顶上, 或者写成 win = 子窗口编号; 而不是 win = 1; .

在使用此指标时没有发现其它的问题.

7. 结论

为了给出一个优美的结论, 我想展示一些屏幕截图.