Geschrieben 12. März 201313 Jr. comment_143295 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); } //+------------------------------------------------------------------+ Bearbeitet 12. März 201313 Jr. von whipsaw Code Tags Melden
Geschrieben 12. März 201313 Jr. comment_143296 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 Melden
Geschrieben 12. März 201313 Jr. Autor comment_143297 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. Melden
Geschrieben 12. März 201313 Jr. comment_143302 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 Melden
Geschrieben 12. März 201313 Jr. comment_143303 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 Melden
Geschrieben 12. März 201313 Jr. comment_143307 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. Melden
Geschrieben 12. März 201313 Jr. Autor comment_143308 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 ? Melden
Geschrieben 12. März 201313 Jr. comment_143309 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 Melden
Geschrieben 12. März 201313 Jr. comment_143311 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 Melden
Geschrieben 12. März 201313 Jr. comment_143313 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. Melden
Geschrieben 12. März 201313 Jr. Autor comment_143314 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..... Bearbeitet 12. März 201313 Jr. von Ric Melden
Geschrieben 12. März 201313 Jr. Autor comment_143317 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 ? Melden
Geschrieben 12. März 201313 Jr. comment_143320 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. Melden
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); } //+------------------------------------------------------------------+Bearbeitet von whipsaw
Code Tags