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

Aleksi-Trader
437
Aleksi-Trader  

Hallo da ich mich noch mit  MqlRequest beschäftige und ich ein TrailingStop auf dieser Basis gestalten wollte kommt der Fehler im Journal:

 retcode=10013  deal=0  order=0 

OrderSend error 4756 

failed prices for GBPUSD 0 [Invalid request]

Kann mir jemand erkären warum die Fehlermeldungen kommen?

Bei Beispiel 1 geht ja Magicnummer etc dabei flöten.

 Trade.PositionModify(PositionTicket,(PrevStopLoss-ts*_Point),PositionPreis+tp*_Point);

Deshalb soll jetzt diese Möglichkeit herhalten, um die Magicnummer etc bei zu behalten.

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);
   CheckTrailingStopBid(bid,sl,ts,tp);
  }
//+------------------------------------------------------------------+
void CheckTrailingStopAsk(double ask, int sl, int ts, int tp)
  {
//--- die Anfrage und das Ergebnis deklarieren und initialisieren
   MqlTradeRequest request= {0};
   MqlTradeResult  result= {0};

   double NewStopLoss=NormalizeDouble(ask-sl*_Point,_Digits);
   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      string symbol=PositionGetSymbol(i);
      if((_Symbol==symbol) && (PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY))
        {
         ulong PositionTicket=PositionGetInteger(POSITION_TICKET);
         double PrevStopLoss=PositionGetDouble(POSITION_SL);
         double PositionPreis=NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN),_Digits);
         ulong Positionmagic=PositionGetInteger(POSITION_MAGIC);
         string Kommentar=PositionGetString(POSITION_COMMENT);
         string mSymbol=PositionGetString(POSITION_SYMBOL);
         int Digit=SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);
         double Volumen=PositionGetDouble(POSITION_VOLUME);
          ENUM_ORDER_TYPE type=(ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE);
          
         PrintFormat("#%I64u %s  %s  %.2f  %s  sl: %s  tp: %s  Kommentar: %s [%I64d]",
                     PositionTicket,
                     mSymbol,
                     EnumToString(type),
                     Volumen,
                     DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN),Digit),
                     DoubleToString(sl,Digit),
                     DoubleToString(tp,Digit),
                     Positionmagic,
                     Kommentar);
                     
         if(PrevStopLoss<NewStopLoss-ts*_Point)
           {
            request.action=TRADE_ACTION_MODIFY;
            //request.order=PositionTicket;
            request.sl=PrevStopLoss+ts*_Point;
            request.tp=PositionPreis+tp*_Point;
            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);
        }
     }
  }
amando
3685
amando  
Aleksi-Trader:

Hallo da ich mich noch mit  MqlRequest beschäftige und ich ein TrailingStop auf dieser Basis gestalten wollte kommt der Fehler im Journal:

 retcode=10013  deal=0  order=0 

OrderSend error 4756 

failed prices for GBPUSD 0 [Invalid request]

Kann mir jemand erkären warum die Fehlermeldungen kommen?

Bei Beispiel 1 geht ja Magicnummer etc dabei flöten.

Deshalb soll jetzt diese Möglichkeit herhalten, um die Magicnummer etc bei zu behalten.

Dir fehlt PositionSelectByTicket

ohne den wirds nicht funktionieren 


den part versteh ich nicht, muss ich aber auch nicht

   if(PrevStopLoss<NewStopLoss-ts*_Point)
Aleksi-Trader
437
Aleksi-Trader  
amando:

Dir fehlt PositionSelectByTicket

ohne den wirds nicht funktionieren 


den part versteh ich nicht, muss ich aber auch nicht

Ahhh okay... daher also.
   if(PrevStopLoss<NewStopLoss-ts*_Point)
Vergleicht ja den neuen Wert mit den alten damit der dann den Wert auf ts= TrailingStop Distanz ändert wenn dieser unter dem vom soll ist.
amando
3685
amando  
Aleksi-Trader:
Ahhh okay... daher also. Vergleicht ja den neuen Wert mit den alten damit der dann den Wert auf ts= TrailingStop Distanz ändert wenn dieser unter dem vom soll ist.

Warum stellst dann nicht gleich den new sl richtig?

Aleksi-Trader
437
Aleksi-Trader  
amando:

Warum stellst dann nicht gleich den new sl richtig?

Hast auch wieder recht, man lernt nie aus.

Bisher hab ich die SelectByTicket noch nicht genutzt... erst mal darüber belesen und schauen wie das am besten möglich ist.

Leider seh ich immer noch nicht durch....

 for(int i=PositionsTotal()-1; i>=0; i--)
     {
      string symbol=PositionGetSymbol(i);
      if((_Symbol==symbol) && (PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY))
        {
         double NewStopLoss=NormalizeDouble(ask-sl*_Point,_Digits);
         ulong PositionTicket=PositionGetInteger(POSITION_TICKET);
         double PrevStopLoss=PositionGetDouble(POSITION_SL);
         double PositionPreis=NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN),_Digits);
         ulong Positionmagic=PositionGetInteger(POSITION_MAGIC);
         string Kommentar=PositionGetString(POSITION_COMMENT);
         string mSymbol=PositionGetString(POSITION_SYMBOL);
         int Digit=SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);
         double Volumen=PositionGetDouble(POSITION_VOLUME);
         ENUM_ORDER_TYPE type=(ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE);

         PrintFormat("#%I64u %s  %s  %.2f  %s  sl: %s  tp: %s [%I64d]",
                     PositionTicket,
                     mSymbol,
                     EnumToString(type),
                     Volumen,
                     DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN),Digit),
                     DoubleToString(sl,Digit),
                     DoubleToString(tp,Digit),
                     Positionmagic);

         PositionSelectByTicket(PositionTicket);

         if(PrevStopLoss<NewStopLoss)
           {
            request.action=TRADE_ACTION_MODIFY;
            request.position=PositionTicket;
            request.sl=NewStopLoss*_Point;
            request.tp=PositionPreis+tp*_Point;
            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);
        }
     }
  }

PositionByTicket is ja vom typ bool laut der Referenz

" PositionSelectBy Wählt eine offene Position nach dem angegebenen Ticket für die weitere Arbeit aus. Gibt true bei einem erfolgreichen Beenden der Funktion zurück. Gibt false zurück, wenn das Beenden der Funktion fehlgeschlagen ist. Rufen Sie die Funktion GetLastError() auf, um Details zum Fehler zu bekommen." PositionSelectByTicket  


Mit der Zuweisung  PositionTicket sollte das also erledingt sein.

oder muss ich bei Anfrage auf Änderung (request.) dann das Ticket Selectieren?

Was für mich mehr Sinn machen würde.

request.position=PositionSelectByTicket(PositionTicket)

failed modify order #0 buy 0 GBPUSD at market sl: 0.00000 tp: 0.00000 -> market, sl: 0.00001 tp: 1.39663 [Invalid request]  Wieso sl / tp 0???  Hab ich doch alles angegeben?

OrderSend error 4756
retcode=10013  deal=0  order=0

amando
3685
amando  
Aleksi-Trader:

Hast auch wieder recht, man lernt nie aus.

Bisher hab ich die SelectByTicket noch nicht genutzt... erst mal darüber belesen und schauen wie das am besten möglich ist.

Leider seh ich immer noch nicht durch....

PositionByTicket is ja vom typ bool laut der Referenz

" PositionSelectBy Wählt eine offene Position nach dem angegebenen Ticket für die weitere Arbeit aus. Gibt true bei einem erfolgreichen Beenden der Funktion zurück. Gibt false zurück, wenn das Beenden der Funktion fehlgeschlagen ist. Rufen Sie die Funktion GetLastError() auf, um Details zum Fehler zu bekommen." PositionSelectByTicket  


Mit der Zuweisung  PositionTicket sollte das also erledingt sein.

oder muss ich bei Anfrage auf Änderung (request.) dann das Ticket Selectieren?

Was für mich mehr Sinn machen würde.

failed modify order #0 buy 0 GBPUSD at market sl: 0.00000 tp: 0.00000 -> market, sl: 0.00001 tp: 1.39663 [Invalid request]  Wieso sl / tp 0???  Hab ich doch alles angegeben?

OrderSend error 4756
retcode=10013  deal=0  order=0

Als beispiel

double OldestPositionPriceShort(const string symbol, const int MagicNumber)  //Gewinn der Gesamtposition
  {
   double   price = -1;
   datetime endtime= D'31.12.2999';


   int i = PositionsTotal();
   while(i-->0)
     {
      //--- Parameter der Order
      ulong  _ticket=PositionGetTicket(i);// das Ticket der Position
      PositionSelectByTicket(_ticket);

      string   _symbol     =PositionGetString(POSITION_SYMBOL); // Symbol
      ulong    _magic      =PositionGetInteger(POSITION_MAGIC); // MagicNumber der Position
      double   _lot        =PositionGetDouble(POSITION_VOLUME);
      datetime  time       =(datetime)PositionGetInteger(POSITION_TIME);
      int       dir        =(int)PositionGetInteger(POSITION_TYPE);
      double    _price     =PositionGetDouble(POSITION_PRICE_OPEN);

      //--- wenn die MagicNumber übereinstimmt, sind Stop Loss und Take Profit nicht gesetzt
      if(_symbol==symbol
         && MagicNumber==_magic
         && time < endtime
         && dir == POSITION_TYPE_SELL
        )
        {
         endtime =  time;
         price   = _price;
        }
     }

   return(price);

  }
Aleksi-Trader
437
Aleksi-Trader  
amando:

Als beispiel

Gut habs gemacht wie Du, Suche in offenen Positionen das Ticket, übergebe Positionsnummer / index an i

frage Ticket für i ab und speichere das in PositionTicket.

SelectByTicket bekommt das Ticket von PositionTicket. Hole Infos zur Position, , anschließend prüfe die Magicnummer und wenn das passt gebe es in Journal aus.

dann frage ob sl < neuer sl ist wenn ja, Anfrage Änderung, anfrage zu Ticket , Informationen zuweisen etc. Was übersehe ich?

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 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);

      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(sl,Digit),
                     DoubleToString(tp,Digit),
                     Positionmagic);

         if(PrevStopLoss<NewStopLoss)
           {
            request.action=TRADE_ACTION_MODIFY;
            request.position=PositionTicket;
            request.sl=NewStopLoss*_Point;
            request.tp=PositionPreis+tp*_Point;
            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);
        }
     }
  }
Carl Schreiber
Moderator
11826
Carl Schreiber  

Was geht jetzt nicht?

Ich würde in Deiner Situation durch das Programm  mit dem Debugger (mit hist. Kursen) Zeile für Zeile durch gehen. So sieht man am schnellsten warum es nicht tut, was es eigentlich tun soll.

Aleksi-Trader
437
Aleksi-Trader  
Carl Schreiber:

Was geht jetzt nicht?

Ich würde in Deiner Situation durch das Programm  mit dem Debugger (mit hist. Kursen) Zeile für Zeile durch gehen. So sieht man am schnellsten warum es nicht tut, was es eigentlich tun soll.

Ausdruck: double Wert: Expression could not be evaluated Typ: 0 zb bei allen egal ob string oder double... werd da echt nicht schlau draus... wobei ich mit den debugger nicht wirklich gut umgehen kann.
Carl Schreiber
Moderator
11826
Carl Schreiber  
Aleksi-Trader:
Ausdruck: double Wert: Expression could not be evaluated Typ: 0 zb bei allen egal ob string oder double... werd da echt nicht schlau draus... wobei ich mit den debugger nicht wirklich gut umgehen kann.

Bitte die Fehler genau dokumentieren! Wo erscheint Expression could not be evaluated?

Debugger?

Setz mal am Anfang jeder Funktion einen Haltepunkt (F9) und dann starte den Debugger (Strg+F5) und gehe mit F11 von Anweisung zu Anweisung - ist alles unter dem Menüpunkt Debug zu sehen und zu benutzen.

Den Anfangspunkt und das Symbol mit den hist. Kursen muss man aber woanders setzen: Extras => Optionen => Fehlersuche/Profiling

Aleksi-Trader
437
Aleksi-Trader  
Carl Schreiber:

Bitte die Fehler genau dokumentieren! Wo erscheint Expression could not be evaluated?

Debugger?

Setz mal am Anfang jeder Funktion einen Haltepunkt (F9) und dann starte den Debugger (Strg+F5) und gehe mit F11 von Anweisung zu Anweisung - ist alles unter dem Menüpunkt Debug zu sehen und zu benutzen.

Den Anfangspunkt und das Symbol mit den hist. Kursen muss man aber woanders setzen: Extras => Optionen => Fehlersuche/Profiling

debug screenshot


in den Einstellungen bei Extras->Optionen->Fehlersuche/Profiling hab ich auch einstellungen vorgenommen.