Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
{
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));
}
Merci beaucoup.
Je veux juste commencer à écrire ce code :)
Vous m'avez sauvé plusieurs fois.
Un grand merci !
Je cherche un bon forum pour le calcul de'MarketInfo & LotSize'.
Si vous connaissez ce type de forum , veuillez m'en faire part.
Merci.
J'ai donc besoin de bons conseils, s'il vous plaît.
02:00:00.069 - custom expert EURUSD,H1: | _lotSize - DoubleToString : 0.07
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) :
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é :
Résultat :
Maintenant le code est ajusté :
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 :
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.)
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 - 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é.