Moving Average Code Probe

MetaTrader 4 - Experts Moving Average - Experte für MetaTrader 4 Der Moving Average Experte für die Bildung von Handelssignalen verwendet einen gleitenden Durchschnitt. Das Öffnen und Schließen von Positionen erfolgt, wenn der gleitende Durchschnitt den Preis an der kürzlich geformten Bar erfüllt (Barindex entspricht 1). Die Losgröße wird nach einem speziellen Algorithmus optimiert. Der Fachberater analysiert die Übereinstimmung des gleitenden Durchschnitts und des Marktpreisplans. Die Überprüfung erfolgt durch die Funktion CheckForOpen (). Wenn der gleitende Durchschnitt die Bar so trifft, dass der erstere höher als der offene Preis ist, aber niedriger als der Preis ist, wird die KAUF-Position eröffnet. Wenn der gleitende Durchschnitt die Bar so trifft, dass der erstere niedriger ist als der offene Preis, aber höher als der Preis, wird die SELL-Position eröffnet. Money Management, das im Experten verwendet wird, ist sehr einfach, aber effektiv: Die Kontrolle über jedes Positionsvolumen wird in Abhängigkeit von den bisherigen Transaktionsergebnissen durchgeführt. Dieser Algorithmus wird durch die Funktion LotsOptimized () implementiert. Die grundsätzliche Losgröße wird auf Basis des maximal zulässigen Risikos berechnet: Der Parameter MaximumRisk zeigt den Grundrisikoprozentsatz für jede Transaktion an. Es besitzt gewöhnlich einen Wert zwischen 0,01 (1) und 1 (100). Zum Beispiel, wenn freie Marge (AccountFreeMargin) entspricht 20.500 und Regeln der Kapitalverwaltung verschreiben, um das Risiko von 2 zu verwenden, wird die grundlegende Losgröße 20500 0,02 1000 0,41 machen. Es ist sehr wichtig, über die Losgrößengenauigkeit zu kontrollieren und das Ergebnis mit den zulässigen Werten zu normalisieren. Normalerweise sind Bruchstücke mit einem Schritt von 0,1 erlaubt. Eine Transaktion mit einem Volumen von 0,41 wird nicht durchgeführt. Zur Normalisierung wird die Funktion NormalizeDouble () mit Genauigkeit bis zu 1 Zeichen nach dem Punkt verwendet. Daraus ergibt sich das Grundgehalt von 0,4. Die grundsätzliche Losberechnung auf Basis der freien Marge ermöglicht es, die Betriebsvolumina je nach Handelserfolg zu erhöhen, d. H. Mit dem Reinvestieren zu handeln. Dies ist der grundlegende Mechanismus mit obligatorischem Kapitalmanagement für die Erhöhung der Handelsdurchdringung. DecreaseFactor ist das Ausmaß, in dem die Losgröße nach dem unrentablen Handel reduziert wird. Normalwerte sind 2,3,4,5. Wenn die vorangegangenen Transaktionen unrentabel waren, werden die nachfolgenden Volumina um den Faktor DecreaseFactor abnehmen, um durch die unrentable Periode zu warten. Dies ist der Hauptfaktor im Kapitalmanagement-Algorithmus. Die Idee ist ganz einfach: Wenn der Handel erfolgreich steigt, arbeitet der Experte mit dem Grundsatz, der maximalen Gewinn macht. Nach der ersten unrentablen Transaktion wird der Experte die Geschwindigkeit reduzieren, bis eine neue positive Transaktion erfolgt. Der Algorithmus erlaubt es, die Geschwindigkeit zu reduzieren, um es zu tun, man muss DecreaseFactor 0 angeben. Die Anzahl der letzten aufeinanderfolgenden, unrentablen Transaktionen wird in der Handelsgeschichte berechnet. Das Basis-Los wird auf dieser Basis neu berechnet: So erlaubt der Algorithmus, das durch eine Reihe von unrentablen Transaktionen auftretende Risiko effektiv zu reduzieren. Die Losgröße wird zwingend auf die minimal zulässige Losgröße am Ende der Funktion überprüft Die bisher vorgenommenen Berechnungen können zu Los 0 führen: Der Experte ist vor allem für die Arbeit mit der täglichen Periode und im Testmodus gedacht - um zu engen Preisen zu arbeiten. Es wird nur bei der Eröffnung einer neuen Bar handeln, deshalb werden die Modi der Every-Tick-Modellierung nicht benötigt. Testergebnisse sind im Bericht dargestellt. Ich weiß, das ist erreichbar mit Boost wie pro: Aber ich möchte wirklich vermeiden, Boost. Ich habe gegoogelt und fand keine geeigneten oder lesbaren Beispiele. Grundsätzlich möchte ich den gleitenden Durchschnitt eines laufenden Stroms eines Stroms von Gleitkommazahlen mit den aktuellsten 1000 Zahlen als Datenmuster verfolgen. Was ist der einfachste Weg, um dies zu erreichen, experimentierte ich mit einem kreisförmigen Array, einem exponentiellen gleitenden Durchschnitt und einem einfacheren gleitenden Durchschnitt und fand, dass die Ergebnisse aus dem kreisförmigen Array meinen Bedürfnissen am besten entsprechen. Gefragt am 12. Juni 12 um 4:38 Wenn Ihre Bedürfnisse einfach sind, können Sie nur versuchen, einen exponentiellen gleitenden Durchschnitt. Setzen Sie einfach, Sie machen eine Akkumulator-Variable, und wie Ihr Code bei jedem Sample sieht, aktualisiert der Code den Akkumulator mit dem neuen Wert. Sie wählen eine konstante Alpha, die zwischen 0 und 1 ist, und berechnen Sie diese: Sie müssen nur einen Wert von Alpha zu finden, wo die Wirkung einer bestimmten Probe nur für etwa 1000 Proben dauert. Hmm, Im nicht wirklich sicher, dass dies für Sie geeignet ist, jetzt, dass Ive es hier. Das Problem ist, dass 1000 ist ein ziemlich langes Fenster für einen exponentiellen gleitenden Durchschnitt Im nicht sicher, es gibt ein Alpha, die den Durchschnitt über die letzten 1000 Zahlen, ohne Unterlauf in der Gleitkomma Berechnung zu verbreiten würde. Aber wenn du einen kleineren Durchschnitt wünschst, wie 30 Zahlen oder so, das ist eine sehr einfache und schnelle Möglichkeit, es zu tun. Antwortete Jun 12 12 um 4:44 1 auf deinem Post. Der exponentielle gleitende Durchschnitt kann das Alpha variabel sein. So kann es verwendet werden, um Zeitbasis-Mittelwerte (z. B. Bytes pro Sekunde) zu berechnen. Wenn die Zeit seit dem letzten Akkumulator-Update mehr als 1 Sekunde ist, lassen Sie Alpha 1,0 sein. Andernfalls kannst du alpha sein (usecs seit letztem update1000000). Ndash jxh Grundsätzlich möchte ich den gleitenden Durchschnitt eines laufenden Stroms eines Stroms von Gleitkommazahlen mit den aktuellsten 1000 Zahlen als Datenmuster verfolgen. Beachten Sie, dass die unten genannte Gesamtsumme als Elemente als addreplaced, Vermeidung kostspieliger O (N) Traversal, um die Summe zu berechnen - benötigt für die durchschnittliche - on demand. Insgesamt wird ein anderer Parameter von T verwendet, um z. B. Mit einer langen langen, wenn insgesamt 1000 lang s, ein int für char s, oder ein doppeltes bis total float s. Dies ist ein bisschen fehlerhaft, dass Numsamples an INTMAX vorbeikommen könnten - wenn man sich vorstellt, dass man eine langjährige langjährige langwierige Zeit haben könnte. Oder verwenden Sie ein zusätzliches bool Datenelement, um aufzuzeichnen, wenn der Container zum ersten Mal gefüllt wird, während er Numsamples um das Array herumtreibt (am besten dann umbenannt etwas Unschuldiges wie Pos). Antwortete am 12. Juni 12 um 5:19 man geht davon aus, dass der Quanten-Operator (T-Stichprobe) tatsächlich quasi Operator (T-Probe) ist. Ndash oPless Jun 8 14 um 11:52 oPless ahhh. Gut beobachtet. Eigentlich habe ich gedacht, dass es nicht leer ist () (T Probe), aber natürlich könntest du auch immer Notizen verwenden, die du mochst. Werde reden, danke Ndash Tony D Juni 8 14 bei 14: 27 Ich möchte die Berechnung für den Aktienkurs im Durchschnitt entwickeln. Aber viel komplexe Berechnung wurde später geplant. Mein erster Schritt zu wissen, wie man Moving Average effizient berechnen kann. Ich muss wissen, wie man die Input-und Return-Output effizient zu nehmen. Als Eingang Datum und Preis. Konsumierte Ausgabe Datum, Preis und Moving Average. Wenn ich 500 Datensätze habe und ich will, um zu berechnen Moving Average für 5 Tage was ist der effiziente Weg, anstatt hin und her zu gehen in der Array von Datum und Preis wieder zu vermeiden, was ist der beste Weg, um Eingang zu erhalten (ArrayList, Tabelle, Array Etc) und return output. Anmerkung: Die heutige MA von 5 Tagen wird der Durchschnitt der letzten 5 Tage einschließlich des heutigen Preises sein. Gestern wird MA der Durchschnitt der letzten 5 Tage von gestern sein. Ich möchte die Tage bleiben, um flexibel zu sein, anstatt 5 könnte es 9, 14, 20 usw. sein. Donnerstag, 10. April 2008 um 15:21 Uhr Wenn du eine einfache Berechnung ohne deine Mühe benötigst, kannst du TA-Lib benutzen. Aber wenn Sie möchten, dass Ihre Berechnung effizienter als TA-Lib ist, dann können Sie Ihren eigenen technischen Indikator erstellen. TA-Lib ist großartig, aber Problem ist, dass diese Bibliothek nur statische Methoden hat. Das heißt, wenn Sie SMA-Array-Werte auf der Grundlage von 500 Preisscheinen berechnen müssen, dann werden Sie das gesamte Array von Bars senden und es wird Array von SMA-Werten zurückgeben. Aber wenn du neue 501-st-Wert bekommst, dann solltest du wieder das ganze Array senden und TA-Lib wird wieder rechnen und SMA-Array von Werten zurückgeben. Stellen Sie sich jetzt vor, Sie brauchen einen solchen Indikator auf echten Preisfutter, und für jede Preisänderung benötigen Sie einen neuen Indikatorwert. Wenn Sie einen Indikator haben, ist kein großes Problem, aber wenn Sie Hunderte Indikatoren arbeiten, könnte es ein Performance-Problem sein. Ich war in einer solchen Situation und fange an, Echtzeit-Indikatoren zu entwickeln, die effizient sind und zusätzliche Berechnungen für neue Preisleisten oder für geänderte Preisscheine machen. Unglücklicherweise brauchte ich nie SMA-Indikator für meine Handelssysteme, aber ich habe solche für EMA, WMA, AD und andere. Ein solcher Indikator AD wird auf meinem Blog veröffentlicht und man kann von dort aus sehen, was die Grundstruktur meiner Echtzeit-Indikator-Klasse ist. Ich hoffe, dass Sie kleine Änderungen benötigen, um SMA-Indikator zu implementieren, denn ist einer der einfachsten. Die Logik ist einfach. Um SMA zu berechnen, benötigen Sie nur n letzte Preiswerte. So Klasseninstanz wird eine Sammlung von Preisen haben, die speichern wird nur die letzten n Anzahl der Preise halten, wie SMA definiert ist (in Ihrem Fall 5). Wenn du also eine neue Bar hast, wirst du die älteste entfernen und neue hinzufügen und die Berechnung erstellen. Donnerstag, 10. April 2008 16:04 Alle Antworten Es gibt eine Bibliothek namens TA-Lib, die alles für dich macht und es ist Open Source. Es hat etwa 50 Indikatoren, die ich denke. Weve hat es in der Produktionsumgebung verwendet und es ist sehr effizient und realibel. Sie können es in C, Java, C, etc. verwenden. Wenn Sie einfache Berechnung ohne Ihre Bemühung benötigen, als Sie TA-Lib verwenden können. Aber wenn Sie möchten, dass Ihre Berechnung effizienter als TA-Lib ist, dann können Sie Ihren eigenen technischen Indikator erstellen. TA-Lib ist großartig, aber Problem ist, dass diese Bibliothek nur statische Methoden hat. Das heißt, wenn Sie SMA-Array-Werte auf der Grundlage von 500 Preisscheinen berechnen müssen, dann werden Sie das gesamte Array von Bars senden und es wird Array von SMA-Werten zurückgeben. Aber wenn du neue 501-st-Wert bekommst, dann solltest du wieder das ganze Array senden und TA-Lib wird wieder rechnen und SMA-Array von Werten zurückgeben. Stellen Sie sich jetzt vor, Sie brauchen einen solchen Indikator auf echten Preisfutter, und für jede Preisänderung benötigen Sie einen neuen Indikatorwert. Wenn Sie einen Indikator haben, ist kein großes Problem, aber wenn Sie Hunderte Indikatoren arbeiten, könnte es ein Performance-Problem sein. Ich war in einer solchen Situation und fange an, Echtzeit-Indikatoren zu entwickeln, die effizient sind und zusätzliche Berechnungen für neue Preisleisten oder für geänderte Preisscheine machen. Unglücklicherweise brauchte ich nie SMA-Indikator für meine Handelssysteme, aber ich habe solche für EMA, WMA, AD und andere. Ein solcher Indikator AD wird auf meinem Blog veröffentlicht und man kann von dort aus sehen, was die Grundstruktur meiner Echtzeit-Indikator-Klasse ist. Ich hoffe, dass Sie kleine Änderungen benötigen, um SMA-Indikator zu implementieren, denn ist einer der einfachsten. Die Logik ist einfach. Um SMA zu berechnen, benötigen Sie nur n letzte Preiswerte. So Klasseninstanz wird eine Sammlung von Preisen haben, die speichern wird nur die letzten n Anzahl der Preise halten, wie SMA definiert ist (in Ihrem Fall 5). Wenn du also eine neue Bar hast, wirst du die älteste entfernen und neue hinzufügen und die Berechnung erstellen. Donnerstag, 10. April 2008 16:04 Ich würde den gleitenden Durchschnitt in der Datenbank über eine gespeicherte Prozedur oder in einen Würfel berechnen. Haben Sie Analysis Services gesehen, hat es die Möglichkeit, gleitende Durchschnitte zu berechnen. Donnerstag, 10. April 2008 16:05 Ja. TA-LIB ist gut, aber vielleicht nicht für mich geeignet. Wenn ich neuen Wert oder aktualisierten Wert für die Geschichte der Datensätze Ich werde die Berechnung in einer separaten Funktion nur für das neue Angebot und speichern Sie es in der Datenbank. Ich plane, das Zitat jede Stunde zu aktualisieren. Ich muss etwa 25 bis 30 technische Indikatoren für 2200 Aktien machen. Donnerstag, 10. April 2008 17:51 Die Ausführungszeit eines TA-Lib-Aufrufs auf einem Array von 10000 Elementen dauert ca. 15 Millisekunden (auf einem Intel Core Duo 2.13 Ghz). Dies ist der Durchschnitt aller Funktionen. Zu den schnellsten gehört SMA weniger als 2,5 Millisekunden. Die langsamste, HTTRENDMODE, nimmt 450 Millisekunden. Mit weniger Elementen ist es schneller. SMA dauert ca. 0,2 Millisekunden für 1000 Eingangselemente. Die Geschwindigkeitsverstärkung ist fast linear (der Overhead der Ausführung des Funktionsaufrufs ist vernachlässigbar). Im Rahmen Ihrer Bewerbung ist TA-Lib sehr unwahrscheinlich, dass Ihr Engpass für Geschwindigkeitsleistung ist. Auch ich in der Regel nicht empfehlen, diese quotlast nquot Lösung. Lesen Sie weiter unten für Details. Zuerst eine Korrektur zur Boban. s-Anweisung Alle Funktionen in TA-Lib können auch einen einzigen letzten Wert berechnen, indem sie ein Minimum an Quell-Nquot-Elementen verwenden. Sie können ein Array von Größe 10000 haben, haben Daten initialisieren nur für die ersten 500 Elemente, fügen Sie ein Element und rufen TA-Lib, um die SMA nur für das neue Element zu berechnen. TA-Lib wird nicht mehr als nötig aussehen (wenn SMA von 5, dann wird TA-Lib eine einzelne SMA mit den letzten 5 Werten berechnen). Dies ist mit dem Parameter startIdx und endIdx möglich. Sie können einen zu berechnenden Bereich oder einen einzelnen Wert angeben. In diesem Szenario würden Sie startIdx endIdx 500, um das 501st Element zu berechnen. Warum ist eine solche Quell-Napot-Lösung potenziell gefährlich für einige Unabhängig von der Auswahl Boban. s Lösung oder TA-Lib betrachten, dass mit einer kleinen endlichen Anzahl von vergangenen Daten nicht gut funktionieren mit den meisten TA-Funktionen. Mit SMA ist es offensichtlich, dass man nur n Element benötigt, um einen Durchschnitt über n Element zu berechnen. Es ist nicht so einfach mit EMA (und vielen anderen TA-Funktionen). Der Algo hängt oft von dem vorherigen Wert ab, um den neuen Wert zu berechnen. Die Funktion ist rekursiv. Das bedeutet, dass alle bisherigen Werte einen Einfluss auf zukünftige Werte haben. Wenn Sie sich entscheiden, Ihren Algo zu verwenden, um nur eine kleine Anzahl von vergangenen n Wert zu verwenden, erhalten Sie nicht das gleiche Ergebnis wie jemand, der über eine große Anzahl von vergangenen Werten berechnet. Die Lösung ist ein Kompromiss zwischen Geschwindigkeit und Präzision. Ich habe das oft im Kontext von TA-Lib besprochen (ich nenne es den quartierbaren Zeitraum in der Dokumentation und dem Forum). Um es ganz einfach zu halten, ist meine allgemeine Empfehlung, wenn Sie den Unterschied zwischen einem Algo mit einer endlichen Impulsantwort (FIR) aus einem Algo mit einer unendlichen Impulsantwort (IIR) nicht machen können. Sie werden sicherer sein, über alle Daten zu berechnen, die Sie haben verfügbar. TA-Lib spezifiziert in dem Code, dessen Funktionen eine instabile Periode (IIR) haben. Bearbeitet von mfortier Freitag, 15. August 2008 4:25 Uhr Korrekter englischer Satz Freitag, 15. August 2008 4:20 Uhr Der Beispielcode auf der Registerkarte Vollständige Code veranschaulicht, wie man den gleitenden Durchschnitt einer Variablen über einen ganzen Datensatz berechnet Die letzten N Beobachtungen in einem Datensatz oder über die letzten N Beobachtungen innerhalb einer BY-Gruppe. Diese Beispieldateien und Codebeispiele werden von SAS Institute Inc. zur Verfügung gestellt, wie es ohne jegliche Gewährleistung, weder ausdrücklich noch stillschweigend, einschließlich, aber nicht beschränkt auf die implizierten Garantien der Marktgängigkeit und Eignung für einen bestimmten Zweck ist. Die Empfänger bestätigen und stimmen zu, dass das SAS-Institut nicht für irgendwelche Schäden haftbar ist, die sich aus der Verwendung dieses Materials ergeben. Darüber hinaus wird das SAS-Institut die hierin enthaltenen Materialien nicht unterstützen. Diese Beispieldateien und Codebeispiele werden von SAS Institute Inc. zur Verfügung gestellt, wie es ohne jegliche Gewährleistung, weder ausdrücklich noch stillschweigend, einschließlich, aber nicht beschränkt auf die implizierten Garantien der Marktgängigkeit und Eignung für einen bestimmten Zweck ist. Die Empfänger bestätigen und stimmen zu, dass das SAS-Institut nicht für irgendwelche Schäden haftbar ist, die sich aus der Verwendung dieses Materials ergeben. Darüber hinaus wird das SAS-Institut die hierin enthaltenen Materialien nicht unterstützen. Berechnen Sie den gleitenden Durchschnitt einer Variablen durch einen ganzen Datensatz, über die letzten N Beobachtungen in einem Datensatz oder über die letzten N Beobachtungen innerhalb einer BY-Gruppe.


Comments