MT4 iMAOnArray e iBandsOnArray efeito do número de elementos nos cálculos - página 6

 

Eu não sugeri uma calculadora ou Excelência por nada. Ajuda a entender como essa merda funciona. Você só pode usar um número de elementos diferente de zero para calcular se você já tiver uma matriz pronta. Suponha que você tenha um conjunto de 1000 elementos, e você queira ter uma média de apenas os últimos 100. Temos duas opções: converter esses 100 elementos em uma matriz personalizada e recalculá-los, ou usar o loop de 100 para 0 e não converter o número de elementos em 0, mas em 100.

Mas aqui enfrentamos o problema de mudar o tamanho da matriz, o que é inevitável nos indicadores.

Mais uma vez, eu estava falando sobre outras formas de limitar o número de elementos para o cálculo. Bem, você pode definir a condição iMAOnArray() somente se(tarifas_total-i >= tarifas_total-100); e somente as últimas 100 barras serão recalculadas e tudo estará bem quando uma nova barra chegar.

int i, limit;
   limit = prev_calculated == 0 ? rates_total-1 : rates_total-prev_calculated;

   for(i = limit; i >= 0; i--)
     {
      Buffer[i]=open[i];
      if(rates_total-i >= rates_total-100)
      BufferMA[i] = NormalizeDouble(iMAOnArray(Buffer, 0, 5, 0, MODE_LWMA, i), _Digits);
      
     }

return(rates_total);


 
Alexey Viktorov:

Eu não sugeri uma calculadora ou Excelência por nada. Ajuda a entender como essa merda funciona. Você só pode usar um número de elementos diferente de zero para calcular se você já tiver uma matriz pronta. Suponha que você tenha um conjunto de 1000 elementos, e você precisa ter em média apenas os últimos 100. Temos duas opções: converter esses 100 elementos em uma matriz personalizada e recalculá-los, ou usar o loop de 100 para 0 e não converter o número de elementos em 0, mas em 100.

Mas aqui enfrentamos o problema de mudar o tamanho da matriz, o que é inevitável nos indicadores.

Mais uma vez, eu estava falando sobre outras formas de limitar o número de elementos para o cálculo. Bem, estabeleça a condição para ler iMAOnArray() somente se(rates_total-prev_calculated-i >= 100); e somente as últimas 100 barras serão recalculadas e tudo estará bem quando uma nova barra chegar.


Diga-me, você é um programador ou o faz como hobby, ou por necessidade? Não preciso de um Excel ou de um pedaço de papel para entender como funciona, e o Barabashka demonstrou todas as "dificuldades" na captura de tela antes. Vamos em ordem.

1. iMAOnArray (assim como o iBandsOnArray) pode funcionar em duas versões, pode ler todo o array e fazê-lo corretamente (mas tem lentidão durante o cálculo primário) ou pode ler uma parte do array, mas o fará apenas para os elementos iniciais, apesar do fato de que o turno é especificado para os elementos finais. No entanto, tentei limitar o cálculo às barras que ainda preciso calcular ou toda a matriz (ou seja, a versão inicial de "frenagem"), ou para compor uma variante semelhante à sua com cópia do buffer e recálculo de todos os elementos deste buffer, que, como descrito em meus posts anteriores, não dá resultado certo para métodos de suavização complexos e também aumenta o tempo de processamento de dados em geral.

2. o problema, descrito por você nos indicadores com o redimensionamento da matriz, ocorre apenas se a matriz não for um dos amortecedores de indicadores, ou seja, sua "dança ao redor" descrita também tem um efeito negativo, porque voltando ao código fonte primário o problema estava apenas em cálculo lento e apenas no primeiro passo.

3. A variante oferecida por você com recálculo de apenas parte das arrays em 100 (N) barras, dá novamente perda de produtividade geral e problemas desnecessários de implementação com cópia de array ou recálculo desnecessário. Além disso, em sua captura de tela e no código acima de todos os cálculos são feitos (suspeito que em algum lugar da matriz interna, é mais provável que ocorram os atrasos primários), caso contrário, este tipo de suavização teria feito com que os resultados do primeiro preenchimento fossem diferentes, e você simplesmente não preencheu a matriz tampão com eles. Porque 0 no parâmetro de tamanho da matriz para calcular a função diz explicitamente para ler todos os dados, esse é o senão.

A única maneira de acertar é usar minha própria função, que funcionará como deveria e não recalculará todos os dados (N parte dela) quando surgir uma nova barra, mas só a lerá, especialmente porque tenho e uso uma função de média em muitos dos meus produtos. A questão deste tópico do fórum era como "bater" as funções padrão do MT4, sem agravar a velocidade de processamento e o resultado. Se eu acreditar na mensagem acima,o "desvio padrão" na matriz é calculado sem freios, ou como um retorno posso escrever meu próprio cálculo de desvio, especialmente porque as fórmulas de cálculo estão disponíveis para todos aqui na documentação.

 

Tantas cartas... E tudo isso tem como único objetivo discordar da opção proposta.

Obrigado pela idéia, pelo menos eu descobri como funciona, caso contrário não entrei nos meandros destas funções como não precisava.

Se você não gostar, use os autoescritos.

 
Alexey Viktorov:

Tantas cartas... E tudo visa unicamente a discordância com a opção proposta.

Obrigado pela idéia, pelo menos descobri como funciona, caso contrário não entrei nos meandros destas funções porque não precisava fazê-lo.

Se você não gostar, use os autoescritos.

Por que em desacordo, para explicar porque você não deve fazer isso, porque escrever o código vinculado a funções de parada ou código que cria ciclos adicionais de cópia - nem sempre é a opção certa, embora, às vezes, e menos demorado :)
E não se trata de "gostar"/"não gostar", mas no fato de que as funções não funcionam exatamente como deveriam, porque de fato, criar análogos é como reinventar a roda, mas neste caso particular não podemos passar sem ela.

Fiz conclusões para mim mesmo há várias páginas, mas sua maneira, talvez, ajude alguém a entender que esta situação já foi resolvida aqui, e o que eu preciso fazer para resolver este problema, tantas cartas :)

 

Não há cópia ou ciclos extras nesta última variante. E o método de cálculo MODE_LWMA de que você e Dimitri estavam falando antes não pode ser recalculado corretamente.

Veja o código e a captura de tela. Na captura de tela, MA período 5 como no código, método MODE_LWMA e prestar atenção ao número de barras calculadas, à coincidência dos valores de MA e indicadores com iMAOnArray() no porão. Se você quiser recalcular todas as barras ou apenas recalcular 100. Se não houver mudanças, isso significa que outros cálculos são lentos.

 
Uma chatice total!
 
Sergey Efimenko:

Diga-me, você é um programador ou o faz como hobby, ou por necessidade?

No passado, ele costumava começar a balbuciar que não era um programador, mas um amador e, portanto, podia ser intimidado.
 
Alexey Viktorov:

Não há cópia ou ciclos extras nesta última variante. E o método de cálculo MODE_LWMA de que você e Dimitri estavam falando antes não pode ser recalculado corretamente.

Veja o código e a captura de tela. Na captura de tela, MA período 5 como no código, método MODE_LWMA e prestar atenção ao número de barras calculadas, à coincidência dos valores de MA e indicadores com iMAOnArray() no porão. Se você quiser recalcular todas as barras ou apenas recalcular 100. Se não houver mudanças, isso significa que outros cálculos são lentos.

A última variante é essencialmente a mesma que a original. Como escrevi antes com o tamanho 0, ainda é contado como um todo. Minha primeira solução para reduzir o tempo de cálculo, mesmo antes da criação do tópico do fórum, foi limitar o número de barras mas, infelizmente, isso não afetou a produtividade; então comecei a experimentar o comprimento da matriz para o iMAOnArray e foi aí que compreendi a complexidade da situação. Foi então e só então, tendo experimentado quase todas as variantes fáceis, incluindo a mudança da indexação da matriz para diferentes combinações, que criei este tópico. Bem, depois disso obtive algumas respostas, algumas delas confirmando que outras também as haviam experimentado e todas elas tinham criado sua própria função. Foi por isso que pedi seu código, inicialmente sabendo que iria funcionar :) Sem ofensa :) Talvez alguns dos usuários superem este "ancinho" lendo este tópico. :)
 
Dmitry Fedoseev:
No passado, ele mesmo costumava começar a balbuciar que não era um programador, mas um amador, e por isso era livre para caçar.

Era mais uma questão retórica :)

PS Gentlemen, vamos ser tolerantes uns com os outros. Afinal, estamos todos aqui por uma razão - para "arrancar" o mercado. :) Portanto, vamos em direção a esse objetivo sem nenhuma distração. Cada um de nós tem suas próprias dificuldades e apresenta percepção, mas apenas em uma disputa que nasce da verdade, embora como dizem como Napoleão: "Argumentar, sabendo que você está errado - estúpido, argumentar, sabendo que você está certo, é mau". É por isso que eu nunca discuto".

 
Sergey Efimenko:
Esta última opção não é essencialmente diferente da original. Como já escrevi, quando o tamanho da matriz é 0, ela ainda é contada em sua totalidade. Minha primeira solução, mesmo antes da criação do tópico do fórum, foi limitar o número de barras, mas infelizmente isso não afetou a produtividade; então comecei a experimentar o comprimento da matriz para o iMAOnArray e foi aí que vi a complexidade da situação. Foi então e só então, tendo experimentado quase todas as variantes fáceis, incluindo a mudança da indexação da matriz para diferentes combinações, que criei este tópico. Bem, depois disso obtive algumas respostas, algumas delas confirmando que outras também as haviam experimentado e todas elas tinham criado sua própria função. Foi por isso que pedi seu código, inicialmente sabendo que iria funcionar :) Sem ofensa :) Talvez alguns dos usuários superem este "ancinho" lendo este tópico. :)

Você está dizendo que depois de if(rates_total-i >= rates_total-100); quando restam apenas 100 barras para calcular, a função iMAOnArray() recalcula primeiro a matriz INTEGRAL?

Razão: