conseiller expert - questions diverses - page 3

 
double LotCalculator(double lots)
  {
   double minlot  = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN),
          maxlot  = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX),
          lotstep = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
   lots = MathFloor(lots/lotstep)*lotstep;
   lots = MathMax(lots,minlot);
   lots = MathMin(lots,maxlot);
   return(NormalizeDouble(lots,2));
  }
 
honest_knave:
double LotCalculator(double lots){}

Merci beaucoup.

Je veux juste commencer à écrire ce code :)

Vous m'avez sauvé plusieurs fois.

Un grand merci !

 
J'ai reçu le même message pour la taille du lot.
J'appelle "LotCalculator()" dans "OnChartEvent()", n'est-ce pas correct ?
 

Je cherche un bon forum pour le calcul de'MarketInfo & LotSize'.
Si vous connaissez ce type de forum , veuillez m'en faire part.

Merci.

 
Auriez-vous par hasard utilisé mon extrait de code avant que je ne modifie la dernière ligne (NormalizeDouble) ? Je vois qu'il n'y a eu que 3 minutes entre mon message et le vôtre, et je l'ai modifié presque immédiatement.
 
Max Enrik: J'utilise NormalizeDouble pour mes EA. Mais je m'inquiète du message'NormalizeDouble', mais je vois la taille du lot sur le graphique comme ceci : 0.07

J'ai donc besoin de bons conseils, s'il vous plaît.

02:00:00.069 - custom expert EURUSD,H1: | _lotSize - NormalizeDouble: 0.07000000000000001
02:00:00.069 - custom expert EURUSD,H1: | _lotSize - DoubleToString : 0.07
  1. NormalizeDouble renvoie un double. La virgule flottante a un nombre infini de décimales, c'est que vous ne comprenez pas la virgule flottante et que certains nombres ne peuvent pas être représentés exactement. (comme 1/10.) Format de virgule flottante à double précision - Wikipedia, the free encyclopedia Voir aussi L'opérande ==. - Forum MQL4
  2. N'utilisez PAS NormalizeDouble, JAMAIS. Pour quelque raison que ce soit. C'est un gadget, ne l'utilisez pas. Son utilisation est toujours mauvaise.
 
whroeder1:
  1. N'utilisez PASNormalizeDouble, JAMAIS. Pour quelque raison que ce soit. C'est un gadget, ne l'utilisez pas.Il est toujours mal utilisé.

Je pense que vous avez toujours besoin de NormalizeDouble().

Voici un exemple, utilisant votre extrait de code (la même chose s'applique à mon exemple utilisant MathFloor) :

double NormalizeLots(double lots, string pair=""){
    if (pair == "") pair = Symbol();
    double  lotStep     = MarketInfo(pair, MODE_LOTSTEP),
            minLot      = MarketInfo(pair, MODE_MINLOT);
    lots                = MathRound(lots/lotStep) * lotStep;
    if (lots < minLot) lots = 0;    // or minLot
    return(lots);
}

Appelé :

Print(NormalizeLots(2/3.0));

Résultat :

0.7000000000000001

Maintenant le code est ajusté :

double NormalizeLots(double lots, string pair=""){
    if (pair == "") pair = Symbol();
    double  lotStep     = MarketInfo(pair, MODE_LOTSTEP),
            minLot      = MarketInfo(pair, MODE_MINLOT);
    lots            = MathRound(lots/lotStep) * lotStep;
    if (lots < minLot) lots = 0;    // or minLot
    return(NormalizeDouble(lots,2));
}

Résultat :

0.7


 

 Result: 0.7000000000000001

Quelle partie de "vous ne comprenez pas la virgule flottante et que certains nombres ne peuvent pas être représentés exactement. (comme 1/10.) Format flottant à double précision - Wikipédia, l'encyclopédie libre" n'était pas clair ?

NormalizeDouble(0.7, 2) produira le même résultat exact (ou peut-être 0.699999999999999.)

 
whroeder1:

Quelle partie de "vous ne comprenez pas la virgule flottante et que certains nombres ne peuvent pas être représentés exactement. (comme 1/10.) Format à virgule flottante à double précision - Wikipedia, the free encyclopedia" n'était pas clair ?

NormalizeDouble(0.7, 2) produira exactement le même résultat (ou peut-être 0.699999999999999.)

Je ne dis pas que NormalizeDouble() est nécessaire pour un OrderSend valide. C'est pourquoi mon premier extrait de code l'excluait. Je ne suis pas non plus clair sur la manière dont les nombres à virgule flottante sont représentés.

J'ai modifié le code pour l'inclure parce que j'avais l'impression qu'il répondait mieux à ma compréhension du problème de l'OP (essentiellement un problème d'affichage, qui peut être résolu soit en utilisant NormalizeDouble() dans le code "lot normalizer", soit en utilisant printf ou DoubleToStr lorsque la valeur doit être affichée).

Peut-être ai-je mal compris l'OP.

02:00:00.069 - custom expert EURUSD,H1: | _lotSize - NormalizeDouble: 0.07000000000000001
02:00:00.069 - custom expert EURUSD,H1: | _lotSize - DoubleToString : 0.07

(édité pour supprimer les tournures inutiles)

 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- get minimum stop level
   double minstoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL);
   Print("Minimum Stop Level=",minstoplevel," points");
   double price=Ask;
//--- calculated SL and TP prices must be normalized
   double stoploss=NormalizeDouble(Bid-minstoplevel*Point,Digits);
   double takeprofit=NormalizeDouble(Bid+minstoplevel*Point,Digits);
//--- place market order to buy 1 lot
   int ticket=OrderSend(Symbol(),OP_BUY,1,price,3,stoploss,takeprofit,"My order",16384,0,clrGreen);
   if(ticket<0)
     {
      Print("OrderSend failed with error #",GetLastError());
     }
   else
      Print("OrderSend placed successfully");
//---
  }

Cela peut prêter à confusion car la documentation de MQL4 utilise la fonction NormalizeDouble() dans la plupart des exemples.

Elle va même jusqu'à avertir que le prix non normalisé ne peut pas être appliqué :

Note

Lors de l'ouverture d'un ordre de marché (OP_SELL ou OP_BUY), seuls les derniers prix de Bid (pour la vente) ou Ask (pour l'achat) peuvent être utilisés comme prix ouvert. Si l'opération est effectuée avec un titre différent du titre actuel, la fonction MarketInfo() doit être utilisée avec le paramètre MODE_BID ou MODE_ASK pour obtenir les derniers cours de ce titre.

Les prix calculés ou non normalisés ne peuvent pas être appliqués. Si le cours d'ouverture demandé n'est pas présent dans le fil des cours ou s'il n'a pas été normalisé en fonction du nombre de chiffres après la virgule, l'erreur 129 (ERR_INVALID_PRICE) est générée. Si le prix ouvert demandé est complètement dépassé, l'erreur 138 (ERR_REQUOTE) sera générée indépendamment du paramètre de slippage. Si le prix demandé est périmé, mais présent dans le fil de discussion, l'ordre sera ouvert au prix actuel et seulement si le prix actuel se situe dans la fourchette prix+slippage.

Et même dans certains des meilleurs livres sur le MQL, ils l'utilisent assez largement.

Cela peut dépendre de l'application, un problème d'affichage est moins dramatique que les échecs d'ordre ou de modification.

Personnellement, je convertis toujours les valeurs entières en nombres entiers, ce qui fait que j'y suis rarement confronté.