return value of 'OrderSend' should be checked

 

Hallo Zusammen


Ich arbeite mich gerade in die Programmiersprache MQL5 ein und stosse immer auf das gleiche Problem. Dieses Problem tritt bei allen Expert Advisors auf. Ob die nun selber geschrieben sind oder aus dem I-net / Buch herausgeschrieben, kopiert oder heruntergeladen.

return value of 'OrderSend' should be checked

dies ist die Standart Warnung im MetaEditor  und im Metatrader 5 tritt dieser Fehler auf:

error - 4756


Hat Jemand eine zündende Idee, was der Grund ist?

 

Hallo , 

 

 

du musst das Rückgabe Ergebniss der Ordersent Funktion auswerten . 

so wie in dieser gebauten Funktion :

 

 

bool BuyPositionOpen
(
bool &BUY_Signal,           // ôëàã ðàçðåøåíèÿ íà ñäåëêó
const string symbol,        // òîðãîâàÿ ïàðà ñäåëêè
const datetime &TimeLevel,  // âðåìÿ, ïîñëå êîòîðîãî áóäåò îñóùåñòâëåíà ñëåäóùàÿ ñäåëêà ïîñëå òåêóùåé
double Money_Management,    // MM
int Margin_Mode,            // ñïîñîá ðàñ÷¸òà âåëè÷èíû ëîòà
uint deviation,             // ñëèïïàæ
int StopLoss,               // ñòîïëîññ â ïóíêòàõ
int Takeprofit              // òåéêïðîôèò â ïóíêòàõ
)
//BuyPositionOpen(BUY_Signal,symbol,TimeLevel,Money_Management,deviation,Margin_Mode,StopLoss,Takeprofit);
  {
//----
   if(!BUY_Signal) return(true);

   ENUM_POSITION_TYPE PosType=POSITION_TYPE_BUY;
//---- Ïðîâåðêà íà èñòå÷åíèå âðåìåííîãî ëèìèòà äëÿ ïðåäûäóùåé ñäåëêè è ïîëíîòû îáú¸ìà
   if(!TradeTimeLevelCheck(symbol,PosType,TimeLevel)) return(true);

//---- Ïðîâåðêà íà íà íàëè÷èå îòêðûòîé ïîçèöèè
   if(PositionSelect(symbol)) return(true);

//----
   double volume=BuyLotCount(symbol,Money_Management,Margin_Mode,StopLoss,deviation);
   if(volume<=0)
     {
      Print(__FUNCTION__,"(): Íåâåðíûé îáú¸ì äëÿ ñòðóêòóðû òîðãîâîãî çàïðîñà");
      return(false);
     }

//---- Îáúÿâëåíèå ñòðóêòóð òîðãîâîãî çàïðîñà è ðåçóëüòàòà òîðãîâîãî çàïðîñà
   MqlTradeRequest request;
   MqlTradeResult result;
//---- Îáúÿâëåíèå ñòðóêòóðû ðåçóëüòàòà ïðîâåðêè òîðãîâîãî çàïðîñà
   MqlTradeCheckResult check;

//---- îáíóëåíèå ñòðóêòóð
   ZeroMemory(request);
   ZeroMemory(result);
   ZeroMemory(check);

   long digit;
   double point,Ask;
//----  
   if(!SymbolInfoInteger(symbol,SYMBOL_DIGITS,digit)) return(true);
   if(!SymbolInfoDouble(symbol,SYMBOL_POINT,point)) return(true);
   if(!SymbolInfoDouble(symbol,SYMBOL_ASK,Ask)) return(true);

//---- Èíèöèàëèçàöèÿ ñòðóêòóðû òîðãîâîãî çàïðîñà MqlTradeRequest äëÿ îòêðûâàíèÿ BUY ïîçèöèè
   request.type   = ORDER_TYPE_BUY;
   request.price  = Ask;
   request.action = TRADE_ACTION_DEAL;
   request.symbol = symbol;
   request.volume = volume;

//---- Îïðåäåëåíèå ðàññòîÿíèÿ äî ñòîïëîññà â åäèíèöàõ öåíîâîãî ãðàôèêà
   if(StopLoss)
     {
      if(!StopCorrect(symbol,StopLoss))return(false);
      double dStopLoss=StopLoss*point;
      request.sl=NormalizeDouble(request.price-dStopLoss,int(digit));
     }
   else request.sl=0.0;

//---- Îïðåäåëåíèå ðàññòîÿíèÿ äî òåéêïðîôèòà åäèíèöàõ öåíîâîãî ãðàôèêà
   if(Takeprofit)
     {
      if(!StopCorrect(symbol,Takeprofit))return(false);
      double dTakeprofit=Takeprofit*point;
      request.tp=NormalizeDouble(request.price+dTakeprofit,int(digit));
     }
   else request.tp=0.0;

//----
   request.deviation=deviation;
   request.type_filling=ORDER_FILLING_FOK;

//---- Ïðîâåðêà òîðãîâîãî çàïðîñà íà êîððåêòíîñòü
   if(!OrderCheck(request,check))
     {
      Print(__FUNCTION__,"(): Íåâåðíûå äàííûå äëÿ ñòðóêòóðû òîðãîâîãî çàïðîñà!");
      Print(__FUNCTION__,"(): OrderCheck(): ",ResultRetcodeDescription(check.retcode));
      return(false);
     }

   string comment="";
   StringConcatenate(comment,"<<< ============ ",__FUNCTION__,"(): Îòêðûâàåì Buy ïîçèöèþ ïî ",symbol," ============ >>>");
   Print(comment);

//---- Îòêðûâàåì BUY ïîçèöèþ è äåëàåì ïðîâåðêó ðåçóëüòàòà òîðãîâîãî çàïðîñà
   if(!OrderSend(request,result) || result.retcode!=TRADE_RETCODE_DONE)
     {
      Print(__FUNCTION__,"(): Íåâîçìîæíî ñîâåðøèòü ñäåëêó!");
      Print(__FUNCTION__,"(): OrderSend(): ",ResultRetcodeDescription(result.retcode));
      return(false);
     }
   else
   if(result.retcode==TRADE_RETCODE_DONE)
     {
      TradeTimeLevelSet(symbol,PosType,TimeLevel);
      BUY_Signal=false;
      comment="";
      StringConcatenate(comment,"<<< ============ ",__FUNCTION__,"(): Buy ïîçèöèÿ ïî ",symbol," îòêðûòà ============ >>>");
      Print(comment);
      PlaySound("ok.wav");
     }
   else
     {
      Print(__FUNCTION__,"(): Íåâîçìîæíî ñîâåðøèòü ñäåëêó!");
      Print(__FUNCTION__,"(): OrderSend(): ",ResultRetcodeDescription(result.retcode));
     }
//----
   return(true);
  }


 

 

Hi Christian


Ich mein, dieses gemacht zu haben, bzw. bei den kopierten EAs sollte das ja auch geschehen sein. Oder habe ich eine zu neue build Version beim MT5 und da hat sich wieder was dran geändert?

Hier ein beispiel von einem Autor, wo ich die Fehlermeldung erhalt:



//--- Putting all together

   if(Sell_Condition_1 && Sell_Condition_2)
     {
      if(Sell_Condition_3 && Sell_Condition_4)
        {
         // any opened Sell position?
         if(Sell_opened)
           {
            Alert("We already have a Sell position!!!");
            return;    // Don't open a new Sell Position
           }
         ZeroMemory(mrequest);
         mrequest.action=TRADE_ACTION_DEAL;                                // immediate order execution
         mrequest.price = NormalizeDouble(latest_price.bid,_Digits);           // latest Bid price
         mrequest.sl = NormalizeDouble(latest_price.bid + STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.bid - TKP*_Point,_Digits); // Take Profit
         mrequest.symbol = _Symbol;                                          // currency pair
         mrequest.volume = Lot;                                              // number of lots to trade
         mrequest.magic = EA_Magic;                                          // Order Magic Number
         mrequest.type= ORDER_TYPE_SELL;                                     // Sell Order
         mrequest.type_filling = ORDER_FILLING_FOK;                          // Order execution type
         mrequest.deviation=100;                                             // Deviation from current price
         //--- send order
         OrderSend(mrequest,mresult);
         // get the result code
         if(mresult.retcode==10009 || mresult.retcode==10008) //Request is completed or order placed
           {
            Alert("A Sell order has been successfully placed with Ticket#:",mresult.order,"!!");
           }
         else
           {
            Alert("The Sell order request could not be completed -error:",GetLastError());
            ResetLastError();
            return;
           }
        }
     }

 

Lesen hilft manchmal!

In der Dok. (markieren OrderSend(..) + F1) steht:

bool  OrderSend(...);
...
Return Value

In case of a successful basic check of structures (index checking) returns true. However, this is not a sign of successful execution of a trade operation. For a more detailed description of the function execution result, analyze the fields of result structure.

Also man muss nur diesen bool-Wert überprüfen:

if ( !OrdeSend(..) ) {  // ich hab kein mt5, daher nicht geprüft!!

    switch (mresult.retcode) {

        case ..: ...

Wäre wahrscheinlich auch schneller und hätte noch andere Vorteile..

 
opticus2404:

Hi Christian


Ich mein, dieses gemacht zu haben, bzw. bei den kopierten EAs sollte das ja auch geschehen sein. Oder habe ich eine zu neue build Version beim MT5 und da hat sich wieder was dran geändert?

Hier ein beispiel von einem Autor, wo ich die Fehlermeldung erhalt:



//--- Putting all together

   if(Sell_Condition_1 && Sell_Condition_2)
     {
      if(Sell_Condition_3 && Sell_Condition_4)
        {
         // any opened Sell position?
         if(Sell_opened)
           {
            Alert("We already have a Sell position!!!");
            return;    // Don't open a new Sell Position
           }
         ZeroMemory(mrequest);
         mrequest.action=TRADE_ACTION_DEAL;                                // immediate order execution
         mrequest.price = NormalizeDouble(latest_price.bid,_Digits);           // latest Bid price
         mrequest.sl = NormalizeDouble(latest_price.bid + STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.bid - TKP*_Point,_Digits); // Take Profit
         mrequest.symbol = _Symbol;                                          // currency pair
         mrequest.volume = Lot;                                              // number of lots to trade
         mrequest.magic = EA_Magic;                                          // Order Magic Number
         mrequest.type= ORDER_TYPE_SELL;                                     // Sell Order
         mrequest.type_filling = ORDER_FILLING_FOK;                          // Order execution type
         mrequest.deviation=100;                                             // Deviation from current price
         //--- send order
         OrderSend(mrequest,mresult);
         // get the result code
         if(mresult.retcode==10009 || mresult.retcode==10008) //Request is completed or order placed
           {
            Alert("A Sell order has been successfully placed with Ticket#:",mresult.order,"!!");
           }
         else
           {
            Alert("The Sell order request could not be completed -error:",GetLastError());
            ResetLastError();
            return;
           }
        }
     }

Das reicht nicht : 

         mrequest.deviation=100;                                             // Deviation from current price
         //--- send order
         OrderSend(mrequest,mresult);
         // get the result code

 Ordersend wird ungeprüft abgeschickt ....siehe Carls beitrag. 

Die Funktion von mir im ersten Post funktioniert ( aber nur in der kompletten Datei ! ) . Ich nutze die angepasst an meine Eas ... 

 

Nur so ein kleiner Tip:

Die Standard Library nimmt dir sehr viel Arbeit ab und ist auch gut dokumentiert.

#include <Trade\Trade.mqh>

und im Verzeichnis Scripts\Examples sind einige Beispiele, die aber für Beginner schwer zu verstehen sind, da sie OOP sind.
Ein sehr umfangreiches Beispiel ist in der Codebase 'TradePanel', ist aber besch... programmiert.
Einfach viel suchen.

Viel Erfolg

 

Ich scheine gerade einen Knoten im Kopf zu haben...


Danke Carl für deine Antwort, aber ich hätte ich die F1 Hilfe verstanden, hätte ich hier nicht geschrieben.

Nun fehlt mir die Logik, warum ich die Ordersend Funktion in eine IF Schleife einbauen sollte. Vielleicht kann mir Jemand bitte meinen Code korrekt umformulieren und anhand von diesem Beispiel mir kurz erklären, was da nun anders, bzw warum das dann nun korrekt ist? Das wäre mir eine grosse Hilfe!


Lieben Gruss


 
opticus2404:

Nun fehlt mir die Logik, warum ich die Ordersend Funktion in eine IF Schleife einbauen sollte.

Ist die Antwort true, könnte alles in Ordnung sein und Du kannst im 'true-branch' das Ergebnis beurteilen. Ist die Antworte false bist Du gleich in der richtigen 'branche' für eine Fehleranalyse.

Und es ist besserer Programierstil.

Grund der Beschwerde: