ObjectGetTimeByValue

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

datetime  ObjectGetTimeByValue(
   long    chart_id,     // identificador del gráfico
   string  name,         // nombre del objeto
   double  value,        // precio
   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.

value

[in]  Valor del precio.

line_id

[in]  Identificador de la línea.

Valor devuelto

Devuelve el valor de la hora para el valor especificado del precio 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   "TestObjectGetTimeByValue" // nombre del objeto gráfico
#define   STEP       100                        // paso del precio
 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- identificador, símbolo
   long   chart_id=ChartID();
   string chart_symbol=ChartSymbol(chart_id);
   
//--- obtenemos el valor Point del símbolo del gráfico
   double point=SymbolInfoDouble(chart_symbolSYMBOL_POINT);
   if(point==0)
     {
      PrintFormat("Failed to get the Point value of the \"%s\" symbol. Error %d"chart_symbolGetLastError());
      return;
     }
     
//--- 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))
      return;
   
//--- máximo y mínimo del gráfico, valor Digits del símbolo del gráfico
   double chart_max=ChartGetDouble(chart_idCHART_PRICE_MAX);
   double chart_min=ChartGetDouble(chart_idCHART_PRICE_MIN);
   int    digits=(int)SymbolInfoInteger(chart_symbolSYMBOL_DIGITS);
 
//--- mientras que el precio price calculado es mayor que el valor de precio más bajo del gráfico,
//--- iteramos en un ciclo por los precios del gráfico con el paso STEP y obtenemos el valor temporal
//--- para el valor de precio price calculado de cada línea del canal equidistante.
//--- la hora resultante para cada línea se muestra en el diario
   int index=0;
   double price=chart_max;
   do
     {
      price=chart_max-STEP*index*point;
      datetime time0=ObjectGetTimeByValue(chart_idOBJ_NAMEprice0);
      datetime time1=ObjectGetTimeByValue(chart_idOBJ_NAMEprice1);
      string   time0_str=(time0>0 ? TimeToString(time0) : "No value at this price");
      string   time1_str=(time1>0 ? TimeToString(time1) : "No value at this price");
      string   idx=StringFormat("%02d"index);
      PrintFormat("[%s] For price %.*f the time value at line 0: %s, at line 1: %s"idxdigitspricetime0_strtime1_str);
      index++;
     }
   while(!IsStopped() && price>=chart_min);
   
//--- esperamos 5 segundos y dejamos todo ordenado
   Sleep(5000);
   ObjectDelete(chart_idOBJ_NAME);
   ChartRedraw(chart_id);
   /*
   resultado:
   [00For price 1.26110 the time value at line 0No value at this price,  at line 1No value at this price
   [01For price 1.26010 the time value at line 02024.12.30 17:00at line 1No value at this price
   [02For price 1.25910 the time value at line 02024.12.30 22:30at line 1No value at this price
   [03For price 1.25810 the time value at line 02024.12.31 04:00at line 12024.12.30 16:30
   [04For price 1.25710 the time value at line 02024.12.31 10:00at line 12024.12.30 22:00
   [05For price 1.25610 the time value at line 02024.12.31 15:30at line 12024.12.31 03:30
   [06For price 1.25510 the time value at line 02024.12.31 21:00at line 12024.12.31 09:00
   [07For price 1.25410 the time value at line 02025.01.02 03:30at line 12024.12.31 14:30
   [08For price 1.25310 the time value at line 0No value at this priceat line 12024.12.31 20:30
   [09For price 1.25210 the time value at line 0No value at this priceat line 12025.01.02 03:00
   [10For price 1.25110 the time value at line 0No value at this priceat line 1No value at this price
   [11For price 1.25010 the time value at line 0No value at this priceat line 1No value at this price
   [12For price 1.24910 the time value at line 0No value at this priceat line 1No value at this price
   [13For price 1.24810 the time value at line 0No value at this priceat line 1No value at this price
   */
  }
//+------------------------------------------------------------------+
//| Construye un canal equidistante desde el High de la barra        |
//| izquierda hasta el Low de la barra derecha                       |
//+------------------------------------------------------------------+
bool CreateChannel(const long chart_id=0)
  {
   long     bar1  =0bar2  =0visible=0;
   datetime time1 =0time2 =0;
   double   price1=0price2=0;
 
//--- obtenemos la primera barra del gráfico visible a la izquierda
   ResetLastError();
   if(!ChartGetInteger(chart_idCHART_FIRST_VISIBLE_BAR0bar1))
     {
      PrintFormat("%s: ChartGetInteger() failed. Error %d",__FUNCTION__GetLastError());
      return(false);
     }
//--- número de barras visibles en el gráfico
   if(!ChartGetInteger(chart_idCHART_VISIBLE_BARS0visible))
     {
      PrintFormat("%s: ChartGetInteger() failed. Error %d",__FUNCTION__GetLastError());
      return(false);
     }
 
//--- ajustamos los valores obtenidos y calculamos el índice de la primera barra visible a la derecha
   bar1-=1;
   visible-=2;
   bar2=bar1-visible;
   
//--- 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(symbolPERIOD_CURRENT, (int)bar11time_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(symbolPERIOD_CURRENT, (int)bar21time_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(symbolPERIOD_CURRENT, (int)bar11price_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(symbolPERIOD_CURRENT, (int)bar21price_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_idOBJ_NAMEOBJ_CHANNEL0time1price1time2price2time1price1-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