这是跨平台在虚拟交易环境中操作的最简单方式之一。
使用虚拟交易环境的场景
- 实时测试。这意味着,您可以观察 EA 在测试器中如何依据最新价格实时交易。 这令您可以分辨真实市场和测试器之间的差异原因。 无需等待新的一天(MT5 测试器限制),或为测试器创建特殊工具,以便它可以获取最新数据。 相应地,没有必要反复运行测试程序来获得更新。 实际上,虚拟交易环境是一个实时测试器。
- 自动优化。虚拟交易环境假设您已定义操作所用的数据。 所以,历史数据数组允许您在虚拟交易环境中运行任何交易策略。 因此,您可以在程序中实现自动优化 - 程序会定期优化自身,就像传统的测试程序一样。
- 将真实交易转变为虚拟交易(反之亦然)。例如,在亏损情况下暂时禁用交易策略。 重新启用交易策略的时间可以通过测试器,或通过一笔最少手数交易进行分析。 反之,虚拟环境允许用户实时停止交易,同时在虚拟交易环境中继续交易。 这为分析是否要重新启用交易策略,以及轻松重启实际交易能力时提供了很多便利。
- 简化工作帐户上的交易逻辑。市场上会发生许多测试器内不存在的情况。 这些包括拒绝和部分执行。 最大的问题是令真实交易尽可能类似于测试器中交易策略的执行。 通常,交易策略开发人员花费大量精力来克服极难预见的市场细微差别。 事实上,他们从自己的错误中吸取教训,并为此付出了真金白银,因为模拟账户无法模仿真实市场中的许多东西。 反过来,虚拟环境令我们能够看到完美的执行全景。 因此,为了绕过真实市场的陷阱,我们需要访问这个完美的全景,并从虚拟环境高品质地同步到真实环境(复制服务)。 因此,虚拟交易环境在处理真实市场中的困难情况时非常有用。
- 测试器加速。内置测试仪是一种通用工具。 这意味着它必须尽可能地充分模仿交易环境。 这意味着因操作速度限制带来高成本。 在开发和分析交易策略时,这种高精度会耗尽。 有多种方法可以加速测试器,包括自定义品种(高达百分之几百)和虚拟交易环境(百分之几十和几百),为了提高速度,可以放弃不考虑某些因素。 测试器加速是虚拟交易环境的一个重要优势,因为它可以节省计算资源,最重要的是节省时间。
- 交易策略逆转。虚拟交易环境允许轻松地逆转任何交易策略。
- 在净持账户上运行多种交易策略。虚拟交易环境大大简化了在净持账户上启动任意数量的交易策略。 交易策略不会互相干扰。
- 净持账户上的单向持仓。您可以在一个方向上开立多笔持仓。 它们当中的每一笔都有自己的魔幻数字,开仓时间,开仓价格,注释,等等。 例如,这允许在净持账户上创建网格交易策略,其中每笔单向持仓的止盈可以不同。
- 隐藏限价/追价/止损/止盈价位。如果存在隐藏重要交易价位的任务,则可以使用虚拟交易环境快速解决。
- 在净持账户上启动对冲交易策略。所有交易策略都在对冲虚拟环境中启动。 净持真实环境与虚拟环境同步。
- (异常)停止后恢复交易策略操作。许多交易策略的逻辑取决于它之前做了什么。 这就是为什么即使您禁用交易策略并立即重新启动它,如果交易策略在没有关停的情况下工作,您可能无法获得本应得到的结果。 虚拟交易环境允许您解决此任务。 启动时,交易策略会暂时在虚拟环境中按照历史价格数据运行,直至当前时刻。 然后它永久地转至真实交易环境。 例如,这可以解决许多涉及交易策略关停和重启的异常情况。
实现
该函数库允许创建虚拟交易环境并进行交易,就如同它是一个真实的交易环境一样。 函数库得功能并不新鲜,尽管所提供的跨平台函数库可能有一个很重要的属性:您不需要学习任何东西即可运用。 知道 MT4(不是 MT5)交易逻辑就足够了。
选择 MT4 风格的交易逻辑进行虚拟交易,因为它更方便,并且可以轻松地开发跨平台的 EA。
示例
传统上,函数库功能可以通过预先准备的示例来证明。
// 在真实和虚拟交易环境中启动交易策略 #include <MT4Orders.mqh> // https://www.mql5.com/zh/code/16006 #include <fxsaber\Virtual\Virtual.mqh> // 虚拟交易环境 input double Lots = 1; input int Interval = 100; // 持仓存活期 input bool Example = true; // 选择什么代码示例 // 逆转交易策略 void System() { if (!OrderSelect(OrdersTotal() - 1, SELECT_BY_POS)) OrderSend(_Symbol, OP_BUY, Lots, SymbolInfoDouble(_Symbol, SYMBOL_ASK), 100, 0, 0); // 如果此刻没有持仓, 开一笔 else if (TimeCurrent() - OrderOpenTime() > Interval) // 如果持仓的存活期超出指定时间 { // 逆转持仓 OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100); OrderSend(_Symbol, 1 - OrderType(), Lots, OrderClosePrice(), 100, 0, 0); } } void OnTick() { static const int handle = VIRTUAL::Create(); // 创建虚拟交易环境句柄。 0 - 真实交易环境 if (Example) { if (VIRTUAL::SelectByHandle()) // 选择真实交易环境 System(); // 在选定的交易环境中启动交易策略(真实) if (VIRTUAL::SelectByHandle(handle)) // 选择虚拟交易环境 { VIRTUAL::NewTick(); // 将逐笔报价添加至虚拟交易环境 System(); // 在选定的交易环境中启动交易策略(虚拟) } } else // 替代固定相同的动作。 // 沿着所有现有的交易环境移动 for (int i = 0; i <= VIRTUAL::Total(); i++) if (VIRTUAL::SelectByIndex(i)) // 选择合适的交易环境 { VIRTUAL::NewTick(); // 将逐笔报价添加至所选交易环境 System(); // 在选定的交易环境中启动交易策略 } Comment(VIRTUAL::ToString()); // 在图表上显示虚拟交易环境的状态 }
这是一个跨平台的逆转 EA。 多谢 MT4 风格,它的交易逻辑可以用几个字符串(System 函数)来描述。 EA 同时在真实和虚拟交易环境中启动交易策略。 这可以在 MT4 或 MT5 测试器中看到(CTRL + F5)
屏幕截图显示出真实和虚拟环境中的交易是相同的。
请注意,交易策略代码保持不变。 仅选择交易环境:真实的或任何数量的虚拟环境。
在此显示的代码是多余的 - 两个版本只显示使用函数库的逻辑。
测试器加速
由于 测试器加速 场景 (参见上边第 5) 也许比其它更经常需要,我们已为其添加了将任何交易策略切换到虚拟环境的能力,并在代码的开头添加两个字符串。
#define VIRTUAL_TESTER // 在虚拟交易环境中启动 #include <fxsaber\Virtual\Virtual.mqh> // 虚拟交易环境
突出显示的字符串可令用户无需干预交易策略原始代码。
此模式专为测试器而设。 假设启动长期优化时以( VirtualTester = true )虚拟环境替代真实环境。 这为优化速度(时间)提供了显著增益。 所获结果(OnTester 准则 - 余额)可用于实际交易环境中的标准单一运行 (VirtualTester = false)。
交易策略逆转
相同两个字符串旨在加速测试器,能够解决另一个常见问题 - 交易策略逆转。
ReverseDeals = true 模式可以实现交易逆转。 内部算法如下:
- 原始 EA 在虚拟环境中进行交易,就像在真实环境中一样。
- 在真实环境中,存在与虚拟环境中相应持仓相反的持仓。
因此,EA 逻辑不会以任何方式受到违背。 同时,我们可以看到交易策略逆转提供了什么。 此模式也适用于测试器。
特征
- 与内置测试器相比,并非所有事情都能在虚拟交易环境中实现。
- 对冲/净持两种模式均得以支持。 例如,您可以在 MT4/5 中同时创建净持和对冲虚拟环境。
- 对虚拟环境的数量没有限制。
- 不会执行最后价格,而这有时会在 MT5 测试器中发生,因为最后价格不与任何时间点相关。
- 限价订单和止盈等级始终以指定价格执行,没有滑点。 这消除了某些交易策略利用 MT5 测试器制造圣杯的印象。
- 追价订单和止损等级总是以第一次接受价格(负滑点)执行,以避免测试器圣杯。
- 与某些 MT5 测试器操作模式不同,以当前价格设置挂单和止损/止盈等级会立即接受。 这种行为符合市场现实。
由MetaQuotes Ltd译自俄语
原代码: https://www.mql5.com/ru/code/22577

基于 MAMy v.3 指标的 EA

指标显示一条倾斜的趋势线。 当交易者启动指标时,其参数将被设置。 趋势线定义了信号触发价位。 趋势线突破激活信号,并伴随电子邮件和推送通知。