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

 
Yuri Evseenkov:
Eu faço isso. Eu faço um único teste. Durante estes testes eu escrevo arrays em um arquivo. Então eu faço a otimização na mesma área, mas as matrizes não são recalculadas em cada barra ou carrapato, elas são lidas a partir do arquivo. A otimização através da abertura de preços em um período semanal é instantânea. Sem operações de arquivo, leva horas.
Minha situação é um pouco diferente. Só preciso preencher a matriz uma vez e utilizá-la para todos os passes. Isto é, para mim, mesmo com cada passe, encher a matriz uma vez no inite é muito.
 
-Aleks-:

Vejo, ou seja, você pode ler o arquivo pronto com dígitos em um array (meu caso), depois escrevê-lo em um arquivo binário, e depois usá-lo.

Bem, se você precisa ler dados de 10 matrizes do arquivo, então você precisa fazer um classificador, que entenderá o fim da matriz por dígitos especiais e preencherá a próxima matriz... Pois não é conveniente escrever o tamanho da matriz toda vez.

Primeiro, escrevemos uma variável int com o tamanho da matriz no arquivo, depois uma matriz, depois outra variável int com o tamanho, depois uma matriz, etc.

Na mesma ordem que lemos: ler variável com tamanho, ler matriz desse tamanho, próxima variável, matriz, etc.

 
forexman77:
Eu tenho uma situação um pouco diferente. Só preciso preencher a matriz uma vez e usá-la para todos os meus passes. Isto é, para mim, mesmo com cada passe, encher a matriz uma vez no inite é muito.
Portanto, preencha uma vez em um único teste. Os programas durante os testes e a otimização devem diferir nas operações de arquivo. Durante os testes, está escrevendo, enquanto durante a otimização, está lendo. Dois códigos devem ser escritos. O que você quer dizer com "initing to fill an array" é muito? Invocar um array de um arquivo não leva mais tempo do que, por exemplo, abrir um pedido ou uma operação de multiplicação com o dobro.
 
Yuri Evseenkov:
Portanto, preencha uma vez para um único teste. Os programas durante os testes e a otimização devem diferir nas operações de arquivo. Durante os testes, está escrevendo, enquanto durante a otimização, está lendo. Dois códigos devem ser escritos. O que você quer dizer com "initing to fill an array" é muito? Invocar um array de um arquivo não leva mais tempo do que, por exemplo, abrir um pedido ou uma operação de multiplicação com o dobro.

Muito do porquê: eu conheço todo o conjunto com antecedência. E assim surgiu a questão de como salvar esta matriz entre os passes. Meu entendimento é que é reiniciado no próximo passe, embora eu não esteja exatamente certo sobre isso.

Eu não concordo que a leitura seja mais rápida no meu caso. A velocidade é mais rápida, se eu receber os mesmos dados através de indicadores, e diminui significativamente, quando leio estes dados preparados a partir de um arquivo sem cálculo de indicadores. Em um pequeno espaço de tempo com o número de linhas de mil e em um grande segmento é muito caro ler o arquivo a cada vez.

A idéia era a seguinte: ler os dados e escrevê-los em um array e depois, em todos os passes, usar apenas este array, ou seja, o array é exatamente o mesmo desde o primeiro passe até o último.

 
forexman77:

Muito do porquê: eu conheço todo o conjunto antecipadamente. E assim surgiu a questão de como salvar esta matriz entre os passes. Meu entendimento é que é reiniciado no próximo passe, embora eu não esteja exatamente certo sobre isso.

Eu não concordo que a leitura seja mais rápida no meu caso. É mais rápido, quando obtenho os mesmos dados através de indicadores, e fica mais lento, quando leio estes dados do arquivo sem cálculo de indicadores.

A idéia era a seguinte: ler os dados e colocá-los em um array e depois usar este array para todos os passes, ou seja, o array é exatamente o mesmo desde o primeiro passe até o último.

Somente a prática responderá a esta pergunta. Leia a matriz em cada passe. Há muito tempo venho lutando com o mesmo problema. Eu estava me otimizando por horas. Até que Andrey Khatimlansky sugeriu que eu escrevesse no arquivo uma vez e depois lesse. Agora eu tenho que esperar pelo teste de uma vez por todas e então a otimização está fora do gancho. As operações de arquivo estão bem descritas no tutorial de Kovalev.
 
Dmitry Fedoseev:

Primeiro escrevemos uma variável int com o tamanho do array para o arquivo, depois um array, depois outra variável int com o tamanho, depois um array, etc.

Ler na mesma ordem: ler variável com tamanho, ler matriz desse tamanho, próxima variável, matriz, etc.

É aqui que me sinto inculto... Como escrever uma int variável com o tamanho de um array em um arquivo binário? Isto é, como seria possível identificar esta variável ao ler a partir do arquivo?
 
forexman77:

A idéia era ler os dados e colocá-los em um array e depois em todos os passes usar apenas este array, ou seja, o array é exatamente o mesmo desde o primeiro passe até o último.

O MT4 realmente funciona com arquivos muito lentamente, não sei como será no MT5, especialmente com um arquivo binário...

Eu resolvo este problema com uma função que escreve toda a matriz diretamente no código, mas não é uma solução universal, é claro.

 

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

datetime T[]=
   {
   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,
   1278456660,1278540000,1278626400,1278712800,1280447880,1280527200,1280789220,1280959200,1281045720,1283292000,
   1283378400,1283812200,1285626300,1285887060,1286229600,1286316000,1286404740,1288133220,1288216860,1288305120,
   1288392420,1288648860,1288735200,1288741980,1288822080,1288994400,1290722460,1290809040,1291069320,1291329540,
   1293228420,1293577020,1293666300,1293746400,1295992800,1296079320,1296253680,1296514200,1296686940,1296770400,
   1298503260,1298592000,1298672280,1298931060,1300831920,1300917600,1301609160,1301696460,1303512420,1303768920
   };

datetime newT[];
int fileHandle;

/******************Expert initialization function*******************/
int OnInit()
{
   if((fileHandle = FileOpen("test", FILE_READ|FILE_BIN|FILE_COMMON)) != INVALID_HANDLE)// здесь поставь точку останова нажав клавиш F9
    {
     FileReadArray(fileHandle, newT);
      for(int i = 0; i < ArraySize(newT); i++)
       Print(i, " ", TimeToString(newT[i], TIME_DATE|TIME_SECONDS));
      FileClose(fileHandle);
    }
  else
   if(/*IsOptimization()*/IS_DEBUG_MODE && (fileHandle = FileOpen("test", FILE_WRITE|FILE_BIN|FILE_COMMON)) != INVALID_HANDLE)
    {
     FileWriteArray(fileHandle, T);
     FileClose(fileHandle);
    }
   return(INIT_SUCCEEDED);
}/*******************************************************************/


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 o array para arquivar, e a segunda irá lê-lo e começar a imprimir datas a partir do array. Em seguida, descubra a parte destacada, se IS_DEBUG_MODE deve ser removida, e se IsOptimization() deve ser inserida na condição.

 
-Aleks-:
É aqui que me sinto inculto... Como escrever uma variável int do tamanho de uma matriz em um arquivo binário? Isto é, como seria possível identificar esta variável ao ler a partir do arquivo?

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 está chegando em breve.

 
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...

Haverá um artigo sobre como trabalhar com arquivos em breve.

Eu entendo, obrigado.

Mas eu gostaria de dar uma olhada no código, então eu vou esperar pelo artigo.