Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 60

 
Alexey Kozitsyn:
Ich weiß nicht, von welcher grafischen Benutzeroberfläche Sie sprechen, aber auf der Registerkarte "Parameter" des Testerfensters können Sie Start- und Stoppfelder festlegen. Und das Prüfgerät ermittelt korrekt die Anzahl der Parameterwerte.

Schritt ins Feld.

 
fxsaber:

Schritt ins Feld.

Entschuldigung, ich habe es nicht genau gelesen.
 
fxsaber:

Stufenfeld.

Der Grund dafür ist wahrscheinlich, dass Aufzählungsfeldern Eigenwerte gegeben werden können, die kein Vielfaches einer Stufe sein dürfen.

 
Alexey Kozitsyn:

Der Grund dafür ist wahrscheinlich, dass Aufzählungsfeldern Eigenwerte gegeben werden können, die kein Vielfaches einer Stufe sein dürfen.

Ja, es ist kein Fehler, deshalb haben wir in diesem Thread darüber gesprochen. Wenn wir einen Optimierungsschritt wünschen, kann dieser über MQL for enum eingestellt werden.

 

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Bibliotheken: TesterBenchmark

fxsaber, 2017.11.22 16:54

Einfügen von nur einer Zeile in jede der MT5-Varianten

#define Comment(A)

Vollwertig um 67% beschleunigt, handwerklich um 108%!


Aber das ist nicht der springende Punkt. Wir haben es geschafft, unsere EAs mit einer Zeile zu beschleunigen! Und das ist im Optimierer, wo der Kommentar keine Rolle spielt.

 
// Возвращает true только в случае, если выбран (в тестере) режим по реальным тикам
// Перед использованием должен быть хотя бы один OnTick вызван тестером
bool IsRealTicks( void )
{
  MqlTick Tick;
  
  return(SymbolInfoTick(_Symbol, Tick) && (Tick.volume || !(Tick.flags & TICK_FLAG_LAST)));
}


Beispiel für die Verwendung

// Советник будет тестироваться только в режиме по реальным тикам
void OnTick()
{
  static bool IsRemove = true;
  
  if (IsRemove)
  {
    IsRemove = MQLInfoInteger(MQL_TESTER) && !IsRealTicks();
    
    if (IsRemove)
    {
      Print("Real ticks mode is needed!");
      
      ExpertRemove();
      
      return;
    }
  }
  
  //........
}
Wie man das in OnInit (ohne OnTick) macht - weiß ich nicht.
 

Ein Ausschnitt aus dem Dialog zum genannten Thema

fxsaber2017.11.24 08:35
Verwenden Sie keine Ausdrücke in Druck- (oder Kommentar-) Parametern. Geben Sie die Parameter durch Kommata getrennt an. Dann werden mit Sicherheit alle String-Konvertierungen überschrieben

Könnten Sie anhand eines Beispiels erklären, wie sich diese beiden Zeichenfolgen im Optimierungsmodus unterscheiden?

Print((string)i + (string)d);
Print(i, d);
Support Team2017.11.24 08:44

Bei der Optimierung im ersten Fall wird vor dem Druck ein String-Ausdruck berechnet. Der Druck selbst wird aufgerufen, aber er funktioniert nicht.

Im zweiten Fall wird Print zwar aufgerufen, aber es funktioniert nicht. Auch die i+d-Stringkonvertierung funktioniert nicht

Bei einem einfachen Test sind die Ergebnisse des ersten und des zweiten Aufrufs gleich, sowohl was die Zeit als auch was die empfangene Leistung betrifft.

D.h. es ist viel billiger, Print mit Kommas für Optimize-Modi zu verwenden, als einen einzelnen Eingabeparameter dafür als String zu bilden.


Andererseits, wenn es alles als eine einzige Zeichenkette direkt in Print bildet, ist es einfach, seine Bildung im Optimierungsmodus zu deaktivieren über

#define Print(A)

aber ein solches Konstrukt funktioniert nicht, wenn Kommas verwendet werden. Außerdem wird sie durch eine solche Konstruktion auch im Optimierungsmodus deaktiviert

Print(SendOrder()); // SendOrder будет проигнорирован при #define Print(A)


Deshalb (und aus anderen Gründen) ist es besser, wirklich wichtige Funktionen nicht innerhalb von Print aufzurufen. Wenn Sie also im Optimierungsmodus auf die Leistung achten, müssen Sie immer noch etwas wie folgt tun

static const bool IsNotOptim = !MQLInfoInteger(MQL_OPTIMIZATION);

if (IsNotOptim)
{
  const string Str = GetString(); // дорогой вызов
  
  Print(Str);
//  Comment(Str); 
//  Alert(Str);
}
 
fxsaber:

Ein Ausschnitt aus dem Dialog zu dem genannten Thema

D.h. es ist viel billiger, Print mit Kommas für Optimize-Modi zu verwenden, als einen einzelnen Eingabeparameter als String dafür zu bilden.


Andererseits, wenn Sie alles als eine einzige Linie direkt in Print formen, ist es einfach, diese Formation im Optimierungsmodus zu deaktivieren durch

aber ein solches Konstrukt funktioniert nicht, wenn Kommas verwendet werden. Außerdem wird sie durch eine solche Konstruktion auch im Optimierungsmodus deaktiviert


Deshalb (und aus anderen Gründen) ist es besser, wirklich wichtige Funktionen nicht innerhalb von Print aufzurufen. Wenn Ihnen die Leistung im Optimierungsmodus wichtig ist, müssen Sie trotzdem etwas wie folgt tun

Entschuldigung, vielleicht verstehe ich es nicht, aber warum sollten wichtige Funktionen innerhalb von print aufgerufen werden?
 
Vladislav Andruschenko:
Verzeihung, vielleicht verstehe ich das nicht, warum muss ich wichtige Funktionen im Druck aufrufen?

Es ist nicht verboten.

 
fxsaber:

Es ist nicht verboten.

Ich stimme zu.

Ich wollte nur wissen, was das soll?

Ich bin jetzt auf ein Problem gestoßen, wenn ich mehr als 1000 Geschäfte in der Historie habe und wenn ich die Funktion zur Verarbeitung der Historie aufrufe, um z.B. den Gewinn der Historie zu berechnen. + Ich weiß nicht, warum ich mich mit diesem Problem beschäftige. D.h. die Angebote kommen mit einer Verzögerung.

Grund der Beschwerde: