允许的交易操作量

在后面的章节中,我们将学习如何进行 EA 交易编程,我们需要控制许多决定成功发送交易指令的交易品种特征。特别是,这适用于交易品种规范中指定允许操作范围的部分。MQL5 中也提供了相应的特性。它们都是 double 类型,并且通过 SymbolInfoDouble 函数请求。

标识符

说明

SYMBOL_VOLUME_MIN

最小交易量手数

SYMBOL_VOLUME_MAX

最大交易量手数

SYMBOL_VOLUME_STEP

改变交易量的最小步长手数

SYMBOL_VOLUME_LIMIT

某一方向(买入或卖出)上未平仓头寸和挂单的最大允许总交易量

SYMBOL_TRADE_CONTRACT_SIZE

交易合约大小 = 1 手

尝试买卖交易量小于最小值、大于最大值或不是一个步长倍数的金融工具将会导致错误。在与 交易 API 相关的章节中,我们将实现一个代码来统一必要的检查,并在调用 MQL5 API 交易函数之前使交易量标准化。

此外,MQL 程序还应检查 SYMBOL_VOLUME_LIMIT。例如,限制为 5 手,你可以有一个交易量为 5 手的未平仓买入头寸,并下达一个交易量为 5 手的 Sell Limit 挂单。但是,你不能下达挂单 Buy Limit(因为一个方向的累计成交量将超过该限制)或设置超过 5 手的 Sell Limit

作为一个说明性示例,考虑脚本 SymbolFilterVolumes.mq5,该脚本记录了所选交易品种的上述特性值。我们将 MinimalContractSize 变量添加到输入参数中,以便能够通过 SYMBOL_TRADE_CONTRACT_SIZE 特性筛选交易品种:我们只显示那些合约大小大于指定值的交易品种(默认情况下为 0,即所有交易品种均满足条件)。

#include <MQL5Book/SymbolFilter.mqh>
   
input bool MarketWatchOnly = true;
input double MinimalContractSize = 0;

OnStart 的开始,让我们定义一个筛选对象并输出数组,以获得特性名和值的列表,作为四个字段的向量 doublevolumeIds 数组中显示了四个必需特性列表。

void OnStart()
{
   SymbolFilter f;                      // filter object
   string symbols[];                    // receiving array with names
   double volumeLimits[][4];            // receiving array with data vectors
   
   // requested symbol properties
   ENUM_SYMBOL_INFO_DOUBLE volumeIds[] =
   {
      SYMBOL_VOLUME_MIN,
      SYMBOL_VOLUME_STEP,
      SYMBOL_VOLUME_MAX,
      SYMBOL_VOLUME_LIMIT
   };
   ...

接下来,我们根据合约大小(应大于指定的大小)应用筛选器,并获取与匹配交易品种的交易量相关联的规范字段。

   f.let(SYMBOL_TRADE_CONTRACT_SIZEMinimalContractSizeSymbolFilter::IS::GREATER)
   .select(MarketWatchOnlyvolumeIdssymbolsvolumeLimits);
   
   const int n = ArraySize(volumeLimits);
   PrintFormat("===== Volume limits of the symbols (%d) ====="n);
   string title = "";
   for(int i = 0i < ArraySize(volumeIds); ++i)
   {
      title += "\t" + EnumToString(volumeIds[i]);
   }
   Print(title);
   for(int i = 0i < n; ++i)
   {
      Print(symbols[i]);
      ArrayPrint(volumeLimits3NULLi10);
   }
}

对于默认设置,该脚本可能会显示如下结果(带缩写)。

===== Volume limits of the symbols (13) =====
SYMBOL_VOLUME_MIN SYMBOL_VOLUME_STEP SYMBOL_VOLUME_MAX SYMBOL_VOLUME_LIMIT
EURUSD
  0.010   0.010 500.000   0.000
GBPUSD
  0.010   0.010 500.000   0.000
USDCHF
  0.010   0.010 500.000   0.000
USDJPY
  0.010   0.010 500.000   0.000
USDCNH
   0.010    0.010 1000.000    0.000
USDRUB
   0.010    0.010 1000.000    0.000
...
XAUUSD
  0.010   0.010 100.000   0.000
BTCUSD
   0.010    0.010 1000.000    0.000
SP500m
 0.100  0.100  5.000 15.000

某些交易品种可能不受 SYMBOL_VOLUME_LIMIT 的限制(值为 0)。你可以将结果与交易品种规范进行比较:它们必须匹配。