MT4 iMAOnArray e iBandsOnArray efeito do número de elementos nos cálculos

 

Esta é a questão. Se eu não precisar calcular o conjunto completo, mas apenas os últimos N elementos.

Não entendo bem a lógica de calcular estas funções quando se trata de limitar. Eu tenho uma matriz de séries temporais (um dos buffers indicadores), se eu deixar o número de elementos igual a 0, sem perguntas, tudo é contado e calculado, mas se eu diminuir o número de elementos envolvidos no cálculo pelos mesmos offsets, eu recebo apenas os elementos primários. Simplesmente falando, há um conjunto de 5000 elementos (barras no gráfico), para economizar tempo preciso calcular apenas os últimos 300, mas quando especifiquei o valor 300 no segundo parâmetro, consegui 5000-4700 elementos primários, mas no offset 300-0, e outros valores em uma chamada não mudam. Qual é a vantagem de usar este parâmetro?

 
Sergey Efimenko:

Esta é a questão. Se eu não precisar calcular o conjunto completo, mas apenas os últimos N elementos.

Não entendo bem a lógica de calcular estas funções quando se trata de limitar. Eu tenho uma matriz de séries temporais (um dos buffers indicadores), se eu deixar o número de elementos igual a 0, sem perguntas, tudo é contado e calculado, mas se eu diminuir o número de elementos envolvidos no cálculo pelos mesmos offsets, eu recebo apenas os elementos primários. Simplesmente falando, há uma matriz de 5000 elementos (barras no gráfico), para economizar tempo preciso calcular apenas os últimos 300, mas quando especifiquei o valor 300 no segundo parâmetro, obtive 5000-4700 elementos primários, mas no offset 300-0, e outros valores em uma chamada não mudam. Qual é a vantagem de usar este parâmetro?

Dê-me um exemplo de código para entender completamente a questão.
 
Alexander Voronkov:
Dê-me um exemplo de código para entender completamente a questão.

isto funciona bem:

Buffer[i]=GetValue(i);
BufferMA=iMAOnArray(Buffer,0,PeriodMA,0,MethodMA,i);
BufferBMA[i]=iBandsOnArray(Buffer,0,PeriodBands,DevBands,0,MODE_MAIN,i)

isto não funciona bem:

Buffer[i]=GetValue(i);
BufferMA=iMAOnArray(Buffer,300,PeriodMA,0,MethodMA,i);
BufferBMA[i]=iBandsOnArray(Buffer,300,PeriodBands,DevBands,0,MODE_MAIN,i);

 
Sergey Efimenko:

isto funciona bem:

Buffer[i]=GetValue(i);
BufferMA=iMAOnArray(Buffer,0,PeriodMA,0,MethodMA,i);
BufferBMA[i]=iBandsOnArray(Buffer,0,PeriodBands,DevBands,0,MODE_MAIN,i);

isto não funciona normalmente:

Buffer[i]=GetValue(i);
BufferMA=iMAOnArray(Buffer,300,PeriodMA,0,MethodMA,i);
BufferBMA[i]=iBandsOnArray(Buffer,300,PeriodBands,DevBands,0,MODE_MAIN,i);

Para poupartempo e contar somente os últimos 300(barras no gráfico) usar para() ou se() operadores.
 
Alexander Voronkov:
Para economizartempo e contar somente os últimos 300(barras no gráfico) use os valores de for() ou if() dos operadores.

Como posso dizer isto delicadamente... Você tem alguma idéia do que está falando? Você já usou as funções mencionadas no título em seu código e tentou calcular parte de uma matriz em vez de toda a matriz? Bem, experimente e talvez você entenda "visualmente" do que estamos falando. Sua oferta é relevante ao calcular barras ou outras situações onde você pode especificar explicitamente o quanto contar, mas não para uma matriz que utilize estas funções. A parte do código acima é absolutamente idêntica, a única diferença é que no primeiro caso eu estou contando todo o array, enquanto no segundo eu estou contando apenas 300 de seus valores, mas os valores são contados no final do array, enquanto as referências são usadas para o início. Talvez eu não esteja descrevendo a situação claramente, mas o código ajudará a ver isso se você o anexar a algum indicador e comparar o resultado...

PS Sobre a versão "autoescrita" dos analógicos de função alternativa é claro, mas eu gostaria de obter o resultado necessário por meio de uma linguagem.

 
Sergey Efimenko:

Como posso dizer isto delicadamente... Você tem alguma idéia do que está falando? Você já usou as funções mencionadas no título em seu código e tentou calcular parte de uma matriz em vez de toda a matriz? Bem, experimente e talvez você entenda "visualmente" do que estamos falando. Sua oferta é relevante ao calcular barras ou outras situações onde você pode especificar explicitamente o quanto contar, mas não para uma matriz que utilize estas funções. A parte do código acima é absolutamente idêntica, a única diferença é que no primeiro caso eu estou contando todo o array, enquanto no segundo eu estou contando apenas 300 de seus valores, mas os valores são contados no final do array, enquanto as referências são usadas para o início. Talvez eu não esteja descrevendo a situação claramente, mas o código ajudará a ver isso se você o anexar a algum indicador e comparar o resultado...

PS Sobre a versão "autoescrita" dos analógicos de função alternativa é claro, mas eu gostaria de obter o resultado desejado por meio de uma linguagem.

Basta dizer como está, está tudo bem.

Por isso, eu o entendi mal.

 
Ninguém usa estas funções e enfrenta esta situação?
 
Sergey Efimenko:

isto funciona bem:

Buffer[i]=GetValue(i);
BufferMA=iMAOnArray(Buffer,0,PeriodMA,0,MethodMA,i);
BufferBMA[i]=iBandsOnArray(Buffer,0,PeriodBands,DevBands,0,MODE_MAIN,i);

isto não funciona bem:

Buffer[i]=GetValue(i);
BufferMA=iMAOnArray(Buffer,300,PeriodMA,0,MethodMA,i);
BufferBMA[i]=iBandsOnArray(Buffer,300,PeriodBands,DevBands,0,MODE_MAIN,i);

Qual você espera que seja o resultado e como ele deve funcionar normalmente?
 
Alexey Viktorov:
Qual você espera que seja o resultado e como ele deve funcionar normalmente?
O que você quer dizer, o que eu espero? Escrevi acima, que preciso dos últimos 300 valores reais (atuais), e não dos 300 primeiros (iniciais), além disso, que tenho acesso a um array no offset 299-0, mas obtenho dados no offset de "fim de array" a "fim de array - 300" valores (no meu caso, de 4999 a 4700), o que significa, no offset 299 é valor que deveria estar no offset 4999 e, da mesma forma, no offset 0 é valor, que deveria estar no offset 4700. Ao reduzir o número de cálculos de array, é importante obter dados atuais em vez dos dados históricos iniciais, a questão é qual é o propósito de calcular os valores mais antigos quando os valores atuais não são calculados?
 
Sergey Efimenko:
O que você quer dizer com o que eu espero? Escrevi que preciso de 300 últimos valores reais (atuais), não 300 primeiros (iniciais), além disso, que eu acessei um array em offset 300-0, mas obtive dados em offset de "fim de array" para "fim de array - 300" valores (no meu caso de 4999 a 4700), ou seja, em offset 300 há um valor que deveria estar em offset 4999, e similarmente em offset 0 há um valor, que deveria estar em offset 4700. Ao reduzir o número de cálculos de array, é importante obter dados atuais em vez dos dados históricos iniciais, a questão é qual é o propósito de calcular os valores mais antigos quando os valores atuais não são calculados?

OArraySetAsSeries() ajuda?

Uma vez enfrentei tal coisa - não consegui vencer, por isso desisti. Eu o fiz sem iMAOnArray().

 
Artyom Trishkin:

O ArraySetAsSeries() ajuda?

Uma vez enfrentei tal coisa - não consegui vencer, por isso desisti. Eu o fiz sem iMAOnArray().

Esse é o problema - a matriz é inicialmente um buffer "em série". O problema está em limitar o número de cálculos, como já escrevi, os dados são normais quando se usa o cálculo de toda a matriz, mas retarda o terminal durante a inicialização e ainda mais quando se usam vários indicadores para diferentes períodos de tempo, quanto mais otimizar uma EA para tal indicador; o problema é de natureza interna MT4, ou seja, a única solução é usar seu próprio análogo das funções especificadas, mas eu quero evitá-las

PS Eu também uso meu próprio análogo do iMAOnArray, mas não serei apenas eu quem terá o código fonte. Embora seja possível usar bibliotecas, o iBands também é necessário, mas o cálculo dos desvios terá que ser feito. Em geral, é uma pena que esta seja a situação com funções padrão.

Razão: