Desplazamiento de gráficos por el eje temporal

Los usuarios de MetaTrader 5 están familiarizados con el panel de navegación rápida de gráficos, que se abre haciendo doble clic en la esquina izquierda de la línea de tiempo o pulsando las teclas Space o Input. También existe una posibilidad similar mediante programación utilizando la función ChartNavigate.

bool ChartNavigate(long chartId, ENUM_CHART_POSITION position, int shift = 0)

La función desplaza el gráfico chartId el número de barras especificado con respecto a la posición predefinida del gráfico especificada por el parámetro position. Es de tipo de enumeración ENUM_CHART_POSITION con los siguientes elementos:

Identificador

Descripción

CHART_BEGIN

Inicio del gráfico (precios más antiguos)

CHART_CURRENT_POS

Posición actual

CHART_END

Fin del gráfico (últimos precios)

El parámetro shift establece el número de barras en que debe desplazarse el gráfico. Un valor positivo desplaza el gráfico hacia la derecha (hacia el final), y un valor negativo lo desplaza hacia la izquierda (hacia el principio).

La función devuelve true en caso de éxito o false en caso de error.

Para probar la función, vamos a crear un sencillo script ChartNavigate.mq5. Con la ayuda de variables de entrada, el usuario puede elegir un punto de partida y un desplazamiento en barras.

#property script_show_inputs
 
input ENUM_CHART_POSITION Position = CHART_CURRENT_POS;
input int Shift = 0;
   
void OnStart()
{
   ChartSetInteger(0CHART_AUTOSCROLLfalse);
   const int start = (int)ChartGetInteger(0CHART_FIRST_VISIBLE_BAR);
   ChartNavigate(0PositionShift);
   const int stop = (int)ChartGetInteger(0CHART_FIRST_VISIBLE_BAR);
   Print("Moved by: "stop - start", from "start" to "stop);
}

El registro muestra el número de la primera barra visible antes y después del movimiento.

Un ejemplo más práctico sería el script ChartSynchro.mq5, que permite desplazarse de forma sincrónica por todos los gráficos en los que se está ejecutando, en respuesta a que el usuario se desplace manualmente por uno de los gráficos. Así, puede sincronizar ventanas de distintos marcos temporales del mismo instrumento o analizar movimientos de precios paralelos en distintos instrumentos.

void OnStart()
{
   datetime bar = 0// current position (time of the first visible bar)
  
   conststring namePosition =__FILE__;// global variable name
  
   ChartSetInteger(0,CHART_AUTOSCroll,false); // disable autoscroll
  
   while(!IsStopped())
   {
      const bool active = ChartGetInteger(0CHART_BRING_TO_TOP);
      const int move = (int)ChartGetInteger(0CHART_FIRST_VISIBLE_BAR);
   
      // the active chart is the leader, and the rest are slaves
      if(active)
      {
         const datetime first = iTime(_Symbol_Periodmove);
         if(first != bar)
         {
            // if the position has changed, save it in a global variable
            bar = first;
            GlobalVariableSet(namePositionbar);
            Comment("Chart "ChartID(), " scrolled to "bar);
         }
      }
      else
      {
         const datetime b = (datetime)GlobalVariableGet(namePosition);
      
         if(b != bar)
         {
            // if the value of the global variable has changed, adjust the position
            bar = b;
            const int difference = move - iBarShift(_Symbol_Periodbar);
            ChartNavigate(0CHART_CURRENT_POSdifference);
            Comment("Chart "ChartID(), " forced to "bar);
         }
      }
    
      Sleep(250);
   }
   Comment("");
}

La alineación se realiza por la fecha y hora de la primera barra visible (CHART_FIRST_VISIBLE_BAR). El script en un bucle comprueba este valor y, si funciona en un gráfico activo, lo escribe en una variable global. Los scripts de otros gráficos leen esta variable y ajustan su posición en consecuencia con ChartNavigate. Los parámetros especifican el movimiento relativo del gráfico (CHART_CURRENT_POS), y el número de barras que se van a mover se define como la diferencia entre el número actual de la primera barra visible y el leído de la variable global.

En la siguiente imagen se muestra el resultado de sincronizar los gráficos H1 y M15 para EURUSD.

Ejemplo de script para sincronizar las posiciones de los gráficos

Ejemplo de script para sincronizar las posiciones de los gráficos

Después de familiarizarnos con el sistema eventos en gráficos convertiremos este script en un indicador y nos desharemos del bucle infinito.