Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Храни исходные коды в MQL5 Storage. Это безопасно!
concord99
514
concord99 2012.12.24 12:11 

Пожалуйста, подскажите функцию, чтобы, например, из 1.2345 получалось 1.23 ? Или из 1.5566 получалось 1.55. То есть просто отсекались последние цифры кроме первых двух после запятой без всяких округлений и т.п.

Заранее благодарен всем, кто напишет. 

Vladimir Pastushak
66027
Vladimir Pastushak 2012.12.24 12:16  
double d = NormalizeDouble(1.2345,2); будет вам 1,23
Vladimir
1592
Vladimir 2012.12.24 12:17  

https://docs.mql4.com/ru/convert/normalizedouble

double NormalizeDouble(         double value, int digits)
Владимир Тезис
4266
Владимир Тезис 2012.12.24 12:24  
VOLDEMAR:
double d = NormalizeDouble(1.2345,2); будет вам 1,23

с такими числами будет. Но если человеку нужно не округлить, а отбросить лишние цифры, то нормализация не сработает - число 1.2355 округлится до 1.24 - нужна функция тупого отброса лишних чисел. Мне в своё время пришлось делать её в Delphi и загонять в dll-ку.
Alexey Subbotin
4998
Alexey Subbotin 2012.12.24 12:30  
drknn:

с такими числами будет. Но если человеку нужно не округлить, а отбросить лишние цифры, то нормализация не сработает - число 1.2355 округлится до 1.24 - нужна функция тупого отброса лишних чисел. Мне в своё время пришлось делать её в Delphi и загонять в dll-ку.

Округлить вниз до n знаков после запятой можно, например, так (за быстродействие особо не ручаюсь):

double MathFloorN(double a, int n)
{
   if(n<0) return (a);

   double Z = MathPow(10,n);

   return(NormalizeDouble(MathFloor(a*Z)/Z,n));
}
concord99
514
concord99 2012.12.24 12:37  
Всем спасибо! Буду пробовать разные варианты.
concord99
514
concord99 2012.12.24 13:28  

Возможно, я нашёл решение: умножаю на 100, потом с помощью MathFloor отсекаю дробную часть. А затем делю на 100. Вроде бы не округляет (а для меня важно именно то, чтобы не было округления) 

MathFloor(Close[1]*100)/100

Alexey Subbotin
4998
Alexey Subbotin 2012.12.24 14:02  
concord99:

Возможно, я нашёл решение: умножаю на 100, потом с помощью MathFloor отсекаю дробную часть. А затем делю на 100. Вроде бы не округляет (а для меня важно именно то, чтобы не было округления) 

MathFloor(Close[1]*100)/100


Вот выше код это и делает)))
DmitriyN
2316
DmitriyN 2012.12.24 14:02  
concord99:

Конкорд,, небольшой индючок вам от меня лично. Я его называю "округлитель цены". Индикатор наводит на некоторые мысли терзающие сомнения.

#property copyright "Copyright © DmitriyN-2012"
#property link      "https://www.mql5.com/ru/users/dmitriyn"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 White

extern int BarsPaint=10000;
extern int Okrugl=2;   

double Cena;
double ExtMapBuffer1[];

int init()
   {
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtMapBuffer1);
   return(0);
   }
   
int start()
   {
   int counted_bars=IndicatorCounted();
   if (counted_bars>0) counted_bars--;
   int limit; 
   limit=Bars-counted_bars;
   if (limit>BarsPaint)limit = BarsPaint;
   for(int i=limit;i>=0;i--)
   {  
      Cena=NormalizeDouble(Close[i],Okrugl);
      // Рисование
      ExtMapBuffer1[i]=Cena;
   }
   return(0);
   }
concord99
514
concord99 2012.12.24 14:51  
DmitriyN:

Конкорд,, небольшой индючок вам от меня лично. Я его называю "округлитель цены". Индикатор наводит на некоторые мысли терзающие сомнения.

 


Спасибо, Дмитрий. Надо изучить этот индюк.
poruchik
906
poruchik 2012.12.25 04:02  

 Дмитрий, а можно сделать, не округлитель, а отниматель - прибавлятель

 Цена "плывет" по средине  дорожки с задаваемой шириной (+ / - п. от цены)

При выходе за эту величину - уходим на середину соседней  дорожки

/ /12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий