Fehler, Irrtümer, Fragen - Seite 100

 
Urain:

Gibt es einen erzwungenen Abbruch der Funktion OnTester()

oder warum der Verlauf der Transaktionen vor der benutzerdefinierten Funktion existiert und danach Null zurückgibt:

double OnTester()
  {
   int HTD=-1;
   Custom_func();
   if(HistorySelect(0,TimeCurrent()))HTD=HistoryDealsTotal();   
   return(HTD);
  }

Welche Funktionen funktionieren im Testgerät nicht?

Wie kann der Prüfer (während der Optimierung) nach außen signalisieren, dass etwas nicht stimmt (Warnungen drucken, nichts funktioniert)?

Anscheinend schlafen heute alle.
 
Urain:
Anscheinend schlafen heute alle noch.

Haben Sie sich die Agentenprotokolle angesehen, vielleicht ist dort alles vorhanden?

Soweit ich weiß, werden die Drucker nur während der Optimierung nicht im Hauptprotokoll des Testers angezeigt (im normalen Modus ist alles in Ordnung).

OnTester() kann meines Wissens nach nicht zwangsweise beendet werden. Und wozu? Es wird einfach ein bestimmtes Testergebnis berechnet (außerdem wird es im Wesentlichen nur zur Optimierung verwendet)?

OnTester:
Die Funktion OnTester() ist ein Tester-Ereignishandler, der automatisch am Ende des historischen Tests des Expert Advisors für ein bestimmtes Datumsintervall erzeugt wird. Die Funktion muss mit dem Typ double definiert werden, sie hat keine Parameter:

doubleOnTester();

Die Funktion wird unmittelbar vor OnDeinit() aufgerufen und hat den Rückgabetyp double. Die Funktion OnTester() kann nur von Experten während des Testens verwendet werden. Ihr Hauptzweck besteht darin, einen Wert zu berechnen, der als Custom max-Kriterium bei der genetischen Optimierung der Eingabeparameter verwendet wird.


PS

> Warum zeigt die Transaktionshistorie vor einer benutzerdefinierten Funktion, aber danach null an...

Vielleicht ist dies eine Frage an die Entwickler.

Soweit ich verstehe, muss OnTester die Anzahl der Abschlüsse zurückgeben (falls es welche gibt), während Custom_func() als benutzerdefinierte Funktion verstanden wird?

 
Urain:

Gewidmet den Entwicklern ...

Ihr hättet zumindest gewarnt, wenn ihr eine Gelegenheit gebt, die vorher prinzipiell nicht möglich war.

Ich habe vierundzwanzig Stunden damit verschwendet, diesen Fehler zu finden.

Natürlich weiß ich das, aber ich habe 24 Stunden vergeudet, nur weil ich mich daran gewöhnt habe, dass mit diesem

Ich bin es gewohnt, dass mir der Compiler einen Fehler anzeigt.

Was ist der richtige Weg, um das zu tun? Ist es "==" oder ist es "="?
 
Urain:

Gibt es einen erzwungenen Abbruch der Funktion OnTester()

oder warum der Verlauf der Transaktionen vor der benutzerdefinierten Funktion existiert und danach Null zurückgibt:

Welche Funktionen funktionieren im Testgerät nicht?

Wie kann man vom Tester (während der Optimierung) nach außen signalisieren, dass etwas nicht in Ordnung ist (druckt Warnungen, dass nichts funktioniert)?

Vielen Dank für Ihre Nachricht. Ihre Bewerbung ist bei uns eingegangen - wir bearbeiten sie gerade.

 

Wie berechne ich das maximal zulässige Lot nach Marge, um eine neue Position zu eröffnen? In MQL4 wurde dies wie folgt durchgeführt:

MaxLot=AccountFreeMargin()/MarketInfo(Symbol(),MODE_MARGINREQUIRED);
 
EvgeTrofi:

Wie berechne ich das maximal zulässige Lot nach Marge, um eine neue Position zu eröffnen? In MQL4 wurde das so gemacht:

Ungefähr so:

double CalculateMaxVolume(string symbol)
  {
   double price=0.0;
   double margin=0.0;
//--- select lot size
   if(!SymbolInfoDouble(symbol,SYMBOL_ASK,price))                return(0.0);
   if(!OrderCalcMargin(ORDER_TYPE_BUY,symbol,1.0,price,margin)) return(0.0);
   if(margin<=0.0)                                            return(0.0);

   double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_FREEMARGIN)/margin,2);
//--- normalize and check limits
   double stepvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP);
   lot=stepvol*NormalizeDouble(lot/stepvol,0);

   double minvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   if(lot<minvol) lot=minvol;

   double maxvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
   if(lot>maxvol) lot=maxvol;
//--- return trading volume
   return(lot);
  }
Dieser Code berechnet nicht nur das maximale Volumen, sondern passt es auch genau in die Grenzen der Symboleinstellungen.
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
  • www.mql5.com
Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте - Документация по MQL5
 
Renat:

Es geht ungefähr so:

Dieser Code berechnet nicht nur die maximale Lautstärke, sondern passt sie auch genau in die Grenzen der Zeicheneinstellung.
Ich danke Ihnen! Ich habe OrderCalcMargin() nicht in meiner Hilfe :)
 
EvgeTrofi:
Ich danke Ihnen! Ich habe OrderCalcMargin() nicht in meiner Hilfe :)
Diese Funktion wurde schon vor langer Zeit hinzugefügt - schauen Sie bitte in der Dokumentation nach.
 
EvgeTrofi:
Was ist also letztendlich der richtige Weg? Ist es "==" oder ist es "="?

So oder so.

if(a==0){Ausdruck} bedeutet, wenn a 0 ist, dann ist es wahr, also führen wir {Ausdruck} aus.

if(a=0){Ausdruck} ist gleich if(a){a=0;Ausdruck} wenn a wahr ist, {a=0;Ausdruck}.

 
Interesting:

Haben Sie sich die Agentenprotokolle angesehen, vielleicht ist dort alles vorhanden?

Soweit ich weiß, werden die Drucker nur während der Optimierung nicht im Hauptprotokoll des Testers angezeigt (im normalen Modus ist alles in Ordnung).

OnTester() kann meines Wissens nach nicht zwangsweise beendet werden. Und wozu, wenn es nur ein bestimmtes Testergebnis berechnet (außerdem wird es im Wesentlichen nur zur Optimierung verwendet)?

PS

> Warum existiert die Historie der Transaktionen vor einer benutzerdefinierten Funktion und gibt danach Null aus...

Vielleicht ist das ein Problem für die Entwickler.

Soweit ich verstanden habe, sollte OnTester die Anzahl der Geschäfte zurückgeben (wenn es welche gibt), während die benutzerdefinierte Funktion Custom_func() ist?

Das Problem ist, dass das Programm bei der Optimierung selbst nicht wie in anderen Situationen funktioniert (deshalb muss ich die Nachricht unter OnTester senden).

Zu diesem Zweck habe ich analog print erfunden (eine Funktion, die eine Datei erstellt, um eine Zeichenkette zu drucken, die der Funktion als Parameter übergeben wird).

int prints=0;// счётчик вызовов, должен быть обьявлен глобально
//+------------------------------------------------------------------+
//| вывод информации из под тестера                                  |
//+------------------------------------------------------------------+
void WriteFilePrint(string text,string folder="Print")
  {
   string subfolder="Print";
   int han=FileOpen(subfolder+"\\"+folder+(string)prints+".csv",FILE_WRITE|FILE_CSV,";");
   if(han!=INVALID_HANDLE)
     {
      FileWrite(han,text);
      FileClose(han);
     }
   else Print("File open failed"+subfolder+"\\"+folder+".txt, error",GetLastError());
   prints++;
  }

So ist es mir gelungen, die fehlerhafte Ausführung einiger Funktionen in OnTester abzufangen.