检查交易品种状态

前面我们看了几个与交易品种状态相关的函数。注意, SymbolExist 用于检查某个交易品种是否存在, SymbolSelect 用于检查是否包含在 Market Watch 列表中。在交易品种的特性中,有几个用途相似的标志,与上述函数相比,它们的使用既有优点也有缺点。

特别是,SYMBOL_SELECT 特性可用于确定在 Market Watch 中是否选择了指定的交易品种,而 SymbolSelect 函数可更改该特性。

与类似的 SYMBOL_EXIST 特性不同,SymbolExist 函数还可以在输出变量中填充一个指示,用于表明交易品种是否为用户定义交易品种。查询特性时,必须分别分析这两个特性,因为自定义交易品种的特性存储在另一个特性 SYMBOL_CUSTOM 中。但是,在某些情况下,程序可能只需要一个特性,这样就可以进行单独查询。

所有标志都是通过 SymbolInfoInteger 函数获得的布尔值。

标识符

说明

SYMBOL_EXIST

表示具有给定名称的交易品种存在

SYMBOL_SELECT

表示该交易品种已被选中显示在 Market Watch

SYMBOL_VISIBLE

表示指定的交易品种已被选中显示在 Market Watch

特别值得关注的是 SYMBOL_VISIBLE。事实上,一些交易品种(通常,这些交易品种为计算保证金要求和存款货币利润所必需的交叉汇率)可在 Market Watch 中自动选择,并且不会显示在用户可见的列表中。这种交易品种必须进行明确地选择(由用户选择或以编程方式选择)来显示。因此,正是 SYMBOL_VISIBLE 特性允许你确定某个交易品种在窗口中是否可见:它可以等于 false(对于该 列表中的某些元素),这是使用一对函数 SymbolsTotalSymbolNameselected 参数等于 true 的情况下获得的。

考虑一个简单脚本 (SymbolInvisible.mq5),该脚本在终端中搜索隐式选择的交易品种,即那些没有在市场报价中显示的交易品种(SYMBOL_VISIBLE 被重置),同时其 SYMBOL_SELECT 为 true

#define PUSH(A,V) (A[ArrayResize(AArraySize(A) + 1) - 1] = V)
   
void OnStart()
{
   const int n = SymbolsTotal(false);
   int selected = 0;
   string invisible[];
   // loop through all available symbols 
   for(int i = 0i < n; ++i)
   {
      const string s = SymbolName(ifalse);
      if(SymbolInfoInteger(sSYMBOL_SELECT))
      {
         selected++;
         if(!SymbolInfoInteger(sSYMBOL_VISIBLE))
         {
            // collect selected but invisible symbols into an array 
            PUSH(invisibles);
         }
      }
   }
   PrintFormat("Symbols: total=%d, selected=%d, implicit=%d",
      nselectedArraySize(invisible));
   if(ArraySize(invisible))
   {
      ArrayPrint(invisible);
   }
}

尝试以不同账户上编译和运行脚本。并不总会遇到隐式选择交易品种的情况。例如,如果在 Market Watch 中选择了以卢布报价的俄罗斯蓝筹股的分时报价,并且交易账户使用不同的货币(例如,美元或欧元,但不是卢布),那么将会自动选择 USDRUB 交易品种。当然,这是假设其之前没有被明确地添加到 Market Watch 中。然后,我们可以在日志中得到以下结果:

Symbols: total=50681, selected=49, implicit=1
"USDRUB"