Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 1022

 

Oder lassen Sie mich eine einfachere Frage stellen:

In die Funktion OnCalculate() wird eine Schleife eingefügt, so dass sie nur eine Iteration durchläuft, die nächste nur, wenn der Graph aktualisiert wird....

 
ara66676:

Oder lassen Sie mich eine einfachere Frage stellen:

In die Funktion OnCalculate() wird eine Schleife eingefügt, so dass sie nur eine Iteration durchläuft, die nächste nur, wenn der Graph aktualisiert wird....

Es sieht so aus, als bräuchten Sie einen Hellseher oder einen CODE TO STUDY.
 
bistreevseh:
Herzlichen Dank! Es funktioniert seltsam ich habe Admin-Rechte, speziell für den Terminal-Ordner gab ich alle Zerstörungen an den Eigentümer, es half, aber dann hörte es auf zu funktionieren. Dann versucht, die Protokolldatei mit dem FileReadStrArrayW (wenn ich nicht mit dem Namen falsch bin) lesen Sie die leeren Zeilen, Skript hängt im Ansi-Modus. Nur FileReadCharArr war in der Lage, die Ansi-Codes zu lesen. Vielleicht haben Sie ein Beispiel, wie man eine Logdatei mit Ihrer Bibliothek analysieren kann? Ich wäre Ihnen sehr dankbar!

Ja, es gibt jetzt ein Problem beim Lesen des Protokolls. Früher war es einfacher.

Das Problem ist, dass die Datei selbst ANSI-kodiert ist, aber die Zeichenketten jetzt UNICODE sind.

Hier ist ein solches Skript funktioniert:

#property strict
#property script_show_inputs

#include <FileFunctions.mqh>

input int NumLines = 10;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
 {
  string sName = TimeToString(TimeLocal(), TIME_DATE);
  StringReplace(sName, ".", "");
  string sPath = TerminalPath() + "\\MQL4\\Logs\\" + sName + ".log";
  Print(sPath);
  
  if (!FileCheckW(sPath))
   {
    Print("Файл отсутствует!");
    return;
   }
    
  int hFile = FileOpenExistingW(sPath, GENERIC_READ, SHARE_READ);
  if (hFile == NULL)
   {
    Print("Файл не открыт!");
    return;
   }

  string asArray[];
  ArrayResize(asArray, NumLines);
  Print("hFile = ", hFile);
  for (int i = 0; i < NumLines; i++) asArray[i] = string(i) + "                                                                                                                                                                                                                                                          ";
  FileReadStrArrayMW(hFile, asArray, ArraySize(asArray), 0, NumLines);
  FileCloseHandle(hFile);
  for (int i = 0; i < NumLines; i++) Alert(asArray[i]);
 }

Das funktioniert aber nur, wenn die Protokolldatei zuerst in UNICODE gespeichert wird!

D.h. die Bibliothek arbeitet korrekt. Wir müssen einen einfachen Weg finden, um von der ANSI-Kodierung der Datei in ein UNICODE-String-Array zu konvertieren, oder ich sollte der Bibliothek eine Funktion hinzufügen, die die Kodierung von Strings beim Lesen der Datei konvertiert.

=====================

Option 1: Sie müssen sich nicht mit Arrays befassen. Lesen Sie die gesamte Datei als ANSI, konvertieren Sie sie in UNICODE und parsen Sie sie dann mit MQL.

Variante 2. Lesen Sie sie als ANSI, schreiben Sie sie in das aktuelle Verzeichnis des Terminals und lesen Sie sie mit MQL-Funktionen für CSV-Dateien.

Option 3. Erstellen Sie einen symbolischen Link zur Protokolldatei in der Sandbox mit der Funktion aus derselben Bibliothek und lesen Sie sie mit MQL-Funktionen für die Arbeit mit CSV-Dateien:

#property strict
#include <FileFunctions.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
 {
  string sName = TimeToString(TimeLocal(), TIME_DATE);
  StringReplace(sName, ".", "");
  sName += ".log";
  
  string sPathLogs = TerminalPath() + "\\MQL4\\Logs\\" + sName;
  string sPathFiles = TerminalPath() + "\\MQL4\\Files\\" + sName;
  
  Print(sPathLogs);
  Print(sPathFiles);
  
  if (!FileCheckW(sPathLogs))
   {
    Print("Файл отсутствует!");
    return;
   }
  
  if (!FileCheckW(sPathFiles) && !FileSymbolicLinkW(sPathLogs, sPathFiles))
   {
    Print("Символьная ссылка не создана!");
    return;
   }
  
  int hFile = FileOpen(sName, FILE_READ|FILE_CSV|FILE_ANSI, '\t');
  if (hFile == INVALID_HANDLE)
   {
    Print("Файл не открыт!");
    return;
   }
  
  while (!FileIsEnding(hFile)) Alert(FileReadString(hFile));
  FileClose(hFile);
 }

Meiner Meinung nach ist dies die schönste und einfachste Option.

 

Ich versuche, einen Kanalindikator zu schreiben. Ich berechnete Werte für das Zeichnen auf dem Diagramm und legte sie in double tob[] und double tos[] Arrays, aber wenn ich versuche, sie mit dem Puffer für das Zeichnen auf dem Diagramm zu verbinden - in Zeilen 25 und 26:

SetIndexBuffer(0, tob);
SetIndexBuffer(1, tos);

diese Felder anstelle der erforderlichen Werte, wie z. B.:

0/1.424/1.3679
1/1.42/1.3639

werden mit der Nummer 2147483647 ausgefüllt, etwa so:
0/2147483647/2147483647
1/2147483647/2147483647
2/2147483647/2147483647

Wie kann dies geheilt werden?

Dateien:
channel1.mq4  7 kb
 
Gibt es Hotkeys, um schnell zwischen den Zeiträumen zu wechseln?
Durch Drücken von D wechselt H1 zu M15 und durch Drücken von U zu H1.
 

Helfen Sie mir, eine Vorlage für MT4 zu finden, um Tag und Nacht zu trennen.

Angenommen, das Diagramm ist von 00:00 bis 8:00 Uhr in einer Farbe und von 8:00 bis 00:00 Uhr in einer anderen Farbe.

 

Ich grüße alle.

Mit diesem Problem konfrontiert:

Ein Ausschnitt aus dem Robotercode:

int per=Period();
if(per = 60)
{

Print("Wenn der Punkt nicht H1 ist, sollte diese Zeile nicht im Protokoll stehen");

Kommentar (...);

... // hier ist der Roboterkörper

...

...

}

impliziert, dass weder der Roboterkörper, noch die Print(...)-Zeile, noch der Comment(...) auf dem Bildschirm ausgeführt werden, wenn eine andere Periode als H1 im Chart aktiviert ist.

Allerdings wird alles in einem beliebigen Zeitraum ausgeführt. Warum?

Wie richtig zu schreiben, dass, wenn der Zeitraum auf dem Diagramm nicht mit der angegebenen - Rückkehr Kontrolle an das Terminal. (Übrigens, ich habe es mit RETURN (0) versucht - hilft nicht - druckt immer noch alles aus...)

 
Dikons:

Ich grüße alle.

Mit diesem Problem konfrontiert:

Roboter-Codefragment:

int per=Periode();
wenn(pro = 60)
{

Print("Wenn die Periode nicht H1 ist - sollte diese Zeile nicht im Logbuch stehen");

Kommentar (...);

... // dann der Körper des Roboters

...

...

}

impliziert, dass weder der Body des Roboters, noch der String Print(...), noch Comment(...) auf dem Bildschirm ausgeführt werden, wenn eine andere Periode als H1 im Chart aktiviert ist.

Allerdings wird alles in einem beliebigen Zeitraum ausgeführt. Warum?

Wie kann man richtig registrieren, dass - wenn der Zeitrahmen nicht dem eingestellten entspricht - die Kontrolle an das Terminal zurückgegeben wird. (Übrigens habe ich RETURN (0) ausprobiert - es funktioniert nicht - es wird immer noch alles gedruckt...)

Sie machen eine Zuweisung, Sie brauchen einen Vergleich if(per == 60)
 
Trader76:
Sie führen eine Zuordnung durch, während Sie einen Vergleich benötigen if(per == 60)

Danke, Genosse... Mein Hirn ist übergeschwappt... Ich habe eine erhebliche Pause beim Programmieren eingelegt - ich habe viel von dem Wenigen, das ich weiß, vergessen...

---

Eine Frage noch... Fragment der Suche nach max/mini in den ersten 8 Stunden eines Tages nach Terminal:

int h=TimeHour(TimeCurrent()); // Ermittlung der aktuellen Endstunde (0...23)
if (h<8) return(0); // wenn keine H1 der ersten 8 Kerzen des Tages = leave...

double Maxi=High[iHighest(NULL,PERIOD_H1,MODE_HIGH,8,h-7)]; // definiere maximal die ersten 8 Kerzen des Tages.

double Mini=Low[iLowest(NULL,PERIOD_H1,MODE_LOW,8,h-7)];


Die letzten beiden Zeilen funktionieren nicht korrekt, wenn die Diagrammperiode auf etwas anderes als H1 eingestellt ist. Und warum? Da dem Roboter ausdrücklich ein Zeitraum für Berechnungen zugewiesen wurde...

Wenn Sie z. B. H4 in den Chart eingeben, wird der Roboter diesen anhand von H4-Kerzen neu ausbalancieren (dasselbe geschieht mit anderen Zeitrahmen).

 
Dikons:

Danke, Genosse... Mein Hirn ist übergeschwappt... Ich habe eine erhebliche Pause beim Programmieren eingelegt - ich habe viel von dem Wenigen, das ich weiß, vergessen...

---

Eine Frage noch... Fragment der Suche nach max/mini in den ersten 8 Stunden eines Tages nach Terminal:

int h=TimeHour(TimeCurrent()); // Ermittlung der aktuellen Endstunde (0...23)
if (h<8) return(0); // wenn keine H1 der ersten 8 Kerzen des Tages = leave...

double Maxi=High[iHighest(NULL,PERIOD_H1,MODE_HIGH,8,h-7)]; // definiere maximal die ersten 8 Kerzen des Tages.

double Mini=Low[iLowest(NULL,PERIOD_H1,MODE_LOW,8,h-7)];


Die letzten beiden Zeilen funktionieren nicht korrekt, wenn die Diagrammperiode auf etwas anderes als H1 eingestellt ist. Und warum? Da dem Roboter ausdrücklich ein Zeitraum für Berechnungen zugewiesen wurde...

Wenn Sie z. B. H4 in den Chart eingeben, wird der Roboter diesen anhand von H4-Kerzen neu ausbalancieren (dasselbe geschieht mit anderen Zeitrahmen).

Hier erhalten Sie die Anzahl der Max/Min-Takte: iHighest(NULL,PERIOD_H1,MODE_HIGH,8,h-7)

Und dann fügen Sie z.B. Bar Nummer 2 ein und erhalten:High[2] und auf einem anderen Zeitrahmen erhalten Sie einen Wert, der sich von H1 unterscheidet. Lesen Sie über High.

iHigh(NULL,PERIOD_H1, iHighest(NULL,PERIOD_H1,MODE_HIGH,8,h-7))

Grund der Beschwerde: