Comprobar la pertinencia de los datos de los símbolos

Debido a la arquitectura distribuida cliente-servidor, los datos del cliente y del servidor pueden ser ocasionalmente diferentes. Por ejemplo, esto puede ocurrir inmediatamente después del inicio de la sesión de terminal, cuando se pierde la conexión o cuando los recursos del ordenador están muy cargados. Además, lo más probable es que el símbolo permanezca no sincronizado durante algún tiempo inmediatamente después de ser añadido a Observación de Mercado. La API de MQL5 permite comprobar la relevancia de los datos de cotización de un símbolo concreto mediante la función SymbolIsSynchronized.

bool SymbolIsSynchronized(const string name)

La función devuelve true si los datos locales del símbolo denominado name están sincronizados con los datos del servidor de trading.

En la sección Obtención de características de arrays de precios, entre otras propiedades de series temporales, se introdujo la propiedad SERIES_SYNCHRONIZED, que devuelve un atributo de sincronización más limitado en su significado: se aplica a una combinación específica de símbolo y marco temporal. En contraste con esta propiedad, la función SymbolIsSynchronized devuelve un atributo de sincronización del historial general para un símbolo.

La construcción de todos los marcos temporales comienza sólo después de la finalización de la descarga del historial. Debido a la arquitectura multihilo y a la computación paralela en el terminal, puede ocurrir que SymbolIsSynchronized devuelva true, y para un marco temporal en el mismo símbolo, la propiedad SERIES_SYNCHRONIZED sea temporalmente igual a false.

Veamos cómo trabaja la nueva función en el indicador SymbolListSync.mq5. Está diseñada para comprobar periódicamente la sincronización de todos los símbolos de Observación de Mercado. El periodo de comprobación lo establece el usuario en segundos en el parámetro SyncCheckupPeriod. Hace que el temporizador se inicie en OnInit.

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

En el manejador OnTimer, en un bucle, llamamos a SymbolIsSynchronized y recopilamos todos los símbolos no sincronizados en una cadena común, tras lo cual se muestran en el comentario y en el registro.

void OnTimer()
{
   string unsynced;
   const int n = SymbolsTotal(true);
   // check all symbols in the Market Watch
   for(int i = 0; i < n; ++i)
   {
      const string s = SymbolName(i, true);
      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");
   }
}

Por ejemplo, si añadimos algún símbolo que faltaba (Brent) a Observación de Mercado, obtendremos una entrada como ésta:

Unsynced symbols:
Brent

En condiciones normales, la mayor parte del tiempo (mientras el indicador está funcionando) no debería haber mensajes de este tipo en el registro. No obstante, en caso de problemas de comunicación puede generarse una avalancha de alertas.