- EA 交易的主要事件:OnTick
- 基本原理和概念:订单、交易和仓位
- 交易操作类型
- 订单类型
- 按价格和数量划分的订单执行模式
- 挂单到期日期
- 期货订单的保证金计算方法:OrderCalcMargin
- 估算交易操作的利润:OrderCalcProfit
- MqlTradeRequest 结构体
- MqlTradeCheckResult 结构体
- 请求验证:OrderCheck
- 请求发送结果:MqlTradeResult 结构体
- 发送交易请求:OrderSend 和 OrderSendAsync
- 买入和卖出操作
- 修改仓位的止损和/或止盈水平
- 跟踪止损
- 平仓:全部和部分
- 反向平仓:全部和部分
- 挂单
- 修改挂单
- 删除挂单
- 获取活动订单列表
- 订单特性(现行和历史)
- 用于读取活动订单特性的函数
- 按特性选择订单
- 获取仓位列表
- 仓位特性
- 用于读取仓位特性的函数
- 交易特性
- 从历史中选择订单和交易
- 用于从历史中读取订单特性的函数
- 用于从历史中读取交易特性的函数
- 交易类型
- OnTradeTransaction 事件
- 同步和异步请求
- OnTrade 事件
- 监测交易环境变化
- 创建多交易品种 EA 交易
- EA 交易的优势和局限性
- 在 MQL 向导中创建 EA 交易
MqlTradeRequest 结构体
MQL5 API 交易函数(特别是 OrderCheck 和 OrderSend)在几个内置结构体上运行。因此,在讨论这些函数本身之前,我们必须考虑这些结构体。
我们从 MqlTradeRequest 结构体开始,该结构体包含执行交易所需的所有字段。
struct MqlTradeRequest
|
你无须害怕大量的字段:该结构体的设计绝对服务于所有可能类型的交易请求,但在每种具体情况下,通常仅使用少数几个字段。
在填充字段之前,建议通过在其定义中显式初始化或调用 ZeroMemory 函数来使该结构体归零。
MqlTradeRequest request = {};
|
这样可以避免在没有明确赋值的字段中向 API 函数传递随机值时可能出现的错误和负面影响。
下表提供了这些字段的简要说明。我们将在介绍交易操作时看到如何填充这些字段。
字段 |
说明 |
---|---|
action |
交易操作类型,来自 ENUM_TRADE_REQUEST_ACTIONS |
magic |
专家 ID(可选) |
order |
请求修改的挂单订单号 |
symbol |
交易金融工具名称 |
volume |
每手请求的交易量 |
price |
执行订单时必须满足的价格 |
stoplimit |
当 ORDER_TYPE_BUY_STOP_LIMIT 和 ORDER_TYPE_SELL_STOP_LIMIT 订单被激活时,下达限价订单的价格 |
sl |
当价格朝着不利的方向移动时,触发 Stop Loss 的价格 |
tp |
当价格朝着有利的方向移动时,触发 Take Profit 的价格 |
deviation |
与要价的最大可接受偏差(以点数为单位) |
type |
订单类型,来自 ENUM_ORDER_TYPE |
type_filling |
订单填充类型,来自 ENUM_ORDER_TYPE_FILLING |
type_time |
挂单到期类型,来自 ENUM_ORDER_TYPE_TIME |
expiration |
挂单到期日期 |
comment |
订单的注释 |
position |
仓位订单号 |
position_by |
TRADE_ACTION_CLOSE_BY 操作的反向仓位订单号 |
要发送交易操作的订单,需要根据操作特性填写一组不同的字段。有些字段是必填的,有些是可选的(填写时可以省略)。接下来,我们将在具体操作的上下文中更深入地了解字段需求。
该程序可以检查已形成的 MqlTradeRequest 结构体是否正确(使用 OrderCheck 函数),或将其发送到服务器(使用 OrderSend 函数)。如果成功,将执行请求的操作。
只有 action 字段是所有交易活动的必填字段。
magic 字段中的唯一编号通常仅用于市场买入/卖出请求或在创建新挂单时使用。这导致随后用该编号标记已完成的交易和仓位,从而能够对交易行为的处理进行分析。修改仓位或挂单的价格水平以及将其删除时,此字段无效。
从 MetaTrader 5 界面手动执行交易操作时,无法设置 magic 标识符,因此其等于零。这提供了一种在分析历史时区分手动和自动交易的常用方法,但这种方法不完全可靠。事实上,EA 交易也可以使用零标识符。因此,要找出谁以及如何执行特定的交易操作,请使用各自的对应特性,订单对应 ORDER_REASON、交易对应 DEAL_REASON、仓位对应POSITION_REASON。
每个 EA 交易可以设置自己唯一的 ID,甚至可以出于不同目的而使用几个 ID(按交易策略、信号等细分)。仓位的 magic 号对应于参与仓位形成的最后一笔交易的 magic 号
symbol 字段中的交易品种名称仅在开仓或加仓时重要,在下达挂单时也是如此。在修改和关闭订单和仓位的情况下将被忽略,但此处有一个小的例外。由于每个交易品种在净额结算账户上只能有一个仓位,因此 symbol 字段可用于在更改其保护价格水平(Stop Loss 和 Take Profit)的请求中识别仓位。
volume 字段的使用方式相同:在即时买入/卖出订单中或创建挂单时需要交易量字段。需要注意的是,操作中的实际交易量将取决于 执行模式 ,并且可能不同于所请求的交易量。
price 字段也有一些限制:为执行模式为 SYMBOL_TRADE_EXECUTION_MARKET 或 SYMBOL_TRADE_EXECUTION_EXCHANGE 的金融工具发送市场订单(action 中的 TRADE_ACTION_DEAL)时,将忽略该字段。
stoplimit 字段仅在设置止损订单时才有意义,即当 type 字段包含 ORDER_TYPE_BUY_STOP_LIMIT 或 ORDER_TYPE_SELL_STOP_LIMIT 时。该字段指定当价格达到 price 值时下达限价挂单的价格(这个事实可被 MetaTrader 5 服务器跟踪,直到此时挂单才会显示在交易系统中)。
下达挂单时,其到期规则在如下一对字段中设置:type_time 和 expiration。后者包含 datetime 类型的值,仅当 type_time 等于 ORDER_TIME_SPECIFIED 或 ORDER_TIME_SPECIFIED_DAY 时,才会考虑该值。
最后一点,后面几个字段与查询中的仓位标识相关。基于订单(手动或编程)创建的每个新仓位都会获得一个由系统分配的订单号,这是一个唯一编号。通常,其对应于订单的票据,因此会开仓,但可能根据服务器上的服务操作而变化,例如,通过重新开仓来累计掉期。
我们将在单独的章节中讨论如何获取仓位、交易和订单的特性。目前我们需要注意的是,当变更仓位或平仓时,应填写 position 字段,以便明确识别。理论上,在净额结算账户上,在 symbol 字段中指明仓位交易品种就足够了,但为了算法的统一,最好是保留 position 字段的功能。
position_by 字段用于反向平仓 (TRADE_ACTION_CLOSE_BY)。其应表明一个为相同的交易品种开立的仓位,但方向与 position 相反(仅适用于 对冲账户)。
deviation 字段仅在“即时执行”和“请求执行”模式下影响市场订单的执行。
在相关章节中将给出填充每种交易操作结构体的示例。