Meu indicador desaparece sempre que eu mudo para um novo gráfico de tempo - página 3

 

Olá SDC,

Eu peguei. Muito obrigado.

Se houver 100 bar, as tarifas totais começam de 0 a 99.

No início, pre_cal =0 --> limite=100 bar - 0 =100.

for(int=1 to limit=100; I+++)

no final, I=100(valor do índice) e não existe tal barra 100.

Portanto, para fazer o máximo I=99, eu coloquei o limite -1;

Pergunto-me se existe alguma maneira melhor.

Além disso, o que me confunde é que em muitos outros indicadores, utilizo a mesma abordagem e não existe tal problema fora da faixa.

Além disso, obrigado pela aba Expert.

SCFX


   int limit=rates_total-prev_calculated;
   if(limit<=0) limit=2;
//---
 
 for(int i=1;i<limit-1  ;i++)
{  if((High[i]-Low[i])==0) continue;

   if(   MathAbs(Close[i]-Open[i])/(High[i]-Low[i])<0.50     ) 
      boring[i]=Close[i];
 
scfx:

Além disso, o que me confunde é que em muitos outros indicadores, eu utilizo a mesma abordagem e não existe tal problema fora de alcance.



antes do B600 fora de alcance não era um erro crítico
 
scfx:.

Portanto, para fazer o máximo I=99, eu coloquei o limite -1;

Pergunto-me se existe um caminho melhor.

Seu código agora vai desenhar o histórico do gráfico a partir da barra 1 sem erros, mas ele não vai desenhar para nenhuma barra nova. Há muitas maneiras de codificá-lo, dependendo do que você deseja que ele faça. Veja os indicadores incluídos no metaeditor para ver como os codificadores MQ o fazem. Quando você puder ler o código deles e entender a razão de cada linha, não terá problemas para criar indicadores.

 

Consegui agora o SDC.

Pessoalmente falando, é difícil imaginar quando eu leio o documento. Ainda não tenho certeza por que prev_calculado=taxas_totais -1.

Por isso, faço aqui um exemplo numérico. Espero que isso possa ajudar alguém novo como eu.

Normalmente, vemos:

Limit=taxas_total_prev_calculadas;//(no1)

OU

for(i=1;i<limit;i++) ou for(i=1;i<=limit;i++)

O importante é certificar-se de que LIMIT >=1. Na minha situação, LIMIT=0 e, portanto, o indicador não é REFESADO quando um novo tick chega.

Ora, vamos ver. (Acho que a causa é a pré_calculada, pelo menos no meu caso)

Assumindo que eu anexe o indicador quando houver 100 barras no gráfico. Aqui estão os valores das variáveis:

Primeira tabela de valores
Variável
Total_rates 100
Índice de barras 0-99
prev_calculated 0
Limite 100
Loop i valor 1-99

Tudo é bom. O valor aparecerá pela primeira vez desde a barra 1 até o início do gráfico.Quantas barras já calculadas? É um ponto crítico para o meu erro e eu não estou 100% claro.

Quando nova barra começa, no gráfico agora 101 barra. O indicador não é atualizado na barra já fechada, que agora é a barra 1.

Segunda tabela de valores
Variável
Total_taxas 101
Índice da barra 0-100
pré-calculado 99 OU 100 (veja abaixo)
Limite2 OU 1
Loop i valor 1 a 1 OU 1 a 0

Com base na 1ª tabela, o indicador calcula 99 bar (já que ele faz um loop de 1 a 99).
Entretanto, do documento diz: "MAS se não for a primeira chamada de início(), o valor igual a Bars-1 será retornado".) Portanto, ele retornará 101-1=100.
Esta única barra diferente causa problemas. Se o sistema retornar 100 como pré_calculado.
Você vê que, se pré_calculado=99, o laço irá funcionar.
Entretanto, pareça pré-calculado = 100 e, portanto, o laço não funcionará como limite =0 ou -1 depende.
Alguém pode me ajudar a ver a lógica por trás do pré_calculado= Bars-1 neste caso?

Portanto, a solução é bem clara: Faça para(i=1; ___ esta aqui deve ser maior que 1 para (<) ou maior ou igual a 1 para (<=)___; i++). Em meu último código, ele é igual a 0.

   int pcal=prev_calculated;
   
   if(prev_calculated>0)
   pcal--; 
      
   int limit=rates_total-pcal;
   for(int i=1;i<=limit  ;i++)	//it is <=


//--------------OR ------------------------

  int limit=rates_total-prev_calculated-1;
  if(limit<=0) limit=2; //NOT limit

for(int i=1;i<=limit  ;i++) //it is <=

Espero que ajude.

SCFX

 

pré_calculado ==taxas_total

scfx:

Consegui agora o SDC.

Pessoalmente falando, é difícil imaginar quando eu leio o documento. Ainda não tenho certeza por que prev_calculado=taxas_totais -1.

SCFX

Crie um novo indicador, coloque este código na função iniciar, anexe-o a um gráfico de 1 minuto e observe os alertas à medida que os ticks chegam.

Alert("rt = ",rates_total,"  pc = ",prev_calculated);

Você verá que o total de tarifas_total é a quantidade atual de barras.

prev_calculado é a quantidade de barras que havia no tick anterior.

 
SDC:

pré_calculado ==taxas_total

Crie um novo indicador, coloque este código na função iniciar, anexe-o a um gráfico de 1 minuto e observe os alertas à medida que os ticks chegam.

Você verá que o total de tarifas_total é a quantidade atual de barras.

prev_calculado é a quantidade de barras que havia no tick anterior.


Uau, isso é esquisito.

No link postado anteriormente, eles disseram que se :MAS se não for a primeira chamada de partida(), o valor igual a Bars-1 será devolvido.

Como ele retorna Barras (Rate_totals).

 

Sim, eu sei que eles dizem isso, mas não é totalmente exato.

O que realmente acontece é o seguinte.

rates_total == quantidade total de barras quando o tick atual chegou. prev_calculated == quantidade total de barras quando o tick anterior chegou.

Barras no gráfico Estado Indicador taxas-total pré-calculado tarifas_total-prev_calculadas
1000 primeira corrida quando carregado 1000 0 1000
1000 próximo tick 1000 1000 0
1000 próximo tick 1000 1000 0
1001 1ª marca de nova barra 1001 1000 1
1001 próximo tick 1001 1001 0
1001 próximo tick 1001 1001 0

Portanto, você tem 3 estados principais de pré-calculados vs tarifas_total. Indicador carregado, tiquetaque médio da barra, primeiro tique da barra nova.

pré-calculado == 0 na primeira execução porque não houve tique anterior desde que o indicador foi carregado.

Também se o gráfico for alterado ou se o histórico for adicionado, o pré-calculado volta a zero.

O valor de retorno do OnCalculate não é usado, mas é melhor usar o retorno padrão(rates_total) no caso de alguma vez corrigirem isso.

 
Barras na tabela Estado Indicador taxas-total pré-calculado tarifas_total-prev_calculadas
1000 primeira corrida quando carregado 1000 0 1000
E o bar 1000 não existe.

Eu sei o que dizem os novos documentos. Se você fizer isso da maneira deles, você tem que testar as taxas pré_calculadas para não_zero e ajustar as taxas_total - pré_calculadas para baixo. Isso é voltar à confusão do indicador de descida_contada.
int OnCalculate(const int rates_total,
                const int prev_calculated, ...){
   #define LOOKBACK 1 // iMA(... iBar+1)
   int indicator_counted = prev_calculated;
   if(indicator_counted < LOOKBACK) indicator_counted = LOOKBACK;
   for(iBar = rates_total - 1 - indicator_counted; i>=0 i--){
      Buffer[iBar] = ...;
   }
   return(rates_total - 1); // Recalculate bar zero next tick.
}
Ver Mostrar o progresso do indicador - Fórum MQL4
 

Não adianta fazer retorno( taxas_total - 1 ) o valor do pré_cálculo é como se fosse retorno(taxas_total) independentemente do que você disse para retornar.

 
SDC: Não adianta fazer retorno( taxas_total - 1 ) o valor do pré_cálculo é como se fosse retorno(taxas_total) independentemente do que você disse para retornar.
você colocou o problema na mesa de serviço?