MetaTrader 5 Strategy Tester: Bugs, Bugs, Verbesserungsvorschläge - Seite 46

 
traveller00:
Bild 2280, aber das war auch in früheren Versionen der Fall. Wenn ich ein Skript oder einen EA zum Debuggen ausführe, öffnet sich ein neues Fenster mit dem ersten Symbol aus der Marktübersicht auf dem Zeitrahmen 1H. Was ist, wenn ich das Debugging nicht für das erste Symbol oder für einen anderen Zeitrahmen durchführen muss? Gibt es eine Möglichkeit, dies zu tun, ohne alle Symbole zu löschen, damit das richtige Symbol zuerst erscheint?
Gehen Sie zu den Terminaleinstellungen. Dort können Sie das zu debuggende Symbol auswählen.
 
Artyom Trishkin:
Gehen Sie zu den Terminaleinstellungen. Dort gibt es eine Symbolauswahl für die Fehlersuche.

Artyom, du hast das falsch verstanden. Dies sind ME-Einstellungen, keine Terminaleinstellungen.


Sie müssen weniger arbeiten)))

 
Artyom Trishkin:
Gehen Sie zu den Terminaleinstellungen. Dort können Sie ein Symbol zum Debuggen auswählen.

Verstanden, danke. Ich bin neu bei MT5 und weiß noch nicht alles.

 
Alexey Viktorov:

Artyom, du hast das falsch verstanden. Dies sind ME-Einstellungen, keine Terminal-Einstellungen


Sie sollten weniger arbeiten)))

Ja, mein Fehler... Wenn man von einem Mobiltelefon aus schreibt, kann man manchmal nicht einmal hinsehen...
 

Build 2280. Der Computer verfügt über 4 Prozessoren. Es laufen 2 MT5s. Der erste führt ein langes Skript aus, terminal64.exe belegt 100% eines Prozessors, was zu einer Gesamtlast von 25% führt. Auf dem zweiten MT5 läuft die genetische Optimierung. Standardmäßig gibt es 4 Agenten nach der Anzahl der Prozessoren. Die erste Gruppe von Aufträgen erhält alle 127. Die verbleibenden Aufgaben werden von 2 Bearbeitern empfangen und ausgeführt, die restlichen 2 bleiben in der Erledigung hängen und werden nicht einmal empfangen. Wenn Sie sie zwangsweise deaktivieren/aktivieren, nehmen sie an der Arbeit teil. Bis die Optimierung wieder beginnt. Wenn Sie zuerst MT5 ausschalten, bleibt die Situation unverändert. Wenn Sie den zweiten MT5 danach neu starten, ist alles in Ordnung. Handelt es sich um einen trickreichen Load Balancer oder um einen Fehler? Wenn ersteres, dann ist es nicht sehr gut, weil es endet Laden bei 75% (erste MT5 + 2 Agenten) und noch sollte es eher durch die Prioritäten des Windes behandelt werden.

P.S. Scheint nicht unbedingt mit der CPU-Last zusammenzuhängen. Nur nach dem Neustart fing die Genetik an, sonst lief gar nichts, auch 2 Agenten waren faul, bis ich sie aus/einschaltete. Wenn ich nur 3 Agenten aktiv halte und 1 ganz deaktiviere, sind immer noch 2 im Rückstand, nur 1 funktioniert.

P.P.S. Wenn es 6 Prozessoren gibt, dann gibt es 3.
 

Build 2280. Debugging des Indikators, Schritt für Schritt im Debugger durchgeführt. Auf der Linie

StartTime = iTime(Symbols[0], _Period, Pos + PosAddon);

Debugging abgestürzt. Etwas wie kritischer Fehler, Debugging gestoppt. Im Protokoll heißt es

           crash -->  000000 B7250C38B1 038424 B8000000    add        eax, [rsp+0xb8]
                      000000 B7250C38B8 89442460          mov        [rsp+0x60], eax
                      000000 B7250C38BC 448 B4C2460        mov        r9d, [rsp+0x60]
                      000000 B7250C38C1 49 B8010000000000  mov        r8, 0x1
                                       0000
                      000000 B7250C38CB 488 B542468        mov        rdx, [rsp+0x68]
                      000000 B7250C38D0 48 B9E8DD4220B700  mov        rcx, 0xb72042dde8
                                       0000
                      000000 B7250C38DA 49 FF96580F0000    call       qword near [r14+0xf58]  ; #11037 (terminal64.exe)
        
        00: 0x000000B7250C38B1

Es passiert wieder, aber selten. Ich weiß nicht, ob sich zwischen den Debugging-Sitzungen etwas geändert hat.

 

Build 2280. Börse, Terminmarkt. Der gesamte Verlauf wird geladen, aber die Tests werden offline durchgeführt. iBarShift funktioniert seltsam in Indikatoren. Und derselbe Code funktioniert auch im Skript. Ist das ein Fehler oder übersehe ich etwas?

#property indicator_separate_window

void OnInit()
{
  datetime Time[];
  ArraySetAsSeries(Time, true);
  CopyTime(_Symbol,_Period,0,1,Time);

  int Shift=iBarShift(_Symbol,_Period,Time[0]);
  Print("Symbol="+_Symbol+", Shift="+(string)Shift);

  for(int i=0;i!=SymbolsTotal(true);++i)
  {
    const string SymbName=SymbolName(i,true);
    Shift=iBarShift(SymbName,_Period,Time[0]);
    Print("Symbol="+SymbName+", Shift="+(string)Shift);
  }
}

int OnCalculate(const int rates_total,const int prev_calculated,const datetime& time[],const double& open[],const double& high[],
  const double& low[],const double& close[],const long& tick_volume[],const long& volume[],const int& spread[])
{
  return 0;
}

Es gibt einen solchen Kodex. Es durchläuft im Wesentlichen alle Symbole aus der Marktübersicht und zieht deniBarShift ab. Derselbe Code funktioniert im Skript einwandfrei. Der Indikator produziert -1 für alle Symbole, außer für das aktuelle (auf dem Chart, auf dem er läuft), mit dem Fehler, dass es keine Historie gibt. Gleichzeitig wird beim zweiten Durchlauf offenbar der Verlauf geladen und bereits normal angezeigt.

 
traveller00:

derselbe Code funktioniert im Skript einwandfrei. Ist das ein Fehler oder übersehe ich etwas?

Im Gegensatz zum Skript arbeitet der Indikator asynchron - er wartet nicht darauf, dass die Geschichte fertig ist.

 
fxsaber:

Im Gegensatz zum Skript arbeitet der Indikator asynchron - er wartet nicht darauf, dass der Verlauf fertig ist.

Nun, die ganze Geschichte ist da. Wie gesagt, es funktioniert offline, der gesamte Verlauf ist bereits vom Server heruntergeladen. Oder braucht es etwas anderes?

 
traveller00:

Nun, die ganze Geschichte ist da. Wie ich schon sagte, arbeitet er offline, der gesamte Verlauf ist bereits vom Server heruntergeladen. Oder braucht es etwas anderes?

Theoretisch müssen Sie natürlich alles aus dem Kaltstart hochfahren. In der Praxis kenne ich mich jedoch nicht mit Indikatoren aus, daher kann ich das nicht mit Sicherheit sagen.

Grund der Beschwerde: