Saturday, 7 January 2017

Icustom Moving Durchschnitt

Erstellen von benutzerdefinierten Indikatoren Bei der Erstellung einer Handelsstrategie steht ein Entwickler oft vor der Notwendigkeit, in einem Sicherheitsfenster eine bestimmte Abhängigkeit zu berechnen, die von einem Benutzer (Programmierer) berechnet wird. Zu diesem Zweck bietet MQL4 die Möglichkeit, individuelle Indikatoren zu erstellen. Custom Indicator ist ein in MQL4 kodiertes Anwendungsprogramm, das grundsätzlich für die grafische Darstellung vorberechneter Abhängigkeiten vorgesehen ist. Benutzerdefinierte Indikatorstruktur Notwendigkeit von Puffern Das Hauptprinzip, das den benutzerdefinierten Indikatoren zugrunde liegt, besteht darin, Werte von Indikatorarrays über Austauschpuffer an ein Client-Terminal (zum Zeichnen von Indikatorzeilen) weiterzugeben. Puffer ist ein Speicherbereich, der numerische Werte eines Indikatorarrays enthält. MQL4-Standard impliziert die Möglichkeit, bis zu acht Indikatorlinien mit einem benutzerdefinierten Indikator zu erstellen. Ein Indikatorarray und ein Puffer werden in Übereinstimmung mit jeder Indikatorlinie gebracht. Jeder Puffer hat seinen eigenen Index. Der Index des ersten Puffers ist 0, der zweite - 1 und so weiter, der letzte hat den Index 7. 115 zeigt, wie die Informationen aus einem benutzerdefinierten Indikator über Puffer an ein Client-Endgerät zum Zeichnen von Indikatorzeilen übergeben werden. Feige. 115. Übergeben von Werten von Indikator-Arrays über einen Puffer an ein Client-Terminal. Die allgemeine Reihenfolge für die Erstellung von Indikatorlinien ist die folgende: 1. Berechnungen werden in einem benutzerdefinierten Indikator durchgeführt, wodurch numerische Werte den Indikatorarrayelementen zugewiesen werden. 2. Werte von Indikatorarray-Elementen werden über Puffer an ein Client-Terminal gesendet. 3. Auf der Basis von Wert-Arrays, die von Puffern empfangen werden, zeigt ein Client-Terminal Anzeigenzeilen an. Komponenten eines benutzerdefinierten Indikators Ermöglicht die Analyse eines einfachen benutzerdefinierten Indikators, der zwei Zeilen zeigt - eine Zeile basiert auf maximalen Barpreisen, die zweite auf minimalen Preisen. Beispiel für ein einfaches benutzerdefiniertes Indikator userindicator. mq4 Wir können die Indikatorteile detailliert analysieren. In jedem in MQL4 geschriebenen Anwendungsprogramm können Sie Setup-Parameter angeben, die die korrekte Programmbedienung durch ein Client-Terminal bereitstellen. In diesem Beispiel enthält der Kopfprogrammteil (siehe Programmstruktur) mehrere Zeilen mit directives-Eigenschaft. Die erste Anweisung gibt an, in welchem ​​Fenster das Client-Terminal die Indikatorlinien zeichnen soll: In MQL4 gibt es zwei Varianten von Zeichnungsindikatorlinien: im Hauptsicherheitsfenster und in einem separaten Fenster. Das Hauptfenster ist das Fenster mit einer Sicherheitstabelle. In diesem Beispiel zeigt parameter indicatorchartwindow im Eigenschaftsverzeichnis an, dass ein Client-Terminal Indikatorzeilen im Hauptfenster zeichnen soll. Die nächste Zeile zeigt die Anzahl der im Indikator verwendeten Puffer an: Im analysierten Beispiel werden zwei Indikatorzeilen gezeichnet. Jedem Puffer ist ein Puffer zugeordnet, so daß die Gesamtzahl der Puffer zwei beträgt. Die nächsten Zeilen beschreiben die Farben der Indikatorlinien. Die Parameter indicatorcolor1 und indicatorcolor2 definieren die Farbeinstellungen für entsprechende Puffer - in diesem Fall für Puffer mit den Indizes 0 (blau) und 1 (rot). Beachten Sie, dass Zahlen in den Parameternamen indicatorcolor1 und indicatorcolor2 keine Pufferindizes sind. Diese Figuren sind Teile von konstanten Namen, die in Übereinstimmung mit Puffern gesetzt sind. Für jede konstante Farbe kann die Diskretion eines Benutzers eingestellt werden. In den nächsten Zeilenindikator-Arrays werden deklariert: Der Indikator ist für das Zeichnen zweier Indikatorlinien vorgesehen, daher müssen wir zwei globale eindimensionale Arrays deklarieren, einen für jede Zeile. Namen von Indikator-Arrays sind bis zu Benutzer. In diesem Fall werden die Array-Namen Buf0 und Buf1 verwendet, in anderen Fällen können andere Namen verwendet werden, z. B. Line1, Alfa, Integral etc. Es ist notwendig, Arrays auf globaler Ebene zu deklarieren, da Array-Elemente Werte zwischen den Anrufen beibehalten werden müssen Der Sonderfunktion start (). Die beschriebene benutzerdefinierte Anzeige basiert auf zwei Sonderfunktionen - init () und start (). Die Funktion init () enthält nur den Codeteil, der nur einmal im Programm verwendet wird (siehe Sonderfunktionen). Eine sehr wichtige Aktion wird in der Zeile ausgeführt: Mit der Funktion SetIndexBuffer () wird ein notwendiger Puffer (in diesem Fall mit dem Index 0) in Korrespondenz mit einem Array (in diesem Fall Buf0) gesetzt. Es bedeutet für den Aufbau der ersten Indikatorlinie ein Client-Terminal akzeptiert Daten im Array Buf0 mit dem Null-Puffer für sie enthalten. Weiterhin wird der Linienstil definiert: Für den Nullpuffer (0) sollte ein Client-Terminal die folgenden Zeichnungsstile verwenden: einfache Linie (DRAWLINE), durchgezogene Linie (STYLESOLID), Linienbreite 2. Die nächsten beiden Zeilen enthalten Einstellungen für die zweite Zeile : Entsprechend dem Code der Spezialfunktion init () werden dann beide Indikatorzeilen im Hauptsicherheitsfenster gezeichnet. Die erste ist eine solide blaue Linie mit der Breite 2, die zweite ist eine rote gestrichelte Linie (STYLEDOT) einer üblichen Breite. Indikatorlinien können auch von anderen Stilen gezeichnet werden (siehe Styles of Indicator Lines). Berechnen von Werten von Indikator-Arrays Elemente (Be Attentive) Werte von Indikator-Arrays-Elementen werden in der speziellen Funktion start () berechnet. Um den Inhalt des start () - Codes richtig zu verstehen, achten Sie auf die Reihenfolge der Indexierungsbalken. Der Abschnitt Arrays beschreibt im Detail die Methode der Indexierung von Arrays-timeseries. Nach dieser Methode beginnt die Balkenindizierung von Null. Die Nullleiste ist ein noch nicht geformter Balken. Der nächste Balkenindex ist 1. Die nächsten sind 2 und so weiter. Wenn neue Balken in einem Sicherheitsfenster erscheinen, werden die Indizes der bereits gebildeten Balken geändert. Der neue (aktuelle, gerade geformte, rechtsextreme) Balken erhält den Nullindex, der linke von ihm (der soeben fertig gebildete) erhält den Index 1 und die Werte der Indizes aller Historienbars werden ebenfalls um eins erhöht. Die beschriebene Methode der Indexierung von Bars ist die einzige Möglichkeit für das gesamte Online-Handelssystem MetaTrader, und es wird bei der Zeichnung von Linien mit technischen und benutzerdefinierten Indikatoren berücksichtigt. Es wurde früher gesagt, dass Indikatorlinien auf der Basis von numerischen Informationen, die in Indikatoranordnungen enthalten sind, konstruiert werden. Ein Indikatorarray enthält Informationen über Punktkoordinaten, auf denen eine Indikatorlinie gezeichnet wird. Und die Y-Koordinate jedes Punktes ist der Wert eines Indikatorarray-Elements. Und die X-Koordinate ist der Wert eines Indikatorarray-Elementindex. Im analysierten Beispiel wird die erste Indikatorlinie mit Maximalwerten von Balken gezeichnet. Fig. 116 zeigt diese Anzeigelinie (der blauen Farbe) in einem Sicherheitsfenster, sie ist auf der Basis des Indikatorarrays Buf0 aufgebaut. Feige. 116. Korrespondenz von Koordinaten einer Indikatorlinie zu Werten eines Indikatorarrays. Der Indexwert eines Indikatorarrays wird von einem Client-Terminal in Übereinstimmung mit einem Balkenindex ausgegeben - diese Indexwerte sind gleich. Es muss auch berücksichtigt werden, dass der Prozess des Konstruierens von Indikatorlinien im Echtzeitmodus unter Bedingungen fortschreitet, wenn in einem Sicherheitsfenster von Zeit zu Zeit neue Balken erscheinen. Und alle historischen Bars sind nach links verschoben. Um die Indikatorlinie korrekt zeichnen zu lassen (jeder Linienpunkt über seinem Balken), muss er auch zusammen mit Balken verschoben werden. Es besteht also Bedarf (technischer Bedarf), ein Indikatorarray neu zu indizieren. Der grundlegende Unterschied eines Indikatorarrays aus einem üblichen Array ist folgender: Im Moment, in dem ein neuer Balken erzeugt wird, werden die Indexwerte der Indikatorarrayelemente automatisch durch das Clientterminal geändert, nämlich - der Wert jedes Indikatorarrayindexes wird erhöht Und die Indikatoranordnungsgröße wird um ein Element (mit einem Nullindex) erhöht. Beispielsweise kann der Null-Balken in Fig. 116 (Zeitrahmen H1) hat die Öffnungszeit 6:00. Um 7:00 erscheint eine neue Leiste im Sicherheitsfenster. Die Bar, die um 6:00 Uhr geöffnet ist, erhält automatisch den Index 1. Um die Indikatorlinie korrekt auf dieser Leiste zu zeichnen, ändert das Client-Terminal den Index des Indikatorarray-Elements entsprechend der Bar, die um 6:00 geöffnet ist. In der Tabelle in Fig. 116 wird dieses Element in die erste Zeile geschrieben. Zusammen mit diesen Indizes werden alle Array-Elemente durch das Client-Terminal um eins erhöht. Ein Index des Array-Elements, das dem bei 6:00 geöffneten Balken entspricht, erhält den Wert 1 (vorher war er gleich 0). Das Indikatorarray wird um ein Element größer. Der Index eines neuen hinzugefügten Elements ist gleich 0, der Wert dieses Elements ist ein neuer Wert, der die Koordinate der Indikatorzeile auf einem Nullbalken widerspiegelt. Dieser Wert wird in der Sonderfunktion start () bei jedem Tick berechnet. Berechnungen in der Sonderfunktion start () sollten so durchgeführt werden, dass keine zusätzlichen Aktionen durchgeführt wurden. Bevor der Indikator an ein Diagramm angehängt wird, werden keine Indikatorlinien angezeigt (da Werte für Indikatorarrays noch nicht definiert sind). Deshalb müssen beim ersten Start der Sonderfunktion die Start - () - Indikator-Array-Werte für alle Balken berechnet werden, auf denen die Indikatorlinie gezeichnet werden soll. In dem analysierten Beispiel sind dies alle Balken, die in einem Diagramm vorliegen (die anfänglichen Berechnungen können nicht für alle verfügbaren Balken durchgeführt werden, sondern für einen letzten Teil der Geschichte wird sie in weiteren Beispielen beschrieben). Für alle weiteren Starts der Sonderfunktion start () ist es nicht nötig, die Werte des Indikatorarrays für alle Balken wieder zu berechnen. Diese Werte werden bereits berechnet und sind im Indikatorarray enthalten. Es ist notwendig, den aktuellen Wert der Indikatorlinie nur bei jedem neuen Tick der Nullleiste zu berechnen. Für die Implementierung der beschriebenen Technologie gibt es eine sehr nützliche Standardfunktion in MQL4 - IndicatorCount (). Function IndicatorCounted () Diese Funktion gibt die Anzahl der Balken zurück, die sich seit dem letzten Indizierungsaufruf nicht geändert haben. Wenn der Indikator noch nie an einem Diagramm angehängt worden ist, ist bei der ersten Ausführung von start () der Wert von Countedbars gleich Null: Er bedeutet, dass das Indikatorarray kein Element mit einem früheren vordefinierten Wert enthält, daher das gesamte Indikatorarray Muss von Anfang bis Ende berechnet werden. Das Indikatorarray wird vom ältesten Balken bis zum Nullpunkt berechnet. Der Index des ältesten Stabes, ausgehend von dem die Berechnungen gestartet werden müssen, wird folgendermaßen berechnet: Angenommen, im Moment des Anbringens des Indikators befinden sich 300 Balken in einem Diagrammfenster. Dies ist der Wert der vordefinierten Variablen Bars. Wie oben definiert, ist Countedbars gleich 0. Somit ergibt sich als Ergebnis, dass der Index i des ersten unzählbaren Bar (der letzte, ausgehend von dem die Berechnungen durchgeführt werden sollen) gleich 299 ist. Alle Werte der Indikator-Array-Elemente sind Berechnet in der Schleife while (): Während i innerhalb des Bereichs von der ersten uncounted bar (299) bis zur aktuellen (0) ist, werden für beide Indikatorlinien Werte von Indikatorarrayelementen berechnet. Beachten Sie, dass fehlende Werte von Indikator-Array-Elementen während eines (ersten) Starts der Sonderfunktion start () berechnet werden. Während der Berechnungen erinnert sich das Client-Terminal an Elemente, für die Werte berechnet wurden. Die letzte Iteration in while () wird durchgeführt, wenn i gleich 0 ist, d. h. Werte von Indikatoranordnungen werden für die Null-Balken berechnet. Wenn die Schleife vorbei ist, beendet die spezielle Funktion start () ihre Ausführung und die Steuerung wird an das Client-Terminal übergeben. Das Client-Terminal wiederum zieht alle (in diesem Fall zwei) Anzeigerzeilen in Übereinstimmung mit den berechneten Werten von Array-Elementen. Beim nächsten Tick wird start () vom Client-Terminal erneut gestartet. Weitere Aktionen werden von der Situation abhängen (wir werden das Beispiel für 300 Bar weiter analysieren). Variante 1. Ein neues Häkchen kommt bei der Bildung der aktuellen Nullstelle (die häufigste Situation). Feige. 117 zeigt zwei Zeilen, die vom Terminal in den Momenten der Zeit t 1 und t 2 empfangen werden. Die analysierte Situation ist für beide Ticks dieselbe. Damit wird die Ausführung von start () verfolgt, die zum Zeitpunkt t 2 gestartet wurde. Während der Ausführung der Funktion start () wird folgende Zeile ausgeführt: IndicatorCount () liefert den Wert 299, dh seit dem letzten Aufruf von start () 299 vorherige Takte wurden nicht geändert. Als Ergebnis wird i Indexwert gleich 0 (300-299-1): Es bedeutet, in der nächsten while () Schleife die Werte der Array-Elemente mit dem Null-Index berechnet werden. Mit anderen Worten wird die neue Position einer Indikatorlinie auf dem Nullbalken berechnet. Wenn der Zyklus beendet ist, stoppt start () die Ausführung und übergibt die Steuerung an das Client-Terminal. Variante 2. Ein neues Häkchen ist das erste Häkchen einer Nullleiste (passiert von Zeit zu Zeit). In diesem Fall ist die Tatsache des Erscheinens eines neuen Stabes wichtig. Bevor die Steuerung an die spezielle Funktion start () übergeben wird, zieht das Client-Terminal alle im Sicherheitsfenster vorhandenen Balken wieder zurück und re-indexiert alle deklarierten Indikatorfelder (die in Übereinstimmung mit Puffern gesetzt sind). Außerdem erinnert sich das Client-Terminal daran, dass es bereits 301 Balken, nicht 300 in einem Diagrammfenster gibt. Feige. 118 enthält die Situation, wenn beim letzten Tick des vorhergehenden Taktes (im Moment t 2) die Funktion start () erfolgreich gestartet und ausgeführt wurde. Thats warum, obwohl jetzt die erste Bar (mit Index 1) fertig zu dem Zeitpunkt t 2 von der Indikator berechnet wurde, wird Funktion IndicatorCounted () zurückgeben Wert, der auf dem vorherigen bar war. Dh 299: Im nächsten Zeilenindex i wird berechnet, in diesem Fall für das erste Häkchen eines neuen Balkens ist es gleich 1 (301-299-1): Es bedeutet die Berechnung von Indikatorarraywerten in while () - Schleife Beim Erscheinen einer neuen Leiste sowohl für die letzte Leiste als auch für die neue Nullleiste durchgeführt wird. Ein wenig früher bei der Neuindizierung von Indikator-Arrays erhöhte das Client-Terminal die Größe dieser Arrays. Werte von Array-Elementen mit Null-Indizes wurden vor den Berechnungen in der Schleife nicht definiert. Während der Berechnungen in der Schleife erhalten diese Elemente einige Werte. Wenn die Berechnungen in start () vorbei sind, wird die Steuerung an das Client-Terminal zurückgegeben. Danach zeichnet das Client-Terminal Indikatorlinien auf dem Null-Balken basierend auf gerade berechneten Werten von Array-Elementen mit Null-Indizes. Variante 3. Ein neues Häkchen ist das erste Häkchen eines neuen Nullpunktes, aber das letzte Häkchen wird nicht bearbeitet (seltener Fall). Feige. 119 zeigt die Situation, als start () beim ersten Ticken einer neuen Leiste im Moment t 5 gestartet wurde. Vorheriges Mal wurde diese Funktion zum Zeitpunkt t 2 gestartet. Tick, der zum Zeitpunkt t 3 (roter Pfeil) zum Terminal kam ) Wurde nicht durch den Indikator verarbeitet. Dies geschah, weil die start () - Ausführungszeit t 2 - t 4 größer als das Intervall zwischen den Zecken t 2 - t 3 ist. Diese Tatsache wird vom Client-Terminal während der Ausführung von start (), die zum Zeitpunkt t 5 gestartet wird, erkannt Berechnungen in der Zeile: IndicatorCounted () gibt den Wert 299 () zurück. Dieser Wert ist wahr - ab dem Zeitpunkt des letzten Indikatoraufrufs wurden 299 Takte nach (jetzt schon) nicht geändert 301. Deshalb wird der berechnete Index der ersten (am weitesten links liegenden) Balken, aus dem die Berechnungen von Array-Elementwerten gestartet werden müssen, Wird gleich 1 (301-299-1): es bedeutet, während while () Ausführung zwei Iterationen durchgeführt werden. Während des ersten Werts werden die Werte der Array-Elemente mit dem Index i & sub1; berechnet, d. h. Buf01 und Buf11. Nicht, wenn die Berechnungen beginnen, werden die Balken und Indikatorarrays bereits vom Client-Terminal neu indiziert (da ein neuer Balken zwischen den Starts der Sonderfunktion start () beginnt). Daher werden Berechnungen für Elemente von Arrays mit dem Index 1 auf der Basis von Array-Zeitreihen (maximale und minimale Werte eines Barpreises) auch mit dem Index 1 berechnet: Während der zweiten Iteration von while () - Werten für Elemente mit Null Indizes, dh für die Null-Balken, wird auf der Grundlage der letzten bekannten Werte von Arrays-Zeitreihen berechnet. Die Verwendung der beschriebenen Technologie für die Berechnung von kundenspezifischen Indikatoren ermöglicht es erstens, eine Berechnung der Werte aller Indikatorarrayelemente unabhängig von der spezifischen Natur des Tickverlaufs zu garantieren und zweitens Berechnungen nur für unzählige Balken durchzuführen, dh ökonomische Berechnungsressourcen zu verwenden . Nicht gilt ein Balken als unzählbar, wenn die Berechnung von Elementwerten eines Indikatorarrays zumindest für ein letztes Tick des Balken nicht durchgeführt wird. Wenn Sie das benutzerdefinierte Indikator userindicator. mq4 in einem Diagrammfenster starten, sehen Sie zwei Linien - eine dicke blaue Linie, die auf Balkenmaximalen aufgebaut ist, und eine gepunktete rote Linie, die auf deren Minimum aufgebaut ist (Abb. 120). Es sollte angemerkt werden, dass man einen benutzerdefinierten Indikator aufbauen kann, dessen Anzeigelinien mit den Zeilen eines analogen technischen Indikators übereinstimmen würden. Es kann leicht gemacht werden, wenn als Berechnungsformeln im benutzerdefinierten Indikator dieselben Formeln wie im technischen Indikator verwendet werden. Um dies zu verdeutlichen, können wir den im vorigen Beispiel analysierten Programmcode verbessern. Lassen Sie die Indikatorlinie Linien auf Durchschnittswerte von Maximums und Minimums von mehreren letzten Bars. Es ist einfach, notwendige Berechnungen durchzuführen: Wir müssen lediglich Mittelwerte von Arrays-Timeeries-Elementen finden. Beispielsweise wird der Wert eines Indikatorarrays mit dem Index 3 (dh der Indikatorzeilenkoordinate für den dritten Balken) auf der Basis der letzten fünf Maxima wie folgt berechnet: Buf03 (High3 High4 High5 High6 High7) 5 Analoge Berechnungen können durchgeführt werden Für eine Indikatorlinien auf Minimums gebaut. Beispiel für einen einfachen benutzerdefinierten Indikator averagevalue. mq4. Indikatorlinien basieren auf durchschnittlichen minimalen und maximalen Werten von N bar. In diesem Beispiel gibt es eine externe Variable AverBars. Mit dieser Variablen kann ein Benutzer die Anzahl der Balken angeben, für die ein Mittelwert berechnet wird. In start () wird dieser Wert für die Berechnung eines Mittelwertes verwendet. In der Schleife wird die Summe der maximalen und minimalen Werte für die Anzahl der Balken berechnet, die dem Wert der Variablen AverBars entsprechen. In den nächsten beiden Programmzeilen werden für Indikatorzeilen, die Minimal - und Maximalwerten entsprechen, Werte von Indikatorarray-Elementen berechnet. Die hier verwendete Mittelungsmethode wird auch für Berechnungen im Technischen Indikator Moving Average angewendet. Wenn wir den analysierten Custom Indikator averagevalue. mq4 und den technischen Indikator Moving Average anhängen, sehen wir drei Indikatorlinien. Wenn für beide Indikatoren die gleiche Mittelungsperiode eingerichtet ist, fällt die Zeile Moving Average mit einer der benutzerdefinierten Indikatorlinien überein (dazu müssen in den technischen Indikatoreinstellungen die in Abb. 121 beschriebenen Parameter angegeben werden). Feige. 121. Übereinstimmende Linien einer technischen Anzeige und einer benutzerdefinierten Anzeige (rote Linie). Somit kann ein Benutzer mit Hilfe eines technischen Indikators die Reflexion der in der praktischen Arbeit notwendigen Regelmäßigkeiten konstruieren. Benutzerdefinierte Indikatoroptionen Zeichnen von Indikatorzeilen in separaten Windows MQL4 bietet einen großen Dienst für den Aufbau von benutzerdefinierten Indikatoren, die mit ihnen sehr bequem macht. Insbesondere können Indikatorlinien in einem separaten Fenster gezeichnet werden. Dies ist praktisch, wenn absolute Werte der Amplitude der Indikatorlinie wesentlich kleiner (oder größer) als die Sicherheitspreise sind. Wenn wir z. B. interessiert sind an der Differenz zwischen Mittelwerten von Balkenmaxima und Minima in einem bestimmten historischen Intervall, so ist dieser Wert je nach Zeitrahmen ungefähr gleich 0 bis 50 Punkte (z. B. für M15). Es ist nicht schwierig, eine Anzeigezeile aufzubauen, aber in einem Sicherheitsfenster wird diese Linie im Bereich von 0 bis 50 Punkten eines Sicherheitspreises gezogen, d. h. wesentlich niedriger als der auf dem Bildschirm reflektierte Kartenbereich. Es ist sehr unpraktisch. Um Indikatorzeilen in einem separaten Fenster (das sich im unteren Teil eines Sicherheitsfensters befindet) zu zeichnen, muss in der directive - Eigenschaft (am Programmanfang) die Parameterindikatorseparatewindow angegeben werden: In dem Augenblick, in dem ein solches Kennzeichen an ein Sicherheitsfenster angehängt wird Erzeugt das Client-Terminal ein separates Fenster unterhalb eines Diagramms, in dem Indikatorzeilen, die in dem Indikator berechnet werden, gezeichnet werden. Je nach Farbeinstellungen und Typen von Indikatorlinien werden sie in diesem oder jenem Stil gezeichnet. Begrenzung der Berechnungshistorie In den meisten Fällen enthalten Indikatorzeilen nur in der jüngsten Vergangenheit nützliche Informationen. Der Teil der Indikatorlinien, die auf alten Stäben aufgebaut sind (z. B. 1 Monat alter Minutenzeitrahmen), kann kaum als nützlich angesehen werden, um Handelsentscheidungen zu treffen. Außerdem, wenn es viele Balken in einem Diagrammfenster gibt, ist die Zeit, die in die Berechnung und das Zeichnen von Indikatorlinien investiert wird, unangemessen groß. Dies kann im Programm-Debugging kritisch sein, wenn ein Programm häufig kompiliert und dann gestartet wird. Deshalb ist es notwendig, Berechnungen nicht für die ganze Geschichte durchzuführen, sondern für den begrenzten Teil der jüngsten Geschichte der Bar. Dazu wird im folgenden Programm ein externer Variablenverlauf verwendet. Der Wert dieser Variablen wird bei der Berechnung des Index des ersten (linken) Balken berücksichtigt, ab dem die Elemente der Indikatorfelder berechnet werden müssen. Weitere Berechnungen in while () Schleife wird für die Anzahl der letzten History Bars nicht größer als History-Wert durchgeführt werden. Beachten Sie, dass das analysierte Verfahren zur Begrenzung eines Berechnungsverlaufs nur den Teil der Berechnungen betrifft, die im ersten Start der Sonderfunktion start () durchgeführt werden. Wenn neue Balken erscheinen, werden neue Teile der Indikatorlinien in dem rechten Teil hinzugefügt, während das Bild in dem linken Teil beibehalten wird. Somit wird die Länge der Anzeigelinie während der gesamten Anzeigebetriebszeit erhöht. Der Common-Wert des History-Parameters wird etwa 5000 bar betragen. Beispiel eines einfachen benutzerdefinierten Indikators separatewindow. mq4. Indikatorlinien werden in einem separaten Fenster gezeichnet. Eine ähnliche Berechnung einer Indikatorlinie wird im technischen Indikator AverageTrue Range durchgeführt. Feige. 122 zeigt eine Indikatorlinie, die durch das benutzerdefinierte Indikator separatewindow. mq4 in einem separaten Fenster aufgebaut ist, und eine Indikatorlinie, die durch ATR in einem anderen Fenster konstruiert ist. In diesem Fall sind Zeilen vollständig identisch, da der Mittelwert für beide Indikatoren gleich ist - 5. Wenn dieser Parameter in einem der Indikatoren geändert wird, ändert sich auch die entsprechende Zeile. Feige. 122. Zeichnen einer benutzerdefinierten Anzeigezeile in einem separaten Fenster. Identische Linien eines technischen Indikators (ATR) und eines benutzerdefinierten Indikators (separatewindow. mq4). Es ist auch offensichtlich, dass benutzerdefinierte Anzeigerzeile nicht für die gesamte Bildschirmbreite, sondern für 50 letzte Balken, wie in der externen Variablen Historie angegeben, erstellt wird. Wenn ein Händler ein größeres Historienintervall verwenden muss, kann der Wert der externen Variablen einfach über das Fenster für benutzerdefinierte Anzeigeeinstellungen geändert werden. Feige. 123 zeigt ein Sicherheitsfenster, in dem die Indikatorlinie in einem anderen Stil gezeichnet wird - als Histogramm. Für ein solches Ergebnis wurde eine Zeile im Programmcode separatewindow. mq4 geändert - andere Zeilenstile werden angezeigt: Alle anderen Codeteile sind unverändert. Feige. 123. Zeichnen einer benutzerdefinierten Anzeigezeile in einem separaten Fenster (Histogramm). Ähnlichkeit der Zeichnungen eines technischen Indikators (ATR) und eines benutzerdefinierten Indikators (separatewindow. mq4). Shifting Indicator Zeilen vertikal und horizontal In einigen Fällen ist es notwendig, eine Indikatorlinie zu verschieben. Es kann leicht durch MQL4 Mittel getan werden. Wir können ein Beispiel analysieren, in dem die Position der Indikatorzeilen in einem Sicherheitsfenster gemäß den Werten berechnet wird, die von einem Benutzer angegeben werden. Beispiel für eine benutzerdefinierte Anzeigeverschiebung. mq4. Shifting Indikatorlinien horizontal und vertikal. Für das Verschieben von Linien in einem Diagramm gibt es zwei externe Variablen - LeftRight für horizontale Verschiebung aller Linien und UpDown für das Verschieben von zwei gestrichelten Linien vertikal. Der Algorithmus, der für die Berechnung von Werten der entsprechenden Arrayelemente verwendet wird, basiert auf sehr einfachen Regeln: Für das horizontale Verschieben einer Zeile ordnen Sie den berechneten Wert einem Arrayelement zu, dessen Index durch LeftRight größer ist (zum Verschieben nach rechts und weniger zum Verschieben) Nach rechts) als der Index eines Balkens, für den Berechnungen zur vertikalen Verschiebung einer Linie durchgeführt werden, muss UpDownPoint hinzugefügt werden (zum Verschieben nach oben oder nach unten verschoben werden) auf jeden Wert eines Indikatorarrays, das die anfängliche Linienposition charakterisiert Beispielindizes werden in der Zeile berechnet: Hierbei ist i der Index eines Balkens, für den Berechnungen durchgeführt werden, k ist ein Index eines Indikatorarray-Elements. Die von dem Client-Terminal auf der Basis des Indikatorarrays Line0 angezeigte rote Anzeigezeile wird um 5 Balken (gemäß den benutzerdefinierten Einstellungen, siehe 124) von der Anfangslinie nach links verschoben. In diesem Fall ist die Anfangslinie ein Moving Average mit der Mittelungsperiode gleich 5 die Formel der MA-Berechnung ist (HighiLowi) 2. In diesem Beispiel ist die Position der roten Linie die Grundlage für die Berechnung von Indikatorarraywerten für zwei weitere Zeilen, d. h. ihre Position auf dem Diagramm. Gepunktete Linien werden auf diese Weise berechnet: Durch Verwendung des Index k für Elemente aller Indikatorfelder können Berechnungen für Elemente der Arrays Line1, Line2 auf demselben Balken durchgeführt werden, die für die Berechnung der Werte des entsprechenden Basisarrays Line0 verwendet werden. Als Ergebnis werden die punktierten Linien relativ zu der roten Linie um den im Anzeigeeinstellungsfenster angegebenen Wert verschoben, in diesem Fall um 30 Punkte (Bild 124). Feige. 124. Die rote Anzeigelinie wird um 5 bar nach links verschoben. Die punktierten Indikatorlinien sind gegenüber der roten Linie um 30 Punkte verschoben. Einschränkungen von benutzerdefinierten Indikatoren Es gibt einige Einschränkungen in MQL4, die bei der Programmierung von benutzerdefinierten Indikatoren berücksichtigt werden sollten. Es gibt eine Gruppe von Funktionen, die nur in den kundenspezifischen Indikatoren verwendet werden können und nicht in Expert Advisors und Skripte verwendet werden können: IndicatorBuffers (), IndicatorCounted (), IndicatorDigits (), IndicatorShortName (), SetIndexArrow (), SetIndexBuffer (), SetIndexDrawBegin ( ), SetIndexEmptyValue (), SetIndexLabel (), SetIndexShift (), SetIndexStyle (), SetLevelStyle (), SetLevelValue (). Auf der anderen Seite können Handelsfunktionen nicht in Indikatoren verwendet werden: OrderSend (), OrderClose (), OrderCloseBy (), OrderDelete () und OrderModify (). Dies liegt daran, dass Indikatoren im Schnittstellenfluss arbeiten (im Unterschied zu Expertenberatern und Skripten, die in ihrem eigenen Fluss operieren). Aus diesem Grund können Algorithmen, die auf einer Schleife basieren, in benutzerdefinierten Indikatoren nicht verwendet werden. Der Beginn eines benutzerdefinierten Indikators, der eine Endlosschleife (in Bezug auf die tatsächliche Ausführungszeit) enthält, kann dazu führen, dass das Client-Endgerät mit weiterer Notwendigkeit aufgehängt wird, einen Computer neu zu starten. Die allgemeinen Vergleichsmerkmale von Expert Advisors, Scripts und Indikatoren sind in Tabelle 2 enthalten. Dreieckiger gleitender Durchschnitt (TMA). Mladen: Wahrscheinlich sind Sie vergessen, den ersten Parameter Hier uns, wie der Anruf aussehen sollte (ein sehr einfacher Test EA, die korrekte Werte der zentralen zentrengetriebenen TMA Linie zurückzieht) Danke Mann, Ure die besten So, Ich werde smth wie folgt verwenden: tma1 ICustom (Symbol (), PERIODM15, TMA,, HalfLength, Preis, ATRMultiplier, ATRPeriod, Interpolieren, 0, 0, 0, 0, 0, 0, 0, 1) WIE DIESE. Ich benutzte Symbol () statt NULL für Symbol - ist, dass der Grund, warum es ging falsch Ich verwendet Symbol () statt NULL für Symbol - ist, dass der Grund, warum es schief gegangen ist Nr. In der Version der zentrierten TMA verwenden Sie (die eine Sie entfernt) der erste Parameter ist TimeFrame. Wenn Sie das nach dem TMA in einem Parameter von iCustom () nicht angegeben haben, funktionierte es nicht, wie es sollte. Sie können alle Werte für Alarme im iCustom () deaktivieren und dann so verwenden (nach allem, was Sie nicht von der EA erwarten): iCustom (Symbol (), PERIODM15, TMA,, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 0, 1) Also, ich werde smth wie folgt verwenden: tma1 iCustom (Symbol (), PERIODM15, TMA, HalfLength, Preis, ATRMultiplier, ATRPeriod, Interpolate, 0, 0, 0, 0, 0 , 0, 0, 1) (0false for Alerts) WIE DIES. Ich habe Symbol () statt NULL für Symbol - ist, dass der Grund, warum es ging falsch mladen: Es geht um übergeben Parameter. Alles, was Sie tun müssen, ist, darauf zu achten, dass Sie keine der Parameter aus dem Anfang der Parameterliste weglassen und alles wird OK sein. Hallo wieder Ich wette, Sie haben mich vermisst. Lol: Vielen Dank für Erklärung. Es hat einen Grund, leider weiß ich das, aber es fehlt noch etwas. Ich habe einige Änderungen in EA. Jetzt läuft es in Echtzeit auf einem Graphen und der gleiche EA wird getestet. Im Back-Test unterscheiden sich die Werte von dem gemalten Graphen, während die in den EA zurückgegebenen Echtzeitwerte die gleichen sind wie der Indikator auf dem Graphen. Seine verwirrenden Ooops, ich habe es wieder. Nach dem Code, den Sie posten, nur eine wilde Vermutung. Können Sie nicht wiederholt Multi-Zeit-Frame-Indikatoren und EAs die gleiche Weise wie die normalen. Im Mehrzeitrahmen-Modus nimmt Metatrader echte Daten des Zielzeitrahmens und nicht die simulierten Daten auf. Werfen Sie einen Blick auf diesen Thread. Forex-tsdforumdebates-Diskussionen und ich bin sicher, Sie finden eine Menge Antwort, wie zu Back-Test und was zu erwarten, während Back-Test iMAG: Hallo wieder Ich wette, Sie haben mich vermisst. Lol: Vielen Dank für Erklärung. Es hat einen Grund, leider weiß ich das, aber es fehlt noch etwas. Ich habe einige Änderungen in EA. Jetzt läuft es in Echtzeit auf einem Graphen und der gleiche EA wird getestet. Im Back-Test unterscheiden sich die Werte von dem gemalten Graphen, während die in den EA zurückgegebenen Echtzeitwerte die gleichen sind wie der Indikator auf dem Graphen. Seine verwirrenden Ooops, ich habe es wieder. Mladen: Nach dem Code, den Sie posting, nur eine wilde Vermutung. Können Sie nicht wiederholt Multi-Zeit-Frame-Indikatoren und EAs die gleiche Weise wie die normalen. Im Mehrzeitrahmen-Modus nimmt Metatrader echte Daten des Zielzeitrahmens und nicht die simulierten Daten auf. Werfen Sie einen Blick auf diesen Thread. Forex-tsdforumdebates-Diskussionen und ich bin sicher, Sie finden eine Menge von Antworten, wie man Back-Test und was zu erwarten, während Back-Test OK, dank So, lassen Sie mich raten, mtf Indikatoren Verwendung zukünftiger Werte, dont sie Dann lassen Verwenden wir IsTesting () und lassen das Indikator überhaupt keine künftigen Daten verwenden. Natürlich können wir die Anführungsströme der Testmaschine nicht künstlich abschneiden, aber wahrscheinlich könnten wir das Indie daran hindern, sie zu benutzen. Früher in diesem Thread Sie erwähnt, dass TMA ist das gleiche wie LWMA, dann könnten wir LWMA verwenden, wenn IsTesting () true. Es könnte ein Grund sein, einige Funktionalität der EA zum Testen hinzuzufügen. Irgendwelche Vorschläge Du meinst, wir sollten ein wenig verbessern, wie Metatrader arbeitet Viel Glück mit ihm PS: Ich sagte, dass nicht neu lackiert (Ende spitz) zentriert TMA ist gleich LWMA Ich habe nie gesagt, dass TMA (dreieckig gleitenden Durchschnitt) ist die gleiche wie LWMA Linear gewichteter gleitender Durchschnitt). TMA und LWMA sind zwei verschiedene Indikatoren iMAG: OK, danke Also, lassen Sie mich raten, mtf Indikatoren Verwendung zukünftiger Werte, dont they Dann lassen Sie uns verwenden IsTesting () und nicht zulassen, dass der Indikator künftige Daten überhaupt verwenden Natürlich können wir nicht künstlich geschnitten Off den Zitatstrom der Testmaschine, aber vermutlich konnten wir das indie selbst vom Verwenden sie verbieten. Früher in diesem Thread Sie erwähnt, dass TMA ist das gleiche wie LWMA, dann könnten wir LWMA verwenden, wenn IsTesting () true. Es könnte ein Grund sein, einige Funktionalität der EA zum Testen hinzuzufügen. Ich habe nie gesagt, dass TMA (dreieckig gleitenden Durchschnitt) ist die gleiche wie LWMA (linear gewichteten gleitenden Durchschnitt). Ich habe gesagt, dass nicht neu lackiert (Ende zeigte) zentriert TMA ist gleich LWMA. TMA und LWMA sind zwei verschiedene Indikatoren Wie auch immer, Im gonna Aufbau meiner EA mit TMA. Die einzige schlechte Sache ist, dass die Prüfung wird auf einem Demo (oder einige Cent) Konto durchgeführt werden. Nochmals vielen Dank und haben ein gutes GlückMoving Average Crossover Wir nahmen den klassischen gleitenden Durchschnitt Crossover-Algorithmus und mischte es mit den beliebtesten Trading-Funktionen. Im Wesentlichen ist es eine universelle Moving Average Crossover-Strategie. Während die Kernidee bleibt die gleiche, können Sie zusätzliche Features auf und bauen Sie Ihre benutzerdefinierte Moving Average Trading System. Verwenden Sie zum Beispiel separate schnelle und langsame Mittelwerte, fügen Sie AutoTrail-Funktionalität hinzu, definieren Sie Tagesziele oder invertieren Sie die Signale. Die Strategie hat eingebaute MA-Indikatoren, so dass Sie nicht haben, um sie einzeln hinzuzufügen, um das Diagramm. Natürlich können Sie sie jederzeit verstecken. Moving Average Crossover ist eine perfekte Multifunktionsstrategie: Back-Test Ihrer Trading-Ideen, Optimierung der Strategie-Parameter oder Handel Live-Konto - die Strategie passt alle diese Rollen. Arbeiten auf jedem Markt und jeder Bar-Typ. Funktionsübersicht Verschiedene MA Typen. DEMA, SMA, EMA, HMA, TEMA, TMA, VWMA, WMA, ZLEMA. Trennen Sie schnell und langsam MA. Das schnelle MA kann EMA (7) sein und das langsame MA kann SMA (28) sein. Gewinnziel und Stop-Loss. Set Brackets für einzelne Trades. Täglicher Gewinnziel - und Stopverlust. Sobald eine dieser Grenzen erreicht ist, stoppt die Strategie den Handel bis zur nächsten Handelssitzung. Automatischer Endanschlag. Eine Option, um einen Auto-Trailing Stop mit benutzerdefinierten Gewinn Trigger, Stop-Loss und Frequenz haben. Arbeitszeit . Legen Sie den Zeitraum, wenn die Strategie aktiv sein sollte, wird es nicht außerhalb dieses Zeitraums Handel. Signale invertieren. Geben Sie lang ein, wenn das Signal kurz ist und umgekehrt. Warum nicht, um Limit - oder Markteintragsaufträge zu erproben. Steuern Sie die Schlupf und verwenden Sie Limit-Aufträge für Einträge oder geben Sie immer eine Position mit Market-Order Und mehr: BidAsk-Filter, benutzerdefinierte Farben, Showhide MA-Indikatoren aus Diagramm etc. Komplette Parameterliste StartTime und EndTime. Zeit, wann die Strategie die Aufträge einreichen wird. Sobald es zu EndTime kommt, hebt es die Arbeitsaufträge auf und schließt alle Positionen. Beispiel: 9:30 und 15:20 oder 18:45 und 10:30 Uhr (für Übernachtungen). FastMAType und SlowMAType. MA-Typen für schnelle und langsame gleitende Mittelwerte. Beispiel: EMA und SMA. FastMAPeriod und SlowMAPeriod. MA-Perioden für schnelle und langsame gleitende Mittelwerte. Beispiel: 7 und 28. MaximumDailyProfit und MaximumDailyLoss. Tageslimits, wenn die Strategie eines von ihnen erreicht, wird es nicht bis zum nächsten Handelssitzung Handel. Auf Null setzen, um die Funktion zu deaktivieren. MaxBidAskSpread. Manchmal ist es nicht wünschenswert, eine Position einzugeben, wenn die Ausbreitung zu groß ist. Dieser Parameter hilft Ihnen, die Trades zu vermeiden, wenn Bid Ask Spread größer ist als diese Zahl in Ticks. Auf 0 setzen, um die Funktion zu deaktivieren. EntryOrderType. Setzen Sie Auftragsart auf Limit oder Market. Lassen Sie uns wissen, wenn Sie andere Arten benötigen :) LimitPriceOffset. Fügen Sie die angegebene Anzahl von Zecken zum Einstiegspreis hinzu. Hat keine Auswirkung auf Marktaufträge. LimitOrderExpirationPeriod. Ein Limit-Order kann für eine lange Zeit ohne Füllung arbeiten, so muss es eine Möglichkeit, zu alten Bestellungen zu stornieren. Setzen Sie diesen Parameter auf 5, um einen Eintrag abzubrechen, wenn er nach 5 bar nicht gefüllt ist. Hat keine Auswirkung auf Marktaufträge. Deutsch:. Handel nur lang, nur kurz, oder beides. ProfitTarget und StopLoss. OCO Halterungen für den Einstieg. Setzen Sie es beispielsweise auf 10 und 20, um 10-Ticks Gewinnziel und 20-Tick-Stop-Verlust an jedem Eintrag zu haben. Auf 0 setzen, um die Funktion zu deaktivieren. AutoTrailProfitTrigger. AutoTrailStopLoss. Und AutoTrailFrequency. Diese definieren einen Endanschlag. Es funktioniert genauso wie ein normaler NinjaTrader AutoTrail Stop. Ein nachlaufender Stop (AutoTrailStopLoss-Ticker unterhalb des BidAsk) wird gesendet, sobald der Positionsgewinn den AutoTrailProfitTrigger erreicht. Dann wird jedes Mal, wenn der Gewinn durch die nächsten AutoTrailFrequenz-Ticks erhöht wird, der nachfolgende Stopverlust aktualisiert. So deaktivieren Sie den Feature-Satz AutoTrailStopLoss auf 0. ShowMAOnChart. Auf False setzen, um die schnellen und langsamen gleitenden Durchschnittsindikatoren vom Diagramm auszublenden. MinCrossThreshold. Eintragungen werden eingereicht, wenn der schnelle MA oberhalb der langsamen MA durch mindestens X-Zecken kreuzt. Keine Umkehrungen. Wenn True, wird die Strategie nicht zurückgesetzt Positionen. Stattdessen wird es warten, bis sie durch Gewinnziel, Stop-Loss, Trailing Stop oder Exit On Close verlassen werden. InvertSignals. Wenn True, werden Übergangssignale invertiert, d. h. ein langes Signal würde einen kurzen Eintrag verursachen, während ein kurzes Signal einen langen Eintrag verursachen würde. Wie man verwendet Die Strategie ist bereit, out-of-the-box auf jedem Markt oder Zeitrahmen zu arbeiten. Sie können bei Bedarf zusätzliche Optionen aktivieren. Dont über die Anzahl der Parameter überwältigt werden: Sie können die meisten von ihnen auf Null gesetzt, um die Funktionen hinter ihnen zu deaktivieren. Im Folgenden finden Sie ein Beispiel für die Verwendung unserer Moving Average Crossover Strategie. Beispiel: Classic Moving Average Crossover Ein klassischer Weg sagt uns zu kaufen, wenn die schnelle MA kreuzt über dem langsamen MA und verkaufen, wenn die schnelle MA kreuzt die langsame MA unten. Wenn wir in Position sind, wird die Position umgekehrt. Tweak die folgenden Parameter, wenn youd wie und lassen Sie die anderen Standard: Stellen Sie die gewünschte FastMAPeriod und SlowMAPeriod Stellen Sie die gewünschte MaximumDailyProfit und MaximumDailyLoss. B. beide gleich 250. Stellen Sie den gewünschten MinCrossThreshold ein. Wenn Sie es beispielsweise auf 5 setzen, werden die Einträge nur dann ausgelöst, wenn das schnelle MA über dem langsamen MA mit mindestens 5 Ticks überkreuzt. Sie können nun die Strategie testen, optimieren, auf Demo oder echtes Konto ausführen. Selbstverständlich können Sie beliebig viele Parameter einstellen, um die optimale Leistung zu erzielen. Voraussetzungen Diese Strategie erfordert NinjaTrader Version 7 Installation Speichern Sie die Zip-Datei (nicht zu entpacken) an den Speicherort Ihrer Wahl Zum Menü Control Center - Datei - Dienstprogramme - Importieren Sie NinjaScript. Wählen Sie die gespeicherte Zip-Datei im geöffneten Dialog Wenn alles in Ordnung ist, sehen Sie eine Bestätigung (sonst wird ein Fehler angezeigt) Neustart NinjaTrader und Sie sind gut zu gehen


No comments:

Post a Comment