Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   Modifizierung von PendingOrdern (http://www.expert-advisor.com/forum/showthread.php?t=6415)

dundale 13.05.19 16:39

Modifizierung von PendingOrdern
 
Hallo alle zusammen,

ich habe mal wieder ein Problem. Ich möchte eine gesetzte Buystop-PendingOorder modifizieren.
Dazu habe ich eine Test-Version geschrieben. Eine PO wird erstellt und wenn der Preis zu weit von der PO entfernt ist, soll der PO-Preis angepasst werden.

Ich bekomme aber die Modifizierung absolut nicht hin. Kann mir jemand helfen?


HTML-Code:

//+------------------------------------------------------------------+
//|                                    TEST_Modify_PendingOrder.mq4 |
//+------------------------------------------------------------------+
#property strict
#include <stderror.mqh>
#include <stdlib.mqh>

extern double TP                  = 10;
extern double SL                  = 20;
extern double LS                  = 0.05;
extern string MyComment          = "TEST";
extern double AbstandZumMarkt    = 20;
double pips;
//+------------------------------------------------------------------+
int OnInit()
  {
// Determine what a pip is.
  pips=Point; //.00001 or .0001. .001 .01.
  if(Digits==3 || Digits==5 || Digits==1) pips*=10; //ist das gleiche wie: pips=points*10
  else if(Digits==2) pips*=100; //ist das gleiche wie: pips=points*100
//---
  return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  Comment("");
  }
//+------------------------------------------------------------------+
void OnTick()
  {
  CheckForSignal();
  Modify_PendingOrder();
  }
//+------------------------------------------------------------------+
void CheckForSignal()
{
  if(TotalOpenBuyStopPendingOrders() == 0) PlacePendingOrder(OP_BUYSTOP);
}
//+------------------------------------------------------------------+
void PlacePendingOrder(int dir)
{
  // Buystop-PendingOrder
  double LongEntryPrice = Ask + (AbstandZumMarkt*pips);
  double LongSL        = LongEntryPrice - SL*pips;
  double LongTP        = LongEntryPrice + TP*pips;

  if(dir == OP_BUYSTOP)
  {  int Long_ticket = OrderSend(Symbol(), dir, LS, LongEntryPrice, 30, LongSL, LongTP, MyComment, 0, 0, clrGreen); }
}
//+------------------------------------------------------------------+
void Modify_PendingOrder()
{
  double price = 0,
  new_price = 0;

  if(TotalOpenBuyStopPendingOrders() > 0)
          {
            for(int i=0;i<OrdersTotal()-1;i++)
              {
              if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
                  if(OrderSymbol() == Symbol())
                    if(OrderType()==OP_BUYSTOP)
                        {
                        int orderticket = OrderTicket();
                        if(OrderTicket() == FindLastBuyStopPendingOrder())
                          {
                          if(Ask <= (OrderOpenPrice()-(AbstandZumMarkt*pips)))
                              {
                              new_price = Ask + (AbstandZumMarkt*pips);
                              int new_ticket = OrderModify(orderticket,new_price,(new_price-(SL*pips)),(new_price+(TP*pips)),0,clrBlue);
                              }
                          } 
                        }
              }
          } 
}
//+------------------------------------------------------------------+
int TotalOpenBuyStopPendingOrders()
  {
  int total=0;
  if(OrdersTotal()>
0)for(int i=OrdersTotal()-1; i>=0; i--)
    {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
        if(OrderSymbol() == Symbol())
            if(OrderType()==OP_BUYSTOP)
              total++;
        }
      else Print(__FUNCTION__," Failed to select order ",i," ",GetLastError());
    }
  return (total);
  }
//+------------------------------------------------------------------+
int FindLastBuyStopPendingOrder()
{
  int      orderticket = 0;
  datetime last  = 0;
  for(int i = OrdersTotal()-1;i>=0;i--)
      {
      if(TotalOpenBuyStopPendingOrders() > 0)     
        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
            if(OrderSymbol() == Symbol())
              if(OrderType() == OP_BUYSTOP)
                  {
                  if(last == 0 || OrderOpenTime() > last)
                    {
                    last  = OrderOpenTime();
                    orderticket = OrderTicket();
                    }
                  }
      }
  return (orderticket);
}
//+------------------------------------------------------------------+

Die Modify-Funktion möchte ich später in einen größeren Code einbauen, der neue Wert für den Preis kommt dann von einer anderen Funktion.

Ich wäre für eure hilfreichen Tipps sehr dankbar.

AVT 15.05.19 01:06

So auf die Schnelle hilft mir immer ein Blick in die Fehlermeldungen, und wenn mir die zu unverständlich sind, baue ich für jeden einzelnen Wert ein Print ein und kontrolliere (oder rechne nach). AVT

dundale 16.05.19 18:12

Danke für deine Antwort. Ich sollte wohl wirklich alle Werte, wie TP und SL, nochmal einzeln betrachten. Hatte nur einen Print für die selektierte Ticketnummer (Print nicht im Programm-Code).

AVT 17.05.19 13:59

Ich habe es mal laufen lassen, Änderungen
1. 3 Orders (um zu sehen, ob er auch wirklich nur die letzte ändert)
2. Modify_Pending Loop-Zeile geändert
3. FindLastPending Bedingungen geändert
Probiers aus, hier der Code von den geänderten:
Code:

//+------------------------------------------------------------------+
void CheckForSignal()
{
  //if(TotalOpenBuyStopPendingOrders() == 0) PlacePendingOrder(OP_BUYSTOP);
  if(TotalOpenBuyStopPendingOrders() <3) PlacePendingOrder(OP_BUYSTOP);
}
//+------------------------------------------------------------------+
void Modify_PendingOrder()
{
        Print("Function: ",__FUNCTION__," entered");
       
        double price      = 0, //AktuellerEinstieg
              new_price  = 0; //NeuerEinstieg
        int    orderticket= 0; //LetzteBuyStopNummer
        double Grenzwert  = 0; //Log MaximalAbstand
        double new_SL    = 0; //Log NeuerSL
        double new_TP    = 0; //Log NeuerTP
       
        Print("Function: ",__FUNCTION__," TotalOpenBuyStopPendingOrders=",
              IntegerToString(TotalOpenBuyStopPendingOrders())            );     
  if(TotalOpenBuyStopPendingOrders() > 0)                            //WartendeBuyStop
  {
          Print("Function: ",__FUNCTION__," going into Loop");
          for(int i=OrdersTotal(); i>=0; i--)                            //LoopAlleOrders
      {
              Print("Function: ",__FUNCTION__," i=",IntegerToString(i));
              if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))                //SelectTrades
              {
                orderticket=FindLastBuyStopPendingOrder();                //LetzteBuyStopNummer
                                Print("Function: ",__FUNCTION__," i=",IntegerToString(i),
                                      " orderticket i=",IntegerToString(orderticket)    );
                     
                      if(  OrderSymbol()==_Symbol                              //UnserMarkt
                        && OrderType()==OP_BUYSTOP                            //BuyStopOrder
                        && OrderTicket()==orderticket )                        //IstLetzteBuyStop
                      {
                              Grenzwert=(OrderOpenPrice()-(AbstandZumMarkt*pips));  //MaxAbstand
                             
                              if(Ask <= Grenzwert )                                  //AskUnterGrenzwert
                              {
                                      new_price = Ask + (AbstandZumMarkt*pips);          //NeuerEinstieg
                                      Print("Function: ",__FUNCTION__," Ask=",DoubleToStr(Ask,_Digits),
                                            " unter Grenzwert=",DoubleToStr(Grenzwert,_Digits),
                                            " new_price=",DoubleToStr(new_price,_Digits)                                      );
                                     
                                      int new_ticket = OrderModify(OrderTicket(),
                                                                  new_price,
                                                                  (new_price-(SL*pips)),
                                                                  (new_price+(TP*pips)),
                                                                  0,clrNONE            );
                                      if( !new_ticket )
                    Print("Function: ",__FUNCTION__," failed to modify pending buy stop");
                  else
                  {
                          new_SL=OrderStopLoss();
                          new_TP=OrderTakeProfit();
                          Print("Function: ",__FUNCTION__," changed Ticket=",IntegerToString( OrderTicket() ),
                                              " new_price=",DoubleToStr(new_price,_Digits),
                                              " new SL=",DoubleToStr(new_SL,_Digits),
                                              " new TP=",DoubleToStr(new_TP,_Digits)                  );
                                                }
                              }//AskUnterGrenzwert
                              else
                                      Print("Function: ",__FUNCTION__," Ask=",DoubleToStr(Ask,_Digits),
                                            " noch nicht unter Grenzwert=",DoubleToStr(Grenzwert,_Digits) );
                     
                      }//OurMarket und BuyStopOrder und IstLetzteBuyStop
                      else
                              Print("Function: ",__FUNCTION__," not OurSymbol, BuyStop or last BuyStopTicket");
              }//SelectTrades
              else
                      Print("Function: ",__FUNCTION__," no MODE_TRADES to select");
      }//LoopAlleOrders
        }//WartendeBuyStop
        else
                Print("Function: ",__FUNCTION__," no Open BuyStopPendingOrders");
}
//+------------------------------------------------------------------+
int FindLastBuyStopPendingOrder()
{
  int      orderticket = 0; //LastTicketNo
        Print("entered Function: ",__FUNCTION__,
              " orderticket=",IntegerToString(orderticket));
 
  //Höchste (Letzte) bis Null (Erste), break nach Treffer
  for(int i=OrdersTotal()-1; i>=0; i--)
  {
                Print("entered loop Function: ",__FUNCTION__," i=",IntegerToString(i),
                      " TotalOpenBuyStopPendingOrders=",
                      IntegerToString(TotalOpenBuyStopPendingOrders()) );
      if(TotalOpenBuyStopPendingOrders() > 0)
      {     
        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
            if(  OrderSymbol() == Symbol()    //OurMarket
              && OrderType() == OP_BUYSTOP  )  //BuyStopOrder
            {
                    orderticket = OrderTicket();
                                                        Print("Function: ",__FUNCTION__," i=",IntegerToString(i),
                                                              " hat orderticket=",IntegerToString(orderticket)  );
                    break;
             
                                }//OurMarket and BuyStopOrder
                                else
                                        Print("Function: ",__FUNCTION__," not our Symbol or not a BuyStop");
                       
                        }//SELECT_BY_POS,MODE_TRADES
      }//TotalOpenBuyStopPendingOrders()>0
  }//i=OrdersTotal()-1

        Print("Function: ",__FUNCTION__," returns ticket=",IntegerToString(orderticket));
  return (orderticket);
}//+------------------------------------------------------------------+

Du kannst beim Testen die erzeugten Pendings manuell verschieben und dann sehen, welche er ändert. Hoffe das hilft Dir. AVT

dundale 18.05.19 13:22

Es funktioniert!
AVT, vielen Dank für deine Hilfe.
So vielseitig die Function-Prints einzusetzten, habe ich vorher noch nicht getan. Wieder was gelernt :-)


Alle Zeitangaben in WEZ +2. Es ist jetzt 17:58 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum