自定义交易品种特性

在本章的前言中,我们提到了 自定义交易品种。这些交易品种的报价是根据用户的命令或以编程方式在终端中直接创建的。

例如,自定义交易品种可用于根据包含其他市场报价交易品种的公式创建合成工具。用户可以直接在 终端界面中执行该操作。

MQL 程序可以在 MQL5 中实现更复杂的场景,例如合并不同时间段的不同金融工具、根据给定的随机分布生成序列,或者从外部来源接收数据(报价、柱线或分时报价)。

为了能够在算法中区分标准交易品种和自定义交易品种,MQL5 提供了 SYMBOL_CUSTOM 特性,这是一个逻辑符号,用于判定某个交易品种是否为自定义。

如果该交易品种有公式,则可通过 SYMBOL_FORMULA 字符串特性获得。我们知道,在公式中,你可以使用其他交易品种的名称,以及数学函数和运算符。以下是几个例子:

  • 合成交易品种:"@ESU19"/EURCAD
  • 日历点差:"Si-9.13"-"Si-6.13"
  • 欧元指数:34.38805726 * pow(EURUSD,0.3155) * pow(EURGBP,0.3056) * pow(EURJPY,0.1891) * pow(EURCHF,0.1113) * pow(EURSEK,0.0785)

指定公式对用户而言很方便,但通常不在 MQL 程序中使用,因为 MQL 程序可以直接在代码中计算公式,借助非标准函数并拥有更强的控制能力(特别是对于每条分时报价,而非依赖每 100 毫秒 1 次的计时器)。

我们用脚本 SymbolFilterCustom.mq5 中的特性来检查运行情况:该脚本记录了所有自定义交易品种及其公式(如果有的话)。

input bool UseMarketWatch = false;
   
void OnStart()
{
   SymbolFilter f;                // filter object
   string symbols[];              // array for symbol names
   string formulae[];             // array for formulas
   
 // apply filter and fill arrays
   f.let(SYMBOL_CUSTOMtrue)
   .select(UseMarketWatchSYMBOL_FORMULAsymbolsformulae);
   const int n = ArraySize(symbols);
   
   PrintFormat("===== %s custom symbols =====",
      (UseMarketWatch ? "Market Watch" : "All available"));
   PrintFormat("Total symbols: %d"n);
   
   for(int i = 0i < n; ++i)
   {
      Print(symbols[i], " "formulae[i]);
   }
}

以下是找到的唯一自定义字符的结果。

===== All available custom symbols =====
Total symbols: 1
synthEURUSD SP500m/UK100