|
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
@ Michael: Dann mach halt je nach Buy oder Sell nen Trailing Stop, der für alle Orders genutzt wird.
SL / TP / OrderOpenPrice() aus ner offenen Order auszulesen sollte ja eigentlich möglich sein. Auch wenn der SL natürlich immer wieder nach gezogen wird, kann man immer noch Code:
OrderOpenPrice() +||- (Je nach Richtung halt) OrderStopLoss() Code:
input bool Trailing_Stop=false; extern int Trailing_Stop_Step=35;. Code:
if(Trailing_Stop==true){ ////////////////////////////////////////////////////////////////////////////////////////////////////////////// for(int j=OrdersTotal()-1;j>=0;j--){ if(OrderSelect(j,SELECT_BY_POS)){ if(OrderSymbol()==Symbol()){ ////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Neuer SELL-"SL" (S_TS) Funktionen/Berechnungen if(OrderMagicNumber()==MN_Sel){ // gesendeter SELL_SL - Öffnungskurs, um double-Wert zu ermitteln, der zum BID dazu gerechnet wurde: double OSLS_OOPS = OrderStopLoss() - OrderOpenPrice(); // Bid + SELL-SL double-Wert = neuer SELL-"SL", der bei OrderModify gesendet werden soll double TS_Sel = Bid + OSLS_OOPS; double TSS_TSS=NormalizeDouble( TS_Sel + Trailing_Stop_Step *_Point,_Digits); if(OrderStopLoss() > TSS_TSS){ if(IsTradeAllowed()==true)OrderModify(OrderTicket(),OrderOpenPrice(),TS_Sel,OrderTakeProfit(),NULL,Blue); if(IsTradeContextBusy()==true)Sleep(Sl_MS);}} ////////////////////////////////////////////////////////////////////////////////////////////////////////////// if(OrderMagicNumber()==MN_Buy){ // BUY-Öffnungskurs - gesendeten BUY-SL, um Wert zu ermitteln, der vom Ask abgezogen wurde: double OOPB_OSLB = OrderOpenPrice() - OrderStopLoss(); // Ask - BUY_SL double-Wert = neuer BUY-"SL", der bei OrderModify gesendet werden soll: double TS_Buy = Ask - OOPB_OSLB; // neuer BUY_"SL" - Trailing_Stop_Step. // Damit soll geprüft werden, ob BUY_"SL" (B_TS) nach gezogen werden muss. double TSB_TSS = NormalizeDouble( TS_Buy - Trailing_Stop_Step *_Point,_Digits); // Wenn aktueller BUY_SL kleiner als // neuer BUY_SL - TSS ist, soll neuer BUY_"SL" (BUY_TS) gesendet werden: if( OrderStopLoss() < TSB_TSS ){ if(IsTradeAllowed()==true)OrderModify(OrderTicket(),OrderOpenPrice(),TS_Buy,OrderTakeProfit(),NULL,Blue); if(IsTradeContextBusy()==true)Sleep(Sl_MS);}} } } } } |
|
|||
Zitat:
EAname="EA"+IntegerToString(MagicNummer)+_Symbol; Das ergibt dann sowas wie EA1234EURUSD 1. wenn LongOder1 erfolgreich abgesetzt wurde a. GlobalVariableSet(EAname+"-Long1Ticket",TicketNummer); b. GlobalVariableSet(EAname+"-Long1SL",ursprünglicherLongOrder1SLwert); Dasselbe für LongOrder2, 3 und 4. Dasselbe wenn ShortOrders rausgehen. 2. Beim Trailen prüfen, ob das noch dieselbe TicketNummer ist a. wenn OrderTicket()==(int)GlobalVariableGet(EAname+"-Long1Ticket") b. dann ursprünglichen SL holen SL=GlobalVariableGet(EAname+"-Long1SL") c. mit dem geholten SL den Trailwert ermitteln und trailen Wenn Du keine Teilverkäufe machst, mußt Du nur überwachen, ob die LongOrder1 geschlossen wurde (dann findest Du die TicketNummer in der HISTORY), dann kannst Du die beiden Globalvariaben zu dieser LongOrder löschen. Außerdem mußt Du die HISTORY überwachen, um zu sehen, ob die Orders in den TP oder SL gelaufen sind (dann enthält der OrderComment() zusätzlich [sl] oder [tp]) - auch dann können die Globalvariablen entfernt werden. Wenn Du den EA am Tagesende schließt, alle Orders schließen - wenn geschlossen, die Globalvariablen zu dieser Order löschen. Das wäre der Weg. AVT p.s. Bei Teilverkäufen ist das noch mal ein bißchen mehr zu rechnen. |
|
|||
Das unter 2a. geht eigentlich nur, wenn nur eine Order existent ist, denn bei mehreren kann hier schlecht ein Index laufen, um den Inhalt der GV mit OrderTicket() zu vergleichen.
D.h. der initiale SL muss wie folgt gespeichert werden: GlobalVariableSet(EAname+"_"+(string)TicketNummer, Initialer_SL); dann werden über GlobalVariablesTotal() alle GVs bzgl. des Namens der GV gescannt und darin über StringFind() die Ticketnummer gesucht und bei Vorhandensein der initiale SL ausgelesen. Sollten doch Teilschließungen vorhanden sein, dann müsste die Ticketnummer der verbleibenden Order nach der Teilschließung gegen die Ticketnummer in der GV der vor der Teilschließung existierenden GV "ausgetauscht" werden. traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
Lesezeichen |
Stichworte |
break-even, stop loss nachziehen |
|
|