Einzelne Array-Berechnung während der Optimierung - Seite 5

 
Yuri Evseenkov:
Ich tue dies. Ich führe einen einzigen Test durch. Während dieser Tests schreibe ich Arrays in eine Datei. Dann führe ich die Optimierung in demselben Bereich durch, aber die Arrays werden nicht bei jedem Takt oder Tick neu berechnet, sondern aus der Datei gelesen. Die Optimierung durch wöchentliche Eröffnungspreise erfolgt sofort. Ohne Dateioperationen dauert es Stunden.
Meine Situation ist etwas anders. Ich muss das Array nur einmal füllen und es für alle Durchgänge verwenden. Das heißt, für mich, auch mit jedem Durchgang, füllen das Feld einmal in der inite ist eine Menge.
 
-Aleks-:

Verstehe, d.h. man kann die fertige Datei mit den Ziffern in ein Array einlesen (in meinem Fall), dann in eine Binärdatei schreiben und diese dann verwenden.

Nun, wenn Sie Daten von 10 Feldern aus der Datei lesen müssen, dann müssen Sie einen Sortierer machen, der das Ende des Feldes durch eine spezielle Ziffer erkennt und das nächste Feld füllt... Denn es ist nicht sinnvoll, jedes Mal die Array-Größe zu schreiben.

Zuerst schreiben wir eine int-Variable mit der Array-Größe in die Datei, dann ein Array, dann eine weitere int-Variable mit der Größe, dann ein Array usw.

In der gleichen Reihenfolge lesen wir: Variable mit Größe lesen, Array mit dieser Größe lesen, nächste Variable, Array, usw.

 
forexman77:
Ich habe eine etwas andere Situation. Ich brauche das Array nur einmal zu füllen und kann es für alle meine Durchgänge verwenden. Das heißt, für mich, auch mit jedem Durchgang, füllen das Feld einmal in der inite ist eine Menge.
Füllen Sie sie also einmal in einem einzigen Test aus. Programme, die getestet und optimiert werden, müssen sich in den Dateioperationen unterscheiden. Während der Prüfung wird geschrieben, während der Optimierung wird gelesen. Es müssen zwei Codes geschrieben werden. Was meinen Sie mit "ein Array zu füllen ist eine Menge"? Der Aufruf eines Arrays aus einer Datei nimmt nicht mehr Zeit in Anspruch als z. B. das Öffnen einer Bestellung oder eine Multiplikation mit double.
 
Yuri Evseenkov:
Füllen Sie es also einmal für einen einzigen Test. Programme, die getestet und optimiert werden, müssen sich in den Dateioperationen unterscheiden. Während der Prüfung wird geschrieben, während der Optimierung wird gelesen. Es müssen zwei Codes geschrieben werden. Was meinen Sie mit "ein Array zu füllen ist eine Menge"? Der Aufruf eines Arrays aus einer Datei nimmt nicht mehr Zeit in Anspruch als z. B. das Öffnen einer Bestellung oder eine Multiplikation mit double.

Das liegt vor allem daran, dass ich die ganze Palette im Voraus kenne. Es stellte sich also die Frage, wie man dieses Array zwischen den Durchläufen speichern kann. Soweit ich weiß, wird sie beim nächsten Durchgang zurückgesetzt, obwohl ich mir da nicht ganz sicher bin.

Ich bin nicht der Meinung, dass das Lesen in meinem Fall schneller geht. Die Geschwindigkeit ist schneller, wenn ich die gleichen Daten über Indikatoren erhalte, und sie nimmt deutlich ab, wenn diese Daten aus einer Datei ohne Berechnung von Indikatoren gelesen werden. Bei einem kleinen Zeitrahmen mit einer Zeilenzahl von tausend und einem großen Segment ist es sehr teuer, die Datei jedes Mal zu lesen.

Die Idee war folgende: die Daten zu lesen und in ein Array zu schreiben und dann bei allen Durchläufen nur dieses Array zu verwenden, d.h. das Array ist vom ersten bis zum letzten Durchlauf genau dasselbe.

 
forexman77:

Das liegt vor allem daran, dass ich die ganze Palette im Voraus kenne. Es stellte sich also die Frage, wie man dieses Array zwischen den Durchläufen speichern kann. Soweit ich weiß, wird sie beim nächsten Durchgang zurückgesetzt, obwohl ich mir da nicht ganz sicher bin.

Ich bin nicht der Meinung, dass das Lesen in meinem Fall schneller geht. Es geht schneller, wenn ich die gleichen Daten über Indikatoren erhalte, und es wird langsamer, wenn ich diese Daten aus der Datei ohne Berechnung von Indikatoren lese.

Die Idee war die folgende: Daten zu lesen und in ein Array zu packen und dieses Array dann für alle Durchläufe zu verwenden, d.h. das Array ist vom ersten bis zum letzten Durchlauf genau dasselbe.

Nur die Praxis wird diese Frage beantworten. Ich habe lange mit dem gleichen Problem zu kämpfen. Ich war stundenlang mit der Optimierung beschäftigt. Bis Andrey Khatimlansky mir vorschlug, einmal in die Datei zu schreiben und dann zu lesen. Jetzt muss ich nur noch den Durchgangstest abwarten und dann ist die Optimierung vom Tisch. Die Dateioperationen sind in Kovalevs Tutorial gut beschrieben.
 
Dmitry Fedoseev:

Zuerst schreiben wir eine int-Variable mit der Größe des Arrays in die Datei, dann ein Array, dann eine weitere int-Variable mit der Größe, dann ein Array usw.

Lesen in der gleichen Reihenfolge: Variable mit Größe lesen, Array mit dieser Größe lesen, nächste Variable, Array, usw.

Hier fühle ich mich ungebildet... Wie schreibt man eine Variable int mit der Größe eines Arrays in eine Binärdatei? D.h. wie könnte man diese Variable beim Lesen aus der Datei identifizieren?
 
forexman77:

Die Idee war, die Daten zu lesen und sie in ein Array zu packen und dann bei allen Durchläufen nur dieses Array zu verwenden, d.h. das Array ist vom ersten bis zum letzten Durchlauf genau dasselbe.

MT4 arbeitet wirklich sehr langsam mit Dateien, ich weiß nicht, wie es in MT5 sein wird, besonders mit einer binären Datei...

Ich löse dieses Problem mit einer Funktion, die das gesamte Array direkt in den Code schreibt, aber das ist natürlich keine Universallösung.

 

Hier ist ein Beispiel für das Schreiben und Lesen eines Arrays

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


Führen Sie es zweimal im Debug-Modus aus und sehen Sie, wie lange es dauert, das Array zu schreiben und zu lesen. Der erste Durchlauf schreibt das Array in eine Datei, der zweite liest es und beginnt mit dem Ausdruck von Daten aus dem Array. Dann finden Sie heraus, ob IS_DEBUG_MODE entfernt und IsOptimization() in die Bedingung eingefügt werden soll

 
-Aleks-:
Hier fühle ich mich ungebildet... Wie schreibt man eine int-Variable mit einer Array-Größe in eine Binärdatei? D.h. wie könnte man diese Variable beim Lesen aus der Datei identifizieren?

Es gibt eine Funktion, so etwas wie FileWriteInteger(). Die Variable muss am Anfang der Datei stehen, nach dem Lesen bewegt sich der Zeiger an ihr Ende, d.h. an den Anfang des Arrays, nach dem Lesen des Arrays steht der Zeiger vor der nächsten Variablen...

Ein Artikel über die Arbeit mit Dateien folgt in Kürze.

 
Dmitry Fedoseev:

Es gibt eine Funktion, so etwas wie FileWriteInteger(). Die Variable muss am Anfang der Datei stehen, nach dem Lesen bewegt sich der Zeiger an ihr Ende, d.h. an den Anfang des Arrays, nach dem Lesen des Arrays steht der Zeiger vor der nächsten Variablen...

In Kürze wird es einen Artikel über die Arbeit mit Dateien geben.

Ich verstehe, danke.

Aber ich würde mir den Code gerne ansehen, also werde ich auf den Artikel warten.

Grund der Beschwerde: