Wednesday 22 February 2017

Mql4 Gleitender Durchschnitt

Ich würde mir vorstellen, es hätte etwas mit neu zu schreiben eine benutzerdefinierte MA-Indikator, die durchschnittliche Werte des Indikators, die Sie wollen. Sollte wirklich nur ein Fall des Ersetzens der Preiswerte in der aktuellen MA-Indikator mit iStochastischen Werten sein, dann können Sie einfach iCustom () verwenden, um das benutzerdefinierte Kennzeichen aufzurufen. Ich denke. heres die einfachen gleitenden Durchschnitt Code aus dem MA-Anzeige, die mit MT4 kommt, sollte nur ein Fall sein, die Closepos mit iStochastic ersetzen (Pos.) Werte Ich denke, Leere sma () double SUM0 int i, posBars-ExtCountedBars-1 --- - anfängliche Akkumulation if (posltMAPeriod) posMAPeriod für (i1iltMAPeriodi, pos--) sumClosepos ---- Hauptberechnungsschleife während (posgt0) sumClosepos ExtMapBufferpossumMAPeriod sum-CloseposMAPeriod-1 pos-- ---- Null Anfangs Bars if (ExtCountedBarslt1) für (I1iltMAPeriodi) ExtMapBufferBars-i0 Ich würde mir vorstellen, es würde etwas mit Re-Schreiben einer benutzerdefinierten MA-Indikator, die durchschnittliche Werte des Indikators, die Sie suchen, zu tun haben. Sollte wirklich nur ein Fall des Ersetzens der Preiswerte in der aktuellen MA-Indikator mit iStochastischen Werten sein, dann können Sie einfach iCustom () verwenden, um das benutzerdefinierte Kennzeichen aufzurufen. Ich denke. heres die einfachen gleitenden Durchschnitt Code aus dem MA-Anzeige, die mit MT4 kommt, sollte nur ein Fall sein, die Closepos mit iStochastic ersetzen (Pos.) Werte Ich denke, Leere sma () double SUM0 int i, posBars-ExtCountedBars-1 --- - anfängliche Akkumulation if (posltMAPeriod) posMAPeriod für (i1iltMAPeriodi, pos--) sumClosepos ---- Hauptberechnungsschleife während (posgt0) sumClosepos ExtMapBufferpossumMAPeriod sum-CloseposMAPeriod-1 pos-- ---- Null Anfangs Bars if (ExtCountedBarslt1) für (I1iltMAPeriodi) ExtMapBufferBars-i0 Vielen Dank für Ihre Hilfe, mrwobbles, aber es didnt mir noch helfen. Stellen Sie sich einfach würde Ich mag den gleitenden Durchschnitt von x Perioden auf Volumen zu berechnen, müssen Sie den Code für diesen Ive erhielt eine einfache MA des Volumens durchgeführt, wenn Sie die Moving Averages Indikator Blick auf die mit MT4 kommt, kann man sehen, was Ive getan . Seine ziemlich einfach. Das Problem mit dem Stochastic MA ist, dass Stochastik zurückkehren positive und negative Werte, so dass die Summen accurate. Usage der technischen Indikatoren Arent Nach Zugehörigkeit zu der Online-Handelssystem MetaTrader 4 gibt es zwei Arten von Indikatoren in MQL4 - technische und Sitte. Technische Indikator ist ein integraler Bestandteil des Online-Handelssystem MetaTrader, integrierte Funktion, die Zeichnung auf dem Bildschirm eine bestimmte Abhängigkeit ermöglicht. Eigenschaften der technischen Indikatoren Zeichnung im Sicherheitsfenster Jeder technische Indikator berechnet eine bestimmte vordefinierte Abhängigkeit. Um diese Abhängigkeit grafisch auf dem Bildschirm zu zeichnen, sollte ein technischer Indikator einem Diagramm zugeordnet werden. Dies kann über das Systemmenü Insert gtgt Indicators oder über das Navigatorfenster eines Client-Terminals erfolgen. Für das Anhängen eines technischen Indikators an ein Diagramm aus dem Navigator-Fenster wird eine sehr einfache Methode verwendet - drag-amp-drop des technischen Indikatornamens aus dem Navigator-Fenster in ein Diagrammfenster. Als Ergebnis werden eine oder mehrere Zeilen, die in diesem Indikator berechnet werden, im Diagrammfenster erscheinen. Indikatorlinien eines technischen Indikators können sowohl im Hauptdiagrammfenster als auch in einem separaten Fenster im unteren Teil eines Sicherheitsfensters gezeichnet werden. In Fig. 104 Technischer Indikator Alligator wird in einem Diagrammfenster gezeichnet. Code Unchangeability Alle technischen Indikatoren sind eingebaut, ihr Code ist nicht verfügbar für Änderungen. So ist ein Anwender vor einer fehlerhaften Änderung von integrierten technischen Indikatoren gesichert. Der Quellcode, auf dem ein technischer Indikator berechnet wird, steht auf der Softwareentwickler-Website (MetaQuotes Software Corp.) im Abschnitt Technische Indikatoren zur Verfügung. Bei Bedarf kann ein Programmierer den vollständigen Code oder einen Teil davon verwenden, um benutzerdefinierte Indikatoren zu erstellen (siehe Erstellen von benutzerdefinierten Indikatoren). Aufruf von Funktionen der technischen Indikatoren Die graphische Darstellung, die für einen Benutzer sichtbar ist, wird von einem Client-Terminal angezeigt. Aus Gründen der Bequemlichkeit werden wir solche Zeichnungsindikatorlinien aufrufen. Indikatorlinie ist eine grafische Darstellung einer bestimmten Abhängigkeit, die auf numerischen Werten basiert, die in einem Indikatorarray enthalten sind. Der Zeilentyp wird von einem Benutzer eingerichtet. Die Anzeigelinie kann in Form einer durchgezogenen oder gestrichelten Linie, einer bestimmten Farbe, sowie in Form einer Kette von bestimmten Zeichen (Punkte, Quadrate, Ringe usw.) dargestellt werden. Bei Indikatorberechnungen werden Sätze von numerischen Werten in diesen Indikatorlinien entsprechend diesen Berechnungen berechnet. Diese Wertsätze werden in Indikatorfeldern gespeichert. Indicator Array ist ein eindimensionales Array, das numerische Werte enthält, gemäß denen Indikatorlinien erstellt werden. Numerische Werte von Indikatorarrayelementen sind Punktkoordinaten, auf denen eine Indikatorlinie gezeichnet wird. Die Y-Koordinate jedes Punktes ist der Wert eines Indikator-Array-Elements, X-Koordinate ist der Indexwert des Indikator-Array-Elements. Die Datenspeicherungstechnik in Indikatorarrays ist die Basis für den Aufbau von technischen und individuellen Indikatoren. Die Werte der Indikatorarrayelemente der technischen Indikatoren sind von allen Anwendungsprogrammen, einschließlich Expertenberatern, Skripts und benutzerdefinierten Indikatoren, verfügbar. Um einen Wert eines Indikatorarray-Elements mit einem bestimmten Index in einem Anwendungsprogramm zu erhalten, muss eine integrierte Funktion aufgerufen werden, deren Name gemäß einem technischen Indikatornamen gesetzt wird. Für die Ausführung einer technischen Indikatorfunktion sollte das entsprechende Kennzeichen nicht unbedingt an ein Sicherheitsfenster angehängt werden. Auch der technische Indikatorfunktionsaufruf aus einem Applikationsprogramm führt nicht zum Anhängen eines entsprechenden Indikators an ein Sicherheitsfenster. Das Anhängen eines technischen Indikators an ein Sicherheitsfenster führt auch nicht zu einem technischen Indikationsaufruf in einem Anwendungsprogramm. Eine Reihe von technischen Indikatoren ist in der Client-Terminal des Online-Handelssystem MetaTrader 4 enthalten. Wir können einige von ihnen zu analysieren. Gleitender Durchschnitt, MA Technischer Indikator Gleitender Durchschnitt, MA zeigt den Mittelwert des Instrumentenpreises für einen bestimmten Zeitraum an. Der Indikator spiegelt die allgemeine Marktentwicklung - kann einige Schwankungen in der Nähe von einigen Preis zu erhöhen, zu senken oder zeigen. Um Werte der MA-Indikatorzeile zu einem bestimmten Zeitpunkt zu erhalten, verwenden Sie die Standardfunktion: Symbol - Symbolname eines Wertpapiers, auf dessen Daten der Indikator berechnet wird. NULL bedeutet das aktuelle Symbol. Zeitrahmen. Kann eine von Diagrammperioden sein. 0 bedeutet die Periode des aktuellen Diagramms. Zeitraum - Zeitraum der Mittelung für MA Berechnungen. Mashift - Indikatorverschiebung relativ zu einem Kursdiagramm. Mamethod - Methode der Mittelung. Kann einer der MA Methodenwerte sein. Angewandter Preis - gebrauchter Preis. Kann jede der Preiskonstanten sein. Der von einem Indikatorarray (Umschalten relativ zu einem aktuellen Balken um eine vorgegebene Anzahl von Balken) erfaßt wird. Nachfolgend sehen Sie ein Beispiel für den Aufruf einer technischen Indikatorfunktion von Expert Advisor callindicator. mq4: In der EA callindicator. mq4 wird die Funktion iMA () verwendet (Funktion des technischen Indikators Moving Average). Dieser Programmteil kann im Detail analysiert werden: NULL bezeichnet die Berechnung eines gleitenden Durchschnitts für ein Sicherheitsfenster, an das das EA angehängt ist (in diesem Fall ist es EA, im allgemeinen kann es jedes Anwendungsprogramm sein) 0 - es ist Berechnet für den im Sicherheitsfenster eingestellten Zeitrahmen, an dem das EA angeschlossen ist PeriodMA - Mittelungsperiodenwert wird in einer externen Variablen gesetzt, wenn nach der EA-Zuordnung zu einem Sicherheitsfenster ein Benutzer diesen Wert nicht in den Einstellungen der externen EA-Variablen verändert , Ist der Wert gleich 5 0 - Indikatorarray ist nicht relativ zu einem Diagramm verschoben, dh Werte von Indikatorarrayelementen enthalten MA-Werte, die für Balken berechnet werden, auf denen die Indikatorzeile gezeichnet wird MODESMA - Methode eines einfachen gleitenden Mittelwertes Berechnungen PRICECLOSE - Barschlusspreis wird für Berechnungen verwendet 0 - Indikatorarray-Elementindex, für den der Wert erfasst wird - in diesem Fall ist er Null-Element. Unter Berücksichtigung, dass das Indikatorarray nicht relativ zum Diagramm verschoben ist, wird der MA-Wert für den Null-Balken erhalten. Die Funktion iMA () gibt einen Wert zurück, der der Variablen MA zugeordnet ist. In weiteren Programmlinien wird dieser Wert mit dem aktuellen Bid-Preis verglichen. Wenn der aktuelle Preis höher oder niedriger als der erhaltene MA-Wert ist, wird eine Warnung angezeigt. Die Verwendung der Variablen FactUp und FactDn ermöglicht es, die Warnung erst nach dem ersten Übergang der MA-Linie zu zeigen (Beachten Sie, dass die blaue Anzeigezeile in einem Sicherheitsfenster nicht gezeichnet wird, weil die technische Indikatorfunktion aus dem Programm aufgerufen wurde, sondern weil ein Benutzer angeschlossen ist Der Indikator für das Diagramm, Abb. 104). Hierbei ist anzumerken, dass beim Erscheinen der neuen Balken-Indizes der Historienbalken die Zunahme der aktuell gebildeten Balken immer den 0-Index aufweist. Im Expertenadvisor callindicator. mq4 gibt die technische Indikatorfunktion iMA () den für den Nullbalken berechneten Wert zurück. Obwohl der Indexwert während der EA-Ausführung nie geändert wird (d. h. Berechnungen werden immer für auf dem aktuellen Balken durchgeführt), entspricht der von iMA () zurückgegebene Wert immer dem zuletzt berechneten, d. H. Für den aktuellen Null-Balken berechneten Wert. Wenn bei einigen Berechnungen im Programm der Wert eines technischen Indikatorwerts nicht für den aktuellen Bar, bur für einen historischen Wert ermittelt werden soll, so sollte im Funktionsaufruf der notwendige Indikator-Array-Index angegeben werden. Hier sehen Sie ein Beispiel für EA historybars. mq4. In dem MA auf dem vierten Balken berechnet wird: In den EA-Historybars. mq4 werden MA-Werte für den aktuellen Balken (Index 0) und für den vierten Balken (Index 4) berechnet. Die angezeigten Indizes 0 und 4 ändern sich während dieses Programmiervorgangs nicht, und das Programm kann unendlich lang jedes Mal die MA-Werte für den Null - und den vierten Balken berechnen. Denken Sie daran, obwohl Berechnungen für MA auf Stäben mit denselben Indizes durchgeführt werden, wird MA geändert, d. H. Entspricht aktuellen MA-Werten auf dem aktuellen Null-Balken und dem aktuellen vierten Balken. In Fig. 106 ist es klar, dass, wenn die Preise auf den las Bars wachsen, geht MA auf. Die Differenz zwischen den MA-Werten auf der Null - und der vierten Spur wächst ebenfalls, was sich in den angezeigten Warnungen widerspiegelt. Technische Indikatoren können nicht nur eine, sondern auch zwei oder mehr Indikatorlinien widerspiegeln Technische Indikator Stochastischer Oszillator vergleicht den aktuellen Schlusskurs mit der Preisspanne für einen ausgewählten Zeitraum. Der Indikator wird in der Regel durch zwei Indikatorlinien dargestellt. Die Hauptlinie wird K genannt. Die zweite D-Signalleitung ist der gleitende Durchschnitt von K. Üblicherweise wird K als durchgezogene Linie gezeichnet, D-gestrichelt. Nach einer der Erläuterungsvarianten der Indikatoren sollten wir kaufen, falls K größer als D ist und verkauft, falls K niedriger als D ist. Der günstigste Zeitpunkt für die Ausführung einer Handelsoperation wird als der Zeitpunkt der Übereinstimmung der Linien angesehen. Symbolsymbolname eines Wertpapiers, auf dessen Daten der Indikator berechnet wird. NULL bedeutet das aktuelle Symbol. Zeitrahmen. Kann eine von Diagrammperioden sein. 0 bedeutet die Periode des aktuellen Diagramms. Kperiod - Periode (Anzahl der Balken) zur Berechnung von K. Dperiod - Periode der Mittelung von D. Verlangsamung - Wert der Verlangsamung. Methode - Mittelwertbildung. Kann einer der MA Methodenwerte sein. Pricefield - Parameter der Auswahl der Preise für Berechnungen. Kann einer der folgenden Werte sein: 0 - LowHigh oder 1 - CloseClose. Modus - Index der Anzeigelinien. Einer der folgenden Werte kann sein: MODEMAIN oder MODESIGNAL. Verschiebungsindex des erhaltenen Wertes aus einem Indikatorpuffer (Umschalten relativ zu einem aktuellen Balken um eine vorgegebene Anzahl von Balken). Die Verwendung des stochastischen Oszillators bietet die Notwendigkeit, die relativen Linienpositionen zu analysieren. Für die Berechnung, welche Trade-Entscheidung durchgeführt werden soll, muss der Wert jeder Zeile des aktuellen und vorherigen Balken berücksichtigt werden (siehe Abb. 107). Wenn sich die Zeilen im Punkt A kreuzen (grüne Linie kreuzt die rote nach oben), sollte die Verkaufsreihenfolge geschlossen sein und die Bestellung bestellt werden. Während des Teils A - B (keine Linienkreuzung, grüne Linie ist höher als die rote Linie) Kaufauftrag sollte offen gehalten werden. In Punkt B (grüne Linie kreuzt die rote nach unten) Kauf sollte geschlossen werden und Verkauf sollte geöffnet werden. Dann sollte der Verkauf bis zur nächsten Kreuzung offen bleiben (keine Kreuzung, grüne Linie unter der roten Linie). Feige. 107. Übereinstimmung der Haupt - und der Signalleitungen des Stochastischen Oszillators. Das nächste Beispiel enthält die Implementierung eines einfachen Algorithmus, der veranschaulicht, wie notwendige Werte jeder Zeile erhalten werden können und Handelskriterien gebildet werden können. Dazu werden in der EA callstohastic. mq4 Werte der technischen Indikatorfunktionen iStochastic () verwendet: Um einen K-Zeilenwert (solid grün) auf der Nullleiste zu erhalten, wird folgende Rechenzeile verwendet: Hier zeigt der Parameter MODEMAIN die Zeile, den Wert an Von denen gefragt wird, ist der letzte Parameter 0 der Balkenindex, für den der Zeilenwert berechnet werden soll. In den drei folgenden Programmzeilen werden analog zu anderen Variablen - für D-Zeile (rote gestrichelte Linie, Parameter MODESIGNAL) für die Null - und die erste Leiste berechnet. Im nächsten Block wird die Korrelation der erhaltenen Werte analysiert und der EA berichtet über den aktuellen Zustand bei jedem Tick. Zum Beispiel in Linien: die Tatsache, dass eine rote Linie von der grünen nach oben gekreuzt wird, wird erkannt. Wenn auf der vorherigen Leiste die grüne Linie unter der roten (dh der Ausdruck M1 lt S1 ist wahr) und auf der aktuellen Leiste die grüne Linie über die rote steigt oder ihre Werte gleich sind (dh der Ausdruck M0 gt S0 ist True), bedeutet das, dass von der vorherigen Balkenbildung bis zum aktuellen Moment die grüne Lone die rote nach oben gekreuzt hat. Somit wird die Bedingung berechnet, wenn der Operator wahr ist, weshalb die Kontrolle an den Operator-Körper übergeben wird, wodurch Alert () ausgeführt wird, um die entsprechende Meldung anzuzeigen. In einem Expert Advisor, der für den Handel bestimmt ist, sollte eine Handelsfunktion zur Eröffnung eines Kaufauftrags angegeben werden. In diesem Fall führt die analysierte Variante der Zeilenkreuzung zur Bildung eines Handelsauftrags und schließlich zur Ausführung einer Handelsoperation. Für die Variante, wenn die grüne Linie kreuzt die rote nach unten, in wenn Körper eine Handelsfunktion zum Öffnen einer Verkauf Reihenfolge sollte angegeben werden. Feige. 108 zeigt das Ergebnis der callstohastic. mq4-Operation. Mit Funktionen der technischen Indikatoren zu schaffen, Handel Expert Advisors und Skripte ist sehr bequem. Die Anzahl der technischen Indikatorfunktionen eines Expertenberaters ist unbegrenzt. Ein Trading-Strategie-Entwickler kann entscheiden, verschiedene Trading-Kriterien auf der Kombination der technischen Indikatorwerte zu definieren. Beispiel für einen einfachen Trading Expert Advisor, dessen Trading-Kriterien auf technischen Indikatoren basieren, wird im Abschnitt Simple Expert Advisor analysiert. Erstellung von Custom Indicators Bei der Erstellung einer Trading-Strategie steht ein Entwickler oft vor der Notwendigkeit, grafisch in einem Sicherheitsfenster zu zeichnen Bestimmte Abhängigkeit von einem Benutzer (Programmierer) berechnet. 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 Sicherheitskarte. 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 festgelegt 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 Indexierungen. 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 anzuzeigen, ä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 Haken 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 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 durch die 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. Etwas früher während 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. Daher ist 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 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 Beschaffenheit 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. It can be easily done if as calculation formulas in the custom indicator, the same formulas as in the technical indicator are used. To illustrate this lets improve the program code analyzed in the previous example. Let the indicator draw lines upon average values of maximums and minimums of several last bars. It is easy to conduct necessary calculations: we simply need to find average values of arrays-timeseries elements. For example, value of an indicator array with the index 3 (i. e. indicator line coordinate for the third bar) on the basis of the last five maximums is calculated the following way: Buf03 ( High3 High4 High5 High6 High7 ) 5 Analogous calculations can be performed for an indicator lines built upon minimums. Example of a simple custom indicator averagevalue. mq4. Indicator lines are built upon average minimal and maximal values of N bars. In this example there is an external variable AverBars. Using this variable a user can indicate the number of bars, for which an average value is calculated. In start()this value is used for the calculation of an average value. In the loop for the sum of maximal and minimal values is calculated for the number of bars corresponding to the value of the variable AverBars. In the next two program lines values of indicator array elements are calculated for indicator lines corresponding to minimal and maximal values. The averaging method used here is also applied for calculations in the technical indicator Moving Average. If we attach the analyzed custom indicator averagevalue. mq4 and the technical indicator Moving Average, we will see three indicator lines. If the same period of averaging is set up for both indicators, Moving Average line will coincide with one of the custom indicator lines (for this purpose parameters described in Fig. 121 must be specified in the technical indicator settings). Feige. 121. Coincident lines of a technical indicator and a custom indicator (red line). Thus, using technical indicator a user can construct the reflection of any regularities necessary in practical work. Custom Indicator Options Drawing Indicator Lines in Separate Windows MQL4 offers a large service for constructing custom indicators which makes using them very convenient. In particular, indicator lines can be drawn in a separate window. This is convenient when absolute values of the indicator line amplitude is substantially smaller (or larger) than security prices. For example, if we are interested in the difference between average values of bar maximums and minimums in a certain historic interval, depending on timeframe this value will be equal to approximately from 0 to 50 points (for example, for M15). It is not difficult to build an indicator line, but in a security window this line will be drawn in the range 0 - 50 points of a security price, i. e. substantially lower than the chart area reflected on the screen. It is very inconvenient. To draw indicator lines in a separate window (which is in the lower part of a security window), in the directive property (at the program beginning) parameter indicatorseparatewindow must be specified: At the moment when such an indicator is attached to a security window, client terminal creates a separate window below a chart, in which indicator lines calculated in the indicator will be drawn. Depending on color settings and types of indicator lines they will be drawn in this or that style. Limiting Calculation History In most cases indicator lines contain useful information only in the most recent history. The part of indicator lines built upon old bars (for example, 1 month old minute timeframe) can hardly be considered useful for making trade decisions. Besides, if there are a lot of bars in a chart window, time invested into the calculation and drawing of indicator lines is unreasonably large. This may be critical in program debugging, when a program is often compiled and then started. That is why it is necessary to conduct calculations not for the whole history, but for the limited part of the most recent bar history. For this purpose an external variable history is used in the following program. Value of this variable is taken into account when calculating index of the first (leftmost) bar, starting from which elements of indicator arrays must be calculated. Further calculations in while() loop will be conducted for the number of recent history bars not larger than History value. Note, the analyzed method of limiting a calculation history concerns only the part of calculations that are conducted in the first start of the special function start(). Further, when new bars appear, new parts of indicator lines will be added in the right part, while the image in the left part will be preserved. Thus the indicator line length will be increased during the whole indicator operation time. Common value of History parameter is considered approximately 5000 bars. Example of a simple custom indicator separatewindow. mq4. Indicator lines are drawn in a separate window. Similar calculation of an indicator line is performed in the technical indicator AverageTrue Range. Feige. 122 shows an indicator line constructed by the custom indicator separatewindow. mq4 in a separate window and an indicator line constructed by ATR in another window. In this case lines are fully identical because period of averaging is the same for both indicators - 5. If this parameter is changed in any of the indicators, the corresponding indicator line will also change. Feige. 122. drawing a custom indicator line in a separate window. Identical lines of a technical indicator (ATR) and a custom indicator (separatewindow. mq4 ). It is also evident that custom indicator line is constructed not for the whole screen width, but for 50 latest bars as specified in the external variable History. If a trader needs to use larger history interval, value of the external variable can be easily changed via the custom indicator settings window. Feige. 123 shows a security window, in which the indicator line us drawn in another style - as a histogram. For getting such a result one line was changed in the program code separatewindow. mq4 - other line styles are indicated: All other code parts are unchanged. Feige. 123. Drawing custom indicator line in a separate window (histogram). Similarity of drawings of a technical indicator (ATR) and a custom indicator (separatewindow. mq4 ). Shifting Indicator Lines Vertically and Horizontally In some cases it is necessary to shift an indicator line. It can be easily done by MQL4 means. Lets analyze an example, in which position of indicator lines in a security window are calculated in accordance with values specified by a user. Example of a custom indicator displacement. mq4. Shifting indicator lines horizontally and vertically. For adjusting lines shift in a chart, there are two external variables - LeftRight for horizontal shift of all lines and UpDown for shifting two dotted lines vertically. The algorithm used for calculating values of corresponding array elements is based on very simple rules: for shifting a line horizontally, assign the calculated value to an array element, the index of which is larger by LeftRight (for shifting to the right and less for shifting to the right) than the index of a bar, for which calculations are conducted for shifting a line vertically, UpDownPoint must be added (for shifting upwards or detracted for shifting downwards) to each value of an indicator array characterizing initial line position In the analyzed example indexes are calculated in the line: Here i is the index of a bar, for which calculations are performed, k is an index of an indicator array element. Red indicator line displayed by the client terminal based on the indicator array Line0 is shifted to the left by 5 bars (according to custom settings, see Fig. 124) from the initial line. In this case the initial line is a Moving Average with the period of averaging equal to 5 the formula of MA calculation is (HighiLowi)2 . In this example the position of the red line is the basis for the calculation of indicator array values for two other lines, i. e. their position on the chart. Dotted lines are calculated this way: Use of index k for elements of all indicator arrays allows to perform calculations for elements of arrays Line1, Line2 on the same bar as used for calculating values of the corresponding basic array Line0. As a result dotted lines are shifted relative to the red line by the value specified in the indicator settings window, in this case by 30 points (Fig. 124). Feige. 124. Red indicator line is shifted to the left by 5 bars. Dotted indicator lines are shifted relative to the red line by 30 points. Limitations of Custom Indicators There are some limitations in MQL4 that should be taken into account in the programming of custom indicators. There is a group of functions that can be used only in custom indicators and cannot be used in Expert Advisors and scripts: IndicatorBuffers(), IndicatorCounted (), IndicatorDigits(), IndicatorShortName(), SetIndexArrow(), SetIndexBuffer(), SetIndexDrawBegin(), SetIndexEmptyValue(), SetIndexLabel(), SetIndexShift(), SetIndexStyle(), SetLevelStyle(), SetLevelValue(). On the other hand, trade functions cannot be used in indicators: OrderSend(), OrderClose(), OrderCloseBy(), OrderDelete() and OrderModify(). This is because indicators operate in the interface flow (as distinct from Expert Advisors and scripts that operate in their own flow). This is also why algorithms based on looping cannot be used in custom indicators. Start of a custom indicator containing an endless loop (in terms of actual execution time) can result in client terminal hanging up with further necessity to restart a computer. The general comparative characteristics of Expert Advisors, scripts and indicators is contained in Table 2 .


No comments:

Post a Comment