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.
#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
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.
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.
![MQL5 - Linguagem para estratégias de negociação inseridas no terminal do cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
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!