- EA 交易的主要事件:OnTick
- 基本原理和概念:订单、交易和仓位
- 交易操作类型
- 订单类型
- 按价格和数量划分的订单执行模式
- 挂单到期日期
- 期货订单的保证金计算方法:OrderCalcMargin
- 估算交易操作的利润:OrderCalcProfit
- MqlTradeRequest 结构体
- MqlTradeCheckResult 结构体
- 请求验证:OrderCheck
- 请求发送结果:MqlTradeResult 结构体
- 发送交易请求:OrderSend 和 OrderSendAsync
- 买入和卖出操作
- 修改仓位的止损和/或止盈水平
- 跟踪止损
- 平仓:全部和部分
- 反向平仓:全部和部分
- 挂单
- 修改挂单
- 删除挂单
- 获取活动订单列表
- 订单特性(现行和历史)
- 用于读取活动订单特性的函数
- 按特性选择订单
- 获取仓位列表
- 仓位特性
- 用于读取仓位特性的函数
- 交易特性
- 从历史中选择订单和交易
- 用于从历史中读取订单特性的函数
- 用于从历史中读取交易特性的函数
- 交易类型
- OnTradeTransaction 事件
- 同步和异步请求
- OnTrade 事件
- 监测交易环境变化
- 创建多交易品种 EA 交易
- EA 交易的优势和局限性
- 在 MQL 向导中创建 EA 交易
交易事务类型
除了执行交易操作,MQL 程序还可以响应交易事件。务必要注意的是,此类事件的发生不仅是程序操作的结果,还有其他原因,例如,当用户手动管理或在服务器上执行自动操作时(激活挂单、Stop Loss、Take Profit、Stop Out、仓位转移到新的一天、从账户存取款等)。
不管操作的发起者是谁,都会导致账户上交易事务的执行。交易事务是一些不可见的步骤,包括:
- 处理交易请求
- 更改活动订单列表(包括添加新订单、执行和删除已触发订单)
- 更改订单历史
- 更改交易历史
- 更改仓位
根据操作的特性,有些步骤可能是可选的。例如,修改一个仓位的保护水平将错过三个中间点。当发出买入订单时,市场将经历一个完整的周期:处理请求,为账户创建相应的订单,执行订单,将其从活动列表中删除,添加到订单历史中,然后将相应的交易添加到历史中,并创建新的仓位。所有这些操作都是交易事务。
要接收有关此类事件的通知,应在 EA 交易或指标中说明特殊的 OnTradeTransaction 处理程序函数。我们将在下一节详细讨论。事实上,其中的一个参数,第一个也是最重要的参数,具有预定义结构体 MqlTradeTransaction 的类型。所以我们先来谈谈事务本身。
struct MqlTradeTransaction
|
下表对每个结构体字段进行说明。
字段 |
说明 |
---|---|
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 Loss 和 Take Profit 水平的变化。某些操作,如重新填写,不会触发此事件。
MQL 程序发出的所有交易请求均反映在 TRADE_TRANSACTION_REQUEST 交易中,这允许以延迟的方式分析其执行。这种情况在使用 OrderSendAsync 函数时尤其重要,该函数会立即将控制权返回给调用代码,因此结果是未知的。同时,在使用同步 OrderSend 函数时,会以相同的方式生成事务。
此外,使用 TRADE_TRANSACTION_REQUEST 事务,可以从终端界面分析用户的交易行为。