ObjectGetTimeByValue

A função retorna o valor de tempo para o valor do preço específico de um objeto específico.

datetime  ObjectGetTimeByValue(
   long    chart_id,     // identificador gráfico
   string  name,         // nome objeto
   double  value,        // Preço
   int     line_id       // Número linha
   );

Parâmetros

chart_id

[in]  Identificador do gráfico. Significa o gráfico atual.

nome

[in]  Nome do objeto.

value

[in]  Valor do preço.

line_id

[in]  Identificador de linha.

Valor do Retorno

O valor de tempo para o valor de determinado preço de um objeto específico.

Observação

A função utiliza uma chamada síncrona, isso significa que a função espera a execução de todos os comandos que foram colocados na fila do gráfico antes de sua chamada, e por isso este recurso pode consumir muito tempo. Deve ter isso em mente, se você estiver trabalhando com um grande número de objetos no gráfico.

Um objeto pode ter vários valores em uma coordenada de preço, portanto é necessário especificar o número da linha. Esta função aplica-se apenas aos seguintes objetos:

  • Linha de Tendência (OBJ_TREND)
  • Linha de tendência pelo ângulo (OBJ_TRENDBYANGLE)
  • Linha de Gann(OBJ_GANNLINE)
  • Canal eqüidistante (OBJ_CHANNEL) - 2 linhas
  • Canal de regressão Linear (OBJ_REGRESSION) - 3 linhas
  • Canal de desvio padrão (OBJ_STDDEVCHANNEL) - 3 linhas
  • Linha com setas (OBJ_ARROWED_LINE)

Exemplo:

#property copyright "Copyright 2025, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
#define   OBJ_NAME   "TestObjectGetTimeByValue" // nome de objeto gráfico
#define   STEP       100                        // passo de preço
 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- identificador, símbolo
   long   chart_id=ChartID();
   string chart_symbol=ChartSymbol(chart_id);
   
//--- obtemos o valor de Point do símbolo do 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;
     }
     
//--- construímos um canal equidistante de High da barra esquerda visível até Low da barra direita
   if(!CreateChannel(chart_id))
      return;
   
//--- máximo e mínimo do gráfico, valor de Digits do símbolo do 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);
 
//--- enquanto o preço calculado price for maior que o menor valor de preço do gráfico,
//--- percorremos em laço os preços do gráfico com passo STEP e obtemos o valor de tempo
//--- para o valor calculado de preço price de cada linha do canal equidistante.
//--- o tempo obtido para cada linha é registrado no log
   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);
   
//--- aguardamos 5 segundos e limpamos o que foi criado
   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
   */
  }
//+------------------------------------------------------------------+
//| Canal equidistante de High da barra esquerda até Low da direita  |
//+------------------------------------------------------------------+
bool CreateChannel(const long chart_id=0)
  {
   long     bar1  =0bar2  =0visible=0;
   datetime time1 =0time2 =0;
   double   price1=0price2=0;
 
//--- obtemos a primeira barra visível à esquerda do gráfico
   ResetLastError();
   if(!ChartGetInteger(chart_idCHART_FIRST_VISIBLE_BAR0bar1))
     {
      PrintFormat("%s: ChartGetInteger() failed. Error %d",__FUNCTION__GetLastError());
      return(false);
     }
//--- quantidade de bars visíveis no gráfico
   if(!ChartGetInteger(chart_idCHART_VISIBLE_BARS0visible))
     {
      PrintFormat("%s: ChartGetInteger() failed. Error %d",__FUNCTION__GetLastError());
      return(false);
     }
 
//--- ajustamos os valores obtidos e calculamos o índice da primeira barra visível à direita
   bar1-=1;
   visible-=2;
   bar2=bar1-visible;
   
//--- símbolo do gráfico
   string symbol=ChartSymbol(chart_id);
   
//--- obtemos o tempo da primeira barra visível à esquerda do gráfico
   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];
   
//--- obtemos o tempo da primeira barra visível à direita do gráfico
   if(CopyTime(symbolPERIOD_CURRENT, (int)bar21time_array)!=1)
     {
      PrintFormat("%s: CopyTime() failed. Error %d",__FUNCTION__GetLastError());
      return(false);
     }
   time2=time_array[0];
   
//--- obtemos o preço High da primeira barra visível à esquerda do gráfico
   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];
   
//--- obtemos o preço Low da primeira barra visível à direita do gráfico
   if(CopyLow(symbolPERIOD_CURRENT, (int)bar21price_array)!=1)
     {
      PrintFormat("%s: CopyLow() failed. Error %d",__FUNCTION__GetLastError());
      return(false);
     }
   price2=price_array[0];
   
//--- calculamos a faixa de preços do gráfico em pontos
//--- para o canal equidistante a distância da segunda linha será 1/3 da faixa de preços
   double range=price1-price2;
   double distance=range*0.3;
   
//--- nas coordenadas calculadas criamos o objeto gráfico canal equidistante
   if(!ObjectCreate(chart_idOBJ_NAMEOBJ_CHANNEL0time1price1time2price2time1price1-distance))
     {
      PrintFormat("%s: ObjectCreate() failed. Error %d",__FUNCTION__GetLastError());
      return(false);
     }
     
//--- atualizamos o gráfico e retornamos true
   ChartRedraw(chart_id);
   return(true);
  }

Veja Também

Tipos de Objeto