Diskussion zum Artikel "Bibliothek für ein leichtes und schnelles Entwickeln vom Programmen für den MetaTrader (Teil X): Kompatibilität mit MQL4" - Seite 2

 
fxsaber:

ZY Ich möchte auch in der Lage sein, Ihre Bibliothek in Virtual auszuführen. Zu diesem Zweck benötige ich Zugriff auf den MT4-ähnlichen Teil der Bibliothek.

Es ist mir gelungen, sie auszuführen.

#define  TESTER_CUSTOM // Ausführen des Expert Advisors im User Tester
#include <fxsaber\Tester\Tester.mqh> // https://www.mql5.com/de/code/24848

#include <IgorM\TradePanel_C#\TradePanel_C#.mqh> // https://www.mql5.com/de/code/24829

#include "TestDoEasyPart10.mq5" // https://www.mql5.com/de/articles/6767

D.h. das gesamte Ereignismodell der Bibliothek funktioniert auch in der virtuellen Umgebung.

 
fxsaber:

Ich habe eine Variante Ihrer Bibliothek geschickt, die im MT5 über Ihre MT4-Style-Logik funktioniert.

Der Punkt ist, dass plattformübergreifende Bibliotheken eine viel höhere Wahrscheinlichkeit der Arbeit in MQL4-Stil Teil der Bibliothek als in MQL5-Stil haben. Wenn ich plattformübergreifende Bibliotheken verwende, ziehe ich es daher vor, ihre Logik im MQL4-Stil in MT5 zu verwenden. Sie ist in MT5 viel zuverlässiger.


Ich denke, dass Ihre Logik im MQL5-Stil in MT5 lange braucht, um Fehler zu entdecken, während der MQL4-Stil zwar Fehler hat, aber nur eine minimale Anzahl und keine kritischen.

In dieser Bibliothek gibt es keine Aufteilung der Logik in MQL5 und MQL4. Sie arbeitet mit dem tatsächlichen Zustand und den tatsächlichen Änderungen des Zustands der Handelsumgebung. Reine MQL5-OnTradeXXX-Funktionen werden nicht verwendet - alles wird aus dem Zustand der Handelsumgebung übernommen. Das heißt, es handelt sich nicht um ein ereignisbasiertes Modell. Deshalb sage ich - die Logik ist die gleiche, die Implementierungen sind leicht unterschiedlich aufgrund der Unterschiede in den notwendigen Funktionen für die Arbeit mit der Umgebung.

In Ihrer Bibliothek ist alles der Portierung von MQL5-Stil auf MQL4-Stil untergeordnet, während hier - in dieser Bibliothek - eher das Gegenteil der Fall ist - MQL5-Stil (als flexibler) wird auf MQL4 portiert. So bietet die Bibliothek ein wenig mehr für MQL4 als die Standard-MQL4-Funktionen - zum Beispiel hat es eine ähnliche PositionID für MQL4, hier können Sie während der Arbeit (nicht bei der Berechnung der Geschichte) herausfinden, aus welcher Bestellung die Position erzeugt wurde. Leider gibt es keine Angebote für MQL4 - es gibt keine solchen Daten. Nun, oder ich habe nicht viel darüber nachgedacht....

Ausgehend von all dem oben Gesagten wiederhole ich - es gibt keine Unterteilung in zwei Stile - es ist für beide Plattformen das Gleiche. Daher verstehe ich nicht Ihren Wunsch, zweimal zu MQL4 konvertieren, was bereits konvertiert wurde.

 
Artyom Trishkin:

Auf der Grundlage all der oben genannten, wiederhole ich - es gibt keine Aufteilung in zwei Stile - es ist das gleiche für beide Plattformen. Daher verstehe ich Ihren Wunsch nicht, zweimal in MQL4 zu konvertieren, was bereits konvertiert wurde.

Das Missverständnis ist nur in der Terminologie. Ihre Bibliothek für MT4 ist ein Wrapper, der in MQL4 geschrieben ist. Dies ist MT4-Stil. Das ist der Teil, den ich brauchte. Tatsächlich habe ich es getan.

 
fxsaber:

Das Missverständnis liegt nur in der Terminologie. Ihre MT4-Bibliothek ist ein in MQL4 geschriebener Wrapper. Dies ist MT4-Stil. Das ist der Teil, den ich brauchte. Tatsächlich habe ich es getan.

Gut
 

Hallo Artem. ich habe Probleme mit dieser Bibliothek, ich versuche sie in MQL4 zu verwenden.

Gestern habe ich sie mit meinem EA im Tester verbunden und sogar Nachrichten über das Öffnen oder Schließen von Positionen erhalten. Aber heute habe ich das, was ich für den Tester hatte, auf einen neuen EA übertragen, ohne Schaltflächen zum Öffnen von Positionen, und ich versuche, eine Meldung über das Öffnen oder Schließen von Positionen zu erhalten, aber ich bekomme sie nicht. Und nach meinen Vorstellungen muss ich ein Ticket mit Position, Preis und Zeit bekommen. Ich konnte dies nicht einmal im Tester bekommen.

#property strict

#include <DoEasy\Engine.mqh>
CEngine        engine;

/*******************Expert initialization function*******************/
int OnInit()
{
   EventSetMillisecondTimer(100);
   return(INIT_SUCCEEDED);
}/*******************************************************************/

/************************Expert tick function************************/
void OnTick()
{
//--- Initialisierung des letzten Handelsereignisses
   static ENUM_TRADE_EVENT last_event=WRONG_VALUE;
//--- Wenn Sie im Prüfgerät arbeiten
   if(MQLInfoInteger(MQL_TESTER))
     {
      engine.OnTimer();
      //PressButtonsControl();
     }
//--- Wenn sich das letzte Handelsereignis geändert hat
   if(engine.LastTradeEvent()!=last_event)
     {
      last_event=engine.LastTradeEvent();
      Comment("last_event: ",EnumToString(last_event));
      Print(__FUNCTION__, " last_event: ",EnumToString(last_event));
      engine.ResetLastTradeEvent();
      //Drucken("letztes_Ereignis: ",EnumToString(letztes_Ereignis));
     }

}/*******************************************************************/

/***************************Timer function***************************/
void OnTimer()
{
//--- Initialisierung des letzten Handelsereignisses
   static ENUM_TRADE_EVENT last_event=WRONG_VALUE;
//--- Wenn Sie im Prüfgerät arbeiten
   if(MQLInfoInteger(MQL_TESTER))
     {
      engine.OnTimer();
      //PressButtonsControl();
     }
//--- Wenn sich das letzte Handelsereignis geändert hat
   if(engine.LastTradeEvent()!=last_event)
     {
      last_event=engine.LastTradeEvent();
      Comment("last_event: ",EnumToString(last_event));
      Print(__FUNCTION__, " last_event: ",EnumToString(last_event));
      engine.ResetLastTradeEvent();
      //Drucken("letztes_Ereignis: ",EnumToString(letztes_Ereignis));
     }
}/*******************************************************************/

void OnDeinit(const int reason)
{
 EventKillTimer();
 Comment("");
}/*******************************************************************/
Dateien:
00.mq4  5 kb
 

Und das Verblüffendste ist, dass ich jetzt meine Tastensonde auf die Karte gesetzt habe..... Es kommen keine Meldungen durch. Wenn ich ihn wieder in das Testgerät stecke, funktioniert alles.


ps; Ich habe es herausgefunden. Es ist notwendig, OnChartEvent mit benutzerdefinierten Ereignis zu aktivieren.

 
Alexey Viktorov:
Und das Verblüffendste ist, dass ich jetzt meine Sonde mit Tasten auf die Karte gesetzt habe..... Es kommen keine Meldungen durch. Ich habe es wieder in den Tester gesetzt, alles funktioniert.
Entfernen Sie alle Verweise auf den Timer aus dem EA - die Bibliothek erstellt einen eigenen Timer für ihn und arbeitet darin. Alles ist der Einfachheit und Bequemlichkeit halber gemacht.
 
Artyom Trishkin:
Entfernen Sie alle Verweise auf den Timer aus dem EA - die Bibliothek erstellt einen eigenen Timer für ihn und arbeitet darin. Alles ist der Einfachheit und Bequemlichkeit halber gemacht.

Entfernt den Timer, eingefügt OnChartEvent in dieser Form. Die Schaltflächensteuerung wird wahrscheinlich nicht benötigt, und das Benutzerereignis wird meiner Meinung nach irgendwo in den Weiten der Bibliothek erstellt. Aber ich habe nicht das Ergebnis erhalten.

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   //if(MQLInfoInteger(MQL_TESTER))
   // zurück;
   //if(id==CHARTEVENT_OBJECT_CLICK && StringFind(sparam, "BUTT_")>0)
   // {
   // PressButtonEvents(sparam);
   // }
   if(id>=CHARTEVENT_CUSTOM)
     {
      ushort event=ushort(id-CHARTEVENT_CUSTOM);
      Print(DFUN,"id=",id,", event=",EnumToString((ENUM_TRADE_EVENT)event),", lparam=",lparam,", dparam=",DoubleToString(dparam,Digits()),", sparam=",sparam);
     } 
  }
 
Alexey Viktorov:

Ich habe den Timer entfernt und OnChartEvent in dieses Formular eingefügt. Die Schaltflächensteuerung wird wahrscheinlich nicht benötigt, und das benutzerdefinierte Ereignis wird meiner Meinung nach irgendwo in den Weiten der Bibliothek erstellt. Aber ich habe nicht das Ergebnis erhalten.

Ich werde später ein Beispiel machen.
 

Artem, sagen Sie mir bitte, welche Rolle der hervorgehobene Codeabschnitt spielt

#property strict

#include <DoEasy\Engine.mqh>
CEngine        engine;

/*******************Expert initialization function*******************/
int OnInit()
{
   //EventSetMillisecondTimer(100);
   return(INIT_SUCCEEDED);
}/*******************************************************************/

/************************Expert tick function************************/
void OnTick()
{
//--- Initialisierung des letzten Handelsereignisses
   static ENUM_TRADE_EVENT last_event=WRONG_VALUE;
//--- Wenn Sie im Prüfgerät arbeiten
   if(MQLInfoInteger(MQL_TESTER))
     {
      engine.OnTimer();
     }
//--- Wenn sich das letzte Handelsereignis geändert hat
   if(engine.LastTradeEvent()!=last_event)
     {
      last_event=engine.LastTradeEvent();
      Comment("last_event: ",EnumToString(last_event));
      Print(__FUNCTION__, " last_event: ",EnumToString(last_event));
      //engine.ResetLastTradeEvent();
      //Drucken("letztes_Ereignis: ",EnumToString(letztes_Ereignis));
     }

}/*******************************************************************/

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   if(id>=CHARTEVENT_CUSTOM)
     {
      ushort event=ushort(id-CHARTEVENT_CUSTOM);
      Print(DFUN,"id=",id,", event=",EnumToString((ENUM_TRADE_EVENT)event),", lparam=",lparam,", dparam=",DoubleToString(dparam,Digits()),", sparam=",sparam);
     } 
  }

/***************************Timer function***************************/
void OnTimer()
{
//--- Initialisierung des letzten Handelsereignisses
   static ENUM_TRADE_EVENT last_event=WRONG_VALUE;
//--- Wenn Sie im Prüfgerät arbeiten
   if(!MQLInfoInteger(MQL_TESTER))
     {
      engine.OnTimer();
     }
}/*******************************************************************/

void OnDeinit(const int reason)
{
 //EventKillTimer();
 Comment("");
}/*******************************************************************/

Wie kann dieser Code ausgeführt werden, wenn der Timer nicht aktiviert ist?

Aber wenn dieser Codeabschnitt gelöscht wird, werden die Ereignismeldungen nicht gedruckt. Aber alles funktioniert mit ihm.

Und ich würde gerne ein Ticket, Preise und möglicherweise einige andere Eigenschaften von Positionen und Aufträgen zusammen mit der Ereignismeldung erhalten.