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)
-   -   Stop Loss ODER Trendwechsel (http://www.expert-advisor.com/forum/showthread.php?t=5929)

Trader93 26.11.17 18:35

Stop Loss ODER Trendwechsel
 
Guten Abend zusammen,

ich bin - mal wieder- auf eure Hilfe angewiesen. Ich habe aktuell folgendes Problem:

Derzeit wird die Order ausschließlich dann geschlossen, wenn der Trend (Moving Average) sich dreht. Da mir aber dabei möglicherweise zu hohe umkalkulierbare Verluste entstehen, wollte ich zusätzlich zu dieser Logik einen SL einbauen, um den Maximalverlust zu deckeln.

Hierbei ergibt sich aber bei mir die Problematik, dass der EA durch den SL "zerschossen" wird - Hab erst den SL und dann den Code für die "Trendwende". Der Code an sich funktioniert, nur generiert er interessanterweise deutlich weniger Trades. Daher die Frage:

Habt ihr eine Idee, wie man die beiden Komponenten verbinden kann? Quasi:

Schließe die Long Order, wenn der Kurze den Langen MA kreuzt, oder du 25% im Verlust bist.

Trader93 26.11.17 18:43

Aktuell sieht es so aus

Code:

 
// SL Long setzen
  if (OrderSelect(LongOrder,SELECT_BY_TICKET)== true)
  {
  if (OrderCloseTime()== 0 && OrderStopLoss()==0)
  {
  double StopLoss= NormalizeDouble(OrderOpenPrice()/(1+(SL_prozent/100)),Digits);
  bool OrderAngepasst = OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss,OrderTakeProfit(),0,Yellow);
  }
  }
 // Trendwechsel von Long auf Short
      if (OrderSelect(LongOrder,SELECT_BY_TICKET)== true)
      {
      if((MAkurz<MAlang) == true)
      {
      bool LongOrderGeclosed = OrderClose(LongOrder,OrderLots(),Bid,10,Blue);
      if (LongOrderGeclosed==true) LongOrder=0;
      }
   
      }


Trader93 27.11.17 19:43

Nach mehrmaligem Lesen habe ich das Gefühl, dass der Kern der Aussage noch nicht ganz raus kommt. Und zwar benötige ich einen Tipp/Hinweis, wie ich die beiden Dinge miteinander verknüpfen kann. Wenn ich den SL drin habe, schließt er die Order aufgrund des MA Crossings nicht mehr... Ziel soll einfach nur sein, dass das MA Crossing die Primärexitlogik ist und der SL quasi nur unterstützend agiert und den maximalen Verlust pro Trade deklariert. Nur bin ich leider mit meinen minimalistischen Programmierfähigkeiten nicht in der Lage sowas ohne Hilfe hinzubekommen. Aber ich möchte es lernen :)

Über Tipps, der Spezialisten freue ich mich sehr

Kronenchakra 27.11.17 20:56

Versuch den SL und den Kreuzungspunkt NICHT zu verknüpfen, sondern hintereinander abzufragen.
Zuerst den Kreuzungspunkt, dann den SL.

Und ein kleiner Programmierhinweis:
Code:

if((MAkurz<MAlang) == true)

es reicht:

if(MAkurz<MAlang)

detto:
Code:

if (OrderSelect(LongOrder,SELECT_BY_TICKET)== true)

vereinfacht:

 if (OrderSelect(LongOrder,SELECT_BY_TICKET))

Grüße, Otto

Trader93 27.11.17 22:03

Danke für deinen Hinweis hinsichtlich der Redundanzen. Diese nehme ich raus, merci.

Verstehe ich dich richtig, dass ich die beiden Codes nur umstellen muss und dort nicht extra eine Art „Bindebefehl“ rein muss?

Sorry für die blöden Fragen

Kronenchakra 27.11.17 22:35

Blöde Gegenfrage: warum verwendest du nicht den MT5 ?
Da könnte ich dir wesentlich besser helfen.

Ich versuche deine Frage in Pseudocode zu beantworten.
Das ganze wär für die Ereignisprocedur OnTick()
Code:

void OnTick()
  {
  if(offenePosition)
      {
        if(posLong)
          {                  // pos is long
            if(maCrossShort)
              drehe_position;
            if(SL_long_trigger)
              closeLong;
          }
        else
          {                  // pos is short
            if(maCrossLong)
              drehe_position;
            if(SL_short_trigger)
              closeShort;
          }
      }
  else        // keine position offen
      {
        if(maCrossShort)
            open_short;
        if(maCrossLong)
            open_long;
      }
  }

Ich hoffe das hilft dir weiter.

Es ist irgendwie ein Jammer, das es da keine vernünftige Codebibliothek gibt
und jeder das Rad neu erfinden muss.

Grüße, Otto

Trader93 28.11.17 20:06

Ich muss ein wenig zurück rudern. Wenn ich das "== true" entferne, führt dies zu Fehlern im Programm.

Aber deinen Pseudocode (danke dafür) habe ich versucht umzusetzen.
Zuerst das Positive: Der EA macht die Tradeanzahl die ich erwartet habe. ABER: Der EA macht jetzt aber mehr Verluste?! Obwohl der SL_prozent mit 25definiert wird. Lt. Strategietester ist der größte Verlusttrade bei 0.1 Lot bei 269 EUR, während das reine schließen einen max. Verlust von 87,50 EUR generiert. Irgendwo ist da noch der Wurm drin, wenn die Sicherheitsmaßnahme das Loss quasi mehr als verdreifacht.
Ideen, was ich falsch mache?

Code:

{
.
.
.
// Trendwechsel von Long auf Short
      if (OrderSelect(LongOrder,SELECT_BY_TICKET)== true)
      {
        if((MAkurz<MAlang) == true)
            {
      //Order Closing
              bool LongOrderGeclosed = OrderClose(LongOrder,OrderLots(),Bid,10,Blue);
              if (LongOrderGeclosed==true) LongOrder=0;
            }
      else
            {
      //SL
              if (OrderCloseTime()== 0 && OrderStopLoss()==0)
                {
                  double StopLoss= NormalizeDouble(OrderOpenPrice()/(1+(SL_prozent/100)),Digits);
                  bool OrderAngepasst = OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss,OrderTakeProfit(),0,Yellow);
                }
     
            }
      //Trendwechsel von Short auf Long
     
      if (OrderSelect(ShortOrder,SELECT_BY_TICKET)== true)
      {
        if ((MAkurz>MAlang)== true)
            {
      //Order Closing
                bool ShortOrderGeclosed = OrderClose(ShortOrder,OrderLots(),Ask,10,Green);
                if (ShortOrderGeclosed==true) ShortOrder=0;
            }
      else
            {
      //SL
              if (OrderCloseTime()== 0 && OrderStopLoss()==0)
                {
                  double StopLoss= NormalizeDouble(OrderOpenPrice()*(1+(SL_prozent/100)),Digits);
                  bool OrderAngepasst = OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss,OrderTakeProfit(),0,Yellow);
                }
            }
      }
      }
.
.
.
return(0);
}


Kronenchakra 28.12.17 19:02

Code:

if(OrderSelect(LongOrder,SELECT_BY_TICKET))
  if(MAkurz<MAlang)
      {
      }

Das MUSS funktionieren :)


Alle Zeitangaben in WEZ +2. Es ist jetzt 18:08 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