Calcul de la valeur d'un pip

 

Bonjour bonsoir tout le monde,

Je débute en MQL5 (je regrette déjà Python haha) et j'aimerais obtenir de l'aide sur un point spécifique du code de mon EA à savoir la calcul de la taille des lots. Je sais bien que ce paramètre se calcule avec la formule suivante : lotSize = (accountBalance * risk) / SL (en pips) / pipValue

Jusque là tout va bien, j'arrive à récupérer les valeurs dont j'ai besoin et à positionner mon SL. Cependant ça se complique au niveau de pipValue. J'aimerais trouver une formule ou un snippet me permettant de le calculer pour un compte en euros (et non en $) et qui prend en compte les particularités des paires incluant le JPY et les métaux (XAU et XAG).

Si vous avez quelques minutes pour m'aider, je vous en serai reconnaissant ! J'ai déjà épluché Google et les différents sujets déjà ouverts sur ce forum, je ne trouve rien qui ne corresponde à mon cas.

Merci d'avance !

 
SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE)
Utiliser la valeur d'un tick ne vous convient pas ? A utiliser en corrélation avec TICK_SIZE, au lieu d'un concept mal défini comme "pip".
 
Alain Verleyen #:
Utiliser la valeur d'un tick ne vous convient pas ? A utiliser en corrélation avec TICK_SIZE, au lieu d'un concept mal défini comme "pip".
Merci pour votre réponse, mais je ne vois pas comment cette info me permettrait de calculer une taille de lot ? Vous avez une formule reliant les deux données à me donner ?

Merci d'avance 
 
Alain Verleyen #:
Utiliser la valeur d'un tick ne vous convient pas ? A utiliser en corrélation avec TICK_SIZE, au lieu d'un concept mal défini comme "pip".

J'ai pris en compte votre proposition, je suis arrivé à un code qui fonctionne pour les paires classiques comme l'AUDUSD. Cependant le problème se pose pour les paires particulières comme les métaux ou celles incluant le JPY. Des propositions ?

double calculateLotSize() {
   double tickSize = SymbolInfoDouble(Symbol(), SYMBOL_TRADE_TICK_SIZE);
   double tickValue = SymbolInfoDouble(Symbol(), SYMBOL_TRADE_TICK_VALUE);
   double lotStep = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_STEP);
   
   if (tickSize == 0 || tickValue == 0 || lotStep == 0) {
      return false;
   }
   
   double riskMoney = AccountInfoDouble(ACCOUNT_BALANCE) * risk;
   double moneyLotStep = (SL * 0.0001 / tickSize) * tickValue * lotStep;
   
   if (moneyLotStep == 0) {
      return false;
   }
   
   double lotSize = MathFloor(riskMoney / moneyLotStep) * lotStep;
   
   if (lotSize < SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MIN)) {
      lotSize = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MIN);
   } else if (lotSize > SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MAX)) {
      lotSize = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MAX);
   }
         
   return lotSize;
}

Les dernières conditions me permettent de réajuster les tailles de lot si jamais les lots calculés sont trop petits ou trop grands par rapport aux tailles de lot max/mini

 
pool-dev #:

J'ai pris en compte votre proposition, je suis arrivé à un code qui fonctionne pour les paires classiques comme l'AUDUSD. Cependant le problème se pose pour les paires particulières comme les métaux ou celles incluant le JPY. Des propositions ?

Les dernières conditions me permettent de réajuster les tailles de lot si jamais les lots calculés sont trop petits ou trop grands par rapport aux tailles de lot max/mini

Ok je suppose que votre SL est en pips, quelque chose comme SL=100 (pips) équivalent à 0.0100 (100*0.0001) en "prix" pour AUDUSD. Le problème de votre code est l'utilisation de la constante "0.0001", elle ne fonctionne pas pour les paires en JPY ou les métaux (qu'est-ce qu'un pip pour la quotation d'un métal ? Il vous faut donc définir un "pip" pour tous les cas de figures, par exemple :

double pip          = SymbolInfoInteger(Symbol(),SYMBOL_DIGITS) <= 3 ? 0.01 : 0.0001;
double moneyLotStep = (SL * pip / tickSize) * tickValue * lotStep;
 
Alain Verleyen #:

Ok je suppose que votre SL est en pips, quelque chose comme SL=100 (pips) équivalent à 0.0100 (100*0.0001) en "prix" pour AUDUSD. Le problème de votre code est l'utilisation de la constante "0.0001", elle ne fonctionne pas pour les paires en JPY ou les métaux (qu'est-ce qu'un pip pour la quotation d'un métal ? Il vous faut donc définir un "pip" pour tous les cas de figures, par exemple :

Merci pour votre aide, ça fonctionne correctement pour les paires incluant le JPY. En revanche pour une paire de métaux comme le XAUUSD, le code renvoie une taille de lot de 20.2, contre un lot de 2.22 attendu après calcul sur une calculatrice de lots (myfxbook). Vous avez une idée pour corriger cela ?
 
pool-dev #:
Merci pour votre aide, ça fonctionne correctement pour les paires incluant le JPY. En revanche pour une paire de métaux comme le XAUUSD, le code renvoie une taille de lot de 20.2, contre un lot de 2.22 attendu après calcul sur une calculatrice de lots (myfxbook). Vous avez une idée pour corriger cela ?

C'est le problème d'un concept aussi vague qu'un pip. Qu'est-ce qu'un pip pour XAUUSD ?

Ajustez votre valeur de "pip" pour XAUUSD en conséequence.

 
Alain Verleyen #:

C'est le problème d'un concept aussi vague qu'un pip. Qu'est-ce qu'un pip pour XAUUSD ?

Ajustez votre valeur de "pip" pour XAUUSD en conséequence.

Pour le gold c'est vrai qu'on parle pas vraiment en pips c'est plus pour le forex, ce que j'appelle pip en gold c'est 1 point donc 0.01 sur le graphique. J'imagine que je dois considérer 0.01 comme valeur pour la variable pip pour le gold si j'ai bien compris ?
 
pool-dev #:
Pour le gold c'est vrai qu'on parle pas vraiment en pips c'est plus pour le forex, ce que j'appelle pip en gold c'est 1 point donc 0.01 sur le graphique. J'imagine que je dois considérer 0.01 comme valeur pour la variable pip pour le gold si j'ai bien compris ?

Impossible pour moi de répondre car tout dépend des paramètres de XAUUSD chez votre courtier.

Si vous n'arrivez pas, postez les valeurs de tick value et tick size pour XAUUSD, ainsi que ce que vous obtenez comme résultats.

 
Alain Verleyen #:

Impossible pour moi de répondre car tout dépend des paramètres de XAUUSD chez votre courtier.

Si vous n'arrivez pas, postez les valeurs de tick value et tick size pour XAUUSD, ainsi que ce que vous obtenez comme résultats.

Pour le gold :

Ticksize : 0.01

Tickvalue : 0.1

Comment allez-vous calculer la valeur que vous allez me donner ? Cela m'intéresse pour généraliser le système à toutes les devises

 
pool-dev #:

Pour le gold :

Ticksize : 0.01

Tickvalue : 0.1

Comment allez-vous calculer la valeur que vous allez me donner ? Cela m'intéresse pour généraliser le système à toutes les devises

Cette valeur pour "Tickvalue"  de 0.1 semble incorrecte. Cela devrait être 1, et ça explique pourquoi vous obtenez une valeur 10 fois trop grande pour l'or. Malheureusement il arrive que certains courtiers ne configurent pas correctement les paramètres pour certains symboles Non-Forex.

Si votre code doit fonctionner avec ce courtier seulement je vous suggère de "tricher" un peu en adaptant la formule pour le pip avec XAUUSD:

double pip          = Symbol()=="XAUUSD" || Symbol()=="XAGUSD" ? 0.1 : SymbolInfoInteger(Symbol(),SYMBOL_DIGITS) <= 3 ? 0.01 : 0.0001;

Sinon si vous voulez faire les choses dans les règles de l'art il y a d'autres méthodes pour calculer le volume requis.

Raison: