Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools
Zurück   Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools > Metatrader 4 > Programmierung MQL4

Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4.

Login
Benutzername:
Kennwort:


Statistik
Themen: 4973
Beiträge: 43251
Benutzer: 7.219
Aktive Benutzer: 81
Links: 84
Wir begrüßen unseren neuesten Benutzer: Hopfen&Malz
Mit 2.475 Benutzern waren die meisten Benutzer gleichzeitig online (16.01.20 um 22:38).
Neue Benutzer:
vor einem Tag
- Hopfen&Mal...
vor 2 Tagen
- frankmicha...
vor einer Woche
- DFeck
vor einer Woche
- bb1107
vor 2 Wochen
- rg-trader

Onlineuser
'Wer ist online' anzeigen Benutzer: 0
Gäste: 656
Gesamt: 656
Team: 0
Team:  
Benutzer:  
Freunde anzeigen

Empfehlungen

Like Tree1Likes
  • 1 Post By AVT
Thema geschlossen
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt 09.08.21
Neues Mitglied
 
Registriert seit: Jun 2021
Ort: Potsdam
Beiträge: 6
boll3k befindet sich auf einem aufstrebenden Ast
Standard 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?

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

Liebe Grüße aus Potsdam

Geändert von boll3k (09.08.21 um 17:49 Uhr)
  #2 (permalink)  
Alt 09.08.21
AVT AVT ist offline
Elite Mitglied
 
Registriert seit: Mar 2018
Ort: Hamburg
Beiträge: 612
AVT befindet sich auf einem aufstrebenden Ast
Standard

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 likes this.
  #3 (permalink)  
Alt 09.08.21
Neues Mitglied
 
Registriert seit: Jun 2021
Ort: Potsdam
Beiträge: 6
boll3k befindet sich auf einem aufstrebenden Ast
Standard

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
  #4 (permalink)  
Alt 09.08.21
AVT AVT ist offline
Elite Mitglied
 
Registriert seit: Mar 2018
Ort: Hamburg
Beiträge: 612
AVT befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von boll3k Beitrag anzeigen
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
  #5 (permalink)  
Alt 09.08.21
AVT AVT ist offline
Elite Mitglied
 
Registriert seit: Mar 2018
Ort: Hamburg
Beiträge: 612
AVT befindet sich auf einem aufstrebenden Ast
Standard

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" );
         }
      }
   }
  #6 (permalink)  
Alt 09.08.21
Neues Mitglied
 
Registriert seit: Jun 2021
Ort: Potsdam
Beiträge: 6
boll3k befindet sich auf einem aufstrebenden Ast
Standard

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?
  #7 (permalink)  
Alt 10.08.21
AVT AVT ist offline
Elite Mitglied
 
Registriert seit: Mar 2018
Ort: Hamburg
Beiträge: 612
AVT befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von boll3k Beitrag anzeigen
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
  #8 (permalink)  
Alt 10.08.21
Neues Mitglied
 
Registriert seit: Jun 2021
Ort: Potsdam
Beiträge: 6
boll3k befindet sich auf einem aufstrebenden Ast
Standard

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
Thema geschlossen

Lesezeichen

Stichworte
anpassen, modifizieren, take profit

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus




Alle Zeitangaben in WEZ +1. Es ist jetzt 19:57 Uhr.





Suchmaschine - Reisen - Wavesnode - Facebook Forum - Spam Firewall
-----------------------------------------------------------------------------------------------------------------------------
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
SEO by vBSEO 3.6.1
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum
MetaTrader bzw. MetaTrader 4 und MetaTrader 5 sind eingetragene Marken der MetaQuotes Software Corp.
-----------------------------------------------------------------------------------------------------------------------------