MqlTradeRequest 结构体

MQL5 API 交易函数(特别是 OrderCheck OrderSend)在几个内置结构体上运行。因此,在讨论这些函数本身之前,我们必须考虑这些结构体。

我们从 MqlTradeRequest 结构体开始,该结构体包含执行交易所需的所有字段。

struct MqlTradeRequest 

   ENUM_TRADE_REQUEST_ACTIONS action;       // Type of action to perform 
   ulong                      magic;        // Unique Expert Advisor number 
   ulong                      order;        // Order ticket 
   string                     symbol;       // Name of the trading instrument 
   double                     volume;       // Requested trade volume in lots 
   double                     price;        // Price  
   double                     stoplimit;    // StopLimit order level 
   double                     sl;           // Stop Loss order level 
   double                     tp;           // Take Profit order level 
   ulong                      deviation;    // Maximum deviation from the given price
   ENUM_ORDER_TYPE            type;         // Order type 
   ENUM_ORDER_TYPE_FILLING    type_filling// Order type by execution 
   ENUM_ORDER_TYPE_TIME       type_time;    // Order type by duration 
   datetime                   expiration;   // Order expiration date 
   string                     comment;      // Comment to the order 
   ulong                      position;     // Position ticket 
   ulong                      position_by;  // Opposite position ticket 
};

你无须害怕大量的字段:该结构体的设计绝对服务于所有可能类型的交易请求,但在每种具体情况下,通常仅使用少数几个字段。

在填充字段之前,建议通过在其定义中显式初始化或调用 ZeroMemory 函数来使该结构体归零。

   MqlTradeRequest request = {};
   ...
   ZeroMemory(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 LossTake 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_timeexpiration。后者包含 datetime 类型的值,仅当 type_time 等于 ORDER_TIME_SPECIFIED 或 ORDER_TIME_SPECIFIED_DAY 时,才会考虑该值。

最后一点,后面几个字段与查询中的仓位标识相关。基于订单(手动或编程)创建的每个新仓位都会获得一个由系统分配的订单号,这是一个唯一编号。通常,其对应于订单的票据,因此会开仓,但可能根据服务器上的服务操作而变化,例如,通过重新开仓来累计掉期。

我们将在单独的章节中讨论如何获取仓位、交易和订单的特性。目前我们需要注意的是,当变更仓位或平仓时,应填写 position 字段,以便明确识别。理论上,在净额结算账户上,在 symbol 字段中指明仓位交易品种就足够了,但为了算法的统一,最好是保留 position 字段的功能。

position_by 字段用于反向平仓 (TRADE_ACTION_CLOSE_BY)。其应表明一个为相同的交易品种开立的仓位,但方向与 position 相反(仅适用于 对冲账户)。

deviation 字段仅在“即时执行”和“请求执行”模式下影响市场订单的执行。

在相关章节中将给出填充每种交易操作结构体的示例。