Indicador para armazenamento de preço no tempo - Array não funciona

 

Boa tarde pessoal,


Estou batalhando para fazer um indicador que armazena o preço de X segundos atrás em um array. Ele até funciona se eu utilizar os dados do array[0].
Todavia, se quero o dado contido no array[5], por exemplo, ele não disponibiliza. 
já tentei de tudo e não á certo. Claro que não sou experiente em programação mql5. Por isso, se alguém puder me ajudar e dizer o que está errado/faltando, agradeceria imensamente!

#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 1


enum ENUM_ANCORA
 {
 
 
  _ANCHOR_LEFT_UPPER   = 0,    // Canto Superior Esquerdo
  _ANCHOR_LEFT_LOWER   = 2,    // Canto Inferior Esquerdo
  _ANCHOR_RIGHT_LOWER  = 4,    // Canto Inferior Direito
  _ANCHOR_RIGHT_UPPER  = 6     // Canto Superior Direito
 
 
 };
 
  
double L[];

input int                 Frequencia_Avaliacao         = 1;          // Frequência de avaliações (segundos)
input int                 Distancia_preco_secs         = 5;          // Distância em segundos do preço
input bool                Mostrar_Painel               = true;       // Mostrar Painel
input ENUM_ANCORA         Anchoragem                   = 0;          // Posição do Painel
input color               Cor_do_Texto                 = clrYellow;  // Cor Do Texto

datetime LastTime,NextTime;
double LastClose, LastPrice;

string cod = "GUI123";
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {

  
   LastTime  = TimeCurrent();
   LastClose = iClose(_Symbol,0,0);
 // int x = Anchoragem  == 2 ? 5 : 
   NextTime  = LastTime+Frequencia_Avaliacao;
   

   SetIndexBuffer(0,L,INDICATOR_DATA);
   ArraySetAsSeries(L,true);
   
   
   return(INIT_SUCCEEDED);
  }
long width, height, Last_Height,Last_Width;
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
bool xx = false;


int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &Close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
 
  
   

   if(TimeCurrent() >= NextTime)
    {
    LastTime = NextTime;
    NextTime = LastTime+Frequencia_Avaliacao;
    LastClose = iClose(_Symbol,0,0);
    L[0] = LastClose;
    L[Distancia_preco_secs] = LastPrice;
   
    
   
   
    ObjectSetString(0,cod+"Last_Time",OBJPROP_TEXT,"Ultima Atualização: "+TimeToString(LastTime,TIME_DATE|TIME_MINUTES|TIME_SECONDS));
    ObjectSetString(0,cod+"Next_Time",OBJPROP_TEXT,"Próxima Atualização: "+TimeToString(NextTime,TIME_DATE|TIME_MINUTES|TIME_SECONDS));
    ObjectSetString(0,cod+"Ultimo_Preco",OBJPROP_TEXT,"Ultimo Preço: "+DoubleToString(LastPrice,_Digits)); 
       
    }
    
  
   height  =  ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS);
   width   =  ChartGetInteger(0,CHART_WIDTH_IN_PIXELS);
  
  if(height != Last_Height || width != Last_Width)
    {
    
    Last_Height = height; 
    Last_Width  = width;
    CriarPainel();
    
    }

  
   xx = true;
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
  
 
O tópico foi movido para a secção: Indicadores técnicos  
 
Marcelo Peres:

Boa tarde pessoal,


Estou batalhando para fazer um indicador que armazena o preço de X segundos atrás em um array. Ele até funciona se eu utilizar os dados do array[0].
Todavia, se quero o dado contido no array[5], por exemplo, ele não disponibiliza. 
já tentei de tudo e não á certo. Claro que não sou experiente em programação mql5. Por isso, se alguém puder me ajudar e dizer o que está errado/faltando, agradeceria imensamente!

Tente aprender a linguagem aos poucos e nao gerar codigo. Com isso, inicie limpando essas informacoes que ainda nao sao da funcionalidade e ver se da problema. So em passar eu vi uma variavel usada e nunca populada que eh a que voce esta se referindo.
 
Ricardo Rodrigues Lucca #:
Tente aprender a linguagem aos poucos e nao gerar codigo. Com isso, inicie limpando essas informacoes que ainda nao sao da funcionalidade e ver se da problema. So em passar eu vi uma variavel usada e nunca populada que eh a que voce esta se referindo.
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 1


enum ENUM_ANCORA
 {
 
 
  _ANCHOR_LEFT_UPPER   = 0,    // Canto Superior Esquerdo
  _ANCHOR_LEFT_LOWER   = 2,    // Canto Inferior Esquerdo
  _ANCHOR_RIGHT_LOWER  = 4,    // Canto Inferior Direito
  _ANCHOR_RIGHT_UPPER  = 6     // Canto Superior Direito
 
 
 };
 
  
double L[];

input int                               Frequencia_Avaliacao         = 1;          // Frequência de avaliações (segundos)
input int                               Distancia_preco_secs         = 5;          // Distância em segundos do preço
input bool                              Mostrar_Painel                  = true;       // Mostrar Painel
input ENUM_ANCORA         Anchoragem                      = 0;          // Posição do Painel
input color                             Cor_do_Texto                    = clrYellow;  // Cor Do Texto

datetime LastTime,NextTime;
double LastClose;

string cod = "GUI123";
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {

  
   LastTime  = TimeCurrent();
   LastClose = iClose(_Symbol,0,0);
 // int x = Anchoragem  == 2 ? 5 : 
   NextTime  = LastTime+Frequencia_Avaliacao;
   

   SetIndexBuffer(0,L,INDICATOR_DATA);
   ArraySetAsSeries(L,true);
   
   
   return(INIT_SUCCEEDED);
  }
long width, height, Last_Height,Last_Width;
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
bool xx = false;


int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &Close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
 
  
   

   if(TimeCurrent() >= NextTime)
    {
    LastTime = NextTime;
    NextTime = LastTime+Frequencia_Avaliacao;
    LastClose = iClose(_Symbol,0,0);
    L[Distancia_preco_secs] = LastClose;
    
   
    
   
   
    ObjectSetString(0,cod+"Last_Time",OBJPROP_TEXT,"Ultima Atualização: "+TimeToString(LastTime,TIME_DATE|TIME_MINUTES|TIME_SECONDS));
    ObjectSetString(0,cod+"Next_Time",OBJPROP_TEXT,"Próxima Atualização: "+TimeToString(NextTime,TIME_DATE|TIME_MINUTES|TIME_SECONDS));
    ObjectSetString(0,cod+"Ultimo_Preco",OBJPROP_TEXT,"Ultimo Preço: "+DoubleToString(LastClose,_Digits)); 
       
    }
    
  
   height  =  ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS);
   width   =  ChartGetInteger(0,CHART_WIDTH_IN_PIXELS);
  
  if(height != Last_Height || width != Last_Width)
    {
    
    Last_Height = height; 
    Last_Width  = width;
    CriarPainel();
    
    }

  
   xx = true;
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }

Ricardo, boa tarde! 

De fato, mesmo eu corrigindo e deixando assim como fiz ai em cima, não obtenho o preço de 5 segundos atrás... (não armazena o array)...
Obrigado pela ajuda

 
Marcelo Peres #:

Ricardo, boa tarde! 

De fato, mesmo eu corrigindo e deixando assim como fiz ai em cima, não obtenho o preço de 5 segundos atrás... (não armazena o array)...
Obrigado pela ajuda

inverte as duas linhas. Tu ta colocando o valor na variavel e usando ela. Tu tem que usar a veriavel com  o valor anterior e, em seguida, atualizar. Ou utilizar duas variaveis diferentes. Algo como CurrentPrice e LastPrice dai no OnInit tu coloca o iClose no CurrentPrice e no OnCalculate tu pega o CurrentPrice e joga no LastPrice. Em seguida, no CurrentPrice joga o fechamento atual. Dai tu joga o valor no L[Distancia_preco_secs] o valor atual (CurrentPrice) ou valor anterior (LastPrice que vai ser da ultima janela).

Se quiser so pegar os preco de uma vela anterior tem jeito melhor usando o ultimo parametro do iClose, mas  nao eh isso que parece voce quer.

 
Ricardo Rodrigues Lucca #:

inverte as duas linhas. Tu ta colocando o valor na variavel e usando ela. Tu tem que usar a veriavel com  o valor anterior e, em seguida, atualizar. Ou utilizar duas variaveis diferentes. Algo como CurrentPrice e LastPrice dai no OnInit tu coloca o iClose no CurrentPrice e no OnCalculate tu pega o CurrentPrice e joga no LastPrice. Em seguida, no CurrentPrice joga o fechamento atual. Dai tu joga o valor no L[Distancia_preco_secs] o valor atual (CurrentPrice) ou valor anterior (LastPrice que vai ser da ultima janela).

Se quiser so pegar os preco de uma vela anterior tem jeito melhor usando o ultimo parametro do iClose, mas  nao eh isso que parece voce quer.

Bom dia!
Muito obrigado pela dica Ricardo. Vou tentar aqui!
O preço da vela anterior não serve. O que eu quero, na verdade,é fazer um array de preço atualizado a cada segundo e pegar o preço de x segundos atrás, acessando ele no array... por exemplo o L[5] (L[Distancia_preco_secs]) é o preço de 5 segundos atrás... 
Um abraço.

Razão: