Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   Trailingstop herabsetzen (http://www.expert-advisor.com/forum/showthread.php?t=6428)

AVT 25.05.19 21:55

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

Frage: Gibt es eine Möglichkeit (ist das überhaupt sinnvoll :rolleyes:), die Trailing Funktion erst dann zu verlassen, wenn wir mit dem Vermindern fertig sind?
Ich denke da an so etwas wie while(LastTS>DecreaseTS) ...
Wäre nett, wenn Ihr dazu etwas anzumerken hättet. Danke. AVT

MIMO 26.05.19 14:06

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

AVT 31.05.19 19:55

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
}

Kann mir bitte jemand sagen, wo der Fehler ist :confused:. Danke. AVT


Alle Zeitangaben in WEZ +2. Es ist jetzt 15:28 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum