SOS! Help! Помогите понять как исправить код!

 

Делаю простую функцию для вычисления средней величины бара за период, но имею предупреждение от компилятора. Никак не могу понять в чем дело. Видимо заработался. Помогите!

Сам код работает, но предупреждение смущает.

//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
extern int       PeriodBar        =10;
//+------------------------------------------------------------------+
int OnInit()
{return(INIT_SUCCEEDED);}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{}
//+------------------------------------------------------------------+
void OnTick()
{
Comment("Average Bar Size   ", AverageBar(PeriodBar));  
}
//+------------------------------------------------------------------+
int AverageBar(int PerBar) 
{int Size=0;
 int AvBar=0;
   for (int i = PerBar - 1; i >= 0; i--) 
   {if(PerBar!=0) {Size += (High[i]-Low[i])/Point;}
    AvBar=Size/PerBar;}
return (AvBar);}
 
Nikolay Bosuy:

Делаю простую функцию для вычисления средней величины бара за период, но имею предупреждение от компилятора. Никак не могу понять в чем дело. Видимо заработался. Помогите!

Сам код работает, но предупреждение смущает.

High и Low типа double, а Size вы назначили тип int, отсюда потеря точности.

И проверку if(PerBar!=0) лучше поставить в начале функции и выход из функции с возвратом 0. Иначе возможно деление на 0 в строке

    AvBar=Size/PerBar;
 
Alexey Viktorov #:

High и Low типа double, а Size вы назначили тип int, отсюда потеря точности.

И проверку if(PerBar!=0) лучше поставить в начале функции и выход из функции с возвратом 0. Иначе возможно деление на 0 в строке

Меняю тип, но ничего не меняется

 
Nikolay Bosuy #:

Меняю тип, но ничего не меняется

Тип какой переменной поменяли? Покажите новый код.

P. S. Строка

Size += (High[i]-Low[i])/Point;
является опасной. Ведь Point может содержать 0. Поэтому в OnInit лучше проверить (если равно нулю, то не инициализировать индикатор и ждать, пока Point станет не равен нулю, или просто прекратить работу индикатора с соответствующим сообщением) и буферизовать значение Point. При делении использовать ранее буферизованное значение.
 
Nikolay Bosuy:

Делаю простую функцию для вычисления средней величины бара за период, но имею предупреждение от компилятора. Никак не могу понять в чем дело. Видимо заработался. Помогите!

Сам код работает, но предупреждение смущает.

Size целое, а выражение (High[i]-Low[i])/Point вещественное. Отсюда предупреждение

Приведите к целому:

Size += (int)MathRound((High[i]-Low[i])/Point);
 
Maxim Kuznetsov #:
(int)MathRound((High[i]-Low[i])/Point);

Спасибо! Работает!