Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 1201

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

Ich schreibe alles in eine Datei. Das Schreiben und anschließende Lesen mehrerer Strukturen in dieselbe Datei funktioniert gut.

Aber es liest das Array von Anfang bis Ende. Wie kann man es in 3 Teile aufteilen? Wie haben Sie es geschafft, eine Struktur und ein Array in dieselbe Datei zu schreiben? Ich bin Autodidakt, ich weiß nicht viel, aber die Tatsache, dass es unterschiedliche Datenformate sind, ist mir irgendwie suspekt.

Ich gebe zu, dass man es schaffen kann, die Datei einmal zum Schreiben zu öffnen und drei Arrays hineinzupacken, aber man kann sie nicht einfach so in Teilen lesen.

 
Alexey Viktorov:

Aber es liest das Array von Anfang bis Ende. Wie kann man es in 3 Teile aufteilen? Wie kann man eine Struktur schreiben und gleichzeitig ein Array in dieselbe Datei schreiben? Ich bin Autodidakt und weiß nicht viel, aber die Tatsache, dass es sich um unterschiedliche Datenformate handelt, ist irgendwie verdächtig.

Ich gebe zu, dass ich es schaffen kann, eine Datei einmal zum Schreiben zu öffnen und drei Arrays hineinzupacken, aber ich kann sie nicht so leicht in Teilen lesen.

Ich sage, wenn Sie in dieselbe Datei nur 1 Struktur und 3 Arrays schreiben, dann können Sie sie von dort aus lesen (unter der Annahme, dass Sie zum Lesen der Arrays die Größe der einzelnen Arrays angeben müssen). Aber der Trick, mehrere solcher Sequenzen zu schreiben und dann zu lesen, hat bei mir nicht funktioniert. Vielleicht muss ich den Zeiger bewegen, aber er ist bereits angespannt...

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

Ich habe Ihnen gesagt, wenn Sie nur 1 Struktur und 3 Arrays in eine Datei schreiben, dann können Sie sie später von dort aus lesen (vorausgesetzt, Sie müssen die Größe der einzelnen Arrays angeben, um sie zu lesen). Aber der Trick, mehrere solcher Sequenzen zu schreiben und dann zu lesen, hat bei mir nicht funktioniert. Vielleicht muss ich den Zeiger verschieben, aber das ist ein bisschen umständlich...

Wie ist die Spannung? Nicht genug Pferdestärken? Und wie können Sie sicher sein, dass der Schreibvorgang erfolgreich war und wie können Sie dies annehmen, wenn der Lesevorgang fehlgeschlagen ist? Soweit ich weiß, kann man sich eine .bin-Datei nicht mit den Augen ansehen.

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

Artyom, können Sie mir ein Beispiel nennen? Dabei ist zu berücksichtigen, dass die Größe von Arrays dynamisch ist.

Nein, es wird noch keine Beispiele geben - ich habe es selbst noch nicht getan, und wenn ich es tue, werde ich es in meinen Artikeln beschreiben. Und das wird nicht so bald sein. Mit FileWriteStruct() können Sie nämlich nur POD-Strukturen in eine Datei schreiben. Das sind einfache Strukturen, die keine Zeichenketten enthalten, dynamische Arrays,virtuelle Funktionen sowie Zeiger auf Objekte und Funktionen.

Und das bedeutet, dass man sie erfinden und testen muss. Aber ich habe die Richtung geschrieben. Über die Umsetzung muss nachgedacht werden.

 
Artyom Trishkin:

Nein, es wird noch keine Beispiele geben - ich habe es selbst noch nicht getan, und wenn ich es tue, werde ich es in Artikeln beschreiben. Und das wird nicht so bald sein. Tatsache ist, dass nur POD-Strukturen mit FileWriteStruct() in eine Datei geschrieben werden können. Das heißt, einfache Strukturen, die keine Zeichenketten enthalten, dynamische Arrays, virtuelle Funktionen, sowie Zeiger auf Objekte und Funktionen.

Und das bedeutet, dass wir sie erfinden und testen müssen. Aber ich habe die Richtung geschrieben. Die Umsetzung sollte überdacht werden.

Es stellt sich heraus, dass die Aufgabe, egal wie man sie betrachtet, nicht gelöst werden kann. Schließlich enthält das Beispiel von Sergei drei dynamische Arrays. Unabhängig davon, wie die Struktur in der Struktur angeordnet ist, bleibt sie ein dynamisches Array.

Wenn Sie jedoch ein Array von Strukturen erstellen, wird das Problem durch Schreiben des Arrays gelöst. FileWriteArray(). Dies wurde bereits getestet, und in der Dokumentation ist eindeutig festgelegt, dass ein Array von Strukturen geschrieben werden muss.

 
Alexey Viktorov:

Aber es liest das Array von Anfang bis Ende. Wie kann man es in 3 Teile aufteilen? Wie kann man eine Struktur schreiben und gleichzeitig ein Array in dieselbe Datei schreiben? Ich bin Autodidakt, ich weiß nicht viel, aber die Tatsache, dass es sich um unterschiedliche Datenformate handelt, ist mir irgendwie suspekt.

Ich gebe zu, dass man damit durchkommt, wenn man eine Datei einmal zum Schreiben öffnet und drei Arrays hineinpackt, aber man kann sie so nicht in Teilen lesen.

In einer Binärdatei können Sie beliebige Strukturen, Arrays und sogar einzelne Variablen in eine Datei schreiben.

ABER, beim Lesen müssen Sie die Daten in der gleichen Reihenfolge lesen.

wird alles funktionieren.

haben nicht gesehen, die Datei-Dump, beim Schreiben mit FileWriteArray() , höchstwahrscheinlich, die Array-Größe wird in den ersten Bytes geschrieben werden - aber es ist einfacher, ein Test-Skript zu machen, gibt es ein Dutzend Zeilen Code ;)

 
Alexey Viktorov:

Es zeigt sich, dass das Problem, egal wie man es betrachtet, unlösbar ist. In Sergejs Beispiel sind schließlich drei dynamische Arrays enthalten. Unabhängig davon, wie Sie die Struktur in der Struktur aufbauen, bleibt sie ein dynamisches Feld.

Und wenn Sie ein Array von Strukturen erstellen, lösen Sie das Problem, indem Sie das Array schreiben. FileWriteArray(). Dies wurde bereits getestet und ist in der Dokumentation zum Schreiben eines Arrays von Strukturen klar angegeben.

Ein Array von Strukturen wird gespeichert, aber... wenn es Zeichenketten gab, können sie in ein uchar-Array innerhalb der Struktur gepackt werden, was erfolgreich durchgeführt wird. Aber es gibt keine Möglichkeit, dass das Array double in das Array uchar passt. Außerdem ist sie dynamisch. Die drei Arrays werden separat in Dateien gespeichert und dann in die aus der Datei entpackte Struktur geschoben. Ich habe es nicht ausprobiert. Ich habe nicht darüber nachgedacht und weiß es nicht.

 
Igor Makanu:

Sie können beliebige Strukturen, Arrays und sogar einzelne Variablen in eine Binärdatei schreiben - alles in derselben Datei

ABER beim Lesen müssen Sie die Daten in der gleichen Reihenfolge lesen.

alles wird funktionieren

habe den Dateidump beim Schreiben mit FileWriteArray() nicht gesehen, höchstwahrscheinlich wird die Array-Größe in die ersten Bytes geschrieben - aber es ist einfacher, ein Testskript zu machen, es gibt ein Dutzend Codezeilen ;)

Ich weiß nicht, wo Sie angefangen haben, über dieses Problem zu lesen, aber ich möchte Sie daran erinnern: Sie müssen eine Struktur mit drei dynamischen Feldern in eine Datei schreiben. Dann hatte ich eine Frage, weil die Datei nicht richtig gelesen wurde.

Forum für Handel, automatisierte Handelssysteme und Strategietests

FAQ von Anfängern MQL5 MT5 MetaTrader 5

Sergey Tabolin, 2020.03.24 18:02

Ich frage ))))

Ich habe versucht, es "auf meine Art" zu machen.

Die erste Struktur und die 3 Arrays lassen sich gut lesen (vorausgesetzt, die Array-Empfänger sind nicht dynamisch, da sonst alle nach der Struktur geschriebenen Daten in das erste Array eingelesen werden).

Wenn es jedoch mehr Einträge gibt, dann

   // Проверка
   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);
      }
   }

Es gibt verdammt viel her...

Структура
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
++++++++++++++++++++++++++++++

Ich frage mich also: Wie ist es möglich, die Struktur und drei Arrays aus einer Datei zu lesen, von der man nicht weiß, wie sie geschrieben wurde?

Deshalb habe ich auch gesagt, dass ich Autodidakt bin und nicht viel weiß, aber man kann es nicht in Teilen lesen.

Und ich verstehe, dass es Optionen gibt, um der .bin-Datei alles hinzuzufügen, aber um sie zu lesen, muss man wissen, was in welcher Reihenfolge geschrieben wird. Und es ist möglich, dass nicht mit Hilfe von mql.

 

Ich verstehe das überhaupt nicht...

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

Was ist daran falsch?

 
Alexey Viktorov:

Ich frage mich also: Wie ist es möglich, eine Struktur und drei Arrays aus einer Datei zu lesen, von der man nicht weiß, wie sie geschrieben wurde?

das ist es, was ich schreibe, es ist einfacher zu überprüfen, innerhalb von 10 Minuten.... überprüft, schreibt FileWriteArray() die Größe des Arrays nicht in den Header oder das erste Byte, d.h. Sie sollten diese Werte selbst schreiben

#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 127

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

d.h. wenn die Array-Dimensionen dynamisch sind, bedeutet dies, dass wir beim Schreiben die Dimensionen des Arrays selbst schreiben, und beim Lesen den Wert der Array-Größe aus der Datei lesen und die Dimensionen der Arrays der Struktur setzen

in meinem Beispiel 2 Strukturen - eine wurde initialisiert und geschrieben, die zweite wurde gelesen, Initialisierung aus Dateidaten
Grund der Beschwerde: