|
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
Stop Loss /Trailing Stop an Indikator
Hallo,
ich beschäftige mich seit einigen Tagen intensiver mit dem Programmieren eines EA´s für MT4. Nun steh ich allerdings voll auf dem Schlauch: Ich will, dass der Stopp meiner bereits ausgefürten Orders immer dem Bollinger Band nachgezogen wird. Egal ob mit OrderClose oder OrderModify funktioniert es nicht. Das Problem ist, dass die Funktion einmalig ausgeführt wird und dann dort bleibt. Ich hatte die Idee es mit einer Schleife zu versuchen in die ich ein "sleep" mit 15 min verzögerung setze, damit nicht Jede Sekunde der Stop angepasst wird. Hat aber auch nicht wikrlich funktioniert. Über einen kurzen Code-Schnipsel oder einen Lösungsansatz würde ich mich sehr freuen. Falls ein solches Thema schon exisitieren sollte würde ich mich über einen kurzen link freuen und möchte mich dafür entschuldigen. Allerdings kam ich mit der Such-Funktion nicht zum Ziel Lg, Jakob ps. so siehts bisher aus: extern double Ordervol; extern double StopLoss; extern double TakeProfit; void OnTick() { int BrokerSpread=MarketInfo (NULL,MODE_SPREAD) ; double BuySwap=MarketInfo (Symbol (), MODE_SWAPLONG); double SellSwap=MarketInfo (Symbol (), MODE_SWAPSHORT); Comment("Kontostand: ",AccountBalance(), "\n", "Verfügbares Kapital: ",AccountEquity(), "\n", "Spread: ",BrokerSpread, "\n", "BuySwap: ",BuySwap, "\n", "SellSwap: ",SellSwap, "\n"); double BBlow=iBands(NULL,15,55,0.2,0,PRICE_CLOSE,MODE_LOW ER,0) ; double BBhigh=iBands(NULL,15,55,0.2,0,PRICE_CLOSE,MODE_UP PER,0) ; if (Ask>BBhigh) if (OrdersTotal()==0) { Kaufen();} } void Kaufen() { double BBlow=iBands(NULL,15,55,0.2,0,PRICE_CLOSE,MODE_LOW ER,0) ; OrderSend(Symbol(), OP_BUY,Ordervol,Ask,3,BBlow,(Ask+1.0010),NULL,1,0, Green); } |
|
|||
Nur kurz und rudimentär:
dein EA läuft per onTick(), also musst du wenn du deine SL/Trail-Funktion (die ich in deinem Code unten niergends sehe) nur alle 15mins aufrufen willst, z.B.: einen Zeitfilter einbauen der dir anspringt wenn 15 mins abgelaufen sind. (oder du lässt den EA auf M15 laufen und reagierst auf das newBar-Event. Global: (wird zugewiesen z.B.: wenn du den Trade eröffnest) datetime lastrail; onTick: if ( lasttrail<TimeCurrent()-(60*15) ) { Trailen(); lasttrail=TimeCurrent(); } |
|
|||
Das löst man am Besten, unabhängig vom TimeFrame, über einen Timer.
Code:
void OnInit() { ... EventSetTimer(15*60); //Klammerausdruck in Sekunden } void OnDeinit(const int reason) { ... EventKillTimer(); } void OnTimer() { SetSL(); } Somit wäre erst einmal gewährleistet, dass die Funktion, die den SL zu bearbeiten hat, in diesem Fall nach regelmäßig 15 Minuten, aufgerufen wird. traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
Ich hab das jetzt mal so umgesetzt. Allerdings wurde im Backtesting nur die erste Order bearbeitet. Alle zukünfitge sind einfach direkt ins SL.
Könnt ihr mir sagen wo mein Fehlern liegt? Die onTick Funktion sagt doch, dass er den nachfolgenden Code bei jedem Tick abarbeiten soll. Das müsste doch bedeuten dass er jedes mal schauen muss ob die 15 min schon vergangen sind und dann dementsprechend den Stopp nachziehen. Vielen Dank schonmal! extern double Ordervol; extern double StopLoss; extern double TakeProfit; datetime lastrail; void OnTick() { int BrokerSpread=MarketInfo (NULL,MODE_SPREAD) ; double BuySwap=MarketInfo (Symbol (), MODE_SWAPLONG); double SellSwap=MarketInfo (Symbol (), MODE_SWAPSHORT); Comment("Kontostand: ",AccountBalance(), "\n", "Verfügbares Kapital: ",AccountEquity(), "\n", "Spread: ",BrokerSpread, "\n", "BuySwap: ",BuySwap, "\n", "SellSwap: ",SellSwap, "\n"); double BBlow=iBands(NULL,15,55,0.2,0,PRICE_CLOSE,MODE_LOW ER,0) ; double BBhigh=iBands(NULL,15,55,0.2,0,PRICE_CLOSE,MODE_UP PER,0) ; if (Ask>BBhigh) if (OrdersTotal()==0) { Kaufen();} if (lastrail<TimeCurrent()-(60*15)) {Trailing(); lastrail=TimeCurrent();} } void Kaufen() { double BBlow=iBands(NULL,15,55,0.2,0,PRICE_CLOSE,MODE_LOW ER,0) ; OrderSend(Symbol(), OP_BUY,Ordervol,Ask,3,BBlow,(Ask+1.0010),NULL,1,0, Green); } void Trailing () { double BBlow=iBands(NULL,15,55,0.2,0,PRICE_CLOSE,MODE_LOW ER,0) ; OrderModify(1,Ordervol,BBlow,(Ask+1),0,Red); } |
|
|||
...mit OrderModify(1,...) wendest du das Ganze auch nur auf deine erste Order mit der Nr.1 an.
OrderModify(OrderTicket(),...) wäre korrekt in der Annahme das du vorher mit OrderSelect() deine Order ausgewählt hast. Ansonsten wenn du nur mit max. 1 gleichzeitigen Order hantierst/handelst kannst du dir auch die TicketNr. in einer Variable merken (bei der Order Eröffnung) und diese dann verwenden. Übrigends solltest du dann in deiner Trailfunktion auch noch überprüfen ob OrderStoploss()<BBlow ect. ist, da du ansonsten laute Fehlermeldungen bekommst von der OrderModify-Funktion. ...und an deiner OrderModify-Syntax arbeiten: bool OrderModify( int ticket, // ticket double price, // price double stoploss, // stop loss double takeprofit, // take profit datetime expiration, // expiration color arrow_color // color ); |
Lesezeichen |
Stichworte |
indicator, programmierung, programmierung metatrader, programmierung mql4, sl, sl trailing, stoploss, stopploss, trailing, update |
|
|