交易品种交易条件及订单执行模式

在本节中,我们将深入探讨依赖于金融工具设置的交易自动化的各个方面。现在,我们将只研究这些特性,而其实际应用将在后面的章节中介绍。假设读者已经熟悉市场和挂单、交易和头寸等基本术语。

当发送交易请求供执行时,应考虑到在金融市场中,无法保证在特定时刻,该金融工具能够以期望的价格获得全部请求的交易量。因此,实时交易是由价格和交易量执行模式共同调控。模式,或者称为执行策略,定义了当价格已经改变或者当前不能完全执行所请求的交易量时的规则。

在 MQL5 API 中,这些模式可用于每个交易品种,如以下特性,这些特性可通过 SymbolInfoInteger 函数获得。

标识符

说明

SYMBOL_TRADE_EXEMODE

与价格相关的交易执行模式

SYMBOL_FILLING_MODE

与交易量相关的允许订单填充模式标志(位掩码,详见下文)

SYMBOL_TRADE_EXEMODE 特性的值为 ENUM_SYMBOL_TRADE_EXECUTION 枚举的元素。

标识符

说明

SYMBOL_TRADE_EXECUTION_REQUEST

以请求价格进行交易

SYMBOL_TRADE_EXECUTION_INSTANT

即时执行(以流式价格进行交易)

SYMBOL_TRADE_EXECUTION_MARKET

市场执行

SYMBOL_TRADE_EXECUTION_EXCHANGE

交易所执行

终端用户应从 New order 对话框 (F9) 的下拉菜单 Type 中看到所有或大部分这些模式。让我们简单回忆一下它们的含义。有关详细信息,请参考终端文档。

  • 按请求执行 (SYMBOL_TRADE_EXECUTION_REQUEST) - 以先前从经纪商处收到的价格执行市价订单。在发送市价订单之前,交易者向经纪商请求当前价格。以此价格进一步执行订单可以被确认或拒绝。
  • 即时执行 (SYMBOL_TRADE_EXECUTION_INSTANT) - 以当前价格执行市价订单。当发送交易请求执行时,终端自动将当前价格插入订单。如果经纪商接受该价格,订单就被执行。如果经纪商不接受请求的价格,经纪商返回该订单可以执行的价格,称为重新报价。
  • 市场执行 (SYMBOL_TRADE_EXECUTION_MARKET) - 经纪商将执行价格插入订单,无需交易者的额外确认。在这种模式下发送市价订单意味着对执行价格的早期约定。
  • 交易所执行 (SYMBOL_TRADE_EXECUTION_EXCHANGE) - 交易操作以当前市场报价执行。

至于 SYMBOL_FILLING_MODE 中可以与逻辑运算符 OR ('|') 组合的位,其存在或不存在表示以下操作。

标识符

成交策略

SYMBOL_FILLING_FOK

1

填充或删除 (FOK);订单必须只在指定的交易量内执行或取消

SYMBOL_FILLING_IOC

2

立即执行或取消 (IOC);在订单规定的限额内交易市场上的最大交易量或取消

(标识符缺失)

(任意,包括 0)

返回;在部分执行的情况下,剩余交易量的市价订单或限价订单不会被取消,而是保持有效

使用 FOK 和 IOC 模式的可能性由交易服务器决定。

如果启用了 SYMBOL_FILLING_FOK 模式,那么在使用 OrderSend 函数发送订单时,MQL 程序将能够使用相关订单填充类型,其位于 MqlTradeRequest 结构体中:ORDER_FILLING_FOK。同时,如果市场上没有足够的金融工具交易量,订单将不会被执行。应考虑到,所需的交易量可以由市场上现有的几个报价组成,从而导致几笔交易。

如果启用了 SYMBOL_FILLING_IOC 模式,MQL 程序将可以访问同名的 ORDER_FILLING_IOC 订单填充方法(在将订单发送给 OrderSend 函数之前,也会在 MqlTradeRequest 结构中的特殊“填充”字段 (type_filling) 中指定)。使用此模式时,如果无法完全执行,订单将在可用交易量上执行,其剩余订单交易量将被取消。

没有标识符的最新策略为默认模式,并且无论其他模式如何均可用(这就是其能够匹配 0 或任何其他值的原因)。换言之,对于 SYMBOL_FILLING_MODE 特性,即使我们得到值 1 (SYMBOL_FILLING_FOK)、2 (SYMBOL_FILLING_IOC) 或 3 (SYMBOL_FILLING_FOK | SYMBOL_FILLING_IOC),均会隐含返回模式。要使用此策略,在形成订单(填充 MqlTradeRequest 结构)时,我们应指定填充类型 ORDER_FILLING_RETURN。

在所有的 SYMBOL_TRADE_EXEMODE 模式中,有一个关于市场执行 (SYMBOL_TRADE_EXECUTION_MARKET) 的特殊性:在市场执行模式中,始终禁止返回订单。

因为 ORDER_FILLING_FOK 对应于常量 0,所以在交易请求中缺少对填充类型的明确指示即意味着这种特定模式。

在开发 EA 交易时,我们会在实践中考虑所有这些细微差别,但是现在,让我们在一个简单脚本 SymbolFilterExecMode.mq5 中检查特性的读取情况。

#include <MQL5Book/SymbolFilter.mqh>
   
void OnStart()
{
   SymbolFilter f;                      // filter object
   string symbols[];                    // array of symbol names
   long permissions[][2];               // array with property value vectors
   
   // properties to read
   ENUM_SYMBOL_INFO_INTEGER modes[] =
   {
      SYMBOL_TRADE_EXEMODE,
      SYMBOL_FILLING_MODE
   };
   // apply filter - fill arrays
   f.select(truemodessymbolspermissions);
   
   const int n = ArraySize(symbols);
   PrintFormat("===== Trade execution and filling modes for the symbols (%d) ====="n);
   for(int i = 0i < n; ++i)
   {
      Print(symbols[i] + ":");
      for(int j = 0j < ArraySize(modes); ++j)
      {
         // output properties as descriptions and numbers
         PrintFormat("  %s (%d)",
            SymbolMonitor::stringify(permissions[i][j], modes[j]),
            permissions[i][j]);
      }
   }
}

以下是包含脚本结果的日志片段。除了最后一个 SP500m (SYMBOL_TRADE_EXECUTION_MARKET),此处几乎所有交易品种都有按价格 (SYMBOL_TRADE_EXECUTION_INSTANT) 立即执行模式。此处,我们可以找到各种交易量填充模式,包括单独的 SYMBOL_FILLING_FOK、SYMBOL_FILLING_IOC 及其组合。只有 BTCUSD 指定了 SYMBOL_FILLING_RETURN,即收到值 0(没有 FOK 和 IOC 位)。

===== Trade execution and filling modes for the symbols (13) =====
EURUSD:
  SYMBOL_TRADE_EXECUTION_INSTANT (1)
  [ _SYMBOL_FILLING_FOK ] (1)
GBPUSD:
  SYMBOL_TRADE_EXECUTION_INSTANT (1)
  [ _SYMBOL_FILLING_FOK ] (1)
...
USDCNH:
  SYMBOL_TRADE_EXECUTION_INSTANT (1)
  [ _SYMBOL_FILLING_FOK _SYMBOL_FILLING_IOC ] (3)
USDRUB:
  SYMBOL_TRADE_EXECUTION_INSTANT (1)
  [ _SYMBOL_FILLING_IOC ] (2)
AUDUSD:
  SYMBOL_TRADE_EXECUTION_INSTANT (1)
  [ _SYMBOL_FILLING_FOK ] (1)
NZDUSD:
  SYMBOL_TRADE_EXECUTION_INSTANT (1)
  [ _SYMBOL_FILLING_FOK _SYMBOL_FILLING_IOC ] (3)
...
XAUUSD:
  SYMBOL_TRADE_EXECUTION_INSTANT (1)
  [ _SYMBOL_FILLING_FOK _SYMBOL_FILLING_IOC ] (3)
BTCUSD:
  SYMBOL_TRADE_EXECUTION_INSTANT (1)
  [(_SYMBOL_FILLING_RETURN)] (0)
SP500m:
  SYMBOL_TRADE_EXECUTION_MARKET (2)
  [ _SYMBOL_FILLING_FOK ] (1)

注意,填充模式标识符中出现下划线是因为我们必须用具有常量值的元素来定义自己的枚举 SYMBOL_FILLING (SymbolMonitor.mqh)。执行此操作是因为 MQL5 没有此类内置枚举,但同时,我们不能将枚举的元素命名为内置常量,因为会导致名称冲突。