Bibliotheken: MT4Orders - Seite 78

 

Ich habe diese Fehlerbehandlung in meiner Klasse durchgeführt

#property strict

#ifdef __MQL5__
#include <MQL4_To_MQL5.mqh> // https://www.mql5.com/de/code/16006
#endif // __MQL5__

#define GetLastError GetOrderError
// Muss nicht nur in MT5, sondern auch in MT4 vorhanden sein.
// https://www.mql5.com/ru/forum/93352/page19#comment_6730221
#include <MT4Orders.mqh>

#define  BUY     0
#define  SELL    1
#define  ALL    -1
#define  LAST    0
#define  NOMODY  -1
bool LogInfo=true;//Drucken ins Fehlerprotokoll
/*
Hier sind die Funktionen der Klasse für die Arbeit mit Aufträgen
*/

Am Ende der Klasse habe ich eine Funktion

//+-------------------------------------------------------------------------------------------------------------------+
//|| Umwandlung von Fehlern von MT5 nach MT4
//+-------------------------------------------------------------------------------------------------------------------+
int GetOrderError()
{
//int error=MT4ORDERS::LastTradeResult.retcode_external; // Gibt eigene Codes zurück
   int error=(int)MT4ORDERS::LastTradeResult.retcode; // Gibt Fehlercodes zurück, nachdem die Bestellung an den Server gesendet wurde
   if(LogInfo==true)Print("error MT5=",error);
   switch(error)
   {
   case 10016:
      error=130;//Falsche Füße
      break;
   case 10018:
      error=132;//Markt geschlossen
      break;
   case 10020:
      error=135;//Preis hat sich geändert
      break;
   case 136:
      error=136;//Keine Preise - kein Code im MT5
      break;
   case 10004:
      error=138;//Neue Preise
      break;
   case 145:
      error=145;//Modifikation ist verboten, weil die Order zu nahe am Markt ist - kein Code in MT5
      break;
   case 146:
      error=146;//Handels-Subsystem beschäftigt - kein Code in MT5
      break;
   default:
      error=error;//Unbeschriebener Fehler
   }
   return (error);
}
#undef GetLastError
 
Aleksey Vyazmikin #:

Die Fehlerbehandlung in meiner Klasse funktioniert folgendermaßen

Am Ende der Klasse habe ich eine Funktion

Keine schlechte Variante. Denken Sie nur daran, dass andere Fehlercodes nicht verfügbar sein werden.

Документация по MQL5: Константы, перечисления и структуры / Коды ошибок и предупреждений / Ошибки времени выполнения
Документация по MQL5: Константы, перечисления и структуры / Коды ошибок и предупреждений / Ошибки времени выполнения
  • www.mql5.com
Ошибки времени выполнения - Коды ошибок и предупреждений - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
fxsaber #:

Keine schlechte Option. Denken Sie nur daran, dass andere Fehlercodes nicht verfügbar sein werden.

Ich denke, diese Änderung gilt nur für den Code um meine Klasse herum, und danach schalte ich die #undef GetLastError-Ersetzung aus, und wenn ich es richtig verstehe, wird der Compiler GetLastError nicht mehr ersetzen, oder liege ich falsch?

 
Aleksey Vyazmikin #:

Es scheint, dass diese Änderung nur für den Code rund um meine Klasse gültig ist, und nachdem ich die Substitution #undef GetLastError ausschalten und, wenn ich richtig verstehe, wird der Compiler nicht GetLastError weiter ersetzen, oder bin ich falsch?

Sie haben recht. Ich habe nicht sofort verstanden, was du gemeint hast.

 
fxsaber #:

Sie haben Recht. Ich habe nicht sofort erkannt, was gemeint war.

Danke dafür! Jetzt muss ich es nur noch testen :)

 

Können Sie helfen, die Funktion zu entschlüsseln, weil alle diese Doppelpunkte und Fragezeichen - ich verstehe nicht.

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
double AccountFreeMarginCheck(const string Symb,const int Cmd,const double dVolume)
  {
   double Margin;

   return(::OrderCalcMargin((ENUM_ORDER_TYPE)Cmd, Symb, dVolume,
          ::SymbolInfoDouble(Symb,(Cmd==::ORDER_TYPE_BUY) ? ::SYMBOL_ASK : ::SYMBOL_BID),Margin) ?
          ::AccountInfoDouble(::ACCOUNT_MARGIN_FREE) - Margin : -1);
  }

Es gibt einen Wert kleiner als Null, mit Geld 9k Hebelwirkung 1k100 viel 0,01 - was ist falsch?

 

Druckt die Informationen in das Protokoll

/+------------------------------------------------------------------+
//|Überprüfen Sie, ob genug Geld vorhanden ist, um eine Bestellung zu eröffnen.
//+------------------------------------------------------------------+ 
bool CheckMoneyForTrade(double lots,int type)
  {
   string symb=Symbol();
   double free_margin=AccountFreeMarginCheck(symb,type,lots);

   double MarginAsk=0.0;
   bool MarginAskB=OrderCalcMargin(ENUM_ORDER_TYPE(type),Symbol(),lots,SymbolInfoDouble(Symbol(),SYMBOL_ASK),MarginAsk);
   double MarginBid=0.0;
   bool MarginBidB=OrderCalcMargin(ENUM_ORDER_TYPE(type),Symbol(),lots,SymbolInfoDouble(Symbol(),SYMBOL_BID),MarginBid);
   
   Print("ACCOUNT_MARGIN_FREE=",AccountInfoDouble(ACCOUNT_MARGIN_FREE),
   " SYMBOL_ASK=",SymbolInfoDouble(Symbol(),SYMBOL_ASK),
   " SYMBOL_BID=",SymbolInfoDouble(Symbol(),SYMBOL_BID),
   " OrderCalcMarginAsk=",MarginAsk,
   " OrderCalcMarginBid=",MarginBid, 
   " free_margin=",free_margin 
   );


   //-- wenn nicht genug Geld vorhanden ist
   if(free_margin<0)
     {
      string oper=(type==OP_BUY)? "Buy":"Sell";
      Print("Not enough money for ", oper," ",lots, " ", symb, " Error code=",GetLastError());
      return(false);
     }
     if(NewOrderAllowedVolume(Symbol())<(lots+0.1))return(false);//Prüfung auf verfügbare Kapazität
  
   //-- der Test war erfolgreich
   return(true);
  }

Im Prüfgerät:

2022.07.22 21:50:39.521 2009.12.04 14:30:00   ACCOUNT_MARGIN_FREE=999560.05 SYMBOL_ASK=89.63 SYMBOL_BID=89.6 OrderCalcMarginAsk=100.0 OrderCalcMarginBid=100.0 free_margin=999460.05

Im wirklichen Leben:

2022.07.22 21:45:08.956 Bingo_MT5 (USDJPY,M15)  ACCOUNT_MARGIN_FREE=9000.0 SYMBOL_ASK=136.267 SYMBOL_BID=136.241 OrderCalcMarginAsk=0.0 OrderCalcMarginBid=0.0 free_margin=-1.0
2022.07.22 21:45:08.956 Bingo_MT5 (USDJPY,M15)  Not enough money for Buy 0.0 USDJPY Error code=4002

Es scheint, dass die Berechnung nicht geschieht OrderCalcMargin() aus unbekannten Gründen - irgendwelche Ideen?

Fehler 4002 bedeutet:

Fehlerhafter Parameter im internen Aufruf der Client-Terminal-Funktion

Aber was es bedeutet, ist nicht klar....

 
Aleksey Vyazmikin #:

Können Sie mir helfen, die Funktion zu entschlüsseln, denn all diese Doppelpunkte und Fragezeichen verstehe ich nicht.

Sie verwenden eine uralte, eilig zusammengestellte Lösung.

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien.

Bibliotheken: MT4Orders

Aleksey Vyazmikin, 2022.07.21 11:58 AM

Made so mit Fehlern in meiner Klasse arbeiten

#ifdef __MQL5__
#include <MQL4_To_MQL5.mqh> // https://www.mql5.com/de/code/16006
#endif // __MQL5__
Viele Male bedauert, dass ich es gepostet, da es nichts mit MT4Orders zu tun hat. Es war nur eine Ergänzung zu den Beispielen. Ich kann mich nicht mehr an den Sinn erinnern. Ich möchte nicht näher darauf eingehen.


Ich habe mich daran erinnert, dass ich hier eine ausführlichere Lösung für die "Konvertierung" gemacht habe.

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Bibliotheken: MT4Orders

fxsaber, 2019.01.13 17:23 PM.

Kims Funktionen unter MT4 sind recht beliebt, daher habe ich alle Quellen von seiner Seite heruntergeladen und einen einfachen "Konverter" für sie unter MT5 geschrieben.
#include <KimIVToMT5.mqh> // https://c.mql5.com/3/263/KimIVToMT5.mqh

Ich selbst verwende MT4Style nur für die Orderfunktionen. Andere Standard-MT4-Funktionen konvertiere ich für meine Arbeit absolut nicht, und ich sehe diese Option als Krücke. Ich empfehle, Margin-Funktionen auf native Funktionen zu schreiben und nicht zu versuchen, sie zu konvertieren. Ich habe mir meinen Kurs über die Arbeit mit Margin angeschaut - eine anständig große mqh-Datei. Und das ist nur für reguläre Forex.

 
fxsaber #:

Sie verwenden eine uralte, hastig zusammengestellte Lösung.

Ich habe es oft bereut, sie zu posten, da sie nichts mit MT4Orders zu tun hat. Es war nur eine Ergänzung zu den Beispielen. Ich erinnere mich nicht mehr an den Sinn der Lösung. Ich habe keine Lust, mich damit zu befassen.


Ich habe mich daran erinnert, dass ich hier eine ausführlichere Lösung der "Umwandlung" gemacht habe.

Ich selbst verwende MT4Style nur bei Orderfunktionen. Andere MT4-Standardfunktionen konvertiere ich für meine Arbeit absolut nicht und sehe diese Möglichkeit als Krücke. Ich empfehle, Margin-Funktionen auf native Funktionen zu schreiben und nicht zu versuchen, sie zu konvertieren. Ich habe mir meinen Kurs über die Arbeit mit Margin angeschaut - eine anständig große mqh-Datei. Und das ist nur für reguläre Forex.

Ich hatte nur die Aufgabe, kompilierbaren Code für MT4 und MT5 auf den Funktionen der EA-Logik zu machen, und ich konvertierte das Zeug, das mit der Umgebung und der Arbeit mit Aufträgen zusammenhängt, mit Hilfe der oben erwähnten inkludniks, oder nahm separate Funktionen heraus und überarbeitete sie für jede Plattform. Das Projekt ist sehr umfangreich geworden, und Ihre Lösung hat mir sehr geholfen, vielen Dank für Ihre Arbeit.

Ich hatte noch einen weiteren Fehler - die minimale Losgröße wurde falsch bestimmt, also habe ich hier Flags hinzugefügt. Früher habe ich das Traversal ohne Berücksichtigung Ihres Codes gemacht (MQL4_To_MQL5.mqh ist nicht Ihr Code?) - es wurde kompiliert, funktionierte aber nicht richtig.

#define  MODE_BID 9
#define  MODE_ASK 10
#define  MODE_DIGITS 12
#define MODE_SPREAD 13
#define  MODE_STOPLEVEL 14
#define  MODE_LOTSIZE 15

#define  MODE_POINT 11
#define  MODE_TICKVALUE 16
#define  MODE_TICKSIZE 17

#define  MODE_MAXLOT 18
#define  MODE_MINLOT 19
#define  MODE_LOTSTEP 20

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
double MarketInfo(const string Symb,const int Type)
  {
   switch(Type)
     {
      case MODE_BID:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_BID));
      case MODE_ASK:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_ASK));
      case MODE_DIGITS:
         return((double)::SymbolInfoInteger(Symb, ::SYMBOL_DIGITS));
      case MODE_SPREAD:
         return((double)::SymbolInfoInteger(Symb, ::SYMBOL_SPREAD));
      case MODE_STOPLEVEL:
         return((double)::SymbolInfoInteger(Symb, ::SYMBOL_TRADE_STOPS_LEVEL));
      case MODE_LOTSIZE:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_TRADE_CONTRACT_SIZE));

      case MODE_POINT:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_POINT));
       case MODE_TICKVALUE:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_TRADE_TICK_SIZE));
      case MODE_TICKSIZE:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_TRADE_TICK_VALUE));                 
      case MODE_MAXLOT:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_VOLUME_MAX));  
      case MODE_MINLOT:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_VOLUME_MIN));  
      case MODE_LOTSTEP:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_VOLUME_STEP));                    
     }

   return(-1);
  }
 
Aleksey Vyazmikin #:

oder ist MQL4_To_MQL5.mqh nicht Ihr Code?

Es ist meine, aber es ist ziemlich alt. Es ist besser, in Kim's mqh schauen, gibt es eine ausgefeiltere Lösung für MarketInfo.