Friday 24 February 2017

Custom Moving Durchschnitt Mq4

MetaTrader 4 - Experts Moving Average - Experte für MetaTrader 4 Der Moving Average Experte für die Bildung von Handelssignalen verwendet einen gleitenden Durchschnitt. Das Öffnen und Schließen von Positionen erfolgt, wenn der gleitende Durchschnitt den Preis der zuletzt gebildeten Bar erfüllt (Barindex entspricht 1). Die Losgröße wird nach einem speziellen Algorithmus optimiert. Der Gutachter analysiert die Übereinstimmung zwischen dem gleitenden Durchschnitt und dem Marktpreisdiagramm. Die Überprüfung wird von der Funktion CheckForOpen () durchgeführt. Wenn der gleitende Durchschnitt auf die Bar trifft, so dass ersterer höher ist als der offene Preis, aber niedriger als der Schlusskurs, wird die BUY-Position geöffnet. Wenn der gleitende Durchschnitt auf die Bar trifft, so dass ersterer niedriger ist als der offene Preis, aber höher als der Schlusskurs, wird die SELL-Position geöffnet. Das im Experten verwendete Money Management ist sehr einfach, aber effektiv: Die Kontrolle über jedes Positionsvolumen wird in Abhängigkeit von den bisherigen Transaktionsergebnissen durchgeführt. Dieser Algorithmus wird durch die Funktion LotsOptimized () implementiert. Die Basis-Losgröße wird auf Basis des maximal zulässigen Risikos berechnet: Der Parameter MaximumRisk zeigt für jede Transaktion den Grundrisikoprozentsatz an. Sie besitzt üblicherweise einen Wert zwischen 0,01 (1) und 1 (100). Wenn beispielsweise die freie Marge (AccountFreeMargin) 20.500 beträgt und die Regeln des Kapitalmanagements das Risiko von 2 verwenden, wird die Grundlosgröße 20500 0,02 1000 0,41 betragen. Es ist sehr wichtig, die Losgrößengenauigkeit zu kontrollieren und das Ergebnis mit den zulässigen Werten zu normalisieren. Normalerweise sind Fraktionen mit einer Stufe von 0,1 erlaubt. Eine Transaktion mit einem Volumen von 0,41 wird nicht durchgeführt. Zur Normalisierung wird die NormalizeDouble () - Funktion mit Genauigkeit bis zu einem Zeichen nach dem Punkt verwendet. Dies führt zu der Grundmenge von 0,4. Die Basispreisberechnung auf Basis der freien Marge erlaubt es, die Betriebsvolumina je nach Handelserfolg zu erhöhen, d. h. den Handel mit Reinvestitionen zu handeln. Dies ist der grundlegende Mechanismus mit obligatorischem Kapitalmanagement zur Steigerung der Effizienz des Handels. DecreaseFactor ist das Ausmaß, in dem die Losgröße nach dem unrentablen Handel reduziert wird. Normale Werte sind 2,3,4,5. Wenn die vorhergehenden Transaktionen unrentabel waren, verringern sich die nachfolgenden Volumina um einen Faktor von DecreaseFactor, um durch die unrentable Periode zu warten. Dies ist der Hauptfaktor im Kapitalmanagementalgorithmus. Die Idee ist sehr einfach: Wenn der Handel erfolgreich wächst, arbeitet der Experte mit dem Grundposten, der maximalen Profit macht. Nach der ersten unrentablen Transaktion wird der Experte die Geschwindigkeit reduzieren, bis eine neue positive Transaktion erfolgt. Der Algorithmus erlaubt es, die Geschwindigkeitsreduzierung zu deaktivieren, dafür muss man DecreaseFactor 0 angeben. Die Höhe der letzten aufeinanderfolgenden unrentablen Transaktionen wird in der Handelsgeschichte berechnet. Das Basislos wird auf dieser Basis neu berechnet: Der Algorithmus erlaubt es also, das durch eine Reihe von unrentablen Transaktionen auftretende Risiko effektiv zu reduzieren. Die Losgröße wird am Ende der Funktion obligatorisch auf die minimal zulässige Losgröße überprüft Können die zuvor durchgeführten Berechnungen zu Los 0 führen: Der Experte ist hauptsächlich für den täglichen Arbeitsablauf und im Testmodus bestimmt - für die Durchführung zu engen Preisen. Es wird nur beim Öffnen einer neuen Bar handeln, deshalb werden die Modi der Tick-Modellierung nicht benötigt. Testergebnisse sind in dem Bericht dargestellt. Erstellung von Custom Indicators Bei der Erstellung einer Trading-Strategie steht ein Entwickler oft vor der Notwendigkeit, in einem Sicherheitsfenster grafisch 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 Die 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: 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 Strichs (der letzte, ausgehend von dem die Berechnungen durchgeführt werden sollen) gleich 299 ist. Alle Werte der Indikatorarrayelemente sind Berechnet in der Schleife while (): Während i innerhalb des Bereichs vom ersten uncounted bar (299) bis zum aktuellen (0) liegt, 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. Beim Starten des benutzerdefinierten Indikators userindicator. mq4 in einem Diagrammfenster 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 verwendete Algorithmus für die Elemente Werte der entsprechenden Array Berechnung basiert auf sehr einfachen Regeln: für eine Zeile horizontal verschoben wird, um den berechneten Wert zu einem Array-Element zugeordnet werden, der Index größer ist von Leftright (für nach rechts und weniger Verlagerung zum Verschieben nach rechts) als der Index von einer Bar, für die Berechnungen eine Linie senkrecht zur Verschiebung durchgeführt werden, UpDownPoint muss hinzugefügt werden (für oben oder schmälerte für die Verschiebung nach unten) zu jedem Wert eines Indikators Array charakterisierenden Ausgangslinienposition In dem untersuchten Verschiebung 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: Die Verwendung von Index k für die Elemente aller Anzeige-Arrays ermöglicht auf dem gleichen bar für Elemente der Arrays Line1, Line2 Berechnungen durchzuführen, wie für die Berechnung der Werte der entsprechenden Basis Array LINE0 verwendet. 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 vergleichenden Eigenschaften von Expert Advisors, Skripte und Indikatoren sind in Tabelle 2.Moving Durchschnittliche Der Moving Average Technical Indicator zeigt den mittleren Instrumentenpreis Wert für einen bestimmten Zeitraum enthalten. Wenn man den gleitenden Durchschnitt berechnet, berechnet man den Instrumentenpreis für diesen Zeitraum. Wenn sich der Preis ändert, steigt oder fällt sein gleitender Durchschnitt. Es gibt vier verschiedene Arten von gleitenden Durchschnitten: Einfach (auch als Arithmetik bezeichnet), Exponential. Geglättet und gewichtet. Der gleitende Durchschnitt kann für jeden sequentiellen Datensatz berechnet werden, einschließlich der Eröffnungs - und Schlusskurse, der höchsten und niedrigsten Preise, des Handelsvolumens oder anderer Indikatoren. Es ist oft der Fall, wenn doppelte gleitende Mittelwerte verwendet werden. Das Einzige, wo sich verschie - dende Durchschnittswerte verschiedener Typen erheblich voneinander unterscheiden, ist, wenn Gewichtskoeffizienten, die den letzten Daten zugeordnet sind, unterschiedlich sind. Falls wir von Simple Moving Average sprechen. Alle Preise des fraglichen Zeitraums gleich sind. Exponential Moving Average und Linear Weighted Moving Average legen mehr Wert auf die neuesten Preise. Der gängigste Weg zur Interpretation des gleitenden Durchschnitts ist es, seine Dynamik mit der Preisaktion zu vergleichen. Wenn der Instrumentenpreis über seinem gleitenden Durchschnitt ansteigt, erscheint ein Kaufsignal, wenn der Kurs unter den gleitenden Durchschnitt fällt, was wir haben, ist ein Verkaufssignal. Dieses handelnde System, das auf dem gleitenden Durchschnitt basiert, ist nicht entworfen, um Eintritt in den Markt direkt in seinem niedrigsten Punkt und seinem Ausgang direkt auf dem Höhepunkt zur Verfügung zu stellen. Es erlaubt, nach dem folgenden Trend zu handeln: bald zu kaufen, nachdem die Preise den Boden zu erreichen, und zu verkaufen, bald nachdem die Preise ihren Höhepunkt erreicht haben. Bewegungsdurchschnitte können auch auf Indikatoren angewendet werden. Das ist, wo die Interpretation der Indikatorbewegungsdurchschnitte ähnlich der Interpretation der Preisbewegungsdurchschnitte ist: wenn der Indikator über seinem gleitenden Durchschnitt steigt, bedeutet das, dass die aufsteigende Indikatorbewegung wahrscheinlich fortfährt: wenn der Indikator unter seinen gleitenden Durchschnitt fällt, dieses Bedeutet, dass es wahrscheinlich weiter nach unten gehen wird. Hier sind die Arten von gleitenden Durchschnittswerten im Diagramm: Einfacher Moving Average (SMA) Exponentieller Moving Average (EMA) Glatter Moving Average (SMMA) Linearer Gewichteter Moving Average (LWMA) Sie können die Handelssignale dieses Indikators testen, indem Sie einen Expertenratgeber erstellen Im MQL5-Assistenten. Berechnung Einfacher gleitender Mittelwert (SMA) Ein einfacher, dh arithmetisch gleitender Durchschnitt wird berechnet, indem die Preise des Instrumentenschlusses über eine bestimmte Anzahl von Einzelperioden (z. B. 12 Stunden) zusammengefasst werden. Dieser Wert wird dann durch die Anzahl dieser Perioden dividiert. SMA SUM (CLOSE (i), N) N SUM Summe CLOSE (i) aktuelle Periode enge Preis N Anzahl der Berechnungsperioden. Exponential Moving Average (EMA) Der exponentiell geglättete gleitende Durchschnitt wird durch Addition eines bestimmten Anteils des aktuellen Schlusskurses zum vorherigen Wert des gleitenden Durchschnitts berechnet. Bei exponentiell geglätteten gleitenden Durchschnitten sind die letzten engen Preise von mehr Wert. P-Prozentsatz exponentieller gleitender Durchschnitt wird folgendermaßen aussehen: EMA (CLOSE (i) P) (EMA (i - 1) (1 - P)) CLOSE (i) Einer vorherigen Periode P den Prozentsatz der Verwendung des Preiswertes. Gleitender gleitender Mittelwert (SMMA) Der erste Wert dieses geglätteten gleitenden Mittelwertes wird als einfacher gleitender Mittelwert (SMA) berechnet: SUM1 SUM (CLOSE (i), N) Der zweite gleitende Durchschnitt wird gemäß dieser Formel berechnet: SMMA (i) (I - 1) N SMMA (i) (PREVSUM - SMMA (i - 1) SCHLIESSEN (i)) N Nachfolgende gleitende Mittelwerte werden nach folgender Formel berechnet: N SUM Summe SUM1 Summe der Schlusskurse für N Perioden wird von der vorherigen Bar gezählt PREVSUM geglättete Summe der vorherigen Bar SMMA (i-1) geglättetes gleitendes Mittel der vorherigen Bar SMMA (i) geglättetes gleitendes Mittel der aktuellen Bar (Außer für die erste) SCHLIESSEN (i) gegenwärtig nahe Preis N Glättungsperiode. Nach arithmetischen Konvertierungen kann die Formel vereinfacht werden: SMMA (i) (SMMA (i - 1) (N - 1) CLOSE (i)) N Linearer gewichteter gleitender Durchschnitt (LWMA) Von mehr Wert als mehr frühe Daten. Der gewichtete gleitende Durchschnitt wird berechnet, indem jeder der Schlusskurse innerhalb der betrachteten Reihe mit einem gewissen Gewichtskoeffizienten multipliziert wird: LWMA SUM (CLOSE (i) i, N) SUM (i, N) SUM Summe CLOSE (i) aktueller Schlusskurs SUM (i, N) Gesamtsumme der Gewichtskoeffizienten N Glättungsperiode.


No comments:

Post a Comment