Luisa.A. Posted January 14, 2010 Report Share Posted January 14, 2010 Hallo liebe MQL-Gemeinde 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 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 seinOpen + Close sollte im oberen Viertel (oder besser Drittel?) der Kerze liegenIch 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 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 Grüße........ Quote Link to comment Share on other sites More sharing options...
Henrik Posted January 14, 2010 Report Share Posted January 14, 2010 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 Quote Link to comment Share on other sites More sharing options...
askerix Posted January 14, 2010 Report Share Posted January 14, 2010 genau, über die arrays Open[], High[], Low[], Close[], Volume[], Time[] kannst du die Informationen aller Kerzen abrufen. Open[0] entspricht der aktuellen Kerze - [1] der letzten vollständigen. Grüsse,askerix Quote Link to comment Share on other sites More sharing options...
Luisa.A. Posted January 14, 2010 Author Report Share Posted January 14, 2010 Arrays. Das habe hatte ich auch irgendwo schon mal... Da muss ich glatt erstmal nachlesen, wie die Dinger funktionieren. Das hab ich gerade nicht mehr aus dem Stehgreif parat. auf jeden Fall hab ich hier auch was unter Predefined Variables gefunden:http://docs.mql4.com/predefined/variables Quote Link to comment Share on other sites More sharing options...
askerix Posted January 14, 2010 Report Share Posted January 14, 2010 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 bedeutenClose[0] oder Close[] = heuteClose[1] = gesternClose[2] = vorgesternund so weiter... hthaskerix Quote Link to comment Share on other sites More sharing options...
Rumpel Posted January 14, 2010 Report Share Posted January 14, 2010 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. Quote Link to comment Share on other sites More sharing options...
conglom-o Posted January 14, 2010 Report Share Posted January 14, 2010 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 . Quote Link to comment Share on other sites More sharing options...
Luisa.A. Posted January 14, 2010 Author Report Share Posted January 14, 2010 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 bedeutenClose[0] oder Close[] = heuteClose[1] = gesternClose[2] = vorgesternund so weiter... hthaskerixDas 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. 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 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 Quote Link to comment Share on other sites More sharing options...
askerix Posted January 14, 2010 Report Share Posted January 14, 2010 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 Quote Link to comment Share on other sites More sharing options...
mh21 Posted January 14, 2010 Report Share Posted January 14, 2010 (edited) 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 January 14, 2010 by mh21 Quote Link to comment Share on other sites More sharing options...
conglom-o Posted January 14, 2010 Report Share Posted January 14, 2010 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. UpdateDenkfehler 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 . 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 . Quote Link to comment Share on other sites More sharing options...
Luisa.A. Posted January 14, 2010 Author Report Share Posted January 14, 2010 Auf den Tageschart bezogen würden es dann mit den Close-Werten bedeutenClose[0] oder Close[] = heutenoch 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: Quote Link to comment Share on other sites More sharing options...
conglom-o Posted January 14, 2010 Report Share Posted January 14, 2010 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:Close ist dann immer der aktuelle Kurs. Quote Link to comment Share on other sites More sharing options...
mh21 Posted January 14, 2010 Report Share Posted January 14, 2010 (edited) Das glaube (bzw. hoffe) ich nicht (programmiere schon seit ein paar Jahren meine EAs) -Nicht Du.Luisa.A. scheint etwa da zu stehen, wo ich letztes Jahr stand. Edited January 14, 2010 by mh21 Quote Link to comment Share on other sites More sharing options...
Mythos Posted January 14, 2010 Report Share Posted January 14, 2010 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: 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. Quote Link to comment Share on other sites More sharing options...
Luisa.A. Posted January 15, 2010 Author Report Share Posted January 15, 2010 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() == 0Ich 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 Quote Link to comment Share on other sites More sharing options...
Mythos Posted January 15, 2010 Report Share Posted January 15, 2010 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" ;) Quote Link to comment Share on other sites More sharing options...
mh21 Posted January 17, 2010 Report Share Posted January 17, 2010 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. Quote Link to comment Share on other sites More sharing options...
Luisa.A. Posted January 19, 2010 Author Report Share Posted January 19, 2010 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: 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 Eigentlich wollte ich das Ding ja die Woche fertig bekommen. Na gut. Heute ist ja erst Dienstag 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 Quote Link to comment Share on other sites More sharing options...
Mythos Posted January 19, 2010 Report Share Posted January 19, 2010 Nur stehe ich jetzt gerade vor dem Problemchen: Wo Anfangen? Ich würd sagen beim Indikator ;) Den Moving Average als Vorlage verwenden und sich so rantasten ist ja schon ein guter Anfang. Bei Fragen einfach fragen. Quote Link to comment Share on other sites More sharing options...
Luisa.A. Posted January 20, 2010 Author Report Share Posted January 20, 2010 Hallo allerseits, nachdem ich mir die halbe Nacht um die Ohren gehauen habe, ist auch etwas enstanden 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 Nun mein Problem: ich habe keinen Schimmer warum Ich bin mal so frei und poste den Quellcode. Vielleicht sehe ich ja auch gerade den Wald vor lauter Bäumen nicht #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 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..... Quote Link to comment Share on other sites More sharing options...
Mythos Posted January 20, 2010 Report Share Posted January 20, 2010 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 Quote Link to comment Share on other sites More sharing options...
Luisa.A. Posted January 20, 2010 Author Report Share Posted January 20, 2010 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 erstens: gute Besserung ;)Danke 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 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 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. 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: 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 Quote Link to comment Share on other sites More sharing options...
Luisa.A. Posted January 21, 2010 Author Report Share Posted January 21, 2010 :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 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++; } } Quote Link to comment Share on other sites More sharing options...
Mythos Posted January 21, 2010 Report Share Posted January 21, 2010 Die Symbole bleiben im Chart obwohl ich den Indi aus dem Chart gelöscht habe 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 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.