|
Startseite | Registrieren | Hilfe | Benutzerliste | Kalender | Suchen | Heutige Beiträge | Alle Foren als gelesen markieren |
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
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) |
|
|||
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 } AVT |
|
|||
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 |
|
|||
Zitat:
AVT |
|
|||
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" ); } } } |
|
|||
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? |
|
|||
Zitat:
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 |
|
|||
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 |
Lesezeichen |
Stichworte |
anpassen, modifizieren, take profit |
Themen-Optionen | Thema durchsuchen |
Ansicht | |
|
|