获取可用的交易品种和市场报价列表

MQL5 API 有几个函数可用于进行交易品种操作。使用这些函数,可以找到可用交易品种的总数、Market Watch 中选择的交易品种数及其名称。我们知道,终端中可用交易品种的一般列表以分层结构的形式显示在 Symbols 对话框中,用户可以使用命令 View -> Symbols 或从 Market Watch 上下文菜单打开该对话框。该列表包括经纪商提供的交易品种和本地创建的 自定义交易品种 。可以使用 SymbolsTotal 函数来计算交易品种的总数。

int SymbolsTotal(bool selected)

selected 参数指定是仅请求 Market Watch 中的交易品种 (true),还是请求所有可用的交易品种 (false)。

SymbolName 函数通常与 SymbolsTotal 一起使用。该函数通过交易品种的索引返回交易品种的名称(这里不考虑将交易品种存储分组到逻辑文件夹中,请参见特性 SYMBOL_PATH)。

string SymbolName(int index, bool selected)

index 参数用于指定所请求交易品种的索引。 Index 索引值必须介于 0 到交易品种数之间,取决于第二个参数 selected 指定的请求上下文:true 将枚举限制为在 Market Watch 中选择的交易品种,而 false 则绝对匹配所有交易品种(类似于 SymbolsTotal)。因此,在调用 SymbolName 时,请将参数 selected 设置为与之前用于定义索引范围的 SymbolsTotal 调用相同的值。

如果出现错误,特别是如果请求的索引超出列表范围,该函数将返回一个空字符串,错误代码将被写入变量 _LastError

值得注意的是,当启用 selected 选项时,函数对 SymbolsTotalSymbolName 将返回由终端实际更新的交易品种列表信息,即,与服务器执行持续同步的交易品种以及 MQL 程序可获得报价历史的交易品种。该列表可能比 Market Watch 中显示的列表大,其中,元素是由用户或通过 MQL 程序显式添加的(要了解如何添加,请参阅Market Watch中的 编辑列表 一节)。这些交易品种在窗口中是不可见的,当需要它们来计算交叉汇率时,终端会自动连接它们。在交易品种特性中,有两个特性可用于区分显式选择 (SYMBOL_VISIBLE) 和隐式选择 (SYMBOL_SELECT) 的选项;我们将在 交易品种状态检查一节中讨论。严格地讲,对于 SymbolsTotalSymbolName 函数,将 selected 设置为 true 对应启用了 SYMBOL_SELECT 的扩展交易品种集,而不仅仅是 SYMBOL_VISIBLE 为 true 的扩展交易品种集。

Market Watch 交易品种返回的顺序与终端窗口中的顺序一致(需考虑用户可能进行重新排列,但不考虑按任何列排序(即使已启用)。不能以编程方式更改 Market Watch 中的交易品种顺序。

Symbols 的一般列表中的顺序由终端自己设定(Market Watch 的内容和排序方式不影响该顺序)。

例如,我们看一下简单脚本 SymbolList.mq5,用于将可用的交易品种打印到日志中。通过输入参数 MarketWatchOnly,用户可将列表限定为 Market Watch 交易品种(如果参数为 true),也可获取完整列表 (false)。

#property script_show_inputs
   
#include <MQL5Book/PRTF.mqh>
   
input bool MarketWatchOnly = true;
   
void OnStart()
{
   const int n = SymbolsTotal(MarketWatchOnly);
   Print("Total symbol count: "n);
   // write a list of symbols in the Market Watch or all available
   for(int i = 0i < n; ++i)
   {
      PrintFormat("%4d %s"iSymbolName(iMarketWatchOnly));
   }
   // intentionally asking for out-of-range to show an error
   PRTF(SymbolName(nMarketWatchOnly)); // MARKET_UNKNOWN_SYMBOL(4301)
}

以下是一个日志示例。

Total symbol count: 10
   0 EURUSD
   1 XAUUSD
   2 BTCUSD
   3 GBPUSD
   4 USDJPY
   5 USDCHF
   6 AUDUSD
   7 USDCAD
   8 NZDUSD
   9 USDRUB
SymbolName(n,MarketWatchOnly)= / MARKET_UNKNOWN_SYMBOL(4301)