MT5 Klassen benutzen oder eigene Code

 

Wer findet eigenen Code benutzen auch besser als die Klassen zu importieren wo man nicht genau weis wie die aufgebaut sind?

Zum Beispiel benutze ich folgende Funktion um ein Trade zu oeffnen:

int OpenOrder(ENUM_ORDER_TYPE Typ, string symbol, double Lots, string Orderkommentar, int Magicnr)
  {
//---

  MqlTradeRequest request;
  MqlTradeResult  result;

  //--- zeroing the request and result values
  ZeroMemory(request);
  ZeroMemory(result);

  //---
  int DIGITS = (int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
  
  //--- setting the order parameters
  request.action     = TRADE_ACTION_DEAL;
  request.symbol     = symbol;
  request.volume     = Lots;
  request.magic      = Magicnr;
  request.sl         = 0;
  request.tp         = 0;
  request.deviation  = MaxSlippage;
  request.comment    = Orderkommentar;
  if(SymbolInfoInteger(Symbol(),SYMBOL_FILLING_MODE)==1)request.type_filling = ORDER_FILLING_FOK;
  if(SymbolInfoInteger(Symbol(),SYMBOL_FILLING_MODE)==2)request.type_filling = ORDER_FILLING_IOC;

  //--- set the order type
  if(Typ==ORDER_TYPE_BUY)
    {
      request.price = NormalizeDouble(SymbolInfoDouble(symbol,SYMBOL_ASK),DIGITS);
      request.type = ORDER_TYPE_BUY;
    }
  else 
  if(Typ==ORDER_TYPE_SELL)
    {
      request.price = NormalizeDouble(SymbolInfoDouble(symbol,SYMBOL_BID),DIGITS);
      request.type = ORDER_TYPE_SELL;
    }

   int sendok=0;
   //--- output information about the order send
   PrintFormat("Order Send #%I64d %s %s",symbol,EnumToString(Typ));

   //--- send the request
   if(!OrderSend(request,result))
   {
    int err=GetLastError();
    PrintFormat("Order Send error %d",err);  // if unable to send the request, output the error code
   }
   else sendok=1;

   //--- information about the order   
   PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
   if(result.retcode==10018)Alert(symbol+" Market Closed");
   //---

   return(sendok);
//----
  }

Es gibt aber auch die Moeglichkeit die Trade Klassen zu importieren mit "#include <Trade\Trade.mqh>" jedoch finde ich das es zu kompliziert aufgebaut ist wenn man die Klassen benutzt, aber falls diese Klassen irgendwelche Vorteile haben koennte ich mir vorstellen die zu benutzen, was sagt ihr dazu, was benutzt ihr lieber und warum?


Ich muss aber sagen hin und wieder macht mich MT5 kek, heute hat bei einem Backtest eine Funktion von mir aufeinmal immer die Fehlermeldung "wrong filling mode" ausgegeben aber als ich eben noch mal getestet habe funktioniert das aufeinmal wieder ohne das ich was geaendert habe am Code und ihr wist alle wie dumm sowas ist wenn etwas manchmal nicht funktioniert und dann doch wieder sowas unlogisches kommt irgendwie manchmal bei Metatrader Programmierungen vor oder habe ich nur den Eindruck? Ich weis das ich bei MT4 Programmierungen auch manchmal so Sachen hatte die aufeinmal ganze Zeit nicht mehr funktionierten und dann spaeter doch wieder.

Da kommt man deswegen manchmal auf die Idee diese Klassen von MT5 zu benutzen aber da fehlt mir der gute Durchblick und ich weis auch nicht ob die irgendwo diese Klassen mal gut erklaert haben wie jede Funktion benutzt wird.

 

Also ich habe mir eine zweite Trade.mqh in \Include mit anderem Namen erstellt (sonst könnte ein MQL5-Update alles von mir überschreiben) und als Erstes das Original eingebunden:

//+------------------------------------------------------------------+
//|                                                      TradeMy.mqh |
...

#include "Trade\Trade.mqh"

Damit habe kann ich das ganze Original verwenden und doch meine eigenen Vereinfachungen schreiben und so wie das Andere verwenden.

"wrong filling mode" Verwende den visual Mode und schreibe alle Parameer der Funktion ins Log (Print()) oder als Comment und schau warum das passiert.

Siehst Du hier könntest Du einfach die Org.-Funktion in Deine TradeMy.mqh kopieren, einen etwas anders Namen geben und Prints und Comments hineinschreiben..

 
Carl Schreiber #:

Also ich habe mir eine zweite Trade.mqh in \Include mit anderem Namen erstellt (sonst könnte ein MQL5-Update alles von mir überschreiben) und als Erstes das Original eingebunden:

Damit habe kann ich das ganze Original verwenden und doch meine eigenen Vereinfachungen schreiben und so wie das Andere verwenden.

"wrong filling mode" Verwende den visual Mode und schreibe alle Parameer der Funktion ins Log (Print()) oder als Comment und schau warum das passiert.

Siehst Du hier könntest Du einfach die Org.-Funktion in Deine TradeMy.mqh kopieren, einen etwas anders Namen geben und Prints und Comments hineinschreiben..

Das koennte ich mir auch vorstellen eigene Klassen zu bauen aber fuer mich sieht das immer so kompliziert aus irgendwelche Klassen zu benutzen die man nicht selbst gebaut hat, wenn man dann spaeter Fehler suchen muss weis man gar nicht wo man anfangen.

Und gestern war wieder so ein Fall wo ich dachte was der MT5 fuer ein Problem hat, eine Funktion fuer Trades oeffnen und eine fuer Trades schliesen haben im Prinzip die gleiche Filling Mode benutzt und beim schliesen des Trades kam die ganze Zeit die Fehlermeldung "wrong filling mode not supported" usw aber paar Stunden spaeter bei einen erneuten versuch hat es aufeinmal wieder funktioniert. Mit solchen Sachen kann man als programmierer dann nichts anfangen, weil das ist unlogisch.

 
Email Account #:

Das koennte ich mir auch vorstellen eigene Klassen zu bauen aber fuer mich sieht das immer so kompliziert aus irgendwelche Klassen zu benutzen die man nicht selbst gebaut hat, wenn man dann spaeter Fehler suchen muss weis man gar nicht wo man anfangen.

Und gestern war wieder so ein Fall wo ich dachte was der MT5 fuer ein Problem hat, eine Funktion fuer Trades oeffnen und eine fuer Trades schliesen haben im Prinzip die gleiche Filling Mode benutzt und beim schliesen des Trades kam die ganze Zeit die Fehlermeldung "wrong filling mode not supported" usw aber paar Stunden spaeter bei einen erneuten versuch hat es aufeinmal wieder funktioniert. Mit solchen Sachen kann man als programmierer dann nichts anfangen, weil das ist unlogisch.

Ohne Code und weitere Details kann ich zu dem Fehler nichts sagen.
 
Carl Schreiber #:
Ohne Code und weitere Details kann ich zu dem Fehler nichts sagen.

Das Problem ist ja das erst die Fehlermeldung kam "filling mode not supported" oder so aehnlich aber ohne das ich was am Code geaendert habe funktionierte es spaeter wieder nach einigen Neustarts des Metatraders und das ist das Problem eigentlich, das dort anscheinend manchmal etwas nicht funktioniert und dann doch wieder so weis man ja gar nicht wo man suchen soll. Seit gestern funktioniert das ja auch die ganze Zeit weiterhin, aber mich hat das gestern so gewundert, weil das so unlogisch war.

 
Email Account #:

Das Problem ist ja das erst die Fehlermeldung kam "filling mode not supported" oder so aehnlich aber ohne das ich was am Code geaendert habe funktionierte es spaeter wieder nach einigen Neustarts des Metatraders und das ist das Problem eigentlich, das dort anscheinend manchmal etwas nicht funktioniert und dann doch wieder so weis man ja gar nicht wo man suchen soll. Seit gestern funktioniert das ja auch die ganze Zeit weiterhin, aber mich hat das gestern so gewundert, weil das so unlogisch war.

Dann liegt es wohl an der Marksituation und Dein Code fängt Problemsituationen nicht ab, indem es diese ausdruckt oder als Kommentar anzeigt.
 
Carl Schreiber #:
Dann liegt es wohl an der Marksituation und Dein Code fängt Problemsituationen nicht ab, indem es diese ausdruckt oder als Kommentar anzeigt.

Das war im Backtest vorgekommen und die Fehlermeldung war wie gesagt etwas mit der Filling Mode und paar Stunden spaeter funktionierte es wieder.

 
Email Account #:

Das war im Backtest vorgekommen und die Fehlermeldung war wie gesagt etwas mit der Filling Mode und paar Stunden spaeter funktionierte es wieder.

der Backtest verwendet aber die aktuellen Einstellungen des Symbols. Wenn sich der Filling Mode von Brokerseite ändert, dann ändert sich das auch beim Backtest

 

Verzeih, aber lerne programmieren!

Hier setzt Du den Filling-Mode;

  if(SymbolInfoInteger(Symbol(),SYMBOL_FILLING_MODE)==1)request.type_filling = ORDER_FILLING_FOK;
  if(SymbolInfoInteger(Symbol(),SYMBOL_FILLING_MODE)==2)request.type_filling = ORDER_FILLING_IOC;

etwas später tritt hin und wieder der Fehler auf, das wäre es Standard(!) request und result auszudrucken.

Versuch es mal mit ArrayPrint(request) und ArrayPrint(result);

 
Carl Schreiber #:

Verzeih, aber lerne programmieren!

Hier setzt Du den Filling-Mode;

etwas später tritt hin und wieder der Fehler auf, das wäre es Standard(!) request und result auszudrucken.

Versuch es mal mit ArrayPrint(request) und ArrayPrint(result);

verwende statt den Zahlen halt mal 

SYMBOL_FILLING_FOK

oder

SYMBOL_FILLING_IOC


dann siehst du ob es am Value der nicht unbedingt richtig sein muss.


Sinnvoll wäre natürlich wir Carl sagt eine Fehlerabfrage, da kannst Du dann den Fehler und den Filling Mode des Symbols ausgeben

 
Email Account:

Wer findet eigenen Code benutzen auch besser als die Klassen zu importieren wo man nicht genau weis wie die aufgebaut sind?


Doch das weis man, der Code ist einsichtbar. Da kann man genau nachvollziehen was er macht