Suche Hilfe zur fertig Stellung für mein Indikator
Hallo Leute ich wende mich heute an euch da ich mit meinem begrenzen Wissen in der Programmierung nicht weiter komme^^
Der Indikator soll mir 4 Linien anzeigen Highhest/Lowest und dazwischen 2... Zur Zeit klappt die anzeige nur im Gold Chart aber nicht bei Währungs Paaren... Ich würde mich risig freuen wenn ihr mir ein paar Tips geben könnt worauf ich achten soll... anschauliche Beispiele helfen mir beim Lernen und verstehen ich bedanke mich jetzt schon :) Code:
//+---------------------------------------- Mein Linien Grid Indikator -------------------------------+ |
Code:
#property indicator_minimum 0 _HighestCandle und _LowestCandle geben Dir die Nummer der Kerze an, die den Höchst- und Tiefstwert haben. Die Prozent willst Du aber nicht von den Kerzennummern wissen, sondern vom Abstand Höchst zu Tiefst. Also: Code:
////double _Range = (_HighestCandle - _LowestCandle); Diese Zeilen sind gleich, also überflüssig: Code:
int _HighestCandle = iHighest(Symbol(), PERIOD_CURRENT, MODE_HIGH, _CandlesOnChart, 0); Code:
////int _HighCandle = iHighest(Symbol(), PERIOD_CURRENT, MODE_HIGH, _CandlesOnChart, 0); Code:
double bufferUntenPlAbstand[]; Und noch was: Du hast eine Benutzereingabe, die wahrscheinlich festlegen soll, über wie viele Kerzen die Höchst- und Tiefstwerte ermittelt werden. In Deiner Berechnung nimmst Du aber nur die im Chart sichtbaren Kerzen. Darüber solltest Du nachdenken. Bei mir wird alles korrekt in Dax, EurUsd angezeigt. Das war's erst mal. Hoffe, das hilft Dir weiter. AVT |
Mega :) vielen herzlichen Dank
Ich freu mich :)
werde nachher dank dir ein schritt weiter sein... ich überlege gerade war überhaupt was richtig??? villeicht mein ansatz xD Frage: kann man im code festlegen wie groß der chart im mt4 dar gestellt wird? damit zb jedes währungspaar gleich große kerzen darstellt? ich wünsche dir eine angenehme woche und merci vielmals für alles |
:)
Ich bin jetzt fertig habe alles übertragen und auf den chart angewendet...
es klappt :) ich habe da noch ne fragen gefunden^^ 1. den Satz versteh und finde nichts in der dokomentation... "und dann in OnCalculate alle "Display" durch PFX+"Display" ersetzen" |
Zitat:
Code:
int BodyWidth = (int)ChartGetInteger(0,CHART_SCALE,0); //Größe des Kerzenkörpers Einstellen kannst Du die neue Größe dann z.B. in OnInit mit: Code:
ChartSetInteger(0,CHART_SCALE,0,5)); //Hauptfenster mit Riesenkerzen Code:
ChartSetInteger(0,CHART_SCALE,0,BodyWidth)); //alte Größe https://docs.mql4.com/constants/char...charts_samples Zum reinen Laden von Charts mit demselben Layout kannst Du aber besser ein Template (eine Vorlage) erstellen und dann die Vorlage laden, da ist dann auch gleich ein Indikator mit drin, wenn es sein soll. AVT |
Zitat:
In Deiner OnCalculate Funktion erzeugst Du ja noch ein Textobjekt (OBJ_LABEL), das die Werte anzeigt. Und dieses OBJ_LABEL hat ursprünglich den Namen "Display". Nun soll aber jedes Objekt, das der Indikator erzeugt auch eindeutig zu erkennen sein (nämlich, daß es zu diesem Indikator gehört), damit wir beim Verlassen all unsere - und nur unsere - erzeugten Objekte entfernen können. Darum haben wir die Variable string PFX="MeinIndi_" eingeführt und nun setzen wir das Präfix PFX vor den Namen aller Objekte, die der Indikator erzeugt. Das heißt: überall wo im Code vorher nur "Display" stand muß jetzt PFX+"Display" stehen (daraus wir dann das Label-Objekt namens MeinIndi_Display). Code:
if(ObjectCreate(0, "Display", OBJ_LABEL, 0, 0, 0)) { AVT |
der Fortschritt
Dank deinen Ausführlichen Schritten versteh selbst ich als Leihe was ich zu machen habe... Dafür Bedanke ich mich
Jetzt siht der Code so aus: Code:
//| Mein Linien Grid Indikator ---+ |
Zitat:
AVT |
Liste der Anhänge anzeigen (Anzahl: 3)
Das Ausgeben von Print-Meldungen solltest Du Dir angewöhnen, dann kannst Du besser nachprüfen, was im Code passiert und ob es das ist, was Du beabsichtigst. Die Ausgabe siehst Du im Terminal Tab Experten. Wenn dann alles korrekt läuft, kannst Du die Print Befehle kommentieren (nicht einfach löschen, so kannst Du später mal nachsehen oder sie als Vorlage verwenden).
Wenn Du viele Print-Ausgaben im Code hast (ganz besonders wenn sie in der OnCalculate Funktion stehen), werden die Dateien ziemlich schnell groß. Daher hin und wieder die alten Dateien löschen (die vom aktuellen Tag kann man erst dann löschen, wenn MetaEditor und MetaTrader geschlossen sind): Datei - Speicherort öffnen Dort (wo auch die terminal.exe und metaeditor.exe liegen), gehst Du in den Ordner MQL4. Dort findest Du einen Ordner Logs, in dem alle Ausgaben, die Du im Terminalfenster unter Experten siehst, gespeichert werden. Hast Du schon mal im MetaEditor die F1 Taste gedrückt? Dann sollte eigentlich ein Fenster aufgehen, mit der gesamten Dokumentation. Noch was: erst einen Plan machen, dann coden 1. was genau soll berechnet werden 2. wie sollen die Daten angezeigt werden 3. alles testen zu 1. Du hast hier eine Benutzerangabe "Perioden=1500". Was für "Perioden" sollen das sein, Heizperioden, Hoch-/Tiefperioden, Chartperioden? All Deine anderen Variablen benennst Du sehr genau (das finde ich super). "Perioden" wird nirgends im Code benutzt. Derzeit ist diese Zeile also überflüssig. zu 2. Deine Daten (also Linien) werden über Buffer gezeichnet. Jetzt sehe ich in Deinem Code ObjectSetInteger(0, "_HighestCandle", OBJPROP_RAY, true); Hier gibst Du einem Linienobjekt die Eigenschaft, die Linie zu verlängern. Es gibt aber gar kein Linienobjekt. zu 3. Nimm einen neuen Chart, schmeiß Deinen Indikator drauf. Bevor Du auf Ok drückst, lies Dir alle Tabs durch, was dort steht. Dann lege über Deine Buffer-Linien von Hand eine waagerechte Linie. Nun ändere die Kerzengröße (+ Zeichen oder - Zeichen drücken). Danach mache die Fensterbreite kleiner (rechten Fensterrand nach links schieben). Wo sind Deine von Hand gezeichneten Linien jetzt? Mit der Änderung der Kerzengröße oder der Fensterbreite ändert sich auch die Anzahl der sichtbaren Kerzen im Chart (und nur über diese Anzahl berechnest Du zur Zeit Deine Höchst- und Tiefstlinien). Zum Schluß mach die Fensterbreite ganz klein, stell die Zeit auf eine Minute, nimm die größte Kerzengröße und beobachte ein paar Minuten, wie sich die Linien verhalten. Ist es das, was Du mit Deiner Berechnung willst? Im Anhang erst mal eine kommentierte Version Deiner letzten (testNefastus2). Und dann eine Version mit allen Print-Ausgaben, die bereinigt ist (Nefastus3) und ein Bild wie es in 4 unterschiedlichen Märkten aussieht (beachte im Gold die erste halbe Kerze im Chart: sie wird nicht mitberechnet, soll das so sein?). Damit hast Du erst mal viel zu lesen, zu verstehen und zu testen ;) AVT |
...oO... der Wahnsinn
Erst einmal vielen Dank für deine Zeit und dein Wissen...
Ich dachte nicht das man so viel zu beachten hat bei 4 Horizontale Linien xD Mit // ** die nächste Zeile ist überflüssig, weil Du nicht mit Perioden rechnest input int Perioden = 1500; Das stimmt da ich nur die sichtbaren Kerzen für Hoch/Tief verwend... werde in den kommenden Tagen dein Rat befolgen und mir die Print Funktionen näher anschauen die du mir freundlicher weise schon an den richtigen Stellen eingebaut hast ... vielen Dank ich melde mich demnächst wieder bis dahin wünsch ich eine angenehme Woche gruß Marcel |
erster Test OK
So weit ich es beurteilen kann ist alles ok...
das mit der halben Kerze stört mich gerade nicht... ersteinmal abwarten ich habe Versucht die Linien im Chart auszulesen mit Hilfe diesen Zeilen PHP-Code:
Wie im Bild habe ich 2 weitere Linien eingezeichnet die Erkennt er richtig... hast du eine Idee? fg Marcel ps: ich würde gerne ein Bild einfügen weiß aber nicht wie das geht mit der URL |
Liste der Anhänge anzeigen (Anzahl: 4)
Das Einfache zuerst:
Zitat:
Zitat:
Ich habe Deinen Code mal in ein Skript gepackt (im Kommentar steht jetzt genau, was gefunden wird) und auf alle möglichen meiner Charts gepackt und bei allen ist das Ergebnis völlig korrekt. Wenn Du einen komplett neuen Chart nimmst und Deinen Indikator draufschmeißt und dann das Skript auf diesen Chart packst, dann sollte es eigentlich Dir eigentlich sagen, daß 2 Objekte da sind, nämlich die Chart-ID und der Text mit den Höchst-/Tiefstwerten, und sonst gar nix. *** Wenn Du jetzt über jede Linie im Chart von Hand eine waagerechte Linie legst, dann sollte er Dir sagen, daß es 6 Objekte gibt: 1 Chart-ID 1 (Textobjekt) namens LinienGrid_Display 4 Linien (wahrscheinlich alle mit einem Namen "Horizontal Line xxx", wobei die xxx eine Zahl ist). ------- *** Wenn Du Dich jetzt fragst, warum auf dem "nackten Chart" mit Deinem Indikator nur die Chart-ID und das Textobjekt erscheinen: weil die Indikatorlinien mit Buffern gezeichnet werden und nicht mit Linienobjekten. Das kannst Du bei diesem Indikator sehen in Ansicht - Datenfenster: dort erscheinen die von Dir erzeugten Buffer (und wenn Du mit der Maus im Chart bist, kommen die Werte) Code:
#property indicator_label1 "Obere Linie" //double bufferGanzOben[]; Ich hoffe, das beseitigt alle Unklarheiten. ;) AVT |
Liste der Anhänge anzeigen (Anzahl: 1)
Ok das man die Buffer Linien im Experts nicht so auslesen kann wuste ich nicht dann muss ich weiter auf Fehler suche gehen^^
meine Idee mit dem Indikator ist einfach... wenn er den Buffer(1) Oben - Abstand durchbricht macht er eine Sell(Grid System) wenn Positionen offen sind wenn der Buffer(2) Unten + Abstand durchbricht schließt er diese und erstellt Buy Positionen zum Üben ersteinmal was simples^^ Code:
//=== Das schau ich mir morgen an^^ gute Nacht |
So 2 Wochen sind um^^
So AVT habe viel getestet auch im Life Betrieb (auf Demo Konto) habe die Print Funktionen getestet die du mir netter weise schon geschrieben hast bis jetzt hab ich kein Fehler erkennen können :) aber eine Frage hab ich noch^^ es geht um die letzte halbe kerze die nicht mit berechnet wird:
Was muss ich im Code ändern damit ich die mit berechne? Ich bedanke mich recht herzlich bei dir für deine grandiose Arbeit das viele Schreiben / Erklären und die Gedult für Hobby Programmierer Danke :) gruß Marcel |
Bild vergessen
Liste der Anhänge anzeigen (Anzahl: 1)
Er Eröffnet jetzt richtig bei der Linie "FREU"
|
Zitat:
Die "normale" Schleife geht so: von i=limit bis i>=0 (also irgendwo links am Chartanfang bis die aktuelle Kerze 0 erreicht ist). Welchen Wert limit hat, kannst Du Dir auch mit Print anzeigen lassen. limit ist bei mir im einfachen Fall immer so eingestellt, daß es mit der benötigten Anzahl anfängt (dann muß man nur am Anfang die benötigte Anzahl ändern). Wenn Du also eine Kerze mehr berechnen willst, dann ist die Anzahl der _BenoetigteKerzen eben eine mehr, also _NummerErsteSichtbareKerze+1 (nicht vergessen, "normal" zählen wir die Kerzen rückwärts hoch). Ich hoffe, das hilft Dir, die richtige Stelle zu finden. AVT |
ein paar wichtige Fragen :)
Hallo mir sind diese Woche viele Fragen durch den Kopf gegangen die ich euch heute stellen möchte. Da ich kein gelernter Programierer bin... kenn und weiß nicht welche Fragen ich mir stellen muss^^ Wie immer bedanke ich mich jetzt schon für jeden Kommentar der mir weiter hillft :)
Fragen: - Ich weiß was die OnInit, OnDeinit macht ... was schreibt ihr da grundsätzlich rein? - Ist es ratsam alles in ein EA untereinander zu schreiben oder besser alles in kleine Funktionen? - welche Funktionen würdet ihr in die Include schreiben um darauf immer zuzugreifen? - gibt es ein vordruck was alles in ein EA gehört um es sicher zu machen zB vor Abstürzen oder damit der EA am Sonntag 23:01 Uhr weiß welche Trades vom Freitag noch offen? Vielen Dank fürs Lesen und Kommentieren und wünsche euch eine angenehme Woche... euer Marcel |
Hallo da ich den Indikator nur im Visuellen Modus und im Life(Demo) mit einem Expert getestet habe, ist mir jetzt erst aufgefallen das er im Backtest ohne Visuellen Modus gar nichts macht... hast du ein Tip für mich damit es auch im schnell Test klappt? vielen dank im vorraus :)
|
Zitat:
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 22:45 Uhr. |
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum