Cálculo de matriz única durante a otimização - página 6

 
Alexey Viktorov:

Aqui está um exemplo de como escrever e ler uma série

Execute-o duas vezes no modo de depuração e veja quanto tempo leva para escrever e ler a matriz. A primeira execução irá escrever a matriz para arquivar, e a segunda irá lê-la e começar a imprimir datas a partir da matriz. Em seguida, descubra a parte destacada, se IS_DEBUG_MODE deve ser removida, e se IsOptimization() deve ser inserida na condição.

Obrigado!
 
Dmitry Fedoseev:

Existe uma função, algo como FileWriteInteger(). Identificar por localização, a variável deve estar no início do arquivo, após lê-la o ponteiro se moverá para seu fim, ou seja, para o início do array, após ler o array o ponteiro estará antes da próxima variável...

Um artigo sobre como trabalhar com arquivos será publicado em breve.

Queria escrever-lhe que não há nenhum artigo sobre operações de arquivo. Você os torna informativos e lúcidos. Eu certamente os lerei quando eles aparecerem.

 

Tentou declarar uma matriz a nível global (código mql4)

datetime T[];

preenchê-lo no inite

ArrayResize(T,40);
datetime T[40]=
   {
   1262731020,1262735700,1262821920,1262903400,1262989740,1263247200,1263339060,1263420000,1263507480,1263595500,
   1265324700,1265407200,1265752980,1265926500,1265930820,1267657200,1267740300,1267826460,1268175840,1268346360,
   1270504920,1270684140,1270768500,1272924180,1273011720,1273097100,1273272240,1273528800,1273617180,1275344100,
   1275516000,1275602400,1275689160,1276034400,1276124580,1276208700,1276211640,1278027960,1278369780,1278373920
   };

Quando não está definida no início, imprime a data de 1971, ou seja, a matriz está vazia

for (int x=0;x<=39;x++)
   {
   Print("T[x]=",T[x],"x=",x);   
   }

Se eu preencher a matriz no início, os valores aparecem. Pode ser a razão pela qual a matriz é reinicializada em datetaime, mas sem ela o código não será compilado?

A matriz desaparece. O que eu faço de errado?

 
forexman77:

Tentou declarar uma matriz a nível global (código mql4)

preenchê-lo no inite

Quando não está definida no início, imprime a data de 1971, ou seja, a matriz está vazia

Se eu preencher a matriz no início, os valores aparecem. Pode ser a razão pela qual a matriz é reinicializada em datetaime, mas sem ela o código não será compilado?

A matriz desaparece. O que eu faço de errado?

Veja o que o compilador diz.

ArrayResize(T,40);
datetime T[40]=

Com uma mudança tão fácil, você definiu uma matriz T local que desaparecerá na saída do OnInit...

 
Maxim Kuznetsov:

verificar o aviso que o compilador gera.

Com uma mudança tão fácil, você definiu uma matriz T local que será perdida quando você sair do OnInit...

Diz que já existe uma declaração global)

declaração de "T" esconde a declaração global na linha 40

Mas, como fazê-lo corretamente. Eu nunca havia declarado uma matriz usando parênteses curvos antes. Inicializei-o com zero e fixei seu tamanho e depois o preenchi com o laço. Existe alguma outra maneira de fazer isso?

Se eu limpar a data/hora no inite, o código não compila, mas escreve dois erros:

{' - expressão esperada

Uso de operação ilegal



 
forexman77:

Diz que já existe uma declaração global)

declaração de "T" esconde a declaração global na linha 40

Mas, como fazê-lo corretamente. Eu nunca havia declarado uma matriz usando parênteses curvos antes. Inicializei-o com zero e fixei seu tamanho e depois o preenchi com o laço. Existe alguma outra maneira de fazer isso?

Se eu limpar a data/hora no inite, o código não compila, mas escreve dois erros:

{' - expressão esperada

Uso de operação ilegal



A declaração da matriz junto com a constante inicialização poderia (e deveria) ser feita em nível global.

datetime T[40]=
   {
   1262731020,1262735700,1262821920,1262903400,1262989740,1263247200,1263339060,1263420000,1263507480,1263595500,
   1265324700,1265407200,1265752980,1265926500,1265930820,1267657200,1267740300,1267826460,1268175840,1268346360,
   1270504920,1270684140,1270768500,1272924180,1273011720,1273097100,1273272240,1273528800,1273617180,1275344100,
   1275516000,1275602400,1275689160,1276034400,1276124580,1276208700,1276211640,1278027960,1278369780,1278373920
   };
void OnInit() 
{
 ....
}
 
forexman77:

Diz que já existe uma declaração global)

declaração de "T" esconde a declaração global na linha 40

Mas, como fazê-lo corretamente. Eu nunca havia declarado uma matriz usando parênteses curvos antes. Inicializei-o com zero e fixei seu tamanho e depois o preenchi com o laço. Existe alguma outra maneira de fazer isso?

Se eu limpar a data/hora no inite, o código não compila, mas escreve dois erros:

{' - expressão esperada

Uso de operação ilegal



Com '=' você pode inicializar as matrizes somente quando as declara. Parece ser um remanescente de C, mas é assim que se faz aqui :-)
 
Maxim Kuznetsov:

A declaração da matriz junto com a constante inicialização poderia (e deveria) ter sido feita em nível global.

Sim, eu experimentei e funciona. E você não pode fazê-lo sem nível global, eu só o fiz para reduzir o custo computacional, para preencher o array uma vez no init e depois usar os valores do array?

Embora logicamente, as variáveis no nível global sejam sempre constantes, então o cálculo é realizado uma vez no início do programa?

 
forexman77:

Sim, eu experimentei e funciona. E você não pode fazê-lo sem nível global, eu só o fiz para reduzir o custo computacional, para preencher o array uma vez no init e depois usar os valores do array?

Embora logicamente as variáveis no nível global sejam sempre constantes, então o cálculo é realizado uma vez no início do programa?

Sim, ao preparar um binário ex4 ex5 para execução pelo terminal. Você pode pensar que são apenas links para a matriz de dados descrita (e salva dentro de ex4/5 em tempo de compilação), e isso é muito rápido...
 
forexman77:

Diz que já existe uma declaração global)

declaração de "T" esconde a declaração global na linha 40

Mas, como fazê-lo corretamente. Eu nunca havia declarado uma matriz usando parênteses curvos antes. Inicializei-o com zero e fixei seu tamanho e depois o preenchi com o laço. Existe alguma outra maneira de fazer isso?

Se eu limpar a data/hora no inite, o código não compila, mas escreve dois erros:

{' - expressão esperada

Uso de operação ilegal



Não importa realmente como a matriz é preenchida. Você simplesmente tem que estabelecer uma condição pela qual se o tamanho da matriz for zero, ela deve ser avaliada, preenchida e escrita em um arquivo. E no OnInit(), tente ler na matriz declarada usando meu exemplo. Assim, se houver um array de arquivos, ele é lido e o array é preenchido, o array não será recalculado e preenchido novamente.