[АРХИВ!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 4. - страница 320

 
okvseok:

есть функция "double MathRound( double value)", но мне необходимо, чтоб округление было до большей десятичной дроби, а если число целое или и так десятичное, то не трогать.

Например: 1) 0,744 округлить до 0,8; 1,233 округлить до 1,3

2) 0,9 или 3 или 1,5 не трогать.

double MathRoundDec(double dValue) 
 {
  if (dValue == NormalizeDouble(dValue, 1)) return(dValue);
  return(MathRound(10 * dValue) / 10);  
 }
Не проверял, но как-то так.
 
Zhunko:
Не проверял, но как-то так.


Совершенно бесполезные телодвижения достаточно double res=NormalizeDouble(res,1) математически все равно обрабатывать double res = 3; или double res = 3.0;

Разница будет видна только при выводе на печать (график), но этого в описании проблемы у автора нет.

 
FAQ:


Совершенно бесполезные телодвижения достаточно double res=NormalizeDouble(res,1) математически все равно обрабатывать double res = 3; или double res = 3.0;

Разница будет видна только при выводе на печать (график), но этого в описании проблемы у автора нет.

Ну, можно так:

double MathRoundDec(double dValue) 
 {
  return(MathRound(10 * dValue) / 10);  
 }
По моему, первый вариант оптимальнее. Быстрее работать будет.
 
Zhunko:

Ну, можно так:

По моему, первый вариант оптимальнее. Быстрее работать будет.


Этот вариант

 double res=NormalizeDouble(res,1);

должен быть самым быстрым

 
всем спасибо. с понедельника отпишусь-попробую все варианты!
 
Вариант Вадима быстрее на 20-25%, но эффект начинает устойчиво проявляться при количестве итераций больше миллиона. (проверил)
 
FAQ:
Вариант Вадима быстрее на 20-25%, но эффект начинает устойчиво проявляться при количестве итераций больше миллиона. (проверил)

Код покажи, как проверял
 
FAQ:
Вариант Вадима быстрее на 20-25%, но эффект начинает устойчиво проявляться при количестве итераций больше миллиона. (проверил)
огромное спасибо!
 
okvseok:

правильно так написать: if (OrderSelect (OrdersHistoryTotal()-1, SELECT_BY_POS, MODE_HISTORY) == OrderTakeProfit() == OrderClosePrice()) Stop=false // то есть, если последний с конца ордер закрылся по тейк профиту (взятие прибыли при достижении определенного уровня), то значение Stop=неправда? (Stop в глобальных переменных)

вопрос возник, так как ордер у меня по условию if((iClose(NULL,0,1)<ma) && Stop==True) открывается в любом случае...

 

Никогда не сравнивайте, не нормализированные дубли, бесполезно. И кстати цена закрытия ордера по тейку может быть отлична от цены тейка (реал/демо (онлайн))

поэтому более корректными будет измерение модуля разницы цен, сравнение ее с тестовой величиной.

if(MathAbs(OrderTakeProfit()-OrderClosePrice())<2*Point){Stop=false;}
Причина обращения: