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)
-   -   TakeProfit für alle offenen Ordern anpassen (http://www.expert-advisor.com/forum/showthread.php?t=7063)

boll3k 09.08.21 17:36

TakeProfit für alle offenen Ordern anpassen
 
Hallo Liebe Community,

ich habe vor ein paar Wochen angefangen selber EA´s oder Indikatoren zu programmieren. Kleinere Programme sind zum jetzigen Stand weniger das Problem. Allerdings möchte man sich ja weiterentwickeln. Nachdem ich seit Tagen nicht weiterkomme um das Problem zu lösen, trete ich an euch heran.

Mein Problem ist: Der EA macht mehrere Ordern zu gewissen Zeitpunkten und in unterschiedlichen Preisspannen auf. Was ich nicht schaffe ist, jede Order hat ein eigenes TakeProfit. Aber ich möchte, dass alle Ordern das gleiche TakeProfit haben wie die letzte eröffnete Order. Hat jemand ein Beispiel wie ich alle Ordern selektieren kann (Pool), um ein TakeProfit modifizieren lasen kann?:confused:

Ich wäre für eine Lösung sehr dankbar.

Liebe Grüße aus Potsdam

AVT 09.08.21 18:56

Nicht im Betrieb gestest, evtl. mußt Du noch was anpassen.
Meine Lösung sähe erst mal so aus
Code:

void AdjustAllTPs()
{
  double  NewestTP      =0.0;            //TPForTheLastOpenedTrade
  datetime NewestTime    =TimeCurrent();  //now
 
  // === newest running order has the highest number
  for(int i=OrdersTotal()-1; i>=0; i--)                              //LoopOverAllOrders
  {  if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))                    //SelectRunningOrders
      {  if(  OrderSymbol()==_Symbol                                  //OurMarket
            && OrderMagicNumber()==MagicNumber                        //OurEA
            && OrderType()<=OP_SELL            )                      //MarketOrdersOnly
        {
            if(OrderOpenTime()<NewestTime) NewestTP=OrderTakeProfit(); //1.OpenedBeforeNow:TryToGetTP
            if(NewestTP>0.0)              break;                      //HasValidTP:exitLoop
        }//OurMarket/EA/MarketOrders
      }//SelectRunningOrders
  }//LoopOverAllOrders
 
  // === set Newest TP to all
  for(int i=OrdersTotal()-1; i>=0; i--)                              //LoopOverAllOrders
  {  if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))                    //SelectRunningOrders
      {  if(  OrderSymbol()==_Symbol                                  //OurMarket
            && OrderMagicNumber()==MagicNumber                        //OurEA
            && OrderType()<=OP_SELL            )                      //MarketOrdersOnly
        {
            if( !OrderModify(OrderTicket(),                            //NothingToChange
                            OrderOpenPrice(),
                            OrderStopLoss(),
                            NormalizeDouble(NewestTP,_Digits),        //ForSafetyNormFoundValue
                            0,clrNONE                          ) )  //NoExpire,WhateverColor
              Print(__FUNCTION__,                                    //Failed:Message
                    " new TP(",DoubleToStr(NewestTP,_Digits),")",
                    " for order no ",(int)OrderTicket()," failed" );
        }//OurMarket/EA/MarketOrders
      }//SelectRunningOrders
  }//LoopOverAllOrders
}

Erst mal so, hoffe das hilft Dir als Idee.
AVT

boll3k 09.08.21 19:10

ich hätte so schnell mit einer Antwort nicht gerechnet. Ich versuche gerade die Logic hinter den Zeilen nachzuvollziehen. Ich glaube so wäre ich nicht darauf gekommen und hätte wohl noch Wochen gebraucht. Eins verstehe ich nicht "Zitat" "OrderType()<=OP_SELL" Wieso <= wäre das nicht == OP_SELL || OP_BUY?

ich danke dir auf alle Fälle im voraus für deine Mühe. Du hast mir jetzt schon bombe geholfen ;)

AVT 09.08.21 20:42

Zitat:

Zitat von boll3k (Beitrag 45600)
Eins verstehe ich nicht "Zitat" "OrderType()<=OP_SELL" Wieso <= wäre das nicht == OP_SELL || OP_BUY?

Hast Recht, wir müssen die beiden noch voneinander trennen (alle Buyorders sollen denselben BuyTP haben und alle Sellorders denselben SellTP, macht sonst keinen Sinn) - heißt statt einer TP Variablen 2 Stück, eine für jede Richtung. Da stellt sich dann aber die Frage der Reihenfolge. z.B. wenn die letzte Order ein Buy war, sollen dann nur alle offenen Buys angepaßt werden.
AVT

AVT 09.08.21 21:34

Sollte reichen, wenn man die Richtung festhält, fällt mir grade so ein, also so:
Code:

  int      LastTradeDir  =-1;  //0=BUY 1=SELL -1=Error
  for(int i=OrdersTotal()-1; i>=0; i--)     
  {  if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {  if(  OrderSymbol()==_Symbol 
            && OrderMagicNumber()==MagicNumber
            && OrderType()<=OP_SELL            )
        {
            if(OrderOpenTime()<NewestTime) NewestTP=OrderTakeProfit();
            if(NewestTP>0.0)
            {
              if(OrderType()==OP_BUY)  LastTradeDir=0;  //FixDirection
              if(OrderType()==OP_SELL) LastTradeDir=1;

              break;
            }
        }
      }
  }
  // === set Newest TP to all of same kind as last order
  for(int i=OrdersTotal()-1; i>=0; i--)
  {  if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {  if(  OrderSymbol()==_Symbol
            && OrderMagicNumber()==MagicNumber
)
        {
            // === selected order must be same as Last order
            bool CondLong=(OrderType()==OP_BUY && LastTradeDir==0);
            bool CondShort=(OrderType()==OP_SELL && LastTradeDir==1);
           
            if(CondLong || CondShort)

              if( !OrderModify(OrderTicket(),
                                OrderOpenPrice(),
                                OrderStopLoss(),
                                NormalizeDouble(NewestTP,_Digits),
                                0,clrNONE                          ) )
                  Print(__FUNCTION__," newTP failed" );
        }
      }
  }


boll3k 09.08.21 23:09

läuft wie ein Traum! Der macht auf alle Fälle schon mal grob das was er machen soll! Momentan spuckt er immer wieder im Tester OrderModify error 1 aus. Also mit Fehlern kenn ich mich noch gar nicht aus. Wenn ich es richtig verstehe, versucht er den gleich Preis ( TakeProfit) zu modifizieren und das fast jeden Tick.
Dann müsste ich doch eigentlich nur eine Abfrage einbauen, ob der

newestTP == OrderTakeProfit() break;

oder denke ich da in die Falsche Richtung?

AVT 10.08.21 10:49

Zitat:

Zitat von boll3k (Beitrag 45603)
läuft wie ein Traum! Der macht auf alle Fälle schon mal grob das was er machen soll! Momentan spuckt er immer wieder im Tester OrderModify error 1 aus. Also mit Fehlern kenn ich mich noch gar nicht aus. Wenn ich es richtig verstehe, versucht er den gleich Preis ( TakeProfit) zu modifizieren und das fast jeden Tick.
Dann müsste ich doch eigentlich nur eine Abfrage einbauen, ob der
newestTP == OrderTakeProfit() break;

Ich würde es umgekehrt machen, wenn OrderTakeProfit() != newestTP dann Modify (ansonsten passiert eben gar nix).
Außerdem würde ich die Anpassung nur einmal machen, nämlich dann, wenn eine neue Order mit TP erfolgreich rausgegangen ist (dann hast Du ja einen neuen TPwert). Solange keine neuen Orders rausgehen, muß auch nix angepaßt werden.
Ist nur meine Art wie ich es machen würde.
AVT

boll3k 10.08.21 11:35

Du hast mir schon so sehr weiter geholfen. Da ich schon etliche Codes gelesen habe, lernt man echt viele Stile kennen. Schwer tue ich mich immer mit != Abfragen um den Code kürzer zuhalten.

Da ich auch in den EA ein Hedge ausprobieren möchte, kann ich den Code noch erweitern und von der Gegenposition den SL auf das TP von den vorigen Ordern setzen. Ich danke Dir auf alle Fälle für deine Antworten.

Grüße aus Potsdam


Alle Zeitangaben in WEZ +2. Es ist jetzt 23:39 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