Expert Advisor auf Grundlage der New Trading Dimensions von Bill Williams

Alexey Klenov | 14 Januar, 2016


Einleitung

In diesem Beitrag erkläre ich die Entwicklung eines Handels-Expert Advisors, auf Grundlage des Buchs New Trading Dimensions: How to Profit from Chaos in Stocks, Bonds, and Commodities von Bill Williams für die MetaTrader 5 Plattform in der MQL5 Sprache. Die Strategie selbst ist wohl bekannt, ihre Anwendung jedoch unter Händlern immer noch umstritten. 

Mit ihrer gebrauchsfertigen Studie von Signalen, die "fast komplett" ohne eine subjektive Sicht auskommen, verglichen z.B. mit der Interpretation der Elliott Wellen-Theorie, ist sie für Anfänger sehr interessant. Doch dies gilt nur auf den ersten Blick, denn an manchen Stellen muss immer noch der Händler Entscheidungen treffen. Und darum geht es im folgenden Beitrag.

Ziele dieses Beitrags:


1. Indikatoren

In der Basis des Handelssystems befinden sich Signale von vier (4) Indikatoren:

  1. Alligator;
  2. Fraktale;
  3. The Awesome Oscillator (Der Wahnsinns-Oszillator);
  4. Acceleration/Deceleration (Beschleunigung/Verlangsamung).

1.1 Alligator

Der techn. Indikator Alligator ist eine Kombination von Saldo-Linien (gleitende Mittelwerte, Moving Averages), die fraktale Geometrie und nicht-lineare Dynamiken verwenden.

Die Linien der Lippen, Zähne und Kiefer des Alligator stellen die Interaktion verschiedener Zeiträume dar. Da Markttrends etwa nur zu 15-30 Prozent der Zeit festgestellt werden können, müssen wir ihnen folgen und nicht auf Märkten arbeiten, die nur innerhalb gewisser Zeiträume Fluktuationen zeigen.

Sobald Kiefer, Zähne und Lippen geschlossen oder miteinander verflochten sind, wird der Alligator bald schlafen oder tut dies bereits. Und wenn er schläft, bekommt er Hunger, viel Hunger: je länger er also schläft, um so hungriger wacht er später wieder auf. Und dann öffnet er sein Riesenmaul und beginnt zu gähnen. Und dann erreicht ihn der Geruch von Nahrung: das Futter einer Hausse oder Baisse - und los geht seine Jagd. Ist der Alligator einmal satt, interessiert ihn der Kurs seiner Nahrung nicht mehr (die Saldo-Linien laufen zusammen) - und das ist genau der Moment, den Gewinn festzumachen.

1.2 Fraktale

Alle Märkte sind dadurch charakterisiert, dass für einen Großteil der Zeit die Kurse nicht stark fluktuieren und man Veränderungen im Trend nur für einen kurzen Zeitraum (15-30 Prozent) feststellen kann. Die günstigsten Zeiträume für die Mitnahme von Gewinn sind, wenn sich Marktkurse in Übereinstimmung mit einem gewissen Trend verändern.

Fraktale (Fractals) - ist einer der 4 Indikatoren des Handelssystem von Bill Williams, mit denen man Talsohlen und Spitzen entdecken kann. Die techn. Definition eines Aufwärts-Fraktals ist eine Reihe von mind. 5 aufeinander folgenden Bars, in der sich, vor und nach dem höchsten Max., zwei Bars mit geringeren Max. befinden. Die umgekehrte Konfiguration (eine Reihe von 5 aufeinander folgenden Bars, in der sich, vor und nach dem niedrigsten Min., zwei Bars mit höheren Mins befinden), ist ein Abwärts-Fraktal. Auf einem Chart haben Fraktale die Werte von Hoch und Niedrig und sind durch Aufwärts- oder Abwärtspfeile angezeigt.

Die Signale des techn. Indikators Fraktale müssen mit Hilfe des techn. Indikators 'Alligator' gefiltert werden. Mit anderen Worten: man sollte keinen Buy-Abschluss machen, wenn sich ein Fraktal unterhalb der Zähne des Alligators befindet. Und man sollte keinen Sell-Abschluss machen, wenn sich ein Fraktal oberhalb der Zähne des Alligators befindet. Nachdem das Fraktalsignal gebildet und in Kraft ist, was durch seines Position jenseits des Alligator-Kiefers festgelegt wird, bleibt es ein Signal, bis es getroffen wird oder bis ein zeitlich jüngeres Fraktalsignal auftaucht.

1.3 Der AO (Awesome Oscillator)

Der techn. Indikator 'Wahnsinns-Oszillator' von Bill Williams (Awesome Oscillator, AO) - ist ein 34-Zeitraum, einfacher gleitender Mittelwert, der durch die Mittelwertpunkte der Bars gebildet wird (H + L)/2, und vom 5-Zeitraum, einfacher gleitender Mittelwert subtrahiert wird, der durch die zentralen Punkte der Bars gebildet wird (H + L)/2. Der AO zeigt uns, was im Augenblick mit dem Markttreiber passiert.

1.4 AO (Accelerator Oscillator)

Als letztes Element verändert sich der Kurs. Bevor sich der Kurs verändert, verändert sich der Markttreiber, und bevor dieser Treiber seine Richtung ändert, sollte seine Beschleunigung nachlassen und Null erreichen. Dann beschleunigt er erneut, bis der Kurs seine Richtung zu ändern beginnt.

Der techn. Indikator 'Beschleunigung/Verlangsamung' (Accelerator/Decelerator Oscillator, AC) misst die Beschleunigung und Verlangsamung des aktuellen Markttreibers. Bevor sich eine Veränderung im Markttreiber abzeichnet, verändert dieser Indikator seine Richtung, sodass der Markttreiber seinerseits die Richtung ändert, bevor sich eine Kursveränderung abzeichnet. Wenn man begreift, dass der AC ein frühzeitiges Warnsignal ist, hat das klare Vorteile.


2. Signale

Das im Buch "New Trading Dimensions" von Bill Williams beschriebene Handelssystem, arbeitet mit Signalen aus 5 Handelsdimensionen.

Sehen wir uns die Signale jeder Dimension nun im Einzelnen an.


2.1 Beschreibung des Handels nach Signalen der ersten Dimension

Das "A"-Fraktal (Buy-Signal) ist falsch, da der Kursabbruch unterhalb der Kieferlinie des Alligators auftritt. Das "B"-Fraktal wird ausgeführt und wir haben eine eröffnete Short Position. Sobald das "C"-Fraktal auftritt, schließen wir unsere Short Position und haben bereits eine Netto-Long Position.

Mit dem Abbruch des "D"-Fraktals, verändern wir die Position abermals, von Buy auf Sell.  Durch Überwindung des "E"-Fraktals für einen Kauf, zeigt uns der Markt erneut, dass die Position von Sell auf Kaufen geändert werden muss. Mit der Ausführung der Signale der "G"- und "J"-Fraktale, fügen wir der Long Position einen weiteren Kontrakt hinzu.

Abb. 1 Handelsbeispiel in Signalen der ersten Dimension

Abb. 1 Handelsbeispiel in Signalen der ersten Dimension

2.2 Beschreibung des Handels nach Signalen der zweiten Dimension

Es wurden die zwei Signalarten der zweiten Dimension implementiert. Die sind der AO (Wahnsinns-Oszillator)-Indikator Nulllinien-Crossover und das "Untersetzer"-Signal. Lassen wir die Bar-Indizierung genauso zu, wie wir es in MetaTrader 5 machen, d.h. als Zeitreihen. Die Suche nach dem Signal findet auf Bar 0 statt.

Zur Bildung eines "Nulllinien-Crossover" Musters, müssen zwei Bars des Indikators vorhanden sein .

Das Buy-Signal bildet sich, wenn der zweite Bar des Indikators unterhalb der Nulllinie liegt und der erste oberhalb. Der max. Kurs des ersten Bars wird das Signal, und wenn es ihn übersteigt, wird die Buy-Order an den Server auf Grundalge des aktuellen Kurses, gesendet. Das Sell-Signal bildet sich beim exakt umgekehrten Crossover-Szenario.

Zur Bildung eines "Untersetzer"-Musters, müssen drei aufeinander folgende Bars vorhanden sein, wobei der zweite rot sein und oberhalb der Nulllinie liegen sollte; der erste hingegen sollte grün sein und höher als der zweite liegen.  Der Kurs für das Signal ist der höchste Kurs des ersten Bars, der solange gültig ist, bis er vom aktuellen Kurs abgelöst wird oder ein neues Buy-Signal entsteht.  Die Sell-Signale des "Untersetzer"-Musters werden ähnlich gebildet, jedoch auf der anderen Seite des Indikators.

Zur Bildung des "Untersetzer"-Musters, müssen drei aufeinander folgende Bars vorhanden sein, wobei der zweite rot sein und oberhalb der Nulllinie liegen sollte; der erste hingegen sollte grün sein und höher als der zweite liegen. Der Kurs für das Signal ist der höchste Kurs des ersten Bars, der solange gültig ist, bis er vom aktuellen Kurs abgelöst wird oder ein neues Buy-Signal entsteht. Die Sell-Signale des "Untersetzer"-Musters werden ähnlich gebildet, jedoch auf der anderen Seite des Indikators.

Die "Doppel-Spitzen" und "Doppel-Tal" Signale sind in diesem Beitrag nicht berücksichtigt und werden im EA nicht programmiert, da ihre Bildung fast immer auf der gegenüberliegenden Seite des Alligators auftritt: das Doppel-Tal liegt unterhalb der Kiefer-Linie, und die Doppel-Spitze oberhalb. Der Handel nach solchen Signalen widerspricht dem System, d.h. um den Alligator nicht zu füttern, können wir nicht unterhalb seines Kieferlinie kaufen und nicht oberhalb seiner Kieferlienie verkaufen.

Für eine detailliertere Beschreibung der Signale empfehle ich einen Blick in die Originalquelle.

Abb. 2 Beispiel von Handelssignalen der zweiten Dimension

Abb. 2 Beispiel von Handelssignalen der zweiten Dimension


2.3 Beschreibung des Handels nach Signalen der dritten Dimension

In der dritten Dimension kommen die Signale "Buy oberhalb der Nulllinie" und "Buy unterhalb der Nulllinie" vor, die durch den AC Indikator (Accelerator Oscillator) gebildet werden.

Sehen wir uns zunächst das in Abb. 3 festgelegte Muster an. Zunächst wird nach einem Bar 0 gesucht. Ob sich der erste Bar über der Nulllinie (Fall "A") befindet, die aus zwei grünen und einem roten Bars eines Histogramms besteht. Die Position des zweiten und dritten Bars, in Bezug auf die Nulllinie, spielt derweilen erst einmal keine Rolle.

Falls sich der erste Bar unter der Nulllinie (Fall "B") befindet, brauchen wir drei grüne und einen roten Bar zur Bildung des Buy-Signals. Die restlichen Bars in Bezug zur Nulllinie werden dabei vom Signal nicht berücksichtigt. Die Sell-Signale der dritten Dimension sind analog, nur eben umgekehrt.

Für eine detailliertere Beschreibung sowie Beispiele, verweise ich auf die Originalquelle.

Abb. 3 Handelsbeispiel nach Signalen der dritten Dimension

Abb. 3 Handelsbeispiel nach Signalen der dritten Dimension


2.4 Beschreibung des Handels nach Signalen der vierten Dimension ("Zonen-Handel")

Die grüne Zone entsteht, wenn für ein Bar zwei Indikatoren (AO+AC) grün sind.

Für die Bildung eines Handelssignals sind zwei aufeinander folgende grüne Zonen nötig; der Schlusskurs des ersten Bars muss höher sein als der Schlusskurs des zweiten Bars.

Die Ausführung wird implementiert, sobald ein neuer Bar geöffnet wird. Im Original sollte die Ausführung die Order beim Schließen eines Bars sein. Es gibt Situationen, in denen die letzte Preisänderung im Kurs beim Schließen des Bars die Farbe des AO- oder AC-Bars verändern kann. Sollte dies passieren, zeigt sich, dass der Kauf laut Signal aus der der grünen Zone falsch war. Deshalb habe ich für den Kauf die Eröffnung eines neuen Bars verwendet.

In der vierten Dimension gibt es zudem auch ein Signal mit dem man ein Stop-Order für die Long-Position nach verfolgen kann

Dazu sind fünf aufeinander folgende grüne Zonen erforderlich. Der Mindestwert des Kurses der ersten Zone wird zur Einrichtung des Stop Loss verwendet. Wird die Stop-Order nicht beim nächsten Bar ausgelöst (nach seinem Schließen), dann setzen wir den Stop Loss am Mindestkurs des letzten abgeschlossenen Bars (sollte höher sein als die Stop-Order) mit der Öffnung einen neuen Bars an, ohne die Zonenfarbe des vorigen Bars zu berücksichtigen.

Darüber hinaus verwenden wir eine Beschränkung als Ergänzung zur eröffneten Long Position nach der Zahl der aufeinander folgenden grünen Zonen: B. Williams empfiehlt hierfür 6 oder 8 Zonen. Anschließend sollten wir warten, bis eine graue (wenn die Farben der Spalten für AO und AC unterschiedlich sind) oder rote Zonen auftauchen, was wiederum erlaubt, die Position für Kaufen aus der grünen Zonen zu befüllen.

Das Sell-Signal bildet eine "rote Zone" - das Spiegelbild der grünen Zone. Die Farbe der Zone wirkt sich aus auf die Anzahl der Bars aus, die das Signal aus dem "Saldo-Linien-Handel" (fünfte Dimension) bilden. Für diese Linie wählte Bill Williams die "Zähne" des Alligators.

Ich möchte darauf hinweisen, dass in diesem Signal die OHLC-Kurse (Eröffnungs-, Höchst-, Tiefst- und Schlusskurs) des Bars an der Bildung des Signals beteiligt sind.

Abb. 4 Handelsbeispiel nach Signalen der vierten Dimension

Abb. 4 Handelsbeispiel nach Signalen der vierten Dimension


2.5 Beschreibung des Handels nach Signalen der fünften Dimension

Das "Buy oberhalb der Saldo-Linie" Muster (wenn die Zone grün ist?) wird durch zwei Bars gebildet. Ist der Eröffnungskurs eines 0-Bars (auch der in diesem Moment höchste Kurs des Bars) geringer ist als der höchste Kurs des Bars (findet sich einige Bars zurück), ist der gefundene Maximalkurs der Kurs für die Eröffnung einer Buy-Position in der grünen Zone.

Die rote oder graue Zone brauchen jeweils einen anderen Maximal-, höheren Kurs als der Kurs, der in die grüne Zone eingegeben werden muss. Sobald wir diesen gefunden haben (höchstens 10 Bars zurück und oberhalb der Zähne des Alligators [ich habe in Williams' Buch nicht herausgefunden, wie viele Bars man für so ein Muster zurückgehen muss]), sollten Sie ihn sich als den Kurs für eine Eingabe in die rote oder graue Zone merken, in welche Richtung also gekauft wird.

Zur Eröffnung einer Position durch das Signal "Buy oberhalb der Saldo-Linie", suchen wir nach dem aktuellen Kurs, der höher ist als der Kurs auf jedem neuen Bar (für die grüne/rote/graue Zone).

Abb. 5 Handelsbeispiel nach Signalen der fünften Dimension

Abb. 5 Handelsbeispiel nach Signalen der fünften Dimension


3. Die C_TS_BW Klasse

3.1 Zweck der Klasse: 3.2 Implementierung der C_TS_BW Klasse

Zur Ausführung dieser Aufgabe müssen Sie zunächst die passenden Dateien aus der Standard Library mit einschließen.

Dies wird durch unten stehenden Code implementiert.

#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\HistoryOrderInfo.mqh

Im private Bereich der Klasse deklarieren Sie die Objekte zur Organisation der Handelsanfragen, erhalten die Information zum Symbol und der eröffneten Position und können auch auf die Historie der Order zugreifen.

CTrade            exp_trade;    // trading methods from the Standard Library
CSymbolInfo       s_info;       // methods of accessing the information on symbol
CPositionInfo     pos_info;     // methods of obtaining the information on position
CHistoryOrderInfo h_info;       // methods of accessing the history of orders

Diese Klasse verwendet vier Strukturen, von denen zwei im private Bereich deklariert sind. Dies sind die Strukturen:

struct l_signals            // structure of signals and time of the bar, on which they appeared
struct l_trade              // structure of the time of the last triggered signals

Zudem gibt es noch zwei Strukturen im public Bereich:

struct  s_input_parametrs   // structure of the tuning parameters
struct  s_actual_action     // structure of the appropriate trading order

Diese Strukturtypen verfolgen folgende Ziele:

l_signals         last_signals;     // signals
l_trade           last_trade;       // processed signals
s_input_parametrs inp_param;        // internal structure of the accepted settings
s_input_parametrs inp_param_tmp;    // receiving structure of the settings (received through a link with the initialization of the class)
s_actual_action   actual_action;    // orders on the serve

Mehr Details zum Code der Strukturen finden Sie in der angehängten Kopfzeilen-Datei.

Diese geschieht mit Hilfe der Init Methode aus dem public Bereich. Parameter für Aufrufe vom EA:

string Symbol_for_trade             // symbol, on which the class will trade
ENUM_TIMEFRAMES Period_for_trade     // the period of the chart symbol, on which the search for signals and its processing will occur
s_input_parametrs &inp_param_tmp   // receiving structure of the class settings

In dieser Methode findet auch die Initialisierung aller beteiligten Indikatoren und die Organisation der notwendigen Buffer zur Abfrage der Daten daraus statt.

Dies geschieht mit Hilfe der CopyIndValue Methode aus dem private Bereich, den Parametern

int type       // what we request  (0- Alligator, 2 - АО, 3 - АС  )
int countValue // amount of data

Je nach type des Parameters, werden die Empfänger-Buffer automatisch für die berechneten Daten ersetzt und als eine Zeitreihe zur Klassen-Initialisierung organisiert.

Nach dem Öffnen eines neuen Bars wird nur einmal nach Signalen gesucht. Dazu müssen wir den Zeitpunkt festlegen. Dies macht die NewBar Methode- sie besitzt keine Eingabeparameter und liefert einer Situation, wenn ein erhaltene Preisänderung einen neuen Bar öffnet, true, andernfalls liefert sie false.

Ich habe für jede Handelsdimension eine separate Methode gestartet. Die Signale der ersten Dimension werden via FindSignal_1_dimension untersucht.

Aufrufende Parameter:

int type               // direction of the fractal for the search (0- to buy, 1 to sell)
double &price_out[]   // this array, after a successful search, will contain the fractal price 
datetime &time_out[]  // in this array, after a successful search, will contain the time of the bar on which the fractal is found

Die Analyse der zweiten Dimension erfolgt via der FindSignal_2_dimension Methode. Aufrufende Parameter:

int type               // direction of the search (0-in the direction of to buy, 1-in the direction to sell)
int sub_type         // subtype of the search (0- signal of transferring the zero line, 1- sign "saucer")
double &price_out[]   // this array, after a successful search, will contain the signal price 
datetime &time_out[]  // this array, after a successful search, will contain the time of the bar signal

Die Analyse der dritten Dimension erfolgt via der FindSignal_3_dimension Methode mit Eingabe-/Ausgabeparameter:

int type              // direction of the search (0-in the direction of to buy, 1-in the direction of to sell)
int sub_type           // subtype of the search (0-  signal on two identical bars, 1- signal for "three identical bars)
double &price_out[]    // this array, after a successful search, will contain the signal price
datetime &time_out[]   // this array, after a successful search, will contain the time of the bar signal

Die Bearbeitung der vierten Dimension erfolgt via der FindSignal_4_dimension Methode mit Eingabe-/Ausgabeparameter:

int type               // direction of the search (0-in the direction to buy, 1-in the direction to sell)
int sub_type          // what we are looking for (0- signal from the zones, 1- tailing stop for five consecutive zones of one color)
double &price_out[]   // this array, after a successful search, will contain the signal price
datetime &time_out[]  // this array, after a successful search, will contain the time of the signal bar

Und die fünfte Dimension wird via FindSignal_5_dimension kontrolliert. Parameter dieser Methode:

int type               // direction of the search (0-in the direction to buy, 1-in the direction to sell)
int sub_type          // subtype of the search (0-  signal for two bars, 1- signal for three bars)
double &price_out[]   // this array, after a successful search, will contain the signal price
datetime &time_out[]  // this array, after a successful search, will contain the time of the bar signal

Die kompletten Prüfungen werden mittels der CheckSignal Methode vereint, die keine Eingabeparameter hat und folgendes enthält:

Diese Methode wird im public Bereich deklariert und muss vom EA aufgerufen werden.

In dieser Klasse ist die Methode CheckForTradeSignal implementiert, die die Suche nach den Möglichkeiten ausführt, eine Position nach aktuellem Kurs eingeben zu können.

Aufrufende Parameter:

int dimension        // number of the dimension (from the first to the fifth)
int type            // direction of the trade (0- buy, 1- sell)
int sub_type         // signal subtype from the trading dimension (described in the signal search)
double &price_out[]  // signal price
datetime &time_out[] // time of the signal bar

Werden alle Regeln für die Aktivierung eines Signals eingehalten, wird uns true geliefert, ansonsten false.

Die Prüfung der Fähigkeiten all diese Signale verarbeiten zu können wird durch die Methode CheckActionOnTick vereint, im public Bereich mitgeteilt und muss vom EA aufgerufen werden. Es gibt für diesen Aufruf keine Parameter. Jedes erfolgreiche Signal wird im Objekt actual_action gespeichert; sie werden später in der Methode TradeActualSignals verarbeitet.

Die CalcLot Methode wird im public Bereich deklariert und kann vom EA aufgerufen werden. Sie dient zur Berechnung des Postens und der weiteren Modifikation des variablen Postens, der im private Bereich der Klasse deklariert wurde. Aufrufende Parameter:

bool external // for the installation of the external calculated lot, you need to direct to this variable true, 
              // then the lot will be set by the value ext_lot. 
              // Inside this class (calculate the lot), the method is called with the parameter false.
double ext_lot // external size of the lot
int type // type of lot calculation 
         //(0- starting lot (use the value that was transferred during the initialization of the class, 
         //-1 turn over lot (the sum of the lot of the current position and the starting lot), 
         // the values from 5 to 2 are used if the aggressive trading mode is turned on (meaning "pyramiding").
         // In this mode: 5 – starting,  multiply by 5, 
         // 4 – starting,  multiply by 4,
         // 3 – starting,  multiply by 3, 
         // 2 – starting,  multiply by 2,
         // 1 - the filling lot is equal to the starting lot

Da wir gerade den fixen Posten betrachtet haben, kommt nun der "pyramidiserte" Posten dran.

Lassen wir den Start-Posten 0,1 sein. So ist z.B. bei einer Eröffnung via des Start-Postens für das Signal vom Fraktal, außerhalb des Alligator-Kiefer, die Gesamtposition 0,1 Posten. Danach beginnen wir mit der Analyse der eingehenden Signale von der zweiten bis zur fünften Dimension. Sobald das Signal ausgelöst ist, wird die offene Position mit 0,5 Posten befüllt (Startposten x 5), und wir erhalten ein Gesamtmenge der Position von 0,6 Posten. Während des nächsten Signals in Richtung der offenen Position, wird sie mit 0,4 Posten befüllt, sodass die Gesamtmenge 1,0 Posten beträgt.

Das nächste Signal in Richtung der Position gibt uns weitere 0,3 Posten, sodass die Menge sich bereis auf 1,3 Posten beläuft. Die fünfte 'Befüllung' geschieht für 0,2 Postren und die Gesamtmenge beträgt nun 1,5 Posten. Die folgenden 'Befüllungen' in Richtung der Position erfolgen nur mit je 0,1 Posten.

B.Williams beschreibt in Trading Chaos diesen Algorithmus zur Geldverwaltung. Die Möglichkeit einer Installierung eines Benutzer-Postens erlaubt uns, praktisch jede Kapitalverwaltung zu implementieren.

Zur korrekten Festlegung der Order-Abfolge in einem Abschluss verwende ich verschiedene Magische Ziffern.

Ziffer

Beschreibung der Order

999

Umkehr-Order

1000

Start-Order

1001

Befüll-Order (Start Х 1)

1002

Befüll-Order (Start Х 2)

1003

Befüll-Order (Start Х 3)

1004

Befüll-Order (Start Х 4)

1005

Befüll-Order (Start Х 5)


Die Klasse errechnete die erforderliche Zahl (mittels der CalcMagic Methode), die später dann die Handes-Operation auf dem Server identifizieren wird, bevor eine neue Order abgeschickt wird.

Wenn Sie möchten, können Sie in den EA eine Anfrage der Struktur actual_action implementieren, in der die Handelssignale in Form von Bool-Variablen gespeichert werden. Jede Art und Richtung entspricht dabei einer Variable. Wenn wir einen true-Wert haben, erzeugt die Klasse für diese Preisänderung eine Handelsoperation durch das spezifizierte Handelssignal, und der Posten für dieses Signal kann danach geändert werden. Für jede Schwankung der Kursveränderung sendet die Klasse nur eine Order für die offene Position oder eine 'Befüllung'.

Die Einstellung eines Postens ist im EA nach dem Aufruf der CheckActionOnTick Methode und vor dem Aufruf der TradeActualSignals möglich. Da bei der aktuellen Schwankung durchaus mehrere Signale auf ihre Ausführung warten können, wird nur eines ausgewählt.

Die Abfolge der Signalausführung:

Deshalb ist es notwendig, diese Abfolge während der Installierung der "Benutzer"-Postengröße zu berücksichtigen.

In der beschriebenen Klasse wird der Stop-Kurs an der Position mittels der Trailing Stop Methode aufrecht erhalten, also das Heranziehen des Stop Loss nur in der Richtung, die zu einem Gewinnanstieg bei der Position zur Auslösung bei diesem Kurs führen würde. Es gibt fünf Modelle dieser 'Aufrechterhaltung':

Die fünfte Einrichtungsoption eines Stop Loss wird mittels der SetStopLoss Methode implementiert, mit einem einzigen Parameter: double & stoploss. Der Aufruf muss vom EA aus erfolgen und vor der Ausführung der TrailingStop Methode, die den Kurs für Veränderung der Position prüft und eine entspr. Anfrage an den Server schickt. Nach erfolgreicher Ausführung dieses Vorgangs, wird der Wert der internen Variable StopLoss auf -1 zurückgesetzt.

Die boolSendOrder Methode übernimmt das Senden einer Handels-Order zum Eröffnen, Schließen oder Umkehren einer Postion. Aufrufende Parameter:

ENUM_ORDER_TYPE type   // direction of the trading operation
double &price_out[]   // pointer to the signal price, after a successful execution of the operation, set in -1;
datetime &time_out[]  // the pointer to the signal time, after a successful execution of the operation, set in -1;
string comment         // the commentary for the order

Das Testen aller Handelssignale wird mittels der TradeActualSignals Methode kombiniert. Die Struktur actual_action speichert die Handels-Order. Nach der erfolgreichen Übermittlung der Order an den Serveer (SendOrder liefert uns true), können Sie das Handelssignal in der Struktur actual_action zurücksetzen. Das Handelssignal bleibt aktiv bis unsere 'Sendung' mit positiv bestätigt wird.

Die Struktur actual_action enthält auch eine Funktion init ohne Parameter, die alle aktuellen Signale zurücksetzt. Dieser Vorgang wird beim Eröffnen einer neuen Position verwendet, oder wenn es zu einer Umkehrung bei einer bestehenden Position kommen sollte.

Die Struktur last_trade speichert für jede Art und Richtung die Zeit des letzten Handelssignals. Bevor Sie also in der Struktur actual_action eine Handels-Order einrichten, prüfen Sie, ob dieses Signal bereits in der Struktur last_trade 'handelt', und falls ja, ignorieren Sie es. Dadurch wird die Implementierung der Kontrolle der "zu vernachlässigenden" Ausführung einer Handelssituation ermöglicht.

Dies ist eine Liste der Klasse-Methoden, die für einen Aufruf vom EA aus zur Verfügung stehen:

void C_TS_BW();                                      // Constructor
bool Init(string Symbol_for_trade,
           ENUM_TIMEFRAMES Period_for_trade,
          s_input_parametrs  &inp_param_tmp);       // Initialization of the class
bool NewBar();                                           // Check for a new bar on the current symbol\time-frame
void CheckSignal();                                 // Search for signals
void CheckActionOnTick();                              // Collecting the desired actions on the current tick
void TrailingStop();                                // Trailing Stop
void TradeActualSignals();                             // Trading by the current signals
void SetStopLoss(double  &stoploss);                  // Set Stop Loss
void CalcLot(bool external,double ext_lot,int type); // Calculation of the lot

Ebenso stehen auch die Strukturen zur Verfügung:

actual_action    // Current trading orders for execution
inp_param_tmp;   // Reception of the structure of settings
                   // (receives the data by the link during the initialization of the class)


4. Implementierung des EA mit Hilfe der C_TS_BW Klasse

Als erster Schritt muss die Datei h_TS_BW.mqh in den Expert Advisor übernommen werden.

#include <h_TS_BW.mqh>

Danach muss das Objekt der C_TS_BW Klasse deklariert werden. In unserem Fall: EA_TS_BW.

Des Weiteren brauchen Sie auch die Struktur der anpassbaren Parameter, wie z.B. s_input_parametrs, input_parametrs.

Hier sind alle in dieser Struktur aufgenommenen Parameter beschrieben:

input_parametrs.alligator_jaw_period        // The Alligator: period of the Jaws line
input_parametrs.alligator_jaw_shift         // The Alligatpr: shift of the Jaws line
input_parametrs.alligator_teeth_period      // Alligator: period of the Teeth line
input_parametrs.alligator_teeth_shift       // Alligator: shift of the Teeth line
input_parametrs.alligator_lips_period       // Alligator: period of the Lips line
input_parametrs.alligator_lips_shift        // Alligator: shift of the Lips line
input_parametrs.add_1_dimension              // Allow the addition by Fractals
input_parametrs.add_2_dimension_bludce     // Allow the addition by the "Saucer" (АО) signal
input_parametrs.add_2_dimension_cross_zero // Allow the addition by the "Crossing the zero line" (АО) signal 
input_parametrs.add_3_dimension_use_2_bars // Allow the addition by the "АС 2 bars" signal 
input_parametrs.add_3_dimension_use_3_bars // Allow the addition by the "АС 3 bars" signal
input_parametrs.add_4_dimension_zone       // Allow the addition by the red or the green zone
input_parametrs.add_5_dimension             // Allow the addition by the Balance Line
input_parametrs.max_4_dimension_zone       // The maximum amount of consecutive bars of zones of the same color 
input_parametrs.trall_4_dimension           // Allow a trail position using 5 consecutive bars of zones of the same color
input_parametrs.agress_trade_mm            // Aggressive style of filling in an open position
input_parametrs.support_position           // Type of trailing stop of the position
input_parametrs.lot                           // Trading lot

Im OnInit() Bereich des EA, müssen Sie:

expert_TS_BW.Init(Symbol(),PERIOD_CURRENT,input_parametrs)

In unserem Fall wird EA auf dem aktuellen Symbol/Zeitraum, wo er installiert ist, arbeiten.

Beispiel des OnTick() Bereichs des Expert Advisors

//   double Sl[1];  
   if(expert_TS_BW.NewBar()) // new bar on the chart
     {
      expert_TS_BW.CheckSignal();       // signal search
     }
   expert_TS_BW.CheckActionOnTick();    // check for the required actions on the current tick
//---******************* the place of the beginning of external control of the lot, the stop 
//--- example of setting the lot for trade by the signal from the zones

//   if(expert_TS_BW.actual_action.zone_buy || expert_TS_BW.actual_action.zone_sell)
//     {expert_TS_BW.CalcLot(true,0.11,0);}
//--- setting the stop by the parabolic

//   CopyBuffer(h_parabolic,0,0,1,Sl);
//   if (Sl[0]>0){expert_TS_BW.SetStopLoss(Sl[0]);}
//---*******************the place of the end of external control of the lot, the stop 

   expert_TS_BW.TrailingStop();           // pulling-up the stop (if necessary)  
   expert_TS_BW.TradeActualSignals();     // trading of current signals

In diesem Fall sind die Beispiele der externen Kontrolle des Stop-Kurses und des Handels-Postens für die Ausführung der Klasse, kommentiert.


5. Einige Tests zur Historie

Der Autor des Buchs, auf dessen Grundlage der EA geschrieben wurde, führt explizit an, dass sich dieses System auf Aktien- und Warenmärkte konzentriert.

Testen wir also den Expert Advisor zunächst auf Differenzkontrakte (CFD). Und nehmen mal an, das Test-Vieleck ist Teil der IBM-Historie. Das System ist auf die tendierenden Segmente der Quoten ausgerichtet. Zunächst betrachte ich mir das erste vorhandene Segment, bei dem ein Trend einfach so erkannt werden kann.

Abb. 6 IBM-Chart

Abb. 6 IBM-Chart

Lässt man den geschriebenen Expert Advisor auf diesem Segment laufen, erhält man folgende Order.

Abb. 7 Die Handelssignale von Bill Williams (IBM)

Abb. 7 Die Handelssignale von Bill Williams (IBM)

Auf den ersten Blick gibt es viele Handel per Trend, was ja schon mal gut ist Das ist das vom Strategie-Tester erzeugte Chart.

Der Handel wurde auf 0,1 Posten durchgeführt, ohne Schließen durch die Alligator-Linien, ohne einen angehängten Stop mittels der fünf aufeinader folgenden Zonen einer Farbe und ohne aggressives Handel (Pyramidisierung).

Abb. 8. Testergebnisse

Abb. 8 Testergebnisse

Insgesamt machen wir Gewinn.

Nehmen wir nun einen langwierigeren Trend mit weniger Tendenz.

Abb. 9 IBM-Chart (Fragment 2)

Abb. 9 IBM-Chart (Fragment 2)

Belassen wir das gleiche Symbol und den Zeitraum von 13 Monaten (von 12/2008 - 01/2010)

Das ist das vom Strategie-Tester erzeugte Chart:

Abb. 10 Testergebnisse des Systems vor dem Hintergrund der Historie (Fragment 2)

Abb. 10 Testergebnisse des Systems vor dem Hintergrund der Historie (Fragment 2)

Sagen wir hier einfach: nicht zufriedenstellend" oder "hat unsere Erwartungen nicht erfüllt".

Als nächstes würde ich gerne die Arbeit bei den Währungspaaren prüfen.

Dazu nehmen wir das wohl bekannte EURUSD Paar und den H1-Zeitraum des Charts her. Die Historie-Intensität ist das Jahr 2010.

Abb. 11 Testergebnisse des Systems vor dem Hintergrund der Historie, EURUSD, H1, 2010

Abb. 11 Testergebnisse des Systems vor dem Hintergrund der Historie, EURUSD, H1, 2010

Versuchen wir's bei den täglichen EURUSD-Bars im selben Jahr (2010).

Und das liefert uns der Tester dann:

Abb. 12 Testergebnisse des Systems vor dem Hintergrund der Historie, EURUSD, D1, 2010

Abb. 12 Testergebnisse des Systems vor dem Hintergrund der Historie, EURUSD, D1, 2010


Fazit

In diesem Beitrag sollte die Leistung einer der weithin verbreiteten Handelsstrategien von Bill Williams getestet werden, nicht nur bzgl. Aktienmärkten und Warenbörsen, sondern auch für den Devisenmarkt. Das System funktioniert "mehr oder weniger" auf den EURUSD-Tagescharts des vergangenen Jahres, doch erzeugt, ohne Optimierungsversuche, keine Gewinn bei engeren Zeitspannen.

Die Markteintritts-Signale des Systems sind ziemlich exakt (wenn wir uns die Tagescharts ansehen), doch die Austritte sind eindeutig verzögert, da über die Hälfte des Gewinns nicht fixiert ist. Dieses Feld dient der Verfeinerung des vorliegenden Systems in Bezug auf seine Optimierung für engere Zeitspannen.

Der vollständige Code der Klassen steht in der angehängten Datei zur Verfügung.