Autor Thema: Wir lernen MQL4  (Gelesen 7250 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

  • Global Moderator
  • Ist Forum süchtig
  • *
  • *
  • *
    • Beiträge: 1714
    • Karma: +422/-6
    • Mitglied seit:
      11 Aug 2009
  • Broker: IGMarkets

  • Mars Defense Car Chaos Get Groovy BallsPC Motorrad-Trauma
    Bloons Tower Defense
  • Stop
Wir lernen MQL4
« am: Juli 10, 2010, 11:06:23 am »
Meine erste Programmiersprache war ein hardware-Basic auf einem zarten KC87 (Fans der Hardware aus Mühlhausen wissen wovon ich spreche). Ich war damals gute 9 Jahre alt und hatte die 50 mitgelieferten  Spiele auf Kassette schnell durch. Es war also an der Zeit sich den Quellcodes dieser Machwerke zu widmen. Und durch learning-by-doing brachte ich mir quasi autodidaktisch die erste Programmiersprache bei.

Ähnliches will ich für Interessierte mit MQL4 mal versuchen. Als Einstiegs"programm" habe ich mir den Indikator Stochastic.mq4 rausgesucht.

Code: Es ist Dir nicht erlaubt Links zu betrachten. Registrieren oder Einloggen
//+------------------------------------------------------------------+
//|                                                   Stochastic.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"

#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 100
#property indicator_buffers 2
#property indicator_color1 LightSeaGreen
#property indicator_color2 Red
//---- input parameters
extern int KPeriod=5;
extern int DPeriod=3;
extern int Slowing=3;
//---- buffers
double MainBuffer[];
double SignalBuffer[];
double HighesBuffer[];
double LowesBuffer[];
//----
int draw_begin1=0;
int draw_begin2=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   string short_name;
//---- 2 additional buffers are used for counting.
   IndicatorBuffers(4);
   SetIndexBuffer(2, HighesBuffer);
   SetIndexBuffer(3, LowesBuffer);
//---- indicator lines
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0, MainBuffer);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1, SignalBuffer);
//---- name for DataWindow and indicator subwindow label
   short_name="Sto("+KPeriod+","+DPeriod+","+Slowing+")";
   IndicatorShortName(short_name);
   SetIndexLabel(0,short_name);
   SetIndexLabel(1,"Signal");
//----
   draw_begin1=KPeriod+Slowing;
   draw_begin2=draw_begin1+DPeriod;
   SetIndexDrawBegin(0,draw_begin1);
   SetIndexDrawBegin(1,draw_begin2);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Stochastic oscillator                                            |
//+------------------------------------------------------------------+
int start()
  {
   int    i,k;
   int    counted_bars=IndicatorCounted();
   double price;
//----
   if(Bars<=draw_begin2) return(0);
//---- initial zero
   if(counted_bars<1)
     {
      for(i=1;i<=draw_begin1;i++) MainBuffer[Bars-i]=0;
      for(i=1;i<=draw_begin2;i++) SignalBuffer[Bars-i]=0;
     }
//---- minimums counting
   i=Bars-KPeriod;
   if(counted_bars>KPeriod) i=Bars-counted_bars-1;
   while(i>=0)
     {
      double min=1000000;
      k=i+KPeriod-1;
      while(k>=i)
        {
         price=Low[k];
         if(min>price) min=price;
         k--;
        }
      LowesBuffer[i]=min;
      i--;
     }
//---- maximums counting
   i=Bars-KPeriod;
   if(counted_bars>KPeriod) i=Bars-counted_bars-1;
   while(i>=0)
     {
      double max=-1000000;
      k=i+KPeriod-1;
      while(k>=i)
        {
         price=High[k];
         if(max<price) max=price;
         k--;
        }
      HighesBuffer[i]=max;
      i--;
     }
//---- %K line
   i=Bars-draw_begin1;
   if(counted_bars>draw_begin1) i=Bars-counted_bars-1;
   while(i>=0)
     {
      double sumlow=0.0;
      double sumhigh=0.0;
      for(k=(i+Slowing-1);k>=i;k--)
        {
         sumlow+=Close[k]-LowesBuffer[k];
         sumhigh+=HighesBuffer[k]-LowesBuffer[k];
        }
      if(sumhigh==0.0) MainBuffer[i]=100.0;
      else MainBuffer[i]=sumlow/sumhigh*100;
      i--;
     }
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   int limit=Bars-counted_bars;
//---- signal line is simple movimg average
   for(i=0; i<limit; i++)
      SignalBuffer[i]=iMAOnArray(MainBuffer,Bars,DPeriod,0,MODE_SMA,i);
//----
   return(0);
  }
//+------------------------------------------------------------------+

Nach und nach werden folgend die Zeilen analysiert und vorgestellt. Ich setze übrigens rudimentäre Englisch-Kenntnisse und eine kleine Portion gesunden Menschverstand voraus.

Chleudere den Purchen zu Poden!

  • Global Moderator
  • Ist Forum süchtig
  • *
  • *
  • *
    • Beiträge: 1714
    • Karma: +422/-6
    • Mitglied seit:
      11 Aug 2009
  • Broker: IGMarkets

  • Mars Defense Car Chaos Get Groovy BallsPC Motorrad-Trauma
    Bloons Tower Defense
  • Stop
Antw:Wir lernen MQL4
« Antwort #1 am: Juli 10, 2010, 11:18:32 am »
Code: Es ist Dir nicht erlaubt Links zu betrachten. Registrieren oder Einloggen
//+------------------------------------------------------------------+
//|                                                   Stochastic.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
Nun ja, im MetaEditor sind diese Zeilen etwas ausgegraut... werden wohl nicht soooo wichtig sein. BINGO! Zeilen die mit // beginnen, sind Kommentare. Hier ist es der übliche metaquotes-Kopfbogen!

Code: Es ist Dir nicht erlaubt Links zu betrachten. Registrieren oder Einloggen
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"
Property bedeuted Eigenschaft. Es werden also Eigenschaften für den Indikator definiert. Obige beide sind meines Wissens allerdings nur zur reinen Information. Das heißt, das Copyright und Verweis auf die Webseite des Schreiberlings werden nochmal erwähnt.

Code: Es ist Dir nicht erlaubt Links zu betrachten. Registrieren oder Einloggen
#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 100
#property indicator_buffers 2
#property indicator_color1 LightSeaGreen
#property indicator_color2 Red
Das sind doch schon mal interessante Eigenschaften unsere Indikators. Aber der Reihe nach:

#property indicator_separate_window
Separate_Window? Separates Fenster? Ah ja, das heißt unser Stochastik soll nicht im Preisfenster, sondern in einem extra Fenster unter dem Preisfenster gezeichnet werden. Und wie müßte es heißen, wenn der Indikator doch im Preisfenster gezeichnet werden soll? Dazu klicken wir auf indicator_separate_window und drücken dann F1. Im nun folgenden Hilfetext finden wir ähnlich klingend den Bezeichnern indicator_chart_window. Interessant!


#property indicator_minimum 0
#property indicator_maximum 100
Auch recht einfach zu erklären, wenn man den Stochastik kennt. Dieser Indi oszilliert zwischen den Werten 0 (überverkauft) und 100 (überkauft) - hier werden also die Grenzen für das Indi-Fenster festgelegt. Wohlgemerkt, diese Grenzen beziehen sich NICHT auf den Wert des Indikators sondern NUR auf das Fenster unter dem Preisfenster. Das heißt, wenn unser Indi aus irgendeinem Grund mal den Wert 200 annimmt, dann ist dieser Wert einfach nicht zu sehen.


#property indicator_buffers 2
#property indicator_color1 LightSeaGreen
#property indicator_color2 Red
Letztlich wird festgelegt, wieviel Indikatoren(linien) gezeichnet werden sollen. In unserem Fall sind es zwei (Stoch und Signallinie) und welche Farbe beide haben.
Chleudere den Purchen zu Poden!

  • Global Moderator
  • Ist Forum süchtig
  • *
  • *
  • *
    • Beiträge: 1714
    • Karma: +422/-6
    • Mitglied seit:
      11 Aug 2009
  • Broker: IGMarkets

  • Mars Defense Car Chaos Get Groovy BallsPC Motorrad-Trauma
    Bloons Tower Defense
  • Stop
Antw:Wir lernen MQL4
« Antwort #2 am: Juli 10, 2010, 12:15:19 pm »
Code: Es ist Dir nicht erlaubt Links zu betrachten. Registrieren oder Einloggen
//---- input parameters
extern int KPeriod=5;
extern int DPeriod=3;
extern int Slowing=3;
//---- buffers
double MainBuffer[];
double SignalBuffer[];
double HighesBuffer[];
double LowesBuffer[];
//----
int draw_begin1=0;
int draw_begin2=0;
Und der nächste Codeblock zum Analysieren.

extern int KPeriod=5;
extern int DPeriod=3;
extern int Slowing=3;

Vergleicht man diese Bezeichner mit dem Input-Fenster wenn man den Indikator aktiviert, stellt man unweigerlich fest, dass diese drei Variablen unsere Einstellungen für den Stoc sind, die der Nutzer ändern kann. Darauf weißt auch das Schlüsselwort extern hin. Inhaltlich bedeutet es soviel wie "mach den Wert nach aussen / extern verfügbar oder änderbar". Das int wiederum ist ein Datentyp und signalisiert, dass nur ganzzahlige Werte zugelassen sind. Weiterhin folgen die Namen für die Variablen und eine Vorbelegung seitens des Programmierers. Das sind dann übrigens auch die Werte, welche man nach Klick auf Rücksetzen erhält.

double MainBuffer[];
double SignalBuffer[];
double HighesBuffer[];
double LowesBuffer[];

Das ist nun der erste Codeblock, welcher sich aus dem bloßen Ansehen nicht mehr erschließt. Daher direkt die Erklärung von mir. Als erstes haben wir das Schlüsselwort double. Bedeutet nur, dass hier im Gegensatz zu int nicht nur Ganzzahlen sondern auch Rationale Zahlen gespeichert werden. Daran erkennt man dann auch, dass dieser Codeblock wohl wieder eine Variablendeklaration ist. Dann folgt wie oben der Name der Variablen. Letztlich finden wir noch die beiden eckigen Klammern []. Kurz gesagt bedeuten diese, dass in bspw. MainBuffer nicht nur ein Wert sondern ganz viele gespeichert werden können, die man dann über Indizes abruft (dazu später mehr).

int draw_begin1=0;
int draw_begin2=0;

Unsere letzten beiden Zeilen sind ebenfalls Variablendeklarationen. Der geneigte Leser müsste nun schon erkennen, was hier deklariert.
Zwei Ganzzahlen mit den Namen draw_begin1 und draw_begin2, welche beide mit 0 initialisiert werden.
« Letzte Änderung: Juli 10, 2010, 12:18:29 pm von nightyhawk »
Chleudere den Purchen zu Poden!

  • Global Moderator
  • Ist Forum süchtig
  • *
  • *
    • Beiträge: 1634
    • Karma: +424/-12
    • Mitglied seit:
      25 Jul 2008

  • Stop
Antw:Wir lernen MQL4
« Antwort #3 am: Juli 10, 2010, 14:14:46 pm »
Sehr schön aufgebau! Viele hier werden es dir danken!

  • Gehört zum Inventar
  • ***
    • Beiträge: 1078
    • Karma: +429/-4
    • Mitglied seit:
      31 Dec 2008
  • Broker: RBS

  • Stop
Antw:Wir lernen MQL4
« Antwort #4 am: Juli 10, 2010, 14:28:06 pm »
Das ist erstmal sehr zu loben, was du dir hier vorgenommen hast! Für diesen martialischen Aufwand gibt es ein +Karma!!

Und da ich heute Zeit habe, so relaxt auf meiner Terasse sitze, entspannt auf den Teich mit dahinterliegendem Wasserfall schaue, will ich mal meinen Gedanken hier freien Lauf lassen.

Ich weiss zwar nicht mit wievielen Posts du den eigentlichen Rest erklären willst, aber auch dieser Indikator zählt zur Gruppe der "leichten Übungen". Ich will damit sagen, dass man natürlich richtigerweise mit den einfachen Dingen beginnen sollte, aber an welchen User willst du dich im Endeffekt richten?

1. An den totalen Programmier-Neuling, der nur Kenntnis davon hat, dass Programme von irgendjemand mit irgendetwas für irgendwen und -was geschaffen wurden?
Nein, der wird es nicht sein!

2. An den eigentlichen Programmierer, wie du und andere (jetzt zähl ich mich mal mit 25 Jahren Programmierpraxis dazu, angefangen mit Lockkarten!!!! über einen "schnellen" Commodore 128 mit 5,25!!Zoll FloppyDisk - unglaublich - 1986 eine Dissertation am PC und nicht Schreibmaschine und dann noch mutigerweise in leicht kursiv - der Wahnsinn) über eigentlich alle Modelle die in der Zeit bis jetzt so auf dem Markt waren).
Nein, der wird es auch nicht sein!

Bleibt noch die große graue Masse an Usern, die evtl. Grundkenntnisse (in C ? oder welche Sprache auch immer) haben, die aber nicht für anspruchsvolle Projekte ausreichen und auch nicht Willens sind, weiter zu lernen, sondern lieber zu traden!!
Aus dieser Masse wird es aber auch eine kleine Teilmenge geben, die evtl. schon immer mal, wie eben alle Autodidakten, der Sache auf die Spur kommen wollen und durch Abwandlungen oder Hinzufügen von Programmfunktionen, den ihren dann eigenen Indikator, EA oder Script selbst beherrschen wollen und vorallem genau wissen wollen, warum ein Programm jetzt dies oder jenes macht. Denn nichts ist schlimmer als abhängig zu sein, nicht zu wissen was das Programm eigentlich wie macht oder warum es jetzt gerade was anderes macht, was man nicht erwartet hätte.

Ich nehme mal als Beispiel den THV1.0-EA mit seinen etwa 50? oder mehr externen Variablen und Variablenfeldern, diversen globalen Variablen, komplexester Array-Programmierung im 3-dimensionalen Stil, Einbindung mehrere großteil eigens für den THV selbst über viele Seiten geschriebenen Indikatoren (Trix, MTFIchimoku, Coral, MTFTrix, THV HA, THVPivots etc.), Programmcode über 40 DinA4-Seiten!! Auf Anfragen von MANDL207 bzgl. spezieller Einstellungen und Reaktionen des EA an den Hauptprogrammierer "Xux" kamen unbefriedigende Antworten, die evtl. die Interpretation zulassen, dass man nach einiger Zeit den Überblick verliert, wenn es zu komplex wird. Und wer sich den! Haupt-Code mal reingezogen hat, der weiss wovon ich rede! Nun ist das Beispiel sicherlich in die Kategorie "Professional EA" einzuordnen, demonstriert aber, was so alles möglich ist, wenn man eben sehr gut programmieren kann, aber bis dahin ist es wie in jeder anderen Sprache ein langer, steiniger und von ständigem Training begleiteter Weg.

So, nun will ich aber all diejenigen, die zu dieser o.g. Teilmenge gehören, ermutigen, lernt mql4, besser mql5. Ihr werdet unabhängig, schafft euch ein viel besseres Verständnis für handelstechnische Abläufe und vorallem denkt an eure grauen Zellen - Programmieren macht viel Spaß, v.a. wenn der EA dann auch richtig flutscht, schafft wahnsinnige Glücksgefühle und ist vorallem ein geeignetes Trainigswerkzeug, um geistig voll fit zu bleiben.

In diesem Sinne Sudoku war gestern, MQL ist die Zukunft!

Carpe diem!

traderdoc
Pokerregel: "Auch bei dem Anschein eines sicheren Gewinnes, muss man ablassen können."

  • Global Moderator
  • Ist Forum süchtig
  • *
  • *
  • *
    • Beiträge: 1714
    • Karma: +422/-6
    • Mitglied seit:
      11 Aug 2009
  • Broker: IGMarkets

  • Mars Defense Car Chaos Get Groovy BallsPC Motorrad-Trauma
    Bloons Tower Defense
  • Stop
Antw:Wir lernen MQL4
« Antwort #5 am: Juli 10, 2010, 15:24:12 pm »
Bevor es mit dem nächsten Teil weitergeht eine kleine Anmerkung an den Post von Traderdoc. Ich weiß nicht wirklich an wen ich mich hier richten möchte. Die Idee kam mir, als in einem Thread nach MQ4-Literatur gefragt wurde. Meine Gedanken waren, wozu Literatur wenn man einige Dinge doch aus den MQ4-Dateien doch schon so erkennen (könnte) kann. Grundsätzlich soll dieser Thread User ermutigen sich mit MQ4 zu beschäftigen. Das würde im großen Bruder bestimmt einige Posts à la "Wann kommt ein Indi/Altert/EA zu xyz" sparen. Gleichzeitig könnten User, welchen diesen Thread von Anfang bis Ende (ich hoffe die Postanzahl begrenzen zu können) einmal durcharbeiten, ein grobes -wenn auch unvollständiges- Verständnis für MQ4 im speziellen und für Programmieren im allgemeinen erhalten.
Chleudere den Purchen zu Poden!

  • Gehört zum Inventar
  • ***
    • Beiträge: 1078
    • Karma: +429/-4
    • Mitglied seit:
      31 Dec 2008
  • Broker: RBS

  • Stop
Antw:Wir lernen MQL4
« Antwort #6 am: Juli 10, 2010, 15:39:00 pm »
Ich verweise mal auf den neuen Thread "Literatur zu MQL5" - PDF-Dokument in Deutsch!!! nicht nur, dass man sich dort in aller Ruhe der Zukunft widmen kann, sondern auch, dass die hier von nightyhawk dargelegten Erläuterungen dort im Prinzip unterstützend nachlesbar sein werden.
« Letzte Änderung: Juli 10, 2010, 15:40:46 pm von traderdoc »
Pokerregel: "Auch bei dem Anschein eines sicheren Gewinnes, muss man ablassen können."

  • Global Moderator
  • Ist Forum süchtig
  • *
  • *
  • *
    • Beiträge: 1714
    • Karma: +422/-6
    • Mitglied seit:
      11 Aug 2009
  • Broker: IGMarkets

  • Mars Defense Car Chaos Get Groovy BallsPC Motorrad-Trauma
    Bloons Tower Defense
  • Stop
Antw:Wir lernen MQL4
« Antwort #7 am: Juli 10, 2010, 15:41:50 pm »
Code: Es ist Dir nicht erlaubt Links zu betrachten. Registrieren oder Einloggen
int init()
  {

   return(0);
  }
Mehr Code gibt es diesmal nicht zum anschauen? Jupp, weil das folgende Konzept etwas komplexer ist, reicht es diesmal wohl sich mal mit Funktionen und Methoden zu beschäftigen.
Im Gegensatz zu einer Variablendeklaration, signalisieren uns die () gefolgt von {, dass es sich hier um eine Funktion bzw. Methode handelt. Das ganze kann man sich als Anweisungsblock vorstellen der von anderen Stellen im Programm aufgerufen wird.
Eine besondere Stellung nehmen hier drei Funktionen ein:

int init() { ... }
Diese Funktion wird vom Metatrader aufgerufen, wenn der Indikator / EA geladen wird. In ihm können als Einstellungen etc. definiert werden, die vor dem Betrieb des Indis festgelegt werden müssen.

int deinit() { ... }
Analog zu oben, erfolgt hier ein Funktionsaufruf nach Beendigung / Entfernen des Indikator.

int start() { ... }
Diese Funktion ist das "Herzstück" jedes Indikator oder EAs. MT4 ruft start bei jedem neuen Tick auf. Also wenn sich der Preis im Chart X ändert und unser Indikator in diesem Chart liegt, so wird umgehend start aufgerufen.

Und warum steht dort ein int vor dem start()? Nun ja, wie wir bereits wissen bedeutet int irgendetwas mit ganzen Zahlen. Und tatsächlich liefert diese Funktion uns einen ganzzahligen Rückgabewert. Dieser Wert wird zurückgegeben mit der Anweisung
return(0);.

Und wenn man keinen Wert zurückgeben möchte? Dann verwendet man das Schlüsselwort void anstelle dem int. Nun würde man auch nicht mehr von einer Funktion, sondern von einer Methode sprechen.

Zusätzlich kann man noch eigene Funktionen / Methoden definieren und diese dann aus start, init oder deinit aufrufen. Hierzu mal ein kleines Beispiel abseits von MQL4:


int start() {
  int a = 3;
  int b = 4;
  int summe = berechneSumme(a, b);
}

int berechneSumme(int a, int b) {
  return (a+b);
}

Über den Sinn dieses Beispiel möchte ich gar nicht diskutieren  8). Wir haben hier eine eigene Funktion berechneSumme, welche zusätzlich noch zwei Parameter erhält. Beide Parameter sind vom Typ int - also Ganzzahlen - und hören auf die Namen a und b. Unsere Funktion liefert ebenfalls eine ganze Zahl zurück und zwar als Ergebnis a+b.
Chleudere den Purchen zu Poden!

  • Global Moderator
  • Ist Forum süchtig
  • *
  • *
  • *
    • Beiträge: 1714
    • Karma: +422/-6
    • Mitglied seit:
      11 Aug 2009
  • Broker: IGMarkets

  • Mars Defense Car Chaos Get Groovy BallsPC Motorrad-Trauma
    Bloons Tower Defense
  • Stop
Antw:Wir lernen MQL4
« Antwort #8 am: Juli 11, 2010, 11:11:58 am »
Code: Es ist Dir nicht erlaubt Links zu betrachten. Registrieren oder Einloggen
int init()
  {
   string short_name;
//---- 2 additional buffers are used for counting.
   IndicatorBuffers(4);
   SetIndexBuffer(2, HighesBuffer);
   SetIndexBuffer(3, LowesBuffer);
//---- indicator lines
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0, MainBuffer);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1, SignalBuffer);
  }

Und weiter geht es mit unserer Schritt-für-Schritt-Analyse des Stoc-Indikators.

string short_name;
Eine schlichte Variablendeklaration. Hier wird ein Feld short_name definiert, welches Text aufnehmen kann.

//---- 2 additional buffers are used for counting.
   IndicatorBuffers(4);
   SetIndexBuffer(2, HighesBuffer);
   SetIndexBuffer(3, LowesBuffer);
//---- indicator lines
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0, MainBuffer);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1, SignalBuffer);

Ein auch etwas komplexerer Block. In der ersten Zeile wird Platz für insgesamt 4 Buffers reserviert. Buffers? Nun das sind die oben bereits erwähnten IndexFelder. Also eine Ansammlung von Werten, auf die per Index zugegriffen wird. Zwei Buffer werden benötigt um den Indikator darzustellen (MainBuffer, SignalBuffer) und die weiteren beiden Buffer sind Hilfsbuffer um Berechnungen anzustellen. Mit SetIndexBuffer(2, HighesBuffer); wird nun etwas gesagt, dass die Variable HighesBuffer ein Buffer ist und zwar der dritte von vier (die Zählung beginnt hier bei 0).
Der erste Buffer wird dann mit SetIndexBuffer(0, MainBuffer); zugewiesen. Da dies ein Buffer ist, welcher zudem noch gezeichnet wird, kann nun noch beschrieben werden, wie gezeichnet wird und zwar so SetIndexStyle(0,DRAW_LINE);. Genau, das Stochastiksignal soll als LINIE gezeichnet werden.
Chleudere den Purchen zu Poden!

  • Global Moderator
  • Ist Forum süchtig
  • *
  • *
  • *
    • Beiträge: 1714
    • Karma: +422/-6
    • Mitglied seit:
      11 Aug 2009
  • Broker: IGMarkets

  • Mars Defense Car Chaos Get Groovy BallsPC Motorrad-Trauma
    Bloons Tower Defense
  • Stop
Antw:Wir lernen MQL4
« Antwort #9 am: Juli 14, 2010, 17:55:54 pm »
Code: Es ist Dir nicht erlaubt Links zu betrachten. Registrieren oder Einloggen
//---- name for DataWindow and indicator subwindow label
   short_name="Sto("+KPeriod+","+DPeriod+","+Slowing+")";
   IndicatorShortName(short_name);
   SetIndexLabel(0,short_name);
   SetIndexLabel(1,"Signal");
//----
   draw_begin1=KPeriod+Slowing;
   draw_begin2=draw_begin1+DPeriod;
   SetIndexDrawBegin(0,draw_begin1);
   SetIndexDrawBegin(1,draw_begin2);
//----
Und mal wieder habe ich einige Minuten um die nächsten Codezeilen vorzustellen.

short_name="Sto("+KPeriod+","+DPeriod+","+Slowing+")";
Hier wird der weiter oben definierte String mit einem Wert gefüllt. Inhaltlich steht dann der Text Sto( gefolgt von den Stochastik Parameter in der Variable. Also etwa Sto(5,3,3).

IndicatorShortName(short_name);
Dieser eben erstellte Wert wird dann hier verwendet. Und zwar wird mit dieser Zeile festgelegt, dass das Sto(5,3,3) als Überschrift in unserem Stochastikfenster verwendet werden soll.

SetIndexLabel(0,short_name);
   SetIndexLabel(1,"Signal");

Diese beiden Zeilen geben den jeweiligen angezeigten Indikatorenlinien einen Namen, welcher beim Überfahren mit der Maus angezeigt wird.

draw_begin1=KPeriod+Slowing;
draw_begin2=draw_begin1+DPeriod;
SetIndexDrawBegin(0,draw_begin1);
SetIndexDrawBegin(1,draw_begin2);

SetIndexDrawBegin ist eine interessante Anweisung, um das Zeichnen des Indikators nach hinten zu verlegen. Und warum? Nun, nehmen wir als Beispiel einen 50er gleitenden Durchschnitt. Für die ersten 49 Werte ist dieser Indikator nichtssagend, da er ja die letzten 50 Werte einbeziehen soll. Also würde man hier mitteilen, dass der Indikator erst ab dem 50. Wert anfangen soll zu zeichnen.



Chleudere den Purchen zu Poden!

  • Global Moderator
  • Ist Forum süchtig
  • *
  • *
  • *
    • Beiträge: 1714
    • Karma: +422/-6
    • Mitglied seit:
      11 Aug 2009
  • Broker: IGMarkets

  • Mars Defense Car Chaos Get Groovy BallsPC Motorrad-Trauma
    Bloons Tower Defense
  • Stop
Antw:Wir lernen MQL4
« Antwort #10 am: Juli 14, 2010, 17:58:41 pm »
Es ist Dir nicht erlaubt Links zu betrachten. Registrieren oder Einloggen
Ich verweise mal auf den neuen Thread "Literatur zu MQL5" - PDF-Dokument in Deutsch!!! nicht nur, dass man sich dort in aller Ruhe der Zukunft widmen kann, sondern auch, dass die hier von nightyhawk dargelegten Erläuterungen dort im Prinzip unterstützend nachlesbar sein werden.
Dank diesem Post, weiß ich jetzt warum ich diesen Thread angefangen habe. Ich will damit verdeutlichen, dass es mitunter sinnvoller ist, einen bestehenden Indikator (egal ob MQL4 oder MQL5) anzuschauen und auseinanderzunehmen als ein 2000 Seiten Kompendium zu lesen. Sehe ich (in welcher Umgebung auch immer) ein unbekanntes Konstrukt, dann wird das mit F1 oder Es ist Dir nicht erlaubt Links zu betrachten. Registrieren oder Einloggen analysiert. Der Rest kommt dann von ganz allein...
Chleudere den Purchen zu Poden!

  • Gehört zum Inventar
  • ***
    • Beiträge: 1078
    • Karma: +429/-4
    • Mitglied seit:
      31 Dec 2008
  • Broker: RBS

  • Stop
Antw:Wir lernen MQL4
« Antwort #11 am: Juli 14, 2010, 18:21:23 pm »
Gute Erklärungen, wie gesagt!!

Na, ich hab' ja nicht gesagt, man solle sich die 2000 Seiten durchlesen, aber bisher konnte ich weder zu mql4 noch zu 5 irgendwelche deutschsprachige Literatur finden und da sollte es all denen, die mal gern was lesen wollen oder schnell mal nachschauen, ein gutes Hilfsmittel zur Programmiertätigkeit sein.
Im übrigen, wer null Ahnung vom Programmieren hat, den empfehle ich wärmstens zu lesen und zwar intensiv. MQL5 ist keine Programmiersprache, die man mal so eben aus der Hüfte schießt (C++ basierend). Das ergibt sich schon mal aus dem prinzipiellen Sytem der Objektorientiertheit und all der damit verbundenen Neuerungen gegenüber mql4 (C-basiert, eher erinnnernd an frühere Basic-Varianten). Wer sich ernsthaft dem Programmieren widmen will, der sollte eine Sprache von der Pike auf lernen, mit einem guten Buch (z.B. C++ in 21 Tagen) und besser in Kombination mit sofortigen praktischen Beispielen. Wer bereits gut programmieren kann, demsollte trotzdem o.g. mql5-Doku bei schnellen Nachschauen helfen. Und allen Anderen, deren Kenntnisse nicht über die Basics hinausgehen, empfehle ich (bei eben ersthaften Interessen) sich der ersten Gruppe anzuschließen oder es sein zu lassen. Dafür ist diese Sprache einfach viel zu komplex, um mit Halbherzigkeiten große Dinge bewegen zu wollen, wie selbstgestrickte EAs aus dem bisherigen händischen Traden, wenn der etwas mehr beinhalten soll, als das Kreuzen zweier MAs.

Sorry nightyhawk für diesen offtopic.

Weiterhin viel Erfolg beim Pipsen!

traderdoc
Pokerregel: "Auch bei dem Anschein eines sicheren Gewinnes, muss man ablassen können."

  • Blogger
  • Tastaturflitzer
  • *
    • Beiträge: 260
    • Karma: +94/-0
    • Mitglied seit:
      16 Jul 2010

  • Stop
Antw:Wir lernen MQL4
« Antwort #12 am: Juli 17, 2010, 14:05:43 pm »
Hallo Nightyhawk,

also ich muss sagen ich danke Dir für deinen Versuch hier die Thematik anderen etwas näher zu bringen. Mir hat das Lesen dieses Threads schon geholfen. Und solange es kein Pendant zu MT5 gibt werde ich mir das hier weiter anschauen. :)

Grüße
DS

Never give up, NEVER!

"Damit das Mögliche entsteht, muss immer wieder das Unmögliche versucht werden." Hermann Hesse

  • Global Moderator
  • Ist Forum süchtig
  • *
  • *
  • *
    • Beiträge: 1714
    • Karma: +422/-6
    • Mitglied seit:
      11 Aug 2009
  • Broker: IGMarkets

  • Mars Defense Car Chaos Get Groovy BallsPC Motorrad-Trauma
    Bloons Tower Defense
  • Stop
Antw:Wir lernen MQL4
« Antwort #13 am: Juli 18, 2010, 11:40:37 am »
Code: Es ist Dir nicht erlaubt Links zu betrachten. Registrieren oder Einloggen
int start()
  {
   int    i,k;
   int    counted_bars=IndicatorCounted();
   double price;
//----
   if(Bars<=draw_begin2) return(0);
//---- initial zero
   if(counted_bars<1)
     {
      for(i=1;i<=draw_begin1;i++) MainBuffer[Bars-i]=0;
      for(i=1;i<=draw_begin2;i++) SignalBuffer[Bars-i]=0;
     }
Das Wochenende ist da (und fast auch schon wieder vorbei)... Zeit also, sich wieder dem Stoc-Indikator zu widmen.
Kennengelernt haben wir bis dato:
  • Welche Funktionen gibt es in einer Standard MQL4-Datei und was sind Funktionen?
  • Wie werden die Indikatoren gezeichnet?
  • Was sind Variablen und wie deklariert man sie?
  • Was passiert grob in der init-Funktion
Dann kümmern wir uns nun um den Hauptteil des Indikators. Wie oben bereits erwähnt, wird der folgende Funktionskorpus bei JEDEM neuen eingehenden Tick seitens Brokers aufgerufen.

   int    i,k;
   int    counted_bars=IndicatorCounted();
   double price;

Zuerst werden die Variablen i und k deklariert, welche beide ganzzahlig sind. Dann wird counted_bars deklariert (ebenfalls ganzzahlig) und mit dem Wert aus der Funktion IndicatorCounted() initialisiert. Diese Funktion gibt -vereinfacht gesagt- die Anzahl an Kerzen / Bars wieder, welche sich in letzter Zeit NICHT geändert haben. Letztlich wird eine Fließkommavariable mit dem Namen price deklariert.

if(Bars<=draw_begin2) return(0);
Bars ist eine Systemvariable aus dem MT4. In ihr stehen die Anzahl an Kerzen im kompletten Chart. Diese Variablen können nur gelesen werden (ein Schreiben würde auch wenig Sinn machen). Was macht diese Zeile nun? Nun, wir erinnern uns, dass draw_begin2 = draw_begin1+DPeriod also eigentlich draw_begin2 = KPeriod+Slowing + DPeriod war. Sprich wir brauchen mindestens KPeriod + Slowing + DPeriod an Kerzen um überhaupt den Stoc berechnen zu können. Wenn nun die Anzahl an Kerzen kleinergleich dieser Mindestanzahl an Kerzen ist, dann macht ein weiteres Berechnen keinen Sinn. Die Funktion wird also mit return(0) verlassen. Gezeichnet wird dann nichts.

   if(counted_bars<1)
     {
      for(i=1;i<=draw_begin1;i++) MainBuffer[Bars-i]=0;
      for(i=1;i<=draw_begin2;i++) SignalBuffer[Bars-i]=0;
     }

Dieser Bereich stellt eigentlich auch nur einen optischen Effekt dar. In MainBuffer wird der Wert unserer Stochastiklinie gespeichert. Diese Speicherung bleibt auch erhalten, wenn sich Parameter des Indikator ändern. Im Original hat unser Indikator die Parameter KPeriod=5 und Slowing=3. Heißt also für unseren gezeichnet Stoc-Wert, dass für die ersten 8 Kerzen kein Stoc-Wert gezeichnet werden soll. Ändert der Nutzer nun KPeriod=50, so wird mit diesen Zeilen sichergestellt, dass der MainBuffer für die ersten 53 Kerzen auf 0 gesetzt wird, inhaltlich der Indikator also nicht gezeichnet wird.

Anm.: Bei Zwischenfragen bitte ich darum, diese gerne und reichhaltig zu stellen  ;).


Chleudere den Purchen zu Poden!

  • Blogger
  • Tastaturflitzer
  • *
    • Beiträge: 260
    • Karma: +94/-0
    • Mitglied seit:
      16 Jul 2010

  • Stop
Antw:Wir lernen MQL4
« Antwort #14 am: Juli 18, 2010, 21:23:46 pm »
na, da hab ich doch gleich was. ;)

>   int    counted_bars=IndicatorCounted();

Alle historischen Bars, die älter als die aktuelle sind müssten das doch sein, oder? Also im Stundenchart dann die aus der letzten Stunde? Aber bezieht sich das nur auf die Bars des Screens oder alle historischen Bars bis zum Datenanfang?
Never give up, NEVER!

"Damit das Mögliche entsteht, muss immer wieder das Unmögliche versucht werden." Hermann Hesse



 

Ähnliche Themen

  Betreff / Begonnen von Antworten Letzter Beitrag
0 Antworten
588 Aufrufe
Letzter Beitrag November 15, 2008, 22:47:16 pm
von Gregor
15 Antworten
4220 Aufrufe
Letzter Beitrag Juni 19, 2011, 00:43:25 am
von Egetuerk
17 Antworten
3904 Aufrufe
Letzter Beitrag Juni 30, 2011, 14:07:38 pm
von Andreas
2 Antworten
1803 Aufrufe
Letzter Beitrag Juli 25, 2010, 01:17:32 am
von Divecall
1 Antworten
878 Aufrufe
Letzter Beitrag Mai 08, 2011, 07:46:48 am
von fxdaytrader
5 Antworten
561 Aufrufe
Letzter Beitrag Juli 02, 2011, 11:56:41 am
von ekenom
36 Antworten
1415 Aufrufe
Letzter Beitrag April 25, 2012, 06:59:57 am
von Der-Sucher
12 Antworten
532 Aufrufe
Letzter Beitrag März 27, 2012, 22:51:25 pm
von NastyCem


ChartTec´s World Topsites