Jump to content
Tom Next - Daytrading Community

Erste Gehversuche in MQL


Luisa.A.

Recommended Posts

Hallo liebe MQL-Gemeinde :laugh:

 

ich will mich ja (wie in meiner Vorstellung angekündigt) in MQL einarbeiten. Dies am liebsten nach der Masche "Learning by Doing". Ein paar Programmierbasics hab ich noch (irgendwo) im Kopf. Allerdings aus der Sprache Java die ich an der Uni kennenlernen durfte. Also in Sachen Boolesche Bedingungen und Schleifen dürfte ich noch halbwegs fit sein. Auch was Variablen und diese ganzen Initialisierungen mit int, double usw. hab ich schon mal gesehen :laugh:

 

Was ich nun vorhabe:

Als kleinen Einstieg wollte ich, sozusagen mit der Tür ins Haus gefallen, einen kleinen Indikator basteln der mir Bar-Formationen erkennt. Natürlich wollte ich jetzt nicht versuchen alle Candles die man so kennt nachprogrammieren. Anfangs will ich das nur mit dem sog. "Hammer" versuchen.

 

Eine paar kleine Definitionen hab ich mir auch schon zurechtgepuzzelt:

  • Tief muss tiefer als am Tag zuvor sein
  • Open + Close sollte im oberen Viertel (oder besser Drittel?) der Kerze liegen

Ich glaube das sollte auch schon so ziemlich die gängiste Auffassung eines Hammers entegegenkommen, oder?

 

So. Wer so sagt ist noch lange nicht fertig. Das ist wohl auch hier ziemlich treffend :ot: :ot:

 

Nun sitze ich gerade etwas ratlos am Rechner und frage mich, wie ich die Kerzen nach diesen Kriterien checken kann. Ich stöbere schon seit Ewigkeiten in der Documentation, komme aber nach wie vor nicht auf den Trichter wie ich die Kerzen prüfen soll. Überhaupt um erstmal sagen zu können, dass Kerze xy nach den Vorgaben a und b prüfen zu lassen.....

 

Kann mir dazu wer einen Tip geben?

 

Natürlich werde ich den Code, wenn ich dann mal was zusammengedengelt bekomme, hier auch posten. Das ganze ist ja kein Staatsgeheimnis :ot:

 

Grüße........

Link to comment
Share on other sites

Du könntest das High und Low eines Bars überprüfen und vergleichen. Damit weißt du, wie groß der Bar war.

In Ninjatrader heißt es dann zB

Low[5] oder High[5]

- die 5 steht für den fünftletzten Bar.

Dann könntest du solche Sachen basteln wie "wenn 10.letzter Bar im Low größer war als aktuelles Ask..." oder "die letzten Bars heute müssen tiefer sein als der letzte Bar gestern...".

 

Musst mal gucken, welchen Code es dafür in MT4 gibt - da hab ich keinen blassen Schimmer :laugh:

Link to comment
Share on other sites

Ein Array ist eine Variable die mehrere Werte enthalten kann.

Den Inhalt dieser Variable sprichst du über einen Index an - in eckigen Klammern geschrieben.

 

Also fragt man z.B. den 3. Inhalt der Variable Open mit Open[2] (die Zählung in MQL beginnt bei 0!) ab.

Auf den Tageschart bezogen würden es dann mit den Close-Werten bedeuten

Close[0] oder Close[] = heute

Close[1] = gestern

Close[2] = vorgestern

und so weiter...

 

hth

askerix

Link to comment
Share on other sites

Predefined Variables

 

Auch bekannt als Konstanten, das sind also Werte die du nicht wie eine Variable verwenden kannst. Du kannst auf deren Werte natürlich überall zugreifen aber du kannst deren Werte selbst nicht ändern. Sie werden in der Regel vom Programm vorgegeben, also MT4.

Link to comment
Share on other sites

Wo wir schon beim Thema mit Highs und Lows sind. Wie kann ich feststellen, wo (sprich Kurs und nicht Kerzennummer) das höchste Hoch bzw. das tiefste Tief der letzten 20 Kerzen liegt?

 

Ich habe mal folgendes probiert:

Tief = iLow(Symbol(),Period(),iLowest(Symbol(),Period(),MODE_LOW,20,1));

Das scheint aber irgendwie nicht korrekt zu sein - mir wird da nie ganz klar, wo er zu zählen anfängt. Eventuell kann das ja mal jemand beispielhaft erläutern. Die Hilfe ist da eher verwirrend in meinen Augen.

 

Vielen Dank vorab :laugh:.

Link to comment
Share on other sites

Ein Array ist eine Variable die mehrere Werte enthalten kann.

Den Inhalt dieser Variable sprichst du über einen Index an - in eckigen Klammern geschrieben.

 

Also fragt man z.B. den 3. Inhalt der Variable Open mit Open[2] (die Zählung in MQL beginnt bei 0!) ab.

Auf den Tageschart bezogen würden es dann mit den Close-Werten bedeuten

Close[0] oder Close[] = heute

Close[1] = gestern

Close[2] = vorgestern

und so weiter...

 

hth

askerix

Das die Zählung bei 0 beginnt, ist ja dann auch wie in Java. :) Wieder eine Sache die Parallelen hat. Danke auch für Dein Beispiel!

 

Auch bekannt als Konstanten, das sind also Werte die du nicht wie eine Variable verwenden kannst. Du kannst auf deren Werte natürlich überall zugreifen aber du kannst deren Werte selbst nicht ändern. Sie werden in der Regel vom Programm vorgegeben, also MT4.

Das ich die Werte nicht verändern kann ist ja logisch. :laugh: Außerdem würde es mir ja auch nichts bringen die Kursdaten zu ändern. Sobald ein neues Bar angefangen hat, rücken die Werte ja eh alle auf :laugh:

 

Dann muss ich mir jetzt "nur noch" überlegen, wieviele der letzten Bars ich auf die mir vorgebenen Parameter prüfen lasse und vor alle wie ich das ausdrücke. Da ich ja als Rückgabe nur ein "Ja" oder "Nein" brauche wird das wohl auf eine boolesche Frage hinauslaufen; sprich True oder False.

Wenn das Ergebniss da True ist: Will ich mir das markieren lassen.

 

Danke an Euch allen!

Ich werde mal schauen, ob ich das heute noch in MQL-Code gestrickt bekomme. Das wird ein Abenteuer :ot:

Link to comment
Share on other sites

Wo wir schon beim Thema mit Highs und Lows sind. Wie kann ich feststellen, wo (sprich Kurs und nicht Kerzennummer) das höchste Hoch bzw. das tiefste Tief der letzten 20 Kerzen liegt?

 

Tief = Low[iLowest(Symbol(),0,MODE_LOW,20,1)];

 

... liefert dir den Lowest Low der Bars 1-21.

 

cheers,

askerix

Link to comment
Share on other sites

Du stehst in etwa da, wo ich letztes Jahr war.

Mir hat der Thread mql-Einsteiger sehr geholfen.

 

Wie kann ich feststellen, wo (sprich Kurs und nicht Kerzennummer) das höchste Hoch bzw. das tiefste Tief der letzten 20 Kerzen liegt?

 

Die höchsten Hochs einer bestimmten Periode zu finden ist nicht so schwer.

Ich werde Dir aber jetzt keinen code posten, das haben die richtig Guten hier im Forum

mit mir letztes Jahr auch so gemacht und es war richtig so. Was man selbst löst, kann man dann auch richtig.

 

Anregung:

Du braucht eine for oder eine while Schleife mit der Du festlegt,

wie groß die betrachtete Periode ist und wie groß die Schrittweite (1, weil Du ja jedes Bar untersuchen willst)

ist.

 

Die for Schleife wird in dem oben erwähnten Thread erklärt.

 

Dann brauchst Du eine Variable (eine double), die den Wert des ersten Hochs annimmt und die

immer, wenn der Wert des nächsten Hochs höher ist, als ihr eigener Wert, den neuen Wert annimmt.

Also nochmal eine if Anweisung innerhalb der Schleife.

 

Jetzt kommt Dein Kampf mir der Synthax. Den gewinnst Du, wenn Du häufig F1 im editor drückst.

 

Ich sehe gerade, askerix hat Dir etwas verraten, was direkter ist, aber dadurch lernst Du nicht programmieren.

So ne kleine Schleife ist ein gutes Ding zum üben.

Edited by mh21
Link to comment
Share on other sites

Tief = Low[iLowest(Symbol(),0,MODE_LOW,20,1)];

 

... liefert dir den Lowest Low der Bars 1-21.

 

cheers,

askerix

 

Hmm, damit habe ich das gleiche Problem wie mit meiner obigen Lösung. Er macht keine Trades. Die macht er nur, wenn ich die 20 und die 1 vertausche. Dabei ist die Logik recht simpel - ich überprüfe das Close der letzten Kerze mit dem ermittelten Tief bzw. Hoch und lasse ihn dann eine Order ausführen.

 

Update

Denkfehler meinerseits - wenn ich natürlich das Close der letzten Kerze [1] nehme und auch das Low dieser in der Überprüfung mit einschließe, kann er ja gar nicht traden, da das Low immer .

 

Du stehst in etwa da, wo ich letztes Jahr war.

Das glaube (bzw. hoffe) ich nicht (programmiere schon seit ein paar Jahren meine EAs) - nur vernebelt anscheinend gerade eine Erkältung mein Hirn :laugh:.

 

Finde aber Deinen Ansatz, dass man selber sich mit dem Thema befassen muss, genau richtig. Nur so lernt man dazu - und dazu lernen muss man immer. Deswegen finde ich auch dieses Forum so gut. Hier wird einem auf einem fachlich hohen Niveau geholfen, wenn man Eigeninitiative mitbringt. Nur deshalb bin ich nun da, wo ich jetzt bin :ot:.

Link to comment
Share on other sites

Auf den Tageschart bezogen würden es dann mit den Close-Werten bedeuten

Close[0] oder Close[] = heute

noch eine kleine Verständnissfrage. Wie kann es denn bei einem Tageschart einen Close-Wert für heute geben? Die Kerze ist doch noch garnicht abgeschlossen. Oder denke ich hier gerade zu viel?

:laugh: :laugh:

Link to comment
Share on other sites

noch eine kleine Verständnissfrage. Wie kann es denn bei einem Tageschart einen Close-Wert für heute geben? Die Kerze ist doch noch garnicht abgeschlossen. Oder denke ich hier gerade zu viel?

:laugh: :laugh:

 

Das verstehst du am besten wenn du dir im livechart mal die aktuelle Kerze anschaust. Während dem Aufbau ist (wie conglom-o schon gesagt hat) der aktuell letzte Tick der Close-Wert der Kerze (sprich wenn jetzt "heute" kein neuer Tick mehr kommt, bleibt das auch der Close-Wert der Kerze).

 

Da du einen Indikator programmieren willst noch ein kleiner Hinweis: Ein wichtiger Punkt beim implementieren eines Indi in MT ist das "verstehen" wie MT den Indi malt.

Wenn du den fertig programmierten Indikator dann auf den Chart ziehst, wird einmal start() aufgerufen, und danach bei jedem neuen Tick wieder. Das heißt beim ersten Aufruf hat der Indi sofort die gesamte History der vorhanden Bars vor der Nase und du musst (sofern du die History des Indis malen willst) erstmal die ganze Vergangenheit malen.

Wenn du dir einen Beispielindikator anschaust siehst du schnell was ich meine. Hier ist zB die Funktion IndicatorCounted() sehr praktisch, die gibt dir an wieviele Bars seit dem letzten Aufruf von start() unverändert geblieben sind. Das heißt Bars-IndicatorCounted ist die Anzahl an Bars (natürlich vom aktuellen also 0 weg) die du "nochmal betrachten/malen musst". Beim ersten Aufruf ist IndicatorCounted() == 0

 

So (*g* bei mir is nach dem "So" erstmal aus) ich hoff ich hab dich nicht zusehr verwirrt, bei Fragen einfach fragen.

Link to comment
Share on other sites

Close ist dann immer der aktuelle Kurs.

Danke!! Im nachhinein hätte mir das wohl auch auffallen bzw. einfallen können ;)

Aber zumindest weiß ich nun, dass ich nur die abgeschlossenen Bars prüfen lasse also bei Close[1] anfange. Denn was nützt mir eine unfertige Kerze auf einen Hammer überprüfen zu lassen ;)

 

Wenn du den fertig programmierten Indikator dann auf den Chart ziehst, wird einmal start() aufgerufen, und danach bei jedem neuen Tick wieder. Das heißt beim ersten Aufruf hat der Indi sofort die gesamte History der vorhanden Bars vor der Nase und du musst (sofern du die History des Indis malen willst) erstmal die ganze Vergangenheit malen.

Wenn du dir einen Beispielindikator anschaust siehst du schnell was ich meine. Hier ist zB die Funktion IndicatorCounted() sehr praktisch, die gibt dir an wieviele Bars seit dem letzten Aufruf von start() unverändert geblieben sind. Das heißt Bars-IndicatorCounted ist die Anzahl an Bars (natürlich vom aktuellen also 0 weg) die du "nochmal betrachten/malen musst". Beim ersten Aufruf ist IndicatorCounted() == 0

Ich hab mal ein wenig in den Zeilen des Moving Average nachgeschaut. Hoffe mal, das war jetzt nicht gerade ein ungünstiger Indi um zu schauen wie die arbeiten. Gar nicht so einfach. Ich hoffe ich bekomme das irgendwie hin. Ich studiere heute erstmal andere Indis um mir mal die Verfahrensweise bei der History klar zu machen :laugh:

Link to comment
Share on other sites

Denn was nützt mir eine unfertige Kerze auf einen Hammer überprüfen zu lassen ;)

es gibt da schon Gründe. Einer ist das gleichmäßige Verhalten vom Indi. Wenn jemand anderes (oder du in 1 Jahr) den Indi verwenden will rechnet er eher damit das alle Bars (auch der aktuelle) berechnet wird, sprich das alle Bars im Chart gleich behandelt werden. Das es vielleicht wenig Sinn macht den Wert vom aktuellen Bar zu verwenden ist eine andere Frage.

Zusätzlich ist folgendes: Ich bin mir jetzt nicht 100% sicher wie MT das mit dem IndicatorCounted löst, aber so wie ich es bis jetzt immer verstanden habe ist es so: Wenn du den aktuellen Bar nicht betrachtest und auch nichts damit machst, denkt MT natürlich trotzdem das du den aktuellen mit bearbeitest, weil du ihn ja zur Verfügung hast. Wenn start() also am letzten Tick des aktuellen Bars ausgeführt wird, behandelst du den Bar noch nicht, MT denkt aber du hast. Beim nächsten Tick (erster Tick des neuen Bars) sagt dir MT jetzt "du hast nur den aktuellen Bar nicht angeschaut, die anderen haben sich alle nicht verändert", in Wirklichkeit hast du aber beim vorletzten Bar noch gar nix getan.

(Ist natürlich alles in den Griff zu bekommen, also es geht alles, das sind nur Stolpersteine auf die man achten muss... wie man sich dann entscheidet ist sicher auch persönliche "Freiheit" ;)

Link to comment
Share on other sites

Der Indikator sollte Dir alle Möglichkeiten geben und die Auswahl, welchen Wert Du nimmst,

triffst Du erst im EA.

Du programmierst den Indikator also so, daß er den aktuellen Bar mit berechnet

und wenn Du in Deiner Strategie lieber nur Indikatorwerte nehmen möchtest, die sich nicht mehr verändern,

rufst Du den Indi im EA so auf, daß er den Wert vom letzten Bar nimmt.

 

double iCustom( string symbol, int timeframe, string name, ..., int mode, int shift)

Als letzten Parameter schreibst Du dann "1".

 

Nimmst Du den Wert von [0], bist Du (eventuell) eher im Markt, riskierst aber Fehlsignale.

Was besser ist, hängt von der Strategie ab.

 

Beim Hammer ist es wohl sinvoll zu warten, bis der Bar (fast) zu Ende ist.

Link to comment
Share on other sites

Nicht Du.

Luisa.A. scheint etwa da zu stehen, wo ich letztes Jahr stand.

Wenn Du vor einem Jahr auch mit Indi-Programmierung angefangen hast, dann ja :wub:

:wub: :wub:

 

 

Vielen Dank Euch allen für die zahlreichen Beiträge die mir wirklich weitergeholfen haben!

Nur stehe ich jetzt gerade vor dem Problemchen: Wo Anfangen?

 

Vielleicht ist auch einfach heute mein Kopf zu, da ich mir am Wochenende eine schöne Erkältung eingefangen habe bzw. ich mich bei meiner Tochter angesteckt habe :wub:

 

Eigentlich wollte ich das Ding ja die Woche fertig bekommen. Na gut. Heute ist ja erst Dienstag :wub: HEute Abend gibt es eh nichts im Fernsehen. Wenn ich keinen Bock habe ein schönes Buch zu lesen, werd ich heute Abend nochmal allen "Mut" zusammen nehmen und mich versuchen. Wenigsten einen Anfang. Es gibt dann sicher noch massig zu verbessern :wub:

Link to comment
Share on other sites

Hallo allerseits,

 

nachdem ich mir die halbe Nacht um die Ohren gehauen habe, ist auch etwas enstanden :wub:

Nur irgendwo ist der Wurm drinnen. Ich hab bestimmt 1,5 Stunden mit Fehlersuche verbracht. Nun kompiliert der MetaEditor auch ohne Warnungen und Fehlermeldungen *freu*

Aber sobald ich das Ding auf den Chart ziehen will, stürzt mit die MetaTrader-Plattform ab :wub:

Nun mein Problem: ich habe keinen Schimmer warum :wub:

 

Ich bin mal so frei und poste den Quellcode. Vielleicht sehe ich ja auch gerade den Wald vor lauter Bäumen nicht :wub:

 

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red

//Konfiguration / Parameter
extern int CandlesToCheck=100;

//Variablen für Berechnungen
double HighLowSpanne;
double HighLowDrittel;

//+------------------------------------------------------------------+
//| Custom indicator initialization function							|
//+------------------------------------------------------------------+
int init()
 {
//---- indicators
//----
  return(0);
 }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function					   |
//+------------------------------------------------------------------+
int deinit()
 {
//----
  int i;

 
 for (i=0; i<  Bars; i++)
{
ObjectDelete ("Hammer "+DoubleToStr (i, 0));
}
//----
  return(0);
 }
//+------------------------------------------------------------------+
//| Custom indicator iteration function							  |
//+------------------------------------------------------------------+

int  start ()

 {
  int	counted_bars=IndicatorCounted (),

//----

  limit,
  i=0; 
  if (counted_bars> 0)
  counted_bars--; 

  limit=Bars-counted_bars;  

  if (limit>  CandlesToCheck)
  limit=CandlesToCheck;

  while (i<  limit)
{  

  //Check the hammer	8)

  double k = (High [i] - Low [i]) /3;
   if ((Open [i]> (Low [i]  +2*k))&& (Close [i]> (Low [i]  +2*k)))
	  {
	  ObjectCreate ("Hammer "+DoubleToStr (i, 0), OBJ_ARROW, 0, Time [i], High [i]  +10*Point);
	  ObjectSet ("Hammer "+DoubleToStr (i, 0), OBJPROP_ARROWCODE, 121);
	  ObjectSet ("Hammer "+DoubleToStr (i, 0), OBJPROP_COLOR, Chocolate);
	  }
}
  }

Ob der Hammer überhaupt richtig erkannt ist erstmal Nebensache. Solange der Code die Plattform in die Knie zwingt, bringt der Indi eh noch nichts :wub:

 

Beste Grüße....

 

Ich werde jetzt erstmal meine saftige Erkältung bekämpfen und mal eben zur Apotheke düsen. Ich hab noch einen langen Tag vor mir.....

Link to comment
Share on other sites

Servus,

 

erstens: gute Besserung ;)

 

zum Code: vorab zwei Bemerkungen:

1. wenn du statt den code-tags mql-tags verwendest bläht sich der Thread nicht so auf (nur ne Anmerkung)

2. beim Code selber: wenn du

int	counted_bars=IndicatorCounted (),

//----

  limit,
  i=0;

schreibst ist das zwar vom compiler her korrekt, aber einerseits schwer lesbar, andererseits risikierst du spätere fehler die du dann lang suchst (zB wenn du auf die Idee kommst vor Limit und unter den Kommentar ein Statement zu schreiben). Denn eigentlich steht in den 6 Zeilen da oben ja genau das:

int	counted_bars=IndicatorCounted (), limit,  i=0;

 

zu deinem Problem:

schau dir mal genau deine while Schleife im main an.

die Bedingung (i

 

was noch "unschön" ist: im deinit löscht du alle Objekte die du erzeugst, soweit schön, aber du schaust nit ob du sie tatsächlich erzeugt hast (oder sie inzwischen vom User gelöscht wurden etc), versucht also möglicherweise Objekte zu löschen die gar nicht da sind...

detto beim erzeugen: wenn du erzeugst bei jedem durchlauf von main die gleichen Objekte. Hier wär eine Abfrage ob das Objekt nit schon da ist besser, am besten mit ObjectFind(...)

 

HTH

Link to comment
Share on other sites

Hallo Mythos,

danke für Deine ausführliche Antwort und deinen wirklich guten Hilfestellungen! Danke Danke Danke!

Da würde ich den Thanks-Button glatt zwei Mal drücken, wenn es geht :wub:

erstens: gute Besserung ;)

Danke :wub: nur ein ordentlicher Schnupfen zusammen mit Schlafentzug ist eine ungute Mischung und schlaucht. Aber das wird wieder. In 1-2 Tagen sieht die Welt schon wieder anders aus

:wub:

 

zum Code: vorab zwei Bemerkungen:

1. wenn du statt den code-tags mql-tags verwendest bläht sich der Thread nicht so auf (nur ne Anmerkung)

Werde ich beim nächsten beherzigen! Hab garnicht gesehen, dass es überhaupt mql-Tags gibt. Hab die Code-Tags ganz Noobie mäßig per Button eingefügt :wub:

 

2. beim Code selber: wenn du

int	counted_bars=IndicatorCounted (),

//----

  limit,
  i=0;

schreibst ist das zwar vom compiler her korrekt, aber einerseits schwer lesbar, andererseits risikierst du spätere fehler die du dann lang suchst (zB wenn du auf die Idee kommst vor Limit und unter den Kommentar ein Statement zu schreiben). Denn eigentlich steht in den 6 Zeilen da oben ja genau das:

int	counted_bars=IndicatorCounted (), limit,  i=0;

werde ich mir anschauen und lesbarer gestalten. :wub:

 

zu deinem Problem:

schau dir mal genau deine while Schleife im main an.

die Bedingung (i < limit ) is ok, aber solang du i nirgends erhöhst wird die Bedingung immer wahr bleiben und der Indikator hängt in einer Endlosschleife (und blockiert damit dein terminal).

Ups. Da werd' ich wohl ein i++ vergessen haben *peinlich*

Das ist mir früher schon beim Java schreiben gerne passiert :wub: :wub:

 

was noch "unschön" ist: im deinit löscht du alle Objekte die du erzeugst, soweit schön, aber du schaust nit ob du sie tatsächlich erzeugt hast (oder sie inzwischen vom User gelöscht wurden etc), versucht also möglicherweise Objekte zu löschen die gar nicht da sind...

detto beim erzeugen: wenn du erzeugst bei jedem durchlauf von main die gleichen Objekte. Hier wär eine Abfrage ob das Objekt nit schon da ist besser, am besten mit ObjectFind(...)

Das hatte ich ja bei meiner Spread-Anzeige ja schon verbockt gehabt. Das ist so eine Sache, die werde ich noch verinnerlichen müssen. Das ist sicher eine Sache die bei jedem Indi gebraucht wird :wub:

Link to comment
Share on other sites

:wub: :wub:

Danke! Danke! Danke! Danke!

 

Zunächst einmal für den i++ Hinweis und das mein Skript nun erstmal läuft. Ob ich noch inhaltliche Verbesserungen vor mir habe, prüfe ich noch. Aber erstmal ist das grobe (programmiertechnische) erledigt. Der Feinshliff folgt nun.

 

Aber eine Frage hab ich noch. Der hat mir jetzt auch schön die Symbole in den Chart gemalt. Nur leider direkt auf die Bars "geklatscht, sodass diese nun wirklich kaum noch erkennbar sind. Gibt es einen Trick wie ich die einfach unter die Bars schieben kann?

 

Ein Feinschliff hab ich noch entdeckt:

Die Symbole bleiben im Chart obwohl ich den Indi aus dem Chart gelöscht habe :wub: Da muss ich wohl nochmal nachbessern....

 

Hier noch der Code (diesmal mit mql-Tags):

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red

//Konfiguration / Parameter
extern int CandlesToCheck=100;

//Variablen für Berechnungen
double HighLowSpanne;
double HighLowDrittel;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
 {
//---- indicators
//----
  return(0);
 }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
 {
 int i;
 for (i=0; i<  Bars; i++)
   {
   if(ObjectFind("Hammer") >= 0 ) ObjectDelete("Hammer");
   }
   return(0);
 }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+

int  start ()

 {
  int    counted_bars=IndicatorCounted (), limit, i=0; 
  if (counted_bars> 0)
     counted_bars--; 

  limit=Bars-counted_bars;  

  if (limit>  CandlesToCheck)
     limit=CandlesToCheck;

  while (i<  limit)
   {

   double k = (High [i] - Low [i]) /3;
      if ((Open [i]> (Low [i]  +2*k))&& (Close [i]> (Low [i]  +2*k)))
         {
         ObjectCreate ("Hammer "+DoubleToStr (i, 0), OBJ_ARROW, 0, Time [i], High [i]  +10*Point);
         ObjectSet ("Hammer "+DoubleToStr (i, 0), OBJPROP_ARROWCODE, 121);
         ObjectSet ("Hammer "+DoubleToStr (i, 0), OBJPROP_COLOR, Lime);
         ObjectSet ("Hammer "+DoubleToStr (i, 0), OBJPROP_XDISTANCE, -10);
         }
   i++;      
   }
  }

Link to comment
Share on other sites

Die Symbole bleiben im Chart obwohl ich den Indi aus dem Chart gelöscht habe :wub: Da muss ich wohl nochmal nachbessern....

 

liegt daran das du nas Symbol "Hammer" löscht, aber Symbole "Hammer1"... malst. (im deinit fehlt beim Symbolnamen das i dazu)

 

bzgl direkt auf die Balken. Du malst es derzeit aug High + 10*Point, das is recht eng. versuch hier mal andere werte bzw. verschieb das Symbol händisch dorthin wo es soll und sieh dir dann an welche Parameter es hat.

 

HTH

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...