Friday 11 August 2017

Mql4 Icustom Gleitender Durchschnitt


Ich würde mir vorstellen, dass es etwas mit dem Neuschreiben eines benutzerdefinierten MA-Indikators zu tun hat, der die durchschnittlichen Werte des Indikators betrachtet, den Sie wollen. Sollte wirklich nur ein Fall sein, um die Preiswerte in der aktuellen MA-Anzeige mit iStochastic-Werten zu ersetzen, dann kannst du einfach iCustom () verwenden, um das benutzerdefinierte Kennzeichen aufzurufen. Ich denke. Heres der einfache gleitende durchschnittliche Code aus dem MA-Indikator, der mit MT4 kommt, sollte nur ein Fall des Ersetzens der Closepos mit iStochastic (. Pos) Werten sein Ich denke, void sma () double sum0 int i, posBars-ExtCountBars-1 --- - anfängliche Akkumulation if (posltMAPeriod) posMAPeriod für (i1iltMAPeriodi, pos--) sumClosepos ---- Hauptrechnungsschleife while (posgt0) sumClosepos ExtMapBufferpossumMAPeriod sum-CloseposMAPeriod-1 pos-- ---- Null Anfangsstäbe if (ExtCountedBarslt1) für (I1iltMAPeriodi) ExtMapBufferBars-i0 Ich würde mir vorstellen, dass es etwas mit dem Neuschreiben eines benutzerdefinierten MA-Indikators zu tun hat, der die durchschnittlichen Werte des Indikators betrachtet, die Sie wollen. Sollte wirklich nur ein Fall sein, um die Preiswerte in der aktuellen MA-Anzeige mit iStochastic-Werten zu ersetzen, dann kannst du einfach iCustom () verwenden, um das benutzerdefinierte Kennzeichen aufzurufen. Ich denke. Heres der einfache gleitende durchschnittliche Code aus dem MA-Indikator, der mit MT4 kommt, sollte nur ein Fall des Ersetzens der Closepos mit iStochastic (. Pos) Werten sein Ich denke, void sma () double sum0 int i, posBars-ExtCountBars-1 --- - anfängliche Akkumulation if (posltMAPeriod) posMAPeriod für (i1iltMAPeriodi, pos--) sumClosepos ---- Hauptrechnungsschleife while (posgt0) sumClosepos ExtMapBufferpossumMAPeriod sum-CloseposMAPeriod-1 pos-- ---- Null Anfangsstäbe if (ExtCountedBarslt1) für (I1iltMAPeriodi) ExtMapBufferBars-i0 Vielen Dank für Ihre Hilfe, mrwobbles, aber es hat mir noch nicht geholfen. Stellen Sie sich einfach vor, ich möchte den gleitenden Durchschnitt von x Perioden auf Volumes berechnen, haben Sie den Code für diese Ive getan eine einfache MA des Volumens, wenn man sich die Moving Averages Indikator, der mit MT4 kommt, können Sie sehen, was Ive getan hat . Es ist ziemlich einfach. Das Problem mit dem Stochastischen MA ist, dass die Stochastik positive und negative Werte zurückgibt, so dass die Summen arent genau sind. Erstellung von kundenspezifischen Indikatoren Bei der Erstellung einer Handelsstrategie steht ein Entwickler oft der Notwendigkeit, grafisch in ein Sicherheitsfenster eine bestimmte Abhängigkeit zu ziehen, die von einem Benutzer berechnet wird ( Programmierer). Zu diesem Zweck bietet MQL4 die Möglichkeit, benutzerdefinierte Indikatoren zu erstellen. Custom Indicator ist ein in MQL4 kodiertes Applikationsprogramm, das grundsätzlich für die grafische Darstellung von vorläufig berechneten Abhängigkeiten gedacht ist. Benutzerdefinierte Indikatorstruktur Notwendigkeit von Puffern Das Hauptprinzip, das den benutzerdefinierten Indikatoren zugrunde liegt, ist die Übergabe von Werten von Indikator-Arrays an ein Client-Terminal (für Zeichnungsindikatorzeilen) über Austauschpuffer. Puffer ist ein Speicherbereich, der numerische Werte eines Indikator-Arrays enthält. MQL4-Standard impliziert die Möglichkeit, bis zu acht Indikatorlinien mit einem benutzerdefinierten Indikator zu zeichnen. Ein Indikator-Array 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. Abb. 115 zeigt, wie die Informationen aus einem benutzerdefinierten Indikator über Puffer an ein Client-Terminal übergeben werden, um Indikatorzeilen zu zeichnen. Feige. 115. Übergeben von Werten von Indikator-Arrays über einen Puffer an ein Client-Terminal. Die allgemeine Reihenfolge der Gebäudeindikatorzeilen ist die folgende: 1. Berechnungen werden in einem benutzerdefinierten Indikator durchgeführt, so dass numerische Werte den Indikator-Array-Elementen zugeordnet sind. 2. Werte von Indikator-Array-Elementen werden über Puffer an ein Client-Terminal gesendet. 3. Auf den Basen von Wert-Arrays, die von Puffern empfangen werden, zeigt ein Client-Terminal Indikatorlinien an. Komponenten eines Custom Indicators Lets analysieren einen einfachen benutzerdefinierten Indikator, der zwei Zeilen zeigt - eine Zeile basiert auf maximalen Barpreisen, die zweite verwendet minimale Preise. Beispiel für eine einfache benutzerdefinierte Anzeige userindicator. mq4 Lets analysieren in Details die Indikator Teile. In jedem in MQL4 geschriebenen Anwendungsprogramm können Sie Setup-Parameter angeben, die die korrekte Programmwartung durch ein Client-Terminal bereitstellen. In diesem Beispiel enthält der Kopfprogrammteil (siehe Programmstruktur) mehrere Zeilen mit Anweisungseigenschaft. Die erste Anweisung zeigt an, in welchem ​​Fenster das Client-Terminal die Indikatorlinien zeichnen soll: In MQL4 gibt es zwei Varianten von Zeichnungsindikatorzeilen: im Hauptfenster und in einem separaten Fenster. Hauptfenster ist das Fenster mit einem Sicherheitstabelle. In diesem Beispiel zeigt das Parameter displaychartwindow 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. Ein Puffer wird jedem Puffer zugewiesen, so dass die Gesamtzahl der Puffer zwei ist. Die nächsten Zeilen beschreiben Farben der Indikatorlinien. Parameter indicatorcolor1 und indicatorcolor2 definieren die Farbeinstellung für entsprechende Puffer - in diesem Fall für Puffer mit Indizes 0 (blau) und 1 (rot). Beachten Sie, dass die Zahlen in den Parameternamen indicatorcolor1 und indicatorcolor2 keine Pufferindizes sind. Diese Zahlen sind Teile von konstanten Namen, die in Übereinstimmung mit Puffern eingestellt sind. Für jede konstante Farbe kann nach dem Ermessen eines Benutzers eingestellt werden. In der nächsten Zeile werden Indikator-Arrays deklariert: Der Indikator ist für das Zeichnen von zwei Indikatorlinien gedacht, also müssen wir zwei globale eindimensionale Arrays deklarieren, eine für jede Zeile. Die Namen der Indikator-Arrays sind bis zum Benutzer. In diesem Fall werden die Array-Namen Buf0 und Buf1 verwendet, in anderen Fällen können auch andere Namen verwendet werden, zB Line1, Alfa, Integral etc. Es ist notwendig, Arrays auf globaler Ebene zu deklarieren, da Array-Elemente-Werte zwischen den Aufrufen beibehalten werden müssen Der Sonderfunktion start (). Der beschriebene Custom Indikator basiert auf zwei Sonderfunktionen - init () und start (). Die Funktion init () enthält den im Programm verwendeten Codeteil nur einmal (siehe Sonderfunktionen). Eine sehr wichtige Aktion wird in der Zeile durchgeführt: Mit der Funktion SetIndexBuffer () wird ein notwendiger Puffer (in diesem Fall mit dem Index 0) in Übereinstimmung mit einem Array (in diesem Fall Buf0) gesetzt. Es bedeutet für den Aufbau der ersten Indikatorzeile ein Client-Terminal akzeptieren Daten in der Array Buf0 mit dem Null-Puffer für sie enthalten. Weiterhin ist der Linienstil definiert: Für den Nullpuffer (0) sollte ein Clientterminal die folgenden Zeichnungsstile verwenden: einfache Linie (DRAWLINE), durchgezogene Linie (STYLESOLID), Linienbreite 2. Die nächsten beiden Zeilen enthalten Einstellungen für die zweite Zeile : So werden nach dem Code der Sonderfunktion init () beide Indikatorzeilen im Hauptsicherheitsfenster gezeichnet. Die erste wird eine feste blaue Linie mit der Breite 2 sein, die zweite ist eine rote gepunktete Linie (STYLEDOT) von einer üblichen Breite. Indikatorlinien können auch von anderen Stilen gezeichnet werden (siehe Styles of Indicator Lines). Berechnen von Werten von Indikator-Arrays-Elementen (Seien Sie aufmerksam) Werte der Indikator-Arrays-Elemente werden im Sonderfunktions-Start () berechnet. Um den Inhalt des start () - Kodes richtig zu verstehen, achten Sie auf die Reihenfolge der Indexierungsleisten. Der Abschnitt Arrays beschreibt im Detail die Methode der Indizierung von Arrays-Zeiten. Nach dieser Methode beginnt die Bar-Indexierung von Null. Der Null-Bar ist ein aktueller, aber ungeformter Balken. Der nächste Balkenindex ist 1. Die nächsten sind 2 und so weiter. Wenn neue Balken in einem Sicherheitsfenster erscheinen, werden Indizes von bereits gebildeten (History) Balken geändert. Die neue (gerade, gerade geformte, rechts) Bar bekommt den Null-Index, der eine links von ihm (der gerade voll gebildet hat) bekommt den Index 1 und die Werte der Indizes aller History-Bars werden ebenfalls um eins erhöht. Die beschriebene Methode der Indexierung von Stäben ist die einzige, die für das gesamte Online-Handelssystem MetaTrader möglich ist, und es wird bei der Zeichnung von Linien mit sowohl technischen als auch benutzerdefinierten Indikatoren berücksichtigt. Es wurde früher gesagt, dass Indikatorlinien auf der Basis von numerischen Informationen konstruiert sind, die in Indikatorarrays enthalten sind. Ein Indikator-Array enthält Informationen über Punktkoordinaten, auf denen eine Indikatorzeile gezeichnet wird. Und die Y-Koordinate jedes Punktes ist der Wert eines Indikator-Array-Elements. Und X-Koordinate ist der Wert eines Indikator-Array-Elementindex. Im analysierten Beispiel wird die erste Indikatorzeile mit den maximalen Werten der Balken gezeichnet. Abb. 116 zeigt diese Indikatorzeile (blaue Farbe) in einem Sicherheitsfenster, sie wird auf Basis des Indikatorfeldes Buf0 aufgebaut. Feige. 116. Korrespondenz von Koordinaten einer Indikatorlinie zu Werten eines Indikatorarrays. Der Indexwert eines Indikator-Arrays wird von einem Client-Terminal in Übereinstimmung mit einem Balkenindex ausgegeben - diese Indexwerte sind gleich. Es muss auch berücksichtigt werden, dass der Prozess der Erstellung von Indikatorlinien im Echtzeit-Modus unter Bedingungen erfolgt, wenn in einem Sicherheitsfenster neue Balken von Zeit zu Zeit erscheinen. Und alle Geschichtsbars sind nach links verschoben. Um die Indikatorzeile korrekt zu zeichnen (jeder Zeilenpunkt oberhalb seiner Leiste), muss er auch mit Balken verschoben werden. Es besteht also Bedarf (technischer Bedarf), ein Indikator-Array neu zu indizieren. Die Grunddifferenz eines Indikator-Arrays aus einem üblichen Array ist folgendes: In dem Moment, in dem ein neuer Balken erzeugt wird, werden Indexwerte von Indikator-Array-Elementen automatisch durch das Client-Terminal geändert, nämlich - der Wert jedes Indikator-Array-Index wird um erhöht Eine und die Indikator-Array-Größe wird um ein Element (mit einem Null-Index) erhöht. Beispielsweise ist der Nullpunkt in Fig. 116 (Zeitrahmen H1) hat die Öffnungszeit 6:00. Um 7:00 Uhr erscheint eine neue Leiste im Sicherheitsfenster. Die Bar, die um 6:00 Uhr geöffnet wird, erhält automatisch den Index 1. Um die Indikatorzeile korrekt auf dieser Leiste zu zeichnen, ändert das Client-Terminal den Index des Indikator-Array-Elements entsprechend der Bar, die um 6:00 Uhr geöffnet ist. In der Tabelle in Fig. 116 dieses Element ist in der ersten Zeile geschrieben. Zusammen mit diesen Indizes aller Array-Elemente wird 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 ist er gleich 0). Das Indikator-Array wird um ein Element größer. Der Index eines neuen hinzugefügten Elements ist gleich 0, der Wert dieses Elements wird ein neuer Wert sein, der die Koordinate der Indikatorzeile auf einem Nullpunkt reflektiert. Dieser Wert wird in der Sonderfunktion start () bei jedem Tick berechnet. Berechnungen im Sonderfunktionsstart () sollten durchgeführt werden, so dass keine zusätzlichen Aktionen durchgeführt wurden. Bevor der Indikator an ein Diagramm gebunden ist, werden keine Indikatorzeilen angezeigt (da Werte von Indikatorfeldern noch nicht definiert sind). Thats, warum beim ersten Start der Sonderfunktion start () Indikator-Array-Werte für alle Balken berechnet werden müssen, auf denen die Indikatorzeile gezeichnet werden soll. Im analysierten Beispiel handelt es sich um alle Stäbe, die in einem Diagramm vorhanden sind (die anfänglichen Berechnungen können nicht für alle verfügbaren Stäbe durchgeführt werden, aber für einige letzte Teil der Geschichte wird es in weiteren Beispielen beschrieben). Ar alle weiteren Starts der Sonderfunktion start () Es besteht keine Notwendigkeit, Werte der Indikator-Array für alle Balken wieder zu berechnen. Diese Werte sind bereits berechnet und im Indikator-Array enthalten. Es ist notwendig, den aktuellen Wert der Indikatorzeile 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 - IndicatorCounted (). Function IndicatorCounted () Diese Funktion gibt die Anzahl der Balken zurück, die sich seit dem letzten Indikatoraufruf nicht geändert haben. Wenn der Indikator noch nie an einem Diagramm angehängt wurde, ist bei der ersten Start - () Ausführung der Wert der Countedbars gleich Null: Es bedeutet, dass das Indikator-Array kein Element mit früherem vordefinierten Wert enthält, weshalb das gesamte Indikator-Array Muss von Anfang bis Ende berechnet werden. Das Indikator-Array wird von der ältesten Leiste bis zur Null berechnet. Der Index der ältesten Leiste, ab dem die Berechnungen gestartet werden müssen, wird folgendermaßen berechnet: Angenommen, im Moment der Anbringung des Indikators befinden sich 300 Takte in einem Kartenfenster. Dies ist der Wert der vordefinierten Variablen Bars. Wie bereits erwähnt, sind die Zählbänke gleich 0. So ergibt sich daraus, dass der Index des ersten unzähligen Bits (der letzte, ab dem die Berechnungen durchgeführt werden sollen) gleich 299 ist. Alle Werte der Indikator-Array-Elemente sind Berechnet in der Schleife während (): Während i innerhalb des Bereichs von der ersten unzähligen Leiste (299) zum aktuellen (0) eingeschlossen ist, werden die Werte der Indikator-Array-Elemente für beide Indikatorzeilen berechnet. Beachten Sie, dass fehlende Werte von Indikator-Array-Elementen während eines (ersten) Anfangs des speziellen Funktionsstarts () 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. die Werte der Indikatorarrays werden für den Nullpunkt berechnet. Wenn die Schleife vorbei ist, beendet die Sonderfunktion start () ihre Ausführung und die Steuerung wird an das Client-Terminal weitergegeben. Das Client-Terminal wird seinerseits alle (in diesem Fall zwei) Indikatorzeilen entsprechend den berechneten Werten von Array-Elementen zeichnen. Beim nächsten Tickstart () wird das Client-Terminal wieder gestartet. Weitere Aktionen werden von der Situation abhängen (wir werden das Beispiel für 300 Takte weiter analysieren). Variante 1. Eine neue Tick kommt bei der Bildung der aktuellen Null-Bar (die häufigste Situation). Feige. 117 zeigt zwei Zecken, die vom Terminal in den Momenten der Zeit t 1 und t 2 empfangen werden. Die analysierte Situation ist für beide Zecken gleich. Er läßt die Ausführung von start (), die zum Zeitpunkt t 2 gestartet wurde, verfolgen. Während der Ausführung der Funktion start () wird die folgende Zeile ausgeführt: IndicatorCounted () gibt den Wert 299 zurück, dh seit dem letzten start () call 299 vorherige Takte wurden nicht geändert. Infolgedessen ist der Indexwert gleich 0 (300-299-1): Es bedeutet in der nächsten while () Schleife die Werte von Array-Elementen mit dem Null-Index werden berechnet. Mit anderen Worten, die neue Position einer Indikatorlinie auf dem Nullpunkt wird berechnet. Wenn der Zyklus beendet ist, wird start () die Ausführung beenden und die Steuerung an das Client-Terminal übergeben. Variante 2. Ein neues Häkchen ist das erste Häkchen eines Nullpunktes (passiert von Zeit zu Zeit). In diesem Fall ist die Tatsache des Auftretens einer neuen Bar wichtig. Bevor die Steuerung an den Sonderfunktionsstart () übergeben wird, zeichnet das Client-Terminal alle im Sicherheitsfenster vorhandenen Balken wieder auf und rezitiert alle deklarierten Indikatorarrays (in Übereinstimmung mit Puffern). Außerdem wird das Client-Terminal daran erinnern, dass es bereits 301 Bars, nicht 300 in einem Diagrammfenster gibt. Feige. 118 enthält Situation, wenn beim letzten Tick der vorherigen Leiste (zum Zeitpunkt t 2) der Funktionsstart () erfolgreich gestartet und ausgeführt wurde. Thats warum, obwohl jetzt die erste Leiste (mit Index 1) im Moment t 2 beendet wurde, wurde durch den Indikator berechnet, die Funktion IndicatorCounted () gibt den Wert zurück, der auf der vorherigen Leiste war. Dh 299: Im nächsten Zeilenindex i wird berechnet, in diesem Fall für das erste Häkchen eines neuen Taktes ist es gleich 1 (301-299-1): Es bedeutet die Berechnung der Indikator-Array-Werte in while () Schleife Bei dem Auftritt eines neuen Stabes wird sowohl für den letzten Stab als auch für den neuen Nullpunkt gespielt. Ein wenig früher während der Re-Indexierung von Indikator-Arrays das Client-Terminal erhöht Größen dieser Arrays. Werte von Array-Elementen mit Null-Indizes wurden vor den Berechnungen in der Schleife nicht definiert. Bei 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 Indikatorzeilen auf der Null-Leiste, basierend auf nur 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 Tick wird nicht verarbeitet (seltener Fall). Feige. 119 zeigt die Situation an, wenn start () beim ersten Tick eines neuen Stabes zum Zeitpunkt t 5 gestartet wurde. Vorheriges Mal wurde diese Funktion zum Zeitpunkt t 2 gestartet. Tick, das zum Zeitpunkt t 3 zum Terminal kam t 3 (roter Pfeil ) Wurde nicht vom Indikator verarbeitet. Dies geschah, weil die Start - () Ausführungszeit t 2 - t 4 größer ist als das Intervall zwischen den Zecken t 2 - t 3. Diese Tatsache wird vom Client-Terminal während der Ausführung von Start () erkannt, der zum Zeitpunkt t 5 gestartet wird Berechnungen in der Zeile: IndicatorCounted () gibt den Wert 299 () zurück. Dieser Wert ist wahr - ab dem Zeitpunkt des letzten Indikatoraufrufs wurden 299 Balken nach (jetzt schon) nicht geändert 301. Aus diesem Grund ist der berechnete Index des ersten (linken) Balken, aus dem Berechnungen von Arrayelementwerten gestartet werden müssen, Wird gleich 1 (301-299-1): es bedeutet während während () Ausführung zwei Iterationen durchgeführt werden. Während der ersten werden Werte von Array-Elementen mit dem Index i & sub1; berechnet, d. h. Buf01 und Buf11. Nicht, bis zum Moment werden die Berechnungen gestartet, die Balken und die Indikator-Arrays werden bereits vom Client-Terminal neu indiziert (weil ein neuer Balken gestartet wurde, zwischen den Starts der Sonderfunktion start ()). Aus diesem Grund werden Berechnungen für Elemente von Arrays mit Index 1 auf Basis von Array-Timeeries (Maximal - und Minimalwerte 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 den Null-Balken, wird auf der Basis der letzten bekannten Werte von Arrays-Timeeries berechnet. Die Verwendung der beschriebenen Technologie zur Berechnung von kundenspezifischen Indikatoren ermöglicht es zunächst, die Berechnung aller Werte aller Indikator-Array-Elemente unabhängig von der Besonderheit der Tick-Historie zu garantieren und zweitens Berechnungen nur für unzählige Balken durchzuführen, dh wirtschaftlich berechnende Ressourcen zu verwenden . Nicht wird ein Balken als unzählbar betrachtet, wenn die Berechnung der Elementwerte eines Indikator-Arrays mindestens für ein letztes Tick der Leiste nicht durchgeführt wird. Wenn Sie den benutzerdefinierten Indikator userindicator. mq4 in einem Diagrammfenster starten, sehen Sie zwei Zeilen - eine dicke blaue Linie, die auf Bar-Maxima gebaut ist, und eine gepunktete rote Linie, die auf ihren Minimalwerten aufgebaut ist (Abb. 120). Es ist anzumerken, dass man einen kundenspezifischen Indikator bauen kann, dessen Indikatorlinien mit den Linien eines analogen technischen Indikators übereinstimmen. Es kann leicht gemacht werden, wenn als Berechnungsformeln im Custom Indikator die gleichen Formeln wie im technischen Indikator verwendet werden. Um dies zu veranschaulichen, kann man den im vorherigen Beispiel analysierten Programmcode verbessern. Lassen Sie den Indikator Linien auf durchschnittliche Werte von Maximums und Minimum von mehreren letzten Takten. Es ist leicht, notwendige Berechnungen durchzuführen: Wir müssen nur durchschnittliche Werte von Arrays-Zeiten erzählen. Beispielsweise wird der Wert eines Indikator-Arrays mit dem Index 3 (dh 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 Indikatorlinien, die auf Minimums aufgebaut sind. Beispiel eines einfachen benutzerdefinierten Indikators averagevalue. mq4. Indikatorlinien werden auf durchschnittlichen minimalen und maximalen Werten von N Balken aufgebaut. 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 für 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 die Werte der Indikator-Array-Elemente für Indikatorzeilen berechnet, die minimalen und maximalen Werten entsprechen. Die hier verwendete Mittelungsmethode gilt auch für Berechnungen im technischen Indikator Moving Average. Wenn wir den analysierten benutzerdefinierten Indikator averagevalue. mq4 und den technischen Indikator Moving Average anhängen, sehen wir drei Indikatorzeilen. Wenn für beide Indikatoren die gleiche Periodendauer erfolgt, wird die Moving Average-Linie mit einer der benutzerdefinierten Indikatorzeilen übereinstimmen (zu diesem Zweck müssen die in Abb. 121 beschriebenen Parameter in den technischen Indikatoreinstellungen angegeben werden). Feige. 121. Übereinstimmende Linien eines technischen Indikators und einer benutzerdefinierten Anzeige (rote Linie). So kann ein Benutzer mit Hilfe eines technischen Indikators die Reflexion von Regelungen, die in der praktischen Arbeit notwendig sind, konstruieren. Benutzerdefinierte Indikatoroptionen Zeichnen von Indikatorlinien in separaten Windows MQL4 bietet einen großen Service für den Aufbau von benutzerdefinierten Indikatoren, die es sehr bequem macht. Insbesondere können Indikatorlinien in einem separaten Fenster gezeichnet werden. Dies ist zweckmäßig, wenn die Absolutwerte der Amplitude der Indikatorlinie wesentlich kleiner (oder größer) als die Sicherheitspreise sind. Wenn wir zum Beispiel an der Differenz zwischen den Mittelwerten der Stabmaxima und den Minima in einem bestimmten historischen Intervall interessiert sind, ist dieser Wert je nach Zeitraum etwa von 0 bis 50 Punkten (z. B. für M15) gleich. Es ist nicht schwer, eine Indikatorlinie zu bauen, aber in einem Sicherheitsfenster wird diese Zeile im Bereich von 0 - 50 Punkten eines Sicherheitspreises gezeichnet, d. h. wesentlich niedriger als der auf dem Bildschirm reflektierte Diagrammbereich. Es ist sehr unpraktisch. Um Indikatorzeilen in einem separaten Fenster (das sich im unteren Teil eines Sicherheitsfensters befindet) zu zeichnen, muss in der Anweisungseigenschaft (am Programmbeginn) die Parameterindikatorparameter angegeben werden: Im Moment, wenn ein solches Kennzeichen an ein Sicherheitsfenster angehängt ist , Client-Terminal schafft ein separates Fenster unterhalb eines Diagramms, in dem Indikatorzeilen, die im Indikator berechnet werden, gezeichnet werden. Abhängig von den Farbeinstellungen und den Typen der Indikatorlinien werden sie in diesem oder jenem Stil gezeichnet. Begrenzung der Berechnungshistorie In den meisten Fällen enthalten Indikatorzeilen nützliche Informationen nur in der jüngsten Geschichte. Der Teil der Indikatorlinien, die auf alten Stäben aufgebaut sind (z. B. 1 Monat alt Minuten Zeitrahmen), kann kaum als nützlich für Handelsentscheidungen angesehen werden. Außerdem, wenn es viele Stäbe in einem Diagrammfenster gibt, ist die Zeit in die Berechnung investiert und die Zeichnung der Indikatorlinien ist unangemessen groß. Dies kann bei Programm-Debugging kritisch sein, wenn ein Programm oft 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 letzten Bar-Geschichte. Zu diesem Zweck wird im folgenden Programm eine externe Variablenhistorie verwendet. Der Wert dieser Variablen wird bei der Berechnung des Index des ersten (linken) Balken berücksichtigt, beginnend mit welcher Elemente der Indikatorfelder berechnet werden müssen. Weitere Berechnungen in while () Schleife werden für die Anzahl der letzten Historienbalken durchgeführt, die nicht größer als der Historienwert sind. Beachten Sie, dass die analysierte Methode zur Begrenzung einer Berechnungshistorie nur den Teil der Berechnungen betrifft, die beim ersten Start der Sonderfunktion start () durchgeführt werden. Weiterhin, wenn neue Balken erscheinen, werden neue Teile von Indikatorlinien im rechten Teil hinzugefügt, während das Bild im linken Teil erhalten bleibt. Somit wird die Indikatorleitungslänge während der gesamten Anzeigebetriebszeit erhöht. Der gemeinsame Wert des History-Parameters gilt als ca. 5000 bar. Beispiel für eine einfache benutzerdefinierte Indikator separatewindow. mq4. Indikatorlinien werden in einem separaten Fenster gezeichnet. Eine ähnliche Berechnung einer Indikatorzeile erfolgt im technischen Indikator AverageTrue Range. Feige. 122 zeigt eine Indikatorzeile, die durch die benutzerdefinierte Indikator separatewindow. mq4 in einem separaten Fenster und eine Indikatorzeile konstruiert wurde, die durch ATR in einem anderen Fenster konstruiert wurde. In diesem Fall sind die Zeilen vollständig identisch, da die Periodenwerte für beide Indikatoren gleich sind - 5. Wenn dieser Parameter in einem der Indikatoren geändert wird, ändert sich auch die entsprechende Indikatorzeile. Feige. 122. Zeichnen einer benutzerdefinierten Indikatorzeile in einem separaten Fenster. Identische Zeilen eines technischen Indikators (ATR) und eines benutzerdefinierten Indikators (separatewindow. mq4). Es ist auch offensichtlich, dass die benutzerdefinierte Indikatorlinie nicht für die gesamte Bildschirmbreite konstruiert ist, sondern für 50 letzte Balken, wie in der externen Variablen History angegeben. Wenn ein Händler ein größeres Verlaufsintervall verwenden muss, kann der Wert der externen Variablen einfach über das benutzerdefinierte Anzeigefenster geändert werden. Feige. 123 zeigt ein Sicherheitsfenster, in dem die Indikatorlinie, die wir in einem anderen Stil gezeichnet haben - als Histogramm. Für ein solches Ergebnis wurde eine Zeile im Programmcode separatewindow. mq4 geändert - andere Zeilen werden angezeigt: Alle anderen Codeteile sind unverändert. Feige. 123. Zeichnen der benutzerdefinierten Indikatorzeile in einem separaten Fenster (Histogramm). Ähnlichkeit der Zeichnungen eines technischen Indikators (ATR) und eines benutzerdefinierten Indikators (separatewindow. mq4). Shifting Indicator Lines vertikal und horizontal In einigen Fällen ist es notwendig, eine Indikatorlinie zu verschieben. Es kann leicht durch MQL4 bedeutet werden. Lets analysieren ein Beispiel, bei dem die Position der Indikatorzeilen in einem Sicherheitsfenster nach den von einem Benutzer vorgegebenen Werten berechnet wird. Beispiel für eine benutzerdefinierte Anzeige Verschiebung. mq4. Mantelzeilen horizontal und vertikal verschieben. Zum Einstellen von Linienverschiebung in einem Diagramm gibt es zwei externe Variablen - LeftRight für die horizontale Verschiebung aller Zeilen und UpDown zum Verschieben von zwei gestrichelten Linien vertikal. Der Algorithmus, der für die Berechnung von Werten entsprechender Arrayelemente verwendet wird, basiert auf sehr einfachen Regeln: Um eine Zeile horizontal zu verschieben, ordnen Sie den berechneten Wert einem Arrayelement zu, dessen Index von LeftRight größer ist (zum Verschieben nach rechts und weniger zum Verschieben) Nach rechts) als der Index einer Leiste, für die Berechnungen zum vertikalen Verschieben einer Linie durchgeführt werden, muss UpDownPoint hinzugefügt werden (zum Verschieben nach oben oder abschreckend zum Verschieben nach unten) auf jeden Wert eines Indikatorarrays, das die Anfangszeilenposition charakterisiert Beispielindizes werden in der Zeile berechnet: Hier ist der Index einer Leiste, für die Berechnungen durchgeführt werden, k ist ein Index eines Indikator-Array-Elements. Die rote Indikatorzeile, die vom Client-Terminal basierend auf dem Indikator-Array Line0 angezeigt wird, wird nach links um 5 Balken (nach benutzerdefinierten Einstellungen, siehe Abb. 124) von der Anfangszeile aus verschoben. In diesem Fall ist die Anfangszeile ein Moving Average mit der Periode der Mittelung 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 der Indikator-Array-Werte für zwei andere Zeilen, d. h. ihre Position auf dem Diagramm. Die gestrichelten Linien werden auf diese Weise berechnet: Die Verwendung des Index k für Elemente aller Indikatorarrays erlaubt es, Berechnungen für Elemente von Arrays Line1, Line2 auf demselben Balken durchzuführen, wie sie für die Berechnung der Werte des entsprechenden Basisarrays Line0 verwendet werden. Dadurch werden die gestrichelten Linien gegenüber der roten Linie um den im Indikatoreinstellungsfenster angegebenen Wert verschoben, in diesem Fall um 30 Punkte (Abb. 124). Feige. 124. Die rote Indikatorlinie wird um 5 bar nach links verschoben. Die gepunkteten Indikatorlinien sind gegenüber der roten Linie um 30 Punkte verschoben. Einschränkungen von kundenspezifischen 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 benutzerdefinierten Indikatoren verwendet werden können und nicht in Expert Advisors und Scripts 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 Gegensatz zu Expertenberatern und Skripten, die in ihrem eigenen Fluss arbeiten). Dies ist auch der Grund, warum Algorithmen, die auf Looping basieren, nicht in benutzerdefinierten Indikatoren verwendet werden können. Der Start eines benutzerdefinierten Indikators, der eine endlose Schleife enthält (in Bezug auf die tatsächliche Ausführungszeit), kann dazu führen, dass das Client-Terminal mit einer weiteren Notwendigkeit aufhört, einen Computer neu zu starten. Die allgemeinen Vergleichsmerkmale von Expert Advisors, Scripts und Indikatoren sind in Tabelle 2 enthalten. Verwendung von Programmen Es wurde früher gesagt, dass nach MQL4-Regeln Handelsfunktionen nicht in benutzerdefinierten Indikatoren verwendet werden können, deshalb deshalb für den automatisierten Handel Expert Advisors oder Scripts benutzt. Allerdings ist die ressourcenschonende Technologie, die für Berechnungen in Indikatoren verwendet wird (siehe Erstellung von benutzerdefinierten Indikatoren), bei der Erstellung von Handelsprogrammen weit verbreitet. In den meisten Fällen können Sie in benutzerdefinierten Indikatoren die Werte der Indikator-Array-Elemente, die für die Bildung von Handelskriterien und die Herstellung von Handelsentscheidungen in Expertenberatern erforderlich sind, effizient berechnen. Berechnungen, die in kundenspezifischen Indikatoren technisch durchgeführt werden, können auch in Expert Advisors implementiert werden, dies kann aber zu einer Vervielfältigung von Berechnungen in verschiedenen Anwendungsprogrammen und zu unangemessenen Ressourcenverschwendung und in einigen Fällen (wenn lange ressourcenintensive Berechnungen durchgeführt werden) führen Eine Handelsentscheidung verspätete. In den Fällen, in denen es notwendig ist, Berechnungsergebnisse von benutzerdefinierten Indikatoren in einem Expert Advisor oder Skript zu verwenden, kann die Funktion iCustom () verwendet werden. Funktion iCustom () Berechnung der angegebenen benutzerdefinierten Anzeige. Der benutzerdefinierte Indikator muss kompiliert werden (.ex4-Datei) und befindet sich im Verzeichnis Terminalcatalogueexpertsindicators. Symbol - Symbolname einer Sicherheit, auf deren Daten ein Indikator berechnet wird. NULL gibt das aktuelle Symbol an. Zeitrahmen - Zeitraum. Kann eine der Planperioden sein. 0 bedeutet die Periode des aktuellen Diagramms. Name - Name des benutzerdefinierten Indikators. . - Liste der Parameter (falls erforderlich). Die übergebenen Parameter müssen mit der Reihenfolge der Deklaration und der Art der externen Variablen eines benutzerdefinierten Indikators übereinstimmen. Modus - Index einer Indikatorzeile. Kann von - bis 7 sein und muss dem Index entsprechen, der von einer der SetIndexBar-Funktionen verwendet wird. Verschiebung - Index des erhaltenen Wertes aus einem Indikatorpuffer (Umschalten in Bezug auf einen aktuellen Balken um eine vorgegebene Anzahl von Balken). Lassen Sie uns überlegen, wie iCustom () in der Praxis verwendet werden kann. Lassen Sie uns das folgende Problem lösen: Problem 30. Eine Handelsstrategie basiert auf den Daten des benutzerdefinierten Indikators rocseparate. mq4. Wenn die ROC-Zeile im aktuellen Zeitrahmen (orange) eine geglättete durchschnittliche Ratenlinie (dickrot) unterhalb eines bestimmten Niveaus von unten nach oben kreuzt, ist dies ein relevantes Kriterium zu kaufen (offener Kauf und schließen Verkauf). Wenn es gegensätzliche Bedingungen gibt, ist dies ein relevantes Kriterium zu verkaufen. Schreiben Sie einen Code, der diese Strategie implementiert. Das Prinzip der Konstruktion des Custom Indikators rocseparate. mq4 ist im Abschnitt Custom Indicator ROC (Price Rate of Change) beschrieben. Feige. 131 veranschaulicht zwei Punkte, in denen die ROC-Zeile im aktuellen Zeitrahmen (M15) die geglättete Rate der Änderungslinie kreuzt. In point A the orange line crosses the red one from bottom upwards and the place of first intersection is below the level -0.001. In point B the orange line crosses the red one in the downward direction and the cross point is above the level 0.001. The fact of this crossing must be detected in the Expert Advisor and be considered as a signal to buy (point A - close Sell and open Buy) or to sell (point B - close Buy and open Sell). Feige. 131. Crossing of custom indicator lines is considered as a trading criterion. When solving such problems a ready Expert Advisor can be used, changing the order of calculation trading criteria in it. In this case we can take as a basis the Expert Advisor tradingexpert. mq4 described in the section Simple Expert Advisor. The EA shared. mq4 calculating trading criteria on the basis of a custom indicator will look loke this: Let us analyze what amendments were made in the source code (tradingexpert. mq4 ). The main part of the Expert Advisor used as basic has not changed. Changes have been made in two blocks - block 1-2- and block 5-6. In the block 5-6 trading criteria are calculated. In the described EA a trading strategy is based on two trading criteria - criterion to open Buy and criterion to open Sell. The strategy used in the Expert Advisor allows the presence of only one opened market order, pending orders are not allowed. The strategy also presupposes closing an opposite order when a criterion for opening triggers for example, if criterion to open a Buy order is relevant, it means that a Sell order must be closed. For using in the EA shared. mq4 results of calculations performed in the custom indicator rocseparate. mq4, function iCustom() must be executed: In this case formal parameters specified in iCustom() call denote the following: NULL - calculations in the indicator are performed based on data of the current security in this case the EA is attached to EURUSD window, so data of EURUSD will be used (see Fig. 131 ) 0 - in calculations data of the current timeframe are used in this case the current timeframe is M15, so data corresponding to M15 will be used quotrocseparatequot - name of a custom indicator, in which calculations will be made. H, P,B, A - list of adjustable parameters. In this case the custom indicator rocseparate. mq4 has adjustable parameters (block 2-3 of rocseparate. mq4 code). For a user to be able to set up values of these parameters from the EA, they are specified in the list of passed parameters of the function iCustom(). In the Expert Advisor values of these parameters can differ from those specified in the indicator. In such a case during calculations in the indicator exactly these passed values will be used. These parameters denote the following: H - number of bars in calculation history P - period of calculation MA B - number of bars for rate calculation A - number of bars for smoothing. (the meaning of these parameters is explained in details in the section Custom Indicator ROC (Price Rate of Change) . 1 ( 5 ) - index line of the indicator. In the custom indicator rocseparate. mq4 6 indicator arrays are used. ROC line in the current timeframe (orange) is constructed on the basis of Line1 values, for which buffer with index 1 is used. Smoothed average rate line is based on values of Line5 array elements, index of the used buffer is 5. 0 - index of value obtained from an indicator buffer (shift back relative to a current bar by the specified number of periods). In this case values of indicator lines on the zero bar are used, that is why index 0 is specified. For a user to be able to change the adjustable indicator parameters in the EA manually, external variables are specified in block 1a-1b (of the Expert Advisor ). In block 5-5a values of these parameters are assigned to other variables with shorter names - this is done for convenience of code presentation in block 5a-5b. Thus a user can specify in shared. mq4 parameters, with which calculations in the custom indicator rocseparate. mq4 will be conducted. After execution iCustom() function will return value corresponding to a specified element value of specified indicator array calculated in the indicator using specified values of adjustable parameters. During practical operation it is convenient to see in a security window lines of the indicator, array elements of which are used in the Expert Advisor (see Fig. 131 ). At the same time execution of iCustom() is not connected with the presence of the indicator in the security window, as well as with the values of its adjustable parameters. The execution of iCustom() does not require the attachment of a corresponding indicator to a security window. As well as the call of iCustom() from any application program does not result in the attachment of a corresponding indicator to a security window. Attachment of a technical indicator to a security window also does not lead to the call of iCustom in any application program. Trading criteria in the EA (block 5-6) are calculated on the basis of array element values obtained using iCustom() function. For example a criterion for opening Buy and closing Sell are calculated the following way: If the last known value of a smoothed average rate line (L5) is less than the specified level (value of the adjustable parameter Level 0.001) and the last known value of ROC line in the current timeframe (L1) is larger than the smoothed average rate line (L5), the criterion for opening a Buy order and closing a Sell order is considered relevant. For the confirmation of relevance of opposite criteria reflecting conditions are used. Trading criteria accepted in this example are used for educational purpose only and must not be considered as a guideline when trading on a real account. Moving Average The Moving Average Technical Indicator shows the mean instrument price value for a certain period of time. Wenn man den gleitenden Durchschnitt berechnet, schätzt man den Instrumentenpreis für diesen Zeitraum. Wenn sich der Preis ändert, steigt der gleitende Durchschnitt entweder an oder sinkt. Es gibt vier verschiedene Arten von gleitenden Durchschnitten: Einfach (auch als Arithmetik bezeichnet), Exponential. Geglättet und gewichtet. Moving Average kann für jeden sequentiellen Datensatz berechnet werden, einschließlich der Ö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 gleitende Mittelwerte 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 jeweiligen Zeitraums sind gleichwertig. Exponentieller Moving Average und Linear Weighted Moving Average legen mehr Wert auf die neuesten Preise. Die gängigste Art, den Preis gleitenden Durchschnitt zu interpretieren, ist, seine Dynamik mit der Preisaktion zu vergleichen. Wenn der Instrumentenpreis über seinem gleitenden Durchschnitt steigt, erscheint ein Kaufsignal, wenn der Preis unter seinen gleitenden Durchschnitt fällt, was wir haben, ist ein Verkaufssignal. Dieses Handelssystem, das auf dem gleitenden Durchschnitt basiert, ist nicht dafür ausgelegt, in den tiefsten Punkt des Marktes zu gelangen und seinen Ausgang direkt auf den Gipfel zu bringen. Es erlaubt, nach dem folgenden Trend zu handeln: bald zu kaufen, nachdem die Preise den Boden erreicht haben, und bald zu verkaufen, nachdem die Preise ihren Höhepunkt erreicht haben. Bewegliche Mittelwerte 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 dies, dass die aufsteigende Indikatorbewegung wahrscheinlich weitergehen wird: Wenn der Indikator unter seinen gleitenden Durchschnitt fällt, ist dies der Fall Bedeutet, dass es wahrscheinlich weiter nach unten geht. Hier sind die Arten der sich bewegenden Mittelwerte auf dem Diagramm: Simple Moving Average (SMA) Exponentieller Moving Average (EMA) Geglättete Moving Average (SMMA) Linear Weighted Moving Average (LWMA) Sie können die Handelssignale dieses Indikators testen, indem Sie einen Expertenberater erstellen In MQL5 Zauberer. Berechnung Einfacher Bewegungsdurchschnitt (SMA) Einfache, mit anderen Worten, der arithmetische gleitende Durchschnitt wird berechnet, indem man die Preise der Instrumentenschließung über eine bestimmte Anzahl von Einzelperioden (z. B. 12 Stunden) zusammenfasst. Dieser Wert wird dann durch die Anzahl solcher Perioden dividiert. SMA SUM (SCHLIESSEN (i), N) N SUM Summe SCHLIESSEN (i) aktuelle Periode Schliesspreis N Anzahl der Berechnungsperioden. Exponentieller Moving Average (EMA) Exponentiell geglätteter gleitender Durchschnitt wird durch Addition eines bestimmten Anteils des aktuellen Schlusskurses auf den vorherigen Wert des gleitenden Durchschnitts berechnet. Mit exponentiell geglätteten gleitenden Durchschnitten sind die letzten engen Preise von mehr Wert. P-Prozent exponentieller gleitender Durchschnitt sieht aus wie: EMA (CLOSE (i) P) (EMA (i - 1) (1 - P)) SCHLIESSEN (i) aktueller Periodenabschlusspreis EMA (i - 1) Wert des Moving Average Der vorherigen Periode P der Prozentsatz der Verwendung des Preiswertes. (SMA) Der erste Wert dieses geglätteten gleitenden Durchschnitts wird als der einfache gleitende Durchschnitt (SMA) berechnet: SUM1 SUM (CLOSE (i), N) Der zweite gleitende Durchschnitt wird nach dieser Formel berechnet: SMMA (i) (I - 1) N SMMA (i) (PREVSUM - SMMA (i - 1) SCHLIESSEN (i)) NV - N SUM Summe SUM1 Gesamtsumme der Schlusskurse für N Perioden wird von der vorherigen Bar gezählt PREVSUM geglättete Summe der vorherigen Bar SMMA (i-1) geglätteten gleitenden Durchschnitt der vorherigen Bar SMMA (i) geglätteten gleitenden Durchschnitt der aktuellen Bar (Mit Ausnahme des ersten) SCHLIESSEN (i) aktueller enger Preis N Glättungszeitraum Nach arithmetischen Umwandlungen kann die Formel vereinfacht werden: SMMA (i) (SMMA (i - 1) (N - 1) CLOSE (i)) N Linear Weighted Moving Average (LWMA) Bei gewichtetem gleitendem Durchschnitt sind die letzten Daten Von mehr Wert als frühere Daten. Weighted moving average is calculated by multiplying each one of the closing prices within the considered series, by a certain weight coefficient: LWMA SUM (CLOSE (i) i, N) SUM (i, N) SUM sum CLOSE(i) current close price SUM (i, N) total sum of weight coefficients N smoothing period.

No comments:

Post a Comment