Características da linguagem mql5, subtilezas e técnicas - página 132

 
Igor Makanu:

enrolar no cálculo de classe do indicador - ligar amortecedores aos campos de classe

Ai de mim...
Não funcionou. Mesmo que o buffer esteja dentro da classe e do cabo, todos os buffers internos de cálculo intermédio criados permanecem na RAM mesmo depois da instância da classe ser eliminada.

A memória é apagada apenas através da alteração da TF.

O comando da limpeza da memória por punho está obviamente em falta. Por exemplo MemErase( int handle);

 
Nikolai Semko:

Ai de mim...
Não funcionou. Mesmo que o buffer esteja dentro da classe e do cabo, todos os buffers internos de cálculo intermédio criados permanecem na RAM mesmo depois da instância da classe ser eliminada.

A memória é apagada apenas através da alteração da TF.

O que obviamente falta é um comando destinado a limpar a memória por punho. Por exemplo MemErase( int handle);

1. verificou as combinações de um ponteiro de objecto e uma instância de objecto (quero dizer *)?

2. Escreveu o destruidor e apagou o tamanho da matriz nele? (ArrayFree() e ArrayResize(arr,0,0) )

 
Nikolai Semko:

Ai de mim...
Não funcionou. Mesmo que o buffer esteja dentro da classe e do cabo, todos os buffers internos de cálculo intermédio criados permanecem na RAM mesmo depois da instância da classe ser eliminada.

A memória é apagada apenas através da alteração da TF.

O que obviamente falta é um comando destinado a limpar a memória por punho. Por exemplo MemErase( int handle);

E não utilizou o IndicatorRelease?

Mas ainda assim penso que se trata de um empreendimento vazio. Para que precisa dele? Para desenhar animações? E para o comércio? Para calcular a média da média móvel até atingir uma linha recta?

 
Nikolai Semko:

Ai de mim...
Não funcionou. Mesmo que o amortecedor esteja dentro da classe e do cabo, todos os amortecedores intermediários criados internamente ainda permanecem na RAM, mesmo depois da instância da classe ser apagada.

A memória é apagada apenas através da alteração da TF.

O comando para limpar a memória por manípulo está obviamente em falta. Por exemplo MemErase( int handle);

O terminal armazena as caches durante algum tempo, mesmo que o programa não as utilize.

Pode-se apanhar quanto tempo a memória é libertada.

 
Alexey Viktorov:

Já utilizou o IndicatorRelease?

Mas mesmo assim, penso que é uma perda de tempo. Diga-me, para que precisa dele? Para desenhar desenhos animados? E para o comércio? Para calcular a média da média móvel até atingir uma linha recta?

Sim, obrigado, Alexey. Eu tinha-me esquecido desta função. Já o tinha visto antes, mas nunca o utilizou.

Eu tentei. Alguma coisa está a correr mal. Apaga depois apaga, mas depois de o apagar, tudo pára.

Simplesmente adicionei uma linha de código à função DrawSetup() antes do cálculo do indicador com os seguintes parâmetros.

IndicatorRelease(handle);
handle=iMA(_Symbol,_Period,per1,0,MaMethod,PriceBase);
for(int i=0;i<N;i++) handle=iMA(_Symbol,_Period,per2,0,MaMethod,handle);

O indicador simplesmente pára de funcionar e ainda não consigo compreender a razão.

Alexey Viktorov:

Penso que se trata de uma ideia fútil. Para que é que preciso dele? Para desenhar desenhos animados? E para o comércio? Para calcular a média da média móvel até atingir uma linha recta?

Estou absolutamente de acordo consigo. É apenas um brinquedo inútil.

 
Andrey Khatimlianskii:

O terminal mantém as caches durante algum tempo, mesmo que o programa não as utilize.

Pode demorar quanto tempo leva para a memória se libertar.

Esperei 6 minutos e ainda nada foi esclarecido.

 
Igor Makanu:

1. verificou as combinações de ponteiro de objecto e instância de objecto (quero dizer *)?

2. Escreveu o destruidor e apagou o tamanho da matriz nele? (ArrayFree() e ArrayResize(arr,0,0) )

1. Sim, fi-lo através de um ponteiro, novo e apagado.

2. portanto, não existe uma matriz. Isto é, existem matrizes internas mas não têm nomes. Existe apenas o número do cabo.

E a cada iteração do for loop, o valor da variável handle aumenta em um. Ou seja, multiplicam-se os amortecedores interiores e todos os anteriores participam no cálculo do próximo.

De acordo com a lógica, devemos fazer IndicatorRelease(handle); antes de outro cálculo completamente novo do indicador, mas já escrevi acima que vai matar o indicador. Não é claro porquê.

 
Nikolai Semko:

Sim, obrigado, Alexey. Eu tinha-me esquecido dessa função. Já o tinha visto antes, mas nunca o utilizou.

Experimentei-o. Alguma coisa está a correr mal. Apaga-o, mas depois de o apagar, tudo pára.

Simplesmente adicionei uma linha de código à função DrawSetup() antes do cálculo do indicador com os seguintes parâmetros.

O indicador simplesmente pára de funcionar e ainda não consigo compreender a razão.

Estou absolutamente de acordo consigo. É apenas um brinquedo inútil.

Não era isso que eu estava a pensar. Penso que deveríamos fazer um par de manipuladores, como um enumerador de gráficos

currChart=ChartNext(prevChart); // на основании предыдущего получим новый график

E uma vez obtido um novo cabo, o cabo usado pode ser deitado fora como o usado ...

 
Alexey Viktorov:

Não era isso que eu estava a pensar. Acho que é preciso fazer um par de mãos-cheias, como uma pesquisa gráfica

E uma vez obtido um novo cabo, o usado pode ser descartado como o usado ...

que não vai funcionar.

 
Nikolai Semko:

Nem pensar

Porque não?