Teoria da aceleração da EA ao usar um indicador personalizado (função - iCustom) - página 3

 
-Aleks-:
Então, o hodgepodge dos indicadores necessários funcionará mais rápido do que usar os indicadores separadamente - as informações sobre citações serão solicitadas com menos freqüência?

Não é essencial. Certifique-se de que os cálculos não sejam duplicados. Se os cálculos preliminares de dois indicadores forem os mesmos, eles devem ser combinados em um só. Você não deve apenas colar todos os indicadores em um só.

Não há problemas em solicitar as citações. Eles não precisam ser solicitados, eles vêm sozinhos.

 

Tentei usar um tempo de atraso para recalcular o indicador:

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
 static datetime   prevtime;
  datetime per=15; //задержка секунд
   
   if((TimeCurrent()-prevtime)<per) 
   {
   return(rates_total); //прошло мало секунд - поэтому выходим
   }
 
//--- main cycle  
....................

prevtime=TimeCurrent();
return(rates_total);
 }

Ao testar em "OHLSnaM1" quase não há diferença, talvez o teste em "todos os carrapatos" seja mais rápido.

 

minha impressão de como funciona o iCustom (se nada foi alterado nos últimos 2 meses)
quando você chama o indicador do iCustom
todos os buffers para um possível histórico e os resultados armazenados no cache serão calculados, e o cache será vinculado aos parâmetros e ao nome do indicador

se da próxima vez você chamar o mesmo indicador e os mesmos parâmetros para a segunda matriz de índices - o resultado retornará do cache (+ correção para os novos dados do histórico)
se você chamar o mesmo indicador, mas alterar apenas um parâmetro - o cálculo completo de todos os buffers para o possível histórico e economia de outro cache, mas com uma ligação para os novos parâmetros será realizado.


Você pode especificar quanto histórico deve ser baixado do Expert Advisor, se você fizer tal parâmetro no indicador, mas nesta chamada você deve sempre passar o mesmo número - o tamanho do histórico.
(isso afetará a velocidade da primeira chamada do iCustom).

Você pode tentar remover o cálculo de buffers desnecessários, se possível, tanto no indicador como através dos parâmetros do indicador, como no exemplo com o tamanho do histórico
(diminuir o tamanho do cache - aumentar a velocidade do cálculo)

 

Obrigado a todos vocês pelas informações.

Quero esclarecer, se em um indicador com 5 buffers gráficos para usar não um buffer gráfico, mas um array comum - para emitir dados através de um buffer gráfico, como sugeri, a velocidade do indicador durante a otimização será mais rápida, porque menos memória será alocada para o indicador e, portanto, menos tempo será gasto para trabalhar com ele?

Se a otimização for realizada e as configurações do indicador não forem alteradas em cada passe, o indicador será recalculado?

 
-Aleks-:

Obrigado a todos vocês pelas informações.

Quero esclarecer, se em um indicador com 5 buffers gráficos para usar não um buffer gráfico, mas um array comum - para emitir dados através de um buffer gráfico, como sugeri, a velocidade do indicador durante a otimização será mais rápida, porque menos memória será alocada para o indicador e, portanto, menos tempo será gasto para trabalhar com ele?

Se a otimização for realizada e as configurações do indicador não forem alteradas em cada passe, o indicador será recalculado?

O buffer é uma matriz, conveniente apenas para a exibição de dados.

Durante a otimização, o indicador é recalculado a cada vez.

 
komposter:

Um buffer é uma matriz, útil apenas para a exibição de dados.

Eu entendo a matriz, mas a matriz para calcular um indicador pode ser muito menor - muitas vezes dinâmica.

Por exemplo, no histórico de 1000 barras - o indicador personalizado desenha 3 SMAs - 5/8/10.

No caso padrão, teremos um buffer gráfico para quase 3000-10-8-5

E se usarmos meu método

para calcular o SMA(5) precisamos de uma matriz de tamanho (desculpe pela terminologia) de 4 barras

para calcular o SMA(8) preciso de um conjunto de (desculpe a terminologia) 7 barras no tamanho

para calcular o SMA(10) precisamos de um conjunto de (desculpe pela terminologia) 9 barras

e uma matriz gráfica de 1000 barras, o resultado é que você precisa de 1000+4+7+9, pois as matrizes simplesmente as sobrescreverão.

Onde eu estou errado?

 
-Aleks-:

Obrigado a todos vocês pelas informações.

Quero esclarecer, se em um indicador com 5 buffers gráficos para usar não um buffer gráfico, mas um array comum - para emitir dados através de um buffer gráfico, como sugeri, a velocidade do indicador durante a otimização será mais rápida, porque menos memória será alocada para o indicador e, portanto, menos tempo será gasto para trabalhar com ele?

Se a otimização for realizada e as configurações do indicador não forem alteradas em cada passe, o indicador será recalculado?

É mais importante entender que quando você chamar o indicador novamente, ele não será recarregado para o segmento de memória (overlay). Tudo o resto não é nada comparado a ele.
 
-Aleks-:

Eu entendo a matriz, mas a matriz para calcular o indicador pode ser muito menor - muitas vezes dinâmica.

Por exemplo, no histórico de 1000 barras - o indicador personalizado desenha 3 SMAs - 5/8/10.

No caso padrão, teremos um buffer gráfico para quase 3000-10-8-5

E se usarmos meu método

para calcular o SMA(5) precisamos de uma matriz de tamanho (desculpe pela terminologia) de 4 barras

para calcular o SMA(8) preciso de um conjunto de (desculpe a terminologia) 7 barras no tamanho

para calcular o SMA(10) precisamos de um conjunto de (desculpe pela terminologia) 9 barras

e uma matriz gráfica de 1000 barras, o resultado é que você precisa de 1000+4+7+9, pois as matrizes simplesmente as sobrescreverão.

Onde eu estou errado?

Se você precisa de um valor em uma barra, você realmente não precisa de um buffer. O indicador também não é;)

E se você precisar de um valor indicador em cada barra, muitas vezes é mais econômico calcular tudo, e então, adicionalmente, calcular apenas a nova barra.
E nem todos os algoritmos são tão simples como o SMA, eles simplesmente não podem ser calculados "para 5 barras". Dê uma olhada no zig-zag, pelo menos.

O que mais me confunde é que você não tenta aplicar as respostas na prática. Parece que não há tarefa prática, apenas truques teóricos.
Então eu não entendo porque participo dela.

 

A propósito, o MT4 lida muito bem com o cálculo de apenas uma parte da história e não consome memória para todo o buffer, se o loop passar pelas últimas 1000 barras (mesmo que haja 50000 barras "na janela").

No entanto, encontrei este problema no MT5 - ele aloca memória para todas as 50000 barras, mesmo que apenas as últimas 100 sejam contadas.

 
komposter:

Se você precisa de um valor em uma barra, você realmente não precisa de um buffer. Nem o indicador ;)

Por que uma barra? Eu estava apenas dizendo que, para calcular o valor de um indicador, raramente é necessário conhecer todos os seus indicadores para toda a história do tempo. É por isso que escrevi que os buffers (matrizes) serão utilizados apenas para cálculo, enquanto o resultado do cálculo de 3 MAs será armazenado em umbuffer gráfico.

Em relação ao Zig-zag - isto é uma dor de cabeça para mim agora - requer uma série de respostas, mas vou abrir um fio à parte.

komposter:

O que mais me confunde é que você não tenta aplicar as respostas na prática. É como se não houvesse tarefa prática, apenas especulações teóricas.

Então eu não entendo porque participo dela.

O problema é que eu mesmo não sou um programador - minhas investigações me ajudarão a redigir a especificação dos requisitos. Agora estou desenvolvendo um indicador, que será um componente do motor da EA - ele tem muitos amortecedores, então estou pensando em como acelerar a EA não integrando o indicador no código, mas por outros métodos.

E eu também esperava que alguém estivesse interessado em tentar tal algoritmo na prática - para comparar a velocidade de operação ...


komposter:

A propósito, o MT4 é perfeitamente capaz de calcular apenas uma parte da história e não come memória para todo o buffer, se o loop passar pelas últimas 1000 barras (mesmo se houver 50000 na "janela").

No entanto, encontrei este problema no MT5 - ele aloca memória para todas as 50000 barras, mesmo que eu conte apenas as últimas 100.

É um fato triste para 5. Os desenvolvedores não explicam o significado sagrado disto?