MetaTrader 4 和 MetaTrader 5 在处理交易请求时使用不同的约定。本文讨论使用类对象来表达由服务器处理的交易的可能性, 目的是让跨平台智能交易程序可以无视交易平台版本和使用模式均可工作。

打开网易新闻 查看精彩图片
打开网易新闻 查看精彩图片

约定

MetaTrader 4 和 MetaTrader 5 的终端对于如何处理交易请求存在诸多不同。精简了交易服务器处理交易请求的细节, 我们只需要考虑两类交易平台的三种不同版本/模式: (1) MetaTrader 4, (2) MetaTrader 5, 净持模式, 和 (3) MetaTrader 5, 对冲模式。

MetaTrader 4

在 MetaTrader 4 中, 当智能交易程序成功发送一笔订单, 它会收到一个单号, 即那笔交易的数字识别符。当修改订单或平单时, 正常地使用同一单号直至离场。

当部分平仓时, 情形稍有点复杂。操作也是使用 OrderClose 函数来完成, 在请求里指定的手数要少于订单的总手数。当这笔交易请求发送后, 按照函数调用中指示的数量, 订单 (或单号) 以确定的手数平仓。剩余的手数将会作为与部分平仓同类型的一笔新订单继续持有。由于 OrderClose 函数仅返回布尔值, 没有比重新检查账户中当前活跃订单列表更快速的方式来获得新单号。注意, 不可能单独使用 OrderClose 函数来获取单号。函数返回一个布尔值, 而像 MQL4 的 OrderSend, 当业务成功后会返回一个有效的单号。

MetaTrader 5 (净持)

在 MetaTrader 5 中交易操作处理乍一看将会感觉十分复杂, 但管理比 MetaTrader 4 中更简单。至少在交易者 (非程序员) 一侧, 这应该是真实的。

在 MetaTrader 5 中省缺是净持模式。在此模式下, 由服务器处理过的订单结果会合并为单独一笔持仓。这笔特殊持仓的类型以及成交量, 会基于入场订单的类型和交易量随时间而变化。在程序员一侧, 这有一点复杂。不像在 MQL4 里只有一个订单的概念, 程序员不得不与交易中使用的三种不同类型的令牌打交道。下表展示出一些 MQL5 净持模式与 MQL4 大致等效部分之间的比较:

构件

MQL5 (净持)

MQL4 (大致等效)

订单交易请求 (挂单或市价)交易请求 (挂单或市价) 成交 成交基于单笔订单完成 (市价单, 或执行的挂单) 反映在终端里的单笔市价单 仓位 交易 (合并) 在交易终端上的所有市价单之合 (适用订单类型)

在 MQL5 中, 订单一旦被执行, 在客户端不可改变, 而在 MQL4 里, 当一笔订单未平仓时一些属性依然可以改变。这就是, 在前者中, 一笔订单只是一个简单的发送到服务器的交易请求。在后者上, 它可以用来表示交易请求, 以及这个请求的结果。在这个方面, MQL5 使得整个处理过程更复杂, 以便降低歧义, 可在交易请求和交易结果之间进行明显区分。在 MQL4 中一笔订单可依据不同配置入场和离场, 而在 MQL5 中所有交易可向后追踪到订单, 或触发它们的交易请求。

当发送一个交易请求, 只有两个反馈: 已处理或未处理。如果交易未被处理, 则意味着没有交易, 因为交易服务器出于某种原因 (通常是由于错误) 无法处理它。现在, 如果交易在 MQL5 中已被处理, 客户端和服务器之间达成一笔成交。在此情况下, 订单可被完全或部分执行。

MetaTrader 4 没有这个选项, 因为订单只能完全执行或不执行 (填充或放弃)。

在 MetaTrader 5 中此模式的一个显著缺点是不允许对冲。给定品种的仓位类型可以改变。例如, 给定品种有一笔 0.1 手的多头仓位, 一笔 1.0 手交易量的卖单入场将把此仓位转换为该品种的空头仓位, 交易量为 0.9 手。

MetaTrader 5 (对冲)

MetaTrader 5 中的对冲模式类似于 MetaTrader 4 中使用的约定。对冲模式允许一个品种有一个以上的持仓, 而非把所有已处理交易合并为一笔单一持仓。当交易服务器触发挂单, 或处理市价交易请求后生成一笔持仓。

构件

MQL5 (净持)

MQL4 (大致等效)

订单交易请求 (挂单或市价)交易请求 (挂单或市价)成交成交基于单笔订单完成市价单反映在终端里仓位由单个交易请求合并而来的交易订单反映在终端里

关注作者 华君量化团队公众号 (huajunea) 更多内容 优秀EA软件开发工程师 下载免费EA自动化软件 在 华君量化团队

华君量化团队从2015年至今研发的EA(智能化程序交易系统)是领先的外汇智能化交易研究团队。专注于金融衍生品技术服务领域 .华君量化团队-致力于开发优秀的外汇EA软件 (huajunea)