交易事务类型

除了执行交易操作,MQL 程序还可以响应交易事件。务必要注意的是,此类事件的发生不仅是程序操作的结果,还有其他原因,例如,当用户手动管理或在服务器上执行自动操作时(激活挂单、Stop LossTake ProfitStop Out、仓位转移到新的一天、从账户存取款等)。

不管操作的发起者是谁,都会导致账户上交易事务的执行。交易事务是一些不可见的步骤,包括:

  • 处理交易请求
  • 更改活动订单列表(包括添加新订单、执行和删除已触发订单)
  • 更改订单历史
  • 更改交易历史
  • 更改仓位

根据操作的特性,有些步骤可能是可选的。例如,修改一个仓位的保护水平将错过三个中间点。当发出买入订单时,市场将经历一个完整的周期:处理请求,为账户创建相应的订单,执行订单,将其从活动列表中删除,添加到订单历史中,然后将相应的交易添加到历史中,并创建新的仓位。所有这些操作都是交易事务。

要接收有关此类事件的通知,应在 EA 交易或指标中说明特殊的 OnTradeTransaction 处理程序函数。我们将在下一节详细讨论。事实上,其中的一个参数,第一个也是最重要的参数,具有预定义结构体 MqlTradeTransaction 的类型。所以我们先来谈谈事务本身。

struct MqlTradeTransaction

   ulong                         deal;             // Deal ticket 
   ulong                         order;            // Order ticket 
   string                        symbol;           // Name of the trading instrument 
   ENUM_TRADE_TRANSACTION_TYPE   type;             // Trade transaction type 
   ENUM_ORDER_TYPE               order_type;       // Order type
   ENUM_ORDER_STATE              order_state;      // Order state 
   ENUM_DEAL_TYPE                deal_type;        // Deal type 
   ENUM_ORDER_TYPE_TIME          time_type;        // Order type by duration
   datetime                      time_expiration;  // Order expiration date 
   double                        price;            // Price 
   double                        price_trigger;    // Stop limit order trigger price 
   double                        price_sl;         // Stop Loss Level 
   double                        price_tp;         // Take Profit Level 
   double                        volume;           // Volume in lots 
   ulong                         position;         // Position ticket 
   ulong                         position_by;      // Opposite position ticket 
};

下表对每个结构体字段进行说明。

字段

说明

deal

交易票

order

订单号

symbol

发生事务的交易金融工具名称

type

交易事务类型 ENUM_TRADE_TRANSACTION_TYPE(见下文)

order_type

订单类型 ENUM_ORDER_TYPE

order_state

订单状态 ENUM_ORDER_STATE

deal_type

交易类型 ENUM_DEAL_TYPE

time_type

按到期日期分类的订单类型 ENUM_ORDER_TYPE_TIME

time_expiration

挂单到期日期

price

订单、交易或仓位的价格,具体取决于事务

price_trigger

限制止损订单的止损价格(触发价格)

price_sl

Stop Loss 价格;可能指订单、交易或仓位,具体取决于事务

price_tp

Take Profit 价格;可能指订单、交易或仓位,具体取决于事务

volume

每手交易量;可能指示订单、交易或仓位的当前交易量,具体取决于事务

position

受事务影响的仓位订单号

position_by

反向仓位订单号

有些字段仅在特定情况下有意义。具体来说,time_expiration 字段是为 time_type 等于 ORDER_TIME_SPECIFIED 或 ORDER_TIME_SPECIFIED_DAY 到期类型的订单填充的。price_trigger 字段仅用于限价止损订单(ORDER_TYPE_BUY_STOP_LIMIT 和 ORDER_TYPE_SELL_STOP_LIMIT)。

同样显而易见的是,仓位修改在仓位订单号(position 字段)上进行操作,但不使用订单或交易订单号。此外,position_by 字段专门保留用于平仓对冲仓位,也就是为同一工具但方向相反而打开的仓位。

事务分析的定义特性是其类型(type 字段)。为了进行说明,MQL5 API 引入了一个特殊的枚举 ENUM_TRADE_TRANSACTION_TYPE,其包含所有可能的事务类型。

标识符

说明

TRADE_TRANSACTION_ORDER_ADD

添加新订单

TRADE_TRANSACTION_ORDER_UPDATE

更改活动订单

TRADE_TRANSACTION_ORDER_DELETE

删除活动订单

TRADE_TRANSACTION_DEAL_ADD

将交易添加至历史

TRADE_TRANSACTION_DEAL_UPDATE

在历史中更改交易

TRADE_TRANSACTION_DEAL_DELETE

从历史中删除交易

TRADE_TRANSACTION_HISTORY_ADD

将订单作为执行或取消的结果添加到历史

TRADE_TRANSACTION_HISTORY_UPDATE

在历史中更改订单

TRADE_TRANSACTION_HISTORY_DELETE

从历史中删除订单

TRADE_TRANSACTION_POSITION

更改仓位

TRADE_TRANSACTION_REQUEST

通知服务器已经处理了交易请求,并且已经收到其处理结果

我们提供一些解释说明。

在 TRADE_TRANSACTION_ORDER_UPDATE 类型的事务中,订单变化不仅包括客户端或交易服务器方面的显式变化,还包括其状态的变化(例如,从状态 ORDER_STATE_STARTED 到 ORDER_STATE_PLACED 或从 ORDER_STATE_PLACED 到 ORDER_STATE_PARTIAL 等的变化)。

在 TRADE_TRANSACTION_ORDER_DELETE 事务期间,订单可以作为服务器上相应的显式请求或执行(填充)的结果而删除。在这两种情况下,该订单均会被传送到历史,并且交易 TRADE_TRANSACTION_HISTORY_ADD 也必须发生。

TRADE_TRANSACTION_DEAL_ADD 交易不仅是订单执行的结果,也是账户余额事务的结果。

有些事务(如 TRADE_TRANSACTION_DEAL_UPDATE、TRADE_TRANSACTION_DEAL_DELETE 和 TRADE_TRANSACTION_HISTORY_DELETE)非常罕见,因为它们说明了历史中的交易或订单在服务器上被追溯更改或删除的情况。通常,这是与外部交易系统(交易所)同步的结果。

需要注意的是,增加或清算仓位并不会导致出现 TRADE_TRANSACTION_POSITION 事务。这种类型的事务会通知交易服务器端的仓位已被用户手动更改或者被程序更改。具体来说,仓位可以经历交易量(部分反向平仓、冲销)、开盘价以及 Stop LossTake Profit 水平的变化。某些操作,如重新填写,不会触发此事件。

MQL 程序发出的所有交易请求均反映在 TRADE_TRANSACTION_REQUEST 交易中,这允许以延迟的方式分析其执行。这种情况在使用 OrderSendAsync 函数时尤其重要,该函数会立即将控制权返回给调用代码,因此结果是未知的。同时,在使用同步 OrderSend 函数时,会以相同的方式生成事务。

此外,使用 TRADE_TRANSACTION_REQUEST 事务,可以从终端界面分析用户的交易行为。