Ric Posted March 12, 2013 Report Posted March 12, 2013 (edited) Hallo Welt, ich habe heute mit dem EA Builder versucht ein ganz simplen EA zu programmieren. Gesagt, getan..... Der EA tradet aber nicht, wenn meine eingegeben parameter zutreffen. Der EA Soll traden, wenn die 3 EMA größer ist als die 200 EMA Der Trade soll geschlossen werden, wenn die 3 EMA kleiner wird als die 20 EMA. Ich hoffe jemand kann mir sagen, warum dieser einfache EA nicht tradet :( Danke und Grüße Ric der Code ist: #define SIGNAL_NONE 0 #define SIGNAL_BUY 1 #define SIGNAL_SELL 2 #define SIGNAL_CLOSEBUY 3 #define SIGNAL_CLOSESELL 4 #property copyright "Expert Advisor Builder" #property link "http://sufx.core.t3-ism.net/ExpertAdvisorBuilder/" extern int MagicNumber = 0; extern bool SignalMail = False; extern bool EachTickMode = True; extern double Lots = 1.0; extern int Slippage = 3; extern bool UseStopLoss = True; extern int StopLoss = 30; extern bool UseTakeProfit = True; extern int TakeProfit = 60; extern bool UseTrailingStop = True; extern int TrailingStop = 30; int BarCount; int Current; bool TickCheck = False; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { BarCount = Bars; if (EachTickMode) Current = 0; else Current = 1; return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { int Order = SIGNAL_NONE; int Total, Ticket; double StopLossLevel, TakeProfitLevel; if (EachTickMode && Bars != BarCount) TickCheck = False; Total = OrdersTotal(); Order = SIGNAL_NONE; //+------------------------------------------------------------------+ //| Variable Begin | //+------------------------------------------------------------------+ double Buy1_1 = iMA(NULL, 0, 3, 0, MODE_EMA, PRICE_CLOSE, Current + 0); double Buy1_2 = iMA(NULL, 0, 200, 0, MODE_EMA, PRICE_CLOSE, Current + 0); double CloseBuy1_1 = iMA(NULL, 0, 3, 0, MODE_EMA, PRICE_CLOSE, Current + 0); double CloseBuy1_2 = iMA(NULL, 0, 20, 0, MODE_EMA, PRICE_CLOSE, Current + 0); //+------------------------------------------------------------------+ //| Variable End | //+------------------------------------------------------------------+ //Check position bool IsTrade = False; for (int i = 0; i < Total; i ++) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if(OrderType() <= OP_SELL && OrderSymbol() == Symbol()) { IsTrade = True; if(OrderType() == OP_BUY) { //Close //+------------------------------------------------------------------+ //| Signal Begin(Exit Buy) | //+------------------------------------------------------------------+ if (CloseBuy1_1 < CloseBuy1_2) Order = SIGNAL_CLOSEBUY; //+------------------------------------------------------------------+ //| Signal End(Exit Buy) | //+------------------------------------------------------------------+ if (Order == SIGNAL_CLOSEBUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) { OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen); if (SignalMail) SendMail("[signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Close Buy"); if (!EachTickMode) BarCount = Bars; IsTrade = False; continue; } //Trailing stop if(UseTrailingStop && TrailingStop > 0) { if(Bid - OrderOpenPrice() > Point * TrailingStop) { if(OrderStopLoss() < Bid - Point * TrailingStop) { OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point * TrailingStop, OrderTakeProfit(), 0, MediumSeaGreen); if (!EachTickMode) BarCount = Bars; continue; } } } } else { //Close //+------------------------------------------------------------------+ //| Signal Begin(Exit Sell) | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Signal End(Exit Sell) | //+------------------------------------------------------------------+ if (Order == SIGNAL_CLOSESELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) { OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange); if (SignalMail) SendMail("[signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Close Sell"); if (!EachTickMode) BarCount = Bars; IsTrade = False; continue; } //Trailing stop if(UseTrailingStop && TrailingStop > 0) { if((OrderOpenPrice() - Ask) > (Point * TrailingStop)) { if((OrderStopLoss() > (Ask + Point * TrailingStop)) || (OrderStopLoss() == 0)) { OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point * TrailingStop, OrderTakeProfit(), 0, DarkOrange); if (!EachTickMode) BarCount = Bars; continue; } } } } } } //+------------------------------------------------------------------+ //| Signal Begin(Entry) | //+------------------------------------------------------------------+ if (Buy1_1 > Buy1_2) Order = SIGNAL_BUY; //+------------------------------------------------------------------+ //| Signal End | //+------------------------------------------------------------------+ //Buy if (Order == SIGNAL_BUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) { if(!IsTrade) { //Check free margin if (AccountFreeMargin() < (1000 * Lots)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } if (UseStopLoss) StopLossLevel = Ask - StopLoss * Point; else StopLossLevel = 0.0; if (UseTakeProfit) TakeProfitLevel = Ask + TakeProfit * Point; else TakeProfitLevel = 0.0; Ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, StopLossLevel, TakeProfitLevel, "Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue); if(Ticket > 0) { if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) { Print("BUY order opened : ", OrderOpenPrice()); if (SignalMail) SendMail("[signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Open Buy"); } else { Print("Error opening BUY order : ", GetLastError()); } } if (EachTickMode) TickCheck = True; if (!EachTickMode) BarCount = Bars; return(0); } } //Sell if (Order == SIGNAL_SELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) { if(!IsTrade) { //Check free margin if (AccountFreeMargin() < (1000 * Lots)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } if (UseStopLoss) StopLossLevel = Bid + StopLoss * Point; else StopLossLevel = 0.0; if (UseTakeProfit) TakeProfitLevel = Bid - TakeProfit * Point; else TakeProfitLevel = 0.0; Ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, StopLossLevel, TakeProfitLevel, "Sell(#" + MagicNumber + ")", MagicNumber, 0, DeepPink); if(Ticket > 0) { if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) { Print("SELL order opened : ", OrderOpenPrice()); if (SignalMail) SendMail("[signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Open Sell"); } else { Print("Error opening SELL order : ", GetLastError()); } } if (EachTickMode) TickCheck = True; if (!EachTickMode) BarCount = Bars; return(0); } } if (!EachTickMode) BarCount = Bars; return(0); } //+------------------------------------------------------------------+ Edited March 12, 2013 by whipsaw Code Tags
lutzs Posted March 12, 2013 Report Posted March 12, 2013 So etwas sucht man nicht indem man zuerst den gesamten Quellcode inspiziert. Das wäre die Nadel im Heuhaufen. Ist der Smiley rechts oben eingeschaltet so dass der EA aktiv ist?Gibt es dann eine oder mehrere Meldungen vom EA? Dann: Was passiert wenn man die Bedingungen weglässt und einen Trade 'erzwingt'? HTH Lutz
Ric Posted March 12, 2013 Author Report Posted March 12, 2013 Hallo Lutzs, also der EA gibt gar nicht´s aus. Ich habe den EA über mehrere Wochen im Backtestingprogramm testen lassen. Fazit: 0 Trades. wenn ich mir aber alles so einzeichne wie ich es "programmiert" habe hätte er ein paar mal traden müssen.
Vola Posted March 12, 2013 Report Posted March 12, 2013 Hallo Ric, wilkommen bei Tom-Next Hier findest du vllt. einige weitere Informationen zu deiner Thematik. Troubleshooting@Mods(Der geänderte Link von "Troubleshooting" auf "Google" sieht jetzt echt hilfreich aus
lutzs Posted March 12, 2013 Report Posted March 12, 2013 Hallo Lutzs, also der EA gibt gar nicht´s aus. Ich habe den EA über mehrere Wochen im Backtestingprogramm testen lassen. Fazit: 0 Trades. wenn ich mir aber alles so einzeichne wie ich es "programmiert" habe hätte er ein paar mal traden müssen.Hast du meine anderen Fragen gelesen? Lutz
systemtrader Posted March 12, 2013 Report Posted March 12, 2013 Mama Mia Der EA schießt mir glatt mein MT4 ab da ist ein Dickes Ei drin, er würde Traden aber das wäre nicht gut für dein Konto ;-) Ich schaue mir mal an wo der Fehler liegt.
Ric Posted March 12, 2013 Author Report Posted March 12, 2013 So etwas sucht man nicht indem man zuerst den gesamten Quellcode inspiziert. Das wäre die Nadel im Heuhaufen. Ist der Smiley rechts oben eingeschaltet so dass der EA aktiv ist?Gibt es dann eine oder mehrere Meldungen vom EA? Dann: Was passiert wenn man die Bedingungen weglässt und einen Trade 'erzwingt'? HTH LutzDer Smiley in der rechten ecke ist aktiv, keine meldungen vom Ea wie erzwinge ich denn einen Trade ?
systemtrader Posted March 12, 2013 Report Posted March 12, 2013 Hallo Zuerst einmal die Lots Runter drehen wegen error 134 oder Konto Rauf. Sl und TP geht musste eben einstellen wie es dir passt, aber auch darüber nachdenken was nach SL oder TP passieren soll !!! Imo Steigt er immer wider ein wenn die Buy Bedingung = True ist !!!!! Korrigiere erst mal diese Geschichten dann schauen wir uns den Rest mal an. Ah und der EA geht ansonsten will aber keiner das er so Handelt ;-) LG ST
lutzs Posted March 12, 2013 Report Posted March 12, 2013 Der Smiley in der rechten ecke ist aktiv, keine meldungen vom Ea wie erzwinge ich denn einen Trade ? Indem du die Bedingungen vor der Tradeeröffnung herausnimmst so dass er unter allen Umständen geöffnet wird.Dann weisst du erst mal dass dieser Teil funktioniert, die Bedingungen schränken dann nur noch ein. Lutz
siscop Posted March 12, 2013 Report Posted March 12, 2013 Der EA Soll traden, wenn die 3 EMA größer ist als die 200 EMA Der Trade soll geschlossen werden, wenn die 3 EMA kleiner wird als die 20 EMA.Was passiert eigentlich wenn 3EMA > 200EMA UND 3EMA Er würde bei jedem Tick ein und wieder aussteigen. Das sind die unendlich viele Trades des Screenshots vom systemtrader. Du solltest 3EMA > 20EMA noch als Einstiegsbedinung mit aufnehmen. Weiterhin einen Filter dass er nur ein Einstiegssignal pro Bar nimmt. Um zu sehen wo der Fehler liegt solltest du ein paar Print Befehle einsetzen und schauen wo der welche Parameter hat bzw ob er dort überhaupt hin kommt.
Ric Posted March 12, 2013 Author Report Posted March 12, 2013 (edited) danke erstmal für EURE Threads, ich hab mir dass irgendwie leichter vorgestellt.... mich würde ja erstmal interessieren warum der Systemtrader aus dem EA Trade´s angezeigt bekommt und ich nicht im backtesting ? jetzt schnall ich erstmal wo ich die error´s sehe :D Ich habe jetzt den Error 130.... (lernen macht spass) Neuer Edit: manchmal bin ich aber auch was dämlich...... ich hatte es nicht auf den dax angewendet sonder auf EUR/YEN..... Edited March 12, 2013 by Ric
Ric Posted March 12, 2013 Author Report Posted March 12, 2013 Was passiert eigentlich wenn3EMA > 200EMAUND3EMA < 20EMA Er würde bei jedem Tick ein und wieder aussteigen. Das sind die unendlich viele Trades des Screenshots vom systemtrader.Du solltest 3EMA > 20EMA noch als Einstiegsbedinung mit aufnehmen. Weiterhin einen Filter dass er nur ein Einstiegssignal pro Bar nimmt.Um zu sehen wo der Fehler liegt solltest du ein paar Print Befehle einsetzen und schauen wo der welche Parameter hat bzw ob er dort überhaupt hin kommt.Optimiert:3EMA>200 EMA3EMA<20 EMA Exit Ich habe jetzt noch die Ticks auf Bar umgestellt. Ergebnis, statt -929 eur nur noch -500 EUR. Wie meinst du das mit Filter und was hat das mit den Printbefehlen auf sich ?
siscop Posted March 12, 2013 Report Posted March 12, 2013 PrintUm zu filtern wo ein Fehler liegt fügt an den Kritischen stellen Printbefehle ein um Parameter auszuspucken bzw. um überhaupt zu sehen ob er dort hin kommt. Einstieg/AusstiegZu deinem EinstiegOptimiert:3EMA>200 EMA3EMADu solltestEinstieg3EMA>200EMA und 3EMA>20EMA Ausstieg3EMA Grund wurde oben bereits geschrieben dass beim Fall von3 EMA > 200 EMA und 3 EMA Die Einstiegskriterien und die Ausstiegskriterien wären dann beide erfüllt. MT4 macht bei jedem einkommenden Preis (Tick) und nicht bei jedem Balken einen Einstieg sowie einen Ausstieg.So kommen die vielen Trades an einem Balken zustande. Ein Trade pro BalkenUm zu Filtern dass nur ein Trade pro Balken gemacht wird kannst du ein bool (firsttrade) verwenden der beim Anzahl Balken wechsel auf true setzen und beim tatsächlichen Einstieg dann als false. Diesen bool nimmst du dann zum Einstiegskriterien mit rein.Beispiel static bool firsttrade=false; static int Balken=0; ... if (Bars!=Balken) { Balken=Bars; firsttrade=true; }firsttrade dann mit in die Einstiegskriterien nehmen um beim tatsächlichen Einstieg dann auf false setzen.
Recommended Posts
Please sign in to comment
You will be able to leave a comment after signing in
Sign In Now