Calcolo di un singolo array durante l'ottimizzazione - pagina 5

 
Yuri Evseenkov:
Io faccio questo. Eseguo un singolo test. Durante questo test scrivo gli array in un file. Poi eseguo l'ottimizzazione nella stessa area ma gli array non vengono ricalcolati ad ogni barra o tick, vengono letti dal file. L'ottimizzazione dei prezzi di apertura su un periodo settimanale è istantanea. Senza operazioni di file ci vogliono ore.
La mia situazione è leggermente diversa. Ho solo bisogno di riempire l'array una volta e usarlo per tutti i passaggi. Cioè, per me, anche con ogni passaggio, riempire l'array una volta nell'inite è molto.
 
-Aleks-:

Capisco, cioè si può leggere il file pronto con le cifre in un array (il mio caso), poi scriverlo in un file binario, e poi usarlo.

Bene, se avete bisogno di leggere i dati di 10 array dal file, allora avete bisogno di fare uno smistatore, che capirà la fine dell'array con una cifra speciale e riempirà l'array successivo... Perché non è conveniente scrivere la dimensione dell'array ogni volta.

Prima scriviamo una variabile int con la dimensione dell'array nel file, poi un array, poi un'altra variabile int con la dimensione, poi un array, ecc.

Nello stesso ordine si legge: leggere variabile con dimensione, leggere array di questa dimensione, variabile successiva, array, ecc.

 
forexman77:
Ho una situazione leggermente diversa. Ho solo bisogno di riempire l'array una volta e usarlo per tutti i miei passaggi. Cioè, per me, anche con ogni passaggio, riempire l'array una volta nell'inite è molto.
Quindi riempilo una volta in un solo test. I programmi durante i test e l'ottimizzazione devono differire nelle operazioni sui file. Durante il test è in scrittura, mentre durante l'ottimizzazione è in lettura. Due codici devono essere scritti. Che cosa intendete per riempire un array è molto? Richiamare un array da un file non richiede più tempo che, per esempio, aprire un ordine o un'operazione di moltiplicazione con il doppio.
 
Yuri Evseenkov:
Quindi riempilo una volta per un solo test. I programmi durante i test e l'ottimizzazione devono differire nelle operazioni sui file. Durante il test è in scrittura, mentre durante l'ottimizzazione è in lettura. Devono essere scritti due codici. Che cosa intendete con initing per riempire un array è molto? Richiamare un array da un file non richiede più tempo che, per esempio, aprire un ordine o un'operazione di moltiplicazione con il doppio.

Un sacco di perché: conosco in anticipo tutta la matrice. E così è sorta la domanda su come salvare questo array tra un passaggio e l'altro. La mia comprensione è che viene resettato al prossimo passaggio, anche se non sono esattamente sicuro di questo.

Non sono d'accordo che la lettura sia più veloce nel mio caso. La velocità è più veloce, se ricevo gli stessi dati attraverso gli indicatori, e rallenta significativamente, quando leggo questi dati preparati da un file senza calcolo di indicatori. Su un piccolo lasso di tempo con un numero di linee di mille e in un grande segmento è molto costoso leggere il file ogni volta.

L'idea era la seguente: leggere i dati e scriverli in un array e poi, in tutti i passaggi, usare solo questo array, cioè l'array è esattamente lo stesso dal primo all'ultimo passaggio.

 
forexman77:

Un sacco di perché: conosco in anticipo l'intera matrice. E così è sorta la domanda su come salvare questo array tra un passaggio e l'altro. La mia comprensione è che viene resettato al prossimo passaggio, anche se non sono esattamente sicuro di questo.

Non sono d'accordo che la lettura sia più veloce nel mio caso. È più veloce, quando ottengo gli stessi dati attraverso gli indicatori, e diventa più lento, quando leggo questi dati dal file senza il calcolo degli indicatori.

L'idea era la seguente: leggere i dati e metterli in un array e poi usare questo array per tutti i passaggi, cioè l'array è esattamente lo stesso dal primo all'ultimo passaggio.

Solo la pratica risponderà a questa domanda. Leggere l'array ad ogni passaggio. Ho lottato a lungo con lo stesso problema. Ho ottimizzato per ore. Finché Andrey Khatimlansky mi ha suggerito di scrivere nel file una volta e poi leggere. Ora devo aspettare il test di una volta e poi l'ottimizzazione è fuori dai giochi. Le operazioni sui file sono ben descritte nel tutorial di Kovalev.
 
Dmitry Fedoseev:

Prima scriviamo una variabile int con la dimensione dell'array nel file, poi un array, poi un'altra variabile int con la dimensione, poi un array, ecc.

Leggere nello stesso ordine: leggere variabile con dimensione, leggere array di quella dimensione, variabile successiva, array, ecc.

È qui che mi sento diseducato... Come scrivere una variabile int con la dimensione di un array in un file binario? Cioè come sarebbe possibile identificare questa variabile quando si legge dal file?
 
forexman77:

L'idea era di leggere i dati e metterli in un array e poi in tutti i passaggi usare solo questo array, cioè l'array è esattamente lo stesso dal primo all'ultimo passaggio.

MT4 è davvero molto lento nel lavorare con i file, non so come sarà in MT5, specialmente con un file binario...

Risolvo questo problema con una funzione che scrive l'intero array direttamente nel codice, ma non è una soluzione universale, ovviamente.

 

Ecco un esempio di scrittura e lettura di un array

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);
}/*******************************************************************/


Eseguilo due volte in modalità debug e vedi quanto tempo ci vuole per scrivere e leggere l'array. La prima esecuzione scriverà l'array su file, e la seconda lo leggerà e inizierà a stampare le date dall'array. Poi capire la parte evidenziata, se IS_DEBUG_MODE deve essere rimosso, e se IsOptimization() deve essere inserito nella condizione.

 
-Aleks-:
È qui che mi sento diseducato... Come scrivere una variabile int di una dimensione di array in un file binario? Cioè come sarebbe possibile identificare questa variabile quando si legge dal file?

C'è una funzione, qualcosa come FileWriteInteger(). Identificare per posizione, la variabile deve essere all'inizio del file, dopo averla letta il puntatore si sposterà alla sua fine, cioè all'inizio dell'array, dopo aver letto l'array il puntatore sarà prima della variabile successiva...

Un articolo sul lavoro con i file è in arrivo.

 
Dmitry Fedoseev:

C'è una funzione, qualcosa come FileWriteInteger(). Identificare per posizione, la variabile deve essere all'inizio del file, dopo averla letta il puntatore si sposterà alla sua fine, cioè all'inizio dell'array, dopo aver letto l'array il puntatore sarà prima della variabile successiva...

Ci sarà presto un articolo sul lavoro con i file.

Capisco, grazie.

Ma vorrei dare un'occhiata al codice, quindi aspetterò l'articolo.

Motivazione: