交易品种的说明性特性

该平台为 MQL 程序提供了一组说明重要定性特征的文本特性。例如,在基于一篮子金融工具开发指标或交易策略时,可能需要根据来源国、经济部门或基础资产名称(如果工具为衍生工具)选择交易品种。

标识符

说明

SYMBOL_BASIS

衍生品基础资产的名称

SYMBOL_CATEGORY

金融工具所属类别的名称

SYMBOL_COUNTRY

金融工具所归属的国家

SYMBOL_SECTOR_NAME

金融工具所属的经济部门

SYMBOL_INDUSTRY_NAME

金融工具所属的经济分支或行业类型

SYMBOL_BANK

当前报价来源

SYMBOL_DESCRIPTION

交易品种的字符串说明

SYMBOL_EXCHANGE

交易品种进行交易的交易所或市场名称

SYMBOL_ISIN

国际证券识别代码系统中唯一的 12 位字母数字代码 - ISIN(国际证券识别号)

SYMBOL_PAGE

带有交易品种信息的互联网网页地址

SYMBOL_PATH

交易品种树中的路径

程序可以应用这些特性分析的另一种情况发生在寻找一种货币到另一种货币的兑换率时。我们已经知道如何找到一个 基础货币和报价货币正确组合的交易品种,但问题是可能有多个这样的交易品种。在这种情况下,读取像 SYMBOL_SECTOR_NAME(你需要寻找“货币”或者一个同义词;查看经纪商的规范)或 SYMBOL_PATH 之类的特性可能有所帮助。

SYMBOL_PATH 包含交易品种目录中包含特定交易品种的文件夹的整个层次结构:文件夹名称用双反斜杠 ('\\') 分隔,与文件系统相同。路径的最后一个元素为交易品种本身的名称。

一些字符串特性有整数对应项。特别是,你可以使用 SYMBOL_SECTOR 特性代替 SYMBOL_SECTOR_NAME,该特性可返回一个枚举元素 ENUM_SYMBOL_SECTOR 以及所有支持的行业板块。类似地,对于 SYMBOL_INDUSTRY_NAME,也有一个类似的特性 SYMBOL_INDUSTRY,其具有 ENUM_SYMBOL_INDUSTRY 枚举类型。

如果需要,MQL 程序甚至可以通过读取 SYMBOL_BACKGROUND_COLOR 特性来找到在市场报价中显示交易品种时使用的背景颜色。这将允许那些程序使用 图形对象 (对话框、列表等)在图表上创建自己的界面,使其与本机终端控件保持统一。

考虑示例脚本 SymbolFilterDescription.mq5,该脚本可为 Market Watch 交易品种输出四个预定义的文本特性。第一个是 SYMBOL_DESCRIPTION(不要与交易品种本身的名称混淆),结果列表将通过其进行排序。其他三个仅供参考:SYMBOL_SECTOR_NAME、SYMBOL_COUNTRY 和 SYMBOL_PATH。对于每个经纪商,所有值都以特定的方式填写(对于同一个报价机,可能会有差异)。

虽然我们没有提及,但是我们的 SymbolFilter 类实现了 equal 方法的特殊重载来比较字符串。其支持使用通配符“*”代表 0 或更多任意字符的模式来搜索子字符串的出现。例如,“*ian*”可查找包含子字符串“ian”(任意位置)的所有字符,“*Index”仅查找以“Index”结尾的字符串。

此功能类似于用户可用的 Symbols 对话框中的子字符串搜索。但是,不需要指定通配符,因为总是会搜索子字符串。在源代码 (SymbolFilter.mqh) 提供的算法中,我们保留了搜索完全匹配(没有 '*’ 通配符)或子串(至少有一个星号)的功能。

比较区分大小写。如果需要,很容易修改代码进行比较,而不用区分大小写字母。

如果给定新特性,我们可在交易品种说明中为搜索字符串定义一个输入变量。如果该变量为空,将显示 Market Watch 窗口中的所有交易品种。

input string SearchPattern = "";

其它方面,一切如常。

void OnStart()
{
   SymbolFilter f;                      // filter object
   string symbols[];                    // array of names
   string text[][4];                    // array of vectors with data
   
   // properties to read
   ENUM_SYMBOL_INFO_STRING fields[] =
   {
      SYMBOL_DESCRIPTION,
      SYMBOL_SECTOR_NAME,
      SYMBOL_COUNTRY,
      SYMBOL_PATH
   };
   
   if(SearchPattern != "")
   {
      f.let(SYMBOL_DESCRIPTIONSearchPattern);
   }
   
   // apply the filter and get arrays sorted by description
   f.select(truefieldssymbolstexttrue);
   
   const int n = ArraySize(symbols);
   PrintFormat("===== Text fields for symbols (%d) ====="n);
   for(int i = 0i < n; ++i)
   {
      Print(symbols[i] + ":");
      ArrayPrint(text0NULLi10);
   }
}

以下是该列表的一个可能版本(带缩写)。

===== Text fields for symbols (16) =====
AUDUSD:
"Australian Dollar vs US Dollar" "Currency"   ""   "Forex\AUDUSD"
EURUSD:
"Euro vs US Dollar" "Currency"   ""   "Forex\EURUSD"     
UK100:
"FTSE 100 Index" "Undefined"   ""   "Indexes\UK100" 
XAUUSD:
"Gold vs US Dollar" "Commodities"   ""   "Metals\XAUUSD"    
JAGG:
    "JPMorgan U.S. Aggregate Bond ETF"  "Financial"
    "USA"   "ETF\United States\NYSE\JPMorgan\JAGG"
NZDUSD:
"New Zealand Dollar vs US Dollar" "Currency"   ""   "Forex\NZDUSD"
GBPUSD:
"Pound Sterling vs US Dollar" "Currency"   ""   "Forex\GBPUSD"
SP500m:
"Standard & Poor's 500" "Undefined"   ""   "Indexes\SP500m"
FIHD:
    "UBS AG FI Enhanced Global High Yield ETN" "Financial"
    "USA"   "ETF\United States\NYSE\UBS\FIHD"         
...

如果我们将搜索字符串“*ian*”输入到输入变量 SearchPattern 中,可得到以下结果。

===== Text fields for symbols (3) =====
AUDUSD:
"Australian Dollar vs US Dollar" "Currency"   ""   "Forex\AUDUSD"
USDCAD:
"US Dollar vs Canadian Dollar" "Currency"   ""   "Forex\USDCAD"
USDRUB:
"US Dollar vs Russian Ruble" "Currency"   ""   "Forex\USDRUB"