|
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
Trailingstop herabsetzen
Ich bin mir nicht ganz im Klaren, wie ich am besten einen Trailingstop decrementor einbaue.
Beispiel: Eine Long Order läuft, der erste Trailingabstand ist 1000. Aufgabe: Geht der Kurs weiter hoch, soll der Trailingabstand vermindert werden von 1000 auf 800 usw. Code bisher: Code:
// === user input extern int DefaultTS = 1000; // default Trailing Stop (2000) extern int DecreasTs = 200; // Trailing Stop descrease (200) // === internal global int LastTS = DefalutTS; // initial Decreased value // === die Trailing Funktion double ordprofit=0; // orders profit size to begin trailing double rq_price=0; // required price for stop loss setting (Bid or Ask) double rq_trail=0; // distance of trailing stop to price rq_trail=NormalizeDouble(LastTS*_Point,_Digits); //Normalize // === innerhalb der OrderSelect() ordprofit=2*( OrderCommission()+OrderSwap() ); //CoverCostsCash // ======= Buy Orders ======= if(Type==OP_BUY && OrderType()==OP_BUY) //Type wird der Funktion übergeben { // ===>while rq_price=MarketInfo(_Symbol,MODE_BID); //required price if( OrderProfit()>ordprofit //ProfitCoversCosts && OrderStopLoss()<rq_price-rq_trail ) //SLBelow Bid-TrailDist { if(OrderModify(OrderTicket(),OrderOpenPrice(), rq_price-rq_trail, //ChangeSL:Bid-TSdist OrderTakeProfit(),0,ColArrowShort) ) if(LastTS>DecreaseTS) LastTS=LastTS-DecreasTs; //NewValueUntilMinimum else Sleep(ErrorInterval); //FailWait // <=== end while } //ProfitCoversCosts } //BuyOrder Ich denke da an so etwas wie while(LastTS>DecreaseTS) ... Wäre nett, wenn Ihr dazu etwas anzumerken hättet. Danke. AVT |
|
|||
Distanz zwischen aktuellen Preis und Eröffnungspreis berechnen?
Entweder via OrderSelect oder den Preis von einem Array auslesen. Wobei ich nicht ganz verstehe ist das nun ein TrailingStop oder TrailingProfit? Mimo |
|
|||
wie komme ich aus der Funktion raus
Ich habe das einigermaßen so hinbekommen, daß es schon mal funktioniert, ABER
jetzt brauche ich Hilfe, um aus dieser Funktion bei Bedarf rauszukommen. Egal was ich versuche, einmal drin gibt es kein Entkommen mehr (außer SL ausgelöst; das ist zwar eigentlich Sinn und Zweck der Sache, aber wenn der Spike nicht sofort abgeht, ist es besser auszusteigen). Es geht hier um einen Booster, der den SL verdammt schnell nachzieht, zu benutzen bei Spikes (wenn man schnell genug ist). Der Aufbau vereinfacht am Beispiel Long: 1. 2 Buttons: 1x für LongBoost und 1x für Close 2. Beim LongBoost-Button wird die Variable BoostLongEnabled=true gesetzt und die BoostLong() aufgerufen 3. Beim Close-Button wird die Variable BoostLongEnabled=false gesetzt und die Close() Funktion aufgerufen Das Problem dabei ist wie oben gesagt, daß ein BoostLongEnabled=false die BoostLong() Funktion nicht abbricht. Code:
void BoostLong() { double ordprofit=0; // orders profit size to begin trailing, we use 2*(commission+swap) double rq_price=0; // required price for stop loss setting (Bid or Ask) double rq_trail=0; // distance of trailing stop to price TrailingStop=(double)StringToDouble(ObjectGetString(0,PFX+"TS<>",OBJPROP_TEXT)); //TSField DecreaseTS=DecreaseTS; ResetLastError(); while(OpenPos(OP_BUY)>0 && BoostLongEnabled) //WhileWeHaveLongs { 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_BUY ) //BuyOrder { //IsOneOfOurLongs: rq_price=MarketInfo(_Symbol,MODE_BID); //Getrequired price ordprofit=2*( OrderCommission()+OrderSwap() ); //CoverCostsCash if(OrderProfit()>ordprofit) //WeAreInProfit: { while(TrailingStop>DecreaseTS && BoostLongEnabled ) //WhileTSBiggerDecrementor { rq_trail=NormalizeDouble(TrailingStop*_Point,_Digits); //NormalizeIt _Debug(__FUNCTION__ +" rq_trail="+DoubleToStr(rq_trail,0) ); if(OrderStopLoss()<rq_price-rq_trail ) //SLBelow Bid-TrailDist if(OrderModify(OrderTicket(),OrderOpenPrice(), //TrailShort rq_price-rq_trail, //ChangeSL:Bid-TSdist OrderTakeProfit(),0,ColorArrowShort) ) //BoostSuccess: TrailingStop=TrailingStop-DecreaseTS; //DecreaseStopDistance _Log(" Buy boost."); _Debug(__FUNCTION__ +" TrailingStop="+DoubleToStr(TrailingStop,0) ); } //TSReachedDecrementor+StillInTrade rq_trail=NormalizeDouble(DecreaseTS*_Point,_Digits); //NormalizeDecrementor if(OrderStopLoss()<rq_price-rq_trail ) //SLBelow Bid-TrailDist if(OrderModify(OrderTicket(),OrderOpenPrice(), //TrailShort rq_price-rq_trail, //ChangeSL:Bid-TSdist OrderTakeProfit(),0,ColorArrowShort) ) //TrailSuccess: _Log(" Buy boost."); } } }//WhileWeHaveLongs if(OpenPos(OP_BUY)==0) { BoostLongEnabled=false; return; } //NoLongPositionsOpenAnyMore } |
Lesezeichen |
|
|