Comprobar el estado de los símbolos

Antes hemos visto varias funciones relacionadas con el estado de un símbolo. Recordemos que SymbolExist se utiliza para comprobar la existencia de un símbolo, y SymbolSelect se utiliza para comprobar la inclusión o exclusión de la lista Observación de Mercado. Entre las propiedades del símbolo, hay varias banderas de propósito similar, cuyo uso tiene ventajas y desventajas en comparación con las funciones anteriores.

En concreto, la propiedad SYMBOL_SELECT permite averiguar si el símbolo especificado está seleccionado en Observación de Mercado, mientras que la función SymbolSelect modifica esta propiedad.

La función SymbolExist, a diferencia de la propiedad similar SYMBOL_EXIST, rellena adicionalmente la variable de salida con una indicación de que el símbolo es un símbolo definido por el usuario. Al consultar las propiedades, sería necesario analizar estos dos atributos por separado, ya que el atributo del símbolo personalizado se almacena en otra propiedad, SYMBOL_CUSTOM. Sin embargo, en algunos casos, el programa puede necesitar sólo una propiedad, y entonces la posibilidad de una consulta independiente se convierte en una ventaja.

Todas las banderas son valores booleanos obtenidos a través de la función SymbolInfoInteger.

Identificador

Descripción

SYMBOL_EXIST

Indica que existe un símbolo con el nombre dado.

SYMBOL_SELECT

Indica que el símbolo está seleccionado en Observación de Mercado

SYMBOL_VISIBLE

Indica que el símbolo especificado se muestra en Observación de Mercado

Especialmente interesante es SYMBOL_VISIBLE. El hecho es que algunos símbolos (por regla general, se trata de tipos de cambio cruzados que son necesarios para calcular los requisitos de margen y el beneficio en la divisa de depósito) se seleccionan en Observación de Mercado automáticamente y no aparecen en la lista visible para el usuario. Tales símbolos deben ser elegidos explícitamente (por el usuario o mediante programación) para que se muestren. Así, es la propiedad SYMBOL_VISIBLE la que permite determinar si un símbolo es visible en la ventana: puede ser igual a false para algunos elementos de la lista, obtenidos mediante un par de funciones SymbolsTotal y SymbolName con el parámetro selected igual a true.

Consideremos un sencillo script (SymbolInvisible.mq5) que busca en el terminal los símbolos seleccionados implícitamente, es decir, aquellos que no se muestran en Observación de Mercado (se restablece SYMBOL_VISIBLE) mientras SYMBOL_SELECT para ellos es igual a 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);
   }
}

Pruebe a compilar y ejecutar el script en diferentes cuentas. No siempre se da la situación de que un símbolo se seleccione implícitamente. Por ejemplo, si en Observación de Mercado se seleccionan los tickers de los blue chips rusos que cotizan en rublos y la cuenta de trading está en otra divisa (por ejemplo, dólares o euros, pero no rublos), se seleccionará automáticamente el símbolo USDRUB. Por supuesto, esto supone que no se ha añadido previamente a Observación de Mercado de forma explícita. Obtenemos el siguiente resultado en el registro:

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