Mover objetos

Para mover objetos en coordenadas de tiempo/precio, puede utilizar no sólo las funciones ObjectSet de cambio de propiedades, sino también la función especial ObjectMove, que cambia las coordenadas del punto de anclaje especificado del objeto.

bool ObjectMove(long chartId, const string name, int index, datetime time, double price)

El parámetro chartId establece el ID del gráfico (0 es para el gráfico actual). El nombre del objeto se pasa en el parámetro name. Las coordenadas y el índice del punto de anclaje se especifican en los parámetros index, time y price, respectivamente.

La función utiliza una llamada asíncrona, es decir, envía una orden a la cola de eventos del gráfico y no espera al movimiento en sí.

La función devuelve una indicación de si la orden se ha puesto en cola correctamente (en este caso, el resultado es true). La posición real del objeto debe conocerse mediante llamadas a las funciones de ObjectGet.

En el indicador ObjectHighLowFibo.mq5modificamos la función DrawFibo de manera que permita ObjectMove. En lugar de dos llamadas a las funciones ObjectSet en el bucle a través de los puntos de anclaje, ahora tenemos una llamada a ObjectMove:

bool DrawFibo(const string nameconst datetime &t[], const double &p[],
   const color clr)
{
   ...
   for(int i = 0i < ArraySize(t); ++i)
   {
      // was:
      // ObjectSetInteger(0, name, OBJPROP_TIME, i, t[i]);
      // ObjectSetDouble(0, name, OBJPROP_PRICE, i, p[i]);
      // became:
      ObjectMove(0nameit[i], p[i]);
   }
   ...
}

Tiene sentido aplicar la función ObjectMove cuando cambian las dos coordenadas del punto de anclaje. En algunos casos, sólo una coordenada tiene efecto (por ejemplo, en los canales de desviación estándar y regresión lineal en los puntos de anclaje, sólo son importantes las fechas/horas de inicio y fin, y los canales calculan automáticamente el valor del precio en estos puntos). En estos casos, una única llamada a la función ObjectSet es más adecuada que ObjectMove.