Monday 16 January 2017

80 Trading Strategien

MetaTrader 5 - Handelssysteme 80-20 Handelsstrategie Einführung 80-20 ist eine der Handelsstrategien (TS), die im Buch Street Smarts: High Probability Short-Term Trading Strategies von Linda Raschke und Laurence Connors beschrieben werden. Ähnlich wie die in meinem vorherigen Artikel diskutierten Strategien. Die Autoren es dem Stadium zuzuschreiben, wenn der Preis die Bereichsgrenzen prüft. Es konzentriert sich auch auf den Gewinn von falschen Breakouts und Roll-Backs von den Grenzen. Aber diesmal analysieren wir die Kursbewegung auf einem deutlich kürzeren Historienintervall mit nur dem Vortag. Die Lebensdauer eines erhaltenen Signals ist auch relativ kurz, da das System für den Intraday-Handel bestimmt ist. Das erste Ziel des Artikels ist es, die Entwicklung der 80-20 Trading-Strategie Signal-Modul mit MQL5 Sprache zu beschreiben. Dann werden wir dieses Modul mit der leicht veränderten Version des grundlegenden Handelsroboters verbinden, der im vorherigen Artikel der Serie entwickelt wurde. Außerdem werden wir das gleiche Modul für die Entwicklung eines Indikators für den manuellen Handel verwenden. Wie bereits erwähnt, zielt der in der Artikelserie vorgesehene Code in erster Linie auf leicht fortgeschrittene Programmierer. Daher ist der Code, neben seinem Hauptziel, entworfen, um von der prozeduralen Programmierung zu der objektorientierten zu bewegen. Der Code enthält keine Klassen. Stattdessen wird es vollständig umzusetzen Strukturen, die leichter zu meistern sind. Ein weiteres Ziel des Artikels ist es, Werkzeuge zu entwickeln, die es uns erlauben, zu überprüfen, ob die Strategie heute noch lebensfähig ist, da Raschke und Connors das Marktverhalten am Ende des letzten Jahrhunderts bei der Schaffung des Marktes genutzt haben. Ein paar EA-Tests auf der Grundlage der aktuellen Historiendaten werden am Ende des Artikels präsentiert. 80-20 Handelssystem Die Autoren nennen George Taylors die Taylor Handelstechnik. Sowie Steve Moores arbeitet an der Computeranalyse von Futures-Märkten und Derek Gipsons Handelserfahrung als theoretische Grundlage für ihre eigene Arbeit. Das Wesen der Handelsstrategie kann wie folgt kurz beschrieben werden: Liegen die vorherigen Tage Open und Close an den gegenüberliegenden Tagesbereichsgebieten, so ist die Wahrscheinlichkeit einer Umkehrung in Richtung der vorherigen Tage sehr hoch. Die vorherigen Tage öffnen und schließen Preise sollten in der Nähe der Reichweite Grenzen zu finden. Die Stornierung sollte den aktuellen Tag beginnen (nicht vor dem letzten Tag Kerze geschlossen). Die Strategie Regeln für den Kauf sind wie folgt: 1. Stellen Sie sicher, dass der Markt in den oberen 20 eröffnet und schloss in den unteren 20 des täglichen Bereichs gestern 2. Warten bis heute Tief bricht die vorherigen Tage eine mindestens von 5 Zecken 3. Legen Sie einen Kauf Pending Order auf dem unteren Rand des yesterdays Bereich 4. Sobald die ausstehende Order triggers, setzen ihre anfänglichen StopLoss an den Tagen Low 5. Verwenden Sie nachlaufende Stop, um den erhaltenen Gewinn zu schützen Verkauf Eintrag Regeln sind ähnlich, aber die gestern Bar sollte Bullish sein, sollte ein Kaufauftrag an der oberen Grenze der Bar sein, während StopLoss auf dem heutigen High platziert werden sollte. Ein weiteres wichtiges Detail ist die Größe einer geschlossenen Tagesbar. Nach Linda Raschke, sollte es groß genug sein - mehr als die durchschnittliche Größe der täglichen Bars. Sie legt jedoch nicht fest, wie viele Historientage bei der Berechnung der durchschnittlichen täglichen Reichweite berücksichtigt werden sollten. Wir sollten auch bedenken, dass die TS ist ausschließlich für Intraday-Handel Beispiele in der Buch-M15-Charts gezeigt konzipiert. Der Signalblock und der Indikator, der ein Layout gemäß der Strategie bildet, werden nachfolgend beschrieben. Sie können auch sehen, ein paar Screenshots mit dem Indikator Betriebsergebnisse. Sie zeigen eindeutig Muster, die den Systemregeln und den mit den Mustern verknüpften Handelsebenen entsprechen. Die Musteranalyse sollte dazu führen, dass ein Kauf pending order. Entsprechende Handelsniveaus werden am M1-Zeitrahmen besser gesehen: Ähnliches Muster mit der entgegengesetzten Handelsrichtung auf M5-Zeitrahmen: Seine Handelsstufen (M1-Zeitrahmen): Signalmodul Ermöglicht das Hinzufügen einer Gewinnniveauberechnung, um das Hinzufügen neuer Optionen zu einem benutzerdefinierten TS zu veranschaulichen. Es gibt kein solches Niveau in der ursprünglichen Version, da nur ein nachlaufender Halt zum Schließen einer Position verwendet wird. Lets make Take Profit abhängig von der benutzerdefinierten minimalen Breakout-Ebene (TS8020ExtremumBreak) werden wir es durch die benutzerdefinierte Verhältnis TS8020TakeProfitRatio multiplizieren. Folgende Elemente der feGetEntrySignal-Signalbaugruppe werden benötigt: Stromsignalstatus, berechnete Ein - und Ausstiegsebenen (Stop Loss und Take Profit) sowie gestern Bereichsgrenzen. Alle Ebenen sind über Links auf die Variablen an die Funktion erhalten, während die Signale Status zurückgeben, die Liste der Optionen aus dem vorherigen Artikel verwendet: enum ENUMENTRYSIGNAL ENTRYBUY, kaufen ENTRYSELL Signal, Signal ENTRYNONE verkaufen, kein Signal ENTRYUNKNOWN Status nicht definiert ENUMENTRYSIGNAL feGetEntrySignal ( D1 Zweikanalmusteranalyse datetime tTime, aktuelle Zeit double amp dEntryLevel, Einstiegsebene (Verknüpfung zur Variablen) double amp dSL, StopLoss Level (Link zur Variable) double amp dTP, TakeProfit Level (Link zur Variablen) double amp dRangeHigh , High von den Mustern 1 st bar (link zur Variablen) double amp dRangeLow Low von den Mustern 1 st bar (Link zur Variablen) Um ein Signal zu erkennen, müssen wir die letzten beiden Balken des D1 Zeitrahmens analysieren. Beginnt von dem ersten, wenn es die TS-Kriterien nicht erfüllt, besteht keine Notwendigkeit, den zweiten Balken zu überprüfen. Es gibt zwei Kriterien: 1. Die Balkengröße (Differenz zwischen High und Low) sollte den Durchschnittswert für die letzten XX Tage überschreiten (durch die benutzerdefinierte Einstellung TS8020D1AveragePeriod festgelegt). 2. Die Bar Open und Close Level sollten sich an der gegenüberliegenden Stelle von 20 befinden Der Stabbereich Wenn diese Bedingungen erfüllt sind, sollten hohe und niedrige Preise für weitere Verwendung gespeichert werden. Da sich die ersten Balkenparameter nicht innerhalb des ganzen Tages ändern, gibt es keinen Sinn, sie bei jedem Funktionsaufruf zu überprüfen. Hier können sie speichern in statischen Variablen: benutzerdefinierte Einstellungen Eingang uint TS8020D1AveragePeriod 20 80-20: Anzahl der Tage für uint TS8020ExtremumBreak die durchschnittliche tägliche Bereichseingang Berechnen von 50 80-20: Minimum Ausbruch des Yesterdays extremum (in Punkten) statisch ENUMENTRYSIGNAL sePossibleSignal ENTRYUNKNOWN Muster zuerst bar Signalrichtung statische Doppelgrößen für das berechnete zwischen Speichern von Zecken sdEntryLevel 0, SDSL 0. SDTP 0, sdRangeHigh 0. sdRangeLow 0 check die Muster ersten Takt auf D1: if (sePossibleSignal ENTRYUNKNOWN) stLastD1Bar tCurrD1Bar 1. bar ändert sich nicht, diesen Tag durchschnittlich Tagesbereich Doppel dAverageBarRange fdAverageBarRange (TS8020D1AveragePeriod, PERIODD1. TTime) if (maRates 0.high maRates 0.low lt dAverageBarRange) 1 st bar ist nicht groß genug, um sePossibleSignal ENTRYNONE bedeutet kein Signal heute return (sePossibleSignal) Doppel d20Percents 0.2 (maRates 0.high MaRates 0.low) 20 der gestrigen Reichweite wenn ((bearish bar: maRates 0.open gt maRates 0.high d20Percents bar geöffnet in den oberen 20 ampamp maRates 0.close lt maRates 0.low d20Percents und geschlossen in den unteren 20) (Bullish: maRates 0.close gt maRates 0.high d20Percents bar geschlossen in den oberen 20 ampamp maRates 0.open lt maRates 0.low d20Percents und öffnete in den unteren 20)) 1 st bar entspricht den Bedingungen definieren todays trading Richtung für Die Muster 1. Stufe: sePossibleSignal maRates 0.open gt maRates 0.close. ENTRYBUY. ENTRYSELL Markteintrittsstufe: sdEntryLevel dEntryLevel sePossibleSignal ENTRYBUY. MaRates 0.low. maRates 0.high Muster 1 st Barserie Grenzen: sePossibleSignal ENTRYNONE bedeutet kein Signal heute return (sePossibleSignal) Anzeige der Funktion sdRangeHigh dRangeHigh maRates 0.high sdRangeLow dRangeLow maRates 0.low sonst 1. Bar in der Nähe Ebenen öffnen Bedingungen nicht übereinstimmen für die Definition die durchschnittliche Barserie innerhalb der angegebenen Anzahl von Bars auf dem angegebenen Zeitraum von der Funktion angegebenen Zeit beginnt: Doppel fdAverageBarRange (. Berechnen durchschnittliche bar Größe int iBarsLimit, wie viele Bars ENUMTIMEFRAMES eTF PERIODCURRENT zu berücksichtigen Bars Zeitraum Datetime TTime WRONGVALUE wenn die Berechnung zu starten) Doppel dAverageRange 0 Variable für Werte, wenn (iBarsLimit lt 1) return (dAverageRange) MqlRates maRates bar info Array erhalten bar info aus dem angegebenen Geschichte Intervall summiert. if (TTime WRONGVALUE) TTime TimeCurrent () int iPriceBars CopyRates (Symbol eTF, TTime, IBarsLimit, maRates) if (iPriceBars WRONGVALUE) if (LogLevel gt LOGLEVELNONE) PrintFormat (s: Kopierschutz: Fehler u. FUNKTION. LetzteFehlerNr) return (dAverageRange) if (iPriceBars lt iBarsLimit) if (LogLevel gt LOGLEVELNONE) Printformat (s: CopyRates: kopiert u Stäbe u FUNCTION iPriceBars, iBarsLimit) Summe der Bereiche:.. Int iBar iPriceBars während (iBar-- gt 0 ) DAverageRange maountsiBar. high maRatesiBar. low Durchschnittlicher Wert: return (dAverageRange double (iPriceBars)) Es gibt nur ein Kriterium für die Muster zweiten (aktuellen) Barausbruch des yesterdays Bereichsgrenze sollte nicht kleiner sein als die in den Einstellungen TS8020ExtremumBreak). Sobald der Pegel erreicht ist, erscheint ein Signal für die Plazierung eines ausstehenden Auftrags: Überprüfen Sie die Muster 2. (aktueller) Balken auf D1: if (sePossibleSignal ENTRYBUY) sdSL dSL maPrüfungen 1.low StopLoss auf die heutigen High if (TS8020TakeProfitRatio gt 0 ) SDTP dTP dEntryLevel Punkt TS8020ExtremumBreak TS8020TakeProfitRatio Takeprofit return (ist der Ausbruch nach unten maRates 1.close lt maRates 0.low Punkt TS8020ExtremumBreak ENTRYBUY. ENTRYNONE) if (sePossibleSignal ENTRYSELL) SDSL dSL maRates 1.high Stoploss auf den heutigen Low if (TS8020TakeProfitRatio gesehen deutlich gt 0) SDTP dTP dEntryLevel Punkt TS8020ExtremumBreak TS8020TakeProfitRatio Takeprofit return (ist der Ausbruch nach oben maRates 1.close gt maRates klar 0 gesehen. high Punkt TS8020ExtremumBreak ENTRYSELL. ENTRYNONE) speichern Sie die beiden oben genannten Funktionen (feGetEntrySignal und fdAverageBarRange erwähnt) und die benutzerdefinierten Einstellungen in Bezug auf Empfangen eines Signals an die mqh-Bibliotheksdatei. Die vollständige Liste ist unten angebracht. Hier können Sie die Datei Signal80-20.mqh benennen und in das entsprechende Verzeichnis des Terminal-Datenordners (MQL5IncludeExpertSignal) legen. Indikator für manuelles Handeln Wie bei der EA ist auch das oben beschriebene Signalmodul zu verwenden. Der Indikator sollte einen Händler darüber informieren, dass er ein anstehendes Order-Placement-Signal erhält und die berechneten Ebenen Order Placement, Take Profit und Stop Loss Level zur Verfügung stellt. Ein Benutzer kann eine Benachrichtigungsmethode ein Standard-Popup-Fenster, E-Mail-Benachrichtigung oder Push-Benachrichtigung auswählen. Es ist möglich, alle auf einmal oder jede Kombination, die Sie mögen, zu wählen. Ein weiteres Indikatorziel ist ein Handelsgeschichtslayout nach 80-20 TS. Das Kennzeichen ist es, die täglichen Balken hervorzuheben, die den Systemkriterien entsprechen. Die Pegellinien zeigen, wie sich die Situation im Laufe der Zeit entwickelt hat. Für mehr Klarheit können wir tun, wie folgt: Wenn der Preis die Signalleitung berührt, wird diese durch eine ausstehende Bestellzeile ersetzt. Wenn der ausstehende Auftrag aktiviert ist, wird seine Zeile durch die Gewinn - und Stop-Loss-Linien ersetzt. Diese Zeilen werden unterbrochen, wenn der Preis eine davon berührt (die Bestellung ist geschlossen). Dieses Layout macht es leichter, die Effizienz der Handelssystemregeln zu bewerten und zu definieren, was verbessert werden kann. Beginnen wir mit der Deklaration der Puffer und deren Anzeigeparameter. Zuerst müssen wir die beiden Puffer mit der vertikalen Flächenfüllung (DRAWFILLING) deklarieren. Der erste ist, den vollen täglichen Stabbereich des vorhergehenden Tages hervorzuheben, während ein anderer ist, den inneren Bereich nur zu markieren, um ihn von den oberen und unteren 20 des Bereichs zu unterscheiden, der in TS verwendet wird. Danach deklarieren Sie die beiden Puffer für die mehrfarbige Signalleitung und die anstehende Auftragszeile (DRAWCOLORLINE). Ihre Farbe hängt von der Handelsrichtung ab. Es gibt andere zwei Zeilen (Take Proft und Stop Loss) mit ihrer Farbe bleiben die gleiche (DRAWLINE) sie sind die gleichen Standard-Farben zugewiesen werden, um ihnen im Terminal. Alle ausgewählten Anzeigetypen mit Ausnahme einer einfachen Zeile benötigen jeweils zwei Puffer, so dass der Code wie folgt aussieht: property indicatorchartwindow-Eigenschaft indicatorbuffers 10 property indicatorplots 6 Eigenschaft indicatorlabel1 1 St Balken der Mustereigenschaft indicatortype1 DRAWFILLING property indicatorcolor1 clrDeepPink. ClrDodgerBlue Eigenschaft indicatorwidth1 1 Eigenschaft indicatorlabel2 1 St Balken der Mustereigenschaft indicatortype2 DRAWFILLING Eigenschaft indicatorcolor2 clrDeepPink. ClrDodgerBlue Eigenschaft indicatorwidth2 1 property indicatorlabel3 Signalpegeleigenschaft indicatortype3 DRAWCOLORLINE Eigenschaft indicatorstyle3 STYLESOLID Eigenschaft indicatorcolor3 clrDeepPink. ClrDodgerBlue Eigenschaft indicatorwidth3 2 property indicatorlabel4 Einstiegseigenschaft indicatortype4 DRAWCOLORLINE Eigenschaft indicatorstyle4 STYLEDASHDOT Eigenschaft indicatorcolor4 clrDeepPink. clrDodgerBlue Eigenschaft indicatorwidth4 2 Eigenschaft indicatorlabel5 Stop-Loss-Eigenschaft indicatortype5 DrawLine Eigenschaft indicatorstyle5 STYLEDASHDOTDOT Eigenschaft indicatorcolor5 clrCrimson Eigenschaft indicatorwidth5 1 Objekt indicatorlabel6 Profit Immobilien indicatortype6 DrawLine Eigentum Nehmen indicatorstyle6 STYLEDASHDOTDOT Eigenschaft indicatorcolor6 clrLime Eigenschaft indicatorwidth6 1 Lets Händler bieten die Möglichkeit, die Füllung der täglichen Muster zu deaktivieren Ersten Balken, wählen Sie Signal Benachrichtigung Optionen und begrenzen die Historie-Layout-Tiefe. Alle Trading-Systemeinstellungen des Signalmoduls sind hier ebenfalls enthalten. Dazu müssen wir die im Modul verwendeten Variablen vorläufig aufzählen, auch wenn einige von ihnen nur im EA verwendet werden und im Indikator nicht erforderlich sind: include ltExpertSignalSignal80- 20.mqhgt 80-20 TS Signalmoduleingang Bool ShowOuter true 1 St Balken des Musters: Zeigen Sie den vollen Bereich Eingang bool ShowInner true 1 St Balken des Musters: Zeigen Sie den inneren Bereich Eingang bool AlertPopup true Alert: Zeigen Sie ein Popup-Fenster Eingang bool AlertEmail false Alert: E-Mail senden AlertEmailSubj Alert-Eingabestring: E-Mail Betreff Eingang Bool AlertPush wahr Alarm: eine Push-Benachrichtigung Eingang senden uint BarsLimit 2000 Geschichte Layout Tiefe (in der aktuellen TF Balken) ENUMLOGLEVEL LogLevel LOGLEVELNONE Logging-Modus Doppel buff1stBarOuter, buff1stBarOuterZero, Puffer für die gesamte Palette der Muster Plotten 1 st bar buff1stBarInner, buff1stBarInnerZero, Puffer, um den internen 60 der Muster 1 st bar buffSignal, buffSignalColor zum Plotten, Signalleitungspuffer buffEntry, buffEntryColor, noch nicht erledigten Auftrag Zeilenpuffer buffSL, buffTP, Stoploss und Takeprofit Linien Puffer gdExtremumBreak 0 TS8020ExtremumBreak in Symbol Preise int giD1AveragePeriod 1. korrekten Wert für TS8020D1AveragePeriod giMinBars WRONGVALUE minimal erforderliche Anzahl von Takten für die erneute Berechnung int OnInit () prüfen Sie die eingegebene TS8020D1AveragePeriod Parameter: giD1AveragePeriod int (fmin (1. TS8020D1AveragePeriod)) Umwandlung Punkte auf Symbol Preise: gdExtremumBreak TS8020ExtremumBreak Punkt minimal erforderliche Anzahl Bars für Neuberechnung Anzahl der Balken des aktuellen TF innerhalb eines Tages giMinBars int (86400 PeriodSeconds ()) Indikator Puffer Ziel: 1. Bars vollständige Palette Rechteck SetIndexBuffer (0 buff1stBarOuter, INDICATORDATA) PlotIndexSetDouble (0 PLOTEMPTYVALUE. 0) SetIndexBuffer (1. buff1stBarOuterZero, INDICATORDATA) 1. Bars inneren Bereich Rechteck SetIndexBuffer (2. buff1stBarInner, INDICATORDATA) PlotIndexSetDouble (1. PLOTEMPTYVALUE. 0) SetIndexBuffer (3. buff1stBarInnerZero, INDICATORDATA) Signalleitung SetIndexBuffer (4. buffSignal, INDICATORDATA) PlotIndexSetDouble (2. PLOTEMPTYVALUE. 0) SetIndexBuffer (5. buffSignalColor, INDICATORCOLORINDEX) noch nicht erledigten Auftrag Bestücklinie SetIndexBuffer (6. buffEntry, INDICATORDATA) PlotIndexSetDouble (3. PLOTEMPTYVALUE. 0) SetIndexBuffer (7. buffEntryColor, INDICATORCOLORINDEX) SL Linie SetIndexBuffer (8. buffSL, INDICATORDATA) PlotIndexSetDouble (4. PLOTEMPTYVALUE. 0) TP Linie SetIndexBuffer (9. buffTP, INDICATORDATA) PlotIndexSetDouble (5. PLOTEMPTYVALUE. 0) IndicatorSetInteger (INDICATORDIGITS. Digits) IndicatorSetString (INDICATORSHORTNAME. 80-20 TS) Platzieren Sie den Haupt-Code-Programme Auf die eingebaute OnCalculate-Funktion die Schleife für die Iteration über die aktuellen Zeitrahmen von der Vergangenheit in die Zukunft suchen sie für ein Signal mit der Funktion aus dem Signal-Modul. Deklarieren und initialisieren Sie die notwendigen Variablen mit Initialwerten. Definiert die älteste Schleifenleiste für die erste Berechnung unter Berücksichtigung eines benutzerdefinierten History-Tiefenlimits (BarsLimit). Für nachfolgende Aufrufe werden alle Balken des aktuellen Tages (anstelle des letzten Taktes) neu berechnet, da das Zwei-Balken-Muster tatsächlich unabhängig vom aktuellen Zeitrahmen zum D1-Diagramm gehört. Außerdem sollten wir gegen die sogenannten Phantome schützen: Wenn wir bei der Neuinitialisierung kein erzwungenes Indikatorpuffer-Clearing durchführen, bleiben beim Umschalten von Zeitrahmen oder Symbolen nicht mehr relevante gefüllte Bereiche auf dem Bildschirm. Das Puffer-Clearing sollte an den ersten OnCalculate-Funktionsaufruf nach der Indikatorinitialisierung gebunden werden. Die standardmäßig vorberechneten Variablen reichen jedoch nicht aus, um festzustellen, ob der Aufruf der erste ist, da er nicht nur während des ersten Funktionsaufrufs, sondern auch beim Ändern der Prüfsumme Null enthalten kann. Lets verbringen einige Zeit, um dieses Problem ordnungsgemäß zu lösen, indem Sie die Struktur nicht durch die Einstellung der vorberechneten Variable auf Null. Die Struktur dient zum Speichern und Verarbeiten von Daten, die häufig in den Indikatoren verwendet werden: - Flag der Funktion OnCalculate zum ersten Start - der Zähler der berechneten Balken, der beim Ändern der Prüfsummenflagge der Änderung der Prüfsummenflagge des Beginns von Eine neue Bar - aktuelle Bar Startzeit. Die Struktur, die alle diese Daten kombiniert, soll auf globaler Ebene deklariert werden. Es sollte in der Lage sein, zu sammeln oder präsentieren Daten von jeder eingebauten oder benutzerdefinierten Funktionen. Nennen Sie diese Struktur Brownie. Er kann am Ende des Anzeigecodes platziert werden. Eine einzige globale Typ Strukturobjekt namens goBrownie ist auch dort erklärt werden: struct BROWNIE Datetime tLastBarTime Zeit der letzten verarbeiteten bar int iPrewCalculated Anzahl der berechneten Bars Bool bFirstRun ersten Bool Start Flag bHistoryUpdated Geschichte Update-Flag Bool bIsNewBar neue bar Öffnungs Flagge BROWNIE ( Standardwerte): tLastBarTime 0 iPrewCalculated WRONGVALUE bFirstRun bIsNewBar wahr bHistoryUpdated falsch Leere fReset (bool bResetFirstRun true) Standardwerte: tLastBarTime 0 iPrewCalculated WRONGVALUE if (bResetFirstRun) bFirstRun wahr auf Null gesetzt, wenn es die Erlaubnis ist bIsNewBar wahr bHistoryUpdated falsch Leere fUpdate (int iNewPrewCalculated WRONGVALUE ) Flagge der Funktion OnCalculate eingebaute in erster anrufen, wenn (bFirstRun ampamp iPrewCalculated gt 0) bFirstRun falsche Datumzeit neue Bar tThisBarTime TimeCurrent () - TimeCurrent () PeriodSeconds () bIsNewBar tLastBarTime tThisBarTime die aktuelle Bar Zeit aktualisieren, wenn (bIsNewBar) tLastBarTime tThisBarTime wenn (iNewPrewCalculated gt - 1) gibt es irgendwelche Veränderungen in der Geschichte bHistoryUpdated iNewPrewCalculated 0 ampamp iPrewCalculated gt WRONGVALUE Verwendung prewcalculated bei OnCalculate 1. Aufruf if (iPrewCalculated WRONGVALUE) iPrewCalculated iNewPrewCalculated oder wenn es keine Geschichte Update else if (iNewPrewCalculated gt 0) iPrewCalculated iNewPrewCalculated BROWNIE goBrownie Läßt die Brownie des Ereignisses Anzeige Deinitialisierung informieren: void OnDeinit (const int Grund) goBrownie. fReset () informieren Brownie Falls erforderlich, die Menge des durch die Brownie gespeicherten Daten können erweitert werden, wenn benutzerdefinierte Funktionen oder Klassen Preise müssen , Volumes oder den aktuellen Balken-Spread-Wert (Open, High, Low, Close, tickvolume, volume, spread). Es ist bequemer, fertige Daten aus der OnCalculate-Funktion zu verwenden und über Brownie zu übertragen, anstatt die Zeitreihen-Kopierfunktionen (CopyOpen, CopyHigh etc. oder CopyRates) zu verwenden, dies erspart die CPU-Ressourcen und eliminiert die Notwendigkeit, die Verarbeitung von Fehlern zu arrangieren Dieser Sprachfunktionen. Rückkehr zur Hauptanzeigefunktion. Variablen und zur Vorbereitung der Arrays Deklarieren der Blick goBrownie Struktur wie folgt verwendet: goBrownie. fUpdate (prevcalculated) feed Daten zu Brownie int iPeriodBar 0. Hilfszähler iCurrentTFBar ratestotal - int (BarsLimit) bar Index des aktuellen TF Schleife statischen Datetime stLastD1Bar 0 Mal starten der zuletzt bearbeiteten Balken des Paares von D1 Bars (Muster 2 nd bar) static int si1stBarofDay 0 Index der aktuellen Tage ersten Takt if (goBrownie. bFirstRun) die Puffer während der erneuten Initialisierung löschen: ArrayInitialize (buff1stBarInner, 0) ArrayInitialize ( buff1stBarInnerZero, 0) ArrayInitialize (buff1stBarOuter, 0) ArrayInitialize (buff1stBarOuterZero, 0) ArrayInitialize (buffEntry, 0) ArrayInitialize (buffEntryColor, 0) ArrayInitialize (buffSignal, 0) ArrayInitialize (buffSignalColor, 0) ArrayInitialize (buffTP, 0) ArrayInitialize (buffSL, 0) stLastD1Bar 0 si1stBarofDay 0 sonst datetime tTime TimeCurrent () minimale Neuberechnungstiefe - vom Vortag: iCurrentTFBar ratestotal - Balken (Symbol. ZEITSCHRIFT. TTime - tTime 86400. tTime) - 1 ENUMENTRYSIGNAL eSignal ENTRYUNKNOWN Signal doppelt dSL WRONGVALUE. SL-Ebene dTP WRONGVALUE. TP-Ebene dEntryLevel WRONGVALUE. Einstieg dRangeHigh WRONGVALUE. dRangeLow WRONGVALUE Grenzen der Muster 1 st Barserie Datetime tCurrD1Bar 0. Strom D1 bar Zeit (Muster 2 nd bar) tD1BarToFill 0 D1 bar Zeit gefüllt werden (Muster 1 st bar) sicherstellen, dass die anfängliche Neuberechnung bar Index innerhalb akzeptabel ist Bereich: iCurrentTFBar int (fmax (0 fmin (iCurrentTFBar, ratestotal - giMinBars))) Überprüfen Sie das Vorhandensein eines Signals während (iCurrentTFBar lt ratestotal ampamp IsStopped ().) ist die Hauptprogrammschleife hier befindet, wenn über die aktuelle Iteration Zeitraum Bars: eSignal feGetEntrySignal (Time iCurrentTFBar, dEntryLevel, dSL, DTP-, dRangeHigh, dRangeLow) if (eSignal gt 1) während des Tages kein Signal weiterhin die Bar gehört wenn ein Signal an einem neuen Tag erste Bar, der Bereich der Die vorherige Tagesbar sollte ausgefüllt werden. Der Wert der tD1BarToFill-Variable vom Datetime-Typ wird als Flag verwendet. Wenn es gleich WRONGVALUE ist, ist keine Füllung auf dieser Leiste erforderlich. Die Signalleitung sollte am gleichen ersten Balken beginnen, lässt sie aber zur besseren Layout-Wahrnehmung auf den letzten Balken des Vortags erweitern. Da die Berechnungen von einer Signalleitung, sowie Linie und Füllung Farben für bullish und bearish Bars unterschiedlich sind, können zwei ähnliche Blöcke machen: tCurrD1Bar Zeit iCurrentTFBar Zeit iCurrentTFBar 86400 Beginn des Tages gehört die Bar zu, wenn (stLastD1Bar lt tCurrD1Bar) tD1BarToFill Zeit iCurrentTFBar 1 Zeit iCurrentTFBar 1 86400 si1stBarofDay iCurrentTFBar sonst tD1BarToFill WRONGVALUE vorherigen Tages-Bar, keine neue Füllung erforderlich stLastD1Bar tCurrD1Bar erinnern, wenn (tD1BarToFill WRONGVALUE) Füllen der vorherigen Tage D1 bar: iPeriodBar iCurrentTFBar if (dEntryLevel lt dRangeHigh) if (ShowOuter), während (- - iPeriodBar gt 0), wenn (Time iPeriodBar lt tD1BarToFill) brechen buff1stBarOuterZeroiPeriodBar dRangeLow buff1stBarOuteriPeriodBar dRangeHigh if (ShowInner) iPeriodBar iCurrentTFBar während (--iPeriodBar gt 0), wenn (Time iPeriodBar lt tD1BarToFill) brechen buff1stBarInnerZeroiPeriodBar dRangeLow 0,2 (dRangeHigh dRangeLow) buff1stBarInneriPeriodBar dRangeHigh 0.2 ( dRangeHigh dRangeLow) Start der Signalleitung von den vorherigen Tagen letzten Takt buffSignaliCurrentTFBar buffSignaliCurrentTFBar 1 dRangeLow gdExtremumBreak buffSignalColoriCurrentTFBar buffSignalColoriCurrentTFBar 1 0 else if (ShowOuter), während (--iPeriodBar gt 0), wenn (Time iPeriodBar lt tD1BarToFill) brechen buff1stBarOuterZeroiPeriodBar dRangeHigh buff1stBarOuteriPeriodBar dRangeLow if ( ShowInner) iPeriodBar iCurrentTFBar während (--iPeriodBar gt 0), wenn (Time iPeriodBar lt tD1BarToFill) brechen buff1stBarInnerZeroiPeriodBar dRangeHigh 0,2 (dRangeHigh dRangeLow) buff1stBarInneriPeriodBar dRangeLow 0,2 (dRangeHigh dRangeLow) Start der Signalleitung von den vorherigen Tagen letzten Takt buffSignaliCurrentTFBar buffSignaliCurrentTFBar 1 dRangeHigh gdExtremumBreak buffSignalColoriCurrentTFBar buffSignalColoriCurrentTFBar 1 1 weiterhin sonst Alle übrigen Layout Linien sind innerhalb des aktuellen Zeitrahmen Bars Iterationsschleife aufgetragen werden. Wie bereits erwähnt, sollte die Signalleitung an der Bar enden, wo der Preis sie berührte. Die anstehende Auftragslinie sollte an der gleichen Leiste beginnen und auf der Leiste enden, an der der Kontakt mit dem Preis erfolgt. Nehmen Sie Profit und Stop Loss Linien sollte an der gleichen Bar starten. Das Layout des Musters wird an der Bar beendet, bei dem der Preis berührt eine von ihnen: Die Signalleitung bis durch einen Balken gekreuzt: iPeriodBar iCurrentTFBar if (dEntryLevel lt dRangeHigh), während (iPeriodBar lt ratestotal), wenn (Time iPeriodBar gt tCurrD1Bar 86399) brechen buffSignaliPeriodBar dRangeLow gdExtremumBreak buffSignalColoriPeriodBar 0 if (dRangeLow gdExtremumBreak gt Low iPeriodBar) brechen sonst während (iPeriodBar lt ratestotal), wenn (Time iPeriodBar gt tCurrD1Bar 86399) brechen buffSignaliPeriodBar dRangeHigh gdExtremumBreak buffSignalColoriPeriodBar 1 if (dRangeHigh gdExtremumBreak lt Hohe iPeriodBar) Pause Eingabezeile bis gekreuzt durch Bar: if (dEntryLevel lt dRangeHigh), während (iPeriodBar lt ratestotal), wenn (Time iPeriodBar gt tCurrD1Bar 86399) brechen buffEntryiPeriodBar dRangeLow buffEntryColoriPeriodBar 0 if (dRangeLow lt Hohe iPeriodBar), wenn (. buffEntryiPeriodBar 1 0) starten und auf einer einzigen Bar zu beenden, erstrecken sich von 1 bar in die Vergangenheit buffEntryiPeriodBar 1 dRangeLow buffEntryColoriPeriodBar 1 0 Pause sonst während (iPeriodBar lt ratestotal), wenn (Time iPeriodBar gt tCurrD1Bar 86399) brechen buffEntryiPeriodBar dRangeHigh buffEntryColoriPeriodBar 1 if (dRangeHigh gt Low iPeriodBar) if (buffEntryiPeriodBar 1 0.) beginnen und Ende auf einem Balken erstrecken sich von 1 bar in die Vergangenheit buffEntryiPeriodBar 1 dRangeHigh buffEntryColoriPeriodBar 1 1 Pause TP und SL Linien bis einer von ihnen durch einen Balken gekreuzt wird: if (dEntryLevel lt dRangeHigh) SL seit dem Beginn der Nieder gleich von Ein Tag: dSL Low ArrayMinimum (Low. si1stBarofDay, iPeriodBar si1stBarofDay), während (iPeriodBar lt ratestotal), wenn (Time iPeriodBar gt tCurrD1Bar 86399) brechen buffSLiPeriodBar dSL buffTPiPeriodBar dTP wenn (DTP lt Hohe iPeriodBar dSL gt Low iPeriodBar) if (buffSLiPeriodBar 1 0.) beginnen und auf einer einzigen Bar zu beenden, von 1 bar verlängern SL in die Vergangenheit buffSLiPeriodBar 1 dSL buffTPiPeriodBar 1 dTP brechen andere ist gleich dem Hoch seit dem Beginn eines Tages: dSL Hohe ArrayMaximum (High si1stBarofDay, iPeriodBar si1stBarofDay.), während (iPeriodBar lt ratestotal), wenn (Time iPeriodBar gt tCurrD1Bar 86399) buffSLiPeriodBar dSL buffTPiPeriodBar dTP brechen, wenn (dSL lt Hohe iPeriodBar dTP gt Low iPeriodBar) if (buffSLiPeriodBar 1 0.) beginnen und auf einer einzigen Bar zu beenden, um 1 bar auf den buffSLiPeriodBar 1 dSL buffTPiPeriodBar 1 dTP Pause vorbei verlängern Lässt Platz Der Rufcode der fDoAlert-Signalbenachrichtigung aus der Schleife heraus. In der Tat hat es etwas breitere Chancen im Vergleich zu denjenigen, die in diesem Indikator die Funktion in der Lage, mit Audio-Dateien arbeiten, was bedeutet, dass diese Option kann, um benutzerdefinierte Einstellungen hinzugefügt werden. Gleiches gilt für die Möglichkeit, separate Dateien für Kauf - und Verkaufssignale auszuwählen. Funktionslisting:.. Leere fDoAlert (Funktion für echte Signale und Benachrichtigungen String sMessage, Alarmmeldung Bool bAlert Senden zeigen ein Pop-up-Fenster Bool bSound falsch spielen eine Sounddatei Bool bEmail false false eine eMail Bool bNotification senden eine Push-Benachrichtigung zu senden.. String sEmailSubject. eMail Zeichenkette sSound ALERT. WAV Tondatei) static string ssPrevMessage Stille vorherige Warnmeldung statische Datetime stPrevTime vorherige Benachrichtigung bar Zeit Datumzeit tThisBarTime TimeCurrent () PeriodSeconds () PeriodSeconds () Stromschiene Zeit, wenn (ssPrevMessage sMessage stPrevTime tThisBarTime war) ein anderer und oder 1 st in dieser Bar erinnern: ssPrevMessage sMessage stPrevTime tThisBarTime eine Nachrichtenkette bilden. sMessage String (ssss, TimeToString (TimeLocal (), TIMESECONDS) Ortszeit Symbol Symbol StringSubstr (EnumToString (ENUMTIMEFRAMES (Periode)), 7) , TF sMessage-Meldung) Benachrichtigungssignal aktivieren: if (bAlert) Alert (sMessage) if (bEmail) SendMail (sEmailSubject Symbol. sMessage) if (bNotification) SendNotification (sMessage) if (bSound) Playsound (sSound) Der Code für die Überprüfung der Notwendigkeit, die Funktion aufrufen und bilden den Text für sie im Programmkörper vor Beendigung des OnCalculate Event-Handler befindet: alert iPeriodBar ratestotal 1 Strom bar if (AlertPopup AlertEmail AlertPush 0) return (ratestotal) alle ist deaktiviert, wenn (buffSignaliPeriodBar 0) return (ratestotal) noch nichts zu fangen (oder schon), wenn (buffSignaliPeriodBar gt Hoch iPeriodBar buffSignaliPeriodBar lt Low iPeriodBar) return (ratestotal) nein Signalleitung berühren Nachrichtentext: string sMessage String (TS 80-20: benötigt ss, TP: s, SL: s., buffSignalColoriPeriodBar gt 0. BuyStop SellStop, DoubleToString (dEntryLevel, Digits), DoubleToString (dtp Digits), DoubleToString ( dSL, Digits)) Benachrichtigung. fDoAlert (sMessage, AlertPopup, falsche AlertEmail, AlertPush, AlertEmailSubj) return (ratestotal) komplett OnCalculate Betrieb der gesamte Quellcode des Indikators in den angehängten Dateien (TS80-20.mq5) gefunden werden. Das Trading-Layout nach dem System ist am besten in Minuten-Charts zu sehen. Bitte beachten Sie, dass der Indikator die Balken-Daten anstelle von Tick-Sequenzen innerhalb der Balken verwendet. Das heißt, wenn der Kurs mehrere Layoutlinien (zB Take Profit und Stop Loss Linien) auf einer einzigen Leiste überschritten hat, können Sie nicht immer festlegen, welche davon zuerst überschritten wurden. Eine weitere Unsicherheit ergibt sich aus der Tatsache, dass die Anfangs - und Endzeilen nicht zusammenfallen können. Andernfalls werden die Zeilen aus dem Puffer der DRAWLINE - und DRAWCOLORLINE-Typen für einen Benutzer einfach nicht sichtbar. Diese Merkmale reduzieren die Layoutgenauigkeit, aber es bleibt noch ganz klar. Expert Advisor für die Prüfung der 80-20 Trading-Strategie Die grundlegende EA für Test-Strategien aus dem Buch Street Smarts: Hohe Wahrscheinlichkeit Kurzfristige Handelsstrategien wurde im Einzelnen im ersten Artikel beschrieben. Hier können zwei wesentliche Änderungen vorgenommen werden. First, the signal module is to be used in the indicator as well meaning it would be reasonable to set trading levels calculation in it. We have already done this above. Apart from the signal status, the feGetEntrySignal function returns order placement, Stop Loss and Take Profit levels. Therefore, lets remove the appropriate part of the code from the previous EA version adding the variables for accepting levels from the function and edit the function call itself. The listings of the old and new code blocks can be found in the attached file (strings 128-141). Another significant addition to the basic EA code is due to the fact that, unlike the previous two, this TS deals with a short-term trend. It assumes that the roll-back happens once a day and is unlikely to be repeated. This means that the robot has to make only one entry ignoring the existing signal all the rest of the time until the next day. The easiest way to implement that is to use a special flag static or global variable of bool type in the program memory. But if the EA operation is interrupted for some reason (the terminal is closed, the EA is removed from the chart, etc.), the flag value is lost as well. Thus, we should have the ability to check if todays signal was activated previously. To do this, we may analyze the history of trades for today or store the date of the last entry in the terminal global variables rather than in the program. Let us use the second option since it is much easier to implement. Provide users with the ability to manage one entry per day option and set an ID of each launched version of the robot it is needed to use global variables of the terminal level: input bool OneTrade false One position per day input uint MagicNumber 2016 EA magic number Lets add the variables necessary to implement one entry per day option to the programs global variables definition block. Initialize them in the OnInit function: string gsPrefix identifier of (super)global variables bool gbPositionToday false , gbPendingToday false Create a prefix of (super)global variable names: gsPrefix StringFormat ( SSB s u s. Symbol. MagicNumber, MQLInfoInteger ( MQLTESTER ). t . ) Has the robot worked with market or pending orders today gbPositionToday int ( GlobalVariableGet (gsPrefix LastPositionDate )) TimeCurrent () TimeCurrent () 86400 gbPendingToday int ( GlobalVariableGet (gsPrefix LastPendingDate )) TimeCurrent () TimeCurrent () 86400 Here the robot reads the values of global variables and compares the written time with the day start time, thus defining if the todays signal has already been processed. Time is written to the variables in two places lets add the appropriate block to the pending order installation code (additions highlighted): if (iTry - 10 ) if (LogLevel gt LOGLEVELNONE) Print ( Pending order placing error ) the distance from the current price is not enough :( if (LogLevel gt LOGLEVELERR) PrintFormat ( Pending order cannot be placed at the s level. Bid: s Ask: s StopLevel: s , DoubleToString (dEntryLevel, Digits ), DoubleToString (goTick. bid, Digits ), DoubleToString (goTick. ask, Digits ), DoubleToString (gdStopLevel, Digits ) ) else to update the flag: GlobalVariableSet ( in the terminal global variables gsPrefix LastPendingDate , TimeCurrent () TimeCurrent () 86400 ) gbPendingToday true in the program global variables The second block is placed after the code defining a newly opened position: if ( PositionSelect ( Symbol )) if ( PositionGetDouble ( POSITIONSL ) 0 .) if (gbPositionToday) update the flag: GlobalVariableSet ( in the terminal global variables gsPrefix LastPositionDate , TimeCurrent () TimeCurrent () 86400 ) gbPositionToday true in the program global variables . These are the only significant changes in the previous EA version code. The finalized source code of the new version is attached below. Strategy backtesting In order to illustrate the trading system viability, its authors use patterns detected on the charts from the end of the last century. Therefore, we need to check its relevance in todays market conditions. For testing, I took the most popular Forex pair EURUSD, the most volatile pair USDJPY and one of the metals XAUUSD. I increased the indents specified by Raschke and Connors 10 times, since four-digit quotes were used when the book was written, while I tested the EA on five-digit ones. Since there is no any guidance concerning the trailing parameters, I have selected the ones that seem to be most appropriate to daily timeframe and instrument volatility. The same applies to the Take Profit calculation algorithm added to the original rules the ratio for its calculation was chosen arbitrarily, without deep optimization. The balance chart when testing on the five-year EURUSD history with the original rules (no Take Profit): The same settings and Take Profit: The balance chart when testing the original rules on the five-year USDJPY history: The same settings and Take Profit: The balance chart when testing the original rules on the daily gold quotes for the last 4 years: The full data on the robot settings used in each test can be found in the attached archive containing the complete reports. Conclusion The rules programmed in the signal module match the 80-20 trading system description provided by Linda Raschke and Laurence Connors in their book Street Smarts: High Probability Short-Term Trading Strategies. However, we have extended the original rules a bit. The tools (the robot and the indicator) are to help traders draw their own conclusions concerning the TS relevance in todays market. In my humble opinion, the TS needs a serious upgrade. In this article, I have tried to make some detailed comments on developing the code of the signal module, as well as the appropriate robot and indicator. I hope, this will help those who decide to do the upgrade. Apart from modifying the rules, it is also possible to find trading instruments that fit better to the system, as well as signal detection and tracking parameters. Trader-Info - Forex Trading - Stock Market Trading - Forex Scalping Systems - Forex Automated Please pour over the 80 forex currency trading strategy items on the checklist below that the big dogs use. Sie werden froh, dass Sie getan haben. Bitte nehmen Sie auf die Tatsache, dass Sie nur vier Werkzeuge, um das Devisenhandel mit, mit meinem Ansatz ndash Zählleisten, MACD-Divergenz, Pivot-Punkte und Trendline-Analyse. Das ist es. Nichts einfacher und einfacher. Lassen Sie sich nicht die Neinsager haben Sie sonst glauben. Die Welt ist voll von quotDoubting Thomasesquot, die allbodys Sessel-Quarterback sind, aber noch nie einen Cent in diesem Geschäft gemacht haben. Sie quotsell shovels. quot Sie verwenden sie nicht. Wenn Sie irgendeine Frage oder Anfrage haben, zögern dont, mit uns in Verbindung zu treten Unsere verbindliche GARANTIE Wenn Sie nicht mit Ihrem Kauf aus einem Grund oder einem anderen zufrieden sind, möchten wir Sie versichern, dass Sie völlig bedeckt werden unsere 60 Tagesgeld-Rückseitengarantie sind. Die Materialien stehen zum Download als PDF-Dateien, Word-Dateien, EXE-Dateien, eBooks und Software zur Verfügung. Falls Sie nicht zufrieden sind, werden Sie zurückerstattet. Wir sind an diese Garantie gebunden. Sie müssen diese Methoden nach unseren Anweisungen für mindestens 60 Tage zu betreiben und ein Nachweis, dass muss verfügbar sein, bevor wir Ihre erste Zahlung zurückerstatten können. Wir sind jedoch zuversichtlich, dass Sie mit dem Inhalt aller unserer Methoden zufrieden sein werden. What are you waiting for Recieve this eBook immediately after paying FREE Digital Delivery Terms and Conditions Item is sold with 30 days Money Back Guarantee.


No comments:

Post a Comment