Zum Inhalt springen
View in the app

A better way to browse. Learn more.

#T/N/X/T

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.
Geschrieben

//+------------------------------------------------------------------+

//|                                                      Zahn EA.mq4 |

//|                                      Copyright 2014, Zahnstocher |

//|                                          [url="http://www.tom-next.com"]http://www.tom-next.com[/url] |

//+------------------------------------------------------------------+

#property copyright "Copyright 2014, Zahnstocher"

#property link      "[url="http://www.tom-next.com"]http://www.tom-next.com[/url]"

#include 







//--- input parameters

extern double TakeProfit=450.0;

extern double Lots=0.01;

extern double TrailingStop=150.0;





//+------------------------------------------------------------------+

//| expert initialization function                                   |

//+------------------------------------------------------------------+

int init()

  {

//----



//----

   return(0);

  }

//+------------------------------------------------------------------+

//| expert deinitialization function                                 |

//+------------------------------------------------------------------+

int deinit()

  {

//----

   

//----

   return(0);

  }



int Crossed1 (double line1 , double line2)

   {

  static int last_direction = 0;

  static int current_direction = 0;  

 

  if(line1>line2)current_direction = 1; // also buy

  if(line1  

  if(current_direction != last_direction)

  //changed

  {

         last_direction = current_direction;

         return (last_direction);

      }

      else

      {

      return (0);

   }

 }

//+------------------------------------------------------------------+

//| expert start function                                            |

//+------------------------------------------------------------------+

int start()

  {

//----

   int cnt, ticket, total;

   double RSIOMA1, RSIOMA2;   

   

   if(Bars<300)

    {

      Print("bars less than 300");

      return(0);

     }

   if(TakeProfit<10)

    {

      Print("TakeProfit less than 10");

      return(0); // check Takeprofit)

   }

   

   RSIOMA1= iCustom(NULL,0,"RSIZAHNOMAII",14,0,0);

   RSIOMA2= iCustom(NULL,0,"RSIZAHNOMAII",72,0,0);

    

   int isCrossed = Crossed1 (RSIOMA1,RSIOMA2);

   

   total = OrdersTotal();

   if(total < 1)

     {

      if(isCrossed == 1)

         {

   

   ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"My EA", 12345,0,Green);

         if(ticket>0)

          {

          if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

            Print("BUY order opened : ",OrderOpenPrice());

          }

          else Print("Error opening BUY Order : ",GetLastError());

          return(0);

          }

          if(isCrossed == 2)

            {

               ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"My EA",12345,0,Red);

               if(ticket>0)

               {

              if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

          Print("Sell order opened : ",OrderOpenPrice());

          }

          else Print("Error opening Sell Order : ",GetLastError());

          return(0);

          }

          return(0);

      }

      for(cnt=0;cnt

 
Als Basis hab ich den Coders Guru EA mit den Moving Averages hergenommen.

 

 

 

Heute Abend hab ich meinen gestern bearbeiten Custom Indicator eingefügt und den Code angepasst damit der mit 2 RSIOMA Kurven Arbeitet, siehe hier:

 

 

 

int cnt, ticket, total;

   double RSIOMA1, RSIOMA2;   

   

   if(Bars<300)

    {

      Print("bars less than 300");

      return(0);

     }

   if(TakeProfit<10)

    {

      Print("TakeProfit less than 10");

      return(0); // check Takeprofit)

   }

   

   RSIOMA1= iCustom(NULL,0,"RSIZAHNOMAII",14,0,0);

   RSIOMA2= iCustom(NULL,0,"RSIZAHNOMAII",72,0,0);

    

   int isCrossed = Crossed1 (RSIOMA1,RSIOMA2);

 

Die Logic ist die gleiche wie bei Coders Guru und natürlich weit weg von Profitabel, es ist auch noch nicht die Logic die ich später verwenden will, aber irgendwie muss man ja anfangen :)

 

Als nächstes möchte ich einen Candle Range Filter hinzufügen damit der EA nicht in z.B. einer 20pip Range zu Traden beginnt.

 

Aber keine Angst es werden viele Fragen folgen...

 

Grüße Zahnstocher*trailingstop)

;cnt++)

)current_direction>

post-4614-0-01127700-1391460482_thumb.png

post-4614-0-48744100-1391460493_thumb.png

  • Antworten 70
  • Aufrufe 8,6Tsd
  • Erstellt
  • Letzte Antwort

Top-Benutzer in diesem Thema

Most Popular Posts

  • Die Funktionen init() und deinit() sind dafür uninteresannt.   Die Funktion init() wird nur 1x aufgerufen, wenn man den EA in das Chartfenster läd. Die Funktion deinit() wird nur 1x aufgerufen,

  • Hi,   ich schau mir gerade den EA an und schreib einfach mal was mir auffällt. Zuerst mal was "kosmetisches": Das ist zugegebenermaßen großteils Geschmackssache, aber manche Dinge erhöhen die Fehleran

  • hier ist noch der Backtest mit 1.2pip spread! long / short separat.   TF 15min aufgrund der verwendeten Stochastic von 15min und 60min für den Exit.   Viel Spass beim testen und so hoffe ich beim opti

Veröffentlichte Bilder

Featured Replies

Geschrieben

Ohje, da scheint beim absenden des Beitrags irgendwas böse durcheinander gekommen zu sein. Leider ist es so durcheinander das ich es nicht einfach so ändern kann.

@Zahnstocher: wenn du mir den Code nochmal ggf. in PN schickst, passe ich deinen Beitrag so an das der Code stimmt. Derzeit is es eine wilde Mischung aus Text und Code, und der Code ist sicher nicht komplett und somit leider etwas unlesbar :(

Geschrieben
  • Autor

Sehr sympathischer Auftritt Zahnstocher shakehands.gif . Willkommen an Board und mach ruhig ein wenig Druck hier.

Bisschen frisches Blut tut der Liga der altehrwürdigen Herren ganz gut, glaube ich :wub:.

 

Dankesehr,

 

vielleicht haben die meisten schon gute EA und sonnen sich auf Mauritius :)

Geschrieben
  • Autor

Ohje, da scheint beim absenden des Beitrags irgendwas böse durcheinander gekommen zu sein. Leider ist es so durcheinander das ich es nicht einfach so ändern kann.

@Zahnstocher: wenn du mir den Code nochmal ggf. in PN schickst, passe ich deinen Beitrag so an das der Code stimmt. Derzeit is es eine wilde Mischung aus Text und Code, und der Code ist sicher nicht komplett und somit leider etwas unlesbar :(

 

Ich hab den Customindicator beigefügt und zusätzlich den Code der EA ins Notebook kopiert

 

sollte jetzt funktionieren.

RSIZAHNOMAII.mq4

EA.txt

Geschrieben
  • Autor

So und jetzt steh ich mal so richtig an, ich erhalte keine Fehlermeldung...

 

Das Print wird aber brav ausgeführt, im Backtest wird keine Order abgesetzt obwohl die Range erfüllt wird.

a der Print anzeigt kein Trade möglich, liegt mein Problem wohl am "Datensammeln"

 

Was hab ich übersehen? Nur eine Keinigkeit oder ein gröberer Fehler?

 

Variablen sind alle definiert, jedenfalls keinerlei Fehlermeldung beim Compilieren, der EA tut einfach nichts?

 

 

//------------------Candlerangefilter---------------------------------
double high = iHigh(NULL, 0, -1); //sollte das Hoch der vorherigen Kerze im aktuellen TF bestimmen?
double low = iLow(NULL, 0, -1); // das Tief der Vorherigen Kerze
double range = high - low; //berechnung der Range

if(range < rangeFilter) //wenn die Range unter dem Rangefilter liegt
{ //2
Print("Trade nicht möglich"); //Print trade nicht möglich
return(0); // Ende
}

post-4614-0-01165200-1391471520_thumb.png

Bearbeitet von Zahnstocher

Geschrieben

double high = iHigh(NULL, 0, -1); //sollte das Hoch der vorherigen Kerze im aktuellen TF bestimmen?

double low = iLow(NULL, 0, -1); // das Tief der Vorherigen Kerze

double range = high - low; //berechnung der Range

 

Da liegt ein Fehler. Das muss bspw. iHigh(NULL, 0, 1) sein. Die aktuelle Kerze hat immer den Index-Wert 0 und dann wird nach links aufwärts gezählt. Die Minuswerte braucht man eigentlich nur bei Indikatoren, die in die Zukunft malen (wie bspw. der Ichimoku Kinko Hyo).

Geschrieben
  • Autor

Das mit dem gleich testen hat sich erledigt!

 

Meine MT4 Plattform hat sich regelrecht zerrechnet (als ob der Rechner in einer Schleife arbeiten würde)

 

also neu downgeloadet und siehe da OANDA MT4 hat nun Build 600 und der editor sieht auch anders aus dürfte also MQL5 sein. Scheinbar ist MQL5 aber abwärtskompaktibel und der MT4 Roboter kann auch in MQL5 kompiliert werden und

hat heute diverse Backtests manche sogar mit minimal Gewinn absolviert.

 

Code ist aber noch fehlerbehaftet, SL funktioniert noch nicht, Entrylogic auch noch nicht, Candlerange dito...

 

Ist nicht leicht :)

post-4614-0-91305000-1391544261_thumb.png

Geschrieben

Scheinbar ist MQL5 aber abwärtskompaktibel und der MT4 Roboter kann auch in MQL5 kompiliert werden.

 

Nein, ist es nicht. MQL5 ist eine ganz andere Programmiersprache als MQL4. Es scheint aber wirklich mit der neusten Version des MT4 auch einen neuen Editor mitgegeben zu haben.

 

Geschrieben
  • Autor

Nein, ist es nicht. MQL5 ist eine ganz andere Programmiersprache als MQL4. Es scheint aber wirklich mit der neusten Version des MT4 auch einen neuen Editor mitgegeben zu haben.

 

 

Ah danke!, Da haben mich dann die anderen Symbole am Desktop fehlgeleitet, es scheint aber dennoch unterschiede zu geben:

 

ihigh, ilow findet sich nicht mehr in der Onlinehilfe und scheint auch vom Programm her nicht mehr unterstützt zu werden?!?

 

Gut ist jetzt nicht soo dramatisch hab auch noch einen Roboforex account (auf dem der Robot dann auch laufen wird) der ist noch Build 579 (wenn ich mich nicht

irre und der Editor ist noch der alte).

 

Eine Funktion beim neuen Editor ist mir aufgefallen "zusammengehörige" Parameter in (xxxxx) oder {xxxx} werden für den User übersichtlich markiert.

Das erleichtert für mich das Lesen wesentlich.

 

Grüße Zahnstocher

Geschrieben
  • Autor

^^ eine Frage hab ich noch zum RangeFilter,

 

ich hätte ihn unter int start platziert, quasi vor dem

if(Bars<300)

{

Print("bars less than 300");

return(0);

}

 

 

Macht es Programmierungstechnisch einen Sinn wenn ich das ganze unter

int init

 

=> if range > Filter

return(0); // also initialisierung abgeschlossen

 

else // bzw. darunter deinitialisierung?

 

int deinit?

 

Sprich der EA initialisiert sich nur fertig wenn die Candlerange erfüllt wird und geht in die deinitialisierung über wenn die nicht erfüllt wird.

 

 

Referenz für die Candlerange ist Periode_H1 => Trade Entrys sind jedoch im 1, 5 oder 15min Chart, je nachdem wie genau ich die Entries mit

der Open und Close Logic timen kann.

 

Grüße Zahnstocher

 

 

Bin für jeden Tip dankbar (erwarte keinen Fertigen Code, aber ein kleiner Schubser wäre net :))

Geschrieben

Sprich der EA initialisiert sich nur fertig wenn die Candlerange erfüllt wird und geht in die deinitialisierung über wenn die nicht erfüllt wird.

 

Die Funktionen init() und deinit() sind dafür uninteresannt.

 

Die Funktion init() wird nur 1x aufgerufen, wenn man den EA in das Chartfenster läd.

Die Funktion deinit() wird nur 1x aufgerufen, wenn der EA beendet wird (vom Chart entfernt)

Die Funktion start() wird bei jedem Tick aufgerufen.

 

Deinen Range Filter kannst du in der start() Funktion einbauen. Wenn du willst gleich als erstes aber hinter dem

if(Bars<300)
{
Print("bars less than 300");
return(0);
}
Geschrieben
  • Autor

herzlichen Dank, da bin ich einem irrglauben erlegen!

 

 

Wie es aushieht kann ich einen weiteren Teil meiner Entry Logik heute Abend abhaken, das 3fach Cross siehe Example:

 

was nun noch fehlt ist die Eingrenzung des Langfristigen RSIOMA mit Periode 244

 

Dieser ist im Cross eingearbeitet ABER - was noch fehlt:

 

- only Buy if RSIOMA >80, only Sell if RSIOMA <20; denn dzt. kauft der EA auch in einen RSIOMA <20 noch fleissig rein....

- Candlerange

- SL oder Exitstrategie

 

Mach heute mit der Aktuellen Version 1e noch ein paar Backtests denn in einem Choppy market sollte er eigentlich keine gröberen Mankos haben.

Geschrieben
  • Autor

trotz alle "mängel"

 

freuuuuuuuuu crazy.gif

 

Bedingt durch den exit cross der untergeordneten Periode ist der Takeprofit nur sekundär.

Hab da nicht lange Rumgedocktort oder optimiert, einfach mal laufen lassen.

 

Bin mir sicher das mit den zusätzlichen Einschränkungen die Trefferquote hoch und der mögliche TF runter geht :)

 

schei*e ich freu mich

 

 

post-4614-0-85204500-1391631299_thumb.png

post-4614-0-20912000-1391631312_thumb.png

Geschrieben
  • Autor

Na also, wird doch good2.gif .

Teste mal über einen längeren Zeitraum, damit man sieht wie stabil es ist.

 

bei einem längeren Zeitraum geht mein Rechner ordentlich in die Knie

 

Was ich heute mal versucht hab maximale Orderanzahl auf 26offene Trades erhöht,

ist zwar nicht das gleiche aber es werden viel mehr mögliche Kombiniationen an Entries und Exits durchgespielt.

 

anbei die Grafik.

 

Was ich immer noch nicht geschafft habe ist die Candlerange, sie wird einfach vom EA ignoriert.

post-4614-0-14698200-1391713209_thumb.png

Bearbeitet von Zahnstocher

Geschrieben

Was ich immer noch nicht geschafft habe ist die Candlerange, sie wird einfach vom EA ignoriert.

 

Zeige mal den Code Schnipsel, vielleicht kann ich dir helfen.

Geschrieben
  • Autor

extern int RangeFilter = 20;

 

double rangeFilter;

int digits = 0;

double point = 0.0;

 

//+------------------------------------------------------------------+

//| expert initialization function |

//+------------------------------------------------------------------+

int init()

{

rangeFilter = NormalizeDouble(point * RangeFilter, digits);

digits = Digits;

point = Point;

 

return(0);

}

..

..

..

 

 

//+------------------------------------------------------------------+

//| expert start function |

//+------------------------------------------------------------------+

int start()

//----

 

{

double high = iHigh(NULL,PERIOD_H1,0);

double low = iLow(NULL,PERIOD_H1,0);

double open = iOpen(NULL,PERIOD_H1,0);

double range = high - low;

 

if(range<rangeFilter)

{

Print("Candlerange not met");

return(0);

}

 

if(Bars<300)

{

Print("bars less than 300");

return(0);

}

 

Ich bekomme kein Fehlermeldung beim Compilieren.

Die Order werden geöffnet egal ob der Rangefilter auf 0.1pip oder 900pips liegt.

 

Liegt der Fehler in der Rangeberechnung?

Bearbeitet von Zahnstocher

Geschrieben
  • Autor

ups hab grad gesehen oben RangeFilter unten rangeFilter

 

probier das gleich noch aus!

 

Edit, Ändert leider nichts!

Bearbeitet von Zahnstocher

Geschrieben

Wenn es geht, zeig uns doch nochmal den gesamten Quelltext. Gerne auch per PM oder Skype, wenn er nicht öffentlich sein soll. Den Fehler werden wir schon finden :conglom-o:.

Geschrieben
  • Autor

Danke für eure Hilfe!

 

nö hab keine Geheimnisse, muss morgen früh aus den Federn, hab jetzt noch den Stoploss hinzugefügt.

 

Werde morgen Abend den ganzen Expert hochladen und dann könnt ihr euch austoben.

 

Crosslogik, TS, SL, TP funktioniert schon einwandfrei.

 

Grüße Zahnstocher

 

Edit: hab mir schon überlegt was als nächstes kommt, der ADX!

Hoffe die Entries so weit eingrenzen zu können das die Positionsgröße sinnvoll erhöht werden kann!

 

 

EARISOMA_CandlerangeV4.mq4

Bearbeitet von Zahnstocher

Geschrieben
int digits = 0;
double point = 0.0;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()           
  {
   RangeFilter = NormalizeDouble(point * RangeFilter, digits);
  digits = Digits;
   point = Point;
   
  return(0);
  }

Da sehe ich schon das erste Problem. Du setzt den RangeFilter beim Initialisieren auf 0 (da point und digits auf 0 stehen). Danach wird er nie neu berechnet. Ergo trifft Deine Bedingung Range>Rangefilter IMMER zu. Probiere es mal so:

 

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()           
  {
  int digits = Digits;
  double point = Point;   
  RangeFilter = NormalizeDouble(point * RangeFilter, digits);   
  return(0);
  }

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

Account

Navigation

Suche

Suche

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.