ObjectGetValueByTime

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

double  ObjectGetValueByTime(
   long      chart_id,     // identificador gráfico
   string    name,         // nome objeto
   datetime  time,         // Tempo
   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.

time

[in]  Valor de tempo.

line_id

[in]  ID de Linha.

Valor do Retorno

O valor do preço para o valor de tempo indicado 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   "TestObjectGetValueByTime" //--- nome do objeto gráfico
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- identificador do gráfico, símbolo
   long   chart_id=ChartID();
   string symbol=ChartSymbol(chart_id);
 
   long bar1=0, bar2=0, visible=0;
//--- obtemos a primeira barra visível à esquerda do gráfico
   ResetLastError();
   if(!ChartGetInteger(chart_id, CHART_FIRST_VISIBLE_BAR, 0, bar1))
     {
      Print("ChartGetInteger() failed. Error ", GetLastError());
      return;
     }
//--- quantidade de bars visíveis no gráfico
   if(!ChartGetInteger(chart_id, CHART_VISIBLE_BARS, 0, visible))
     {
      Print("ChartGetInteger() failed. Error ", GetLastError());
      return;
     }
 
//--- ajustamos os valores obtidos e calculamos o índice da primeira barra visível à direita
   bar1-=1;
   visible-=2;
   bar2=bar1-visible;
 
//--- construímos um canal equidistante de High da barra esquerda visível até Low da barra direita
   if(!CreateChannel(chart_id, (int)bar1, (int)bar2))
      return;
   
   int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
   
//--- em laço da barra visível esquerda até a barra visível direita no gráfico
//--- obtemos o valor de preço para o tempo da barra do laço de cada linha do canal equidistante.
//--- o preço obtido para cada linha é registrado no log
   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);
     }
   
//--- aguardamos 5 segundos e limpamos o que foi criado
   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 o tempo da barra indicado pelo í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]);
  }
//+------------------------------------------------------------------+
//| Canal equidistante de High da barra esquerda até Low da direita  |
//+------------------------------------------------------------------+
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 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(symbol, PERIOD_CURRENT, (int)bar1, 1, time_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(symbol, PERIOD_CURRENT, (int)bar2, 1, time_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(symbol, PERIOD_CURRENT, (int)bar1, 1, price_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(symbol, PERIOD_CURRENT, (int)bar2, 1, price_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_id, OBJ_NAME, OBJ_CHANNEL, 0, time1, price1, time2, price2, time1, price1-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