Jump to content
Tom Next - Daytrading Community

Recommended Posts

Posted (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 by whipsaw
Code Tags
Posted

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

Posted

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.

Posted

Hallo Ric, wilkommen bei Tom-Next Howdy.gif

 

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 :laugh:

Posted

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

Posted

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

Der Smiley in der rechten ecke ist aktiv,

 

keine meldungen vom Ea

 

wie erzwinge ich denn einen Trade ?

Posted

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 ;-)

 

Test.png

 

LG ST

Posted

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

Posted

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.

Posted (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.....crazy.gif

Edited by Ric
Posted

Was passiert eigentlich wenn

3EMA > 200EMA

UND

3EMA < 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 EMA

3EMA<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 ?

Posted

Print

Um 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/Ausstieg

Zu deinem Einstieg

Optimiert:

3EMA>200 EMA

3EMA

Du solltest

Einstieg

3EMA>200EMA und 3EMA>20EMA

 

Ausstieg

3EMA

 

Grund wurde oben bereits geschrieben dass beim Fall von

3 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 Balken

Um 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.

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
×
×
  • Create New...