English Русский 中文 Español 日本語 Português 한국어 Français Italiano Türkçe
Auftragsstrategien. Ein universelles automatisches Handelssystem

Auftragsstrategien. Ein universelles automatisches Handelssystem

MetaTrader 5Handel | 27 Januar 2016, 12:34
1 414 0
Dmitry Fedoseev
Dmitry Fedoseev

Einleitung

Ein Haupt- und Anfangsbestandteil einer jeden Handelsstrategie ist Analyse des Kurses und der technischen Indikatoren, auf deren Grundlage die Eröffnung einer Position erfolgt. Wir nennen das die Marktanalyse, das heißt, die Analyse von allem, was von uns nicht beeinflussbar auf dem Markt vor sich geht.

Zudem kann für eine Strategie auch eine Analyse anderer Art erforderlich sein. Diese bezeichnen wir als die Analyse der aktuellen Handelslage. Sie umfasst eine Zustandsanalyse der betreffenden Handelsposition sowie die Analyse des Vorhandenseins/Nichtvorhandenseins von Pending Orders (sofern diese bedingten Aufträge in der Strategie verwendet werden). Auf der Grundlage dieser Analyse wird entschieden, ob bei der Position oder mit Aufträgen etwas geschehen muss, zum Beispiel ob sie geschlossen, die Verlustgrenze (Stop Loss) verschoben, bedingte Aufträge (Pending Orders) eingerichtet oder gelöscht werden müssen usw. Anders gesagt umfasst diese Analyse die Untersuchung unserer Tätigkeit am Markt sowie der Operationen gemäß der von uns (oder dem Expert-System) geschaffenen Lage und den Richtlinien der angewandten Strategie.

Die allgemein bekannte nachgezogene Verlustbremse (Trailing Stop) kann in gewisser Hinsicht der zweiten Art der Bestandteile einer Handelsstrategie zugeordnet werden. Bei der Analyse wird vorgegangen wie folgt: wenn eine eröffnete Position vorhanden ist, bei der der Gewinn über dem in den Einstellungen festgelegten Wert liegt, und keine Verlustgrenze (Stop Loss) gesetzt oder in einer größeren Entfernung von dem aktuellen Kurs festgelegt wurde, erfolgt die Verlagerung (bzw. Festlegung) der Verlustgrenze.

Ein Trailing Stop ist eine zu einfache Funktion, um von besonderem Interesse zu sein. Außerdem kann man sie einer vollkommen anderen Kategorie der Bestandteile einer Handelsstrategie zuordnen, nämlich den Funktionen zur Verwaltung von Positionen. Somit kann eine Handelsstrategie drei Kategorien von Elementen beinhalten:

  1. Die Analyse der Marktlage und die Ausführung von Operationen auf ihrer Grundlage.

  2. Die Analyse der Handelslage und die Ausführung von Operationen auf ihrer Grundlage.

  3. Die Verwaltung der Positionen.

In diesem Beitrag dreht sich alles um Strategien, in denen Pending Orders intensiv genutzt werden (wir werden sie kurz als Auftragsstrategien bezeichnen), um eine Metasprache, die geschaffen werden kann, um diese Strategien in Formelsprache zu beschreiben, und um die Verwendung eines universellen automatischen Handelssystems (eines Expert-Systems), dessen Arbeitsweise auf diesen Beschreibungen beruht.

 

Beispiele für Auftragsstrategien

Die erste Handlung eines jeden automatischen Handelssystems ist die Eröffnung einer Anfangsposition. Es gibt mehrere Möglichkeiten, sie zu eröffnen.

  1. Eröffnen einer Marktposition:

    • in der von den Indikatoren vorgeschlagenen Richtung;

    • in der vom Anwender in den Einstellungen des Expert-Systems festgelegten Richtung;

    • auf der Grundlage der Ergebnisse der zuletzt geschlossenen Position. Dabei muss es sich nicht um eine Anfangsposition gehandelt haben, es kann auch eine zwischengelagerte Umsetzungsphase gewesen sein.

  2. Zwei gegenläufige Stop-Aufträge (Stop Orders). Wird der eine ausgelöst, erfolgt die Löschung des jeweils anderen.

  3. Zwei gegenläufige begrenzte Aufträge (Limit Orders). Wird der eine ausgelöst, erfolgt die Löschung des jeweils anderen.

  4. Ein begrenzter und ein Stop-Auftrag in derselben Richtung. In diesem Fall muss die Richtung der Aufträge wie unter Punkt 1 festgelegt werden.

Nach der Eröffnung der Anfangsposition können unterschiedliche Auftragsstrategien verfolgt werden:

Nachschießen mithilfe begrenzter Aufträge (Abb. 1.)

Zunächst wird eine Anfangsposition eröffnet, dann werden ein oder mehrere begrenzte Aufträge (Limit Orders) in dieselbe Richtung mit zunehmender Postengröße platziert. Mit Auslösung eines oder mehrerer begrenzter Aufträge werden solange neue begrenzte Aufträge platziert, bis die Position an der Gewinnmitnahmegrenze (Take Profit) geschlossen wird. Wird die Position bei Take Profit geschlossen, so erfolgt die Löschung der verbleibenden bedingten Aufträge (Pending Orders).

Abb. 1.  Nachschießen mithilfe begrenzter Aufträge 
Abb. 1. Nachschießen mithilfe begrenzter Aufträge

Gegenläufiger Stop (Abb. 2.)

Es wird eine Anfangsposition eröffnet und an ihrer Verlustgrenze (Stop Loss) ein gegenläufiger Stop-Auftrag mit einer höheren Postengröße platziert. Wird die Position bei Stop Loss geschlossen, erfolgt die Auslösung einer Pending Order, deren Stop Loss ebenfalls in gegenläufiger Richtung zu dem Stop-Auftrag festgelegt wird und immer so weiter, bis die Position an der Gewinnmitnahmegrenze (Take Profit) geschlossen wird. Wird die Position bei Take Profit geschlossen, so erfolgt die Löschung des verbleibenden bedingten Auftrags (Pending Order).

Abb. 2. Gegenläufiger Stop 
Abb. 2. Gegenläufiger Stop

Nachkauf (Abb. 3.)

Es wird eine Anfangsposition eröffnet, und wenn sie sich in Richtung Gewinn bewegt, erfolgt eine Aufstockung ihres Umfangs (Nachschießen), und die Verlustgrenze wird auf die Gewinnschwelle verlegt. Wird die Position bei Take Profit geschlossen, dürfte sie zu diesem Zeitpunkt einen recht großen Umfang und einen entsprechend hohen Gewinn erreicht haben. Wenn der Stop Loss jedoch in einer zwischengelagerten Umsetzungsphase ausgelöst wird, gibt es schlicht keinen Gewinn.

Abb. 3. Nachkauf 
Abb. 3. Nachkauf

Wiedereröffnung (Abb. 4.)

Es wird eine Marktposition eröffnet. Bei ihrer Stop Loss-bedingten Schließung erfolgt eine Neueröffnung mit einer höheren Postengröße. Das geschieht immer wieder, bis die Schließung bei Gewinnmitnahme (Take Profit) erfolgt. Diese Strategie ist vergleichbar mit der beim Nachschießen mithilfe begrenzter Aufträge.

Abb. 4. Wiedereröffnung 
Abb. 4. Wiedereröffnung

Die Kombination aller genannten Strategien ist absolut möglich. Geht eine Position ins Plus, tritt der Nachkauf in Kraft, weist sie dagegen ins Minus, wird mithilfe begrenzter Auftrage nachgeschossen. Besagtes Nachschießen mithilfe begrenzter Aufträge kann nicht ständig eingesetzt werden. Man könnte beispielsweise drei Mal nachschießen, dann einige gegenläufige Stops einschieben und später wieder mithilfe begrenzter Aufträge nachschießen usw.

In der Praxis ist die Programmierung von Auftragsstrategien eine ziemlich aufwendige Angelegenheit nicht nur wegen der erforderlichen Codemenge sondern auch wegen der Notwendigkeit eines kreativen Herangehens an jeden einzelnen Fall. Wir werden versuchen, die Aufgabe der Programmierung dieser Strategien zu erleichtern, indem wir ein universelles automatisches Expert-System entwickeln, das die Arbeit mit jeder erdenklichen Handelsstrategie ermöglicht.

 

Das Grundprinzip

Das Grundprinzip beim Programmieren von Auftragsstrategien ist die Ermittlung der aktuellen Phase der Strategieumsetzung nebst der Ausführung der dieser Phase entsprechenden Operationen.

Nehmen wir ein Beispiel: es muss eine Marktposition eröffnet werden, sagen wir, eine Kaufposition (Buy). Nach der Eröffnung müssen zwei bedingt Aufträge (Pending Orders) platziert werden: oben ein Stop- und unten ein begrenzter Auftrag (Limit Order). Wenn man beginnt, auf dem Markt zu handeln, sind zunächst noch keine Positionen oder Aufträge vorhanden, somit wird als Umsetzungsphase die Anfangsphase ermittelt, in der zunächst eine Position eröffnet werden muss. Das Vorhandensein einer Position läutet die nächste Umsetzungsphase ein. Insgesamt haben wir also folgende Phasen:

  1. Es liegt weder eine Position noch ein Auftrag vor. Es muss eine Position eröffnet werden.

  2. Es ist eine Position vorhanden, aber kein einziger Auftrag. Es muss ein Stop-Auftrag platziert werden.

  3. Wir haben sowohl eine Position als auch einen Stop-Auftrag. Jetzt muss noch ein begrenzter Auftrag (Limit Order) platziert werden.

Die Arbeit anhand dieser Richtlinien wird bestimmt ausgeführt, zu ihrer Vervollkommnung benötigen wir jedoch drei Kursänderungen (Ticks): die erste Kursänderung ist durch die Feststellung des Nichtvorhandenseins einer Position und deren entsprechende Eröffnung bedingt, bei der nächsten werden die Position und das Nichtvorliegen von Aufträgen ermittelt und bei der dritten schließlich sowohl die Position als auch ein Auftrag. Gemäß den Vorgaben der Strategie müssen alle drei Vorgänge in einem Zug ausgeführt werden.

Deshalb müssen wir versuchen, alles auf einmal zu erledigen: liegen weder Positionen noch Aufträge vor, muss ein Position eröffnet werden, ist dies erfolgreich geschehen, müssen Anfragen zur Platzierung eines Stop-Auftrags sowie eines begrenzten Auftrages abgeschickt werden. Es ist sehr gut möglich, dass keine Anfrage zur Platzierung einer Pending Order angenommen wird (aufgrund von Verbindungsproblemen, dem Fehlen von Kursen u. ä.), dennoch ist die Handelslage in eine andere Phase eingetreten, da jetzt eine eröffnete Position vorhanden ist. Das bedeutet, dass alle möglichen zwischengeschalteten Arbeitsgänge vorgesehen sein müssen:

  1. Es liegt keine Position vor. Es muss eine Position eröffnet werden. Wenn die Position erfolgreich eröffnet wurde, müssen die Anfragen zur Platzierung eines Stop-Auftrags sowie eines begrenzten Auftrages (Limit Order) abgeschickt werden.

  2. Es ist eine Position vorhanden, aber keine Pending Order. Anfragen zur Platzierung eines Stop-Auftrags sowie eines begrenzten Auftrages müssen abgeschickt werden.

  3. Position und Stop-Auftrag sind da, was fehlt, ist der begrenzte Auftrag. Es muss eine Anfrage zur Platzierung einer Limit Order abgeschickt werden.

  4. Position und Limit Order liegen vor, jedoch kein Stop-Auftrag. Es muss eine Anfrage zur Platzierung einer Stop Order abgeschickt werden.

Beachten Sie bitte, dass die Handelslage in diesem Beispiel den festgelegten Richtlinien zur Ermittlung vollkommen entsprechen muss, damit die Phase korrekt ermittelt werden kann. Es müssen bestimmte Anordnungen von Aufträgen vorliegen: entweder eine Position ohne jegliche Aufträge oder eine Position und irgendein Auftrag, und nicht anders. Die Beschreibung der Umsetzungsphasen der Strategie nach diesem Prinzip kann umfangreich ausfallen, und der Vorgang der Erstellung dieser Beschreibung aufwändig sein, da alle möglichen Varianten vorzusehen sind, was sich als praktisch nicht leistbar erweisen kann. Für unser Beispiel können die Arbeitsrichtlinien auch in leicht veränderter Form niedergeschrieben werden:

  1. Es liegt keine Position vor. Es muss eine Position eröffnet werden. Wenn die Position erfolgreich eröffnet wurde, müssen die Anfragen zur Platzierung eines Stop-Auftrags sowie eines begrenzten Auftrages (Limit Order) abgeschickt werden.

  2. Es liegt eine Position vor. In diesem Fall müssen auf dem Markt noch zwei weitere Pending Orders vorhanden sein. Wir prüfen, ob es im Markt einen Stop-Auftrag gibt, und platzieren ihn, wenn dem nicht so ist. Wir prüfen, ob es im Markt einen begrenzten Auftrag gibt, und platzieren ihn, wenn dem nicht so ist.

In diesem Fall haben wir den Minimalbestand an Richtlinien zur Ermittlung der Umsetzungsphase sowie eine vollständige Beschreibung der Handelslage, in der wir uns in dieser Umsetzungsphase befinden müssen.

Bei Verwendung dieses Prinzips benötigen wir ein Verfahren zur Ermittlung der Position selbst, das uns hilft zu erkennen, ob es sich um eine Anfangsposition handelt, oder ob bereits irgendein Auftrag ausgelöst wurde. In letzterem Fall ist es nicht mehr erforderlich, zu versuchen einen zweiten Auftrag zu platzieren, da das System bereits zu einer neuen Umsetzungsphase übergegangen ist. Die Ermittlung des Vorliegens von Aufträgen ist ebenfalls erforderlich, aber damit befassen wir uns später. Jetzt formulieren wir zunächst kurz und knapp das Grundprinzip für die Beschreibung von Handelsstrategien:

  1. Benötigt wird ein Verfahren zur Ermittlung der aktuellen Umsetzungsphase mit möglichst geringem Informationsumfang.

  2. Zu jeder Umsetzungsphase der Strategie muss eine vollständige Beschreibung der dieser Phase entsprechenden Handelslagen vorhanden sein.

  3. Sind in einer Phase die Ausführung von Marktoperationen (Eröffnung, Schließen, Nachschießen, Herabsetzung des Umfangs einer Position usw.) bzw. die Platzierung von Pending Orders erforderlich, ist diese Phase in zwei Unterphasen aufzuteilen: vor Ausführung der Marktoperationen sowie danach (um die Möglichkeit zu eröffnen, alle Operationen auf einmal auszuführen und fehlgeschlagene Ausführungsversuche bei den Pending Orders zu wiederholen).

  4. Sind in einer Phase die Ausführung von Marktoperationen (Eröffnung, Schließen, Nachschießen, Herabsetzung des Umfangs einer Position usw.) bzw. die Platzierung von Pending Orders erforderlich, erfolgt die Verarbeitung dieser bedingten Aufträge erst nach der erfolgreichen Ausführung der Marktoperationen.

  5. Einer Phase kann jeweils nur eine Marktoperation, aber eine beliebige Anzahl von Operationen mit Pending Orders entsprechen.

 

Ermittlung von Auftrag und Position

Position und Auftrag können auf unterschiedliche Weise ermittelt werden: durch Verwendung des Eintrags in dem Kommentar zu dem Auftrag, die magische Zahl oder globale Variablen. Wir nehmen den Kommentar. Die Hauptprobleme dabei ergeben sich daraus, dass der Umfang der Kommentare begrenzt ist, und dass der Börsenmakler seine eigenen Aufzeichnungen hinzufügen kann. Wenn der Platz für den Eintrag des Maklers nicht ausreicht, wird ein Teil des Kommentars „abgeschnitten“.

Deshalb sollte man möglichst wenig Platz im Kommentar belegen und versuchen, ihn irgendwie von etwaigen Maklereinträgen abzugrenzen. Je Auftrag genügt ein Bezeichner. In der Praxis sind das zumeist ein bis zwei Ziffern oder ein Buchstabe mit ein oder zwei Ziffern. Ans Ende des Bezeichners setzen wir irgendein Satz- oder Sonderzeichen, sagen wir „=“ (es gibt bislang noch keinen Hinweis darauf, dass irgendwelche Makler dieses Zeichen in ihren Einträgen verwendet haben). Somit kommen wir im Höchstfall auf 4 Zeichen. Um den Bezeichner aus einem Kommentar abzurufen, können wir folgende Funktion verwenden:

//+------------------------------------------------------------------+
//|   Function for obtaining the identifier from the aComment string |
//+------------------------------------------------------------------+
string GetID(string aComment)
  {
   int    p =StringFind(aComment,"=",0); // Determine the position of the separator
   string id=StringSubstr(aComment,0,p); // Get the substring located before the separator
   return(id);
  }
//+------------------------------------------------------------------+

Wenn die Übereinstimmung der Position oder des Auftrags mit einem bekannten Bezeichner geprüft werden muss, geht das mit folgender Funktion:

//+------------------------------------------------------------------+
//|   Checking the comment against the set identifier                |
//+------------------------------------------------------------------+
bool FitsID(string aID,string aComment)
  {
   return(StringFind(aComment,aID+"=",0)==0);
  }
//+------------------------------------------------------------------+

 

Eine Metasprache zur Beschreibung von Auftragsstrategien

Kommen wir jetzt zur Art der Aufzeichnung von Auftragsstrategien. Sie sollte kurz, knapp und leicht nachvollziehbar sein, gleichzeitig aber auch der Sprache MQL5 ähneln, damit ihre Befehle ohne überflüssige Berechnungen möglichst schnell ausgeführt werden. Inwieweit das hier gelungen ist, überlasse ich dem Urteil der Leser.

Die Strategiebeschreibung erfolgt in einer Textdatei, die wiederum über die Anzeige ihres Namens in den Einstellungen Expert-Systems mit diesem verknüpft wird.

Eine Zeile in der Datei entspricht einer Ausführungsphase des Systems. Die Zeile ist in zwei Felder unterteilt. In dem ersten Feld werden die Richtlinien für die Ermittlung der Phase angegeben. Das zweite enthält eine Aufstellung der Operationen. Die Felder werden durch einen senkrechten Strich „|“ getrennt. Die Aufstellungen der Ermittlungsrichtlinien und der Operationen sind semikolongetrennt.

Außer den Befehlen kann jede Zeile im rechten Teil auch einen durch ein Doppelkreuz „#“ abgesetzten Kommentar aufweisen, z. B.:

Nothing | Buy(M1,1,0,0) #If there is no position or order in the market, open a Buy position, mark it with "М1", lot 1, no Stop Loss, no Take Profit.

 

Phasenermittlung

Zur Ermittlung der Phase werden möglicherweise Informationen bezüglich der aktuellen Marktlage, zu Pending Orders und dem letzten Abschluss benötigt. Außer der Information zum Vorhandensein einer Position können auch einige Einzelheiten abgefragt werden: ihr Kurs, ihr Gewinn, das Vorliegen einer Stop Loss-Grenze, deren Höhe usw. Bezüglich des letzten Abschlusses könnte nach dem Ergebnis gefragt werden, mit dem er getätigt wurde. Hinsichtlich der Pending Orders könnte es notwendig sein, ihren jeweiligen Eröffnungskurs sowie die Stop Loss- und Take Profit-Grenzen zu kennen (das dürfte jedoch eher in der Phase der Ausführung der Operationen erforderlich werden).

Der Bezug dieser Daten erfolgt mithilfe der Befehle für den Zugriff auf Handelsdaten. Die meisten dieser Befehle weisen zwei Parameter auf: den Positions- oder Auftragsbezeichner und den Parameterbezeichner. Ist kein Parameterbezeichner ausgewiesen, so bedeutet das, dass nur das Vorhandensein des von dem Befehl und dem Bezeichner angegebenen Handelsobjekts geprüft wird.

Der Befehl Buy(M1) beispielsweise besagt, dass es auf dem Markt eine Position mit dem Bezeichner „M1“ geben muss. Der Befehl Buy() (oder nur Buy ohne Klammern) alleine deutet lediglich darauf hin, dass irgendeine unbestimmte Kaufposition ohne Bezeichner vorhanden sein muss. Gibt man den Parameterbezeichner an, so bezeichnet dieser den Wert des entsprechenden Parameters, z. B. Buy(M1,StopLossInPoints), die Höhe des Stop Loss bei der Kaufposition (Buy) mit dem Bezeichner „M1“ in Punkten. Ohne Angabe des Bezeichners gibt Buy(,StopLossInPoints) die Stop Loss-Grenze einer Kaufposition (Buy) mit beliebigem Bezeichner an (Hauptsache es handelt sich um eine Kaufposition).

Der bezogene Wert kann in Ausdrücken zur Prüfung der Bedingungen verwendet werden, z. B. befindet sich die Position bei Buy(M1,StopLossInPoints) >= 0 auf der Gewinnschwelle. Wenn keine oder nur Positionen mit anderen Bezeichnern vorliegen, wird die Phase, die diesen Eintrag aufweist gemäß den Ermittlungsrichtlinien nicht erfasst, das heißt, es besteht keine Notwendigkeit zur Anfertigung von Einträgen für die beiden Bedingungen, die Prüfung des Vorhandenseins der Position sowie die Prüfung des Stop Loss-Werts. In diesem Fall muss dennoch vorsorglich eine Überprüfung auf das Vorhandensein einer Verlustgrenze durchgeführt werden: Buy(M1,StopLossExists); Buy(M1,StopLossInPoints)>=0.

Bei der Überprüfung der Werte kann jeder vergleichende Ausdruck verwendet werden: „>=“, „<=“, „==“, „!=“, „>“ oder „<“. Der rechte Vergleichswert kann als Zahl ausgedrückt oder durch besondere Variablen vertreten werden: Var1, Var2, ... Var20. Wird hinter einer Zahl oder Variablen ein „p“ hinzugefügt, so bedeutet das, dass der Wert zusätzlich um die Punktgröße (die Variable _Point) multipliziert wird.

Im rechten Teil des vergleichenden Ausdrucks kann auch ein wesentlich komplizierterer arithmetischer Ausdruck stehen. Er kann etwa so aussehen: X1*X2+X3*X4 (wobei „+“ natürlich auch durch „-“ ersetzt werden kann), wobei X1, X2, X3 und X4 Zahlen, Variablen oder Datenzugriffsbefehle sein können. Das folgende Beispiel ist im Grunde richtig (wenn wir seinen praktischen Nutzen außer Acht lassen):

-BuyStop(BS1,StopLossInPoints)*-SellLimit(SL1,StopLossInPoints)+-SellStop(SS1,StopLossInPoints)*-BuyLimit(SL1,StopLossInPoints)

In der Tabelle 1 sind alle Zugriffsbefehle zusammengestellt.

Tabelle 1. Befehle für den Datenzugriff

Kennziffer Befehl Mögliche Parameter Zweck
0 Nothing Keine Parameter Auf dem Markt gibt es weder eine Position noch Pending Orders
1 NoPos Keine Parameter Auf dem Markt ist keine Position vorhanden
2 Pending Objektbezeichner, Auftragsparameterbezeichner Jede Pending Order mit ausgewiesenem Objektbezeichner. Wenn kein Objektbezeichner ausgewiesen ist, dann jede beliebige Pending Order ungeachtet des Wertes des Objektbezeichners.
3 Buy Objektbezeichner, Positionsparameterbezeichner Eine Kaufposition mit ausgewiesenem Objektbezeichner. Ist kein Objektbezeichner ausgewiesen, dann einfach eine Buy-Position
4 Sell Objektbezeichner, Positionsparameterbezeichner Eine Verkaufsposition mit ausgewiesenem Objektbezeichner. Ist kein Objektbezeichner ausgewiesen, dann einfach eine Sell-Position
5 BuyStop Objektbezeichner, Auftragsparameterbezeichner Ein BuyStop-Auftrag mit ausgewiesenem Objektbezeichner. Ist kein Objektbezeichner ausgewiesen, dann einfach ein Auftrag mit BuyStop
6 SellStop Objektbezeichner, Auftragsparameterbezeichner Ein SellStop-Auftrag mit ausgewiesenem Objektbezeichner. Ist kein Objektbezeichner ausgewiesen, dann einfach ein Auftrag mit SellStop
7 BuyLimit Objektbezeichner, Auftragsparameterbezeichner Ein BuyLimit-Auftrag mit ausgewiesenem Objektbezeichner. Ist kein Objektbezeichner ausgewiesen, dann einfach ein Auftrag mit BuyLimit
8 SellLimit Objektbezeichner, Auftragsparameterbezeichner Ein SellLimit-Auftrag mit ausgewiesenem Objektbezeichner. Ist kein Objektbezeichner ausgewiesen, dann einfach ein Auftrag mit SellLimit
9 BuyStopLimit Objektbezeichner, Auftragsparameterbezeichner Ein BuyStopLimit-Auftrag mit ausgewiesenem Objektbezeichner. Ist kein Objektbezeichner ausgewiesen, dann einfach ein Auftrag mit BuyStopLimit
10 SellStopLimit Objektbezeichner, Auftragsparameterbezeichner Ein SellStopLimit-Auftrag mit ausgewiesenem Objektbezeichner. Ist kein Objektbezeichner ausgewiesen, dann einfach ein Auftrag mit SellStopLimit
11 LastDeal Leer, Abschlussparameterbezeichner Letzter Abschluss
12 LastDealBuy Leer, Abschlussparameterbezeichner Der letzte Abschluss war ein Kaufabschluss
13 LastDealSell Leer, Abschlussparameterbezeichner Der letzte Abschluss war ein Verkaufsabschluss
14 NoLastDeal Keine Parameter Im Verlauf liegen keine Angaben zu einem Abschluss vor, erforderlich für den Fall, dass das Expert-System seine Arbeit an dem Konto gerade erst aufgenommen hat
15 SignalOpenBuy Keine Parameter Indikatorsignal für die Eröffnung einer Kaufposition
16 SignalOpenSell Keine Parameter Indikatorsignal für die Eröffnung einer Verkaufsposition
17 SignalCloseBuy Keine Parameter Indikatorsignal zum Schließen einer Kaufposition
18 SignalCloseSell Keine Parameter Indikatorsignal zum Schließen einer Verkaufsposition
19 UserBuy Keine Parameter Anwenderbefehl für die Ausführung eines Kaufs
20 UserSell Keine Parameter Anwenderbefehl für die Ausführung eines Verkaufs
21 Bid Keine Parameter Bid-Kurs
22 Ask Keine Parameter Ask-Kurs
23 ThisOpenPrice Keine Parameter Eröffnungskurs des Auftrags, für den der Parameter berechnet wird. Kommt in Befehlen zur Ausführung von Pending Orders mit Ausnahme von Aufträgen mit StopLimit zum Einsatz
24 ThisOpenPrice1 Keine Parameter Eröffnungskurs - 1 des Auftrags, für den der Parameter berechnet wird. Kommt in Befehlen zur Ausführung von Pending Orders mit StopLimit zum Einsatz
25 ThisOpenPrice2 Keine Parameter Eröffnungskurs - 2 des Auftrags, für den der Parameter berechnet wird. Kommt in Befehlen zur Ausführung von Pending Orders mit StopLimit zum Einsatz
26 LastEADeal Objektbezeichner, Abschlussparameterbezeichner Letzter von dem Expert-System (EA) getätigter Abschluss. Im Verlauf wird nach dem letzten Abschluss gesucht, der im Kommentar das Zeichen „=“ aufweist, dieser wird anschließend auf seine Übereinstimmung mit dem Objektbezeichner überprüft
27 LastEADealBuy Objektbezeichner, Abschlussparameterbezeichner Bei dem letzten von dem Expert-System (EA) getätigten Abschluss handelt es sich um einen Kaufabschluss. Im Verlauf wird nach dem letzten Abschluss gesucht, der im Kommentar das Zeichen „=“ aufweist, dieser wird anschließend auf seine Übereinstimmung mit dem Objektbezeichner sowie die Richtung des Abschlusses hin überprüft
28 LastEADealSell Objektbezeichner, Abschlussparameterbezeichner Bei dem letzten von dem Expert-System (EA) getätigten Abschluss handelt es sich um einen Verkaufsabschluss. Im Verlauf wird nach dem letzten Abschluss gesucht, der im Kommentar das Zeichen „=“ aufweist, dieser wird anschließend auf seine Übereinstimmung mit dem Objektbezeichner sowie die Richtung des Abschlusses hin überprüft
29 NoTradeOnBar Keine Parameter Auf dem letzten Balken liegen keine Abschlüsse vor

 

Die in der Tabelle 1 aufgeführten Befehle gewähren Zugriff auf folgende Arten von Handelsobjekten: Positionen, Aufträge, Abschlüsse sowie einstellbare Aufträge. Unterschiedliche Objekte weisen unterschiedliche Parametersätze auf.

In der Tabelle 2 werden alle Parameterbezeichner unter Angabe der Objekte, auf sie angewendet werden können.

Tabelle 2. Bezeichner für den Datenzugriff

Kennziffer Bezeichner Zweck Art des Handelsobjekts
0 ProfitInPoints Gewinn in Punkten Position
1 ProfitInValute Gewinn in der Währung der Einlage Position, Abschluss
2 OpenPrice Eröffnungskurs Position, Pending Orders (außer Aufträge mit StopLimit)
3 LastPrice Kurs Abschluss
4 OpenPrice1 Kurs für die Umwandlung des Auftrags von StopLimit in Limit Pending Orders mit StopLimit. Bei der Umwandlung des Auftrags in Limit kommt der Bezeichner OpenPrice zur Anwendung
5 OpenPrice2 Kurs für die Umwandlung des Auftrags von StopLimit in eine Position Pending Orders mit StopLimit. Bei der Umwandlung des Auftrags in eine Position kommt der Bezeichner OpenPrice zur Anwendung
6 StopLossValue Stop Loss-Kurs Position, Pending Orders
7 TakeProfitValue Take Profit-Kurs Position, Pending Orders
8 StopLossInPoints Stop Loss in Punkten Position, Pending Orders
9 TakeProfitInPoints Take Profit in Punkten Position, Pending Orders
10 StopLossExists Stop Loss vorhanden Position, Pending Orders
11 TakeProfitExists Take Profit vorhanden Position, Pending Orders
12 Direction Richtung: 1 - Buy; -1 - Sell Position, Pending Orders, Abschluss

 

Beschreibung der Operationen

Zu den Operationen zählen die Eröffnung einer Marktposition, ihre Schließung, die Platzierung, Löschung und Änderung bedingter Aufträge (Pending Orders) sowie die Ausführung von Verwaltungsfunktionen: automatisch nachgezogene Grenze (Trailing Stop), Gewinnschwelle, Trailing Stop für eine Pending Order (beliebiger weiterer Positionsverwaltungsfunktionen).

Die Eröffnung einer Position und die Platzierung von Aufträgen setzen das Vorliegen der zur Ausführung der jeweiligen Operation erforderlichen Parameter voraus. Diese Parameter werden hinter dem Befehl in runden Klammern in genau der Form angegeben, in der üblicherweise Funktionen aufgerufen werden. Der erste Parameter bei allen befehlen ist der Bezeichner. Zur Angabe der Parameter können nicht nur Zahlenwerte und Variablen verwendet werden, sondern auch die Parameter einer bereits vorhandenen Position oder eines Auftrags. Bei allen Operationsbefehlsparametern können auch die in dem Abschnitt „Phasenermittlung“ erörterten arithmetischen Ausdrücke der Art X1*X2+X3*X4 verwendet werden.

In der Tabelle 3 sind alle Operationsbefehle aufgeführt.

Tabelle 3. Operationsbefehle

Kennziffer Befehl Zweck
0 Buy(ID,Lot,StopLoss,TakeProfit) Eröffnung einer Marktposition für den Kauf
1 Sell(ID,Lot,StopLoss,TakeProfit) Eröffnung einer Marktposition für den Verkauf
2 Close(ID) Schließen einer Marktposition
3 BuyStop(ID,Lot,Price,StopLoss,TakeProfit) Platzieren eines Auftrags mit BuyStop
4 SellStop(ID,Lot,Price,StopLoss,TakeProfit) Platzieren eines Auftrags mit SellStop
5 BuyLimit(ID,Lot,Price,StopLoss,TakeProfit) Platzieren eines Auftrags mit BuyLimit
6 SellLimit(ID,Lot,Price,StopLoss,TakeProfit) Platzieren eines Auftrags mit SellLimit
7 BuyStopLimit(ID,Lot,Price1,Price2,StopLoss,TakeProfit) Platzieren eines Auftrags mit BuyStopLimit
8 SellStopLimit(ID,Lot,Price1,Price2,StopLoss,TakeProfit) Platzieren eines Auftrags mit SellStopLimit
9 Delete(ID) Löschen einer Pending Order
10 DeleteAll(ID,BuyStop,SellStop,BuyLimit,SellLimit,BuyStopLimit,SellStopLimit) Löschen der angegebenen Arten bedingter Aufträge (Pending Orders)
11 Modify(ID,Price1,Price2,StopLoss,TakeProfit) Änderung einer Position oder eines Auftrags
12 TrailingStop Einsatz der Funktion der automatisch nachgezogenen Grenze. Die Funktionsparameter werden in den Eigenschaften des Expert-Systems angegeben
13 BreakEven Einsatz der Gewinnschwellenfunktion. Die Funktionsparameter werden in den Eigenschaften des Expert-Systems angegeben

 

Die Beschreibungen der Operationsbefehlsparameter sind in der Tabelle 4 aufgeführt.

Tabelle 4. Operationsbefehlsparameter

Parameter Zweck
ID Bezeichner des Handelsobjekts (einer Position oder eines Auftrags)
Lot Auftragsumfang in Posten. In den Einstellungen des Expert-Systems gibt es die Variable „Lots“, die den Umfang des Postens (der Mengeneinheit) festlegt.
StopLoss Stop Loss-Kurs
TakeProfit Take Profit-Kurs
Kurs Kurs der Pending Order (StopLimit-Aufträge ausgenommen)
Price1 Kurs für die Umwandlung des Auftrags von StopLimit in Limit
Price2 Kurs für die Umwandlung des Auftrags von StopLimit in eine Position

 

Jetzt versuchen wir, die oben dargelegten Auftragsstrategien in unserer neuen Metasprache niederzuschreiben.

 

Beispiele für Auftragsstrategien in der Metasprache

Die Programme werden in Tabellenform dargestellt, zum leichteren Verständnis sind alle Befehle für die Phasenermittlung und die Operationen in den Spalten aufgeführt und mit Anmerkungen versehen. In der Anlage zu diesem Beitrag finden sich alle Programme in Textdateien und zwar in der Form, in der sie in einem Expert-System verwendet werden sollten.

Wichtiger Hinweis: Die mathematischen Zeichen „+“, „-“ und „*“ dürfen in Bezeichnern nicht verwendet werden. Es empfiehlt sich, ausschließlich Zahlen zu benutzen.

 

Nachschießen mithilfe begrenzter Aufträge

Die Anfangsposition wird in die von dem Anwender in den „Eigenschaften“ angegebene Richtung eröffnet. Es darf höchstens 5 Mal „nachgeschossen“ werden (5 Limit Orders). Auf dem Markt dürfen nur jeweils drei Aufträge gleichzeitig vorhanden sein.

Tabelle 5. Das Metaprogramm für das „Nachschießen mithilfe begrenzter Aufträge“

Phasenkennziffer Phasenermittlung Operationen Anmerkungen
1 Nothing;
UserBuy
Buy(1,1,0,Ask+Var1p);
BuyLimit(2,2,Buy(1,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p);
BuyLimit(3,4,BuyLimit(2,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p);
BuyLimit(4,8,BuyLimit(3,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p)
Wenn auf dem Markt weder eine Position noch Aufträge vorhanden sind, wird in den Parametern des Expert-Systems die Richtung Kauf angegeben, die Eröffnung einer Position mit einem Anfangsposten. Nach der Eröffnung der Position wird versucht, drei begrenzte Aufträge zu platzieren. Wobei jeder nachfolgende Auftrag erst nach erfolgter Platzierung des vorausgehenden gesetzt wird, da der Kurs des Auftrags ausgehend von dem seines Vorgängers berechnet wird.
2 Buy(1) BuyLimit(2,2,Buy(1,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p);
BuyLimit(3,4,BuyLimit(2,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p);
BuyLimit(4,8,BuyLimit(3,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p)
Wurde die Position in Phase 1 zwar erfolgreich eröffnet, jedoch nicht alle Pending Orders platziert, so wird Letzteres weiter versucht.
3 Buy(2) BuyLimit(3,4,Buy(2,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p);
BuyLimit(4,8,BuyLimit(3,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p);
BuyLimit(5,16,BuyLimit(4,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p)
Wenn der erste begrenzte Auftrag (mit dem Bezeichner 2) ausgelöst wurde, wird versucht, die beiden Aufträge zu platzieren, die in vorhergehenden Phasen hätten platziert werden müssen (aber nicht platziert werden konnten), und es wird ein weiterer Auftrag platziert, damit auf dem Markt stets drei begrenzte Aufträge vorhanden sind.
4 Buy(3) BuyLimit(4,8,Buy(3,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p);
BuyLimit(5,16,BuyLimit(4,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p);
BuyLimit(6,32,BuyLimit(4,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p)
Es wurde ein weiterer begrenzter Auftrag ausgelöst, wodurch hier wie in der vorherigen Phase das Vorhandensein von drei begrenzten Aufträgen auf dem Markt gewährleistet ist.
5 Buy(4) BuyLimit(5,16,Buy(4,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p);
BuyLimit(6,32,BuyLimit(5,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p)
In dieser Phase ist lediglich das Vorhandensein von zwei bedingten Aufträgen (Pending Orders) auf dem Markt gewährleistet, da die Gesamtzahl der Aufträge sich ihrer zulässigen Obergrenze nähert.
6 Buy(5) BuyLimit(6,32,Buy(5,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p) In dieser Phase gibt es nur einen Auftrag, den letzten.
7 Buy(6) Modify(6,,,Buy(6,OpenPrice)-Var4p,) Wenn der letzte Auftrag ausgelöst wurde, wird für ihn eine Stop Loss-Grenze festgesetzt.
8 Nothing;
UserSell
Sell(1,1,0,Var1p); SellLimit(2,2,Sell(1,OpenPrice)+Var2p,0,ThisOpenPrice-Var3p);
SellLimit(3,4,SellLimit(2,OpenPrice)+Var2p,0,ThisOpenPrice-Var3p);
SellLimit(4,8,SellLimit(3,OpenPrice)+Var2p,0,ThisOpenPrice-Var3p)
Wie Phase 1 nur in Richtung Verkauf.
9 Sell(1) SellLimit(2,2,Sell(1,OpenPrice)+Var2p,0,ThisOpenPrice-Var3p);
SellLimit(3,4,SellLimit(2,OpenPrice)+Var2p,0,ThisOpenPrice-Var3p);
SellLimit(4,8,SellLimit(3,OpenPrice)+Var2p,0,ThisOpenPrice-Var3p)
Wie Phase 2 nur in Richtung Verkauf.
10 Sell(2) SellLimit(3,4,Sell(2,OpenPrice)+Var2p,0,Var3);
SellLimit(4,8,SellLimit(3,OpenPrice)+Var2p,0,ThisOpenPrice-Var3p);
SellLimit(5,16,SellLimit(4,OpenPrice)+Var2p,0,ThisOpenPrice-Var3p)
Wie Phase 3 nur in Richtung Verkauf.
11 Sell(3) SellLimit(4,8,Sell(3,OpenPrice)+Var2p,0,Var3);
SellLimit(5,16,SellLimit(4,OpenPrice)+Var2p,0,ThisOpenPrice-Var3p);
SellLimit(6,32,SellLimit(4,OpenPrice)+Var2p,0,ThisOpenPrice-Var3p)
Wie Phase 4 nur in Richtung Verkauf.
12 Sell(4) SellLimit(5,16,Sell(4,OpenPrice)+Var2p,0,Var3);
SellLimit(6,32,SellLimit(5,OpenPrice)+Var2p,0,ThisOpenPrice-Var3p)
Wie Phase 5 nur in Richtung Verkauf.
13 Sell(5) SellLimit(6,32,Sell(5,OpenPrice)+Var2p,0,ThisOpenPrice-Var3p) Wie Phase 6 nur in Richtung Verkauf.
14 Sell(6) Modify(6,,,Sell(6,OpenPrice)+Var4p,) Wie Phase 7 nur in Richtung Verkauf.
15 NoPos;
Pending
DeleteAll(,0,0,1,1,0,0) Keine Position, nur bedingte Aufträge (Pending Orders). Das kommt bei Auslösung des Take Profit der Position vor. In diesem Fall müssen die Aufträge gelöscht werden. Nach dem Löschen der Aufträge kehrt das System zu Phase 1 oder 9 zurück. Wenn der Anwender im Verlauf der Arbeit die Anfangsrichtung deaktiviert hat, werden keine Operationen ausgeführt.

 

Die Verwendung der Variablen: Var1 - der Take Profit-Kurs des ersten Auftrags; Var2 - Kursniveau für die Platzierung der begrenzten Aufträge bezogen auf den Eröffnungskurs des vorhergehenden Auftrags; Var3 - Stop Loss-Kurs des letzten Auftrags.

Abb. 5 zeigt das sich aus der Ausführung dieses Metaprogramms ergebende Diagramm.

Abb. 5. Ergebnisse der Ausführung des Metaprogramms für das „Nachschießen mithilfe begrenzter Aufträge“
Abb. 5. Ergebnisse der Ausführung des Metaprogramms für das „Nachschießen mithilfe begrenzter Aufträge“

Hinweis: Die Richtlinien für die Richtungen Kauf und Verkauf sind gesondert aufgeführt. Das Niveau jeder nachfolgenden Pending Order wird anhand des Kursniveaus des jeweils vorhergehenden Auftrags berechnet. Konnte ein Auftrag nicht platziert werden, so wird auch der nachfolgende Auftrag aufgrund des Nichtvorhandenseins des erforderlichen Parameters nicht platziert. Das Niveau anhand des Kurses der Marktposition zu berechnen, wäre nicht richtig. In diesem Fall könnten einige der Aufträge übergangen werden.

 

Gegenläufiger Stop

Wir beginnen mit zwei bedingten Stop-Aufträgen (Pending Stop Orders). Fünf Umkehrvorgänge sind erlaubt.

Tabelle 6. Das Metaprogramm „Gegenläufiger Stop“

Phasenkennziffer Phasenermittlung Operationen Anmerkungen
1 Nothing BuyStop(1,1,Ask+Var1p,ThisOpenPrice-Var2p,ThisOpenPrice+Var3p);
SellStop(1,1,Bid-Var1p,ThisOpenPrice+Var2p,ThisOpenPrice-Var3p)
Auf dem Markt liegen weder eine Position noch Aufträge vor, also versuchen wir zwei Stop-Aufträge mit dem Bezeichner 1 zu platzieren.
2 NoPos;
BuyStop(1)
SellStop(1,1,Bid-Var1p,ThisOpenPrice+Var2p,ThisOpenPrice-Var3p) Es liegt keine Position vor, aber es gibt einen BuyStop-Auftrag mit dem Bezeichner 1, was bedeutet, dass ein SellStop-Auftrag mit demselben Bezeichner vorhanden sein müsste.
3 NoPos;
SellStop(1)
BuyStop(1,1,Ask+Var1p,ThisOpenPrice-Var2p,ThisOpenPrice+Var3p) Es liegt keine Position vor, aber es gibt einen SellStop-Auftrag mit dem Bezeichner 1, was bedeutet, dass ein BuyStop-Auftrag mit demselben Bezeichner vorhanden sein müsste.
4 Buy(1) Delete(1);
SellStop(2,2,Buy(1,StopLossValue),ThisOpenPrice+Var2p,ThisOpenPrice-Var3p)
Auf dem Markt gibt es eine Buy-Position mit dem Bezeichner 1, in diesem Fall darf es keine anderen Aufträge mit diesem Bezeichner geben, stattdessen muss ein SellStop-Auftrag mit dem Bezeichner 2 vorhanden sein.
5 Sell(1) Delete(1);
BuyStop(2,2,Sell(1,StopLossValue),ThisOpenPrice-Var2p,ThisOpenPrice+Var3p)
Vergleichbar mit Phase 4, nur dass der erste SellStop-Auftrag ausgelöst wurde.
6 Buy(2) SellStop(3,4,Buy(2,StopLossValue),ThisOpenPrice+Var2p,ThisOpenPrice-Var3p) Der zweite BuyStop-Auftrag wurde ausgelöst, jetzt muss der dritte SellStop platziert werden.
7 Sell(2) BuyStop(3,4,Sell(2,StopLossValue),ThisOpenPrice-Var2p,ThisOpenPrice+Var3p) Der zweite SellStop-Auftrag wurde ausgelöst, jetzt muss der dritte BuyStop platziert werden.
8 Buy(3) SellStop(4,8,Buy(3,StopLossValue),ThisOpenPrice+Var2p,ThisOpenPrice-Var3p) Der dritte BuyStop-Auftrag wurde ausgelöst, jetzt muss der vierte SellStop platziert werden.
9 Sell(3) BuyStop(4,8,Sell(3,StopLossValue),ThisOpenPrice-Var2p,ThisOpenPrice+Var3p) Der dritte SellStop-Auftrag wurde ausgelöst, jetzt muss der vierte BuyStop platziert werden.
10 Buy(4) SellStop(5,16,Buy(4,StopLossValue),ThisOpenPrice+Var2p,ThisOpenPrice-Var3p) Der vierte BuyStop-Auftrag wurde ausgelöst, jetzt muss der fünfte SellStop platziert werden.
11 Sell(4) BuyStop(5,16,Sell(4,StopLossValue),ThisOpenPrice-Var2p,ThisOpenPrice+Var3p) Der vierte SellStop-Auftrag wurde ausgelöst, jetzt muss der fünfte BuyStop platziert werden.
12 Buy(5) SellStop(6,32,Buy(5,StopLossValue),ThisOpenPrice+Var2p,ThisOpenPrice-Var3p) Der fünfte BuyStop-Auftrag wurde ausgelöst, jetzt muss der sechste SellStop platziert werden.
13 Sell(5) BuyStop(6,32,Sell(5,StopLossValue),ThisOpenPrice-Var2p,ThisOpenPrice+Var3p) Der fünfte SellStop-Auftrag wurde ausgelöst, jetzt muss der sechste BuyStop platziert werden.
14 NoPos;
BuyStop(2)
Delete(2) Keine Position mehr, aber ein BuyStop-Auftrag ist noch da; das kann vorkommen, wenn die Position bei Erreichen der Take Profit-Grenze geschlossen wurde. In diesem Fall wird der verbleibende Auftrag gelöscht, und das System kehrt zu Phase 1 zurück.
15 NoPos;
SellStop(2)
Delete(2) Wie Phase 14.
16 NoPos;
BuyStop(3)
Delete(3) Wie Phase 14.
17 NoPos;
SellStop(3)
Delete(3) Wie Phase 14.
18 NoPos;
BuyStop(4)
Delete(4) Wie Phase 14.
19 NoPos;
SellStop(4)
Delete(4) Wie Phase 14.
20 NoPos;
BuyStop(5)
Delete(5) Wie Phase 14.
21 NoPos;
SellStop(5)
Delete(5) Wie Phase 14.
22 NoPos;
BuyStop(6)
Delete(6) Wie Phase 14.
23 NoPos;
SellStop(6) |
Delete(6) Wie Phase 14.

 

Die Verwendung der Variablen: Var1 - Aktuelles Marktkursniveau, auf dem die Anfangsaufträge platziert werden; Var2 - Stop Loss; Var3 - Take Profit.

Abb. 6 zeigt das sich aus der Ausführung dieses Metaprogramms ergebende Diagramm.

Abb. 6. Ergebnisse der Ausführung des Metaprogramms „Gegenläufiger Stop“
Abb. 6. Ergebnisse der Ausführung des Metaprogramms „Gegenläufiger Stop“

 

Nachkauf

Die Anfangsposition wird aufgrund eines Indikatorsignals eröffnet. Fünf Nachkaufvorgänge sind erlaubt.

Tabelle 7 Das Metaprogramm für den „Nachkauf“

Phasenkennziffer Phasenermittlung Operationen Anmerkungen
1 Nothing;
SignalOpenBuy
Buy(1,1,Ask-Var1p,Ask+Var2p*6) Auf dem Markt gibt es weder eine Position noch Aufträge, bei Eintreffen eines Indikatorsignals für die Eröffnung einer Kaufposition wird diese eröffnet. Die Take Profit-Grenze wird im Abstand Var2p*6 platziert, im nächsten Schritt auf Var2p*5 verschoben und immer so weiter, damit sie sich stets in etwa auf dem gleichen Kursniveau befindet.
2 Buy(1);
Buy(1,ProfitInPoints)>=Var3
Buy(2,1,Ask-Var1p,Ask+Var2p*5) Es liegt eine Kaufposition mit ausreichendem Gewinn vor, also erfolgt der Nachkauf.
3 Buy(2) Modify(2,,,Buy(2,OpenPrice),) Auf dem Markt befindet sich eine Position mit der Kennziffer, es handelt sich nicht um die Anfangsposition, also muss ein Nachkauf erfolgt sein, die Stop Loss-Grenze muss auf der Gewinnschwelle liegen.
4 Buy(2);
Buy(2,ProfitInPoints)>=Var3
Buy(3,1,Ask-Var1p,Ask+Var2p*4) Die Position erzielt erneut einen Gewinn, ein erneuter Nachkauf wird ausgeführt.
5 Buy(3) Modify(3,,,Buy(3,OpenPrice),) Bei jedem Nachkauf wird die Stop Loss-Grenze auf die Position der Gewinnschwelle verschoben.
6 Buy(3);
Buy(3,ProfitInPoints)>=Var3
Buy(4,1,Ask-Var1p,Ask+Var2p*3) Wie Phase 4.
7 Buy(4) Modify(4,,,Buy(4,OpenPrice),) Wie Phase 5.
8 Buy(4);
Buy(4,ProfitInPoints)>=Var3
Buy(5,1,Ask-Var1p,Ask+Var2p*2) Wie Phase 4.
9 Buy(5) Modify(5,,,Buy(5,OpenPrice),) Wie Phase 5.
10 Buy(5);
Buy(5,ProfitInPoints)>=Var3
Buy(6,1,Ask-Var1p,Ask+Var2p) Wie Phase 4.
11 Buy(6) Modify(6,,,Buy(6,OpenPrice),) Wie Phase 5.
12 Nothing;
SignalOpenSell
Sell(1,1,Bid+Var1p,Bid-Var2p*6) Wie Phase 1, aber für den Verkauf.
13 Sell(1);
Sell(1,ProfitInPoints)>=Var3
Sell(2,1,Bid+Var1p,Bid-Var2p*5) Wie Phase 2, aber für den Verkauf.
14 Sell(2) Modify(2,,,Sell(2,OpenPrice),) Wie Phase 3, aber für den Verkauf.
15 Sell(2);
Sell(2,ProfitInPoints)>=Var3
Sell(3,1,Bid+Var1p,Bid-Var2p*4) Wie Phase 4, aber für den Verkauf.
16 Sell(3); Modify(3,,,Sell(3,OpenPrice),) Wie Phase 5, aber für den Verkauf.
17 Sell(3);
Sell(3,ProfitInPoints)>=Var3
Sell(4,1,Bid+Var1p,Bid-Var2p*3) Wie Phase 6, aber für den Verkauf.
18 Sell(4); Modify(4,,,Sell(4,OpenPrice),) Wie Phase 7, aber für den Verkauf.
19 Sell(4);
Sell(4,ProfitInPoints)>=Var3
Sell(5,1,Bid+Var1p,Bid-Var2p*2) Wie Phase 8, aber für den Verkauf.
20 Sell(5); Modify(5,,,Sell(5,OpenPrice),) Wie Phase 9, aber für den Verkauf.
21 Sell(5);
Sell(5,ProfitInPoints)>=Var3
Sell(6,1,Bid+Var1p,Bid-Var2p) Wie Phase 10, aber für den Verkauf.
22 Sell(6); Modify(6,,,Sell(6,OpenPrice),) Wie Phase 11, aber für den Verkauf.

 

Die Verwendung der Variablen: Var1 - anfänglicher Stop Loss; Var2 - Take Profit des letzten Auftrags; Var3 - Gewinn in Punkten, bei dem der Nachkauf ausgeführt und die Stop Loss-Grenze auf die Gewinnschwelle verschoben wird.

Abb. 7 zeigt das sich aus der Ausführung dieses Metaprogramms ergebende Diagramm.

Abb. 7. Ergebnisse der Ausführung des Metaprogramms für den „Nachkauf“
Abb. 7. Ergebnisse der Ausführung des Metaprogramms für den „Nachkauf“

 

Wiedereröffnung

Zunächst werden zwei begrenzte Aufträge platziert. Wird einer ausgelöst, erfolgt die Löschung des anderen. Anschließend erfolgt bei jeder Auslösung des Stop Loss die Eröffnung einer neuen Position, bis die Take Profit-Grenze erreicht wird oder die zulässige Gesamtzahl an Positionen (5) abgearbeitet ist.

Tabelle 8. Das Metaprogramm für die „Wiedereröffnung“

Phasenkennziffer Phasenermittlung Operationen Anmerkungen
1 Nothing;
NoLastDeal
BuyLimit(1,1,Ask-Var1p,ThisOpenPrice-Var2p,ThisOpenPrice+Var3p);
SellLimit(1,1,Bid+Var1p,ThisOpenPrice+Var2p,ThisOpenPrice-Var3p)
Auf dem Markt ist weder eine Position noch ein Auftrag vorhanden, und im Kursverlauf des Kürzels befinden sich keine Abschlüsse. Das heißt, das System steht erst am Anfang seiner Arbeit. Es werden zwei erste Operationen ausgeführt und zwei begrenzte Aufträge platziert.
2 Nothing;
LastDeal(,ProfitInValute)>0
BuyLimit(1,1,Ask-Var1p,ThisOpenPrice-Var2p,ThisOpenPrice+Var3p);
SellLimit(1,1,Bid+Var1p,ThisOpenPrice+Var2p,ThisOpenPrice-Var3p)
Auf dem Markt ist weder eine Position noch ein Auftrag vorhanden, aber im Kursverlauf findet sich ein Abschluss mit Gewinn. Das bedeutet, dass der vorherige Arbeitsgang abgeschlossen ist, und wir wieder von vorne beginnen und wie in Phase 1 zwei begrenzte Aufträge platzieren müssen.
3 Nothing;
LastEADeal(5)
BuyLimit(1,1,Ask-Var1p,ThisOpenPrice-Var2p,ThisOpenPrice+Var3p);
SellLimit(1,1,Bid+Var1p,ThisOpenPrice+Var2p,ThisOpenPrice-Var3p)
Auf dem Markt ist weder eine Position noch ein Auftrag vorhanden, aber im Kursverlauf findet sich ein Abschluss mit dem letzten Bezeichner. In diesem Fall ist der Gewinn des Abschlusses nicht von Belang, der Arbeitsgang gilt ohnedies als abgeschlossen, und wir beginnen wieder von vorne mit der Platzierung der zwei begrenzten Aufträge wie in Phase 1.
4 NoPos;
BuyLimit(1)
SellLimit(1,1,Bid+Var1p,ThisOpenPrice-Var2p,ThisOpenPrice+Var3p) Auf dem Markt befindet sich keine Position, aber es ist bekannt, dass es einen begrenzten Auftrag gibt, was bedeutet, dass da auch ein zweiter sein muss.
5 NoPos;
SellLimit(1)
BuyLimit(1,1,Ask-Var1p,ThisOpenPrice+Var2p,ThisOpenPrice-Var3p) Wie Phase 4.
6 Buy(1);
SellLimit(1)
Delete(1) Es liegt eine Position mit dem Bezeichner 1 vor. Das bedeutet, dass einer der begrenzten Aufträge ausgelöst wurde, weswegen der andere gelöscht werden muss.
7 Sell(1);
BuyLimit(1)
Delete(1) Wie Phase 6.
8 Nothing;
LastDeal(1,ProfitInValute)<=0;
LastEADeal(1,Direction)==1
Buy(2,2,Ask-Var2p,Ask+Var3p) Es ist keine Position vorhanden und der letzte Abschluss wies einen Verlust auf. Wir überprüfen die Richtung des von dem Expert-System getätigten Abschlusses; war es ein Kauf, so wird auch die nächste Position in Richtung Kauf eröffnet.
9 Nothing;
LastDeal(1,ProfitInValute)<=0;
LastEADeal(1,Direction)==-1
Sell(2,2,Bid+Var2p,Bid-Var3p) Es ist keine Position vorhanden und der letzte Abschluss wies einen Verlust auf. Wir überprüfen die Richtung des von dem Expert-System getätigten Abschlusses; war es ein Verkauf, so wird auch die nächste Position in Richtung Verkauf eröffnet.
10 Nothing;
LastDeal(2,ProfitInValute)<=0;
LastEADeal(2,Direction)==1
Buy(3,4,Ask-Var2p,Ask+Var3p) Wie Phase 8.
11 Nothing;
LastDeal(2,ProfitInValute)<=0;
LastEADeal(2,Direction)==-1
Sell(3,4,Bid+Var2p,Bid-Var3p) Wie Phase 9.
12 Nothing;
LastDeal(3,ProfitInValute)<=0;
LastEADeal(3,Direction)==1
Buy(4,8,Ask-Var2p,Ask+Var3p) Wie Phase 8.
13 Nothing;
LastDeal(3,ProfitInValute)<=0;
LastEADeal(3,Direction)==-1
Sell(4,8,Bid+Var2p,Bid-Var3p) Wie Phase 9.
14 Nothing;
LastDeal(4,ProfitInValute)<=0;
LastEADeal(4,Direction)==1
Buy(5,16,Ask-Var2p,Ask+Var3p) Wie Phase 8.
15 Nothing;
LastDeal(4,ProfitInValute)<=0;
LastEADeal(4,Direction)==-1
Sell(5,16,Bid+Var2p,Bid-Var3p) Wie Phase 9.

 

Die Verwendung der Variablen: Var1 - Marktkursniveau, auf dem die begrenzten Aufträge platziert werden; Var2 - Stop Loss, Var3 - Take Profit.

Abb. 8 zeigt das sich aus der Ausführung dieses Metaprogramms ergebende Diagramm.

Abb. 8. Ergebnisse der Ausführung des Metaprogramms für die „Wiedereröffnung“
Abb. 8. Ergebnisse der Ausführung des Metaprogramms für die „Wiedereröffnung“

Es gibt noch weitere einfache Programme zum Ausprobieren der Funktionen zur Arbeit mit Handelssignalen, Trailing Stops und der Gewinnschwelle.

 

Handelssignale

Ein- und Ausstieg erfolgen aufgrund von Handelssignalen.

Tabelle 9. Das Metaprogramm für „Handelssignale“

Phasenkennziffer Phasenermittlung Operationen Anmerkungen
1 Nothing;
SignalOpenBuy;
NoTradeOnBar
Buy(1,1,0,0) Auf dem Markt ist weder eine Position noch ein Auftrag vorhanden, aber ein Signal für die Eröffnung einer Kaufposition. Auf dem aktuellen Balken wurden keine Abschlüsse getätigt, also wird eine Kaufposition eröffnet.
2 Nothing;
SignalOpenSell;
NoTradeOnBar
Sell(1,1,0,0) Auf dem Markt ist weder eine Position noch ein Auftrag vorhanden, aber ein Signal für die Eröffnung einer Verkaufsposition. Auf dem aktuellen Balken wurden keine Abschlüsse getätigt, also wird eine Verkaufsposition eröffnet.
3 SignalCloseBuy;
Buy(1)
Close(1); Es liegt ein Signal für das Schließen von Kaufpositionen vor, ist eine solche vorhanden, wird sie geschlossen.
4 SignalCloseSell;
Sell(1)
Close(1); Es liegt ein Signal für das Schließen von Verkaufspositionen vor, ist eine solche vorhanden, wird sie geschlossen.

 

Abb. 9 zeigt das sich aus der Ausführung dieses Metaprogramms ergebende Diagramm.

Abb. 9. Ergebnisse der Ausführung des Metaprogramms für „Handelssignale“
Abb. 9. Ergebnisse der Ausführung des Metaprogramms für „Handelssignale“

 

Handelssignale mit Trailing Stop

Tabelle 10. Das Metaprogramm für „Handelssignale mit Trailing Stop“

Phasenkennziffer Phasenermittlung Operationen Anmerkungen
1 Nothing;
SignalOpenBuy;
NoTradeOnBar
Buy(1,1,0,0) Auf dem Markt ist weder eine Position noch ein Auftrag vorhanden, aber ein Signal für die Eröffnung einer Kaufposition. Auf dem aktuellen Balken wurden keine Abschlüsse getätigt, also wird eine Kaufposition eröffnet.
2 Nothing;
SignalOpenSell;
NoTradeOnBar
Sell(1,1,0,0) Auf dem Markt ist weder eine Position noch ein Auftrag vorhanden, aber ein Signal für die Eröffnung einer Verkaufsposition. Auf dem aktuellen Balken wurden keine Abschlüsse getätigt, also wird eine Verkaufsposition eröffnet.
3 SignalCloseBuy;
Buy(1)
Close(1); Es liegt ein Signal für das Schließen von Kaufpositionen vor, ist eine solche vorhanden, wird sie geschlossen.
4 SignalCloseSell;
Sell(1)
Close(1); Es liegt ein Signal für das Schließen von Verkaufspositionen vor, ist eine solche vorhanden, wird sie geschlossen.
5 Buy(1) TrailingStop Auf dem Markt gibt es eine Kaufposition, folglich muss die Trailing Stop-Funktion aktiviert werden.
6 Sell(1) TrailingStop Auf dem Markt gibt es eine Verkaufsposition, folglich muss die Trailing Stop-Funktion aktiviert werden.

 

Abb. 10 zeigt das sich aus der Ausführung dieses Metaprogramms ergebende Diagramm.

Abb. 10. Ergebnisse der Ausführung des Metaprogramms für „Handelssignale mit Trailing Stop“
Abb. 10. Ergebnisse der Ausführung des Metaprogramms für „Handelssignale mit Trailing Stop“

 

Handelssignale mit Gewinnschwelle

Tabelle 11. Das Metaprogramm für „Handelssignale mit Gewinnschwelle“

Phasenkennziffer Phasenermittlung Operationen Anmerkungen
1 Nothing;
SignalOpenBuy;
NoTradeOnBar
Buy(1,1,0,0) Auf dem Markt ist weder eine Position noch ein Auftrag vorhanden, aber ein Signal für die Eröffnung einer Kaufposition. Da der aktuelle Balken keine Abschlüsse aufweist, wird eine Kaufposition eröffnet.
2 Nothing;
SignalOpenSell;
NoTradeOnBar
Sell(1,1,0,0) Auf dem Markt ist weder eine Position noch ein Auftrag vorhanden, aber ein Signal für die Eröffnung einer Verkaufsposition. Da der aktuelle Balken keine Abschlüsse aufweist, wird eine Verkaufsposition eröffnet.
3 SignalCloseBuy;
Buy(1)
Close(1); Es liegt ein Signal für das Schließen von Kaufpositionen vor, ist eine solche vorhanden, wird sie geschlossen.
4 SignalCloseSell;
Sell(1)
Close(1); Es liegt ein Signal für das Schließen von Verkaufspositionen vor, ist eine solche vorhanden, wird sie geschlossen.
5 Buy(1) BreakEven Auf dem Markt gibt es eine Kaufposition, folglich muss die Gewinnschwellenfunktion aktiviert werden.
6 Sell(1) BreakEven Auf dem Markt gibt es eine Verkaufsposition, folglich muss die Gewinnschwellenfunktion aktiviert werden.

 

Abb. 11 zeigt das sich aus der Ausführung dieses Metaprogramms ergebende Diagramm.

Abb. 11. Ergebnisse der Ausführung des Metaprogramms für „Handelssignale mit Gewinnschwelle“

Abb. 11. Ergebnisse der Ausführung des Metaprogramms für „Handelssignale mit Gewinnschwelle“

 

Der Befehlsinterpreter

Das vorgestellte Verfahren zur Umsetzung von Handelsstrategien in Formelsprache erleichtert nicht nur die Orientierung in diesen Strategien und die Bereitstellung der Algorithmen des Expert-Systems für ihre Programmierung, es ermöglicht auch die unmittelbare Interpretation und Umsetzung der erarbeiteten Richtlinien. Zu diesem Zweck wurde das Expert-System eInterpretator entwickelt (siehe Anlage). In der Tabelle 12 werden alle Parameter dieses Expert-System samt Beschreibung vorgestellt.

Tabelle 12. Die Parameter des Expert-Systems eInterpretator

Parameter Zweck
Lots Auftragsumfang bei einem Postenkoeffizienten von „1“
UserTradeDir Vom Anwender vorgegebene Handelsrichtung (wird bei der Phasenermittlung durch die Ausführung der Befehle UserBuy und UserSell überprüft).
ProgramFileName Name der Datei mit dem Metaprogramm (bei der Arbeit an einem Konto). Bei der Prüfung oder Optimierung muss sich das Metaprogramm in der Datei mit der Bezeichnung „TesterMetaProgram.txt“ befinden.
DeInterpritate Gegenläufige Interpretation von Befehlen. Bei seiner Ausführung erscheint in dem Dateiordner („Files“) eine Datei mit dem Präfix „De“, mit deren Hilfe überprüft werden kann, wie das Expert-System das Metaprogramm aus der Datei ProgramFileName „verstanden“ hat.
User Variables
Var1 - Var20 Benutzerdefinierte Variablen.
Trailing Stop
TR_ON Einschalten der Trailing Stop-Funktion
TR_Start Gewinn der Position in Punkten, bei dem das automatische Nachziehen beginnt.
TR_Level Trailing Stop-Grenze. In Punkten ausgedrückte Entfernung zwischen dem aktuellen Marktkurs und dem Stop Loss.
TR_Step In Punkten ausgedrückter Schritt, um den der Stop Loss verschoben wird.
Break Even
BE_ON Einschalten der Gewinnschwellenfunktion.
BE_Start Gewinn der Position in Punkten, bei dem die Gewinnschwellenfunktion ausgelöst wird.
BE_Level Niveau auf das der Stop Loss bei Auslösung der Gewinnschwellenfunktion verschoben wird. BE_Start und BE_Level werden in Gewinnpunkten festgelegt.
Open Signals
OS_ON Einschalten der Signale für die Eröffnung einer Position.
OS_Shift Balken, an dem die Indikatoren geprüft werden: 0 - neu anzulegen, 1 - abgeschlossen.
OS_TimeFrame Zeitraum der Indikatoren.
OS_MA2FastPeriod Zeitraum des schnellen gleitenden Durchschnitts (MA).
OS_MA2FastShift Verschiebung des schnellen gleitenden Durchschnitts (MA).
OS_MA2FastMethod Methode des schnellen gleitenden Durchschnitts (MA).
OS_MA2FastPrice Kurs des schnellen gleitenden Durchschnitts (MA).
OS_MA2SlowPeriod Zeitraum des langsamen gleitenden Durchschnitts (MA).
OS_MA2SlowShift Verschiebung des langsamen gleitenden Durchschnitts (MA).
OS_MA2SlowMethod Methode des langsamen gleitenden Durchschnitts (MA).
OS_MA2SlowPrice Kurs des langsamen gleitenden Durchschnitts (MA).
Close Signals
CS_ON Einschalten der Signale zum Schließen einer Position.
CS_Shift Balken, an dem die Indikatoren geprüft werden: 0 - neu anzulegen, 1 - abgeschlossen.
CS_TimeFrame Zeitraum der Indikatoren.
CS_CCIPeriod CCI-Zeitraum.
CS_CCIPrice CCI-Kurs.
CS_CCILevel Obere CCI-Grenze (zum Schließen einer Kaufposition). Das Signal zum Schließen einer Kaufposition entsteht bei der Überschneidung der Grenze von oben nach unten. Zum Schließen einer Verkaufsposition verhält sich alles genau andersherum.

 

Funktionsweise eines Expert-Systems

Nach dem Start lädt das Expert-System das Metaprogramm aus der Datei, untersucht und analysiert es. Bei Vorliegen größerer Fehler in dem Metaprogramm erscheint eine Fehlermeldung. Bei der Untersuchung des Metaprogramms durch das Expert-System werden Datengerüste mit den Textbefehlen entsprechenden Zahlenwerten gefüllt, um eine möglichst schnelle Arbeitsweise des Expert-Systems zu gewährleisten. Bei erfolgreich verlaufener Analyse des Metaprogramms erscheint folgender Protokolleintrag: „Die Bereitstellung des Interpreters ist abgeschlossen“.

Bei eingeschalteter DeInterpritate-Variable führt das Expert-System probeweise eine gegenläufige Interpretation der Befehle durch (dabei wird er von dem Diagramm getrennt und wenn gerade eine Prüfung in einem Strategieprüfprogramm ausgeführt wird, wird diese unterbrochen). Bei der gegenläufigen Interpretation wandelt das Expert-System die Zahlenwerte aus den Datengerüsten in Textbefehle um. Dabei werden die Befehlseinträge in der Datei abweichen, aber anhand der gegenläufigen Interpretation des Metaprogramms wird anschaulich, wie das Expert-System bei der Analyse von Befehlen vorgeht.

Sehen wir uns zum Beispiel die folgende Zeile aus der Datei des Metaprogramms an:

Buy(6) | Modify(6,,,ThisOpenPrice-Var4p,)

Nach der „Deinterpretation“ sieht diese Zeile folgendermaßen aus:

Buy(6)==1*1+0*0; | Modify(6,,,ThisOpenPrice()*1-0.0025*1,)

Wie wir sehen, wurde der einfache Befehl Buy(6) in einen vergleichenden Ausdruck umgeformt, auf dessen rechter Seite der arithmetische Ausdruck X1*X2+X3*X4 mit dem Ergebnis „1“ berechnet wird. Im Operationsfeld wurde die benutzerdefinierte Variable durch einen Zahlenwert ersetzt.

 

Ratschläge für die Nachbesserung des Expert-Systems

Wahrscheinlich würde jemand das Expert-System gerne verbessern und eigene Befehle sowohl zur Analyse der Phase als auch zur Ausführung von Operationen und Funktionen zur Verwaltung der Position hinzufügen. Der Aufbau des Expert-Systems ermöglicht die absolut problemlose Durchführung dieser Nachbesserung, andernfalls wäre die Arbeit an diesem System auch nutzlos gewesen.

Hinzufügen von Befehlen zum Bezug von Daten

Eine Aufstellung der Befehle zum Bezug von Daten befindet sich in dem Datenfeld InfoCommand. Die Befehle sind spaltenweise jeweils zu fünft in einer Zeile angeordnet, weswegen ihre Gesamtzahl leicht zu erfassen ist, und so die Kennziffer für den hinzugefügten Befehl bestimmt werden kann.

Nach dem Hinzufügen des Befehls zu dem Datenfeld InfoCommand suchen wir die Funktion SetValue() und in dieser den Teil „switch“, dem wir einen weiteren, der Kennziffer des neuen Befehls entsprechenden „case“ hinzufügen. Um einen Wert beziehen zu können, muss zunächst das Objekt ausgewählt werden, dessen Wert bezogen werden muss, erst dann kann der Wert bezogen werden. Je nach Art des Objekts, von dem die bezogenen Daten stammen, werden zu seiner Auswahl unterschiedliche Funktionen verwendet. Diese Funktionen sind in der Tabelle 13 aufgeführt.

Tabelle 13. Funktionen des Expert-Systems zur Auswahl von Handelsobjekten

Funktion Zweck und Parameter
Pos.Select(_Symbol) Auswahl der Position. Eine Methode der Standardklasse, vergleichbar der Funktion PositionSelect().
SelectOrder(long aType,string aID,bool & aSelected) Funktion zur Auswahl eines Auftrags anhand des Kürzels, für das das Expert-System aufgerufen wurde, der Art (aType) und des Wertes des Bezeichners (aID). Wurde das Objekt gefunden und ausgewählt, gibt die Variable aSeleted den Referenzwert „true“ aus.
bool SelectLastDeal(int aType,bool & aSelected) Funktion zur Auswahl des letzten Abschlusses anhand des Kürzels, für das das Expert-System aufgerufen wurde, sowie dessen Art (aType). Wurde das Objekt gefunden und ausgewählt, gibt die Variable aSeleted den Referenzwert „true“ aus.
SelectLastEADeal(int aType,string aID,bool & aSelected) Funktion zur Auswahl des letzten von dem Expert-System getätigten Abschlusses anhand des Kürzels, für das das Expert-System aufgerufen wurde, sowie dessen Art (aType). Wurde das Objekt gefunden und ausgewählt, gibt die Variable aSeleted den Referenzwert „true“ aus.

 

Der letzte Abschluss und der letzte von dem Expert-System getätigte Abschluss unterscheiden sich schlicht dadurch, dass zu den letzten Abschlüssen auch solche zählen, die durch Auslösung von Stop Loss und Take Profit zustande gekommen sind. Die Angaben bezüglich des letzten Abschlusses können zur Bestimmung des Ergebnisses der Schließung der letzten Position erforderlich sein, die Angaben zu dem letzten Abschluss des Expert-Systems dagegen zur Bestimmung seiner letzten Handelsrichtung oder Arbeitsphase.

Neben dem Zugriff auf die Daten der Handelsobjekte kann auch der Zugriff auf Marktdaten wie den Kurs sowie auf alle übrigen erfolgen. Man muss sich lediglich davon überzeugen, dass die Daten abgerufen werden können. Nachdem wir versucht haben, ein Objekt auszuwählen, müssen wir sicherstellen, dass das Objekt tatsächlich ausgewählt wurde (dazu überprüfen wir den Wert aSelected), erhalten den erforderlichen Parameter, weisen ihm den Wert der Variablen Val.Value zu und geben „true“ aus.

Zum Beziehen der Parameter unterschiedlicher Handelsobjekte kommen die in der Tabelle 14 aufgeführten Funktionen zum Einsatz.

Tabelle 14. Funktionen des Expert-Systems zum Bezug der Parameter des ausgewählten Handelsobjekts

Funktion Zweck und Parameter
double SelPosParam(int aIndex) Abrufen des Positionsparameters mit der Kennziffer aIndex.
double SelOrdParam(int aIndex) Abrufen des Auftragsparameters mit der Kennziffer aIndex.
double SelDealParam(int aIndex) Abrufen des Abschlussparameters mit der Kennziffer aIndex.

 

In der Funktion wird die Kennziffer des Bezeichners der bezogenen Daten weitergegeben. Der Wert der Kennziffer befindet sich in der Variablen Val.InfoIdentifierIndex.

Beim Hinzufügen eines neuen Zugriffsbefehls kann es auch erforderlich sein, den Bezeichner der tatsächlich bezogenen Daten oder lediglich den Bezeichner der abgerufenen Daten zu ergänzen.

 

Hinzufügen von Datenbezeichnern

Eine Aufstellung der Bezeichner befindet sich in dem Datenfeld InfoIdentifier. Wir fügen dem Datenfeld den neuen Bezeichner hinzu, ermitteln seine Kennziffer und aktualisieren die Funktionen SelPosParam(), SelOrdParam() und SelDealParam(). Aktualisiert werden entweder alle oder nur einige Funktionen je nachdem, ob der neue Bezeichner auf alle Handelsobjekte angewendet werden kann. Die Aktualisierung der Funktionen besteht in der Ergänzung eines neuen der Kennziffer des neuen Bezeichners entsprechenden „Falls“ (case) in die „switch“-Konstruktion.

 

Hinzufügen von Operationsbefehlen

Operationsbefehle werden dem Datenfeld ActCommand hinzugefügt. In diesem Datenfeld sind die Befehle zeilenweise angelegt, weswegen die Ermittlung der Kennziffer etwas schwieriger ist. Die Elemente sind deshalb zeilenweise angeordnet, weil außer der Ergänzung des Befehls selbst auch die Anzahl seiner Parameter sowie seine Art angegeben werden müssen. Die Anzahl der Parameter wird in dem Datenfeld ActCmndPrmCnt ausgewiesen und die Art in dem Datenfeld ActCmndType. Mögliche Arten sind: 0 - Marktoperation, 1 - Operation mit Pending Order, 2 - Positionsverwaltung.

Nachdem das Datenfeld um den Befehl erweitert wurde, suchen wir die Funktion DoAction() und ergänzen ihren „switch“-Teil um einen weiteren „case“, in dem der Aufruf einer neuen Funktion ausgeführt wird. Die neue Funktion muss vom Typ „bool“ sein und bei erfolgreicher Ausführung den Wert „true“ ausgeben, bei Auftreten von Fehlern entsprechend „false“. Wenn keine Überprüfung des Ergebnisses der Ausführung der Funktion erforderlich ist, wie zum Beispiel bei der Trailing Stop-Funktion, kann einfach auch nur „true“ ausgeben.

Denken Sie bitte daran, dass bei Funktionen, die mit bedingten Aufträgen (Pending Orders) arbeiten, zum Beispiel solchen zu ihrer Platzierung, im Vorfeld geprüft werden muss, ob überhaupt ein Auftrag vorhanden ist.

 

Änderung der Funktionen zum Empfang von Handelssignalen

Die ganze Arbeit zum Empfang von Handelssignalen wird in dem Expert-System in zwei Funktionen ausgeführt (zwei für die Signale zum Schließen und zwei für die zur Eröffnung).

Die Funktionen CloseSignalsInit() (zur Bereitstellung von Signalen zum Schließen) und OpenSignalsInit() (zur Bereitstellung von Signalen für die Eröffnung) werden aus der Funktion OnInit() des Expert-Systems aufgerufen. In diesen Funktionen erfolgt das Laden der Indikatoren. Die wesentlichen Funktionen CloseSignalsMain() (zur Ermittlung der Handelssignale zum Schließen) und OpenSignalsMain() (zur Ermittlung der Handelssignale für die Eröffnung) werden bei jeder Kursänderung aus der Funktion OnTick() aufgerufen.

Zu Beginn der Ausführung der Funktion müssen den Variablen GlobalCloseBuySignal und GlobalCloseSellSignal (Signale zum Schließen) sowie GlobalOpenBuySignal und GlobalOpenSellSignal (Signale für die Eröffnung) die Werte „false“ und anschließend „true“ bei Vorliegen der entsprechenden Indikatoranzeigen zugewiesen werden.

Des Weiteren muss in der Funktion OnDeinit() des Expert-Systems mit IndicatorRelease() den Indikator freigeben.

 

Dateien im Anhang

  • eInterpretator.mq5 - in dem Ordner MQL5/Experts des Dateiordners der Anwendung auf dem Ausgabegerät (Terminal) befindliches Expert-System.

  • LimitAdd.txt - das Metaprogramm für das Nachschießen mithilfe begrenzter Aufträge.

  • StopRev.txt - das Metaprogramm Gegenläufiger Stop.

  • Piramiding.txt - das Metaprogramm für den Nachkauf.

  • ReOpen.txt - das Metaprogramm für die Wiedereröffnung.

  • TradeSignals.txt - das Metaprogramm für Handelssignale.

  • TradeSignalsTR.txt - das Metaprogramm für Handelssignale mit Trailing Stop.

  • TradeSignalsBE.txt - das Metaprogramm für Handelssignale mit Gewinnschwellenfunktion.

  • limitadd.set - Datei mit den Parametern für das Nachschießen mithilfe begrenzter Aufträge.

  • stoprev.set - Datei mit den Parametern für den Gegenläufigen Stop.

  • piramiding.set - Datei mit den Parametern für den Nachkauf.

  • reopen.set - Datei mit den Parametern für die Wiedereröffnung.

  • tradesignals.set - Datei mit den Parametern für Handelssignale.

  • tradesignalstr.set - Datei mit den Parametern für Handelssignale mit Trailing Stop.

  • tradesignalsbe.set - Datei mit den Parametern für Handelssignale mit Gewinnschwellenfunktion.

Hinweis. Vergessen Sie bei der Verwendung von Programmen mit Handelssignalen, Trailing Stop und Gewinnschwelle nicht, in den Einstellungen des Expert-Systems die entsprechenden Funktionen einzuschalten. Kopieren Sie bei der Prüfung von Strategien in dem Strategieprüfprogramm die Dateien mit den Metaprogrammen in die Datei TesterMetaProgram.txt (das ist für die Möglichkeit zur Nutzung externer Prüfinstanzen erforderlich). Die Datei ist in dem Ordner MQL5/Files des Dateiordners der Anwendung auf dem Ausgabegerät (Terminal) abzulegen (sie kann in dieser geöffnet werden: Hauptmenü -> Datei -> Dateiordner öffnen).

In den Parameterdateien befinden sich die Parameter, anhand derer die in dem Bereich „Beispiele für Auftragsstrategien in Metasprache“ abgelegten Diagramme erstellt wurden. Die Prüfung wurde für den letzten Monat (Stand 29. 08. 2012), das Kürzel EURUSD H1 und das OHLC-Modell auf M1 durchgeführt.

 

Fazit

Die Programmierung von Auftragsstrategien löst im ersten Moment häufig Verunsicherung aus, womit soll man anfangen, was einplanen, wie den stabilen Betrieb des Expert-Systems unter realen Bedingungen gewährleisten, wie die Ausführung des Algorithmus‘ der Handelsstrategie mit der Zuverlässigkeit seiner Arbeit unter einen Hut bringen?

Dieser Beitrag sollte sowohl Programmierern als auch Händlern, die die Programmierung von Expert-Systemen in Auftrag geben, zumindest dabei helfen, die anfängliche Formalisierung der Handelsstrategien vorzunehmen, und zu verstehen, in welche Phasen die Arbeit an Strategien untergliedert werden kann, was in jeder Phase vor sich gehen kann, und was einzuplanen ist. Dank des Expert-Systems eInterpretator eröffnen sich großartige Möglichkeiten zur Durchführung erster Experimente mit Auftragsstrategien mit einem Minimum an Zeit- und Arbeitsaufwand.

Meine enorme Begeisterung für die MetaTrader 5-Anwendung für Ausgabegeräte (Terminal) sei nicht verschwiegen. Das Arbeitstempo des Expert-Systems eInterpretator in dem Strategieprüfprogramm hat alle Erwartungen übertroffen!

Übersetzt aus dem Russischen von MetaQuotes Ltd.
Originalartikel: https://www.mql5.com/ru/articles/495

Beigefügte Dateien |
files__4.zip (23.39 KB)
Schnelleinstieg oder Kurzanleitung für Anfänger Schnelleinstieg oder Kurzanleitung für Anfänger
Liebe Leser, in diesem Artikel möchte ich Ihnen vermitteln und zeigen, wie man sich möglichst schnell und einfach die Grundlagen der Erstellung automatischer Handelssysteme, wie die Arbeit mit Indikatoren u. a., erschließt. Der Beitrag richtet sich an Neueinsteiger, in ihm kommen weder komplizierte noch schwer zu verstehende Beispiele zur Anwendung.
Handelsoperationen in MQL5 - Nichts leichter als das Handelsoperationen in MQL5 - Nichts leichter als das
Kaum ein Händler dürfte nicht auf dem Markt aktiv sein, um Geld zu verdienen, obwohl ein sich gewisser Teil vielleicht auch an der Teilnahme am Handelsgeschehen selbst erfreut. Aber Freude daran vermittelt nicht nur der manuelle Handel. Die Entwicklung automatischer Handelssysteme kann genauso begeisternd sein. Die Erstellung eines automatischen Expert-Systems für den Handel kann ein ebenso fesselndes Erlebnis sein, wie einen Krimi zu lesen.
Übertragen eines Indikator Code in einen Expert Advisor Code. Allgemeine Strukturelle Regelungen von Expert Advisor und Anzeigefunktionen Übertragen eines Indikator Code in einen Expert Advisor Code. Allgemeine Strukturelle Regelungen von Expert Advisor und Anzeigefunktionen
Dieser Artikel befasst sich mit den Möglichkeiten einen Indikator-Code in einen Expert Advisor Code zu übertragen, mit dem Schreiben von Expert Advisors ohne Aufrufe spezifischer Indikatoren und mit dem gesamten Quellcode für die Kalkulation benötigter Indikatorwerte innerhalb des Expert Advisor. Der Artikel vermittelt eine allgemeine Systematik von Expert Advisor Änderungen, und die Idee zum Aufbau einer Anzeigefunktion, basierend auf einem benutzerdefinierten Indikator. Der Artikel ist für Leser gedacht, die bereits Erfahrung mit Programmieren in der MQL4 Sprache haben.
Schneller Einstieg in MQL5 Schneller Einstieg in MQL5
Sie haben sich entschlossen, zur Programmierung von Handelsstrategien MQL5 zu lernen, wissen aber noch nichts darüber? Wir haben versucht, MQL5 und die MetaTrader 5-Anwendung aus der Sicht eines Neueinsteigers zu betrachten, und daraufhin diese kurze Einführung geschrieben. In diesem Beitrag finden Sie ein grobe Darstellung der Möglichkeiten der Programmiersprache sowie einige Hinweise für die Arbeit mit dem Bearbeitungsprogramm MetaEditor 5 und der MetaTrader 5-Anwendung auf Ihrem Rechner.