检查交易品种数据相关性

由于采用了分布式客户端/服务器架构,客户端和服务器数据可能偶尔会有所不同。例如,在终端会话开始后,当连接丢失时或者当计算机资源负载过重时,可能会立即数据不同的情况。此外,该交易品种在添加到市场报价后,很可能会在一段时间内保持不同步。MQL5 API 允许你使用函数 SymbolIsSynchronized 来检查特定交易品种报价数据的相关性。

bool SymbolIsSynchronized (const string name)

如果名为 name 的交易品种的本地数据与交易服务器上的数据同步,则该函数返回 true

获取价格数组的特征一节中,除了其他特性外,还介绍了 SERIES_SYNCHRONIZED 的特性,该特性返回一个含义较窄的同步特性:它适用于交易品种和时间范围的特定组合。与此特性相反,函数 SymbolIsSynchronized 可返回交易品种一般历史的同步属性。

所有时间范围的构建仅在历史下载完成后开始。由于终端中的多线程架构和并行计算,可能会发生 SymbolIsSynchronized 返回 true,并且对于同一交易品种的时间范围,SERIES_SYNCHRONIZED 特性将暂时为 false

让我们来看看 SymbolListSync.mq5 指标中的新函数是如何工作的。它旨在定期检查 Market Watch 的所有交易品种是否同步。检查周期由用户在参数 SyncCheckupPeriod 中进行设置,以秒为单位。它可导致 OnInit 中的计时器启动。

#property indicator_chart_window
#property indicator_plots 0
   
input int SyncCheckupPeriod = 1// SyncCheckupPeriod (seconds)
   
void OnInit()
{
   EventSetTimer(SyncCheckupPeriod);
}

OnTimer 处理程序中,在一个循环内,我们调用 SymbolIsSynchronized 并将所有未同步交易品种收集到一个公共字符串内,之后它们会显示在注释和日志中。

void OnTimer()
{
   string unsynced;
   const int n = SymbolsTotal(true);
   // check all symbols in the Market Watch
   for(int i = 0i < n; ++i)
   {
      const string s = SymbolName(itrue);
      if(!SymbolIsSynchronized(s))
      {
         unsynced += s + "\n";
      }
   }
      
   if(StringLen(unsynced) > 0)
   {
      Comment("Unsynced symbols:\n" + unsynced);
      Print("Unsynced symbols:\n" + unsynced);
   }
   else
   {
      Comment("All Market Watch is in sync");
   }
}

例如,如果我们将一些先前缺失的交易品种 (Brent) 添加到 Market Watch 中,我们会得到如下条目:

Unsynced symbols:
Brent

正常情况下,大多数时候(当指标运行时),日志中应没有此类消息。但是,在通信出现问题时,可能会生成海量警报。