Erros, bugs, perguntas - página 1999

 
Alexey Viktorov:

Tomemos como exemplo a matriz de tampão indicador: Ao inicializar um indicador, o tampão tem um comprimento zero. O que há para inicializar com zeros? Quando outro índice é adicionado, é forçado a ser zerado e depois preenchido com algum valor???? Para que serve este zeramento ou enchimento com EMPTY_VALUE? E se houver necessidade de atribuir PLOT_EMPTY_VALUE e não 0 ou EMPTY_VALUE ou forçar um, mas precisamos de outro... Não importa como se corta, acaba por perder o seu tempo.

E uma matriz personalizada... A matriz é declarada para alguns dados diferentes de zero e EMPTY_VALUE. Então, qual é o objectivo de inicializá-lo à força com algo?

Acontece, portanto, que o desempenho é afectado na maioria dos casos.

Estou obviamente fora de contacto com a vida. Na minha opinião, o tampão indicador tem sempre o comprimento igual ao número de barras. E a recusa da sua inicialização em MT5 leva à exibição de lixo no ecrã. Acontece que a inicialização explícita é obrigatória. E não é claro porque é simplesmente transferido do núcleo (como era no MT4) para o programador MQL. Não vi nenhum argumento real que de alguma forma seja possível acelerar sem inicialização e ainda obter a exibição do lixo.

Não estou a dizer nada sobre uma matriz dinâmica personalizada - há realmente uma regra: aquele que a atribuiu, é responsável pela limpeza correcta. O ArrayInitialize é útil em muitos casos. Não é uma questão de velocidade, mas sim a correcção do programa. Priorizar: rápido e/ou correcto. Normalmente, algumas verificações de correcção e preparação de dados requerem tempo adicional (mesmo que mínimo), mas não se pode passar sem isso - os milagres nunca acontecem.

 
Stanislav Korotky:

Não estou a dizer nada sobre uma matriz dinâmica personalizada - a regra aplica-se realmente aí: quem quer que a tenha atribuído é responsável pela sua limpeza correcta.

Não insulte as matrizes.

#property strict

void OnStart()
{
  uchar Array[];
  
  const int Size = ArrayResize(Array, 10000);
  
  bool Res = false;
  
  for (int i = 0; (i < Size) && (!Res); i++)
    Res = Array[i];
    
  Print(Res);
}

Em MT4, voltará sempre falso, porque sem lixo - todos os zeros. Em MT5 é verdade.

Portanto, o mesmo código no testador MT4 mostrará sempre resultados idênticos de corrida para corrida. Num testador MT5, não o fará.

 
fxsaber:

Em MT4, voltará sempre a ser falso, porque sem lixo é tudo zeros. Em MT5 é verdade.

Será este um teste que o MT4 enche a matriz com zeros? Então temos de ter em mente que se o ArrayResize utiliza um terceiro parâmetro com reserva, então as reafectações subsequentes dentro da reserva não inicializarão nada. Haverá lixo. Recomendo que se faça uma inicialização explícita, para que não fique acidentalmente surpreendido mais tarde, como no exemplo de optimização que desencadeou esta discussão.

Para aqueles que se preocupam com a travagem devido à inicialização, atrevo-me a dizer que existem normalmente muitos outros locais e técnicas onde a eficiência pode ser melhorada em muito maior medida.

 
Stanislav Korotky:

Isto é um teste para o MT4 que enche o conjunto com zeros? Depois é preciso ter em mente que se o ArrayResize utilizar um terceiro parâmetro com uma reserva, então as reafectações subsequentes dentro da reserva não inicializarão nada. Haverá lixo.

Não haverá lixo.

Recomendo que se faça uma inicialização explícita para que não fique acidentalmente surpreendido mais tarde, tal como no exemplo de optimização que suscitou esta discussão.

Isto não vai salvar

Fórum sobre comércio, sistemas de comércio automatizados e testes estratégicos

Insectos, insectos, perguntas

fxsaber, 2017.09.12 11:18

Mesmo que tenha escrito perfeitamente (sem cometer erros - o que não faço), é normal pegar na biblioteca de outra pessoa (por vezes sem código fonte - no Mercado) e utilizá-la, esperando que seja escrita com competência. E não há seguro de que depois disso obtenha resultados diferentes no testador. E encontrar a verdadeira causa será MUITO difícil. E a sua fixação é por vezes impossível.

O objectivo é que de corrida em corrida o resultado seja reprodutível - idêntico, mesmo com um erro.

 
fxsaber:

Não haverá lixo.



Devemos então corrigir a documentação?

Inicializar um array com expressãoArrayInitialize(array, init_val) não significa inicializar elementos da reserva atribuída a este array com o mesmo valor. Quandoa função ArrayResize() aumenta subsequentemente o tamanho do array dentro da reserva actual, os elementos cujos valores não são definidos e na maioria das vezes não são iguais aoinit_val são adicionados ao fim do array.

 
Stanislav Korotky:

Precisamos então de corrigir a documentação?

Inicializar um array com a expressãoArrayInitialize(array, init_val) não significa que os elementos da reserva, atribuídos a este array, sejam inicializados com o mesmo valor. Quando oArrayResize() aumenta subsequentemente o tamanho do array dentro da reserva actual, os elementos são adicionados ao fim do array cujos valores não são definidos e, na maioria das vezes, não são iguais aoinit_val.

Não existe, porque simplesmente não existe tal coisa na documentação do MT4.


É horrível pensar que alguma biblioteca matemática (incluindo\Math -7Mb código-fonte) não tenha sido rubricada em um/dois lugares! E como desenterrar este erro que, no MT5-tester, dá diferentes corridas únicas, e no MT4 - o mesmo?

 
Stanislav Korotky:

Devo estar atrasado em relação aos tempos. Parece-me que o tampão indicador tem sempre um comprimento igual ao número de barras. E a recusa da sua inicialização em MT5 leva à exibição de lixo no ecrã. Acontece que a inicialização explícita é obrigatória. E não é claro porque é simplesmente transferido do núcleo (como era no MT4) para o programador MQL. Não vi nenhum argumento real que, de alguma forma, se possa acelerar sem inicialização e ainda obter a afixação do lixo.

Não estou a dizer nada sobre uma matriz dinâmica personalizada - há realmente uma regra: aquele que a atribuiu, é responsável pela limpeza correcta. O ArrayInitialize é útil em muitos casos. Não é uma questão de velocidade, mas sim a correcção do programa. Priorizar: rápido e/ou correcto. Normalmente, algumas verificações de correcção e preparação de dados requerem tempo adicional (embora mínimo), mas não se pode passar sem isso - os milagres acontecem.

Não prestou atenção à frase

Fórum sobre comércio, sistemas de comércio automatizados e testes estratégicos

Insectos, insectos, perguntas

Alexey Viktorov, 2017.09.12 10:50

Tomemos por exemplo a matriz de tampão indicador: Ao inicializar o indicador, o tampão tem comprimento zero. O que há para inicializar com zeros? Quando outro índice é adicionado é forçado a ser zerado e depois preenchido com algum valor???? Para que serve este zeramento ou enchimento com EMPTY_VALUE? E se houver necessidade de atribuir PLOT_EMPTY_VALUE e não 0 ou EMPTY_VALUE ou forçar um, mas precisamos de outro... Não importa como se corta, acaba por perder o seu tempo.

E uma matriz personalizada... A matriz é declarada para alguns dados diferentes de zero e EMPTY_VALUE. Então, por que deveria ser forçosamente inicializado com algo?

Assim, acontece que afecta o desempenho na maioria dos casos.



E não faz sentido fazer isto na OnCalculate. Porque precisaríamos de inicializar a matriz com algo e depois preenchê-la com alguns valores da fórmula? Quando se adiciona uma barra, respectivamente uma célula de matriz, de que serve enchê-la com algo e depois imediatamente com um valor da fórmula ou um valor vazio?

 
Alexey Viktorov:

E já em OnCalculate não faz sentido. Porque é que precisaríamos de inicializar a matriz com algo e depois preenchê-la imediatamente com alguns valores da fórmula? Quando se adiciona uma barra, e respectivamente uma célula de matriz, de que serve enchê-la com algo e depois imediatamente com um valor da fórmula ou um valor vazio?

Apenas novos elementos de matriz são inicializados. E o ponto continua a ser o mesmo - resultados idênticos de corrida em corrida, mesmo que haja um erro no código (muitas vezes não o seu). Dei um exemplo com a biblioteca matemática acima.

O lixo é maligno.

 
fxsaber:

Não o faça, porque simplesmente não existe um na documentação MT4.

De onde o obtive então? Vá aqui.

ArrayInitialize - Операции с массивами - Справочник MQL4
ArrayInitialize - Операции с массивами - Справочник MQL4
  • docs.mql4.com
ArrayInitialize - Операции с массивами - Справочник MQL4
 
Stanislav Korotky:

De onde é que eu tirei isso nessa altura? Vá aqui.

Portanto, não se trata de ArrayResize, mas sim de ArrayInitialize. O ArrayResize garante zeros em MT4.


Por uma questão de interesse, procurei em todas as minhas fontes de MT5 a frequência com que uso o ArrayInitialize. Apenas algumas vezes. Parece ser menos do que uma percentagem de todas as matrizes dinâmicas. E onde a utilizei, tive de usar nulos de propósito, por isso usei uma entrada mais curta em vez de para.

Razão: