MetaTrader 5帮助算法交易, 交易机器人测试功能

测试功能

自动交易的想法如此具有吸引力, 因为交易机器人可以不间断地每周七天, 每天 24 小时工作。机器人完全免疫疲劳、怀疑、恐惧和心理问题。您只需要清晰地将交易规则正式化, 并在算法里实现它们, 机器人已准备就绪来不懈工作。但首先, 您必须确保以下两个重要条件:

  • 智能交易程序遵照交易系统的规则执行交易操做;
  • 在 EA 里实现的交易策略在回测时将显示利润。

所有这些问题, 可以使用交易平台内置的 策略测试器 来得到答案。

订单触发和执行

对于非证券工具, 触发各种挂单和止损/止盈是按照供给价和采购价执行的。操作按照触发时刻的当前市场供给价和采购价执行。

对于证券工具, 图表的作图和停止单的触发均以最后的成交价 (Last) 执行。限价单按照供给价和采购价触发。限价单以订单指定价位执行(无需滑移),而其他类型的订单则在当前市场卖价和买价执行(可以滑移)。

让我们以 Si-6.16 作为例子。当前价格, 供给价=72570, 采购价=72572, 且最后成交价格=72552, 则放置一笔上行突破买入单的执行价格是 72580。我们已经在价格流中收到新的价格:

  • 供给价=72588
  • 采购价=72590
  • 最后成交价=72580

对于证券工具, 最后成交价用于触发停止订单的激活。所以, 价格流中最后成交价=72580, 其结果将会导致上行突破买入单被激活。订单在当前市价采购价 = 72590 处执行 (市价买入操作)。

证券工具的上行突破买入订单的触发和执行

在"新开盘价" 和 "1分钟 OHLC" 测试模式中,挂单,以及SL和TP要在订单中指定的价位执行。用于精确模式(每个报价和真实报价)的市价执行算法并不适合非精确模式。在一些模式中,不生成中间报价,因此请求订单价和当前价(开盘价或OHLC)之间的差异就非常重要。在“只开盘价”和“1分钟OHLC”中的请求价执行订单提供了更精确的测试结果。

创建柱形图

在策略测试中,只有通过非零的最后价才可创建交易所的交易品种柱形图。可能收到卖价和买价,计算指标,但柱形图未形成。在"每次报价" 模式没有非零最后价。因此,柱形图根据每次进入的报价而改变。

点差模拟 #

在供给价和采购价之间的差价称为点差。在测试期间, 点差并非模拟, 而是取自历史数据。如果历史点差小于或等于零, 则采用最后已知的点差值 (在生成时刻)。

在策略测试器里, 点差总是持续浮动的。

交易平台的全局变量 #

交易使用的全局变量在测试时也是模拟的, 但它们与真实的 平台全局变量无关, 这可以通过按下 F3 来查看。这意味着所有利用平台全局变量的操作在测试期间都是在平台之外执行的 (在测试代理上)。

测试期间历史数据下载 #

在测试进程开始之前, 平台会从交易服务器同步并下载测试用的该品种历史数据。首次运行时, 平台下载所有该品种的历史数据, 以后不再重复下载。未来只需要下载新的数据即可。

测试代理开始测试之后, 紧接着从交易服务器下载该品种测试所需的历史数据。如果测试期间需要用到其它金融工具的数据 (例如, 若是多币种智能交易系统), 测试代理在首次调用之时从交易服务器请求这些所需的历史数据。如果平台提供了历史数据, 它们被立即传送到测试代理。如果未提供数据, 平台向服务器请求并下载它们, 然后, 传递到测试代理。

计算交易操作的交叉汇率时, 也需要附加的金融工具数据。例如, 针对 EURCHF 进行策略测试, 且存款是 USD, 处理首笔交易操作之前, 测试代理向交易平台请求 EURUSD 和 USDCHF 的数据, 尽管策略中并未包含这些品种的直接调用。

额外的交易历史下载可以在从MQL5应用程序调用某个函数时启动:

历史记录下载

无历史记录下载

通过以下参数调用SymbolInfoDouble时:

  • SYMBOL_BID
  • SYMBOL_BIDHIGH
  • SYMBOL_BIDLOW
  • SYMBOL_ASK
  • SYMBOL_ASKHIGH
  • SYMBOL_ASKLOW
  • SYMBOL_LAST
  • SYMBOL_LASTHIGH
  • SYMBOL_LASTLOW
  • SYMBOL_TRADE_TICK_VALUE
  • SYMBOL_TRADE_TICK_VALUE_PROFIT
  • SYMBOL_TRADE_TICK_VALUE_LOSS

通过以下参数调用SymbolInfoInteger时:

  • SYMBOL_VOLUME
  • SYMBOL_VOLUMEHIGH
  • SYMBOL_VOLUMELOW
  • SYMBOL_TIME
  • SYMBOL_SPREAD

调用SymbolInfoTick时

调用时:

  • SymbolInfoString
  • SymbolName
  • SymbolSelect
  • SymbolInfoMarginRate
  • SymbolInfoSessionQuote
  • SymbolInfoSessionTrade
  • 其他函数这里未指定
  • 在左栏中未指定带有其他参数的SymbolInfoDouble和SymbolInfoInteger

在测试多币种策略之前, 建议将所有必要的历史数据下载到交易平台。这将有助于避免测试/优化时下载所需关联数据造成的延迟。您可以下载历史, 例如, 通过打开相应的图表并滚动到历史记录的开头。

测试代理会从平台接收压缩格式的历史数据。重新测试之时, 测试代理不会从平台下载数据, 因为它有先前测试运行时的数据。

  • 当代理首次向平台请求测试品种的数据时, 平台只会从交易服务器下载一次历史数据。历史数据会打包下载以便降低流量。
  • 分时数据不会通过网络发送, 它们是在测试代理上产生的。

多币种测试 #

策略测试器允许多品种交易策略的回测。这类智能交易系统惯常称为多币种智能交易系统, 因为原本上, 在之前的平台里, 测试执行只能针对单一品种。在平台测试器里, 我们可以模拟所有可用金融工具的交易。

测试器在首次调用品种数据时自动从交易平台下载所需品种的历史数据 (并非交易服务器!)。

在测试开始前期, 测试代理只下载缺失的, 以及用于指标计算的略多一点的数据。对于 D1 及以下的时间帧, 历史数据的最小下载量是一年。所以, 测试周期 M15 (每根柱线等于 15 分钟), 测试间隔一个月 2010.11.01-2010.12.01, 代理会向平台请求该品种整个 2010 年的历史数据。对于周线级时间帧, 代理请求 100 根柱线的历史数据, 大约是两年 (一年有 52 周)。对于月线级时间帧, 代理请求 8 年的历史数据 (12 月 * 8 年 = 96 月)。

如果所需的柱线由于某种原因不可用, 测试开始日期从更早之前自动平移到可用的柱线数量之处。

市场观察 在测试期间也是模拟的。省缺情况下, 在测试之始, 只有一个品种在测试器的市场观察里可用 - 即为正在运行测试的品种。所有需要访问的品种会自动连接到策略测试器的市场观察 (而非平台!)。

在您开始测试一个多币种智能交易系统之前, 在交易平台的市场观察里选择测试所需品种, 并下载所需要的数据。当首次调用 "外来" 品种时, 其历史数据将会在测试代理和交易平台之间自动同步。"外来" 品种与正在进行测试的品种不同。

当这类品种被首次调用时, 测试过程会暂停并从平台下载其周期数据到测试代理。同一时间, 生成此品种的分时序列也启用。

根据选择的分时生成模式为每个品种生成独立的分时序列。

这意味着在交易平台上进行多币种测试不需要任何额外的工作量。您只需要在平台上打开相应品种的图表。全部所需品种的历史数据自动从交易服务器下载可用数据。

策略测试里的时间仿真 #

在测试期间, 本地时间总是等于服务器时间。服务器时间一直对应于 GMT 时间。

若万一与服务器失去连接, 本地和服务器时间在策略测试器里将刻意等于 GMT。测试结果应该始终是相同的, 无论服务器连接建立与否。有关服务器时间的信息并未存储在本地, 而是取自服务器。

测试期间的图形对象 #

在测试/优化期间图形对象不会作图。所以, 在测试/优化期间引用创建对象的属性, 智能交易系统将收到零值。

此限制不适用可视化模式的测试。

在 "仅用开盘价" 模式里的柱线同步 #

策略测试器允许测试所谓的 "多币种" 智能交易系统。一款多币种 EA 可以交易两个或更多的品种。

多品种交易的策略测试, 在测试器里需要强加一些额外的技术:

  • 生成这些品种的分时;
  • 计算这些品种的指标值;
  • 计算这些品种所需的保证金;
  • 同步全部交易品种已生成的分时序列。

根据选择的交易模式, 策略测试器生成并播放每个金融工具的分时序列。新柱线对于每个已开盘的品种, 与其它品种的柱线是否开盘无关。这意味着在多币种测试期间, 一种情形可能发生 (且经常如此), 一个金融工具的新柱线已经开盘, 然而其它的品种却还没有新柱线。这一切就像实时报价。

只要使用 "每笔分时" 和 "1 分钟 OHLC" 测试模式, 这种高保真历史模拟在测试器里不会导致任何问题。对于这些模式, 在一根蜡烛条里生成的分时数量, 足以等待来自不同品种的柱线同步。但是我们如何在 "仅用开盘价" 模式里测试多币种策略, 此时交易的金融工具是否需要柱线同步?在此模式下, 只在对应于柱线开盘时间的那一笔分时里调用 EA。

例如: 我们针对 EURUSD 测试智能交易系统, 一根新的 EURUSD 一小时蜡烛条已开盘。我们可以简单地识别这个事实 - 在 "仅用开盘价" 模式里, 新分时抵达事件与柱线开盘时刻相对应。但这不保证 EA 里所用的 GBPUSD 也同样有新蜡烛条开盘。

测试代理 #

在平台上执行测试是使用 测试代理。本地代理自动创建并启动。本地代理的数量等同于逻辑核心的数量。

每个测试代理有自己的 全局变量拷贝, 其与平台无关。平台是个管理者, 分派任务给本地和远程代理。一旦给定参数的智能交易系统测试任务完毕, 代理将结果返回给平台。只有一个代理用于单个测试。

代理根据品名将来接收自平台的历史数据保存到单独的文件夹, 所以 EURUSD 的历史数据保存在名为 EURUSD 的文件夹内。此外, 金融工具的历史根据它们的来源分离。用于存储历史数据的结构如下:

测试器目录\Agent-IP地址-端口\bases\源名称\history\品名

例如, 从 MetaQuotes-Demo 服务器下载的 EURUSD 历史数据可以存储在文件夹 测试器目录\Agent-127.0.0.1-3000\bases\MetaQuotes-Demo\EURUSD。

本地代理在完成测试后进入待机模式, 并等待 5 分钟以便接受下一次任务, 所以这不会浪费时间来启动下一次调用。仅当等待周期过后, 本地代理停机并从 CPU 内存里卸载。

如果测试被用户中断 (按钮 "取消" 按下) 或者交易平台关闭, 所有本地代理立即停止操作并自内存中卸载。

在平台和代理之间的数据交换 #

当您启动一次测试, 平台将参数分为多个块发送给代理:

  • 用于测试的输入参数 (并发模式, 测试间隔, 金融工具, 优化准则, 等等。)
  • 在市场观察里选择的品种列表
  • 测试金融工具的规格 (合约大小, 用于止损和止盈的最小停止级别, 等等)
  • 将要被测试的智能交易系统和其输入参数值
  • 有关附加文件的信息 (库, 指标, 数据文件)

对于每个参数块, 均会创建一个 MD5 格式的数字指纹并发送给代理。MD5 哈希码对于每个集合都是唯一的, 它的体积远比计算其值的信息量要小得多。

代理接收哈希码并与存储的集合进行比较。如果给定参数块的指纹在代理上不能用, 或接收的哈希码与存在的不同, 代理会重新请求参数块。这样就减少了平台和代理之间的流量。

测试之后, 代理返给平台测试运行的结果, 显示在选卡 "测试结果" 和 "优化结果": 盈利, 成交数量, 夏普比率, OnTester() 函数的结果, 等等。

优化期间, 平台用小型封包分派任务给代理, 每个封包包含若干任务 (每个任务就是带有一组输入参数的单一测试)。这可减少平台和代理之间数据交换的时间。

出于安全原因, 代理从不会将接收自平台的 EX5 文件 (EA, 指标, 程序库, 等等) 保存到硬盘, 所以运行代理的电脑不能用来接收数据。所有其它文件, 包括 DLL, 被记录在沙箱中。您不能在远程代理上测试具有 DLL 调用的智能交易系统。

测试结果由平台加入到特殊的结果高速缓存里, 如果需要的话, 从那里可以很容易地访问它们。对于每组参数, 平台在结果高速缓存里搜索可能的结果, 以避免重复以前的运行。如果没有发现这一组参数的结果, 则代理发起一个任务来运行测试。

平台和代理之间的流量都是加密的。

分时数据不会通过网络发送, 它们是在测试代理上产生的。

使用交易平台的共享文件夹 #

所有测试代理彼此间, 以及与交易平台都是隔离的: 每个代理都拥有自己的记录日志的文件夹。此外, 测试期间所有代理的文件操作都在文件夹 代理名/MQL5/Files 文件夹内执行。不过, 您可以使用平台的共享文件夹实现本地代理和交易平台之间的交互。

使用 DLLs #

为了加速优化, 本地代理之外, 您还可以使用 远程代理。在此情况下, 访问远程代理有一些限制。首先, Print() 函数的结果, 以及有关开仓、平仓的消息不会记录在代理的日志内。只有少量信息会加到日志里, 防止电脑硬盘因智能交易系统的错误操作导致的海量消息阻塞。

第二个限制 - 测试智能交易系统期间, DLL 调用是被禁止的。出于安全原因, DLL 调用在远程代理上是被绝对禁止的。在本地代理上, 只有当 "允许导入 DLL" 权限启用时, 测试智能交易系统才可调用 DLL。

智能交易系统

当第三方智能交易系统 (脚本, 指标) 需要 DLL 调用时, 您应该明白在平台设置里允许此选项的风险。无论智能交易系统如何使用 - 作为测试或者在图表上运行。