![MQL5 - Langage des stratégies de trading intégré au terminal client MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
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
{
...
return(NormalizeDouble(lots,2));
}
Ce commentaire m'a beaucoup aidé, et c'est utile mais cela me donne plus de décimales.
( plus de décimales est normal - parce que j'ai déjà lu à ce sujet )
Je m'inquiète toujours de'NormalizeDouble' et je cherche un autre moyen, lequel est meilleur que 'NormalizeDouble'.
Merci !
Grand merci à ceux qui ont écrit des commentaires.
@whroeder1- Je ferai des recherches approfondies sur vos commentaires (/ liens), merci beaucoup.
@Marco- Je vais l'utiliser après le problème de LotSize LotStep. Merci !
Ce commentaire m'a vraiment beaucoup aidé, et c'est utile mais cela me donne plus de décimales.
( plus de décimales est normal - parce que j'ai déjà lu à ce sujet )
Je m'inquiète toujours de'NormalizeDouble' et je cherche un autre moyen, lequel est meilleur que 'NormalizeDouble'.
Merci !
Peut-être serait-il préférable d'établir exactement ce que vous cherchez à obtenir.
Si vous voulez qu'une fonction renvoie une taille de lot valide pour passer un ordre, vous n'avez pas besoin d'utiliser NormalizeDouble(). Mon extrait de code original ou celui de WHRoeder vous permettront d'y parvenir. Il existe des différences subtiles entre eux, qui sont une question de préférence personnelle.
Mais, si vous faites une impression directe() de cette valeur de lot, vous pouvez obtenir des résultats "bizarres"... comme votre 0.07000000000000001.
Ce n'est pas un problème pour OrderSend() mais ce n'est peut-être pas ce que vous voulez voir.
Si vous voulez voir les chiffres affichés de manière "normale", vous avez 2 choix :
1. Vous pouvez utiliser NormalizeDouble() dans la fonction. Pour une impression standard, la valeur sera telle que vous l'attendez. Mais si vous imprimez (manuellement) suffisamment de décimales, vous finirez par voir que le nombre n'est pas exactement ce que vous pensez. C'est ce que WHRoeder essaie de faire comprendre (je pense). Cette solution n'est pas la plus élégante, mais c'est la plus simple. Ou bien...
2. Vous pouvez laisser la taille du lot telle qu'elle est (c'est-à-dire ne pas utiliser NormalizeDouble) et ensuite ajuster la valeur à des fins d'affichage lorsque cela est nécessaire. Vous pouvez utiliser DoubleToStr() ou StringFormat() ou printf() pour y parvenir, en fonction de vos besoins. Il s'agit d'une approche plus souple.
N'oubliez pas que la valeur réelle et la façon dont cette valeur est affichée ne doivent pas nécessairement être identiques. Vous ne serez jamais en mesure de stocker exactement 0,07 :
printf("%.24f",myVal);
Result: 0.070000000000000006661338
Peut-être serait-il préférable d'établir exactement ce que vous cherchez à obtenir.
...
Wow, c'est bien que vous l'ayez écrit, je comprends presque comme votre commentaire.
Je vais donc écrire un nouveau commentaire, bientôt.
//--- deuxième édition
Comme je l'ai mentionné, je n'ai pas besoin que LotSize et LotStep s'affichent correctement juste à l'écran, j'ai besoin que LotSize et LotStep puissent afficher la même chose partout.
C'est ce qui m'inquiète.
S'il s'agit d'un lotsizing dynamique, vous pouvez toujours brancher une simple boîte de vitesses.
double Lots;
Balance=AccountInfoDouble(ACCOUNT_BALANCE);
if(Balance>10000)
{Lots=10;Print(" Gear Two");}
if(Balance>100000)
{Lots=100;Print(" Gear Three");}
if(Balance>1000000)
{Lots=1000;Print(" Gear Four");}
if(Balance>10000000)
{Lots=10000;Print(" Gear Five");}
if(Balance<10000000)
{Lots=1000;Print(" Gear Four");}
if(Balance<1000000)
{Lots=100;Print(" Gear Three");}
if(Balance<100000)
{Lots=10;Print(" Gear Two");}
if(Balance<10000)
{Lots=1;Print(" Gear One");}
if(Balance>1000000000)
{Lots=0;}
J'ai besoin de poster une partie de mon EA avec vous, donc j'espère que cela vous aidera à mieux me comprendre.
Donc, j'ai besoin de savoir si ce code est bon ou non ?
Je vous prie de me donner de bons conseils ou de l'aide (clairement), merci d'avance.
const long & lparam , // Parameter of type long event
const double & dparam , // Parameter of type double event
const string & sparam // Parameter of type string events
)
{
_lotCalc();
//-------Process Button---------------------------------------------------------|
if ( sparam == _btnLotMinus )
{
ObjectSetInteger( 0, _btnLotMinus, OBJPROP_STATE, false );
_lotSize -= _lotStep;
if ( NormalizeDouble( _lotSize, 2 ) <= 0 ) _lotSize = _lotMin;
_calcUpdade( CALC_CHANGE_LOT );
Print( " | Lot: ", _lotSize );
return;
} //---if Close
// ...
}
double _lotCalc()
{
//---
_lotMin = SymbolInfoDouble( _Symbol, SYMBOL_VOLUME_MIN );
_lotMax = SymbolInfoDouble( _Symbol, SYMBOL_VOLUME_MAX );
_lotStep = SymbolInfoDouble( _Symbol, SYMBOL_VOLUME_STEP );
//---
return( NormalizeDouble( _lotSize, 2 ) );
}
J'ai besoin de poster une partie de mon EA avec vous, donc j'espère que cela vous aidera à mieux me comprendre.
Donc, j'ai besoin de savoir si ce code est bon ou non ?
S'il vous plaît, donnez moi de bons (clairs) conseils ou de l'aide, merci d'avance.
Tard dans la nuit, non compilé, non testé.
Nous ne voyons pas où vous définissez d'abord _lotSize... rappelez-vous que vous devrez vous assurer que _lotSize est toujours un multiple de _lotStep.
Il serait préférable de regrouper tous les calculs de lots, plutôt que de les répartir entre OnChartEvent() et _lotCalc(). Une seule fonction qui vérifie min / max / pas et fait l'incrémentation / décrémentation.
const long & lparam , // Parameter of type long event
const double & dparam , // Parameter of type double event
const string & sparam // Parameter of type string events
)
{
_lotCalc();
//-------Process Button---------------------------------------------------------|
if ( sparam == _btnLotMinus )
{
ObjectSetInteger( 0, sparam, OBJPROP_STATE, false );
_lotSize = fmax(_lotMin, _lotSize-_lotStep);
_calcUpdade( CALC_CHANGE_LOT );
printf( " | Lot: %.2f ", _lotSize );
return;
} //---if Close
// ...
}
void _lotCalc()
{
//---
_lotMin = SymbolInfoDouble( _Symbol, SYMBOL_VOLUME_MIN );
_lotMax = SymbolInfoDouble( _Symbol, SYMBOL_VOLUME_MAX );
_lotStep = SymbolInfoDouble( _Symbol, SYMBOL_VOLUME_STEP );
//---
}
Tard dans la nuit, non compilé, non testé.
Nous ne voyons pas où vous avez d'abord défini _lotSize... rappelez-vous que vous devrez vous assurer que _lotSize est toujours un multiple de _lotStep.
Il serait préférable de regrouper tous les calculs de lots, plutôt que de les répartir entre OnChartEvent() et _lotCalc(). Une fonction qui vérifie min / max / pas et fait l'incrémentation / décrémentation.
Cela m'a beaucoup aidé, cela signifie que cela a résolu mes problèmes de lotSize et losStep.
Un grand merci.
#Lot 0 (zéro) & (entre le problème résolu de la taille du lot et celui du pas de lot) - Fermé
Oui, j'ai oublié le code de lotSize, donc je l'utilise dans la fonctioninit.
Est-ce un bon endroit pour _lotSize ?
Merci !
{
_pip = Point;
if( Digits == 0 || Digits == 2 || Digits == 3 || Digits == 5 ) _pip = 10 * Point;
_lotSize = _lotValue * MarketInfo( Symbol(), MODE_MINLOT );
//...
}