English Русский 中文 Español Deutsch 日本語 Português 한국어 Italiano Türkçe
Expert Advisor basé sur les « Nouvelles dimensions en trading » livre écrit par Bill Williams

Expert Advisor basé sur les « Nouvelles dimensions en trading » livre écrit par Bill Williams

MetaTrader 5Systèmes de trading | 22 décembre 2021, 16:43
181 0
Alexey Klenov
Alexey Klenov


Introduction

Dans cet article, je discuterai du développement d'un Expert Advisor en trading, basé sur le livre Nouvelles dimensions en trading : Comment profiter du chaos dans les changes, les actions et les matières premières par B. Williams pour la plateforme MetaTrader 5 en langage MQL5. La stratégie elle-même est bien connue et son utilisation est encore controversée parmi les traders. 

Elle attire les nouveaux venus par son étude aisée de signaux « presque entièrement » dépourvus de côtés subjectifs, contrairement, par exemple, à l'interprétation de la théorie Elliott wave. Mais ce n'est qu'à première vue, dans certains aspects, les traders ont encore à se décider. Et cela sera discuté plus loin dans l'article.

Les objectifs de cet article :
  • Développer, en utilisant le paradigme POO (Programmation orientée objet), une classe d'EA, qui implémente le trade, basée sur la stratégie de B. Williams. Nous l'appellerons C_TS_BW ;
  • Dans la classe C_TS_BW lorsque cela est possible, utilisez des codes prêts à l'emploi de la bibliothèque standard.
  • Rédaction d’un EA, utilisant la classe C_TS_BW ;
  • Tester l'EA développé dans le testeur de stratégie sur plusieurs instruments Forex et CFD ;
  • Enfin, confirmer ou infirmer l'aptitude de cette stratégie dans les conditions du taux du jour.


1. Indicateurs

Dans la base du système de trading, il y a des signaux de 4 indicateurs :

  1. Alligator;
  2. Fractals;
  3. The Awesome Oscillator;
  4. Acceleration/Deceleration.

1.1. Alligator

L'indicateur technique Alligator est une combinaison des moyennes mobiles ( des lignes d’équilibre), qui utilisent la géométrie fractale et la dynamique non linéaire.

  • The blue line (the Alligator’s Jaw) - est la ligne d’équilibre pour la période qui a été utilisée pour créer un graphique (une moyenne mobile affinée de 13 périodes, décalée de 8 barres dans le futur) ;
  • The red line (the Alligator's Teeth) - est la ligne d’équilibre pour une période de temps significative, inférieure d'un ordre (moyenne mobile affinée de 8 périodes, décalée de 5 barres dans le futur) ;
  • The green line (Alligator's Lips) - est la ligne d’équilibre pour une période de temps significative, inférieure d'un autre ordre (moyenne mobile affinée de 5 périodes, décalée de 3 barres dans le futur).

Les lignes Lips, Teeth et Jaws de l'Alligator illustrent l'interaction de différentes périodes. Étant donné que les tendances du marché ne peuvent être identifiées que pour 15 à 30 % du temps, nous devons suivre les tendances et ne pas travailler sur des marchés qui ne fluctuent que dans certaines périodes de prix.

Si les Jaws, Teeth et Lips sont clos et entremêlés, l'Alligator s'endort ou dort déjà. Quand il dort, sa faim grandit - donc plus il dort, plus il aura faim au réveil. Lorsqu'il se réveille, la première chose qu'il fait est d'ouvrir sa bouche et commencer à bailler. Puis il commence à sentir l'odeur de la nourriture : viande de taureau ou d'ours, et commence sa chasse. Lorsque l'alligator satisfait sa faim, il perd toute notion du prix-nourriture (les lignes d'équilibre se rejoignent) - c'est le moment de fixer le bénéfice.

1.2. Fractals

Tous les marchés sont caractérisés par le fait que, la plupart du temps, les prix ne fluctuent pas beaucoup, et ce n'est que pendant une courte période (15 à 30 %) que des changements de tendance peuvent être observés. Les périodes les plus favorables à la génération de bénéfices sont celles où les prix du marché évoluent suivant une certaine tendance.

Fractals (Une fractale) - est l'un des 4 indicateurs du système commercial de Bill Williams, qui permet de détecter les différentes fluctuations. La définition technique d'une fractale haussière est une série d'au moins cinq barres successives, dans laquelle il y a deux barres, avant et après le maximum le plus élevé, qui ont des maximums inférieurs. La configuration opposée (série de cinq barres, dans laquelle le pré et post-minimum le plus bas a deux barres avec des minimums plus élevés) est une fractale baissière. Sur un graphique, les fractales ont les valeurs High et Low, et sont indiquées par des flèches vers le haut ou vers le bas.

Les signaux de l'indicateur technique Fractales doivent être filtrés, à l'aide de l'indicateur technique Alligator. En d'autres termes, il ne faut pas passer un ordre d'achat si une fractale est située en-dessous des dents de l'Alligator et il ne faut pas passer un ordre de vente si une fractale est située au-dessus des dents de l'Alligator. Une fois que le signal de la fractale est formé et est activé, ce qui est déterminé par sa position au-delà des mâchoires de l'Alligator, il demeure un signal jusqu'à ce qu'il soit touché ou jusqu'à ce qu'un signal fractal plus récent arrive.

1.3. L’AO (Awesome Oscillator)

L'indicateur technique Awesome Oscillator de Bill Williams (Awesome Oscillator, AO) - est une moyenne mobile simple de 34 périodes, construite par les points moyens des barres (H + L)/2, qui est soustraite de la moyenne mobile simple à 5 périodes et qui est construite par les points centraux des barres (H + L)/2. Il nous permet de savoir ce qui se passe en temps réel avec la force de pulsion du marché.

1.4. AO (Accelerator Oscillator)

Le prix est le dernier élément qui change. Avant que le prix ne change, la force de pulsion du marché change, et avant que la force de pulsion ne change de direction, l'accélération de la force de pulsion devrait ralentir et atteindre zéro. Ensuite, elle va accélérer jusqu'à ce que le prix change de direction.

L'indicateur technique d'accélération/décélération (Accelerator/Decelerator Oscillator, AC) mesure l'accélération et la décélération de la force de pulsion courante. Cet indicateur changera de direction avant que le changement de force de pulsion n'ait lieu et, à son tour, changera de direction avant que le changement de prix n'ait lieu. Le fait de comprendre que le courant alternatif est un signal d'avertissement précoce présente des avantages évidents.


2. Signaux

Le système de trading, décrit dans le livre "New Trading Dimensions" de B. Williams, utilise les signaux de cinq dimensions de trading.

  • La première dimension : surmonter la fractale au-delà des mâchoires de l'alligator ;
  • La deuxième dimension : les signaux de l'indicateur AO (Awesome Oscillator) ;
  • La troisième dimension : les signaux de l'indicateur AC (Accelerator Oscillator) ;
  • La quatrième dimension : le trade en zones ;
  • La cinquième dimension : le trade de la ligne d'équilibre.

En savoir plus sur les signaux de chaque dimension.


2.1. Description du trading par signaux de la première dimension

La fractale « A » (signal d'achat) est fausse, car la rupture de prix se produit en dessous de la ligne de la mâchoire de l'alligator. La fractale « B » est exécutée et nous avons une position courte ouverte. Avec l'apparition de la fractale « C », nous clôturons notre position courte, et avons déjà une position longue nette.

Avec la rupture de la fractale « D », nous passons à nouveau de la position d'achat à vente.  Surmontant la fractale « E » pour acheter, le Market nous dit une fois de plus que la position doit être modifiée de la vente à l'achat. Avec l'exécution des signaux des fractales « G » et « J », nous ajoutons un contrat supplémentaire à la position longue.

Figure 1. Un exemple de trade de signaux de la première dimension

Figure 1. Un exemple de trade de signaux de la première dimension

2.2. Description de trade par les signaux de la deuxième dimension

Deux types de signaux de la deuxième dimension ont été mis en œuvre. Il s'agit du croisement de ligne zéro de l'indicateur AO (Awesome Oscillator) avec le signal « Saucer ». Acceptons l'indexation des barres comme nous le faisons dans MetaTrader 5, c'est-à-dire sous forme de séries temporelles. La vérification du signal se fera sur la barre zéro.

Pour la formation d'un modèle de « croisement de ligne zéro », il doit y avoir deux barres de l'indicateur.

Le signal d'achat est formé lorsque la deuxième barre de l'indicateur est en dessous de la ligne zéro et la première barre est au-dessus de la ligne zéro. Le prix maximum de la première barre sera le signal, et s'il dépasse, l'ordre d'achat sera envoyé au serveur, en utilisant le cours du jour. Le signal de vente est formé dans le cas inverse du croisement.

Pour la formation d'un modèle « Saucer », il doit y avoir trois barres consécutives, et la seconde doit être une couleur rouge et au-dessus de la ligne zéro, tandis que la première doit être verte et supérieure à la seconde.  Le prix de signalisation sera le prix le plus élevé de la première barre, qui sera valable jusqu'à ce qu'elle soit supplantée par le cours du jour ou un nouveau signal d'achat soit formé.  Les signaux de vente du modèle « saucer » se forment de la même manière mais du côté opposé de l'indicateur.

Pour la formation d'un modèle « Saucer », il doit y avoir trois barres consécutives, et la seconde doit être de couleur rouge et au-dessus de la ligne zéro, tandis que la première doit être verte et plus haute que la seconde. Le prix de signalisation sera le prix le plus élevé de la première barre, qui sera valable jusqu'à ce qu'il soit supplanté par le cours du jour ou qu'un nouveau signal d'achat soit formé. Les signaux de vente du modèle « saucer » se forment de la même manière mais du côté opposé de l'indicateur.

Les signaux « Twin Peaks » et « Twin bottoms » ne sont pas pris en compte dans cet article et ne seront pas programmés dans l'EA du fait que leur formation se produit presque toujours du côté opposé de l'Alligator : le twin bottoms est en dessous des jaws line, et les twin bottoms sont au-dessus de cette ligne. Le trading sur de tels signaux contredit le système, c'est que pour ne pas nourrir l'Alligator, nous ne pouvons pas acheter en dessous des mâchoires, et nous ne pouvons pas vendre au-dessus des mâchoires de l'Alligator.

Pour une description plus détaillée des signaux, je vous encourage à consulter la source originale.

Figure 2. Un exemple de signaux de trading de la deuxième dimension

Figure 2. Un exemple de signaux de trading de la deuxième dimension


2.3. Description des signaux de trading de la troisième dimension

Dans la troisième dimension, il y a les signaux « acheter au-dessus de la ligne zéro » et « acheter en dessous de la ligne zéro », formés par l’indicateur AC (Oscillateur Accélérateur).

Tout d'abord, nous examinons le modèle spécifié dans la figure 3. La vérification est effectuée pour une barre zéro. Si la première barre est au-dessus de la ligne zéro (cas « A »), qui se compose de deux barres vertes et une barre rouge d'un histogramme. Pendant ce temps, la position des deuxième et troisième barres, par rapport à la ligne zéro, n'a pas d'importance.

Si la première barre est en dessous de la ligne zéro (cas « B »), alors nous aurons besoin de trois barres vertes et une rouge pour la formation d'un signal d'achat. Elle ne prend pas non plus en compte les barres restantes, par rapport à la ligne zéro. Les signaux de vente de la troisième dimension sont inversement analogues.

Pour une description plus détaillée et des exemples, reportez-vous à la source originale.

Figure 3. Exemple de trades des signaux de troisième dimension

Figure 3. Exemple de trades des signaux de troisième dimension


2.4. Description des signaux de trades de la quatrième dimension (« Zone Trading »)

La zone verte se forme lorsque deux indicateurs (AO+AC) sont verts pour une certaine barre.

La formation d'un signal de trading nécessite deux zones vertes consécutives, et le cours de clôture de la première barre doit être supérieur au cours de clôture de la deuxième barre.

L'exécution est mise en œuvre une fois qu'une nouvelle barre est ouverte. Dans l'original, l'exécution doit être l'ordre lors de la fermeture d'un bar. Il existe des situations où le dernier trait de la fermeture de la barre peut changer la couleur des barres AO ou AC, et si cela se produit, il s'avère que l'achat via le signal de la zone verte était faux. Pour ces raisons, j'ai profité de l'ouverture d'une nouvelle barre pour acheter.

De plus, dans la quatrième dimension, il y a un signal pour suivre un ordre stop pour la position longue.

Cela nécessite cinq zones vertes consécutives. La valeur minimale du prix de la première zone est utilisée pour définir un Stop Loss. Si l'ordre stop ne se déclenche pas sur la barre suivante (après sa fermeture), alors nous fixons le Stop Loss au prix minimum de la dernière barre complétée (devrait être supérieur à l'ordre stop) avec l'ouverture d'une nouvelle barre, sans tenir compte de la couleur de la zone sur la barre précédente.

Aussi, nous utilisons une limitation d'addition à la position longue ouverte par le nombre de zones vertes consécutives : B. Williams recommande 6 ou 8 zones. Après cela, il faudra attendre l'apparition d'une zone grise (c'est à ce moment-là que les couleurs des colonnes pour AO et AC sont différentes) ou de zones rouges, qui permettront à nouveau de remplir la position d’achat à partir de la zone verte.

Le signal de vente forme une « zone rouge » - une image miroir de la zone verte. La couleur de la zone affecte également le nombre de barres qui forment le signal du « trade sur la ligne d’équilibre » (cinquième dimension). Pour cette ligne, B. Williams a choisi les « dents » de l'Alligator.

Dans ce signal, je tiens à souligner que les prix OHLC de la barre zéro participent à la formation du signal.

Figure 4. Un exemple de trade des signaux de quatrième dimension

Figure 4. Un exemple de trades des signaux de quatrième dimension


2.5. Description des signaux de trades de la cinquième dimension

Le modèle « Acheter au-dessus de la ligne d’équilibre » (si la zone est verte) est formé par deux barres. Si le prix d'ouverture d'une barre zéro (également le prix le plus élevé de la barre à ce moment-là) est inférieur au dernier prix le plus élevé de la barre (on peut le trouver quelques barres en arrière), alors le prix maximum trouvé sera le prix pour ouvrir une position d'achat dans la zone verte.

Les zones rouges ou grises nécessitent un autre maximum, supérieur au prix pour entrer dans la zone verte. Dès que nous le trouvons (généralement moins de 10 barres en arrière et au-dessus des dents de l'alligator [je n'ai pas trouvé à combien de barres en arrière on doit mener la recherche pour un tel modèle dans le texte de l'auteur]), souvenez-vous-en comme prix pour entrer dans la zone rouge ou grise, dans la direction buy.

Pour ouvrir la position par le signal « acheter au-dessus de la ligne d'équilibre », nous vérifions le cours du jour dépassant le cours sur chaque nouvelle barre (pour les zones verte/rouge/grise).

Figure 5. Un exemple de trades des signaux de la cinquième dimension

Figure 5. Un exemple de trades des signaux de la cinquième dimension


3. La classe C_TS_BW

3.1. Objectif de la classe :
  • Si possible, utilisez les classes Bibliothèque Standard ;
  • De grandes quantités de « données similaires » doivent être stockées dans les structures ;
  • Personnaliser les paramètres ;
  • Obtenir le nombre requis de données calculées à partir des indicateurs d’analyse ;
  • Cas d’une nouvelle barre, veuillez vérifier les signaux des cinq dimensions de trades ;
  • Cas d'un nouveau trait, veuillez vérifier le signal d'ouverture d'une position ;
  • Calculer le lot, soit fixe, soit « pyramidal » (vous découvrirez cet algorithme dans la méthode CalcLot de cette classe) ;
  • Permettre un changement direct du lot de l'EA pour chaque type de signal. Mettre en œuvre le besoin personnalisé d'algorithmes de gestion de l'argent ;
  • Suivre un ordre stop de la position ouverte. Si nécessaire, modifier le prix du Stop Loss, calculé par l'utilisateur à partir de l'EA ;
  • Envoyer l'ordre sur le serveur de trading et faire une seconde requête en cas d'erreur ;
  • Interdire la duplication des signaux de trades (saisir une seule fois par signal) ;
  • Minimiser le nombre de méthodes de classe publique ;
3.2. La mise en œuvre de la classe C_TS_BW
  • ...Si possible, utiliser des classes et des méthodes de la bibliothèque Standard ;

Pour effectuer cette tâche, vous devez d'abord inclure les fichiers appropriés de la Bibliothèque standard.

Cette mise en œuvre s’effectue via le code ci-dessous.

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

Dans la section privée de la classe, déclarez les objets pour l'organisation des demandes de trading, obtenez les informations sur le symbole et la position ouverte, ainsi que l'accès à l'historique des ordres.

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
  • ... De grandes quantités de « données similaires » sont stockées dans les structures.

Cette classe utilise quatre structures, deux d'entre elles sont déclarées dans la section privée. Voici les structures :

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

Il existe également deux structures dans la section publique :

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

Les objets de ces types de structures :

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

Plus de détails sur le code des structures peuvent être trouvés dans le fichier d'en-tête joint.

  • ... personnaliser les paramètres ;

Cette tâche est mise en œuvre à l'aide de la méthode Init de la section publique. Paramètres d’appels de l'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

Dans cette méthode se produit également l'initialisation des indicateurs impliqués et l'organisation des tampons nécessaires pour en recevoir les données.

  • ... obtenir le nombre requis de données calculées à partir des indicateurs pour analyse ;

Cela peut être fait en utilisant la méthode CopyIndValue de la section privée, les paramètres

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

Selon le type de paramètre, les tampons de réception se substituent automatiquement aux données calculées, organisées en séries temporelles pour l'initialisation de la classe.

  • ... lors de l'ouverture d'une nouvelle barre ...

Une recherche de signaux ne sera effectuée qu'une seule fois après l'ouverture d'une nouvelle barre. Pour ce faire, il nous faut déterminer ce moment. La méthode NewBar fait cela, elle n'a pas de paramètres d'entrée et dans une situation où un trait reçu ouvre une nouvelle barre, elle revient comme true, sinon, elle revient comme false.

  • ... vérification des signaux dans cinq dimensions de trading ;

Pour chacune des dimensions de trading, j'ai commencé une méthode distincte. Les signaux de la première dimension sont vérifiés par FindSignal_1_dimension.

Appel des paramètres :

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

L'analyse de la deuxième dimension se fera par la méthode FindSignal_2_dimension. Appel des paramètres :

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

L'analyse de la troisième dimension se fait à l'aide de la méthode FindSignal_3_dimension avec des paramètres d'entrée/sortie :

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

Le traitement de la quatrième dimension se fait par la méthode FindSignal_4_dimension, avec des paramètres d'entrée/sortie :

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

Le suivi de la cinquième dimension s’effectue via FindSignal_5_dimension. Paramètres de cette méthode :

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

L'ensemble de la vérification est unifié par la méthode CheckSignal, elle n'a pas de paramètres d'entrée et contient :

  • Copie des données des indicateurs ;
  • Une vérification de la fermeture d'une position (si elle est utilisée) pour une ligne de l'Alligator ;
  • Remise à zéro des signaux de la barre précédente ;
  • Recherche de fractales actives dans les deux directions ;
  • En fonction de la disponibilité d'une position, recherchez les signaux de la deuxième à la cinquième dimension, en direction d'une position ouverte.

Cette méthode est déclarée dans la section publique, elle doit être appelée depuis l'EA.

  • …à l'arrivée d'un nouveau trait, vérifier la possibilité de déclenchement du signal d'ouverture de position ;

Dans cette classe, la méthode CheckForTradeSignal est mise en œuvre, ce qui exécute la recherche des possibilités d’entrée d’une position par le taux du jour.

Appel des paramètres :

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

Si toutes les régulations pour l'activation d'un signal sont suivies, alors true nous est retourné, sinon - false.

La vérification des capacités de traitement de l'ensemble des signaux est combinée par la méthode CheckActionOnTick, annoncée dans la section publique et qui doit être appelée depuis l'EA. Il n'y a pas de paramètres pour appels. Chaque signal réussi est stocké dans l'objet actual_action, ils seront ensuite traités dans la méthode TradeActualSignals.

  • … calculer le lot ; soit fixe, soit « pyramide »

La méthode CalcLot est déclarée dans la section publique et peut être appelée depuis l'EA. Elle est destinée au calcul du lot et à la modification ultérieure de la variable Lot, déclarée dans la partie privée de la classe. Appel des paramètres :

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

Maintenant que nous avons considéré le lot fixe, parlons plus du lot « pyramidal ».

Soit le lot de départ égal à 0,1. Par exemple, ouvert par le lot de départ pour le signal de la fractale, en dehors des mâchoires de l'Alligator, la position totale sera de 0,1 lot. Après quoi, nous commençons à analyser les signaux entrants de la deuxième aux cinq dimensions. Dès que le signal est déclenché, remplissez la position ouverte par 0,5 lot (en commençant, multiplié par 5), et obtenez le volume total de la position en 0,6 lot. Lors du prochain signal en direction de la position ouverte, remplissez-la par 0,4 lot, et la position totale sera égale à 1,0 lot.

Le prochain signal en direction de la position nous donnera 0,3 lot supplémentaire et son volume sera de 1,3 lot. Le cinquième remplissage sera effectué pour 0,2 lot, et le volume total de la position donnera 1,5 lot. Les remplissages suivants dans la direction de la position ne se produiront que par 0,1 lot.

Cet algorithme de gestion de l'argent (ММ) a été décrit par B. Williams dans le Chaos de trading. La possibilité d'installation d'un lot utilisateur nous permet de mettre en œuvre pratiquement n'importe quelle gestion du capital.

Pour une détermination correcte de la séquence des ordres dans une transaction, j'utilise différents Magic Numbers.

Chiffre

Description de l’ordre

999

Ordre de retournement

1000

Ordre de départ

1001

Ordre de remplissage (à partir de Х 1)

1002

Ordre de remplissage (à partir de Х 2)

1003

Ordre de remplissage (à partir de Х 3)

1004

Ordre de remplissage (à partir de Х 4)

1005

Ordre de remplissage (à partir de Х 5)


La classe a calculé le nombre nécessaire (en utilisant la méthode CalcMagic), qui plus tard identifiera l'opération de trading sur le serveur avant l'envoi d'un nouvel ordre.

  • …Permet un changement direct du lot de l'EA, pour chaque type de signal.

Si vous le souhaitez, vous pouvez implémenter dans l'EA une requête de la structure actual_action, dans laquelle les signaux de trading sont stockés sous forme de variables booléennes. A chaque type et direction correspond une variable. Si nous avons la valeur true, alors pour ce trait, la classe essaiera de produire une opération de trading via le signal de trading spécifié, après quoi le lot peut être modifié pour ce signal. Pour chaque trait du changement de prix, la classe envoie un seul ordre pour la position ouverte ou un remplissage.

Le paramétrage d'un lot est possible dans l'EA après l'appel de la méthode CheckActionOnTick et avant l’appel des TradeActualSignals. Comme sur le trait en cours, il peut y avoir plusieurs signaux en attente d'exécution, mais un seul sera sélectionné.

La séquence d'exécution du signal :

  • Fermeture de la position ;
  • Exécution d'un des signaux de la fractale (ouverture, remplissage, renversement de position) ;
  • Le signal « Saucer » ;
  • Le signal « Zero line crossover » ;
  • AC « two equally-colored bars » ;
  • AC « three equally-colored bars » ;
  • Trade en zones ;
  • La ligne d’équilibre (signal à 2 barres) ;
  • La ligne d’équilibre (signal à 3 barres) ;

Il est donc nécessaire de considérer cette séquence lors de l'installation de la taille de lot « utilisateur ».

  • ... Trailing Stop de la position ouverte. Si nécessaire, modifier le prix Stop Loss, calculé par l'utilisateur à partir de l'EA.

Dans la classe décrite, il y a maintien du prix stop en position, par la méthode Trailing Stop, c'est-à-dire l’ascension Stop Loss, uniquement dans le sens d'accroissement de bénéfices en position pour le déclenchement à ce prix. Il existe cinq modèles pour ce maintien :

  • Via la ligne Alligator's Lips ;
  • Via la ligne Alligator's Teeth ;
  • Via la ligne Alligator’s Jaws ;
  • Via cinq zones consécutives de même couleur (zones vertes pour acheter, rouges pour vendre) ;
  • Paramétrage externe du prix stop.

La cinquième option de l'installation d'un Stop Loss est mise en œuvre par la méthode SetStopLoss, avec un seul paramètre double & stoploss. L'appel doit être effectué depuis l'EA et avant l'exécution de la méthode TrailingStop, qui vérifie les prix de modification de la position, et envoie la requête au serveur. Après une exécution réussie de cette procédure, la valeur de la variable interne StopLoss est remise à -1.

  • ...Contrôler l'envoi de l'ordre de l'ouverture de transactions au serveur, et en cas d'échec, envoyer une deuxième demande.

Pour l'envoi d'un ordre de trading d'ouverture, de clôture ou de retournement d'une position, la méthode boolSendOrder est utilisée. Les paramètres d'appel :

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

Le test de tous les signaux de trading est combiné par la méthode TradeActualSignals. La structure actual_action stocke les ordres de trading. Après l'envoi réussi de l'ordre au serveur (SendOrder renvoie true), réinitialiser le signal de trading dans la structure actual_action. Le signal de trading sera actif jusqu'à ce que nous obtenions une réponse positive à l'envoi.

Il existe également une fonction dans la structure actual_action init , sans paramètres, qui réinitialise tous les signaux actuels. Cette procédure est utilisée lors de l'ouverture d'une nouvelle position ou d'un retournement de la position existante.

  • ...Interdire la duplication des signaux de trades (entrer une seule fois pour chaque signal) ;

La structure last_trade stocke l'heure du dernier signal de trading pour chaque type et direction. Avant de définir un ordre de trading dans la structure actual_action, vérifiez si ce signal se négocie déjà dans la structure last_trade, et si c'est le cas, ignorez-le. Ainsi, cela permet la mise en place d'un contrôle de l'exécution « supprimable » d'une situation de trading.

  • Minimisez le nombre de méthodes de classe publique.

Voici une liste des méthodes de classe disponibles en appelant dans l'EA :

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

Les structures suivantes sont également disponibles :

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. La mise en œuvre de l'EA, en utilisant la classe C_TS_BW

La première chose à faire est d'inclure le fichier h_TS_BW.mqh dans l'Expert Advisor.

#include <h_TS_BW.mqh>

Après cela, déclarez l'objet de la classe C_TS_BW. Peu importe que ce soit le EA_TS_BW.

Vous aurez également besoin de la structure des paramètres réglables tels que s_input_parametrs, par exemple, input_parametrs.

Voici une description des paramètres, incorporés dans cette structure :

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

Dans la sectionOnlnit() de l'EA, vous devez :

  • Remplir toutes les valeurs requises de la structure input_parametrs avec des données qui seront ensuite transmises à la classe.
  • En utilisant la méthode Init de la classe, effectuez son initialisation. Exemple :
expert_TS_BW.Init(Symbol(),PERIOD_CURRENT,input_parametrs)

Dans ce cas, l'EA fonctionnera sur le symbole/la période actuelle où il est installé.

Exemple de la section OnTick() de l'Expert Advisor :

//   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

Dans ce cas, il est commenté les exemples de contrôle externe du prix stop et du lot de trading, pour l'exécution de la classe.


5. Quelques tests sur l'historique

L'auteur du livre, sur la base duquel l'EA a été écrit, soutient que ce système est axé sur les marchés des changes et des matières premières.

Tout d'abord, vérifions l'Expert Advisor sur le CFD. Supposons que le polygone de test fasse partie de l'historique d'IBM. Le système est destiné aux segments de tendances des cotations. J'ai pris le premier segment disponible, sur lequel une tendance se voit à l'œil nu.

Figure 6. Graphique IBM

Figure 6. graphique IBM

Exécutez l'Expert Advisor écrit sur ce segment et voici ce que nous obtenons comme ordres.

Figure 7. Les signaux de trading de Bill Williams (IBM)

Figure 7. Les signaux de trading de Bill Williams (IBM)

À première vue, il existe de nombreux trades par tendances, ce qui n’est pas mal. Voici le graphique, créé par le Testeur de stratégie.

La transaction a été effectuée sur 0,1 lot, sans clôture par les lignes Alligator, sans trailing stop utilisant les cinq zones consécutives d'une même couleur et sans trading agressif (en cascades).

Figure 8. Résultats des tests

Figure 8. Résultats de test

En général, nous avons obtenu des bénéfices.

Prenons maintenant une tendance prolongée de moindre inclinaison.

Figure 9. Graphique IBM (fragment 2)

Figure 9. Graphique IBM (fragment 2)

Peu importe que ce soit le même symbole et la même période de 13 mois (de 2008,12 à 2010,01)

Voici un graphique du Testeur de stratégie :

Figure 10. Résultats de test du système sur l'historique (fragment 2)

Figure 10. Les résultats de test du système sur l'historique (fragment 2)

Disons simplement que ce n'est « pas satisfaisant » ou « n'a pas répondu à nos attentes ».

Ensuite, je voudrais vérifier le travail sur les paires de devises.

Prenons la paire EURUSD bien connue et la période H1 du graphique. La profondeur de l'historique est l'année 2010.

Figure 11. Résultats de test du système sur l'historique, EURUSD, S1, 2010

Figure 11. Les résultats de test du système sur l'historique, EURUSD, S1, 2010

Essayons-le sur les barres quotidiennes de l'EURUSD pour la même année (2010).

Le rapport du testeur ressemble à ceci :

Figure 12. Résultats de test du système sur l'historique, EURUSD, D1, 2010

Figure 12. Les résultats de test du système sur l'historique, EURUSD, D1, 2010


Conclusion

Le but de cet article était de vérifier la performance de l'une de célèbres stratégies de trading de Bill Williams, non seulement sur les marchés des changes et les bourses de matières premières, mais aussi sur le marché Forex. Le système fonctionne « plus ou moins » sur les graphiques journaliers EURUSD de l'année écoulée, mais n'apporte aucun profit sur des délais plus courts, sans efforts d'optimisation.

Les signaux d'entrée sur le marché du système sont assez précis (si l'on regarde les graphiques journaliers), mais les sorties souffrent nettement de retard, vu que plus de la moitié du bénéfice n'est pas fixée. Ce champ est destiné au raffinement du système donné en termes d'optimisation pour des délais plus courts.

Le code complet de la classe se trouve dans le fichier joint.


Traduit du russe par MetaQuotes Ltd.
Article original : https://www.mql5.com/ru/articles/139

Fichiers joints |
h_ts_bw.mqh (57.84 KB)
Systèmes de trading adaptatifs et leur utilisation dans le terminal client MetaTrader 5 Systèmes de trading adaptatifs et leur utilisation dans le terminal client MetaTrader 5
Cet article suggère une variante d’un système adaptatif qui se compose de nombreuses stratégies, chacune effectuant ses propres opérations de trading « virtuelles ». Le trading réel est effectué en fonction de signaux de la plus rentable stratégie du moment. Grâce à l’utilisation de l’approche orientée objet, des classes de travail avec des données et des classes de trading de la bibliothèque Standard, l’architecture du système est apparue simple et évolutive ; vous pouvez désormais facilement créer et analyser les systèmes adaptatifs qui incluent des centaines de stratégies de trading.
Évaluation des systèmes de trading - l’efficacité d’ouverture, de clôture et de trades en général Évaluation des systèmes de trading - l’efficacité d’ouverture, de clôture et de trades en général
Il existe de nombreuses mesures qui permettent de déterminer l’efficacité et la rentabilité d’un système de trading. Cependant, les traders sont toujours prêts à soumettre n’importe quel système à un nouveau crash test. L’article explique comment les statistiques basées sur des mesures d’efficacité peuvent être utilisées pour la plateforme MetaTrader 5. Il contient la classe pour la transformation de l’interprétation des statistiques par les transactions à celle qui ne contredit pas la description donnée dans le livre de S.V. « Statistika dlya traderov » (« Statistiques destinées aux traders »). Bulashev. Il contient également un exemple de fonction personnalisée pour optimisation.
Guide de test et d'optimisation des Expert Advisors en MQL5 Guide de test et d'optimisation des Expert Advisors en MQL5
Cet article explique le processus étape par étape d'identification et de résolution des erreurs de code ainsi que les étapes de test et d'optimisation des paramètres d'entrée de l'Expert Advisor. Vous apprendrez à utiliser le Testeur de stratégie du terminal client MetaTrader 5 pour trouver le meilleur symbole et le meilleur ensemble de paramètres d'entrée pour votre Expert Advisor.
Plusieurs modes de recherche de tendance dans MQL5 Plusieurs modes de recherche de tendance dans MQL5
Tout trader ferait tout ce qui est en son pouvoir pour réussir à détecter avec précision une tendance à un moment donné. C’est peut-être sans doute cela le Saint-Graal que tout le monde recherche. Dans cet article, nous examinerons plusieurs modes de détection de tendance. Pour être plus précis - comment programmer plusieurs modes classiques pour détecter une tendance au moyen de MQL5.