Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 41

 
Slawa:
Sie haben vergessen anzugeben, dass der Beginn der Messung am Anfang des ersten OnTick liegt. Das Ende der Messung liegt am Anfang von OnDeinit.
Oder beim Start von OnTester, denn
// После окончания бэктеста сначала вызывается OnTester, затем OnDeinit

Zum Thema

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Wanzen, Wanzen, Fragen

fxsaber, 2016.08.25 11:13

Lebenszyklus
// Возвращает true, если полностью выполнился OnTick() на последнее событие NewTick в тестере - окончание бэктеста. Иначе - false.
   static bool BACKTEST::IsEnding(void)
     {
      return(::TesterStatistics(STAT_BALANCEMIN) > 0);
     }
 
fxsaber:
Oder zu Beginn des OnTesters, als


Und geben Sie das Messergebnis als Rückgabecode von OnTester zurück
 
Slawa:
Und geben Sie das Messergebnis als Rückgabecode von OnTester zurück

Ich habeGetTickCount noch nichtin der Testversion getestet.Ich bin davon ausgegangen, dass diese Funktion vom Prüfer emuliert wird, was in manchen Situationen logisch sein kann.

Übrigens, wie kann man die aktuelle Zeit im Prüfgerät auf die nächsten ms genau verstehen? SymbolInfoTick+Tick.time_msc ermöglicht es Ihnen, den Zeitpunkt des OnTick-Aufrufs des Hauptsymbols zu ermitteln. Und so auch, um die Korrektheit des Schlupfmodus des Testers zu überprüfen. Aber es scheint keinen anderen Weg zu geben.


Eigentlich wollte ich nach etwas anderem fragen. Um einen Stapel in Optimierer mit Abwurf der ersten und letzten Werte zu automatisieren, sollte ich durch Frames handeln (OnTester-Ergebnis übergeben), oder es wird das Ergebnis verzerren?

 
GetTickCount im Testgerät funktioniert normal und wird nicht emuliert, im Gegensatz zu Sleep
 
fxsaber:

Eigentlich wollte ich nach etwas anderem fragen. Um die Bänke in der Optimierer mit Verwerfen der ersten und letzten Werte zu automatisieren, muss ich durch Frames handeln (um die OnTester-Ergebnis übergeben), oder wird es das Ergebnis verzerren?

Das sollte sie nicht. Sie wird nach der Messung gesendet. Versuchen Sie
 
Slava:
Verwenden Sie keinen Mikrosekunden-Timer für Massenmessungen. Verwenden Sie die reguläre Millisekunde GetTickCount.

VerlangsamtGetMicrosecondCount das Testgerät mehr als GetTickCount (oder wird es emuliert)?

Oder war der Ausfall von EventSetMillisecondTimer gemeint?

 
fxsaber:

Verlangsamt GetMicrosecondCount das Prüfgerät mehr als GetTickCount (oder wird es emuliert)?

Oder war der Ausfall von EventSetMillisecondTimer gemeint?

Ich meinte GetMicrosecondCount. Ich kann nicht mit Sicherheit sagen, ob es den Server verlangsamt. Sie kann eine indirekte Wirkung haben. Daher ist es besser, die systemeigene GetTickCount

GetMicrosecondCount wird verwendet, um kurze Zeiträume der Codeausführung zu messen. Um eine große Anzahl von OnTick-Ausführungen zu messen, ist es besser, GetTickCount zu verwenden.

Versuchen Sie, GetMicrosecondsCount anstelle von GetTickCount zu verwenden, wenn Sie stabile Ergebnisse erhalten. Sie werden mir hier davon erzählen. Vielleicht mache ich mir zu viele Gedanken darüber.

 
Es gibt zwei aktuelle Historientabellen, auf deren Daten über die Historienfunktionen zugegriffen werden kann - die Tabelle "Aufträge" und die Tabelle "Abschlüsse".

Ihr Inhalt kann nur durch HistorySelect-Funktionen beeinflusst werden. Und das geschieht folgendermaßen

  • HistorySelect und HistorySelectByPosition - betreffen beide Tabellen gleichzeitig.
  • Der HistoryDealSelect wirkt sich NUR auf die Tabelle Deals aus (hat keine Auswirkungen auf die aktuelle Tabelle Orders-history).
  • HistoryOrderSelect wirkt sich NUR auf die Tabelle Orders aus (nicht auf die aktuelle Tabelle Deals-history).

 
In Bestellungen ist es möglich, das Feld Request.expiration bis einschließlich LONG_MAX + 2 zu setzen. Sein Wert ist über ORDER_TIME_EXPIRATION vollständig verfügbar, wenn der Auftrag aktiv ist (nicht in der Historientabelle).
 
Der PositionIdentifier von Balance Trades ist Null. Daher ist es einfach, z. B. diese Funktion zu schreiben
// Возвращает сумму всех балансовых не торговых операций (начисления + списания)
double GetSumBalanceOperations( void )
{
  double Res = 0;
  
  if (HistorySelectByPosition(0))
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
      Res += HistoryDealGetDouble(HistoryDealGetTicket(i), DEAL_PROFIT);
      
  return(Res);
}

DEAL_ENTRY eines solchen Geschäfts ist DEAL_ENTRY_IN (0).