Dúvida sobre o a variável "rates_total"

 

Boa noite a todos,

Estou desenvolvendo um indicador e já consegui fazer todos os cálculos e traçar o gráfico, porém notei que quando eu troco de ativo com o indicador já aberto  as vezes ele é traçado de forma errônea no novo ativo, eu estou usando o valor de rates_total para traçar o indicador e notei que esse valor é carregado de forma progressiva nos primeiros segundo e é exatamente isso que está fazendo o indicador ser traçado de forma errônea, gostaria de saber se há algum evento para detectar quando o valor de rates_total(Eu sei que o rates_total vai mudando a medida que novos candles vão surgindo, eu gostaria de garantir a quantidade total disponível no momento da abertura do gráfico) já foi completamente carregado
sei que poderia usar algo como um  OnTimer() para retardar o tempo de carregamento do indicador, mas não me parece a forma mais eficaz de solucionar isso.


void DesenharGrafico(int rates_total) {
   // Traça as linhas no gráfico
   for(int i = 0; i < Qtd_Periodos; i++) {
      int p_atual = rates_total - Qtd_Periodos + i;
      mediaBuffer[p_atual] = medias[i];
      ratioBuffer[p_atual] = ratios[i];
      bd_superiorBuffer[p_atual]  = medias[i] + (desvios[i] * 2);
      bd_inferiorBuffer[p_atual] = medias[i] - (desvios[i] * 2);
   }
}
Como posso eu próprio criar um expert advisor ou um indicador - Trading algorítmico, robôs comerciais - Ajuda para o MetaTrader 5
Como posso eu próprio criar um expert advisor ou um indicador - Trading algorítmico, robôs comerciais - Ajuda para o MetaTrader 5
  • www.metatrader5.com
Para desenvolver sistemas de negociação, a plataforma tem a sua própria linguagem de programação MetaQuotes...
 
Gilson Meira:

Boa noite a todos,

Estou desenvolvendo um indicador e já consegui fazer todos os cálculos e traçar o gráfico, porém notei que quando eu troco de ativo com o indicador já aberto  as vezes ele é traçado de forma errônea no novo ativo, eu estou usando o valor de rates_total para traçar o indicador e notei que esse valor é carregado de forma progressiva nos primeiros segundo e é exatamente isso que está fazendo o indicador ser traçado de forma errônea, gostaria de saber se há algum evento para detectar quando o valor de rates_total(Eu sei que o rates_total vai mudando a medida que novos candles vão surgindo, eu gostaria de garantir a quantidade total disponível no momento da abertura do gráfico) já foi completamente carregado
sei que poderia usar algo como um  OnTimer() para retardar o tempo de carregamento do indicador, mas não me parece a forma mais eficaz de solucionar isso.


Oi Gilson.


Quando eu preciso trabalhar com o valor antigo do rates eu crio uma variável que guarda o valor, por exemplo:


int rates_anterior = 0 (escopo global) ou como variável estática.


depois compara

if(rates_anterior!=rates_total)

{

//Seu código aqui

rates_anterior=rates_total; //atualiza o valor do rates_anterior

}

Deve resolver.

Sucesso e bons trades!

 
Ricardo Branco #:

Oi Gilson.


Quando eu preciso trabalhar com o valor antigo do rates eu crio uma variável que guarda o valor, por exemplo:


int rates_anterior = 0 (escopo global) ou como variável estática.


depois compara

if(rates_anterior!=rates_total)

{

//Seu código aqui

rates_anterior=rates_total; //atualiza o valor do rates_anterior

}

Deve resolver.

Sucesso e bons trades!

Obrigado pela resposta, no meu caso o problema ocorre só no momento da inicialização do gráfico e nesse caso criar uma cópia do rate não resolveria porque eu continuaria copiando o rate errôneo, o problema ocorre basicamente em máquinas menos potentes e/ou quando se tem uma latência alta com respeito a conexão, pois com recurso limitado o rates_total é iniciado de forma gradual o que faz com que o indicador seja plotado nos tempos mais antigos. 
EX:
0 segundo: rates_total = 0 - (Momento da troca do ativo no gráfico já com o indicador inserido)
1 segundo: rates_total = 100 - (Nesse momento a função DesenharGrafico() já foi chamada, o que faz o indicador não ser plotado no período atual)

2 segundos: rates_total = 150 - (Nesse momento o indicador já foi totalmente plotado mas o rates_total ainda não carregou a quantidade total de dados)

10 segundos: rates_total = 532 - (Nesse momento o rates_total assume seu valor total, o que faz com que somente o ultimo dado seja plotado corretamente, visto que há uma função que fica recalculando e plotando o indicador no seu ultimo período.)


No final eu estou inclinado a plotar o indicador todo a cada disparo do OnChange(), creio não ter um problema muito grande de performance porque eu traço o indicador com base nos últimos X períodos e não no rates_total.

De qualquer forma, agradeço pela sua ajuda,
Bons negócios!

 
Gilson Meira:

Boa noite a todos,


Boa tarde Gilson,

abra o MACD.mq5 em ...\\Indicators\\Examples e siga como exemplo.

 
Gilson Meira #:

Obrigado pela resposta, no meu caso o problema ocorre só no momento da inicialização do gráfico e nesse caso criar uma cópia do rate não resolveria porque eu continuaria copiando o rate errôneo, o problema ocorre basicamente em máquinas menos potentes e/ou quando se tem uma latência alta com respeito a conexão, pois com recurso limitado o rates_total é iniciado de forma gradual o que faz com que o indicador seja plotado nos tempos mais antigos. 
EX:
0 segundo: rates_total = 0 - (Momento da troca do ativo no gráfico já com o indicador inserido)
1 segundo: rates_total = 100 - (Nesse momento a função DesenharGrafico() já foi chamada, o que faz o indicador não ser plotado no período atual)

2 segundos: rates_total = 150 - (Nesse momento o indicador já foi totalmente plotado mas o rates_total ainda não carregou a quantidade total de dados)

10 segundos: rates_total = 532 - (Nesse momento o rates_total assume seu valor total, o que faz com que somente o ultimo dado seja plotado corretamente, visto que há uma função que fica recalculando e plotando o indicador no seu ultimo período.)


No final eu estou inclinado a plotar o indicador todo a cada disparo do OnChange(), creio não ter um problema muito grande de performance porque eu traço o indicador com base nos últimos X períodos e não no rates_total.

De qualquer forma, agradeço pela sua ajuda,
Bons negócios!

Olá Gilson.

Conte o número de barras com:

nBarras = iBars(_Symbol, PERIOD_CURRENT);

Assim você terá o rates_total antes que ele termine seu loop e poderá fazer o que deseja. 

Sucesso por aí.

Razão: