Profundidad de Mercado

Cuando se trata de instrumentos bursátiles, MetaTrader 5 le permite obtener no sólo información sobre precios y volúmenes empaquetada en ticks, sino también la Profundidad de Mercado (libro de órdenes, precios de nivel II), es decir, la distribución de los volúmenes de las órdenes de compra y venta colocadas en los niveles más próximos al precio actual. Una de las propiedades enteras del símbolo SYMBOL_TICKS_BOOKDEPTH contiene el número máximo de niveles mostrados en la Profundidad de Mercado. Esta cantidad está permitida para cada una de las partes, es decir, el tamaño total del libro de órdenes puede ser dos veces mayor (y esto no tiene en cuenta los niveles de precios con volúmenes cero que no se emiten).

Dependiendo de la situación del mercado, el tamaño real del libro de órdenes transmitido puede ser inferior al indicado en esta propiedad. Para los instrumentos no bursátiles, esta propiedad suele ser igual a 0, aunque algunos brókers pueden difundir el libro de órdenes para los símbolos de Forex, limitado únicamente por las órdenes de sus clientes.

El propio libro de órdenes y las notificaciones sobre su actualización deben ser solicitados por el programa MQL interesado mediante una API especial, de la que hablaremos en el capítulo siguiente.

Cabe señalar que, debido a las características arquitectónicas de la plataforma, esta propiedad no está directamente relacionada con la traducción del libro de órdenes, es decir, es sólo un campo de especificación rellenado por el bróker. En otras palabras: un valor distinto de cero de la propiedad no significa que el libro de órdenes vaya a llegar necesariamente al terminal en un mercado abierto. Esto depende de otros ajustes del servidor y de si tiene una conexión activa con el proveedor de datos.

Vamos a intentar obtener estadísticas sobre la profundidad del mercado para todos los símbolos o los símbolos seleccionados utilizando el script SymbolFilterBookDepth.mq5.

input bool UseMarketWatch = false;
input int ShowSymbolsWithDepth = -1;

El parámetro ShowSymbolsWithDepth, que es igual a -1 por defecto, indica que se recopilen estadísticas sobre diferentes configuraciones de Profundidad de Mercado entre todos los símbolos. Si ajusta el parámetro a un valor diferente, el programa intentará encontrar todos los símbolos con la profundidad de libro de órdenes especificada.

void OnStart()
{
   SymbolFilter f;                // filter object
   string symbols[];              // array for symbol names
   long depths[];                 // array of property values
   MapArray<long,intstats;      // counters of occurrences of each depth
   
   if(ShowSymbolsWithDepth > -1)
   {
      f.let(SYMBOL_TICKS_BOOKDEPTHShowSymbolsWithDepth);
   }
   
   // apply filter and fill arrays
   f.select(UseMarketWatchSYMBOL_TICKS_BOOKDEPTHsymbolsdepthstrue);
   const int n = ArraySize(symbols);
   
   PrintFormat("===== Book depths for %s symbols %s=====",
      (UseMarketWatch ? "Market Watch" : "all available"),
      (ShowSymbolsWithDepth > -1 ? "(filtered by depth="
      + (string)ShowSymbolsWithDepth + ") " : ""));
   PrintFormat("Total symbols: %d"n);
   ...

Si se da una profundidad específica, simplemente se obtiene un array de símbolos (todos satisfacen la condición del filtro) y se sale.

   if(ShowSymbolsWithDepth > -1)
   {
      ArrayPrint(symbols);
      return;
   }
   ...

En caso contrario, calculamos las estadísticas y las mostramos.

   for(int i = 0i < n; ++i)
   {
      stats.inc(depths[i]);
   }
   
   Print("Stats per depth:");
   stats.print();
   Print("Legend: key=depth, value=count");
}

Con la configuración por defecto podemos obtener la siguiente imagen:

===== Book depths for all available symbols =====
Total symbols: 52357
Stats per depth:
    [key] [value]
[0]     0   52244
[1]     5       3
[2]    10      67
[3]    16       5
[4]    20      13
[5]    32      25
Legend: key=depth, value=count

Si establecemos ShowSymbolsWithDepth en uno de los valores detectados, por ejemplo, 32, obtendremos una lista de símbolos con esta profundidad de libro de órdenes.

===== Book depths for all available symbols (filtered by depth=32) =====
Total symbols: 25
[ 0] "USDCNH" "USDZAR" "USDHUF" "USDPLN" "EURHUF" "EURNOK" "EURPLN" "EURSEK" "EURZAR" "GBPNOK" "GBPPLN" "GBPSEK" "GBPZAR"
[13] "NZDCAD" "NZDCHF" "USDMXN" "EURMXN" "GBPMXN" "CADMXN" "CHFMXN" "MXNJPY" "NZDMXN" "USDCOP" "USDARS" "USDCLP"