ObjectGetValueByTime

Devuelve el valor de precio para la hora especificada de un objeto especificado.

double  ObjectGetValueByTime(
   long      chart_id,     // identificador del gráfico
   string    name,         // nombre del objeto
   datetime  time,         // hora
   int       line_id       // línea
   );

Parámetros

chart_id

[in]  Identificador del gráfico. 0 significa el gráfico actual.

name

[in]  Nombre del objeto.

time

[in]  Valor de la hora.

line_id

[in]  Identificador de la línea.

Valor devuelto

Devuelve el valor de precio para la hora especificada de un objeto especificado.

Nota

La función usa una llamada sincrónica, esto significa que la función espera a la ejecución de todos los comandos que han sido ubicados en la cola del gráfico antes de su llamada, y por eso puede consumir un tiempo considerable. Hay que tener esta circunstancia en cuenta al trabajar con multitud de objetos en el gráfico.

Puesto que el objeto puede tener varios valores en una coordinada de precio, en este caso es necesario especificar el indicador de la línea. Esta función se puede aplicar sólo a los siguientes objetos:

  • Línea de tendencia (OBJ_TREND)
  • Línea de tendencia por ángulo (OBJ_TRENDBYANGLE)
  • Línea de Gann (OBJ_GANNLINE)
  • Canal equidistante (OBJ_CHANNEL) - 2 líneas
  • Canal de regresión lineal (OBJ_REGRESSION) - 3 líneas
  • Canal de desviación estándar (OBJ_STDDEVCHANNEL) - 3 líneas
  • Flecha (OBJ_ARROWED_LINE)

 

Ejemplo:

#property copyright "Copyright 2025, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
#define   OBJ_NAME   "TestObjectGetValueByTime" // nombre del objeto gráfico
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- identificador del gráfico, símbolo
   long   chart_id=ChartID();
   string symbol=ChartSymbol(chart_id);
 
   long bar1=0, bar2=0, visible=0;
//--- obtenemos la primera barra del gráfico visible a la izquierda
   ResetLastError();
   if(!ChartGetInteger(chart_id, CHART_FIRST_VISIBLE_BAR, 0, bar1))
     {
      Print("ChartGetInteger() failed. Error ", GetLastError());
      return;
     }
//--- número de barras visibles en el gráfico
   if(!ChartGetInteger(chart_id, CHART_VISIBLE_BARS, 0, visible))
     {
      Print("ChartGetInteger() failed. Error ", GetLastError());
      return;
     }
 
//--- ajustamos los valores obtenidos y calculamos el índice de la primera barra visible a la derecha
   bar1-=1;
   visible-=2;
   bar2=bar1-visible;
 
//--- construimos un canal equidistante desde el High de la barra visible de la izquierda hasta el Low de la barra derecha
   if(!CreateChannel(chart_id, (int)bar1, (int)bar2))
      return;
   
   int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
   
//--- en un ciclo desde la barra visible de la izquierda hasta la barra visible de la derecha en el gráfico
//--- obtenemos el valor de precio para la hora de la barra de ciclo de cada línea del canal equidistante.
//--- el precio obtenido para cada línea lo mostramos en el diario
   for(int i=(int)bar1; i>=bar2 && !IsStopped(); i--)
     {
      datetime time=GetTime(symbol, i);
      if(time==0)
         continue;
      
      string time_str=TimeToString(time);
      double value0=ObjectGetValueByTime(chart_id, OBJ_NAME, time, 0);
      double value1=ObjectGetValueByTime(chart_id, OBJ_NAME, time, 1);
      string idx=StringFormat("%03d", i);
      PrintFormat("[%s] For time %s the price value at 0 line of the object: %.*f, at line 1: %.*f",
                  idx, TimeToString(time), digits, value0, digits, value1);
     }
   
//--- esperamos 5 segundos y dejamos todo ordenado
   Sleep(5000);
   ObjectDelete(chart_id, OBJ_NAME);
   ChartRedraw(chart_id);
   /*
   resultado:
   [114] For time 2025.01.02 05:00 the price value at 0 line of the object: 1.03732, at line 1: 1.03393
   [113] For time 2025.01.02 05:30 the price value at 0 line of the object: 1.03694, at line 1: 1.03355
   [112] For time 2025.01.02 06:00 the price value at 0 line of the object: 1.03657, at line 1: 1.03318
   [111] For time 2025.01.02 06:30 the price value at 0 line of the object: 1.03619, at line 1: 1.03280
   [110] For time 2025.01.02 07:00 the price value at 0 line of the object: 1.03581, at line 1: 1.03242
   [109] For time 2025.01.02 07:30 the price value at 0 line of the object: 1.03544, at line 1: 1.03205
   [108] For time 2025.01.02 08:00 the price value at 0 line of the object: 1.03506, at line 1: 1.03167
   [107] For time 2025.01.02 08:30 the price value at 0 line of the object: 1.03468, at line 1: 1.03129
   [106] For time 2025.01.02 09:00 the price value at 0 line of the object: 1.03431, at line 1: 1.03092
   [105] For time 2025.01.02 09:30 the price value at 0 line of the object: 1.03393, at line 1: 1.03054
   [104] For time 2025.01.02 10:00 the price value at 0 line of the object: 1.03355, at line 1: 1.03016
   [103] For time 2025.01.02 10:30 the price value at 0 line of the object: 1.03318, at line 1: 1.02979
   [102] For time 2025.01.02 11:00 the price value at 0 line of the object: 1.03280, at line 1: 1.02941
   [101] For time 2025.01.02 11:30 the price value at 0 line of the object: 1.03242, at line 1: 1.02903
   [100] For time 2025.01.02 12:00 the price value at 0 line of the object: 1.03205, at line 1: 1.02866
   [099] For time 2025.01.02 12:30 the price value at 0 line of the object: 1.03167, at line 1: 1.02828
   [098] For time 2025.01.02 13:00 the price value at 0 line of the object: 1.03129, at line 1: 1.02790
   [097] For time 2025.01.02 13:30 the price value at 0 line of the object: 1.03092, at line 1: 1.02753
   [096] For time 2025.01.02 14:00 the price value at 0 line of the object: 1.03054, at line 1: 1.02715
   [095] For time 2025.01.02 14:30 the price value at 0 line of the object: 1.03016, at line 1: 1.02677
   [094] For time 2025.01.02 15:00 the price value at 0 line of the object: 1.02979, at line 1: 1.02640
   [093] For time 2025.01.02 15:30 the price value at 0 line of the object: 1.02941, at line 1: 1.02602
   [092] For time 2025.01.02 16:00 the price value at 0 line of the object: 1.02903, at line 1: 1.02564
   [091] For time 2025.01.02 16:30 the price value at 0 line of the object: 1.02866, at line 1: 1.02527
   [090] For time 2025.01.02 17:00 the price value at 0 line of the object: 1.02828, at line 1: 1.02489
   [089] For time 2025.01.02 17:30 the price value at 0 line of the object: 1.02790, at line 1: 1.02451
   [088] For time 2025.01.02 18:00 the price value at 0 line of the object: 1.02753, at line 1: 1.02414
   [087] For time 2025.01.02 18:30 the price value at 0 line of the object: 1.02715, at line 1: 1.02376
   [086] For time 2025.01.02 19:00 the price value at 0 line of the object: 1.02677, at line 1: 1.02338
   [085] For time 2025.01.02 19:30 the price value at 0 line of the object: 1.02640, at line 1: 1.02301
   [084] For time 2025.01.02 20:00 the price value at 0 line of the object: 1.02602, at line 1: 1.02263
   */
  }
//+------------------------------------------------------------------+
//| Retorna la hora de la barra especificada por el índice           |
//+------------------------------------------------------------------+
datetime GetTime(const string symbol_name, const int index)
  {
   if(index<0)
      return(0);
   datetime array[1];
   ResetLastError();
   if(CopyTime(symbol_name, PERIOD_CURRENT, index, 1, array)!=1)
     {
      PrintFormat("%s: CopyTime() failed. Error %d",__FUNCTION__, GetLastError());
      return(0);
     }
   return(array[0]);
  }
//+------------------------------------------------------------------+
//| Construye un canal equidistante desde el High de la barra        |
//| izquierda hasta el Low de la barra derecha                       |
//+------------------------------------------------------------------+
bool CreateChannel(const long chart_id, const int bar1, const int bar2)
  {
   long     visible=0;
   datetime time1 =0, time2 =0;
   double   price1=0, price2=0;
 
//--- símbolo del gráfico
   string symbol=ChartSymbol(chart_id);
   
//--- obtenemos la hora de la primera barra del gráfico visible a la izquierda
   ResetLastError();
   datetime time_array[1];
   if(CopyTime(symbol, PERIOD_CURRENT, (int)bar1, 1, time_array)!=1)
     {
      PrintFormat("%s: CopyTime() failed. Error %d",__FUNCTION__, GetLastError());
      return(false);
     }
   time1=time_array[0];
   
//--- obtenemos la hora de la primera barra del gráfico visible a la derecha
   if(CopyTime(symbol, PERIOD_CURRENT, (int)bar2, 1, time_array)!=1)
     {
      PrintFormat("%s: CopyTime() failed. Error %d",__FUNCTION__, GetLastError());
      return(false);
     }
   time2=time_array[0];
   
//--- obtenemos el precio High de la primera barra del gráfico visible a la izquierda
   double price_array[];
   if(CopyHigh(symbol, PERIOD_CURRENT, (int)bar1, 1, price_array)!=1)
     {
      PrintFormat("%s: CopyHigh() failed. Error %d",__FUNCTION__, GetLastError());
      return(false);
     }
   price1=price_array[0];
   
//--- obtenemos el precio Low de la primera barra del gráfico visible a la izquierda
   if(CopyLow(symbol, PERIOD_CURRENT, (int)bar2, 1, price_array)!=1)
     {
      PrintFormat("%s: CopyLow() failed. Error %d",__FUNCTION__, GetLastError());
      return(false);
     }
   price2=price_array[0];
   
//--- calculamos el rango de precios en puntos
//--- para el canal equidistante, la distancia de la segunda línea será 1/3 del rango de precios
   double range=price1-price2;
   double distance=range*0.3;
   
//--- en las coordenadas calculadas, creamos un objeto gráfico: el canal equidistante
   if(!ObjectCreate(chart_id, OBJ_NAME, OBJ_CHANNEL, 0, time1, price1, time2, price2, time1, price1-distance))
     {
      PrintFormat("%s: ObjectCreate() failed. Error %d",__FUNCTION__, GetLastError());
      return(false);
     }
     
//--- actualizamos el gráfico y retornamos true
   ChartRedraw(chart_id);
   return(true);
  }

Véase también

Tipos de objetos