Obtener las coordenadas de caída del programa MQL en un gráfico

Los usuarios suelen arrastrar los programas MQL a un gráfico utilizando el ratón. Además de ser práctico y cómodo, esto le permite establecer algún contexto para el algoritmo. Por ejemplo, un indicador puede aplicarse en diferentes subventanas, o un script puede colocar una orden pendiente al precio en el que el usuario la colocó en el gráfico. El siguiente grupo de funciones está diseñado para obtener las coordenadas del punto al que se arrastró y soltó el programa.

int ChartWindowOnDropped()

Esta función devuelve el número de la subventana del gráfico en la que el Asesor Experto, script o indicador actual es soltado por el ratón. La ventana principal, como sabemos, tiene el número 0, y las subventanas se numeran empezando por 1. El número de una subventana no depende de si hay subventanas ocultas por encima de ella, ya que sus índices permanecen asignados a ellas. En otras palabras: el número de subventana visible puede diferir de su índice real si hay subventanas ocultas.

double ChartPriceOnDropped()

datetime ChartTimeOnDropped()

Este par de funciones devuelve las coordenadas del punto de caída del programa en unidades de precio y tiempo. Tenga en cuenta que en las subventanas se pueden mostrar datos arbitrarios, y no sólo precios, aunque el nombre de la función ChartPriceOnDropped incluya 'Price'.

¡Atención! El tiempo del punto objetivo no se redondea por el tamaño del marco temporal del gráfico, por lo que incluso en los gráficos H1 y D1, puede obtener un valor con minutos e incluso segundos.

int ChartXOnDropped()

int ChartYOnDropped()

Estas dos funciones devuelven las coordenadas de pantalla X e Y de un punto en píxeles. El origen de las coordenadas se encuentra en la esquina superior izquierda de la ventana principal del gráfico. Ya hemos hablado de la dirección de los ejes en la sección Especificaciones de la pantalla.

La coordenada Y se cuenta siempre desde la esquina superior izquierda del gráfico principal, aun cuando el punto de caída pertenezca a una subventana. Para traducir este valor a una coordenada y relativa a una subventana, utilice la propiedad CHART_WINDOW_YDISTANCE (ver ejemplo).

Vamos a mostrar los valores de todas las funciones mencionadas en el registro del script ChartDrop.mq5:

void OnStart()
{
   const int w = PRTF(ChartWindowOnDropped());
   PRTF(ChartTimeOnDropped());
   PRTF(ChartPriceOnDropped());
   PRTF(ChartXOnDropped());
   PRTF(ChartYOnDropped());
   
   // for the subwindow, recalculate the y coordinate to the local one
   if(w > 0)
   {
      const int y = (int)PRTF(ChartGetInteger(0CHART_WINDOW_YDISTANCEw));
      PRTF(ChartYOnDropped() - y);
   }
}

Por ejemplo, si soltamos este script en la primera subventana donde se está ejecutando el indicador WPR, podemos obtener los siguientes resultados:

ChartWindowOnDropped()=1 / ok
ChartTimeOnDropped()=2021.11.30 03:52:30 / ok
ChartPriceOnDropped()=-50.0 / ok
ChartXOnDropped()=217 / ok
ChartYOnDropped()=312 / ok
ChartGetInteger(0,CHART_WINDOW_YDISTANCE,w)=282 / ok
ChartYOnDropped()-y=30 / ok

A pesar de que el script se deja caer en EURUSD, gráfico H1, obtuvimos una marca de tiempo con minutos y segundos.

Observe que el valor «precio» es -50 porque el rango de valores WPR es [0,-100].

Además, la coordenada vertical del punto 312 (relativa a toda la ventana del gráfico) se ha convertido en la coordenada local de la subventana: como la distancia vertical desde el inicio del gráfico principal hasta la subventana era de 282, el valor y dentro de la subventana resultó ser 30.