Friday 17 February 2017

Durchschnittlicher Beispielcode Verschieben

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 gebildeten Bar erfüllt (Barindex entspricht 1). Die Losgröße wird nach einem speziellen Algorithmus optimiert. Der Gutachter analysiert die Übereinstimmung zwischen dem gleitenden Durchschnitt und dem Marktpreisdiagramm. Die Überprüfung wird von der Funktion CheckForOpen () durchgeführt. Wenn der gleitende Durchschnitt auf die Bar trifft, so dass ersterer höher ist als der offene Preis, aber niedriger als der Schlusskurs, wird die BUY-Position geöffnet. Wenn der gleitende Durchschnitt auf die Bar trifft, so dass ersterer niedriger ist als der offene Preis, aber höher als der Schlusskurs, wird die SELL-Position geöffnet. Das im Experten verwendete Money Management ist sehr einfach, aber effektiv: Die Kontrolle über jedes Positionsvolumen wird in Abhängigkeit von den bisherigen Transaktionsergebnissen durchgeführt. Dieser Algorithmus wird durch die Funktion LotsOptimized () implementiert. Die Basis-Losgröße wird auf Basis des maximal zulässigen Risikos berechnet: Der Parameter MaximumRisk zeigt für jede Transaktion den Grundrisikoprozentsatz an. Sie besitzt üblicherweise einen Wert zwischen 0,01 (1) und 1 (100). Wenn beispielsweise die freie Marge (AccountFreeMargin) 20.500 beträgt und die Regeln des Kapitalmanagements das Risiko von 2 verwenden, wird die Grundlosgröße 20500 0,02 1000 0,41 betragen. Es ist sehr wichtig, die Losgrößengenauigkeit zu kontrollieren und das Ergebnis mit den zulässigen Werten zu normalisieren. Normalerweise sind Fraktionen mit einer Stufe von 0,1 erlaubt. Eine Transaktion mit einem Volumen von 0,41 wird nicht durchgeführt. Zur Normalisierung wird die NormalizeDouble () - Funktion mit Genauigkeit bis zu einem Zeichen nach dem Punkt verwendet. Dies führt zu der Grundmenge von 0,4. Die Basispreisberechnung auf Basis der freien Marge erlaubt es, die Betriebsvolumina je nach Handelserfolg zu erhöhen, d. h. den Handel mit Reinvestitionen zu handeln. Dies ist der grundlegende Mechanismus mit obligatorischem Kapitalmanagement zur Steigerung der Effizienz des Handels. DecreaseFactor ist das Ausmaß, in dem die Losgröße nach dem unrentablen Handel reduziert wird. Normale Werte sind 2,3,4,5. Wenn die vorhergehenden Transaktionen unrentabel waren, verringern sich die nachfolgenden Volumina um einen Faktor von DecreaseFactor, um durch die unrentable Periode zu warten. Dies ist der Hauptfaktor im Kapitalmanagementalgorithmus. Die Idee ist sehr einfach: Wenn der Handel erfolgreich wächst, arbeitet der Experte mit dem Grundposten, der maximalen Profit macht. Nach der ersten unrentablen Transaktion wird der Experte die Geschwindigkeit reduzieren, bis eine neue positive Transaktion erfolgt. Der Algorithmus erlaubt es, die Geschwindigkeitsreduzierung zu deaktivieren, dafür muss man DecreaseFactor 0 angeben. Die Höhe der letzten aufeinanderfolgenden unrentablen Transaktionen wird in der Handelsgeschichte berechnet. Das Basislos wird auf dieser Basis neu berechnet: Der Algorithmus erlaubt es also, das durch eine Reihe von unrentablen Transaktionen auftretende Risiko effektiv zu reduzieren. Die Losgröße wird am Ende der Funktion obligatorisch auf die minimal zulässige Losgröße überprüft Können die zuvor durchgeführten Berechnungen zu Los 0 führen: Der Experte ist hauptsächlich für den täglichen Arbeitsablauf und im Testbetrieb bestimmt - für die Durchführung zu engen Preisen. Es wird nur beim Öffnen einer neuen Bar handeln, deshalb werden die Modi der Tick-Modellierung nicht benötigt. Testergebnisse sind in der report. Simple Expert Advisor Problem 29. Erstellen Sie einen Handel Expert Advisor. Vorläufige Argumente Bevor Sie mit dem Programmieren eines Trade Expert Advisor beginnen, müssen Sie allgemeine Grundsätze für ein zukünftiges Programm definieren. Es gibt keine strengen Programmerstellungsregeln. Allerdings, sobald ein Programm erstellt, ein Programmierer in der Regel weiter zu verbessern. Um das Programm in Zukunft gut verstehen zu können, muss es nach einem gut durchdachten und leicht verständlichen Schema erstellt werden (es ist besonders wichtig, dass ein Programm von einem anderen Programmierer weiter verbessert wird). Das bequemste Programm ist das, das aus Funktionsblöcken besteht, von denen jedes für seinen Teil der Berechnungen verantwortlich ist. Um einen Algorithmus eines Trading Expert Advisor zu erstellen, können Sie analysieren, was ein Betriebsprogramm tun soll. Eines der wichtigsten Daten bei der Bildung von Handelsaufträgen ist die Information über Aufträge, die bereits in einem Client-Terminal vorhanden sind. Einige der Handelsstrategien erlauben nur eine unidirektionale Ordnung. Im Allgemeinen, wenn eine Handelsstrategie erlaubt, können mehrere Aufträge in einem Terminal zur gleichen Zeit geöffnet sein, obwohl ihre Anzahl angemessen begrenzt sein sollte. Bei jeder Strategie sollten Handelsentscheidungen unter Berücksichtigung der aktuellen Situation getroffen werden. Bevor eine Handelsentscheidung in einem Programm getroffen wird, ist es notwendig zu wissen, welche Handelsaufträge bereits eröffnet oder platziert wurden. Zunächst muss ein Programm eine Auftragsblockbuchhaltung enthalten, die zu den ersten auszuführen ist. Während einer EA-Durchführung sollten Handelsentscheidungen getroffen werden, deren Durchführung zur Ausführung von Handelsoperationen führt. Code-Teil verantwortlich für Trade Orders Bildung ist besser in einem separaten Block geschrieben. Ein Expert Advisor kann eine Handelsanfrage erstellen, um eine neue ausstehende oder Marktorder zu eröffnen, bestehende Aufträge zu schließen oder zu modifizieren oder gar keine Aktionen auszuführen. Ein EA muss auch die Auftragspreise je nach Wunsch des Benutzers berechnen. Handelsentscheidungen sollten in einem Programm auf der Grundlage der Handelskriterien getroffen werden. Der Erfolg des gesamten Programms hängt von der Korrektheit der Erkennung von Handelskriterien im Programm ab. Bei der Berechnung von Handelskriterien kann ein Programm alle Informationen berücksichtigen (und muss), die nützlich sein können. Beispielsweise kann ein Expert Advisor die Kombination von technischen Indikatorwerten, die Zeit wichtiger Pressemitteilungen, die aktuelle Zeit, Werte einiger Preisniveaus usw. analysieren. Aus Gründen der Einfachheit sollte der für die Berechnung der Handelskriterien verantwortliche Programmteil separat geschrieben werden Block. Ein Trade Expert Advisor muss unbedingt Fehlerverarbeitungsblock enthalten. Die Analyse von Fehlern, die bei der Ausführung von Handelsoperationen auftreten können, ermöglicht es einerseits, eine Handelsanforderung zu wiederholen und andererseits einen Benutzer über eine mögliche Konfliktsituation zu informieren. Struktur eines einfachen Expertenberaters Hier ist ein Strukturschema eines einfachen Expertenberaters, der auf der Basis von mehreren Funktionsblöcken aufgebaut ist, in jedem Block ein bestimmter Teil der Berechnungen. Auf der folgenden EA-Entwicklungsstufe gibt es noch keinen Programmcode. Gleichzeitig wird der Algorithmus eines Programms weitgehend gebildet. Wie die auf den Grundlagen des angebotenen Schemas aufgebaute EA funktionieren kann, kann leicht verstanden werden, indem man einfach auf das Schema blickt und auf Blocknamen und Relationenmatrizen (Kontrolle übergeben) zwischen ihnen hin orientiert. Nach dem Programmstart wird die Steuerung an den Block der Vorverarbeitung übergeben. In diesem Block können einige allgemeine Parameter analysiert werden. Wenn zum Beispiel nicht genügend Balken in einem Fenster vorhanden sind (Balken, die für die Berechnung der Parameter der technischen Indikatoren erforderlich sind), kann ein EA nicht in der Lage sein, adäquat zu operieren. In einem solchen Fall muss eine EA den Betrieb beenden, der vorläufig einen Benutzer darüber informiert und über den Grund der Kündigung berichtet. Wenn es keine Kontraindikatons von allgemeinem Charakter gibt, wird die Kontrolle an den Abrechnungsblock weitergegeben. Im Block der Buchhaltungsaufträge wird die Anzahl und Qualität der Aufträge, die in einem Clientterminal für ein Wertpapier vorhanden sind (an dem Fenster, an dem die EA angeschlossen ist) erfasst. In diesem Block müssen Aufträge anderer Wertpapiere eliminiert werden. Wenn eine programmierte Handelsstrategie nur Marktaufträge erfordert (und keine ausstehenden Aufträge verwendet), muss die Tatsache der Anwesenheit von ausstehenden Aufträgen erkannt werden. Wenn eine Strategie nur eine Marktordnung zulässt und es tatsächlich mehrere Aufträge gibt, sollte diese Tatsache auch bekannt sein. Die Aufgabe des Auftragsabrechnungsblocks (in diesem Schema) besteht darin, festzustellen, ob die aktuelle Handelssituation mit einem erwarteten übereinstimmt, d. H. Dem, in dem der EA ausreichend arbeiten kann. Wenn die Situation entspricht, muss die Steuerung an den nächsten Block weitergeleitet werden, um die EAs-Operation fortzusetzen, wenn nicht, muss die EAs-Operation beendet werden, und diese Tatsache muss einem Benutzer gemeldet werden. Wenn im Terminal keine Aufträge vorhanden sind oder die Anzahl und Qualität der bestehenden Aufträge den Erwartungen entspricht, wird die Kontrolle an den Block der definierenden Handelskriterien übergeben. In diesem Block werden alle für die Durchführung von Handelsentscheidungen notwendigen Kriterien, nämlich Kriterien für das Öffnen, Schließen und Ändern von Aufträgen, berechnet. Eine weitere Steuerung wird an den Block der Schließaufträge weitergegeben. Es ist leicht zu verstehen, warum in dem angebotenen Schema der Block von Schlussaufträgen früher ausgeführt wird als der Block der Öffnungsbefehle. Es ist immer sinnvoller, erste Aufträge zu bearbeiten (schließen oder ändern) und erst danach neue Aufträge zu eröffnen. Im allgemeinen ist es richtig, sich von dem Wunsch leiten zu lassen, möglichst wenig Befehle zu haben. Bei der Ausführung dieses Satzes müssen alle Aufträge, für die das Schließkriterium aktiviert wurde, geschlossen werden. Nachdem alle notwendigen Aufträge geschlossen wurden, wird die Steuerung an einen Block der Größenordnung der neuen Aufträge übergeben. Es gibt viele Algorithmen zur Berechnung eines Auftragsvolumens. Die einfachste von ihnen ist mit einer konstanten, festen Losgröße. Es ist praktisch, diesen Algorithmus in einem Programm zum Testen von Strategien zu verwenden. Die populärere Methode, eine Auftragsgröße zu definieren, ist das Festlegen der Anzahl der Lots abhängig von der Menge an freiem Rand, zum Beispiel 30-40 davon. Wenn die freie Marge nicht ausreicht, beendet das Programm seinen Betrieb, indem er einen Benutzer über den Grund informiert hat. Nachdem die Anzahl der Lose für die Eröffnung neuer Aufträge definiert ist, wird die Steuerung an den Auftragsöffnungsblock übergeben. Wenn irgendeine der zuvor ermittelten Kriterien auf die Notwendigkeit hinweist, eine Bestellung einer bestimmten Art zu eröffnen, wird in diesem Block eine Handelsaufforderung zum Öffnen einer Bestellung gebildet. Es gibt auch Fehleranalyse-Block in einem Experten-Berater. Wenn eine Handelsoperation fehlgeschlagen ist, wird die Steuerung (nur in diesem Fall) an den Fehlerverarbeitungsblock übergeben. Wenn ein Fehler, der von einem Server oder Client-Terminal zurückgegeben wird, nicht entscheidend ist, wird ein weiterer Versuch unternommen, eine Handelsoperation durchzuführen. Wenn ein wichtiger Fehler zurückgegeben wird (z. B. ein Konto gesperrt ist), muss ein EA seinen Vorgang abbrechen. Denken Sie daran, in MQL4 gibt es keine Möglichkeit der Programmabschluss einer EAs-Operation in einem Sicherheitsfenster (anders als Skripte, siehe Sonderfunktionen). Was man auf Programmebene machen kann, ist die Beendigung von start (). Bei einem Neustart der Funktion start () auf einem neuen Tick kann der Wert eines bestimmten Variablen-Flag-Verbotshandels (in diesem Fall als Folge eines kritischen Fehlers aktiviert) analysiert und die Steuerung für die Beendigung des Vorgangs übergeben werden Sonderfunktion Betrieb damit Bildung von neuen Handelsanfrage ist nicht zulässig. In dem angebotenen Schema wird der Merkerwert im Block der Vorverarbeitung analysiert. Handelsstrategie Die Marktpreise bewegen sich ständig. Der Marktstatus kann zu jedem Zeitpunkt entweder als trend - starke unidirektionale Preisveränderung (Anstieg oder Abfall) charakterisiert werden, oder als flach - laterale Kursbewegung mit schwachen Abweichungen von einem bestimmten Durchschnitt. Diese Marktmerkmale sind bedingt, da es keine eindeutigen Kriterien gibt, nach denen Trend oder Wohnung identifiziert werden können. Beispielsweise lange Seitenbewegungen mit starken Abweichungen, die weder auf eine Ebene noch auf einen Trend zurückzuführen sind. Im Allgemeinen wird davon ausgegangen, dass der Markt ist vor allem in den Zustand der seitlichen Bewegung und Trends in der Regel statt 15-20 der Zeit. Alle Handelsstrategien können auch konventionell in zwei Hauptgruppen aufgeteilt werden. Die erste Gruppe enthält flachorientierte Strategien. Der Grundgedanke solcher Strategien ist, dass nach einem offensichtlichen Abweichungspreis zur vorherigen Position zurückkehren muss, deshalb werden Aufträge in die Richtung entgegen der letzten Kursbewegung geöffnet. Die zweiten Gruppenstrategien sind Trendstrategien, bei denen Aufträge in die gleiche Richtung wie die Salzpreisbewegung eröffnet werden. Es gibt kompliziertere (kombinierte) Strategien. Solche Strategien berücksichtigen viele verschiedene Faktoren, die charakterisieren Markt als Ergebnis Handel kann sowohl auf Flach-und Trend durchgeführt werden. Es ist nicht schwer, den Handel nach dieser oder dieser Strategie technisch zu implementieren - MQL4 enthält alle notwendigen Mittel dafür. Die wichtigste Arbeit in der Schaffung von einmal eigene Strategie besteht aus der Suche nach Handel Kriterien. Trading-Kriterien In diesem Beispiel werden wir versuchen, einen Trend Expert Advisor zu konstruieren, d. H. Diejenige, die Aufträge in der Kursbewegungsrichtung öffnen wird. So müssen wir finden unter verschiedenen technischen Indikatoren diejenigen, die einen Trend zu erkennen. Eine der einfachsten Methoden zum Suchen von Handelskriterien basiert auf der Analyse der Kombination von MAs mit unterschiedlichen Mittelungsperioden. Feige. 111 und Fig. 112 zeigen die Position von zwei verschiedenen MA (mit Perioden der Mittelung 11 und 31) auf verschiedenen Marktteilen. Mittelwerte mit kleinen Mittelungszeit (rote Linien) sind näher an einem Preisdiagramm, twisty und beweglich. Gleitende Mittelwerte mit größeren Mittelwerten (blaue Linie) sind inert, haben größere Verzögerungen und liegen weiter von den Marktpreisen entfernt. Lets Aufmerksamkeit auf Orte, wo MAs mit unterschiedlichen Mittelungsperioden Kreuz und versuchen zu entscheiden, ob die Tatsache der MA Kreuzung kann als Lesekriterium verwendet werden. Feige. 111. Kreuzung von MA (11) und MA (31), wenn sich die Kursbewegungsrichtung ändert. In Fig. 111 sehen wir einen Marktteil, bei dem Aufträge in Richtung der Kursbewegung bei der MA-Kreuzung gerechtfertigt sind. In Punkt A kreuzt die rote Linie die blaue von unten nach oben, danach steigt der Marktpreis für eine gewisse Zeit an. Weitere Rückwärts-MA-Kreuzung zeigt die Kursbewegungsänderung an. Wenn wir einen Kaufauftrag am Punkt A öffnen und ihn bei B schließen, erhalten wir Profit proportional zur Differenz von A und B Preisen. Feige. 112. Kreuzung von MA (11) und MA (31), wenn sich die Kursbewegungsrichtung ändert. Gleichzeitig gibt es weitere Momente auf dem Markt, wenn MA kreuzt, aber dies führt nicht zu einem weiteren erheblichen Preisanstieg oder - rückgang (Abb. 112). Aufträge bei MA Kreuzung in solchen Momenten zu Verlusten führen. Wenn Sell bei A eröffnet und bei B geschlossen wird, führt dies zu Verlusten. Dasselbe gilt für eine bei B eröffnete und bei C geschlossene Order. Der Erfolg der gesamten auf MA-Crossing umgesetzten Strategie hängt von der Anzahl der Teile ab, die als Trend und Flat charakterisiert werden können. In flachen oft MA Kreuzung ist ein regelmäßiges Ereignis, das jede Trendstrategie stört. Zahlreiche falsche Signale führen in der Regel zu Verlusten. Aus diesem Grund kann diese Zeichenüberquerung von MAs mit unterschiedlicher Mittelungsperiode für den Aufbau von Handelsstrategien nur in Kombination mit anderen Trendzeichen verwendet werden. In diesem Beispiel (für den Aufbau eines einfachen Expertenberaters) müssen wir dieses Zeichen ablehnen. Wir verwenden ein anderes Zeichen. Analysieren visuell den Charakter der Preisveränderungen auf dem Markt, können wir sehen, dass eine lange Ein-Richtung Preisanstieg oder-fallen oft als Folge einer kurzen starken Bewegung erscheint. Mit anderen Worten, wenn innerhalb einer kurzen Zeit eine starke Bewegung geschehen ist, können wir erwarten, dass ihre Fortsetzung in einem mittelfristigen Zeitraum. Feige. 113 zeigt die Marktperiode, in der eine starke Bewegung zur Fortsetzung der Preisänderung in die gleiche Richtung führte. Als Kontingent starke Bewegungquot können wir die Differenz von MAs mit unterschiedlichen Mittelungsperioden. Je stärker die Bewegung, desto größer ist die Verzögerung von MA mit einer größeren Mittelungsperiode von MA mit einer kleinen Periode der Mittelung. Darüber hinaus führen selbst starke diskontinuierliche Preisbewegungen mit weiterer Rückkehr nicht zu einem großen Unterschied zwischen den MAs, d. h. zahlreiche falsche Signale treten nicht auf. Beispielsweise führte der Preissprung um 50 Punkte mit weiterer Rückkehr (in der Mitte in 113) zu einer Erhöhung der Differenz zwischen den MAs nur um 20 Punkte. Gleichzeitig führte eine wirklich starke Bewegung (die in der Regel nicht von einer beträchtlichen Korrektur begleitet wird) in Punkt A zu einer Erhöhung der Differenz um 25 - 30 Punkte. Wenn Kaufauftrag eröffnet wird, wenn ein bestimmter Wert der Differenz zwischen den MAs erreicht wird, zum Beispiel in A, dann ist die Order höchstwahrscheinlich rentabel, wenn ein Preis einen voreingestellten Stop Orderwert erreicht. Wir verwenden diesen Wert als Handelskriterium in unserem Expertenrat. Anzahl der Aufträge In diesem Beispiel analysieren wir einen Expert Advisor, der die Anwesenheit von nur einer Marktordnung zulässt und keine ausstehenden Aufträge vorliegen. Ein solcher Ansatz ist nicht nur in diesem bestimmten Beispiel gerechtfertigt, sondern kann als Grundlage für jede Strategie verwendet werden. Ausstehende Aufträge werden meist verwendet, wenn ein Entwickler ein recht zuverlässiges Kriterium für die Prognose der zukünftigen Preisänderung mit hoher Wahrscheinlichkeit hat. Wenn es kein solches Kriterium gibt, müssen keine ausstehenden Aufträge verwendet werden. Die Situation, wenn mehrere entgegengesetzte Aufträge für ein Wertpapier offen sind, kann auch nicht als vernünftig betrachtet werden. Es wurde schon früher geschrieben, daß aus der ökonomischen Perspektive entgegengesetzte Anordnungen als sinnlos gelten, besonders wenn die Orderpreise gleich sind (siehe Closing and Deleting Orders). In einem solchen Fall sollten wir einen Befehl durch einen anderen schließen und auf ein Signal warten, um eine Marktordnung in einer bestimmten Richtung zu öffnen. Relation der Handelskriterien Aus dieser Position wird deutlich, welche Beziehungen zwischen Handelskriterien möglich sind. Feige. 114 zeigt drei Varianten der Korrelation der Handelskriterien, wenn jedes Kriterium wichtig ist (gültig). Aktionen (Eröffnungs - und Schlussmarktaufträge) finden im Uhrzeigersinn auf den folgenden Bildern statt. Feige. 114. Ordnungs - und Schlusskriterienkorrelation (a und b - korrekt, c - falsch). Die beliebteste Variante eines richtig geformten Trading-Kriteriums ist die Variante a. Nach dem Öffnen wird ein Marktauftrag Kauf bis zu dem Moment, wenn das Kriterium, das seine Schließung auslöst, gehalten. Danach erfolgt eine Pause, wenn keine Aufträge geöffnet werden. Weiterhin kann ein Marktauftrag Sell geöffnet werden. Voraussetzungen für den Abschluss eines Verkaufsauftrags (nach korrekt festgelegten Kriterien) sind früher als die Bedingungen für die Eröffnung eines Kaufauftrags. Ein Kaufauftrag kann jedoch erneut geöffnet werden, wenn ein Handelskrite - rium dies erfordert. Aber nach dieser Variante kann eine Marktordnung nicht geöffnet werden, wenn es eine offene Marktordnung in der entgegengesetzten Richtung gibt. Ähnliche Kriterien Korrelation ist in der Variante b. Der Unterschied besteht darin, dass ein Kriterium für die Eröffnung einer Marktordnung zugleich ein Kriterium für das Schließen der entgegengesetzten Reihenfolge ist. Diese Variante wie die Variante a erlaubt es nicht, mehrere Aufträge gleichzeitig im Terminal auf einem Wert zu eröffnen. Die Variante der Kriterienkorrelation ist falsch. Nach dieser Variante ist die Öffnung einer Marktordnung erlaubt, wenn gegensätzliche Aufträge noch nicht abgeschlossen sind, was sinnlos ist. In seltenen Fällen kann diese Variante teilweise gerechtfertigt sein. Das Öffnen einer entgegengesetzten Reihenfolge ist manchmal akzeptabel, um Verluste zu kompensieren, die bei kleinen Korrekturen nach starken Preisbewegungen auftreten. In solchen Fällen kann eine entgegengesetzte Reihenfolge des gleichen oder eines kleineren Wertes als die bereits vorhandene geöffnet und dann geschlossen werden, wenn die Korrektur vorbei ist. Eine solche Taktik erlaubt es nicht, die in der Trendrichtung eröffnete quadratische Reihenfolge zu stören. Im allgemeinen sind auch mehrere Einrichtungsanweisungen möglich. Dies kann gerechtfertigt sein, wenn eine frühere geöffnete Bestellung durch einen Stop-Auftrag geschützt wird und das Kriterium auf die Preisentwicklung in derselben Richtung erneut ausgelöst wird. Bei der Erstellung einer solchen Strategie muss sich ein Entwickler jedoch bewusst sein, dass im Falle einer starken Preisbewegungsänderung die platzierten Stopaufträge bei einigen Brokern bei der ersten Preissenkung nicht ausgeführt werden können. Und der Verlust wird proportional zum Gesamtwert der ein-direktionale Marktaufträge. In unserem Beispiel verwenden wir Variante b der Handelskriterienkorrelation. Alle geöffneten Marktaufträge werden entweder durch einen Stoppauftrag oder nach einem Kriterium der Eröffnung eines Auftrages in entgegengesetzter Richtung ausgelöst (hier gilt das Kriterium des abschließenden Kaufs mit dem des Eröffnungsverkaufs und umgekehrt). Größe der eröffneten Aufträge In jeder Handelsstrategie sollten die Bestellmengen angemessen begrenzt sein. In einem einfachen Fall wird eine feste Auftragsgröße in einem Expertenrat verwendet. Vor dem Start des EA-Vorgangs kann ein Benutzer beliebige Größen zukünftiger Aufträge festlegen und für einige Zeit unverändert lassen. Wenn der Saldo geändert wird, kann ein Benutzer einen neuen Wert der Losnummern der geöffneten Bestellungen einrichten. Eine zu geringe Auftragsgröße bietet mehr Vertrauen in den Betrieb bei der unvorhersehbaren Marktveränderung, aber der Gewinn im Erfolgsfall wird nicht so groß sein. Wenn die Auftragsgröße zu groß ist, kann ein großer Gewinn erworben werden, aber eine solche EA ist zu riskant. Normalerweise ist die Größe der eröffneten Aufträge so eingerichtet, dass die Margin-Anforderungen nicht mehr als 2-35 Prozent des Gleichgewichts oder der freien Marge (wenn eine Strategie erlaubt nur eine geöffnete Reihenfolge, Balance und freie Marge im Moment vor der Bestellung zu öffnen gleich). In diesem Beispiel sind beide Varianten implementiert. Ein Benutzer kann wählen, ob er direkt Werte von Aufträgen angibt oder den Wert in Prozent vom freien Rand festlegt. Programmierdetails Ein einfacher Trend Expert Advisor tradingexpert. mq4, der auf der Basis vorheriger Argumente aufgebaut ist, kann so aussehen: Variablen beschreiben Ein weiteres Kriterium bei der Programmschätzung ist seine Lesbarkeit. Ein Programm gilt als korrekt geschrieben, wenn es von anderen Programmierern leicht gelesen werden kann, deshalb müssen alle Hauptprogrammteile und Hauptmomente, die die Strategie charakterisieren, kommentiert werden. Aus diesem Grund wird empfohlen, alle Variablen zu Beginn des Programms zu deklarieren und zu kommentieren. Im Block 1-2 werden externe und globale Variablen beschrieben. Nach Regeln müssen externe und globale Variablen vor ihrer ersten Verwendung geöffnet werden (siehe Variablentypen), deshalb werden sie im Programmhauptteil deklariert. Alle lokalen Variablen der Funktion start () werden im oberen Funktionsteil (Block 2-3) unmittelbar nach dem Funktions-Header gesammelt und beschrieben. Regeln für die Deklaration lokaler Variablen erfordern es nicht, aber auch nicht zu verbieten. Wenn ein Programmierer Schwierigkeiten beim Verstehen der Bedeutung einer Variablen beim Lesen des Programms hat, kann er sich auf den oberen Programmteil beziehen und die Bedeutung und den Typ einer Variablen herausfinden. Es ist sehr praktisch in der Programmierung der Praxis. Block der Vorverarbeitung In diesem Beispiel besteht die Vorverarbeitung aus zwei Teilen (Block 3-4). Das Programm beendet den Betrieb, wenn nicht genügend Balken in einem Sicherheitsfenster vorhanden sind, in solch einem Fall ist es unmöglich, korrekte (in Block 5-6) Werte von gleitenden Durchschnittswerten, die für die Berechnung von Kriterien erforderlich sind, zu erfassen. Dabei wird der Wert der Variablen Arbeit analysiert. Im normalen EA-Betrieb ist der Variablenwert immer wahr (er wird einmal während der Initialisierung gesetzt). Wenn im Programmbetrieb ein kritischer Fehler auftritt, wird dieser Variable false zugewiesen und start () beendet ihre Operation. Dieser Wert wird sich in Zukunft nicht ändern, deshalb wird der folgende Code nicht ausgeführt. In einem solchen Fall muss der Programmablauf gestoppt und der Grund für den kritischen Fehler erkannt werden (bei Bedarf muss ein Handelscenter kontaktiert werden). Nachdem die Situation gelöst ist, kann das Programm erneut gestartet werden, d. h. das EA kann an ein Sicherheitsfenster angeschlossen werden. Buchführungsaufträge Der beschriebene Sachverständige ermöglicht es, nur mit einem Marktauftrag zu arbeiten. Die Aufgabe des Auftragsabrechnungsblocks (Block 4-5) besteht darin, Merkmale einer geöffneten Bestellung zu definieren, sofern vorhanden. In der Schleife durchlaufen Aufträge für alle bestehenden Markt und ausstehende Aufträge werden überprüft, nämlich vom ersten (int i1) bis zum letzten (iampltOrdersTotal ()). In jeder Zyklus-Iteration wird die nächste Reihenfolge durch die Funktion OrderSelect () ausgewählt. Die Auswahl erfolgt aus einer Quelle geöffneter und ausstehender Aufträge (SELECTBYPOS). Wenn die Selektion erfolgreich durchgeführt wird (dh es ist eine weitere Bestellung im Terminal vorhanden), muss diese Reihenfolge und die Situation analysiert werden: ob die Order für die Sicherheit geöffnet wird, bei der die EA operiert, ob die Order auf dem Markt ist oder anhängig ist Es muss auch bei der Zählung von Aufträgen berücksichtigt werden. In der Zeile: Alle Aufträge für ein anderes Sicherheitssystem werden eliminiert. Der Operator beendet die Iteration und die Merkmale einer solchen Bestellung werden nicht verarbeitet. Aber wenn die Bestellung für die Sicherheit geöffnet ist, an dem Fenster, an dem die EA angeschlossen ist, wird es weiter analysiert. Wenn OrderType () einen Wert größer als 1 zurückgibt (siehe Typen von Trades), ist der ausgewählte Auftrag noch ausstehend. Aber in diesem Expert Advisor Verwaltung von ausstehenden Bestellungen nicht zur Verfügung gestellt. Es bedeutet, dass die Ausführung von start () beendet werden muss, da eine Konfliktsituation eingetreten ist. In einem solchen Fall wird nach einer Meldung über die Operationsbeendigung start () die Ausführung durch die Rückkehr des Operators gestoppt. Wenn die letzte Überprüfung zeigt, dass es sich bei dem analysierten Auftrag um eine Marktordnung handelt, wird die Gesamtzahl der Aufträge für ein Wertpapier berechnet und analysiert. Für die erste dieser Aufträge werden alle notwendigen Merkmale definiert. Wenn bei der nächsten Iteration der Orderzähler (variable Total) die zweite Marktordnung findet, gilt die Situation auch als Konflikt, da die EA nicht mehr als eine Market Order verwalten kann. In einem solchen Fall wird die start () - Ausführung gestoppt, nachdem eine entsprechende Meldung angezeigt wird. Aufgrund der Auftragsausführungsblockausführung (wenn alle Prüfungen erfolgreich waren) erhält die Variable Total ihren Nullwert, wenn es keine Marktaufträge gibt oder den Wert 1 erhält, wenn es eine Marktorder für unsere Sicherheit gibt. Im letzteren Fall erhalten auch einige Variablen, die in Übereinstimmung mit den Auftragseigenschaften (Anzahl, Typ, Eröffnungs - preis, Stopplevel und Auftragswert) gesetzt wurden, ihre Werte. Berechnen von Handelskriterien Im analysierten Beispiel wird die Definition der Handelskriterien (Block 5-6) auf den Grundlagen der Differenz zwischen Bewegungsdurchschnitten mit unterschiedlichen Zeiträumen berechnet. Entsprechend den akzeptierten Kriterien ist ein Diagramm bull-directed, wenn der aktuelle Wert des MA mit kleinerer Periode größer als der MA-Wert mit größerer Periode ist und die Differenz zwischen den Werten größer als ein bestimmter Wert ist. Bei einer Bärenbewegung ist MA mit kleinerer Periode niedriger als MA mit größerer Periode und die Differenz ist auch größer als ein bestimmter kritischer Wert. Am Blockanfang werden Werte von MAs mit Mittelungsperioden PeriodMA1 und PeriodMA2 berechnet. Die Tatsache der Bedeutung eines Handelskriteriums wird über den Wert einer entsprechenden Variable ausgedrückt. Die Variablen OpnB und OpnS bezeichnen das Kriterium für die Eröffnung von Kauf - und Verkaufsaufträgen, der Variablen Cls und ClsS - zum Schließen. Wenn zum Beispiel ein Kriterium für die Öffnung von Buy nicht ausgelöst wurde, bleibt der Wert von OpnB falsch (gesetzt bei der Variableninitialisierung), wenn er ausgelöst hat, erhält OpnB den Wert true. In diesem Fall fällt das Kriterium für das Schließen des Verkaufs mit dem für die Öffnung des Kaufs zusammen, das Kriterium für die Öffnung des Verkaufs entspricht dem für das Schließen des Kaufs. Trading-Kriterien, die in diesem Beispiel akzeptiert werden, werden nur für pädagogische Zwecke verwendet und dürfen nicht als Leitlinie betrachtet werden, wenn sie auf einem realen Konto handeln. Closing Orders Es wurde früher geschrieben, dass diese Expert Advisor für den Betrieb nur mit einer Marktordnung für eine Sicherheit eröffnet, für die Fenster der EA beigefügt ist bestimmt ist. Bis zu dem Zeitpunkt, an dem die Steuerung im Programm an den Auftragsschließblock übergeben wird, ist es sicher bekannt, dass es im Moment keine Aufträge für die Sicherheit gibt oder es nur eine Marktordnung gibt. Das ist, warum der Code im Auftragsschließungsblock geschrieben wird, damit nur ein Auftrag erfolgreich geschlossen werden kann. Dieser Block basiert auf der Endlosschleife, während der Körper aus zwei analogen Teilen besteht: einer zum Schließen eines Kaufauftrags, ein weiterer zum Schließen eines Verkaufsauftrags. Während es hier für den Zweck verwendet wird, dass es im Falle eines Handelsbetriebsausfalls noch einmal wiederholt werden könnte. In der Kopfzeile des ersten Betreibers wird die Bedingung für den Abschluss eines Kaufauftrags berechnet (Verkaufsabschlüsse werden in analoger Weise geschlossen). Wenn der Typ einer früher geöffneten Bestellung Kauf entspricht (siehe Handelsarten) und das Vorzeichen für den Kaufschluss relevant ist, wird die Kontrolle an die Stelle des Betreibers weitergeleitet, bei dem ein Antrag auf Schließung gebildet wird. Als Auftragsschlusskurs in der Funktion OrderClose () wird der Wert eines zweiseitigen Angebots, der der Auftragsart entspricht, angezeigt (siehe Anforderungen und Einschränkungen beim Making Trades). Wenn ein Trade-Vorgang erfolgreich ausgeführt wird, wird nach einer Meldung über den Auftragsabschluss die aktuelle Iteration gestoppt und die Ausführung des Auftragsschließungsblocks beendet. Wenn die Operation jedoch fehlschlägt, wird die benutzerdefinierte Funktion zur Verarbeitung von Fehlern FunError () aufgerufen (Block 10-11). Processing Errors Als übergebener Parameter in FunError () wird der letzte von GetLastError () berechnete Fehlercode verwendet. Abhängig vom Fehlercode gibt FunError () 1 zurück, wenn der Fehler nicht kritisch ist und die Operation wiederholt werden kann, und 0, wenn der Fehler kritisch ist. Kritische Fehler werden in zwei Arten unterteilt - nach denen eine Programmausführung fortgesetzt werden kann (z. B. ein häufiger Fehler) und nach denen die Ausführung von Handelsoperationen gestoppt werden muss (z. B. blockiertes Konto). Wenn nach einer erfolglosen Handelsoperation die benutzerdefinierte Funktion 1 zurückgibt, wird der Strom während der Iteration beendet und während der nächsten Iteration wird ein weiterer Versuch unternommen, den Vorgang auszuführen - um die Bestellung zu schließen. Wenn die Funktion 0 zurückgibt, wird die aktuelle start () - Ausführung gestoppt. Beim nächsten Tick wird start () vom Client-Terminal erneut gestartet und wenn die Bedingungen für den Auftragsabschluss beibehalten werden, wird ein weiterer Versuch, die Bestellung zu schließen, durchgeführt. Wenn bei der Fehlerbearbeitung herausgefunden wird, dass die weitere Programmausführung sinnlos ist (zB wenn das Programm auf einer alten Client-Terminalversion arbeitet), wird im nächsten Block die Ausführung der Sonderfunktion start () im Block der Vorverarbeitung beendet Analysieren des Werts der Variablen Work. Berechnung von Lotsmengen für neue Aufträge Die Lotsanzahl kann gemäß einer Benutzereinstellung nach einer der beiden Varianten berechnet werden. Die erste Variante ist ein bestimmter konstanter Wert, der von einem Benutzer eingerichtet wird. Gemäß der zweiten Variante wird die Menge der Partien auf der Grundlage einer Summe berechnet, die einem bestimmten Prozentsatz (von einem Benutzer) einer freien Marge entspricht. Am Anfang des Blocks der Festlegung der Menge der Lose für neue Aufträge (Block 7-8) werden notwendige Werte von einigen Variablen berechnet - minimal zulässige Menge von Losen und Schritt der Losänderung durch einen Makler, freie Marge und Preis von gesetzt Ein Los für die Sicherheit. In diesem Beispiel ist Folgendes vorgesehen. Wenn ein Benutzer einen bestimmten Wert ungleich Null der externen Variablen Lts, beispielsweise 0,5, eingerichtet hat, wird er als die Menge von Losen akzeptiert, wenn eine Handelsanfrage zum Öffnen einer Bestellung gebildet wird. Wenn 0 Lts zugeordnet ist, wird die Anzahl der Lots Lts auf der Basis der Variablen Prots (Prozentsatz), der freien Marge und der Bedingungen, die von einem Broker eingerichtet werden, definiert. Nachdem Lts berechnet ist, wird eine Überprüfung durchgeführt. Wenn dieser Wert niedriger als der minimale zulässige Wert ist, wird der minimale zulässige Wert akzeptiert. Aber wenn die freie Marge nicht ausreicht, wird nach einer entsprechenden Meldung die start () - Ausführung abgebrochen. Öffnungsaufträge Der Block von Öffnungsbefehlen (Block 8-9) wie der Kerl von Öffnungsbefehlen ist eine Endlosschleife. In der Kopfzeile des ersten Betreibers werden Konditionen für die Eröffnung eines Kaufauftrags errechnet: Wenn es keine Aufträge für die Sicherheit gibt (Variable Summe ist gleich 0) und das Vorzeichen für die Eröffnung eines Kaufauftrags relevant ist (OpnB ist wahr) Wenn ein Bediener einen Auftrag eröffnet hat. In einem solchen Fall werden die Preise für die Haltestellen errechnet. Die Werte der Stopplevel werden zunächst von einem Benutzer in den externen Variablen StopLoss und TakeProfit festgelegt. Im allgemeinen Fall kann ein Benutzer Werte für diese Parameter festlegen, die ein Broker erlaubt. Außer einem Makler kann die minimale erlaubte Entfernung jederzeit ändern (es ist ein häufig Fall bei starken Marktbewegungen, zB, bevor wichtige Nachrichten Freigabe). Thats, warum vor jedem Auftrag Eröffnung Stop Ebenen müssen unter Berücksichtigung der Werte bu ein Benutzer und der minimale zulässige Wert von einem Makler eingerichtet zu berechnen. Zur Berechnung von Stopp-Pegeln wird als benutzerdefinierte Funktion NewStop () als übergebener Parameter der von einem Benutzer eingestellte Stopp-Pegelwert verwendet. In NewStop () wird zuerst der aktuelle minimal erlaubte Abstand berechnet. Wenn der vom Benutzer festgelegte Wert einem Brokerbedarf entspricht, wird dieser Wert zurückgegeben. Wenn er kleiner als der zulässige Wert ist, wird der von einem Broker zugelassene Wert verwendet. Die Preise für Stopp-Anfragen werden aus dem entsprechenden zweiseitigen Angebot berechnet (siehe Anforderungen und Einschränkungen in Making Trades). Mit der Funktion OrderSend () wird eine Handelsaufforderung zum Öffnen einer Bestellung gebildet. Für die Berechnung des Orderoffnungspreises und der Preise für Stopanforderungen werden die zweiseitigen Quotierungswerte verwendet, die der Orderart entsprechen. Wenn eine Handelsoperation erfolgreich war (d. h. ein Server hat die Nummer einer geöffneten Bestellung zurückgegeben), nachdem eine Nachricht über eine erfolgreiche Auftragsöffnung angezeigt wurde. Die Ausführung von start () ist abgeschlossen. Wenn eine Bestellung nicht geöffnet wurde und das Client-Terminal einen Fehler zurückgegeben hat, wird der Fehler gemäß dem zuvor beschriebenen Algorithmus verarbeitet. Einige Code-Besonderheiten Der analysierte Expert Advisor-Code ist auf die Umsetzung einer bestimmten Strategie ausgerichtet. Beachten Sie, dass einige Programmzeilen Variablen und Berechnungen enthalten, die geändert werden, wenn die Strategie geändert wurde. Zum Beispiel, nach der akzeptierten Strategie der Expert Advisor entwickelt, um nur mit einem Auftrag arbeiten. Dies ermöglichte es, das variable Ticket sowohl für die Identifikation einer abschließenden Auftragsnummer (im Block der Schließung 6-7) als auch für die Identifizierung eines Erfolgs einer Handelsoperationsausführung beim Öffnen einer Bestellung (im Block der Öffnung 8-9) zu verwenden ). In diesem Fall ist eine solche Lösung akzeptabel. Wenn wir jedoch den analysierten Code als Grundlage für die Implementierung einer anderen Strategie nehmen (z. B. entgegengesetzte Aufträge), müssen wir eine oder mehrere Variablen einführen, um die Anzahl der eröffneten Aufträge erkennen und den Erfolg der Handelsaktivitäten identifizieren zu können. In weiteren Strategieänderungen müssen wir Programmlinien ändern, die einen Teil der in der Quellstrategie enthaltenen Logiken enthalten. Im Auftragsabrechnungsblock müssen wir den Programmvorgang nicht beenden, wenn es mehrere offene Aufträge für ein Wertpapier gibt. Außerdem ändern sich auch die Bedingungen für das Öffnen und Schließen von Aufträgen. Dadurch wird der Code in den Blöcken der Öffnungs - und Schließungsaufträge geändert. Auf der Grundlage dieser Analyse können wir leicht feststellen, dass der beschriebene einfache Sachverständige nicht perfekt ist. In a general case, for the implementation of order accounting one should use a universal function based on using data arrays and not containing logics of a certain strategy. The same can be said about the blocks of opening and closing orders. A more complete program must contain a main analytical function, all other user-defined functions must be subordinate to it. This analytical function must contain a program code, in which all conditions for the implementation of any strategy are analyzed all subordinate functions must perform limited actions. The function of accounting orders must only account orders, functions of opening and closing orders must only open and close orders, and the analytical function must quotthinkquot and manage all other functions, i. e. call them when needed. I know this is achievable with boost as per: But I really would like to avoid using boost. Ich habe gegoogelt und keine geeigneten oder lesbaren Beispiele gefunden. Grundsätzlich möchte ich den gleitenden Durchschnitt eines laufenden Stroms eines Gleitkommazahlstroms mit den letzten 1000 Zahlen als Datenprobe verfolgen. Was ist der einfachste Weg, um dies zu erreichen, experimentierte ich mit einem kreisförmigen Array, exponentiellen gleitenden Durchschnitt und einem einfacheren gleitenden Durchschnitt und festgestellt, dass die Ergebnisse aus dem kreisförmigen Array meine Bedürfnisse am besten geeignet. Wenn Ihre Bedürfnisse sind einfach, können Sie nur versuchen, mit einem exponentiellen gleitenden Durchschnitt. Setzen Sie einfach, Sie eine Akkumulator-Variable, und wie Ihr Code sieht auf jede Probe, aktualisiert der Code den Akkumulator mit dem neuen Wert. Sie wählen eine konstante Alpha, die zwischen 0 und 1 ist, und berechnen Sie: Sie müssen nur einen Wert von Alpha zu finden, wo die Wirkung einer gegebenen 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, gibt es ein Alpha, die den Durchschnitt über die letzten 1000 Zahlen, ohne Unterlauf in der Gleitkomma Berechnung. Aber, wenn Sie einen kleineren Durchschnitt wünschen, wie 30 Zahlen oder so, dieses ist eine sehr einfache und schnelle Weise, es zu tun. Beantwortet Jun 12 12 at 4:44 1 auf Ihrem Beitrag. Der exponentielle gleitende Durchschnitt kann zulassen, dass das Alpha variabel ist. Somit kann dies dazu verwendet werden, Zeitbasisdurchschnitte (z. B. Bytes pro Sekunde) zu berechnen. Wenn die Zeit seit dem letzten Akkumulator-Update mehr als 1 Sekunde beträgt, lassen Sie Alpha 1.0 sein. Andernfalls können Sie Alpha zulassen (usecs seit letztem update1000000). Ndash jxh Grundsätzlich möchte ich den gleitenden Durchschnitt eines laufenden Stroms eines Gleitkommazahls mit den neuesten 1000 Zahlen als Datenbeispiel zu verfolgen. Beachten Sie, dass im Folgenden die Summe als Elemente als addiert ergänzt wird, wobei kostspielige O (N) - Transversionen vermieden werden, um die Summe zu berechnen, die für den durchschnittlichen Bedarf erforderlich ist. Insgesamt wird ein anderer Parameter von T gebildet, um z. B. Mit einer langen langen, wenn insgesamt 1000 lange s, eine int für char s, oder eine doppelte bis total float s. Dies ist ein wenig fehlerhaft, dass Nennsignale an INTMAX vorbeiziehen könnten - wenn Sie darauf achten, dass Sie ein langes langes nicht signiertes verwenden konnten. Oder verwenden Sie ein zusätzliches Bool-Datenelement, um aufzuzeichnen, wenn der Container zuerst gefüllt wird, während numsamples rund um das Array (am besten dann umbenannt etwas harmlos wie pos). Man nehme an, daß der quadratische Operator (T-Abtastwert) tatsächlich quadratischer Operator (T-Abtastwert) ist. Ndash oPless Jun 8 14 um 11:52 Uhr oPless ahhh. Gut beobachtet. Eigentlich meinte ich, dass es sich um void operator () (T sample) handelt, aber natürlich könntet ihr auch irgendeine Notation verwenden, die ihr mochtet. Wird beheben, danke. Ndash Tony D Jun 14 14 am 14:27


No comments:

Post a Comment