Propiedades de símbolos personalizados

En la introducción de este capítulo hemos mencionado los símbolos personalizados. Estos son los símbolos con las cotizaciones creados directamente en el terminal a la orden del usuario o mediante programación.

Los símbolos personalizados pueden utilizarse, por ejemplo, para crear un instrumento sintético basado en una fórmula que incluya otros símbolos de Observación de Mercado. Esto está a disposición del usuario directamente en la interfaz del terminal.

Un programa MQL puede implementar escenarios más complejos en MQL5, como fusionar diferentes instrumentos para diferentes periodos, generar series según una distribución aleatoria determinada o recibir datos (cotizaciones, barras o ticks) de fuentes externas.

Para poder distinguir un símbolo estándar de un símbolo personalizado en los algoritmos, MQL5 proporciona la propiedad SYMBOL_CUSTOM, que es una señal lógica de que un símbolo es personalizado.

Si el símbolo tiene una fórmula, ésta está disponible a través de la propiedad de cadena SYMBOL_FORMULA. En las fórmulas, como sabe, puede utilizar los nombres de otros símbolos, así como operadores y funciones matemáticas. He aquí algunos ejemplos:

  • Símbolo sintético: «@ESU19»/EURCAD
  • Spread de calendario: «Si-9.13»-«Si-6.13»
  • Índice del euro: 34.38805726 * pow(EURUSD,0.3155) * pow(EURGBP,0.3056) * pow(EURJPY,0.1891) * pow(EURCHF,0.1113) * pow(EURSEK,0.0785)

Especificar una fórmula es conveniente para el usuario, pero normalmente no se utiliza desde programas MQL ya que pueden calcular fórmulas directamente en el código, con funciones no estándar y con más control, en concreto, en cada tick y no en un temporizador 1 vez cada 100 ms.

Vamos a comprobar el trabajo con las propiedades en el script SymbolFilterCustom.mq5: registra todos los símbolos personalizados y sus fórmulas (si las hay).

input bool UseMarketWatch = false;
   
void OnStart()
{
   SymbolFilter f;                // filter object
   string symbols[];              // array for symbol names
   string formulae[];             // array for formulas
   
 // apply filter and fill arrays
   f.let(SYMBOL_CUSTOMtrue)
   .select(UseMarketWatchSYMBOL_FORMULAsymbolsformulae);
   const int n = ArraySize(symbols);
   
   PrintFormat("===== %s custom symbols =====",
      (UseMarketWatch ? "Market Watch" : "All available"));
   PrintFormat("Total symbols: %d"n);
   
   for(int i = 0i < n; ++i)
   {
      Print(symbols[i], " "formulae[i]);
   }
}

A continuación se muestra el resultado con el único carácter personalizado encontrado.

===== All available custom symbols =====
Total symbols: 1
synthEURUSD SP500m/UK100