Ctrade - Seite 2

 

Irgendwie schwimmst Du auf einem falschen Dampfer:

  1. OrderSend() gibt true oder false zurück, damit man dann die Fehlerauswertung anwerfen kann!
  2. Was sagt das Log, welcher Fehler wurde ausgeworfen?
  3. Ich sehe nicht, dass Du nach OrderSend() irgendetwas auswertest??
 
Carl Schreiber:

Irgendwie schwimmst Du auf einem falschen Dampfer:

  1. OrderSend() gibt true oder false zurück, damit man dann die Fehlerauswertung anwerfen kann!
  2. Was sagt das Log, welcher Fehler wurde ausgeworfen?
  3. Ich sehe nicht, dass Du nach OrderSend() irgendetwas auswertest??

Ich will MqlTradeResult auswerten, und das gibt immer 0 zurück 

 
amando:

Ich will MqlTradeResult auswerten, und das gibt immer 0 zurück 

Mache bitte ein kleines Skript um dem Fehler zu demonstrieren.

Dann helfe ich.

 
amando:

Ich will MqlTradeResult auswerten, und das gibt immer 0 zurück 

Schau in die Doc: https://www.mql5.com/de/docs/trading/ordersend

//| Platziere eine Pending Order auf zufällige Weise                 |
//+------------------------------------------------------------------+
uint SendRandomPendingOrder(long const magic_number)
 { 
//--- bereite eine Anfrage vor
   MqlTradeRequest request={0};
   request.action=TRADE_ACTION_PENDING;         // Platzieren einer Pending Order 
   request.magic=magic_number;                  // ORDER_MAGIC
   request.symbol=_Symbol;                      // Instrument
   request.volume=0.1;                          // Volumen von 0.1 Lot
   request.sl=0;                                // Stop Loss nicht angegeben 
   request.tp=0;                                // Take Profit nicht angegeben     
//--- bilde den Ordertyp
   request.type=GetRandomType();                // Ordertyp
//--- bilde den Preis für die Pending Order
   request.price=GetRandomPrice(request.type);  // Eroeffnungspreis 
//--- sende eine Handelsanfrage
   MqlTradeResult result={0};
   OrderSend(request,result);
//--- die Antwort des Servers im Journal ausgeben  
   Print(__FUNCTION__,":",result.comment);
   if(result.retcode==10016) Print(result.bid,result.ask,result.price);
//--- den Antwort-Code des Handelsservers zurückgeben
   return result.retcode;
  }

Vor dem return result.retcode kannst Du alle Werte auslesen zB. result.deal /*dealnummer*/ oder result.order /*ticketnummer*/

Dokumentation zu MQL5: Handelsfunktionen / OrderSend
Dokumentation zu MQL5: Handelsfunktionen / OrderSend
  • www.mql5.com
[in,out] Pointer auf eine Struktur vom Typ MqlTradeResult, die das Ergebnis einer Handelsoperation beschreibt, wenn diese erfolgreich durchgeführt wurde (wenn true zurückgegeben wurde). Eine Handelsanfrage durchläuft mehrere Stufen der Prüfungen auf dem Handelsserver. Zunächst wird überprüft, ob alle benötigten Felder des Parameters korrekt...
 
Carl Schreiber:

Schau in die Doc: https://www.mql5.com/de/docs/trading/ordersend

Vor dem return result.retcode kannst Du alle Werte auslesen zB. result.deal /*dealnummer*/ oder result.order /*ticketnummer*/

Carl er arbeitet mit CTrade, dann musst du auch dabei bleiben.

 
Christian:

Carl er arbeitet mit CTrade, dann musst du auch dabei bleiben.

Arbeitet CTrade denn nicht mit OderSend() - gäbe es denn dazu eine Alternative?

Das was er braucht und sucht müsste also gleich bleiben?

 
Carl Schreiber:

Arbeitet CTrade denn nicht mit OderSend() - gäbe es denn dazu eine Alternative?

Das was er braucht und sucht müsste also gleich bleiben?

Doch schon nur man kommt mit der Funktion Ordersend() nicht mehr in Berührung.

Da alles mit OOP gekapselt ist.

Und das bool von OrderSend ist mit

  if(tick.ask<_priceBuy)
        {
         if(_trade.BuyStop(Lots,_priceBuy,_Symbol,SL_Neu,TP_Neu,ORDER_TIME_GTC,0,"BuyTrendLine "+_Symbol))
            Print(_trade.ResultOrder());
        }

ja abgefragt.Siehe:

if(_trade.BuyStop(Lots,_priceBuy,_Symbol,SL_Neu,TP_Neu,ORDER_TIME_GTC,0,"BuyTrendLine "+_Symbol))

_Trade ist das CTrade Objekt und BuyStop ist eine Methode von CTrade


Schau in die trade.mqh


Desweiteren sind die Strukturen:


   MqlTradeRequest   m_request;         // request data
   MqlTradeResult    m_result;          // result data
   MqlTradeCheckResult m_check_result;  // result check data

alle protected. Das heißt mit denen kommt man auch nicht in Berührung.

Einzig die Methoden und Member die public sind können benutzt werden. Siehe trade.mqh

Das ist ja das Konzept von OOP


Interessant sind denke ich die Methoden:

  ulong             ResultDeal(void)                      const { return(m_result.deal);               }
  ulong             ResultOrder(void)                     const { return(m_result.order);              }

Amando ist schon richtig.

Hier wäre aber ein Skript von ihm enorm hilfreich ......

 

Mögliche Methoden die public sind:

public:
                     CTrade(void);
                    ~CTrade(void);
   //--- methods of access to protected data
   void              LogLevel(const ENUM_LOG_LEVELS log_level)   { m_log_level=log_level;               }
   void              Request(MqlTradeRequest &request) const;
   ENUM_TRADE_REQUEST_ACTIONS RequestAction(void)          const { return(m_request.action);            }
   string            RequestActionDescription(void) const;
   ulong             RequestMagic(void)                    const { return(m_request.magic);             }
   ulong             RequestOrder(void)                    const { return(m_request.order);             }
   ulong             RequestPosition(void)                 const { return(m_request.position);          }
   ulong             RequestPositionBy(void)               const { return(m_request.position_by);       }
   string            RequestSymbol(void)                   const { return(m_request.symbol);            }
   double            RequestVolume(void)                   const { return(m_request.volume);            }
   double            RequestPrice(void)                    const { return(m_request.price);             }
   double            RequestStopLimit(void)                const { return(m_request.stoplimit);         }
   double            RequestSL(void)                       const { return(m_request.sl);                }
   double            RequestTP(void)                       const { return(m_request.tp);                }
   ulong             RequestDeviation(void)                const { return(m_request.deviation);         }
   ENUM_ORDER_TYPE   RequestType(void)                     const { return(m_request.type);              }
   string            RequestTypeDescription(void) const;
   ENUM_ORDER_TYPE_FILLING RequestTypeFilling(void)        const { return(m_request.type_filling);      }
   string            RequestTypeFillingDescription(void) const;
   ENUM_ORDER_TYPE_TIME RequestTypeTime(void)              const { return(m_request.type_time);         }
   string            RequestTypeTimeDescription(void) const;
   datetime          RequestExpiration(void)               const { return(m_request.expiration);        }
   string            RequestComment(void)                  const { return(m_request.comment);           }
   //---
   void              Result(MqlTradeResult &result) const;
   uint              ResultRetcode(void)                   const { return(m_result.retcode);            }
   string            ResultRetcodeDescription(void) const;
   int               ResultRetcodeExternal(void)           const { return(m_result.retcode_external);   }
   ulong             ResultDeal(void)                      const { return(m_result.deal);               }
   ulong             ResultOrder(void)                     const { return(m_result.order);              }
   double            ResultVolume(void)                    const { return(m_result.volume);             }
   double            ResultPrice(void)                     const { return(m_result.price);              }
   double            ResultBid(void)                       const { return(m_result.bid);                }
   double            ResultAsk(void)                       const { return(m_result.ask);                }
   string            ResultComment(void)                   const { return(m_result.comment);            }
   //---
   void              CheckResult(MqlTradeCheckResult &check_result) const;
   uint              CheckResultRetcode(void)              const { return(m_check_result.retcode);      }
   string            CheckResultRetcodeDescription(void) const;
   double            CheckResultBalance(void)              const { return(m_check_result.balance);      }
   double            CheckResultEquity(void)               const { return(m_check_result.equity);       }
   double            CheckResultProfit(void)               const { return(m_check_result.profit);       }
   double            CheckResultMargin(void)               const { return(m_check_result.margin);       }
   double            CheckResultMarginFree(void)           const { return(m_check_result.margin_free);  }
   double            CheckResultMarginLevel(void)          const { return(m_check_result.margin_level); }
   string            CheckResultComment(void)              const { return(m_check_result.comment);      }
   //--- trade methods
   void              SetAsyncMode(const bool mode)               { m_async_mode=mode;                   }
   void              SetExpertMagicNumber(const ulong magic)     { m_magic=magic;                       }
   void              SetDeviationInPoints(const ulong deviation) { m_deviation=deviation;               }
   void              SetTypeFilling(const ENUM_ORDER_TYPE_FILLING filling) { m_type_filling=filling;    }
   bool              SetTypeFillingBySymbol(const string symbol);
   void              SetMarginMode(void) { m_margin_mode=(ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE); }
   //--- methods for working with positions
   bool              PositionOpen(const string symbol,const ENUM_ORDER_TYPE order_type,const double volume,
                                  const double price,const double sl,const double tp,const string comment="");
   bool              PositionModify(const string symbol,const double sl,const double tp);
   bool              PositionModify(const ulong ticket,const double sl,const double tp);
   bool              PositionClose(const string symbol,const ulong deviation=ULONG_MAX);
   bool              PositionClose(const ulong ticket,const ulong deviation=ULONG_MAX);
   bool              PositionCloseBy(const ulong ticket,const ulong ticket_by);
   bool              PositionClosePartial(const string symbol,const double volume,const ulong deviation=ULONG_MAX);
   bool              PositionClosePartial(const ulong ticket,const double volume,const ulong deviation=ULONG_MAX);
   //--- methods for working with pending orders
   bool              OrderOpen(const string symbol,const ENUM_ORDER_TYPE order_type,const double volume,
                               const double limit_price,const double price,const double sl,const double tp,
                               ENUM_ORDER_TYPE_TIME type_time=ORDER_TIME_GTC,const datetime expiration=0,
                               const string comment="");
   bool              OrderModify(const ulong ticket,const double price,const double sl,const double tp,
                                 const ENUM_ORDER_TYPE_TIME type_time,const datetime expiration,const double stoplimit=0.0);
   bool              OrderDelete(const ulong ticket);
   //--- additions methods
   bool              Buy(const double volume,const string symbol=NULL,double price=0.0,const double sl=0.0,const double tp=0.0,const string comment="");
   bool              Sell(const double volume,const string symbol=NULL,double price=0.0,const double sl=0.0,const double tp=0.0,const string comment="");
   bool              BuyLimit(const double volume,const double price,const string symbol=NULL,const double sl=0.0,const double tp=0.0,
                              const ENUM_ORDER_TYPE_TIME type_time=ORDER_TIME_GTC,const datetime expiration=0,const string comment="");
   bool              BuyStop(const double volume,const double price,const string symbol=NULL,const double sl=0.0,const double tp=0.0,
                             const ENUM_ORDER_TYPE_TIME type_time=ORDER_TIME_GTC,const datetime expiration=0,const string comment="");
   bool              SellLimit(const double volume,const double price,const string symbol=NULL,const double sl=0.0,const double tp=0.0,
                               const ENUM_ORDER_TYPE_TIME type_time=ORDER_TIME_GTC,const datetime expiration=0,const string comment="");
   bool              SellStop(const double volume,const double price,const string symbol=NULL,const double sl=0.0,const double tp=0.0,
                              const ENUM_ORDER_TYPE_TIME type_time=ORDER_TIME_GTC,const datetime expiration=0,const string comment="");
   //--- method check
   virtual double    CheckVolume(const string symbol,double volume,double price,ENUM_ORDER_TYPE order_type);
   virtual bool      OrderCheck(const MqlTradeRequest &request,MqlTradeCheckResult &check_result);
   virtual bool      OrderSend(const MqlTradeRequest &request,MqlTradeResult &result);
   //--- info methods
   void              PrintRequest(void) const;
   void              PrintResult(void) const;
   //--- positions
   string            FormatPositionType(string &str,const uint type) const;
   //--- orders
   string            FormatOrderType(string &str,const uint type) const;
   string            FormatOrderStatus(string &str,const uint status) const;
   string            FormatOrderTypeFilling(string &str,const uint type) const;
   string            FormatOrderTypeTime(string &str,const uint type) const;
   string            FormatOrderPrice(string &str,const double price_order,const double price_trigger,const uint digits) const;
   //--- trade request
   string            FormatRequest(string &str,const MqlTradeRequest &request) const;
   string            FormatRequestResult(string &str,const MqlTradeRequest &request,const MqlTradeResult &result) const;
 

Da würde ich doch entscheiden dass CTrade vielleicht ganz nett ist, aber wenn gleich zB. die Ticketnummer brauche vielleicht ungeeignet ist?

Mann kann ja mit viel weniger Aufwand an (OOP-) Code gleich direkt mit den Strukturen m_request und m_result arbeiten. Nur weil es OOP ist, heißt das ja nicht, das es überlegen ist.

Oder man leitet ein neue Klasse ab und schreibt eine Methode, die die Ticketnummer zurückgibt. Das ist ja ein Vorteil von OOP.

 

Ich denke Amando muss sich auch mit den anderen Klassen befassen die es noch dazu gibt.

COrderInfo

CPositionInfo

CDealInfo

Um an die gewünschten Infos zu kommen. Habe mich selber noch nie so tief mit CTrade und Konsorten beschäftigt aber CTrade ist eigentlich nur dazu da die "Order" an den Server zu bringen.

Für Infos stehen die anderen Klassen zur Verfügung. Wie der Name ja selbsterklärt.

MQ hat ja noch viele Baustellen auch in den Klassen wie gerade beschrieben.


Artyom Trishkin benutzt dieses sehr viel in seinen Artikeln

Und diese sind sehr gut lesbar ....Dank an ihn hier noch mal !!


https://www.mql5.com/de/forum/316596

Dort mal den EA näher ansehen wie es genau benutzt wird.

Diskussion zum Artikel "Bibliothek für ein leichtes und schnelles Entwickeln vom Programmen für den MetaTrader (Teil V)."
Diskussion zum Artikel "Bibliothek für ein leichtes und schnelles Entwickeln vom Programmen für den MetaTrader (Teil V)."
  • 2019.06.26
  • www.mql5.com
Neuer Artikel Bibliothek für ein leichtes und schnelles Entwickeln vom Programmen für den MetaTrader (Teil V...
Grund der Beschwerde: