Jump to content
Tom Next - Daytrading Community

EA funktioniert im Strategietester aber nicht Live


Mh47

Recommended Posts

Hallo :)

 

Ich habe mir hier mal einen EA zusammengebastelt der nur die Order schließen soll, bzw. den Stop Loss nachziehen soll.

Die Idee ist die Differenz des Hochs und Tiefs der vorherigen Bar mit 3 zu multiplizieren und den Stop Loss in diesem Abstand zum aktuellen Kurs nachzuziehen. (Idee ist von K. Tharp geklaut :P)

Natürlich bewegt sich der Stop nur in meine Richtung und nicht entgegen meines Kontos. Die Ordereröffnung sowie die Positionsgrößenbestimmung soll manuell erfolgen.

Im Strategietester des MT4 funktioniert dieser Stop sehr gut, (zufälliger Einstieg) allerdings stehe ich nun im "Livetest" ( Demokonto) vor 2 Problemen:

 

1. Wenn ich manuell eine Shortposition offen habe und den EA aktiviere so wird die Shortposition sofort geschlossen, der Stop bei einer Long Position funktioniert!

 

2. Ab und zu passiert es das der EA den Stop zu nah an den Markt legen will und ich bekomme eine Fehlermeldung. Gibt es eine Variable,Parameter oder ähnliches der mir den minimalen Abstand des Stops zum Markt anzeigt sodass ich diesen in meinen EA einbauen kann? Natürlich kann man für jeden Markt/ für jeden minimalen Abstand einen eigenen EA entwerfen aber eleganter wäre eine allgemeine Lösung.

 

So und hier mal der Code:

 

int start()
 {
 total = OrdersTotal();
 if (total <0) 
  {
     Print ("Fehler offene Order sind negativ");
     return (-1);
  } 
 while (total >= 0 )// Check for open Orders; Calculation Loop; Looks at every Order
 {
 double NewSL , Volatility ;
 
 if (OrderSelect(total, SELECT_BY_POS, MODE_TRADES) == true) //select order
 
  Volatility = High[1] - Low[1];
  if (Volatility > 0) // Check if Volatility is positive and bigger than 0
  
  //Long
  if (OrderType()== OP_BUY) // check if selected Order is long position
   {
  
     NewSL = Bid - (3*Volatility); // 3 times volatility stop
     if (NewSL > Bid ) Print("Check Stop Loss"); // Check if Stop Loss is lower than Bid price
     if ( NewSL < Bid )
        {
     if (OrderStopLoss() < NewSL) //check if new StopLoss is closer to the market, just move Stop Loss if it's in the right direction
        {
        OrderModify(OrderTicket(),OrderOpenPrice(),NewSL,OrderTakeProfit(),0,Red); // Send New Stop Loss to Broker
        return (0);
        }
        }
   
        if (OrderStopLoss() >= Bid ) // If StopLoss didn't close the order
        { 
         OrderClose(OrderTicket(),OrderLots(),Bid,20/*points of maximum slippage*/,Red);//Close Order
        }
    }
    
    
  //Short
  if (OrderType()==OP_SELL) // check if selected Order is short position
   { 
     NewSL = Ask + (3*Volatility);
     if (NewSL < Ask) Print("Check Stop Loss"); // Check if Stop Loss is above Ask price
     if (NewSL > Ask)
        {
     if (OrderStopLoss() > NewSL) // only move Stop Loss downwards 
        {
        OrderModify(OrderTicket(),OrderOpenPrice(),NewSL,OrderTakeProfit(),0,Red); // Send New Stop Loss to Broker
        return (0);
        }
        }
  
       if (OrderStopLoss() <= Ask) // If Stoploss didn't close the order
       {
       OrderClose(OrderTicket(),OrderLots(),Ask,20/*points of maximum slippage*/,Red);//Close Order
       } 
    }
  
total--; // decrease expression
} // End of WhileLoop

 

Ich kann mir leider nicht erklären wo der Fehler liegt, da es auch im Strategietester wunderbar läuft. Ich hoffe ihr könnt mir weiterhelfen.

 

Mit freundlichen Grüßen

 

Mh47

Link to comment
Share on other sites

Hi Mh47;

 

zu 1)

Dein OrderSL ist am Anfang 0. Das heißt, diese Abfrage greift bei Short sofort und schließt dir die Position:

       if (OrderStopLoss() <= Ask) // If Stoploss didn't close the order
       {
       OrderClose(OrderTicket(),OrderLots(),Ask,20/*points of maximum slippage*/,Red);//Close Order
       } 

zu 2)

Du kannst den minimalen SL-Abstand zum Kurs in Punkten über

distance=MarketInfo(Symbol(),MODE_STOPLEVEL);

ermittlen.

  • Upvote 3
Link to comment
Share on other sites

1. Wenn ich manuell eine Shortposition offen habe und den EA aktiviere so wird die Shortposition sofort geschlossen, der Stop bei einer Long Position funktioniert!

hab auf die schnelle keinen Fehler im EA gefunden. Mit den nicht vorhandenen Einrückungen is es um die Uhrzeit aber auch ein bissl schwer ;). Bleibt mir derweil nur der Standardtipp: Debugoutput. vor das OrderClose und das OrderModify damit du weißt was ausgeführt wird und welchen Zustand die Variablen hatten. Das hilft meist.

2. Ab und zu passiert es das der EA den Stop zu nah an den Markt legen will und ich bekomme eine Fehlermeldung. Gibt es eine Variable,Parameter oder ähnliches der mir den minimalen Abstand des Stops zum Markt anzeigt

 

jup.

MarketInfo(Symbol(),MODE_STOPLEVEL);

 

Edit: WOGO war natürlich schneller... :tissues:

Link to comment
Share on other sites

Dein OrderSL ist am Anfang 0. Das heißt, diese Abfrage greift bei Short sofort und schließt dir die Position:

WOGO bringt es auf den Punkt. Die Lösung ist recht simpel. Musst einfach nur die Abfrage erweitern.

 

       if (OrderStopLoss() <= Ask && OrderStopLoss() > 0) // If Stoploss didn't close the order
       {
       OrderClose(OrderTicket(),OrderLots(),Ask,20/*points of maximum slippage*/,Red);//Close Order
       } 

Link to comment
Share on other sites

Super :) Vielen Dank für die Hilfe

 

das erste Problem war nicht an der Stelle die WOGO vermutet hatte aber war genau das beschriebene Problem.

Ein paar Zeilen darüber musste ich nur das folgende einfügen.

 

  if (OrderStopLoss() > NewSL || OrderStopLoss()== 0)

 

Die von euch zitierte Stelle ist nur als Sicherheit gedacht falls der gesetzte StopLoss aus irgendeinem Grund nicht greift, der StopLoss wird ja vorher schon gesetzt.

 

Und das 2. Problem ließ sich vermutlich (Problem ist bisher nicht mehr aufgetreten :D ) mit

 

MarketInfo(Symbol(),MODE_STOPLEVEL);

 

lösen.

 

Vielen Dank an alle nochmal :)

Link to comment
Share on other sites

So jetzt einfach das nächste Problem,

der EA aktualisiert beim EUR/USD bei einer Long Position trotz steigender Kurse den SL nicht. Anfangs funktionierte es, doch jetzt bleibt der Stop einfach 5 Ticks vor Einstiegskurs stehen.

 

post-3291-0-39835300-1310697835_thumb.jpg

 

 

Ich hab zur Kontrolle einen 2. Trade aufgemacht um zu zeigen wo der Stop eigentlich stehen sollte. Ich vermute das der Einstiegskurs eine Art "magische Grenze" darstellt den der Stop nicht überschreiten will.

Um mein 2. (oben beschriebenes) Problem zu ändern hab ich folgenden Code eingefügt:

 

distance=MarketInfo(Symbol(),MODE_STOPLEVEL)* Point;

 

Bei Long Positionen

 

if (NewSL > Bid - distance) // Check if SL has minimum distance
        {
        NewSL= Bid - distance ;
        }

 

Analog dazu bei Short Positionen

 

if (NewSL < Ask+ distance)
        {
        NewSL= Ask+distance ;
        }

 

Anderseits bleibt das Problem auch bestehen wenn ich die oben genannten Zeilen lösche.

Ein Neustart des EA's von MT4 usw. hilft auch nicht weiter.

Ich wette da ist wieder so ein dummer Fehler drin den ich nicht finde :D

 

Mit freundlichen Grüßen

 

Mh47

Link to comment
Share on other sites

das erste Problem war nicht an der Stelle die WOGO vermutet hatte aber war genau das beschriebene Problem.

Ein paar Zeilen darüber musste ich nur das folgende einfügen.

Der Vollständigkeitshalber: Es war schon dort wo WOGO es vermutet hat. Da der stoploss zu beginn immer 0 ist, wurde er von dir nicht gesetzt, dadurch wurde deine Sicherheitsabfrage unten aktiv und die Order geschlossen.

 

Zur Sicherheit: Willst du mit dem EA alle offenen Trades verwalten? Weil im Moment nimmt er die erste Order die er nachziehen kann und hört dann auf ("return(0);" nach dem Modify)...

Link to comment
Share on other sites

Das erste Problem war nicht an der Stelle die WOGO vermutet hatte aber war genau das beschriebene Problem.

Doch. Das Problem war genau da. Und es ist da immer noch. Durch Deine Lösung fängst Du es nun halt vorher ab. Wenn Du die Reihenfolge der Abfragen umstellen würdest, würde er nämlich Deine Shorts immer noch sofort schließen. Da hilft dann die von mir gepostete Abfrage :wink:.

 

Wie dem auch sei: am ganzen Verfahren gibt es sicherlich noch etwas zu optimieren. Mythos hat ja schon auf das erste Problem hingewiesen. Ein weiteres vermute ich darin, dass die Überprüfung Volatility>0 nur für den long Fall gilt. Hier würde ich noch ein { setzen und erst hinter dem short Fall mit } diese if-Abfrage beenden.

 

Kriegen wir hier alles hin :correct:.

Link to comment
Share on other sites

Nachdem ich das Return (0) mal entfernt hab funktionierts bisher :) Danke hierfür schonmal, den anderen Rat mit dem && OrderStopLoss() >0 hab ich auch befolgt.

Es sieht jetzt fast so aus als ob alles funktionieren würde, aber ich lass das ganze lieber noch mal ne Weile testen bevor ich mich zu sicher fühle :D

 

@conglom-o gilt die Volatility >0 Abfrage nicht für beides da immer von oben nach unten vorgegangen wird? Also dürfte da doch theoretisch weder die if long noch short Bedingung überprüft werden wenn Volatility < 0 ist? Was gibt es denn methodisch zu verbessern? ( ich bin mir sicher ne ganze Menge :D ) Bin für jeden Ratschlag/Tipp offen.

 

Mit freundlichen Grüßen

 

Mh47

Link to comment
Share on other sites

@conglom-o gilt die Volatility >0 Abfrage nicht für beides da immer von oben nach unten vorgegangen wird?

Also meines Wissens nach - die Profis mögen mich hier ggf. bitte korrigieren - wird nach einer if-Abfrage nur die nächste Zeile berücksichtigt, sofern man nicht einen gesamten Block in { } packt. So wie Du es gebaut hast, sieht es zumindest "komisch" aus. Den Fehler wirst Du im Alltag aber kaum bemerken, da die Volatility in den seltensten Fällen 0 sein dürfte (nur wenn High=Low).

Link to comment
Share on other sites

wird nach einer if-Abfrage nur die nächste Zeile berücksichtigt, sofern man nicht einen gesamten Block in { } packt.

 

Genau. in dem Fall is es fies, da das If danach die Klammern hat, es ist also ein gesamter Block der hier als "eine Zeile" läuft. Aus diesem Grund sollte man immer auf korrekte Einrückung achten, dann fällt einem sowas schneller auf.

Link to comment
Share on other sites

Okay gut wieder was gelernt. Die Klammern werden hinzugefügt!

Was versteht ihr unter korrekten Einrückungen? Könnt ihr mir mal ein Beispiel geben?

 

Im Detail gibts da viele Ansichten, hängt vom aktuellen Codingstandard ab, aber es geht darum das Codezeilen die innerhalb eines blocks sind, eine "Ebene" weiter eingerückt sind.

zB:

if(irgendwas) 
{
 //alles in diesem Block ist eingerückt, also startet weiter
 //rechts als das davor
 if(wasanderes)
   das if wirkt auf diese Zeile, deswegen wird sie als Block gesehen und eingerückt
 nächste Anweisung=nicht mehr im block, nicht eingerückt
 
 if(jetzt mit block)
 {
   hier ist jetzt
   der gesamte
   Block eingerückt, dadurch sieht man schön das er "unter" dem if ist
 }
}

Mit solchen einrückungen ist der Code mMn deutlich leichter lesbar.

 

Beispiel aus deinem Code:

//Long
if (OrderType()== OP_BUY) // check if selected Order is long position
{
 NewSL = Bid - (3*Volatility); // 3 times volatility stop
 if (NewSL > Bid ) 
   Print("Check Stop Loss"); // Check if Stop Loss is lower than Bid price
 if ( NewSL < Bid )
 {
   if (OrderStopLoss() < NewSL) //check if new StopLoss is closer to the market, just move Stop Loss if it's in the right direction
   {
      OrderModify(OrderTicket(),OrderOpenPrice(),NewSL,OrderTakeProfit(),0,Red); // Send New Stop Loss to Broker
      return (0);
   }
 }
   
 if (OrderStopLoss() >= Bid ) // If StopLoss didn't close the order
 { 
    OrderClose(OrderTicket(),OrderLots(),Bid,20/*points of maximum slippage*/,Red);//Close Order
 }
}

 

Nachtrag: Wo man die geschwungenen Klammern genau hinmacht etc. sind Details die jeder anders handhabt (ich schreib normal die öffnenden Klammern in die gleiche Zeile wie zB das if, weils Platz spart...) hauptsächlich gehts um die codezeilen im Block.

Link to comment
Share on other sites

So ich hab das nächste Problem mit einem anderen Trailingstop und möchte dafür nicht extra ein Thema aufmachen. Der Trailingstop soll alle offenen Order ob short oder long verwalten.

Die Order möchte ich ähnlich wie oben selektieren und mit Hilfe einer while Schleife der Reihe nach durchgehen. Nun soll aber je nach Fall 2 Variablen pro Order gespeichert werden auf die in späteren Zugriffen wieder zugegriffen werden soll. Im Prinzip erfolgt sind hierfür ja die globalen Variablen gedacht, allerdings wird bei jeder neuen Order die bearbeitet wird die globale Variable die vorher gespeichert wurde wieder überschrieben? Wie löse ich das Problem? Vll. eine Art Datenbank anlegen? Wie geht das?

 

Vielen Dank

 

Mh47

Link to comment
Share on other sites

Hallo MH47,

 

wahrscheinlich liegt daß Problem im OrderSelect, aber, ich glaube solange du nicht den gesamten EA Code zeigst, dann kann nicht wirklich geholfen werden.

Das Grundgerüst muß erstmal stehen, sonst hast du in jeder Funktion immer wieder das Problem.

An deiner Stelle würde ich die Lage(Level) des Stopplosses nicht nur mit bid sondern auch mit deinem OrderOpenPrice vergleichen.

Achte auch auf Symbol und MagicNr.

 

Ciao,

frlaspina

Edited by frlaspina
Link to comment
Share on other sites

Im Prinzip erfolgt sind hierfür ja die globalen Variablen gedacht,

 

Wenn du mit globalen Variablen, die global definierten Variablen meinst, dann ja. Es gibt in MT noch die GlobalVariables, die sind für andere Dinge gedacht.

 

Für so Fälle wo du eine variable Anzahl an Werten speichern musst, bieten sich Arrays an. Wenn es immer genau 2 Variablen sind, ist die Frage ob du dich mit mehrdimensionalen Arrays "ärgern" musst, oder ob einfach 2 eindimensionale reichen...

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...