Coordenadas de tiempo y precio

Para los objetos de los tipos que existen en el sistema de coordenadas de las cotizaciones, la API de MQL5 admite un par de propiedades para especificar las vinculaciones de tiempo y precio. En caso de que un objeto tenga varios puntos de anclaje, las propiedades requieren la especificación de un parámetro modificador que contenga el índice del punto de anclaje al llamar a las funciones ObjectSet y ObjectGet.

Identificador

Descripción

Tipo de valor

OBJPROP_TIME

Coordenada de tiempo

datetime

OBJPROP_PRICE

Coordenada de precio

double

Estas propiedades están disponibles para absolutamente todos los objetos, pero no tiene sentido establecerlas o leerlas para objetos con coordenadas de pantalla.

Para demostrar cómo trabajar con coordenadas, analicemos el indicador sin búfer ObjectHighLowChannel.mq5, que dibuja dos líneas de tendencia para un determinado segmento de barras. Sus puntos de comienzo y fin en el eje temporal coinciden con la primera y la última barra del segmento, y a lo largo del eje de precios, los valores se calculan de forma diferente para cada una de las líneas: para la línea superior se utilizan los precios High más alto y más bajo, y para la línea inferior, los precios Low más alto y más bajo. A medida que el gráfico se actualice, nuestro improvisado canal debería moverse con los precios.

El rango de barras se establece mediante dos variables de entrada: el número de la barra inicial BarOffset y el número de barras BarCount. Por defecto, las líneas se trazan a los precios más recientes, ya que bar offset = 0.

input int BarOffset = 0;
input int BarCount = 10;
   
const string Prefix = "HighLowChannel-";

Los objetos tienen el prefijo de nombre común «HighLowChannel-».

En el manejador OnCalculate supervisamos la aparición de nuevas barras sobre la hora iTime de la barra 0-ésima. En cuanto se forma la barra, se analizan los precios en el segmento especificado, se toman los valores máximo y mínimo de los precios de cada uno de los dos tipos (MODE_HIGH, MODE_LOW) y se llama a la función auxiliar DrawFigure para ellos, y aquí es donde tiene lugar el trabajo con los objetos: la creación y modificación de coordenadas.

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
{
   static datetime now = 0;
   if(now != iTime(NULL00))
   {
      const int hh = iHighest(NULL0MODE_HIGHBarCountBarOffset);
      const int lh = iLowest(NULL0MODE_HIGHBarCountBarOffset);
      const int ll = iLowest(NULL0MODE_LOWBarCountBarOffset);
      const int hl = iHighest(NULL0MODE_LOWBarCountBarOffset);
   
      datetime t[2] = {iTime(NULL0BarOffset + BarCount), iTime(NULL0BarOffset)};
      double ph[2] = {iHigh(NULL0fmax(hhlh)), iHigh(NULL0fmin(hhlh))};
      double pl[2] = {iLow(NULL0fmax(llhl)), iLow(NULL0fmin(llhl))};
    
      DrawFigure(Prefix + "Highs"tphclrBlue);
      DrawFigure(Prefix + "Lows"tplclrRed);
   
      now = iTime(NULL00);
   }
   return rates_total;
}

Y aquí está la función DrawFigure propiamente dicha:

bool DrawFigure(const string nameconst datetime &t[], const double &p[],
   const color clr)
{
   if(ArraySize(t) != ArraySize(p)) return false;
   
   ObjectCreate(0nameOBJ_TREND000);
   
   for(int i = 0i < ArraySize(t); ++i)
   {
      ObjectSetInteger(0nameOBJPROP_TIMEit[i]);
      ObjectSetDouble(0nameOBJPROP_PRICEip[i]);
   }
   
   ObjectSetInteger(0nameOBJPROP_COLORclr);
   return true;
}

Después de la llamada a ObjectCreate que garantiza la existencia de un objeto, se llama a las funciones ObjectSet apropiadas para OBJPROP_TIME y OBJPROP_PRICE en todos los puntos de anclaje (dos en este caso).

En la imagen siguiente se muestra el resultado del indicador:

Canal en dos líneas de tendencia a precios máximos y mínimos

Canal en dos líneas de tendencia a precios máximos y mínimos

Puede ejecutar el indicador en el probador visual para ver cómo cambian las coordenadas de la línea sobre la marcha.