English Русский 中文 Español Deutsch 日本語 Português 한국어 Italiano Türkçe
Élevez vos systèmes de trading linéaires au rang de puissance

Élevez vos systèmes de trading linéaires au rang de puissance

MetaTrader 5Systèmes de trading | 13 janvier 2022, 11:00
209 0
laplacianlab
[Supprimé]

Introduction

L'article d'aujourd'hui montre aux programmeurs MQL5 intermédiaires comment ils peuvent tirer plus de bénéfice de leurs systèmes de trading linéaire (Fixed Lot) en implémentant facilement la technique dite de l'exponentiation. Le terme général d'exponentiation est utilisé ici pour désigner les modèles de gestion monétaire qui adaptent la taille ou le nombre des positions placées sur le marché en fonction du risque que l'on prend. En effet, la croissance de la courbe d'équité qui en résulte est alors géométrique, ou exponentielle, prenant la forme d'une parabole. Le terme "linéaire" est également utilisé dans le présent contexte qui est à mi-chemin entre le mathématique et la programmation. Plus précisément, nous mettrons en œuvre une variante pratique MQL5 du dimensionnement de la position fractionnée fixe développée par Ralph Vince.

Figure 1. Parabole mathématique


Figure 1. Parabole mathématique

Faisons maintenant un bref résumé des modèles de gestion de l'argent et voyons comment nous pouvons implémenter une variante du dimensionnement de la position fractionnée fixe de Ralph Vince. Êtes-vous prêt ? Ne manquez pas l'opportunité d'obtenir beaucoup plus de vos stratégies de trading !


1. Quels sont les modèles de gestion de l'argent ?

En un mot, les modèles de gestion de l'argent sont les cadres conceptuels dans lesquels vous prenez des décisions concernant la taille de vos positions, l'utilisation de vos stop loss, vos calculs de marge et vos coûts de trading. Il existe de nombreux modèles de gestion de l'argent ! Si vous le souhaitez, vous pouvez rechercher sur Google un lot fixe, une fraction fixe, un rapport fixe, un pourcentage de Kelly ou un coût effectif pour approfondir vos connaissances sur ces cadres classiques. Comme je l'ai dit, cet article ne couvre qu'une variante de fraction fixe.


1.2. Fraction fixe

L'idée derrière ce modèle de gestion de l'argent est de dimensionner les opérations en fonction du risque estimé qui leur est associé. Le risque est la même fraction du net sur chaque trade. 

L'équation du nombre de contrats en dimensionnement de la position fractionnée fixe est la suivante :



N = f * Équité / Risque de trading

N est le nombre de contrats, f est la fraction fixe (un nombre entre 0 et 1), Équité est la valeur actuelle d’équité du compte et Risque de trading est le risque de trading par contrat pour lequel le nombre de contrats est calculé . Veuillez lire l'article Dimensionnement de la position fractionnée fixe écrit par Michael R. Bryant pour en savoir plus sur ce modèle.

Une propriété intéressante du modèle de Fraction Fixe est que puisque la taille des opérations est maintenue proportionnelle au solde net du compte, il est théoriquement impossible de perdre tout votre capital. Le risque de ruine est nul. D'autre part, comme les pourcentages de capital-risque sont plus faibles, une série d'opérations gagnantes ou perdantes n'a pas un impact dramatique sur la courbe de bénéfices.


2. Ajouter des fractions fixes à votre système de trading


2.1. Prenez votre système de trading linéaire

Bien sûr, tout d'abord, vous avez besoin d'un système de trading linéaire pour expérimenter la puissance exponentielle à faible risque ! Ce système servira de base de pouvoir, pour ainsi dire. Par système linéaire, j'entends un système de trading qui s'avère gagnant pendant un certain temps et dont la courbe des capitaux propres ressemble à une ligne droite. Par exemple, HawaiianTsunamiSurfer est un système de trading linéaire disponible dans Code Base. Sa courbe d'équité ressemble à une ligne droite de janvier 2012 à mars 2012.

Figure 2. Courbe d'équité d’HawaiianTsunamiSurfer de janvier 2012 à mars 2012

Figure 2. Courbe d'équité d’HawaiianTsunamiSurfer de janvier 2012 à mars 2012

Le but de cet article n'est pas de développer un système de trading linéaire à partir de zéro, mais de vous donner les outils nécessaires pour que vous puissiez tirer le meilleur parti de vos systèmes. Donc, à partir de maintenant, je suppose que vous avez déjà développé un système de trading comme celui-ci sous le paradigme orienté objet. Dans ce cas, vous devez ajouter la pièce OO, que j'explique ci-dessous.

2.2. CEvolution, la classe Core MQL5 pour élever votre système à la puissance

Donc, encore une fois, nous adoptons l'approche orientée objet pour coder notre EA. Je vous recommande de lire d'abord les articles Another MQL5 OOP class et Building an Automatic News Trader pour obtenir les bases techniques permettant de travailler de cette manière OO. Si vous l'avez déjà fait, gardez à l'esprit que les conceptions décrites dans ces articles intègrent un élément très important nommé CEvolution. Cela nous permet de garder une trace de certaines informations temporelles importantes telles que l'état du robot à un moment donné, l'historique des opérations effectuées, etc.

Cette fois nous allons coder dans CEvolution la logique nécessaire à la gestion de notre argent. Comme la fraction fixe risquée reste proportionnelle à l'équité, dans laquelle nous convenons tous qu'elle n'est pas constante, mais variable, cette logique doit être codée dans CEvolution. Ou simplement, comme la pente de la courbe d'équité évolue avec le temps, c'est dans CEvolution que tout cela doit être mis en œuvre. C'est l'idée abstraite de notre conception orientée objet. C'est un exercice pour vous d'intégrer la classe OO suivante avec votre système de trading de style orienté objet.

Classe CEvolution.mqh :

//+------------------------------------------------------------------+
//|                                                   CEvolution.mqh |
//|                               Copyright © 2013, Jordi Bassagañas |
//+------------------------------------------------------------------+
#include <Mine\Enums.mqh>
//+------------------------------------------------------------------+
//| CEvolution Class                                                 |
//+------------------------------------------------------------------+
class CEvolution
  {
protected:
   ENUM_STATUS_EA                   m_status;            // The current EA's status
   ENUM_EXP_EQUITY_CURVE_LEVEL      m_expEquityLevel;    // The current exponential equity level
   double                           m_originalEquity;    // The original equity value
   double                           m_lotSize;           // The current lot size

public:
   //--- Constructor and destructor methods
                                    CEvolution(ENUM_STATUS_EA status,ENUM_EXP_EQUITY_CURVE_LEVEL exp_equity_level);
                                    ~CEvolution(void);
   //--- Getter methods
   ENUM_STATUS_EA                   GetStatus(void);
   ENUM_EXP_EQUITY_CURVE_LEVEL      GetExpEquityLevel(void);
   double                           GetOriginalEquity(void);
   double                           GetLotSize(void);
   //--- Setter methods
   void                             SetStatus(ENUM_STATUS_EA status);
   void                             SetExpEquityLevel(ENUM_EXP_EQUITY_CURVE_LEVEL exp_equity_level);
   void                             SetOriginalEquity(double equity);
   void                             SetLotSize(double size);
   //--- CEvolution specific methods
   double                           CalcEquityGrowth(double currentEquity);
   void                             RefreshExpEquityLevel(double currentEquity);
   void                             RefreshLotSize();
  };
//+------------------------------------------------------------------+
//| Constructor                                                      |
//+------------------------------------------------------------------+
CEvolution::CEvolution(ENUM_STATUS_EA status,ENUM_EXP_EQUITY_CURVE_LEVEL exp_equity_level)
  {
   m_status=status;
   m_expEquityLevel=exp_equity_level;
   RefreshLotSize();
   m_originalEquity=AccountInfoDouble(ACCOUNT_EQUITY);
  }
//+------------------------------------------------------------------+
//| Destructor                                                       |
//+------------------------------------------------------------------+
CEvolution::~CEvolution(void)
  {
  }
//+------------------------------------------------------------------+
//| GetStatus                                                        |
//+------------------------------------------------------------------+
ENUM_STATUS_EA CEvolution::GetStatus(void)
  {
   return m_status;
  }
//+------------------------------------------------------------------+
//| GetExpEquityLevel                                                |
//+------------------------------------------------------------------+
ENUM_EXP_EQUITY_CURVE_LEVEL CEvolution::GetExpEquityLevel(void)
  {
   return m_expEquityLevel;
  }
//+------------------------------------------------------------------+
//| GetEquity                                                        |
//+------------------------------------------------------------------+
double CEvolution::GetOriginalEquity(void)
  {
   return m_originalEquity;
  }
//+------------------------------------------------------------------+
//| GetLotSize                                                       |
//+------------------------------------------------------------------+
double CEvolution::GetLotSize(void)
  {
   return m_lotSize;
  }
//+------------------------------------------------------------------+
//| SetStatus                                                        |
//+------------------------------------------------------------------+
void CEvolution::SetStatus(ENUM_STATUS_EA status)
  {
   m_status=status;
  }
//+------------------------------------------------------------------+
//| SetExpEquityLevel                                                |
//+------------------------------------------------------------------+
void CEvolution::SetExpEquityLevel(ENUM_EXP_EQUITY_CURVE_LEVEL exp_equity_level)
  {
   m_expEquityLevel=exp_equity_level;
  }
//+------------------------------------------------------------------+
//| SetEquity                                                        |
//+------------------------------------------------------------------+
void CEvolution::SetOriginalEquity(double equity)
  {
   m_originalEquity=equity;
  }
//+------------------------------------------------------------------+
//| SetLotSize                                                       |
//+------------------------------------------------------------------+
void CEvolution::SetLotSize(double lot_size)
  {
   m_lotSize=lot_size;
  }
//+------------------------------------------------------------------+
//| CalcEquityGrowth                                                 |
//+------------------------------------------------------------------+
double CEvolution::CalcEquityGrowth(double currentEquity)
  {
   return NormalizeDouble(currentEquity * 100 / m_originalEquity - 100,2);
  }
//+------------------------------------------------------------------+
//| RefreshExpEquityLevel                                            |
//+------------------------------------------------------------------+
void CEvolution::RefreshExpEquityLevel(double currentEquity)
  {
   double growth = CalcEquityGrowth(currentEquity);
   //--- is the current equity less than 10% of the original amount?
   if(growth <= 10)
   {
      SetExpEquityLevel(LEVEL_ONE);
   }
   //--- is the current equity more than 10% of the original amount and less than 20%?
   else if(growth > 10 && growth <= 20)
   {
      SetExpEquityLevel(LEVEL_TWO);
   }
   //--- is the current equity more than 20% of the original amount and less than 30%?
   else if(growth > 20 && growth <= 30)
   {
      SetExpEquityLevel(LEVEL_THREE);
   }
   //--- is the current equity more than 30% of the original amount and less than 40%?
   else if(growth > 30 && growth <= 40)
   {
      SetExpEquityLevel(LEVEL_FOUR);
   }
   //--- is the current equity more than 40% of the original amount and less than 50%?
   else if(growth > 40 && growth <= 50)
   {
      SetExpEquityLevel(LEVEL_FIVE);
   }
   //--- is the current equity more than 50% of the original amount and less than 60%?
   else if(growth > 50 && growth <= 60)
   {
      SetExpEquityLevel(LEVEL_SEVEN);
   }
   //--- is the current equity more than 60% of the original amount and less than 70%?   
   else if(growth > 60 && growth <= 70)
   {
      SetExpEquityLevel(LEVEL_EIGHT);
   }
   //--- is the current equity more than 70% of the original amount and less than 80%?   
   else if(growth > 70 && growth <= 80)
   {
      SetExpEquityLevel(LEVEL_NINE);
   }
   //--- is the current equity more than 90% of the original amount?
   else if(growth > 90)
   {
      SetExpEquityLevel(LEVEL_TEN);
   }
  }
//+------------------------------------------------------------------+
//| RefreshLotSize                                                   |
//+------------------------------------------------------------------+
void CEvolution::RefreshLotSize()
  {
   switch(m_expEquityLevel)
   {
      case LEVEL_ONE:
         SetLotSize(0.01);
         break;
         
      case LEVEL_TWO:
         SetLotSize(0.02);
         break;
         
      case LEVEL_THREE:
         SetLotSize(0.03);
         break;
         
      case LEVEL_FOUR:
         SetLotSize(0.04);
         break;
         
      case LEVEL_FIVE:
         SetLotSize(0.05);
         break;
         
      case LEVEL_SIX:
         SetLotSize(0.06);
         break;
         
      case LEVEL_SEVEN:
         SetLotSize(0.07);
         break;

      case LEVEL_EIGHT:
         SetLotSize(0.08);
         break;
         
      case LEVEL_NINE:
         SetLotSize(0.09);
         break;
         
      case LEVEL_TEN:
         SetLotSize(0.1);
         break;
   }
  }
//+------------------------------------------------------------------+

Commentons maintenant quelques parties importantes de cette classe ! 

Lorsque l'Expert Advisor est créé, la valeur de la courbe d'équité d'origine est stockée dans m_originalEquity :

//+------------------------------------------------------------------+
//| Constructor                                                      |
//+------------------------------------------------------------------+
CEvolution::CEvolution(ENUM_STATUS_EA status,ENUM_EXP_EQUITY_CURVE_LEVEL exp_equity_level)
  {
   m_status=status;
   m_expEquityLevel=exp_equity_level;
   RefreshLotSize();
   m_originalEquity=AccountInfoDouble(ACCOUNT_EQUITY);
  }

La méthode CEvolution::CalcEquityGrowth permet de calculer la croissance de la courbe d'équité, toujours par rapport à sa valeur d'origine :

//+------------------------------------------------------------------+
//| CalcEquityGrowth                                                 |
//+------------------------------------------------------------------+
double CEvolution::CalcEquityGrowth(double currentEquity)
  {
   return NormalizeDouble(currentEquity * 100 / m_originalEquity - 100,2);
  }

Enfin, CEvolution::RefreshExpEquityLevel sert à actualiser le niveau d'équité à chaque tick (observez comment cela dépend absolument de la croissance d'équité) et CEvolution::RefreshLotSize sert à actualiser la taille du lot à chaque tick. En effet, vous êtes censé actualiser ces informations dans la méthode OnTick de votre EA de cette façon :

GetEvolution().RefreshExpEquityLevel(AccountInfoDouble(ACCOUNT_EQUITY));
GetEvolution().RefreshLotSize();

Soit dit en passant, cette solution nécessite l'utilisation de l'énumération MQL5 personnalisée suivante :

//+------------------------------------------------------------------+
//| Exponential equity curve level enumeration                       |
//+------------------------------------------------------------------+
enum ENUM_EXP_EQUITY_CURVE_LEVEL
  {
   LEVEL_ONE,
   LEVEL_TWO,
   LEVEL_THREE,
   LEVEL_FOUR,
   LEVEL_FIVE,
   LEVEL_SIX,
   LEVEL_SEVEN,
   LEVEL_EIGHT,
   LEVEL_NINE,
   LEVEL_TEN
  };
On dit que cette implémentation est une variante de Fraction Fixe car en effet elle introduit quelques spécificités. Par exemple, la courbe d'équité croîtra de façon exponentielle jusqu'à atteindre le soi-disant niveau dix, par la suite le système deviendra linéaire. Néanmoins, CEvolution retient l'idée de base d'augmenter constamment la taille des positions proportionnellement à la courbe d'équité.

2.3. Prendre vos décisions en matière de fraction fixe

Avec tout ce qui précède, vous pouvez déjà prendre vos décisions de gestion de l'argent en fonction de l'état actuel de votre robot.

Quelque part dans la méthode OnTick de votre EA :

switch(GetEvolution().GetStatus())
     {
      case BUY:

         tp = ask + m_takeProfit * _Point;
         sl = bid - m_stopLoss * _Point;

         GetTrade().PositionOpen(GetBrain().GetSymbol(),ORDER_TYPE_BUY,m_evolution.GetLotSize(),ask,sl,tp);
         
         break;

      case SELL:

         sl = ask + m_takeProfit * _Point;
         tp = bid - m_stopLoss * _Point;

         GetTrade().PositionOpen(GetBrain().GetSymbol(),ORDER_TYPE_SELL,m_evolution.GetLotSize(),bid,sl,tp);
         
         break;

      case DO_NOTHING:

         // Nothing...

         break;
     }

J'ai renommé mon nouveau système exponentiel en ExponentialHawaiian.


3. Backtesting de votre système exponentiel

Une fois que vous avez ajouté la logique OO expliquée ci-dessus à votre système, n'oubliez pas de lancer vos tests ! Maintenant, je teste ExponentialHawaiian, la variante de fraction fixe de HawaiianTsunamiSurfer :

Figure 3. Courbe d'équité d’ExponentialHawaiiande janvier 2012 à mars 2012

Figure 3. Courbe d'équité d’ExponentialHawaiiande janvier 2012 à mars 2012

La courbe ci-dessus restera exponentielle tandis que le système sous-jacent restera linéaire. Lorsque cette condition n'est plus vraie, le système devient instable avec un risque théorique de ruine.


Conclusion

Aujourd'hui, nous avons appris à tirer davantage des bénéfices de nos systèmes de trading linéaire, ceux qui mettent en œuvre un modèle de gestion de l'argent à lot fixe, en les élevant à la puissance de l'exponentiation.

Nous avons commencé par présenter quelques modèles classiques de money management (Lot Fixe, Fraction Fixe, Ratio fixe, Pourcentage de Kelly, Coût effectif) et avons décidé de nous concentrer sur le modèle de Fraction Fixe, un modèle simple dans lequel la taille des opérations est maintenue proportionnelle au solde net du compte. Enfin, nous avons pris un système de trading affichant des résultats linéaires pendant une période de temps, nous avons implémenté dans MQL5 une variante de Fraction Fixe et montré les résultats lancés par le Strategy Tester de MetaTrader.

Une fois de plus, nous avons adopté l'approche orientée objet pour coder nos Expert Advisors. Il est fortement recommandé de lire d'abord les articles Another MQL5 OOP class et Building an Automatic News Trader pour obtenir les bases techniques permettant de travailler de cette manière OO.

Traduit de l’anglais par MetaQuotes Ltd.
Article original : https://www.mql5.com/en/articles/734

Fichiers joints |
cevolution.mqh (8.35 KB)
Indicateurs techniques et filtres numériques Indicateurs techniques et filtres numériques
Dans cet article, les indicateurs techniques sont traités comme des filtres numériques. Les principes de fonctionnement et les caractéristiques de base des filtres numériques sont expliqués. En outre, certains moyens pratiques de recevoir le noyau de filtre dans le terminal MetaTrader 5 et l'intégration avec un analyseur de spectre prêt à l'emploi proposé dans l'article "Création d’un analyseur de spectre" sont considérés. Les caractéristiques d'impulsion et de spectre des filtres numériques typiques sont utilisées comme exemples.
Émerveillez vos clients MQL5 avec un cocktail de technologies utilisables ! Émerveillez vos clients MQL5 avec un cocktail de technologies utilisables !
MQL5 fournit aux programmeurs un ensemble très complet de fonctions et d'API orientées objet grâce auxquelles ils peuvent faire tout ce qu'ils veulent dans l'environnement MetaTrader. Cependant, la technologie Web est un outil extrêmement polyvalent de nos jours qui peut venir à la rescousse dans certaines situations lorsque vous devez faire quelque chose de très spécifique, voulez émerveiller vos clients avec quelque chose de différent ou tout simplement vous n'avez pas assez de temps pour maîtriser une partie spécifique de Bibliothèque standard MT5. L'exercice d'aujourd'hui vous présente un exemple pratique sur la façon dont vous pouvez gérer votre temps de développement tout en créant un cocktail technologique incroyable.
Les bases de la programmation MQL5 : Listes Les bases de la programmation MQL5 : Listes
La nouvelle version du langage de programmation pour le développement de stratégies de trading, MQL [MQL5], offre des fonctionnalités plus puissantes et efficaces par rapport à la version précédente [MQL4]. L'avantage réside essentiellement dans les fonctionnalités de programmation orientée objet. Cet article examine la possibilité d'utiliser des types de données personnalisés complexes, tels que des nœuds et des listes. Il fournit également un exemple d'utilisation des listes dans la programmation pratique en MQL5.
Le MQL5 Wizard : Comment apprendre à un EA à ouvrir des ordres en attente à n’importe quel prix Le MQL5 Wizard : Comment apprendre à un EA à ouvrir des ordres en attente à n’importe quel prix
L’article décrit une méthode de modification du code d’un module de signal de trading pour la mise en œuvre de la fonctionnalité vous permettant de définir des ordres en attente à n’importe quelle distance du prix actuel : il peut s’agir du prix close ou open de la barre précédente ou de la valeur de la moyenne mobile. Il y a beaucoup d’options. Il est important que vous puissiez définir n’importe quel prix d’ouverture pour un ordre en attente. Cet article sera utile aux traders qui tradent avec des ordres en attente.