[ARCHIVE !] Toute question de débutant, pour ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 4. - page 318

 
okvseok:

il y a une fonction "double MathRound( double value)", mais j'ai besoin de l'arrondi à une fraction décimale plus grande, et si le nombre est entier ou déjà décimal, alors laissez-le tranquille.

Par exemple : 1) 0,744 arrondi à 0,8 ; 1,233 arrondi à 1,3

2) 0,9 ou 3 ou 1,5 ne touchent pas.

double MathRoundDec(double dValue) 
 {
  if (dValue == NormalizeDouble(dValue, 1)) return(dValue);
  return(MathRound(10 * dValue) / 10);  
 }
Je n'ai pas vérifié, mais c'est à peu près tout.
 
Zhunko:
Je ne l'ai pas vérifié, mais en quelque sorte.


Geste totalement inutile assez double res=NormalizeDouble(res,1) pour gérer mathématiquement encore double res = 3 ; ou double res = 3.0 ;

La différence ne sera visible qu'à l'impression (graphique), mais cela ne figure pas dans la description du problème par l'auteur.

 
FAQ:


Geste totalement inutile assez double res=NormalizeDouble(res,1) pour gérer mathématiquement encore double res = 3 ; ou double res = 3.0 ;

La différence ne sera visible que sur l'impression (graphique), mais cela ne figure pas dans la description du problème par l'auteur.

Eh bien, vous pouvez le faire de cette façon :

double MathRoundDec(double dValue) 
 {
  return(MathRound(10 * dValue) / 10);  
 }
Je pense que la première variante est meilleure. Il fonctionnera plus rapidement.
 
Zhunko:

Eh bien, vous pourriez faire comme ça :

Je pense que la première option est la meilleure. Il fonctionnera plus rapidement.


Cette option.

 double res=NormalizeDouble(res,1);

devrait être le plus rapide

 
Merci à tous. Je ferai un rapport lundi - je vais essayer toutes les options !
 
La version de Vadim est 20-25% plus rapide, mais l'effet commence à se manifester régulièrement lorsque le nombre d'itérations dépasse un million. (vérifié)
 
FAQ:
La version de Vadim est 20-25% plus rapide, mais l'effet commence à se manifester régulièrement lorsque le nombre d'itérations dépasse un million. (vérifié)

Montrez-moi le code, comment l'avez-vous vérifié ?
 
FAQ:
La version de Vadim est 20-25% plus rapide, mais l'effet commence à se manifester régulièrement lorsque le nombre d'itérations dépasse un million. (testé)
Merci beaucoup !
 
okvseok:

la façon correcte de l'écrire : if (OrderSelect (OrdersHistoryTotal()-1, SELECT_BY_POS, MODE_HISTORY) == OrderTakeProfit() == OrderClosePrice()) Stop=false // c'est-à-dire que si le dernier ordre de la fin a clôturé au niveau du Take Profit (prise de bénéfice lorsqu'un certain niveau est atteint), le Stop=false ? (Arrêt dans les variables globales)

cette question s'est posée car l'ordre s'ouvre par une condition if((iClose(NULL,0,1)<ma) && Stop==True)....

 

Ne jamais comparer, prises non normalisées, inutile. Et d'ailleurs, le prix de clôture d'un ordre d'achat peut être différent du prix d'achat (réel/démo (en ligne)).

Il serait donc plus correct de mesurer le module de différence de prix, en le comparant à la valeur test.

if(MathAbs(OrderTakeProfit()-OrderClosePrice())<2*Point){Stop=false;}
Raison: