检查交易品种是否存在

MQL 程序可以通过名称来检查特定交易品种的存在,而不用查看整个交易品种列表。为此,提供了一个 SymbolExist 函数。

bool SymbolExist (const string name, bool &isCustom)

name 参数中,应传递相应交易品种的名称。通过引用传递的 isCustom 参数将由函数来设置,具体取决于指定的交易品种是标准 (false) 还是自定义 (true)。

如果在标准或自定义交易品种中均找不到该交易品种,则该函数返回 false

与该函数有一些相似的是 SYMBOL_EXIST 特性查询。

我们来分析简单脚本 SymbolExists.mq5 来测试该特性。在其参数中,用户可以指定名称,然后将该名称传递给 SymbolExist,并记录结果。如果输入空字符串,将检查当前图表的工作交易品种。默认情况下,该参数设置为“XYZ”,这可能与任何可用的交易品种都不匹配。

#property script_show_inputs
   
input string SymbolToCheck = "XYZ";
   
void OnStart()
{
   const string _SymbolToCheck = SymbolToCheck == "" ? _Symbol : SymbolToCheck;
   bool custom = false;
   PrintFormat("Symbol '%s' is %s"_SymbolToCheck,
      (SymbolExist(_SymbolToCheckcustom) ? (custom ? "custom" : "standard") : "missing"));
}

当该脚本运行两次时(第一次使用默认值,第二次在 EURUSD 图表上使用空行),我们将在日志中获得以下条目。

Symbol 'XYZ' is missing
Symbol 'EURUSD' is standard

如果已经有自定义交易品种或使用简单的计算公式创建新交易品种,可以确保自定义变量已填充。例如,如果在终端中打开 Symbols 窗口并按下 Create symbol 按钮,则可以在 Synthetic tool formula 字段中输入 "SP500/FTSE100"(指数名称可能因你的经纪商而异)并在带有 Symbol 名称的字段中输入 "GBPUSD.INDEX"。单击 OK 将创建一个自定义工具,你可以为其打开一个图表,我们的脚本应在其上显示以下内容:

Symbol 'GBPUSD.INDEX' is custom

设置你自己的交易品种时,不要忘记不仅要设置公式,还要为点大小和价格变化步长(分时报价)设置足够“小”的值。否则,合成报价序列可能会变成“阶梯状”,甚至退化为一条直线。