Fehler, Irrtümer, Fragen - Seite 119

 
Ich habe irgendwo in einem Forum gelesen, dass Kommentare während der Tests nicht in das Protokoll geschrieben werden (um Speicherplatz zu sparen). In diesem Zusammenhang lautet meine Frage: Wie kann ich das Programm im Tester debuggen? Ich habe printf und PrintFormat ausprobiert - nichts funktioniert im Tester, ich habe sogar Alert ausprobiert.
 
Scriptong:
Ich habe irgendwo in einem Forum gelesen, dass Kommentare während der Tests nicht in das Protokoll geschrieben werden (um Speicherplatz zu sparen). Meine Frage lautet also: Wie kann ich das Programm im Prüfprogramm debuggen? Ich habe printf und PrintFormat ausprobiert - nichts funktioniert im Tester, ich habe sogar Alert ausprobiert.
Schauen Sie sich die Protokolle von Testagenten an - dort steht alles drin, aber nur für lokale Agenten. Entfernte Agenten schreiben die Print()-Ausgabe aus Gründen der Informationssicherheit nicht in die Protokolle.
Документация по MQL5: Общие функции / Print
Документация по MQL5: Общие функции / Print
  • www.mql5.com
Общие функции / Print - Документация по MQL5
 

Geprüft. Mein Makler ist ein lokaler Makler (zumindest ist er unter "Lokal" aufgeführt). Nachdem der Expert Advisor im Modus"Every tick" ausgeführt wurde, stimmt der Inhalt der Registerkarte "Log" mit dem Inhalt der Agentenprotokolldatei überein (Expert Advisor und Protokolldateien im Anhang).

Ja, ich vergaß. Der Testzeitraum ist "Letzter Monat".

Dateien:
test.mq5  2 kb
 

In Ihrem Protokoll steht "Debug-Version von 'test.ex5', bitte neu kompilieren".

Das bedeutet, dass EX5, das zum Debuggen gedacht ist (das Drücken von F5 im Editor erzeugt EX5 mit Debugging-Informationen), nicht im Tester ausgeführt werden kann.

Wir werden eine automatische Neukompilierung solcher EAs vornehmen. In der Zwischenzeit sollten Sie Ihren EA manuell neu kompilieren.

 
alexvd:
Und Sie können den vollständigen Code mitbringen?

Und wahrscheinlich habe ich die ganze Sache heraufbeschworen, ich kann mir keinen anderen Grund vorstellen...

Ich werde versuchen, die Situation ausführlicher zu beschreiben.

Es gibt eine einfache Klasse "CMqlTimer", deren Aufgabe es ist, den Zeitpunkt des Wechsels von verschiedenen Zeitintervallen zu verfolgen: Stunde, Tag, Woche, Monat, Jahr.

Alles wird mit sehr einfachen Primitiven realisiert, zum Beispiel, wenn die Minuten gleich 0 sind, dann ist die "neue Stunde" gekommen; wenn die Nummer des Wochentages nicht mit der in der Variable gespeicherten übereinstimmt, dann ist der Tageswechsel ("00:00:00" nach Serverzeit) gekommen. Also weiter.

Die Analyse wird durchgeführt, wenn der Timer in CMqlTimer::OnTimer() im Abstand von 1 Sekunde ausgelöst wird. Wenn sich das Zeitintervall ändert, muss die Funktion ausgeführt werden. Wenn es zum Beispiel ein "neuer" Tag ist, sollte die Funktion CMqlTimer::OnRolloverDay() ausgeführt werden.


Wenn wir den Rest des Codes entfernen und nur OnRolloverDay() schreiben, sieht das Ergebnis wie folgt aus:

//Function CMqlTimer.OnRolloverDay
bool CMqlTimer::OnRolloverDay()
//Дневной ролловер
{
//----------------------------------------------------------------------------//
//Work variables
string MessageText; //Text for message
int    UserEventID; //Identifier of the user event  

bool Result; //Returned importance
//----------------------------------------------------------------------------//

Result = true;

ResetLastError();

RolloverCountDay = RolloverCountDay+1;

UserEventID = CHARTEVENT_CUSTOM+15;
MessageText = StringFormat("Rollover Day (№ %d)",RolloverCountDay); //Можно просто "Rollover Day"
//We refer user event of the work chart
EventChartCustom(0,(ushort)UserEventID-CHARTEVENT_CUSTOM,0,0,MessageText);

//Checking for presence of the errors
  if(_LastError!=0)
  //В результате работы произошла ошибка
  {
  Result = false;  
  }
//----------------------------------------------------------------------------//
return(Result);
//----------------------------------------------------------------------------//
}

Alle Benutzerereignisse werden aufgezeichnet und zur Bearbeitung an die Hauptklasse weitergegeben

Es sieht in etwa so aus

void OnChartEvent(const int id,         // идентификатор события  
                  const long& lparam,   // параметр события типа long
                  const double& dparam, // параметр события типа double
                  const string& sparam  // параметр события типа string
                  )
{
//----------------------------------------------------------------------------//
//Work variables
//----------------------------------------------------------------------------//

//----------------------------------------------------------------------------//
//                          Processing user events                            //
//----------------------------------------------------------------------------//
  if(id>CHARTEVENT_CUSTOM)
  //User event is received
  {
  Expert.OnEvent(id,lparam,dparam,sparam);
  }
//----------------------------------------------------------------------------//  
}

Daher erreichen die Ereignisse OnChartEvent im Testmodus nicht, d.h. der Expert Advisor kann ein mit EventChartCustom gesendetes Ereignis im Testmodus nicht verarbeiten. Überprüfen Sie dies, indem Sie alle Ereignisse im Protokoll anzeigen lassen.

PS

Das Interessanteste ist, dass die Demo alle Ereignisse zu erreichen, aber in der Tester ist die Arbeit verweigert.

Vor 319 funktionierte alles und im Tester wurden die Ereignisse erfolgreich verarbeitet. Ob es bei der letzten Version funktioniert hat, kann ich nicht sagen...

 
stringo:

In Ihrem Protokoll steht "Debug-Version von 'test.ex5', bitte neu kompilieren".

Das bedeutet, dass EX5, das zum Debuggen gedacht ist (das Drücken von F5 im Editor erzeugt EX5 mit Debugging-Informationen), nicht im Tester ausgeführt werden kann.

Wir werden eine automatische Neukompilierung solcher EAs vornehmen. In der Zwischenzeit sollten Sie Ihren EA manuell neu kompilieren.

Ich danke Ihnen. Ich wusste nicht, dass es einen Unterschied zwischen Dateien gibt, die man durch Drücken von F5 und F7 erhält.
 
Interesting:

Und wahrscheinlich habe ich die ganze Sache heraufbeschworen, ich kann mir keinen anderen Grund vorstellen...

Ich werde versuchen, die Situation ausführlicher zu beschreiben.

...
Ich danke Ihnen. Wir werden darüber nachdenken.
 

Ich verstehe nicht, was falsch ist, EA funktioniert im Tester ohne Fehler und in der Testmaschine des Veranstalters geht auch ohne Fehler.

Wenn ich es auf einem Demokonto ausführe, erhalte ich eine Fehlermeldung, wenn ich versuche, einen Auftrag zu eröffnen:

2010.09.06 13:26:50 Trades '101894' : fehlgeschlagener Sofortkauf 0.10 USDJPY bei 84.179 [Nicht unterstützter Füllmodus]
2010.09.06 13:26:45 Trades '101894' : fehlgeschlagener Sofortkauf 0.10 USDCAD bei 1.03689 [Nicht unterstützter Füllmodus]
2010.09.06 13:26:39 Trades '101894' : fehlgeschlagener Sofortkauf 0.10 USDJPY bei 84.174 [Nicht unterstützter Füllmodus]
2010.09.06 13:26:34 Trades '101894' : fehlgeschlagener Sofortkauf 0.10 USDCAD bei 1.03685 [Nicht unterstützter Füllmodus]
2010.09.06 13:26:28 Trades '101894' : fehlgeschlagener Sofortkauf 0.10 USDJPY bei 84.174 [Nicht unterstützter Füllmodus]
2010.09.06 13:26:23 Trades '101894' : fehlgeschlagener Sofortkauf 0.10 USDCAD bei 1.03688 [Nicht unterstützter Füllmodus]
2010.09.06 13:26:18 Trades '101894' : fehlgeschlagener Sofortkauf 0.10 USDJPY bei 84.181 [Nicht unterstützter Füllmodus]

SELL-Anfrage:

MqlTradeRequest request;
         request.action=TRADE_ACTION_DEAL;
         request.symbol=Symbol_[i];
         request.volume=volume_exe;
         request.price=SymbolInfoDouble(Symbol_[i], SYMBOL_BID);
         request.sl=0;
         request.tp=0;
         request.deviation=SymbolInfoInteger(Symbol_[i], SYMBOL_SPREAD)*2;
         request.type=ORDER_TYPE_SELL;
         request.type_filling=ORDER_FILLING_CANCEL

Antrag auf BUY:

MqlTradeRequest request;
         request.action=TRADE_ACTION_DEAL;
         request.symbol=Symbol_[i];
         request.volume=volume_exe;
         request.price=SymbolInfoDouble(Symbol_[i], SYMBOL_ASK);
         request.sl=0;
         request.tp=0;
         request.deviation=SymbolInfoInteger(Symbol_[i], SYMBOL_SPREAD)*2;
         request.type=ORDER_TYPE_BUY;
         request.type_filling=ORDER_FILLING_CANCEL;

OrderCheck findet keinen Fehler.


 

Ersetzte ORDER_FILLING_CANCEL-Abfrage durch ORDER_FILLING_AON-Abfrage, Experte arbeitet.

Aber das Problem bleibt, warum gibt es einen solchen Unterschied im Tester- und Serverbetrieb.


Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5
 

Was für ein Witz, wenn der Meisterschaftsserver in die andere Richtung geht.