Questions des débutants MQL5 MT5 MetaTrader 5 - page 1415

 
  1. Aujourd'hui, chez la plupart des courtiers, il n'y a plus d'appels de marge, car avant qu'un compte ne devienne négatif (et qu'il faille injecter de l'argent : l'appel de marge), toutes les positions sont fermées (automatiquement ?).
  2. La marge est le montant qui est considéré comme un gage pour une position ouverte, ACCOUNT_MARGIN_FREE est alors le reste (partie non utilisée).
  3. Il faut utiliser au maximum entre 5% et 10% du solde du compte (balance) ou du capital (solde du compte + positions ouvertes, equity) pour le trading, afin d'éviter que les positions ne soient fermées par manque de capital et par perte dans les positions.
  4. Le risque d'une position dépend du SL et de la taille du lot, le SL étant généralement fixé pour des raisons techniques, la taille du lot est utilisée pour calculer le risque :
    Cherche (l'anglais apporte plus) "calculate lotsize" : https://www.mql5.com/en/search#!keyword=calculate%20lotsize&module=mql5_module_forum
  5. Astuce la plupart des articles existent aussi en allemand, il suffit de remplacer dans l'URL le /en/ par /fr/ : https://www.mql5.com/de/articles/2555
 
Merci pour ces informations. Dans The checks a trading robot must pass, on cite une méthode "CheckMoneyForTrade" qui vérifie si la marge à dépenser pour le trade est supérieure à la marge libre (ACCOUNT_FREE_MARGIN). Si je t'ai bien compris, il faut en plus vérifier si les fonds dépensés dépassent aussi un certain pourcentage du solde du compte, quelque chose comme
 if (freeMargin - tradeMargin < balance * 0.9) return false;

Où l'on peut bien sûr modifier le 0.9 en (1 - maxRisk) et implémenter une propriété "Risque maximal en %" paramétrable par l'utilisateur.

P.S. Vouvons-nous utiliser le vouvoiement ou le tutoiement sur le forum ?
 
Benjamin Fotteler #:
Merci pour ces informations. Dans The checks a trading robot must pass, on cite une méthode "CheckMoneyForTrade" qui vérifie si la marge à dépenser pour le trade est supérieure à la marge libre (ACCOUNT_FREE_MARGIN). Si je t'ai bien compris, il faut en plus vérifier si les fonds dépensés dépassent un certain pourcentage du solde du compte, c'est-à-dire quelque chose comme :

Où l'on peut bien sûr modifier le 0.9 en (1 - maxRisk) et implémenter une propriété "Risque maximal en %" paramétrable par l'utilisateur.

P.S. Vouvons-nous utiliser le vouvoiement ou le tutoiement sur ce forum ?

Tout le monde tombe sur la taille des lots et il y a beaucoup de codes et de commentaires ici !

J'ai rassemblé pour MT5 ce que William Roeder a écrit, ce serait la fonction non testée ( !!):
(https://www.mql5.com/en/forum/133792/page3#comment_3405179 & https://www.mql5.com/en/forum/390088#comment_28092477).

double lotsz (double risk, double sl, ENUM_ORDER_TYPE ordDir, string sym="", double CommissionPerLot=0) {
   MqlTick mqTick;
   if (sym == "") sym = _Symbol;
   double deltaValue = SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_VALUE) / SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_SIZE);
   SymbolInfoTick(sym,mqTick); 
   double diff = (ordDir==ORDER_TYPE_BUY) ? mqTick.ask - sl : ( (ordDir==ORDER_TYPE_SELL) ? sl - mqTick.bid : -1.0 );
   if (diff<0.0) return(0.0);
   double lts = ( (AccountInfoDouble(ACCOUNT_MARGIN_FREE) * risk/100) / (diff * deltaValue + CommissionPerLot) );
   return( fmin(fmax(SymbolInfoDouble(sym,SYMBOL_VOLUME_MIN),lts),SymbolInfoDouble(sym,SYMBOL_VOLUME_MAX)));
}
// use: lotsz(5, sl)

Dis-nous si tu trouves une erreur !

Comme la plupart des gens ici sont en quelque sorte anonymes avec leurs surnoms ou leurs prénoms, et que c'était encore plus le cas auparavant, le tutoiement est devenu une habitude.

Why is there NO Complete EA within the Code-Base? - When does the market close or open?
Why is there NO Complete EA within the Code-Base? - When does the market close or open?
  • 2011.08.20
  • www.mql5.com
I wanted to close all orders before end of the week (market close friday,) to prevent loss should the market gap over the week end, by passing the sl. ) so the question is when does the market close (or open. For example info on opened charts and history data, time info (like gmt, timezone, dst), market open, close info
 

Merci pour le code. Il ne manquait que l'adaptation à une taille intermédiaire de lot valide :

double lotsz (double risk, double sl, ENUM_ORDER_TYPE ordDir, string sym="", double CommissionPerLot=0) {
   MqlTick mqTick;
   if (sym == "") sym = _Symbol;
   double deltaValue = SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_VALUE) / SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_SIZE);
   SymbolInfoTick(sym,mqTick); 
   double diff = (ordDir==ORDER_TYPE_BUY) ? mqTick.ask - sl : ( (ordDir==ORDER_TYPE_SELL) ? sl - mqTick.bid : -1.0 );
   if (diff<0.0) return(0.0);
   double lts = ( (AccountInfoDouble(ACCOUNT_MARGIN_FREE) * risk/100) / (diff * deltaValue + CommissionPerLot) );
   lts = ( fmin(fmax(SymbolInfoDouble(sym,SYMBOL_VOLUME_MIN),lts),SymbolInfoDouble(sym,SYMBOL_VOLUME_MAX)));
   double stepSize = SymbolInfoDouble(sym, SYMBOL_VOLUME_STEP);
   return ((int)MathRound(lts/stepSize)*stepSize);
}
// use: lotsz(5, sl)

J'ai encore une question à ce sujet : si je calcule la perte d'une transaction fermée avec TICK_VALUE ou justement avec deltaValue comme ci-dessus, le résultat est toujours légèrement différent de celui du calcul interne de MQL5 :

double price=(ordDir==ORDER_TYPE_BUY) ? mqTick.ask : ((ordDir==ORDER_TYPE_SELL) ? mqTick.bid : mqTick.last);
double loss;
OrderCalcProfit(ordDir, sym, 1, price, sl, loss)

Est-ce parce que la perte/le gain par tick est différent pour un compte en EUR et pour le cours de bourse 1,0 et le cours de bourse 1,2 ? En effet, si je saisis par exemple "prix + 0,1" au lieu de "price" et "sl + 0,1" au lieu de "sl" dans le code inférieur, l'écart entre les ticks (diff) est le même, mais les résultats donnés par OrderCalcProfit sont différents. Et si je regarde les gains/pertes que j'obtiens sur les trades manuels, il me semble que ce dernier point est confirmé.

Si j'ai raison, le code suivant serait plus précis :

double lotsz (double risk, double entry, double sl, ENUM_ORDER_TYPE ordDir, string sym="", double CommissionPerLot=0) {
   if (sym == "") sym = _Symbol;
   double loss;
   OrderCalcProfit(ordDir, sym, 1, entry, sl, loss);
   double lts = ((AccountInfoDouble(ACCOUNT_MARGIN_FREE) * risk * 0.01) / -loss);
   lts = (fmin(fmax(SymbolInfoDouble(sym, SYMBOL_VOLUME_MIN), lts), SymbolInfoDouble(sym, SYMBOL_VOLUME_MAX)));
   double stepSize = SymbolInfoDouble(sym, SYMBOL_VOLUME_STEP);
   return ((int)MathRound(lts / stepSize) * stepSize);
}
// use: lotsz(5, ask, sl)
P.S. Merci encore pour l'idée de base : lier le facteur de risque non pas à la balance, mais à la marge libre, est clairement judicieux.
 

Le code suivant a été créé selon le sar parabolique expert de mql 5. Il est possible d'inverser le fonctionnement du signal d'achat et du signal de vente ici, c'est à dire que lorsque le signal d'achat arrive, je veux qu'il ouvre les ventes au lieu d'acheter.




#property copyright "Copyright 2022, MetaQuotes Ltd."

#property link"https://www.mql5.com"

#property version "1.00"

//+------------------------------------------------------------------+

//| Inclure |

//+------------------------------------------------------------------+

#include <Expert\Expert.mqh>

//--- signaux disponibles

#include <Expert\Signal\SignalSAR.mqh>

//--- Trails disponibles

#include <Expert\Trailing\TrailingNone.mqh>

//--- gestion de l'argent disponible

#include <Expert\Money\Money\MoneyFixedLot.mqh>

//+------------------------------------------------------------------+

//| Inputs |

//+------------------------------------------------------------------+

//--- entrées pour l'expert

input string Expert_Title = "sar" ; // Nom du document

ulong Expert_MagicNumber =13831 ; //

bool Expert_EveryTick =false ; //

//--- entrées pour le signal principal

input int Signal_ThresholdOpen =10 ; // Valeur du seuil du signal à ouvrir [0...100]

input int Signal_ThresholdClose=10 ; // Valeur seuil du signal pour fermer [0...100]

input double Signal_PriceLevel =0.0 ; // Niveau de prix pour exécuter une transaction

input int Signal_Expiration =4 ; // Expiration des ordres en attente (en barres)

input double Signal_SAR_Step =0.02 ; // Incrément de vitesse du SAR parabolique(0.02,0.2)

input double Signal_SAR_Maximum =0.2 ; // Parabolique SAR(0.02,0.2) Taux maximum

input double Signal_SAR_Weight =1.0 ; // Parabolique SAR(0.02,0.2) Poids [0....1.0]

//--- entrées pour l'argent

input double Money_FixLot_Percent =10.0 ; // Pourcentage

input double Money_FixLot_Lots =0.1 ; // Volume fixe

//+------------------------------------------------------------------+

//| Objet expert global

//+------------------------------------------------------------------+

CExpert ExtExpert ;

//+------------------------------------------------------------------+

//| Fonction d'initialisation de l'expert

//+------------------------------------------------------------------+

int OnInit()

{

//--- Initialisation de l'expert

if(!ExtExpert.Init(Symbol(),Period(),Expert_EveryTick,Expert_MagicNumber)))

{

//----- a échoué

printf(__FUNCTION__+" : error initialising expert") ;

ExtExpert.Deinit() ;

return(INIT_FAILED) ;

}

//--- Création du signal

CExpertSignal *signal=new CExpertSignal ;

if(signal==NULL)

{

//----- a échoué

printf(__FUNCTION__+" : error creating signal") ;

ExtExpert.Deinit() ;

return(INIT_FAILED) ;

}

//---

ExtExpert.InitSignal(signal) ;

signal.ThresholdOpen(Signal_ThresholdOpen) ;

signal.ThresholdClose(Signal_ThresholdClose) ;

signal.PriceLevel(Signal_PriceLevel) ;

signal.Expiration(Signal_Expiration) ;

//--- Création du filtre CSignalSAR

CSignalSAR *filter0=nouveau CSignalSAR ;

if(filter0==NULL)

{

//----- a échoué

printf(__FUNCTION__+" : error creating filter0") ;

ExtExpert.Deinit() ;

return(INIT_FAILED) ;

}

signal.AddFilter(filter0) ;

//--- Définition des paramètres du filtre

filter0.Step(Signal_SAR_Step) ;

filter0.Maximum(Signal_SAR_Maximum) ;

filter0.Weight(Signal_SAR_Weight) ;

//--- Création de l'objet de suivi

CTrailingNone *trailing=new CTrailingNone ;

if(trailing==NULL)

{

//----- a échoué

printf(__FUNCTION__+" : error creating trailing") ;

ExtExpert.Deinit() ;

return(INIT_FAILED) ;

}

//--- Ajouter un suivi à l'expert (sera supprimé automatiquement))

if(!ExtExpert.InitTrailing(trailing))

{

//----- a échoué

printf(__FUNCTION__+" : error initialising trailing") ;

ExtExpert.Deinit() ;

return(INIT_FAILED) ;

}

//--- Définition des paramètres de suivi

//--- Création d'un objet monétaire

CMoneyFixedLot *money=nouveau CMoneyFixedLot ;

if(money==NULL)

{

//----- a échoué

printf(__FUNCTION__+" : error creating money") ;

ExtExpert.Deinit() ;

return(INIT_FAILED) ;

}

//--- Ajouter de l'argent à l'expert (sera supprimé automatiquement))

if(!ExtExpert.InitMoney(money))

{

//----- a échoué

printf(__FUNCTION__+" : error initialising money") ;

ExtExpert.Deinit() ;

return(INIT_FAILED) ;

}

//--- Définir les paramètres de l'argent

argent.Pourcentage(Argent_FixLot_Pourcentage) ;

money.Lots(Money_FixLot_Lots) ;

//--- Vérifier les paramètres de tous les objets de trading

if(!ExtExpert.ValidationSettings())

{

//----- a échoué

ExtExpert.Deinit() ;

return(INIT_FAILED) ;

}

//--- Réglage de tous les indicateurs nécessaires

if(!ExtExpert.InitIndicators())

{

//----- a échoué

printf(__FUNCTION__+" : error initialising indicators") ;

ExtExpert.Deinit() ;

return(INIT_FAILED) ;

}

//--- ok

return(INIT_SUCCEEDED) ;

}

//+------------------------------------------------------------------+

//| Fonction de désinitialisation de l'expert |

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

{

ExtExpert.Deinit() ;

}

//+------------------------------------------------------------------+

//| Fonction de gestion de l'événement "Tick".

//+------------------------------------------------------------------+

void OnTick()

{

ExtExpert.OnTick() ;

}

//+------------------------------------------------------------------+

//| Fonction de gestion de l'événement "Trade".

//+------------------------------------------------------------------+

void OnTrade()

{

ExtExpert.OnTrade() ;

}

//+------------------------------------------------------------------+

//| Fonction de gestion de l'événement "Timer".

//+------------------------------------------------------------------+

void OnTimer()

{

ExtExpert.OnTimer() ;

}

//+------------------------------------------------------------------+


 
C'est une proposition intéressante, je vais l'étudier. La fonction OrderCalcProfit() n'existe que dans MT5 et les idées de calcul de lots datent de l'époque de MT4...
 
Je ne peux pas ouvrir ma session dans l'application pour voir combien d'argent j'ai.
 

J'ai eu le temps d'étudier ta solution. Elle est plus précise (alors que l'autre est plus prudente, car elle tient compte de la commission ?) et elle est apparemment moins sujette aux erreurs, comme on peut le voir avec l'or et l'argent du compte de démonstration chez MQ - avec Roboforex, comme on pouvait s'y attendre, c'est un peu plus prudent que ta solution :

MetaQuotes demo account (b. 3369 Beta channel)
2022.07.25 17:43:42.645 test_MM-functions (EURUSD,M1)   XAUUSD  in: 1717.65000 sl:1717.15000  diff:0.50000  delta:10.00000  delta:*diff:5.00000  tVal:0.10000  tSz:0.01000
2022.07.25 17:43:42.645 test_MM-functions (EURUSD,M1)   XAGUSD  in: 18.45100 sl:18.40100  diff:0.05000  delta:500.00000  delta:*diff:25.00000  tVal:0.50000  tSz:0.00100
2022.07.25 17:43:42.645 test_MM-functions (EURUSD,M1)   EURUSD  in: 1.02185 sl:1.02235  diff:0.00050  delta:97861.72139  delta:*diff:48.93086  tVal:0.97862  tSz:0.00001
2022.07.25 17:43:42.645 test_MM-functions (EURUSD,M1)   Set: Risk: 5.0 %, dSL: 50  Com/Lot: 2.00  Free: 9983.40 EUR:  XAUUSD  BU  in: 1717.65000  sl: 1717.15000  lotsC: 71.3100 (-3489.26)  lotsB: 10.2000 (-499.09)
2022.07.25 17:43:42.645 test_MM-functions (EURUSD,M1)   Set: Risk: 5.0 %, dSL: 50  Com/Lot: 2.00  Free: 9983.40 EUR:  XAGUSD  BU  in: 18.45100  sl: 18.40100  lotsC: 18.4900 (-4523.66)  lotsB: 2.0400 (-499.09)
2022.07.25 17:43:42.645 test_MM-functions (EURUSD,M1)   Set: Risk: 5.0 %, dSL: 50  Com/Lot: 2.00  Free: 9983.40 EUR:  EURUSD  SE  in: 1.02185  sl: 1.02235  lotsC: 9.8000 (-479.29)  lotsB: 10.2100 (-499.34)


RoboForex Demo account (b. 3320 release channel)
2022.07.25 17:46:22.772 test_MM-functions (EURUSD,D1)   XAUUSD  in: 1717.10000 sl:1717.15000  diff:0.05000  delta:100.00000  delta:*diff:5.00000  tVal:0.10000  tSz:0.00100
2022.07.25 17:46:22.772 test_MM-functions (EURUSD,D1)   XAGUSD  in: 18.43400 sl:18.43350  diff:0.00050  delta:5000.00000  delta:*diff:2.50000  tVal:0.05000  tSz:0.00001
2022.07.25 17:46:22.772 test_MM-functions (EURUSD,D1)   EURUSD  in: 1.02186 sl:1.02236  diff:0.00050  delta:100000.00000  delta:*diff:50.00000  tVal:1.00000  tSz:0.00001
2022.07.25 17:46:22.773 test_MM-functions (EURUSD,D1)   Set: Risk: 5.0 %, dSL: 50  Com/Lot: 2.00  Free: 5348.69 USD:  XAUUSD  SE  in: 1717.10000  sl: 1717.15000  lotsC: 38.2000 (-191.00)  lotsB: 53.4900 (-267.45)
2022.07.25 17:46:22.773 test_MM-functions (EURUSD,D1)   Set: Risk: 5.0 %, dSL: 50  Com/Lot: 2.00  Free: 5348.69 USD:  XAGUSD  BU  in: 18.43400  sl: 18.43350  lotsC: 59.4300 (-148.57)  lotsB: 106.9700 (-267.42)
2022.07.25 17:46:22.773 test_MM-functions (EURUSD,D1)   Set: Risk: 5.0 %, dSL: 50  Com/Lot: 2.00  Free: 5348.69 USD:  EURUSD  SE  in: 1.02186  sl: 1.02236  lotsC: 5.1400 (-257.00)  lotsB: 5.3500 (-267.50)

Sur le compte MQ, les tailles de lots seraient beaucoup trop élevées.

Voici mon script pour comparer les deux méthodes :

//+------------------------------------------------------------------+
//|                                            test_MM-functions.mq5 |
//|                                                            Calli |
//|                              https://www.mql5.com/de/users/gooly |
//+------------------------------------------------------------------+
#property copyright "Calli"
#property link      "https://www.mql5.com/de/users/gooly"
#property version   "1.00"
#property script_show_inputs
//--- input parameters
input double   risk_perCent   = 5.0;   // risk of capital in % on free_margin
input double   diff_sl        = 50;    // diff sl in points from entry
input double   CommPerLot     = 2.00;  

string Com = "",Syms[] = {"XAUUSD", "XAGUSD", "EURUSD" }; //,"AUDUSD","GBPCHF","GBPUSD", "EURCAD", "USDCAD", "USDRUB", "GBPJPY", "USDJPY"};

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
#define  forEach(TYPE, VAR, ARRAY) \
                TYPE VAR=NULL; \
                for(int i##VAR=0;  i##VAR<ArraySize(ARRAY)&&((VAR=ARRAY[i##VAR])!=NULL||true);  i##VAR++)

void OnStart()
  {
//---
   MqlTick mqTick;
   forEach(string, sym, Syms){
      
      double pnt = SymbolInfoDouble(sym,SYMBOL_POINT);
      ENUM_ORDER_TYPE ord = GetMicrosecondCount()%2==0 ? ORDER_TYPE_BUY : ORDER_TYPE_SELL; // randomly buy or sell
      SymbolInfoTick(sym,mqTick); 
      double entry = (ord==ORDER_TYPE_BUY) ? mqTick.ask : mqTick.bid,
             sl    = (ord==ORDER_TYPE_BUY) ? entry - diff_sl*pnt : entry + diff_sl*pnt,
             lossC = 0.0, lossB = 0.0,
             lotsC = lotszC(risk_perCent, entry, sl, sym, CommPerLot), 
             lotsB = lotszB(risk_perCent, entry, sl, sym, CommPerLot);
      
      if (!OrderCalcProfit(ord, sym, lotsC, entry, sl, lossC) ) 
         Print("chk OrderCalcProfit(",EnumToString(ord),", ",sym,", lot: ",lotsC,", in: ",DoubleToString(entry,6),", out: ",DoubleToString(sl,6),", lossC) => err: ",_LastError," lossC: ",lossC);
             
      if (!OrderCalcProfit(ord, sym, lotsB, entry, sl, lossB) ) 
         Print("chk OrderCalcProfit(",EnumToString(ord),", ",sym,", lot: ",lotsC,", in: ",DoubleToString(entry,6),", out: ",DoubleToString(sl,6),", lossC) => err: ",_LastError," lossC: ",lossC);
             
      string res = StringFormat("Set: Risk: %.1f %%, dSL: %.0f  Com/Lot: %.2f  Free: %.2f %s:  %s  %s  in: %.5f  sl: %.5f  lotsC: %.4f (%+.2f)  lotsB: %.4f (%+.2f)",
                                 risk_perCent, diff_sl, CommPerLot,
                                 AccountInfoDouble(ACCOUNT_MARGIN_FREE),AccountInfoString(ACCOUNT_CURRENCY),
                                 sym, (ord==ORDER_TYPE_BUY ? "BU" : "SE"), entry, sl, lotsC, lossC, lotsB, lossB );
      Com = Com + res+"\n";
   }
   Comment(Com);
   //Print(Com);
  }
//+------------------------------------------------------------------+
double lotszC (double risk, double entry, double sl, string sym="", double CommissionPerLot=0) {
   if (sym == "") sym = _Symbol;
   double deltaValue = SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_VALUE) / SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_SIZE);
   ENUM_ORDER_TYPE ordDir = entry > sl ? ORDER_TYPE_BUY : ORDER_TYPE_SELL;
   double diff = fabs (entry - sl); 
   Print(sym,"  in: ",DoubleToString(entry,5)," sl:",DoubleToString(sl,5),"  diff:",DoubleToString(diff,5),
         "  delta:",DoubleToString(deltaValue,5),"  delta:*diff:",DoubleToString(deltaValue*diff,5),
         "  tVal:",DoubleToString(SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_VALUE),5),"  tSz:",
         DoubleToString(SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_SIZE),5));
   double lts = ( (AccountInfoDouble(ACCOUNT_MARGIN_FREE) * risk/100) / (diff * deltaValue + CommissionPerLot) );
   lts = ( fmin(fmax(SymbolInfoDouble(sym,SYMBOL_VOLUME_MIN),lts),SymbolInfoDouble(sym,SYMBOL_VOLUME_MAX)));
   double stepSize = SymbolInfoDouble(sym, SYMBOL_VOLUME_STEP);
   return (MathRound(lts/stepSize)*stepSize);
}

double lotszB (double risk, double entry, double sl, string sym="", double CommissionPerLot=0) {
   if (sym == "") sym = _Symbol;
   ENUM_ORDER_TYPE ordDir = entry > sl ? ORDER_TYPE_BUY : ORDER_TYPE_SELL;
   double loss;
   if (!OrderCalcProfit(ordDir, sym, 1, entry, sl, loss)) return(-1.0);
   double lts = ((AccountInfoDouble(ACCOUNT_MARGIN_FREE) * risk * 0.01) / -loss);
   lts = (fmin(fmax(SymbolInfoDouble(sym, SYMBOL_VOLUME_MIN), lts), SymbolInfoDouble(sym, SYMBOL_VOLUME_MAX)));
   double stepSize = SymbolInfoDouble(sym, SYMBOL_VOLUME_STEP);
   return (MathRound(lts / stepSize) * stepSize);
}

J'ai déduit la direction de in > sl (buy) ou in < sl (sell). Il n'y aurait alors aucun problème avec les ordres en attente (pending orders).

 

Merci pour tes tests. Oui, si on compare les résultats, on voit d'une part la constance de OrderCalcProfit et d'autre part, au moins pour l'EURUSD et RoboForex, que les résultats diffèrent à peu près de "taille du lot * CommissionPerLot". Cela pourrait encore être intégré :

if (!OrderCalcProfit(ordDir, sym, 1, entry, sl, loss)) return(-1.0);
double lts = ((AccountInfoDouble(ACCOUNT_MARGIN_FREE) * risk * 0.01) / (-loss + CommissionPerLot);
Si j'ai bien utilisé la recherche sur le forum, il n'y a pas de possibilité d'obtenir la valeur "CommissionPerLot" directement à l'aide de MQL5, n'est-ce pas ?
 
Benjamin Fotteler #:


Si j'ai bien utilisé la recherche sur le forum, il n'y a pas de possibilité de demander la valeur "CommissionPerLot" directement à l'aide de MQL5, n'est-ce pas ?

Oui, pas directement dans le terminal, mais demander au broker ou dans l'historique des transactions : DEAL_COMMISSION.

Dokumentation zu MQL5: Konstanten, Enumerationen und Strukturen / Handelskonstanten / Eigenschaften der Deals
Dokumentation zu MQL5: Konstanten, Enumerationen und Strukturen / Handelskonstanten / Eigenschaften der Deals
  • www.mql5.com
Eigenschaften der Deals - Handelskonstanten - Konstanten, Enumerationen und Strukturen - Nachschlagewerk MQL5 - Nachschlagewerk über die Sprache des algothitmischen/automatischen Handels für MetaTrader 5