Fehler, Irrtümer, Fragen - Seite 437

 
voix_kas:

Ich habe es irgendwie ausgeheckt. Kritik ist willkommen.

Da es sich wahrscheinlich um einen Experten handeln wird:

    bool   SetSymbols(string);

и:

CSymbolList slMain;

int OnInit()
  {
   if(!slMain.SetSymbols(inWorkSymbols)) return(-1);
   for (int i = 0; i < slMain.GetSymbolCount(); i++)
      Print(slMain.GetSymbolName(i));
//--- ok
   return(0);
  }
 
MetaDriver:
Ich wette darauf, dass das garantiert ist. Zumindest verlasse ich mich ständig darauf, und das Problem ist noch nie aufgetreten.

Verstehe. Wie auch immer, es ist ein heikler Moment.

OnkelVic

Das ist wahr. Aber in meinem Fall ist das überflüssig:

#include <CSymbolList.mqh>

input int    inTimeToRescan = 3600; // Интервал времени для принудительного пересканирования рабочих инструментов, в секундах
input string inWorkSymbols  = "USDCHF; GBPUSD; EURUSD; USDJPY; USDCAD; AUDUSD; EURGBP; EURAUD; EURCHF; EURJPY; GBPJPY; GBPCHF"; // Рабочие инструменты

CSymbolList slMain;

int OnInit() {
  slMain.SetSymbols(inWorkSymbols);
  return 0;
}

void OnTick() {
  static long LastScan = 0;
  if (!slMain.GetSymbolCount() || ((long)TimeCurrent() - LastScan >= inTimeToRescan)) {
    Comment("Идентификация рабочих инструментов...");
    slMain.SetSymbols(inWorkSymbols);
    LastScan = (long)TimeCurrent();
    return;
  }

  static string Information;
  Information = TimeToString(TimeCurrent(), TIME_DATE|TIME_SECONDS);

  for (int i = 0; i < slMain.GetSymbolCount(); i++) {
    if (!SymbolSelect(slMain.GetSymbolName(i), true) || !SymbolIsSynchronized(slMain.GetSymbolName(i))) continue;
    //
    StringConcatenate(Information, Information, "\n", slMain.GetSymbolName(i));
  }
  Comment(Information);
}

Wie Sie sehen können, gibt es keine Iteration, wenn im letzten Zyklus in OnTick ein Fehler in den Tools auftritt.

 
voix_kas:

Verstehe. Wie auch immer, es ist ein heikler Moment.

OnkelVic

Das ist wahr. Aber in meinem Fall ist das überflüssig:

Wenn im letzten Zyklus ein Fehler in den Werkzeugen auftrat, gibt es keine einzige Iteration in OnTick.

Ich bestehe nicht darauf. Es ist nur richtig, das Ergebnis der Ausführung zu überprüfen.

 
uncleVic:

Ich will es nicht übertreiben. Es ist richtig, nur das Ergebnis der Ausführung zu überprüfen.

Ich verstehe. Jedenfalls danke für den Rat.
 

Ich habe diesen Trick entdeckt. Wenn ich dieses Skript ausführe, bleibt es "hängen".

void OnStart()
  {
   Print("Start  ",TimeLocal());
   Sleep(-1000*2764799);
   Print("Finish ",TimeLocal());
  }

Wenn jedoch dieselben drei Zeilen (Code) zuerst in die OnInit()-Funktion des Expert Advisors eingefügt werden und dieser EA im Testmodus gestartet wird, sind die Ergebnisse wie folgt:

NS 0 Core 2 14:23:49 2011.01.03 00:00:00   Ye00-01-2Event5.mq5 OnInit: терминал (470), разрешение на торговлю (true), TERMINAL_MAXBARS=10000000, компилятор (470)
PD 0 Core 2 14:23:49 2011.01.03 00:00:00   Start  2011.01.03 00:00:00
NP 0 Core 2 14:24:18 2011.01.20 17:02:48   Finish 2011.01.20 17:02:48
II 0 Core 2 14:24:18 2011.01.20 17:02:48   MisFunciones.mqh FileInit: Поиск bin-файла Y.bin

Erstens: Der Code funktioniert irgendwie im Testmodus.

Zweitens (und das ist noch wichtiger) geht die Geschichte der ersten paar Tage der Prüfung verloren. So wurde im obigen Beispiel die Prüfung am 03.01.2011 begonnen (wie aus den ersten beiden Zeilen ersichtlich), aber der Prüfer ist sofort nach der Codeverarbeitung um 17 Tage nach vorne gesprungen (in diesem Fall ist dies eine Zeile 2-3), und die Prüfung wird fortgesetzt, ohne diese 17 Tage zu berücksichtigen.

 
Sie haben sich gerade einen arithmetischen Überlauf in der
 Sleep(-1000*2764799);
Daraus ergibt sich eine Wartezeit von 17,5 Tagen.
 
Renat:
Sie haben sich gerade einen arithmetischen Überlauf in
eingefangen und warten nun seit 17,5 Tagen.
Ja, und es funktioniert im Testgerät, weil es Sleep ignoriert.
 
Renat:
Sie haben auf triviale Weise einen arithmetischen Überlauf in
Das bedeutet, dass Sie 17,5 Tage warten müssen.

Ich streite nicht über den "gefangenen Überlauf", denn ich weiß es nicht :) Die Frage ist, ob eine solche Situation entweder durch den Compiler oder den Tester mit der Ausgabe eines kritischen Fehlers (oder auf andere Weise) unterdrückt werden sollte. Nicht jeder wird genau darauf achten, wie seine Programme funktionieren, wenn es keine Warnungen vom Terminal gibt.

Das Problem ist auch darin zu sehen, dass der Code in den ersten Zeilen von OnInit() platziert ist (d.h. bevor irgendwelche historischen Daten heruntergeladen werden) - aber aus irgendeinem Grund gehen die Daten der ersten 17,5 Tage verloren.

Документация по MQL5: Программы MQL5 / Ошибки выполнения
Документация по MQL5: Программы MQL5 / Ошибки выполнения
  • www.mql5.com
Программы MQL5 / Ошибки выполнения - Документация по MQL5
 
joo:
Ja, und es funktioniert im Testgerät, weil Sleep dort ignoriert wird.
Sind Sie so sicher, dass Sleep() ignoriert wird? - Sehen Sie sich die Zeitdifferenz zwischen den Zeilen 2 und 3 an.
 
Yedelkin:
Sind Sie so sicher, dass Sleep() ignoriert wird? - Sehen Sie sich den Unterschied in der Endzeit zwischen den Zeilen 2 und 3 an.
Vielleicht wirkt sich das bloße Vorhandensein von Sleep (im Vergleich zu seinem Fehlen) im Code irgendwie auf die Gesamtausführungszeit aus, aber die Tatsache, dass Sleep im Tester nicht gezählt wird, ist sicher.
Grund der Beschwerde: