retcode=10013 deal=0 order=0 OrderSend error 4756 failed prices for GBPUSD 0 [Invalid request] bei Position Modify via MQLRequest - Seite 2

 

Dein sl und tp stimmt nicht, solange beim order senden da 300 und 600 steht wird das nix

du hast deinen neuen sl und multiplizierst ihn dann bei der position odify noch mal mit _Point?

was hast du vor?

 Venerell hast du das problem schon vorher, weil zum order odify kommst du gar nicht, weil sl und tp beim order send nicht stimmen

 

Du musst den Namen der Variablen angeben, nicht den Typ, also NewStopLoss und nicht double.

Deine Sl und TP musst Du von Punkten 900 in Preise umrechnen 900.0*_Point - aber wie so etwas lege artis gemacht wird, findest ganz schnell in den Beispielen des Terminals auf Deinem PC: ..\Experts\Examples\MACD

 
amando:

Dein sl und tp stimmt nicht, solange beim order senden da 300 und 600 steht wird das nix

du hast deinen neuen sl und multiplizierst ihn dann bei der position odify noch mal mit _Point?

was hast du vor?

 Venerell hast du das problem schon vorher, weil zum order odify kommst du gar nicht, weil sl und tp beim order send nicht stimmen

double NewStopLoss=NormalizeDouble(ask-sl*_Point,_Digits);
stimmt da is der ja berechnet... so muss ich das ja nicht mehr bei m request.tp machen...
 
Carl Schreiber:

Du musst den Namen der Variablen angeben, nicht den Typ, also NewStopLoss und nicht double.

Deine Sl und TP musst Du von Punkten 900 in Preise umrechnen 900.0*_Point - aber wie so etwas lege artis gemacht wird, findest ganz schnell in den Beispielen des Terminals auf Deinem PC: ..\Experts\Examples\MACD

Das Umrechnen in preise mach ich ja hier :

double NewStopLoss=NormalizeDouble(ask-sl*_Point,_Digits);

So hab paar Änderungen vorgenommen. Newsl wird ja vorher berechnent daher wir der jetzt einfach übergeben. Takeprofit wird jetzt aus der bestehenden Position ausgelesen und ebenfalls übergeben.

void CheckTrailingStopAsk(double ask, int sl, int ts, int tp,ulong Magic)
  {
//--- die Anfrage und das Ergebnis deklarieren und initialisieren
   MqlTradeRequest request= {0};
   MqlTradeResult  result= {0};
   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      ulong PositionTicket=PositionGetTicket(i);
      string mSymbol=PositionGetString(POSITION_SYMBOL);
      PositionSelectByTicket(PositionTicket);

      double NewStopLoss=NormalizeDouble(ask-sl*_Point,_Digits);
      string symbol=PositionGetSymbol(POSITION_SYMBOL);
      double PrevStopLoss=PositionGetDouble(POSITION_SL);
      double PositionTakeProfit=PositionGetDouble(POSITION_TP);
      double PositionPreis=NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN),_Digits);
      ulong Positionmagic=PositionGetInteger(POSITION_MAGIC);
      string Kommentar=PositionGetString(POSITION_COMMENT);
      int Digit=SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);
      double Volumen=PositionGetDouble(POSITION_VOLUME);

      Comment("\n nsl: ",NewStopLoss,
              "\n tp: ",PositionTakeProfit
             );

      ENUM_ORDER_TYPE type=(ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE);

      if((Positionmagic==Magic) && (PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY))
        {
         PrintFormat("#%I64u %s  %s  %.2f  %s  sl: %s  tp: %s [%I64d]",
                     PositionTicket,
                     mSymbol,
                     EnumToString(type),
                     Volumen,
                     DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN),Digit),
                     DoubleToString(PrevStopLoss,Digit),
                     DoubleToString(PositionTakeProfit,Digit),
                     Positionmagic);

         if(PrevStopLoss<NewStopLoss)
           {
            request.action=TRADE_ACTION_MODIFY;
            request.position=PositionTicket;
            request.sl=NewStopLoss;
            request.tp=PositionTakeProfit;
            request.magic=Positionmagic;
            request.comment=Kommentar;
            request.deviation=5;
            PrevStopLoss=NewStopLoss;
           }
         //--- Anfrage senden
         if(!OrderSend(request,result))
            PrintFormat("OrderSend error %d",GetLastError());  // wenn die Anfrage konnte nicht gesendet werden, den Fehlercode anzeigen
         //--- Details zur Transaktion
         PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
         //--- die Werte der Anfrage und des Ergebnisses auf Null setzen
         ZeroMemory(request);
         ZeroMemory(result);

        }
     }
  }

Jetzt bekomme ich im Journal schon  etwas andere Meldungen:

2021.04.05 00:05:57.135    2021.01.04 00:20:02   #2 GBPUSD  ORDER_TYPE_BUY  0.01  1.36581  sl: 1.36281  tp: 1.37481 [123476556987]
2021.04.05 00:05:57.135    2021.01.04 00:20:02   failed prices for GBPUSD 0 [Invalid request]
2021.04.05 00:05:57.135    2021.01.04 00:20:02   OrderSend error 4756
2021.04.05 00:05:57.135    2021.01.04 00:20:02   retcode=10013  deal=0  order=0

PrevStopLoss=NewStopLoss;
kann ich eigentlich raus nehmen da der doch die Position ändert und später via PositionGetDouble ja neu ausliest...
 
Aleksi-Trader:

Das Umrechnen in preise mach ich ja hier :

So hab paar Änderungen vorgenommen. Newsl wird ja vorher berechnent daher wir der jetzt einfach übergeben. Takeprofit wird jetzt aus der bestehenden Position ausgelesen und ebenfalls übergeben.

Jetzt bekomme ich im Journal schon  etwas andere Meldungen:

2021.04.05 00:05:57.135    2021.01.04 00:20:02   #2 GBPUSD  ORDER_TYPE_BUY  0.01  1.36581  sl: 1.36281  tp: 1.37481 [123476556987]
2021.04.05 00:05:57.135    2021.01.04 00:20:02   failed prices for GBPUSD 0 [Invalid request]
2021.04.05 00:05:57.135    2021.01.04 00:20:02   OrderSend error 4756
2021.04.05 00:05:57.135    2021.01.04 00:20:02   retcode=10013  deal=0  order=0

kann ich eigentlich raus nehmen da der doch die Position ändert und später via PositionGetDouble ja neu ausliest...

Du bist da falsch, das problem ist ja beim order setzen nicht beim modify

 
amando:

Du bist da falsch, das problem ist ja beim order setzen nicht beim modify

Also folglich an der stelle,

   if(PositionsTotal()<1)
     {
      MqlTradeRequest myrequest;
      MqlTradeResult myresult;
      ZeroMemory(myrequest);
      myrequest.action = TRADE_ACTION_DEAL;
      myrequest.type = ORDER_TYPE_BUY;
      myrequest.symbol = _Symbol;
      myrequest.volume = 0.01;
      myrequest.type_filling = ORDER_FILLING_FOK;
      myrequest.price = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
      myrequest.tp = ask +tp * _Point;
      myrequest.sl = ask -sl * _Point;
      myrequest.deviation =5;
      myrequest.comment ="Mein Hund frisst gern Kuchen";
      myrequest.magic=Magic;
      OrderSend(myrequest,myresult);
     }

tp, sl rechne ich doch aber so um zu einer Preisangabe.

myrequest.tp = ask +tp * _Point;
 
Aleksi-Trader:

Also folglich an der stelle,

tp, sl rechne ich doch aber so um zu einer Preisangabe.

Probiers mal mit dem debugger wo er sich aufhängt


und schau dir mal das beispiel in der doku an

https://www.mql5.com/de/docs/constants/tradingconstants/enum_trade_request_actions

Dokumentation zu MQL5: Konstanten, Enumerationen und Strukturen / Handelskonstanten / Typen der Handelsoperationen
Dokumentation zu MQL5: Konstanten, Enumerationen und Strukturen / Handelskonstanten / Typen der Handelsoperationen
  • www.mql5.com
Typen der Handelsoperationen - Handelskonstanten - Konstanten, Enumerationen und Strukturen - Nachschlagewerk MQL5 - Nachschlagewerk über die Sprache des algothitmischen/automatischen Handels für MetaTrader 5
 
amando:

Probiers mal mit dem debugger wo er sich aufhängt


und schau dir mal das beispiel in der doku an

https://www.mql5.com/de/docs/constants/tradingconstants/enum_trade_request_actions

das ist es ja, da hängt nix... Position wird erstellt ohne irgend welche Fehler.

2021.04.05 20:49:59.146    GBPUSD,H1: testing of Experts\Advisors\Request Trailingstop.ex5 from 2021.01.01 00:00 to 2021.04.03 00:00 started
2021.04.05 20:50:13.552    2021.01.04 00:00:02   market buy 0.01 GBPUSD sl: 1.36281 tp: 1.37481 (1.36474 / 1.36581 / 1.36474)
2021.04.05 20:50:13.552    2021.01.04 00:00:02   deal #2 buy 0.01 GBPUSD at 1.36581 done (based on order #2)
2021.04.05 20:50:13.552    2021.01.04 00:00:02   deal performed [#2 buy 0.01 GBPUSD at 1.36581]
2021.04.05 20:50:13.552    2021.01.04 00:00:02   order performed buy 0.01 at 1.36581 [#2 buy 0.01 GBPUSD at 1.36581]

der fehler kommt erst sobald er im Modify ist

 
Aleksi-Trader:

das ist es ja, da hängt nix... Position wird erstellt ohne irgend welche Fehler.

2021.04.05 20:49:59.146    GBPUSD,H1: testing of Experts\Advisors\Request Trailingstop.ex5 from 2021.01.01 00:00 to 2021.04.03 00:00 started
2021.04.05 20:50:13.552    2021.01.04 00:00:02   market buy 0.01 GBPUSD sl: 1.36281 tp: 1.37481 (1.36474 / 1.36581 / 1.36474)
2021.04.05 20:50:13.552    2021.01.04 00:00:02   deal #2 buy 0.01 GBPUSD at 1.36581 done (based on order #2)
2021.04.05 20:50:13.552    2021.01.04 00:00:02   deal performed [#2 buy 0.01 GBPUSD at 1.36581]
2021.04.05 20:50:13.552    2021.01.04 00:00:02   order performed buy 0.01 at 1.36581 [#2 buy 0.01 GBPUSD at 1.36581]

der fehler kommt erst sobald er im Modify ist

Sorry, aber entweder du beschneidest die screenshots oder du verstehst es nicht. Bei den vorigen screenshots war der fehler beim setzen der order

in dem screenshot geht die order durch

jetzt hast scheinbar das problem mit order setzen gelöst, jetzt kannst den nächsten schritt machen

 
amando:

Sorry, aber entweder du beschneidest die screenshots oder du verstehst es nicht. Bei den vorigen screenshots war der fehler beim setzen der order

in dem screenshot geht die order durch

jetzt hast scheinbar das problem mit order setzen gelöst, jetzt kannst den nächsten schritt machen

Kannst ja mal schauen was das Programm bei dir macht. Wahrscheinlicher ist das ich langsam aber sicher nicht durchblicke.

#property copyright ""
#property link      "https://www.mql5.com"
#property version   "1.00"
#include <Trade\Trade.mqh>
//#include "MoneyRiskmanagement.mq5"
// Erstelle eine Instanz von CTrade
CTrade Trade;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
   double bid=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
//---
   int tp=900;
   int sl=300;
   int ts=50;
   ulong Magic=123476556987;

   if(PositionsTotal()<1)
     {
      MqlTradeRequest myrequest;
      MqlTradeResult myresult;
      ZeroMemory(myrequest);
      myrequest.action = TRADE_ACTION_DEAL;
      myrequest.type = ORDER_TYPE_BUY;
      myrequest.symbol = _Symbol;
      myrequest.volume = 0.01;
      myrequest.type_filling = ORDER_FILLING_FOK;
      myrequest.price = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
      myrequest.tp = ask +tp * _Point;
      myrequest.sl = ask -sl * _Point;
      myrequest.deviation =5;
      myrequest.comment ="Mein Hund frisst gern Kuchen";
      myrequest.magic=Magic;
      OrderSend(myrequest,myresult);
     }

//  Trade.Buy(0.01,NULL,ask,ask+sl* _Point,ask-tp* _Point);



   CheckTrailingStopAsk(ask,sl,ts,tp,Magic);
//   CheckTrailingStopBid(bid,sl,ts,tp);
  }
//+------------------------------------------------------------------+
void CheckTrailingStopAsk(double ask, int sl, int ts, int tp,ulong Magic)
  {
//--- die Anfrage und das Ergebnis deklarieren und initialisieren
   MqlTradeRequest request= {0};
   MqlTradeResult  result= {0};
   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      ulong PositionTicket=PositionGetTicket(i);
      string mSymbol=PositionGetString(POSITION_SYMBOL);
      PositionSelectByTicket(PositionTicket);

      double NewStopLoss=NormalizeDouble(ask-sl*_Point,_Digits);
      string symbol=PositionGetSymbol(POSITION_SYMBOL);
      double PrevStopLoss=PositionGetDouble(POSITION_SL);
      double PositionTakeProfit=PositionGetDouble(POSITION_TP);
      double PositionPreis=NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN),_Digits);
      ulong Positionmagic=PositionGetInteger(POSITION_MAGIC);
      string Kommentar=PositionGetString(POSITION_COMMENT);
      int Digit=SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);
      double Volumen=PositionGetDouble(POSITION_VOLUME);

      Comment("\n nsl: ",NewStopLoss,
              "\n tp: ",PositionTakeProfit
             );

      ENUM_ORDER_TYPE type=(ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE);

      if((Positionmagic==Magic) && (PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY))
        {
         PrintFormat("#%I64u %s  %s  %.2f  %s  sl: %s  tp: %s [%I64d]",
                     PositionTicket,
                     mSymbol,
                     EnumToString(type),
                     Volumen,
                     DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN),Digit),
                     DoubleToString(PrevStopLoss,Digit),
                     DoubleToString(PositionTakeProfit,Digit),
                     Positionmagic);

         if(PrevStopLoss<NewStopLoss)
           {
            request.action=TRADE_ACTION_MODIFY;
            request.position=PositionTicket;
            request.sl=NewStopLoss;
            request.tp=PositionTakeProfit;
            request.magic=Positionmagic;
            request.comment=Kommentar;
            request.deviation=5;
            //PrevStopLoss=NewStopLoss;
           }
         //--- Anfrage senden
         if(!OrderSend(request,result))
            PrintFormat("OrderSend error %d",GetLastError());  // wenn die Anfrage konnte nicht gesendet werden, den Fehlercode anzeigen
         //--- Details zur Transaktion
         PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
         //--- die Werte der Anfrage und des Ergebnisses auf Null setzen
         ZeroMemory(request);
         ZeroMemory(result);

        }
     }
  }


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CheckTrailingStopBid(double bid, int sl, int ts, int tp)
  {
   double NewStopLoss=NormalizeDouble(bid+sl*_Point,_Digits);
   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      string symbol=PositionGetSymbol(i);
      if((_Symbol==symbol) && (PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL))
        {
         ulong PositionTicket=PositionGetInteger(POSITION_TICKET);
         double PrevStopLoss=PositionGetDouble(POSITION_SL);
         if(PrevStopLoss>NewStopLoss+ts*_Point)
           {
            Trade.PositionModify(PositionTicket,(PrevStopLoss-ts*_Point),0);
            PrevStopLoss=NewStopLoss;
           }
        }
     }
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
Grund der Beschwerde: