Erros, bugs, perguntas - página 3151

 
Artyom Trishkin #:

Sempre houve uma verificação: if(limit>1) limit=rates_total-1. Isto é para os casos em que não há i+something no cálculo. Se houver, então estes "quantos-alguma-coisa" devem ser incluídos na construção: limite=taxas_total-1-alguma-coisa.

Sem ele, haveria sempre uma série de ultrapassagens. Porque tarifas_total não é mais do que Bars(). De forma correspondente, se houver 5000 barras e abordarmos o índice 5000, estaremos fora dos limites da matriz (o cálculo das barras começa com zero).

No seu exemplo, o cálculo do limite está errado:

Deveria ser assim:

E depois de verificar o limite>1

E se o limite for superior a um, então limite = taxas_total-1

Obrigado Artem! E desculpem o alarido.
Certo, devia haver um cheque, apenas me esqueci dele.
Ainda tenho um comentário no código
//Cheque e calcule o número de barras calculadas.
Aparentemente, a pasta de cópias causou o meu mal-entendido.
Tudo funciona como deveria com o cheque. Obrigado.

 
Roman #:

Obrigado Artem!
Certo, deveria haver um cheque, que eu tinha esquecido.
Tudo funciona correctamente com a verificação. Obrigado.

De nada. Fixar o cálculo. Não está correcto - sublinhei isto acima.

int limit = rates_total-1-prev_calculated;

-1 não deveria estar aqui.

Se as taxas_totais são 5000, e as barras calculadas na chamada anterior de OnCalculate() são também 5000 (pré_calculadas), então o limite será igual a -1. Por conseguinte, o laço não será executado de todo.

Se quiser seleccionar como ler o indicador (por ticks na barra de zero ou apenas na abertura de uma nova), então introduza uma variável, especificando como o fazer:

int end = (cada carrapato ? WRONG_VALUE : 0);

o laço será o seguinte: for(int i=limit; i>end; i--) { //... }

e o cálculo do limite será correcto, e o laço será como deseja que seja.

 

Código correcto.

i>=0 para cada carrapato

i>0 para novo bar

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,       
                 const int prev_calculated,   
                 const int begin,             
                 const double& price[])      
{
   ArraySetAsSeries(price, true);
   ArraySetAsSeries(IndBuff, true);
   
   //-------------------------------------------------------------------------
   //Расчёт и проверка количества просчитываемых баров
   int limit = rates_total-prev_calculated;
   
   if(limit>1) 
      limit = rates_total-1;
   

   //-------------------------------------------------------------------------
   //Расчёт индикатора
   for(int i=limit; i>=0; i--)
   {

      IndBuff[i] = price[i]; 

   }
   

   return(rates_total);
}
 
Nikolai Semko #:
Ou

Nem sequer perguntou o que fazer... Os telepatas estão de volta das férias? ;)

 
Roman #:

Código correcto.

i>=0 para cada carrapato

i>0 para um novo bar

ArraySetAsSeries(IndBuff, true);

É melhor mudar para o OnInit()

 
Artyom Trishkin #:

Nem sequer perguntou o que fazer... Os telepatas estão de volta das férias? ;)

:)
Artem, não precisa de ser um telepata para ver que o homem se registou há alguns minutos e a primeira coisa que viu foi "Insectos, insectos, perguntas"
Claramente, ele está a perguntar se consegue arranjar algum dinheiro grátis, e para não causar demasiados problemas...

 
Nikolai Semko #:

:)
Artem, não precisa de ser um telepata para ver que o homem se registou há alguns minutos e a primeira coisa que viu foi "Erros, insectos, perguntas"
Claramente, ele está a perguntar se pode obter algum dinheiro de graça, e não se esforçar demasiado...

Talvez tenha decidido ganhar algum dinheiro extra com o Bentley, investindo num tutor? :)

 
Artyom Trishkin #:

Talvez tenha decidido ganhar algum dinheiro para o seu Bentley, investindo num tutor, através de um trabalho árduo como programador. :)

Não me parece, Artem.
Se ele tivesse o potencial de um programador, não teria permitido ambiguidade e incerteza.
:)
 
Roman #:

Sabe o que é mais irritante? Que qualquer comportamento seja enganado silenciosamente, sem aviso prévio.
E depois as pessoas ficam feridas. Estou farto deste metatarraxador.

O desenho de um ciclo indicador é apenas emprestado dos velhos tempos pelo método de copiar-colar (e autocompletar torto) sem pensar.

tudo é simples com a interface actual:

for(int bar=prev_calculated>0?prev_calculates-1:0 ; bar<rates_total; bar++) {

   int i=rates_total-1; // i используем если обращения как ArraySetSeries(x,true), иначе bar

   ....

}

return rates_total;

o empurrão com prev_calculado-1 neste caso é necessário se precisar de recalcular a última barra em cada chamada.

 
Maxim Kuznetsov #:

É que o desenho do ciclo indicador é retirado dos velhos tempos de copiar-colar (e auto-completar torto) sem pensar.

tudo é simples com a interface actual:

for(int bar=prev_calculated>0?prev_calculates-1:0 ; bar<rates_total; bar++) {

   int i=rates_total-1; // i используем если обращения как ArraySetSeries(x,true), иначе bar

   ....

}

return rates_total;

o apinhamento com pré-cálculo-1 neste caso é necessário se precisar de recalcular a última barra em cada chamada.

Sim, fiquei um pouco excitado com a minha declaração.
Quando algo costumava funcionar e agora não funciona, os tiques nervosos começam )
E começa-se a verificar tudo e culpa-se infundadamente o acidente, esquecendo-se de alguma peculiaridade de que não se lembra, claro.
E a culpa é da copipasta. Penso que muitos já enfrentaram isto.

Quero sugerir que os criadores façam modelos personalizados para indicadores e EAs.
Poderão seleccioná-los no feiticeiro.

m

Alguns editores de C/C++ têm esta característica.
É muito conveniente adicionar os modelos básicos, com os quais trabalha principalmente, e depois carregá-los no feiticeiro.
Os modelos padrão de MQL não são de todo os mesmos.
Obviamente, podemos dizer que podemos escrever modelos e depois copiá-los.
E mais uma vez voltamos à palavra insidiosa "copy-paste". E o facto de podermos automatizá-lo e tornar a vida do programador mais fácil não é tido em conta.