Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 1201

 
Сергей Таболин:

Scrivo tutto in un file. Scrivere, e poi leggere, diverse strutture nello stesso file va bene.

Ma legge l'array dall'inizio alla fine. Come si fa a dividerlo in 3 parti? Come avete scritto una struttura e siete riusciti a scrivere un array nello stesso file? Sono un autodidatta, non so molto, ma il fatto che siano formati di dati diversi, in qualche modo lo sospetto.

Ammetto che si può riuscire ad aprire il file per la scrittura una volta e stiparci tre array, ma non si può leggerlo in parti così.

 
Alexey Viktorov:

Ma legge l'array dall'inizio alla fine. Come si fa a dividerlo in 3 parti? Come si fa a scrivere una struttura e a scrivere un array nello stesso file? Sono un autodidatta, non so molto, ma il fatto che siano formati di dati diversi è in qualche modo sospetto.

Ammetto che posso cavarmela aprendo un file per la scrittura una volta e stiparci tre array, ma non posso leggerlo così facilmente in parti.

Dico, se scrivi nello stesso file solo 1 struttura e 3 array, allora puoi leggerli da lì (supponendo che per leggere gli array devi specificare la dimensione di ciascuno). Ma il trucco di scrivere e poi leggere diverse sequenze di questo tipo non ha funzionato per me. Forse devo spostare il puntatore, ma è già teso...

 
Сергей Таболин:

Te l'ho detto, se scrivi solo 1 struttura e 3 array in un file, allora puoi leggerli da lì in seguito (a condizione che tu debba specificare la dimensione di ciascuno di essi per leggere gli array). Ma il trucco di scrivere e poi leggere diverse sequenze di questo tipo non ha funzionato per me. Forse devo spostare il puntatore, ma è un po' ingombrante...

Com'è la tensione? Non ci sono abbastanza cavalli? E come si può essere sicuri che la scrittura ha avuto successo e come si può supporre che sia successo se la lettura è fallita? Per quanto ne so, non si può guardare un file .bin con gli occhi.

 
Сергей Таболин:

Artyom, puoi farmi un esempio? Tenendo conto che la dimensione degli array è dinamica.

No, non ci saranno ancora esempi - non l'ho fatto io stesso, e quando lo farò, lo descriverò nei miei articoli. E non sarà presto. Il fatto è che potete scrivere solo strutture POD in un file usando FileWriteStruct(). Cioè strutture semplici che non contengono stringhe, array dinamici,funzioni virtuali, così come puntatori a oggetti e funzioni.

E questo significa che bisogna inventarli e testarli. Ma ho scritto la direzione. Bisogna pensare all'implementazione.

 
Artyom Trishkin:

No, non ci saranno ancora esempi - non l'ho ancora fatto io, e quando lo farò, lo descriverò negli articoli. E non sarà presto. Il fatto è che solo le strutture POD possono essere scritte su file usando FileWriteStruct(). Cioè, strutture semplici che non contengono stringhe, array dinamici, funzioni virtuali, così come puntatori a oggetti e funzioni.

E questo significa che dobbiamo inventarlo e testarlo. Ma ho scritto la direzione. L'implementazione dovrebbe essere pensata.

Si scopre che non importa come lo si guardi, il compito non può essere risolto. Dopo tutto, l'esempio di Sergei ha tre array dinamici all'interno. Non importa come la struttura sia disposta nella struttura, rimarrà un array dinamico.

Ma se si crea un array di strutture, il problema si risolve scrivendo l'array. FileWriteArray(). Questo è già stato testato e la documentazione dice chiaramente di scrivere un array di strutture.

 
Alexey Viktorov:

Ma legge l'array dall'inizio alla fine. Come si fa a dividerlo in 3 parti? Come si fa a scrivere una struttura e a scrivere un array nello stesso file? Sono un autodidatta, non conosco molte cose, ma il fatto che siano formati di dati diversi, in qualche modo lo sospetto.

Lo ammetto, potete cavarvela, aprendo un file per la scrittura una volta e stiparci tre array, ma non sarete in grado di leggerlo in parti come questa.

In un file binario, potete scrivere qualsiasi struttura, array, anche singole variabili, tutto in un file.

MA, quando leggete, dovete leggere i dati nello stesso ordine.

tutto funzionerà.

non hanno visto il dump del file, quando si scrive con FileWriteArray() , molto probabilmente, la dimensione dell'array sarà scritta nei primi byte - ma è più facile fare uno script di prova, ci sono una dozzina di righe di codice ;)

 
Alexey Viktorov:

Si scopre che non importa come lo si guardi, il problema è irrisolvibile. Dopo tutto, nell'esempio di Sergei ci sono tre array dinamici all'interno. Non importa come si costruisce la struttura nella struttura, rimarrà una matrice dinamica.

E se si crea un array di strutture, si risolve il problema scrivendo l'array. FileWriteArray(). Questo è già stato testato ed è chiaramente indicato nella documentazione sulla scrittura di un array di strutture.

Viene memorizzato un array di strutture, ma... se ci fossero delle stringhe, queste possono essere impacchettate in un array uchar all'interno della struttura, cosa che viene fatta con successo. Ma non c'è modo che un array double possa entrare in un array uchar. Inoltre, è dinamico. E salvare i tre array separatamente in file e poi spingerli nella struttura scompattata dal file... Non l'ho provato. Non ci ho pensato e non lo so.

 
Igor Makanu:

è possibile scrivere qualsiasi struttura, array, anche variabili individuali in un file binario - tutto nello stesso file

MA quando si legge, bisogna leggere i dati nello stesso ordine.

tutto funzionerà

non hanno visto il dump del file quando si scrive con FileWriteArray(), molto probabilmente, la dimensione dell'array sarà scritta nei primi byte - ma è più facile fare uno script di prova, ci sono una dozzina di righe di codice ;)

Non so dove avete iniziato a leggere di questo problema, lasciate che ve lo ricordi per sicurezza: dovete scrivere una struttura contenente tre array dinamici in un file. Poi ho avuto una domanda sul fatto che il file non è stato letto correttamente.

Forum sul trading, sistemi di trading automatico e test di strategia

FAQ da principianti MQL5 MT5 MetaTrader 5

Sergey Tabolin, 2020.03.24 18:02

Sto chiedendo a ))))

Ho cercato di farlo "a modo mio".

La prima struttura e i 3 array leggono bene (a condizione che i ricevitori degli array non siano dinamici, altrimenti tutti i dati scritti dopo la struttura vengono letti nel primo array).

Tuttavia, se ci sono più voci, allora

   // Проверка
   double   rdata_1[6];
   double   rdata_2[6];
   double   rdata_3[6];
   
   filehandle = FileOpen(filename,FILE_READ|FILE_COMMON|FILE_BIN);
   if(filehandle != INVALID_HANDLE)
   {
      while(!FileIsEnding(filehandle))
      {
         FileReadStruct(filehandle,rfann);
         FileReadArray(filehandle,rdata_1);
         FileReadArray(filehandle,rdata_2);
         FileReadArray(filehandle,rdata_3);
         Print("++++++++++++++++++++++++++++++");
         Print("Структура");
         Print(rfann.v_main_up+"|"+rfann.v_main_dn+"|"+rfann.v_add_up+"|"+rfann.v_add_dn+"|"+rfann.answer);
         Print("Массивы");
         Print("--- 1");
         ArrayPrint(rdata_1);
         Print("--- 2");
         ArrayPrint(rdata_2);
         Print("--- 3");
         ArrayPrint(rdata_3);
      }
   }

dà un bel po' di problemi...

Структура
4.0|-1.0|2.8|-0.7|1
Массивы
--- 1
 1.00000  0.33225 -0.76202 -0.93263 -1.00000 -0.79174
--- 2
-0.14603  0.89562  0.91407  0.93450  0.89481  0.89829
--- 3
 0.89564  0.89217 -0.91174 -0.86623 -1.00000 -0.07680
++++++++++++++++++++++++++++++
Структура
1.839259944929932 e+277|-nan|5.295254096666168 e-315|3.0|-618173028
Массивы
--- 1
 2.10000 -2.00000 -1.40000 -0.85098 -1.00000 -0.79900
--- 2
-0.30490  0.47926  1.00000  0.70827  0.84163  0.84134
--- 3
 0.83925  0.84173  0.84760  0.84678  0.80368 -0.00063
++++++++++++++++++++++++++++++
Структура
9.384173261527221 e-276|5.298850499315376 e-315|2.955277867691187 e+299|-9.638234784517503 e-243|-1705145188
Массивы
--- 1
+0.00000 +0.00000  4.00000  2.80000  0.00000  0.00000
--- 2
 1.00000  0.22097 -0.37383 -0.73115 -0.81752 -1.00000
--- 3
-0.87753  0.46919  0.59706  0.76223  0.82610  0.84312
++++++++++++++++++++++++++++++

Quindi sto pensando: come è possibile leggere la struttura e tre array da un file, che non si sa come è stato scritto.

Per questo ho detto che sono autodidatta e non so molto, ma non si può leggere in parti.

E capisco che ci sono opzioni per aggiungere al file .bin tutto, ma per leggerlo bisogna sapere cosa è scritto in quale ordine. Ed è possibile che non per mezzo di mql.

 

Non capisco affatto questo...

      FileSeek(filehandle,0,FILE_END);
'FILE_END' - cannot convert enum                        282     31
'FILE_END' - improper enumerator cannot be used         282     31

Cosa c'è che non va?

 
Alexey Viktorov:

Quindi sto pensando: come è possibile leggere una struttura e tre array da un file, che non si sa come è stato scritto.

è quello che sto scrivendo, è più facile da controllare, entro 10 minuti.... controllato, FileWriteArray() non scrive la dimensione dell'array nell'intestazione o nel primo byte, significa che dovreste scrivere voi stessi questi valori

#property copyright "IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"

struct SMystruct
{
   double            d_arr[];
   int               i_arr[];
   uchar             c_arr[];
   int               a;
   double            b;
};

//+------------------------------------------------------------------+
void OnStart()
{
   SMystruct mstruct;
   ArrayResize(mstruct.d_arr,5);    ArrayInitialize(mstruct.d_arr,3.1415926);
   ArrayResize(mstruct.i_arr,3);    ArrayInitialize(mstruct.i_arr,1234567890);
   ArrayResize(mstruct.c_arr,7);    ArrayInitialize(mstruct.c_arr,127);
   mstruct.a = 666;
   mstruct.b = 123.123;
//---  
   if(!SaveMStructToFile("mfile.bin",mstruct)) return;
   SMystruct read_struct;
   if(!LoadMStructInFile("mfile.bin",read_struct)) return;
   Print("1. d_arr");
   ArrayPrint(read_struct.d_arr);
   Print("2. i_arr");
   ArrayPrint(read_struct.i_arr);
   Print("2. c_arr");
   ArrayPrint(read_struct.c_arr);
   printf("mstruct.a = %i , mstruct.b = %f",read_struct.a , read_struct.b);
   
}
//+------------------------------------------------------------------+
bool SaveMStructToFile(const string fname,const SMystruct &data)
{
   int h = FileOpen(fname,FILE_WRITE | FILE_BIN | FILE_COMMON);
   if(h<0) { Print("Write IO Err #",GetLastError()); return(false); }
   FileWriteInteger(h,ArraySize(data.d_arr));   FileWriteArray(h,data.d_arr);
   FileWriteInteger(h,ArraySize(data.i_arr));   FileWriteArray(h,data.i_arr);
   FileWriteInteger(h,ArraySize(data.c_arr));   FileWriteArray(h,data.c_arr);
   FileWriteInteger(h,data.a);
   FileWriteDouble(h,data.b);
   FileClose(h);  
   return(true);
}

bool LoadMStructInFile(const string fname,SMystruct &data)
{
   int h = FileOpen(fname,FILE_READ | FILE_BIN | FILE_COMMON);
   if(h<0) { Print("Write IO Err #",GetLastError()); return(false); } 
   int amount = ArrayResize(data.d_arr,(int)FileReadInteger(h));     FileReadArray(h,data.d_arr,0,amount);
       amount = ArrayResize(data.i_arr,(int)FileReadInteger(h));     FileReadArray(h,data.i_arr,0,amount);
       amount = ArrayResize(data.c_arr,(int)FileReadInteger(h));     FileReadArray(h,data.c_arr,0,amount);
   data.a = FileReadInteger(h);
   data.b = FileReadDouble(h);
   FileClose(h); 
   return(true);
}

2020.03.25 10:18:36.058 tst (EURUSD,H1) 1. d_arr

2020.03.25 10:18:36.058 tst (EURUSD,H1) 3,14159 3,14159 3,14159 3,14159

2020.03.25 10:18:36.058 tst (EURUSD,H1) 2. i_arr

2020.03.25 10:18:36.058 tst (EURUSD,H1) 1234567890 1234567890

2020.03.25 10:18:36.058 tst (EURUSD,H1) 2. c_arr

2020.03.25 10:18:36.058 tst (EURUSD,H1) 127 127 127 127 127

2020.03.25 10:18:36.058 tst (EURUSD,H1) mstruct.a = 666 , mstruct.b = 123.123000

cioè se le dimensioni degli array sono dinamiche, significa che scriviamo le dimensioni dell'array stesso quando scriviamo, e quando leggiamo, leggiamo il valore della dimensione dell'array dal file e impostiamo le dimensioni degli array della struttura

nel mio esempio 2 strutture - una è stata inizializzata e scritta, la seconda è stata letta, inizializzazione dai dati del file
Motivazione: