Wednesday 18 October 2017

Gleitender Durchschnitt Ohne Puffer


Ich versuche, ein Matlabzuweisungsprojekt mit der folgenden Frage abzuschließen: Schreiben Sie eine Funktion namens movingaverage, die einen Skalar mit dem Namen x als Eingabeargument und einen Skalar zurückgibt. Die Funktion verwendet einen Puffer, um vorherige Eingaben zu speichern, und der Puffer kann maximal 25 Eingänge aufnehmen. Insbesondere muss die Funktion die letzten 25 Eingaben in einem Vektor (dem Puffer) speichern. Jedes Mal, wenn die Funktion aufgerufen wird, kopiert es das Eingabeargument in ein Element des Puffers. Sind bereits 25 Eingaben im Puffer gespeichert, verwirft es das älteste Element und speichert das aktuelle im Puffer. Nachdem sie die Eingabe im Puffer gespeichert hat, gibt sie den Mittelwert aller Elemente im Puffer zurück. Die Lösung, die ich bereitstellte, ist die folgende: Nach dem Auto Grader funktioniert meine Funktion richtig, wenn Werte 1-50 nacheinander passieren, aber scheitert, wenn Werte einer verrauschten Sinuswelle nacheinander durchlaufen (die ich informiert worden sein, Art eines Rundungsfehlers). Ich wäre Ihnen dankbar, wenn einige von Ihnen könnten mir einige Hinweise über die möglichen Fehler Schritte in meinem Code (siehe oben). Vielen Dank im VorausIs es möglich, einen gleitenden Durchschnitt in C ohne die Notwendigkeit für ein Fenster von Proben Ive gefunden, dass ich ein bisschen optimieren kann, indem Sie eine Fenstergröße, die eine Macht von zwei für Bit-Verschiebung statt der Teilung zu ermöglichen, Aber nicht brauchen einen Puffer wäre schön. Gibt es eine Möglichkeit, ein neues gleitendes Durchschnittsergebnis nur als Funktion des alten Ergebnisses und des neuen Beispiels auszudrücken, definieren Sie einen beispielhaften gleitenden Durchschnitt in einem Fenster von 4 Proben: Add new sample e: Ein gleitender Durchschnitt kann rekursiv implementiert werden , Aber für eine exakte Berechnung des gleitenden Durchschnitts müssen Sie sich an die älteste Eingangsabfrage in der Summe (dh die a in Ihrem Beispiel) erinnern. Für einen N-gleitenden Durchschnitt berechnen Sie: wobei yn das Ausgangssignal und xn das Eingangssignal ist. Gl. (1) können rekursiv geschrieben werden, also müssen Sie sich stets an die Stichprobe xn-N erinnern, um (2) zu berechnen. Wie von Conrad Turner angemerkt, können Sie stattdessen ein (unendlich langes) exponentielles Fenster verwenden, mit dem Sie die Ausgabe nur aus dem vergangenen Ausgang und dem aktuellen Eingang berechnen können. Dies ist jedoch kein normaler (ungewichteter) gleitender Durchschnitt, sondern ein exponentieller Wert Gewogenen gleitenden Durchschnitt, wo die Proben in der Vergangenheit ein geringeres Gewicht erhalten, aber (zumindest in der Theorie) man nie etwas vergessen (die Gewichte nur kleiner und kleiner für Proben weit in der Vergangenheit). Ich habe einen gleitenden Durchschnitt ohne einzelnen Element-Speicher für ein GPS-Tracking-Programm, das ich geschrieben habe. Ich beginne mit 1 Probe und dividiere durch 1, um die aktuelle Durchschn. Ich füge dann anothe Probe und dividiere durch 2 zu den aktuellen Durchschn. Das geht so lange weiter, bis ich auf die Länge des Durchschnitts komme. Jedes Mal danach, füge ich in der neuen Probe, erhalten Sie den Durchschnitt und entfernen Sie diesen Durchschnitt aus der Gesamtmenge. Ich bin kein Mathematiker, aber das schien ein guter Weg, es zu tun. Ich dachte, es würde den Magen eines echten Mathematik-Kerl, aber es stellt sich heraus, es ist eine der akzeptierten Möglichkeiten, es zu tun. Und es funktioniert gut. Denken Sie daran, dass je höher Ihre Länge, desto langsamer folgt es, was Sie folgen wollen. Das kann nicht die meiste Zeit, aber wenn folgende Satelliten, wenn Sie langsam sind, könnte die Spur weit von der tatsächlichen Position und es wird schlecht aussehen. Sie könnten eine Lücke zwischen dem Sat und den nachfolgenden Punkten haben. Ich wählte eine Länge von 15 aktualisiert 6 mal pro Minute, um eine ausreichende Glättung und nicht zu weit von der tatsächlichen Sat-Position mit den geglätteten Spur Punkte erhalten. Antwort # 2 am: November 16, 2010, um 23:03 Uhr Initialisierung insgesamt 0, count0 (jedes Mal, wenn ein neuer Wert dann ein Eingang (scanf), ein add totalnewValue, ein Inkrement (count), ein dividieren Durchschnitt (totalcount) Dies wäre ein gleitender Durchschnitt über Alle Eingänge Um den Durchschnitt über nur die letzten 4 Eingänge zu berechnen, benötigen Sie 4 Inputvariablen, vielleicht kopieren Sie jeden Eingang zu einem älteren inputvariable und berechnen dann den neuen gleitenden Durchschnitt als Summe der 4 Inputvariablen, geteilt durch 4 (Rechtsverschiebung 2 wäre Gut, wenn alle Eingänge waren positiv, um die durchschnittliche Berechnung beantwortet werden 3. Februar um 4:06 Das wird tatsächlich berechnen den Gesamtdurchschnitt und nicht den gleitenden Durchschnitt. Wenn Zähler größer wird der Einfluss eines neuen Eingangsprobe wird verschwindend kleiner ndash Hilmar Feb 3 15 um 13:53 Ihre Antwort 2017 Stack Exchange, IncMetaTrader 5 - Indikatoren Mittelung Preisreihe für Zwischenrechnungen ohne zusätzliche Puffer Einführung In meinem Artikel Die Prinzipien der ökonomischen Berechnung von Indikatoren Ich habe vernünftig überzeugende Tests, dass die Tatsache, dass nicht jede einzelne beweisen Ist der Aufruf eines benutzerdefinierten oder technischen Indikators in einem Code der optimale Weg, Zwischenrechnungen in einem entwickelten Indikator durchzuführen. Die endgültige Geschwindigkeit der Ausführung scheint viel niedriger zu sein, im Vergleich zu dem, was wir hätten, wenn wir den Code für Zwischenberechnungen direkt in unserem Indikator platziert hätten. Diese Art von Ansatz zum Schreiben eines Codes wäre sehr attraktiv, wenn es einfach genug wäre. Tatsächlich scheint es eine ernsthafte Komplikation eines Codes zu sein, die zusätzliche Puffer beschreibt, die verwendet werden, um Zwischenergebnisse der Berechnung zu speichern. Trotz der Vielfalt der Zwischenrechnungen, die am dringendsten in ihnen sind unterschiedliche Algorithmen der Mittelung. In den meisten Fällen können wir für sie einfache und universelle benutzerdefinierte Funktionen verwenden, die die Aufgabe des Schreibens eines solchen Codes wesentlich vereinfachen. Der Prozess der Erstellung dieser Funktionen und die Arbeit mit ihnen wird in diesem Artikel beschrieben werden. 1. Die allgemeine Idee der Funktionen der Mittelung, die mit einer Leiste arbeitet Der klassische Ansatz für die Mittelwertbildung auf einer aktuellen Leiste besteht aus einem Zwischenindikatorpuffer, den wir mit erforderlichen Informationen füllen und dann einen Bereich von vorherigen Werten auswählen, der gleich ist Die Mittelungsperiode und berechnen den Mittelwert. Die Prozedur für die Verarbeitung dieser Auswahl sieht wie folgt aus: SmoothVar (bar) Funktion (Var (bar - (n-1)), Var (bar - (n-2)) Var (bar)) SmoothVar (bar) gemittelte Parameterleiste Anzahl der Balken, für die die Berechnung durchgeführt wird Var (bar - (n-1)) Durchschnittliche Parameter mit einer Verschiebung auf (n-1) Balken n Anzahl Balken für die Mittelung. Ein solcher Ansatz zur Mittelung führt in unserem Fall zum Auftreten zweier Rechenzyklen. Im ersten Zyklus werden die Daten berechnet und in einen Zwischenpuffer gegeben. Im zweiten Zyklus wird die Mittelung unter Verwendung eines weiteren Zyklus der zusätzlichen Suche von Zellen des Indikatorpuffers auf der Basis der oben vorgeschlagenen Formel durchgeführt. Diese Berechnung wird viel einfacher aussehen, wenn wir die Auswahl von Zwischendaten innerhalb der Funktion selbst akkumulieren. In diesem Fall sieht die Funktion der Mittelung folgendermaßen aus: SmoothVar (bar) Funktion (Var (bar), bar) Ein neuer Wert Var (bar) wird in die Auswahl von Werten innerhalb der Funktion auf einer aktuellen Leiste geschrieben Werden die Werte von Var (bar - n), die unnötig werden, aus der Auswahl gelöscht. Mit diesem Ansatz sieht ein Code der Mittelung ziemlich trivial aus und erfordert keine zusätzlichen Indikatorpuffer. Innerhalb der Funktion speichert das Array die notwendigen Datenmengen, die für die Berechnung eines Strichs erforderlich sind, nicht aber die gesamten Historiendaten. In diesem Fall gibt es auch nur einen Zyklus der Datenberechnung. Es sei darauf hingewiesen, dass, um diese Funktion der Mittelung auf einen aktuellen Balken aufzurufen, sollten Sie es auf alle vorherigen Takte zuerst aufrufen 2. Die klassische Mittelung als ein Beispiel für die Umsetzung einer Funktion, die mit einer Bar arbeitet Solche Funktionen der Mittelung sollten enthalten Variablen, die ihre Werte nicht zwischen den Aufrufe dieser Funktionen verlieren müssen. Darüber hinaus kann die Ein-Typ-Mittelung mit verschiedenen Parametern in einem Code für viele Male verwendet werden, um einen Konflikt der Nutzung von Shared-Memory-Ressourcen zu vermeiden, sollten wir diese Funktionen als Klassen implementieren und das ist, was Ive getan. Die Algorithmen der klassischen Mittelung sind in der Klasse CMovingAverage beschrieben: Diese Klasse wird von der Basisklasse CMovSeriesTools abgeleitet, die zusätzliche geschützte Funktionen-Methoden und eine Überprüfung der Korrektheit der Periode gleitender Mittelwerte enthält. Die Basisklasse enthält einen zusätzlichen universellen Code, der in allen Klassen verwendet wird, die ich vorschlägt, und es gibt keinen Sinn, es für viele Male zu den abgeleiteten Klassen zu kopieren. In angewandten Aufgaben der Verwendung der Mittelung werden die geschützten Klassenmitglieder nicht explizit verwendet, sodass sie ihre Übersicht zunächst aussetzen können. Die Klasse CMovingAverage besteht aus fünf Einzeltyp-Funktionen der Mittelung, deren Namen für sich selbst sprechen, und sie müssen nicht im Detail beschrieben werden. Die erste Funktion MASeries () ist eine ganzzahlige Sammlung von vier weiteren Funktionen, die es ermöglicht, einen Algorithmus der Mittelung mit dem Parameter MAMethod auszuwählen. Der Code der Algorithmen der Mittelung ist für maximale Leistung optimiert und deshalb werden die Hauptparameter der Funktionen (Länge, Reihe, Balken) um zusätzliche Parameter beginnend, vorberechnet, ratestotal und set ergänzt, deren Zweck absolut identisch ist Die Indikatorvariablen mit denselben Namen. Der Parametersatz setzt das Kennzeichen der Indizierung von Elementen einer Preisreihenreihe in den Funktionen der Mittelung gleich wie die Arrays von Variablen. Wir sollten bedenken, dass alle Mittelungsfunktionen dieser Klasse den Parameter Length fix haben und er kann nicht geändert werden, wenn der Programmcode ausgeführt wird. Die Funktion EMASeries () der Klasse CMovingAverage hat diesen Parameter vom Typ double Jetzt, wie wir kennengelernt haben Mit der Klasse CMovingAverage. Können wir es in Indikatoren verwenden. Verwenden Sie dazu die include-Direktive, und fügen Sie den Inhalt der MASeriesCls. mqh-Datei auf dem globalen Gültigkeitsbereich zu dem zu entwickelnden Code des Indikators hinzu: Dann sollten Sie die erforderliche Anzahl von Mittelungsprozeduren im Indikatorcode und dann im OnCalculate ermitteln () - Teil (bevor die Schleifenoperatoren und die geschweiften Klammern) die statischen Variablen der CMovingAverage-Klasse entsprechend der erforderlichen Anzahl von Prozeduren der Mittelung deklarieren. Für jede Prozedur der Mittelung muss eine separate Variable der Klasse und eine separate Zelle im Array der Klasse vorhanden sein. Die Variablen der Klasse in der Funktion OnCalculate () werden als statische deklariert, da ihre Werte zwischen den Aufrufe dieser Funktion gehalten werden müssen. Jetzt können wir mit der Mittelung beginnen. Als Beispiel, Im gehend, vier aufeinander folgende Verfahren der Mittelung der Preisreihe zu zeigen - SMAEMASMMALWMA (der Indikator MAx4.mq5): Das Ergebnis jeder vorherigen Mittelung (mit Ausnahme der letzten) wird in den nächsten Algorithmus der Mittelung und das Finale verwendet Ergebnis wird an den Indikatorpuffer übergeben. Ich denke, der wichtigste Teil dieses Codes ist sehr sorgfältige vorläufige Initialisierung von Variablen von Indizes, die den Beginn der zuverlässigen Bars zeigen. In dieser Situation sieht es wie folgt aus: Beachten Sie, dass in dieser Situation der LWMA-Algorithmus der Mittelung der letzte ist und er nichts beeinflusst, aber wenn er werent der letzte wäre, dann wäre die Verschiebung des Beginns der zuverlässigen Information gleich Auf Länge41, nicht Länge4 Ich möchte hinzufügen, wenn seine nicht klar aus dem vorherigen Code, die Anzahl der zuverlässigen Informationen beginnt, nehmen Sie eine größere Zahl und dann verringern Sie es experimentell, wenn nötig. 3. Vergleich des Indikators, der mit Klassen erzeugt wird, mit seinen Analogen, die technische und kundenspezifische Indikatoren verwenden Es wäre sehr interessant, die Leistung des erzeugten Indikators MAx4.mq5 mit dem identischen analogen (iMAx4.mq5) zu vergleichen, das den technischen Indikator iMA () . Sobald wir entschieden haben, den Test durchzuführen, ist es sinnvoll, einen anderen Indikator (MAx3x1.mq5) ähnlich MAx4.mq5 auszuprobieren, jedoch mit der ersten Mittelung, die mit dem Aufruf des technischen Indikators iMA () und dem Andere drei mit der Klasse CMovingAverage. Und sobald der Standardsatz der Indikatoren des Client-Terminals den Custom Moving Average. mq5-Indikator enthält, habe ich einen anderen analogen Indikator auf seinen Basen für Testzwecke (cMAx4.mq5) gemacht. Für die bevorstehende Analyse bereitete ich für den Test Expert Advisors: MAx4Test. mq5, iMAx4Test. mq5, MAx3x1Test. mq5 und cMAx4Test. mq5 jeweils. Die Bedingungen für die Durchführung dieser Tests wurden im Einzelnen in dem Artikel The Principles of Economic Calculation of Indicators beschrieben. In diesem Artikel werde ich nicht die Details des Tests zu beschreiben, aber Im werde die endgültigen Ergebnisse der Ausführung aller vier Expert Advisor in der Strategie-Tester für die letzten 12 Monate auf EURUSD 4 mit Modellierung von jeder Zecke und den Wert zu zeigen Der Periodeneingabeparameter aller EAs gleich 500. Die schlechtesten Ergebnisse in unseren Tests werden durch den Indikator angezeigt, der benutzerdefinierte Indikatoren aufruft, daher kann diese Variante des Schreibens eines Codes nur für die Faulen empfohlen werden. Natürlich kommt ein anderer Führer zuletzt Aber eine, die auf Anrufe von technischen Indikatoren basiert, hat viel bessere Ergebnisse, aber sie sind zu weit von einem Ideal. Der wirkliche Führer der Tests ist der Indikator, der unter Verwendung von Klassen entwickelt wird. Der Hybrid, der Klassen und technische Indikatoren verwendet, hat den zweiten Platz, aber es passiert nicht immer, wenn die Zeit des Testens eines Indikators entscheidend ist, dann ist es besser, solche Varianten zu überprüfen Persönlich für jede Situation. Überblick über implementierte Klassen der Mittelung Die zuvor beschriebene Klasse CMovingAverage umfasst fünf Algorithmen der Mittelung. Die Klasse CCMO enthält Algorithmen für Mittelung und Oszillator. Die anderen Klassen umfassen einzelne Algorithmen der Mittelung. Die Ideologie der Verwendung einer der vorgeschlagenen Klassen ist absolut die gleiche für das Verfahren der Verwendung der Klasse CMovingAverage oben beschrieben. Der Code aller Mittelungsalgorithmen (mit Ausnahme des parabolischen) ist für eine maximale Ausführungsgeschwindigkeit optimiert. Der Code der parabolischen Mittelung wurde aufgrund der Komplexität dieses Prozesses nicht optimiert. Die letzten drei Algorithmen stellen keine Mittelung dar. Ive fügte sie wegen ihrer hohen Popularität und Kompatibilität mit den Arbeiten der populären technischen Analytiker hinzu. Für ein besseres Verständnis von Informationen ist es besser, die Mittelungsalgorithmen in separaten. mqh-Dateien darzustellen und für die praktische Anwendung, die beste Variante ist, sie in einer einzigen Datei zu haben. Für die Verwendung von Indikatoren werden alle vorgeschlagenen Klassen in die einzelne Datei SmoothAlgorithms. mqh gepackt. Zusätzlich dazu wird die Datei mit den Funktionen der iPriceSeries. mqh-Datei ergänzt. Nur die PriceSeries () - Funktion wird in Beispielen dieses Artikels verwendet: Diese Funktion ist für die Arbeit mit Indikatoren Basen für die Verwendung der zweiten Art der Aufruf der OnCalculate () - Funktion gedacht. Der Grundgedanke, diese Funktion zu schaffen, besteht darin, die Menge der Preis-Zeitreihen der Enumeration ENUMAPPLIEDPRICE mit benutzerdefinierten Varianten zu erweitern. Die Funktion liefert den Wert eines Preis-Timeeries durch seine Zahl, die von 1 bis 11 variiert. 4. Praktische Beispiele für die Implementierung eines Programmcodes unter Verwendung der Averaging-Klassen Wenn es genug ist, um ein anderes Beispiel für die Verwendung der anderen Klassen zu zeigen, um sicherzustellen, dass Alles geschieht auf dieselbe Weise wie bei der vierfachen Mittelung. Ich gehe zu zeigen, eine Variante der Implementierung der Funktion OnCalculate () in einem Analog der CCI-Indikator mit den Klassen CJJMA und CJurX (JCCX. mq5) Aber dieses Mal habe ich die entsprechenden Klassen aus einer anderen Datei auf dem globalen Bereich in den Code Der Indikator: Nun, ich möchte Ihre Aufmerksamkeit auf eine andere Sache zu halten. Die Sache ist eine riesige Anzahl von Indikatoren können als Funktionen einer Bar dargestellt werden, die wirklich bequem, mit Klassen zu arbeiten. Zum Beispiel wäre es interessant, den Bollinger-Kanal auf der Basis des gleitenden Durchschnitts Vidya von Tushar Chande zu zeichnen. In diesem Fall werden zwei Klassen CCMO und CStdDeviation verwendet. Mit der ersten Klasse erhalten wir den Wert des gleitenden Mittelwertes VIDYA und mit dem zweiten den Wert der Standardabweichung der Preisreihe für den gleitenden Durchschnitt. Danach verwenden wir diese Abweichung für die Berechnung der oberen und unteren Grenze des Kanals: So erhielten wir eine einfache und kleine Klasse Die letzten drei Eingabeparameter der Funktion VidyaBandsSeries () übergeben die notwendigen Werte des Kanals über einen Link . Ich möchte anmerken, dass Sie in diesem Fall die Variablen der Klassen innerhalb der Funktion VidyaBandsSeries () nicht deklarieren und statisch machen können, da statische Variablen in Klassen eine ganz andere Bedeutung haben. Deshalb muss diese Deklaration über den globalen Geltungsbereich der Klasse erfolgen: In einem normalen Bollinger-Kanal sind die Zeitspanne der Mittelung des gleitenden Durchschnitts und die Zeitspanne der Mittelung des Kanals selbst immer gleich. In dieser Klasse haben Ive diese Parameter getrennt, um Ihnen mehr Freiheit (EMAperiod und BBLength). Die Indikator selbst (VidyaBBands. mq5) auf der Grundlage dieser Klasse ist so einfach in der Verwendung der Klasse CVidyaBands, die wir nicht brauchen, um seinen Code in dem Artikel zu analysieren. Solche Klassen von Indikatorfunktionen sollten in einer separaten mqh-Datei platziert werden. Ich habe solche Funktionen in der Datei IndicatorsAlgorithms. mqh platziert. 5. Vergleich der Leistung eines Indikators, der Klassen mit einem einsetzt, der nicht zuerst möchte Ich möchte herausfinden, wie die Verwendung von Klassen beim Schreiben eines Codes eines Indikators seine Leistung verringert Zu diesem Zweck wird der Code des Indikators JJMA. mq5 wurde ohne Verwendung der Klassen (JMA. mq5) geschrieben. Dann wurde es unter den gleichen Bedingungen wie im vorhergehenden Test getestet. Die endgültigen Ergebnisse der Tests haben keinen großen Unterschied: Natürlich gibt es einige zusätzliche Gebühren für die Verwendung der Klassen, aber sie sind nicht signifikant im Vergleich zu den Vorteilen, die sie bieten. 6. Vorteile der Verwendung der Klassen der Mittelung Ein Vorteil der Verwendung dieser Algorithmen, die wirklich überzeugend ist, besteht darin, dass das Ersetzen von Anrufen von technischen und kundenspezifischen Indikatoren zu einer großen Leistungssteigerung des entwickelten Code führt, der oben beschrieben ist. Ein weiterer praktischer Vorteil solcher Klassen ist eine große Bequemlichkeit, sie zu benutzen. Zum Beispiel scheint alles, was im populären Buch von William Blau Momentum, Direction und Divergence beschrieben wird, ein echtes Testfeld für diese Art von Ansatz zum Schreiben von Indikatoren zu sein. Der Code der Indikatoren kommt als maximal komprimiert, verständlich und oft aus einem einzigen Zyklus der Neuberechnung der Balken. Sie können leicht entwickeln alle Indikator - eine klassische oder technische, mit den alternativen Methoden der Mittelung. Eine ziemlich große Vielfalt der Algorithmen der Mittelung bietet weitreichende Möglichkeiten für die Schaffung nicht-traditionellen Handelssysteme, oft mit einer frühen Erkennung von Trends und kleinere Anzahl von falschen Triggering. 7. Einige Empfehlungen zur Verwendung der Mittelungsalgorithmen in einem spezifischen Indikatorcode Ein kurzer einzelner Blick auf jeden Indikator, der mit verschiedenen hier beschriebenen Mittelungsalgorithmen entwickelt wird, reicht aus, um zu verstehen, wie verschieden diese Algorithmen sind. Daher wäre es vernünftig anzunehmen, dass nicht alle der vorgeschlagenen Algorithmen in jeder Situation gleich gut sind. Obwohl es schwierig wäre, eine strenge Grenze der Verwendung des einen oder anderen Algorithmus zu bestimmen, ist es möglich, Ihnen einige allgemeine Empfehlungen zur Verwendung zu geben. Beispielsweise sind die Algorithmen von Tushar Chande und Kaufman zur Bestimmung von Trendsituationen vorgesehen und eignen sich nicht für eine zusätzliche Glättung zum Zweck der Rauschfilterung. Daher ist es besser, entweder unverarbeitete Preisreihen oder Indikatorwerte ohne Mittelwert zu diesen Algorithmen einzugeben. Hier ist das Ergebnis der Verarbeitung der Werte des Indikators Momentum mit dem Kaufmans-Algorithmus (der Indikator 4cMomentumAMA. mq5) Ich denke, dass die Algorithmen der klassischen Mittelung keine besonderen Empfehlungen benötigen. Ihr Einsatzgebiet ist ziemlich breit. Überall dort, wo diese Algorithmen verwendet werden, können Sie erfolgreich die vier linken Algorithmen (JMA, T3, ultralinear und parabolisch) verwenden. Hier ist ein Beispiel für die MACD-Anzeige, bei der EMA und SMA durch die JMA-Mittelung ersetzt werden (der Indikator JMACD. mq5): Und hier ist das Ergebnis der Glättung des berechneten Indikators anstatt seinen Algorithmus der Mittelung für eine bessere Bestimmungsqualität zu ändern Die aktuelle Tendenz (der Indikator JMomentum. mq5): Es ist keine Überraschung, dass sich das Verhalten der Märkte ständig ändert daher wäre es naiv zu denken, dass Sie den einen und den einzigen idealen Algorithmus für einen bestimmten Teil des Finanzmarktes jetzt finden können und Für immer Alas Nichts in dieser Welt dauert ewig Dennoch, wie für mich zum Beispiel, auf diesem ewig ändernden Markt ich oft die Indikatoren der schnellen und mittelfristigen Trends wie JFATL. mq5 und J2JMA. mq5. Im ziemlich mit Vorhersagen auf ihrer Basis zufrieden. Eine andere Sache, die ich hinzufügen möchte. Die Mittelungsalgorithmen sind wiederverwendbar. Gute Ergebnisse können erzielt werden, wenn wiederholte Mittelung auf bereits gemittelte Werte angewendet wird. In der Tat, in diesem Artikel begann ich analysieren den Prozess der Zeichnung von Indikator aus ihm (der Indikator MAx4.mq5). 8. Die allgemeine Idee, Code der Algorithmen der Mittelung zusammenzustellen Und jetzt am Ende des Artikels, möchte ich Ihre Aufmerksamkeit auf den Mechanismus der Funktionen der Mittelung selbst bezahlen. Zunächst umfassen die meisten Algorithmen der Mittelung dynamische Arrays von Variablen vom Typ mSeriesArray zum Speichern der Werte der Eingangsparameterserien. Sobald die für die Berechnung relevanten Informationen angezeigt werden, sollten Sie den Speicher für ein solches Array einmalig zuweisen. Dies geschieht über die Funktion SeriesArrayResize () der Klasse CMovSeriesTools. Dann sollten Sie auf jeder Leiste den aktuellen Wert der Preisreihenfolge auf den ältesten Wert des Arrays schreiben und die Nummer seiner Position in der Variable mcount speichern. Dies geschieht über die Funktion RecountArrayZeroPos () der Klasse CMovSeriesTools. Wenn wir nun ein Element mit relativer Verschiebung zum aktuellen Element finden müssen, verwenden wir die Funktion RecountArrayNumber () der Klasse CMovSeriesTools: Normalerweise wird in solchen Situationen das neueste Element in eine Nullposition geschrieben und die anderen ( Außer dem ältesten) werden vorläufig auf die nächsten Positionen umgeschrieben, aber sie sparen nicht die Computerressourcen, und der oben beschriebene komplexere Ansatz scheint rationaler zu sein. Zusätzlich zu den Algorithmen der Mittelung enthalten die Körper dieser Funktionen Die Aufrufe von Funktionen, die für die Bestimmung von Stabpositionen relativ zu dem Beginn der Berechnung von Balken verwendet werden: der Zeitpunkt, zu dem genügend Informationen für die Startinitialisierung von Variablen vorhanden sind: und Situationen, in denen der letzte Balken geschlossen ist: Die erste Überprüfung bestimmt eine Situation, wenn dort Sind nicht genug Balken, damit die Mittelungsfunktion funktioniert, und es gibt ein leeres Ergebnis zurück. Sobald die zweite Prüfung erfolgreich bestanden ist und genügend Daten für die erste Berechnung vorliegen, wird die Initialisierung der Variablen einmal durchgeführt. Für die korrekte Mehrfachverarbeitung von Werten auf dem aktuellen nicht geschlossenen Balken sind zwei letzte Prüfungen erforderlich. Ich habe es bereits in meinem Artikel widmet sich der Optimierung eines Programmcodes beschrieben. Und nun ein paar Worte über die Optimierung des Programmcodes solcher Funktionen für die maximale Performance. Zum Beispiel bedeutet der SMA-Algorithmus die Mittelung der ausgewählten Werte einer Periode einer Preisreihe auf jedem Balken. Diese Werte werden buchstäblich summiert und durch die Periode auf jedem Balken geteilt. Aber die Differenz zwischen der Summe auf der vorherigen Balken und der Summe auf der aktuellen Balken ist die erste wird mit dem Wert der Preisreihe mit einer Verschiebung auf eine Periode in Bezug auf die aktuelle Periode und die zweite summiert - mit dem aktuellen Wert . Daher wäre es sehr rational, diese Summe nur einmal während der Initialisierung von Funktionen zu berechnen, und dann auf jede Balke nur neue Werte der Preisserie zu dieser Summe zu addieren und die ältesten Werte von ihr zu subtrahieren. Genau dies geschieht in einer solchen Funktion. Fazit Vorgeschlagen in den Artikel-Implementierungen der Algorithmen der Mittelung mit den Klassen sind einfach, single-type und universal, so dass Sie keine Probleme haben, sie zu studieren. Die dem Artikel beigefügten Archive enthalten eine Vielzahl von Beispielen für ein besseres Verständnis dieses Ansatzes zum Schreiben von Code von Indikatoren. Im Archiv Includeen. zip werden alle Klassen in Dateien verteilt. Das Archiv Includeen. zip enthält nur zwei Dateien, die ausreichen, um alle Indikatoren im Archiv Indicators. zip zu kompilieren. Die Gutachter für den Test befinden sich im Archiv Experts. zip.

No comments:

Post a Comment