Обсуждение документации MQL4 - страница 16

 
Yurixx:

А я буду благодарен за четкую формулировку когда нужна нормализация double.

Точно, здесь явные непонятки. В помощи по этой функции приведен пример, в котором эта функция абсолютно бесполезна:

double NormalizeDouble( double value, int digits)
Rounds the floating point value to the given precision. Returns normalized value of the double type.
The calculated StopLoss and TakeProfit values, as well as open price of pending orders must be normalized with a precision the value of which is stored in the pre-defined variable of Digits.
Parameters:
value - Floating point value.
digits - Precision format, number of digits after decimal point (0-8).
Sample:
  double var1=0.123456789;
  Print(DoubleToStr(NormalizeDouble(var1,5),5));
  // output: 0.12346

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

Print( DoubleToStr( var1, 5 ) ); 
Наверно, гораздо информативнее был бы пример с какой-нибудь торговой функцией, т.е. именно там, где нормализация и нужна по-настоящему. Здесь также был бы очень познавательным пример с функцией CompareDoubles() из stdlib.mq4 (грабли, на которые новички наступают почти неизменно):

// Функция корректного сравнения двух переменных типа double из библиотеки stdlib.mq4
bool CompareDoubles(double number1,double number2)
{
   if(NormalizeDouble(number1-number2,8)==0) return(true);
   else return(false); 
}
Renat, чем не вариант?
 
Раз пошла такая пьянка, хочу задать свой вопрос, которым мучаюсь уже давно. Вот пример кода:
int start()
  {
   double haOpen, haHigh, haLow, haClose;
   if(Bars<=10) return(0);
   ExtCountedBars=IndicatorCounted();
//---- check for possible errors
   if (ExtCountedBars<0) return(-1);
В чем принципиальная разница между первым return(0) и вторым return(-1)?
Как это влияет на процесс выполнения индикатора (или советника)?
Что происходит при возврате отрицательного значения?
И могу ли я написать нечто вроде:
void start()
{
  //
  //...
  //
  return;
}
 
Принципиальной разницы нет, так возвращаемое значение терминалом не анализиируется (на данный момент). Фактически, это стиль записи, который помогает самому программеру понять, что в данном случае происходит нестандартное завершение(значение минус 1) функции start().
 
PSmith:
И могу ли я написать нечто вроде:
void start()
{
  //
  //...
  //
  return;
}

Я к примеру в последнее время именно так и пишу. :) Более того, даже финальный return не использую совсем. Вроде даже где-то в документации было, что в функциях типа void финальный return не обязателен.
 
А вот еще вопрос: почему функция
double iVolume( string symbol, int timeframe, int shift)
возвращает значение типа double?
 
Изначально было не double, но в какой-то момент вдруг оказалось, что тип int не всегда подходит для хранения объемов (например, возьмите месячный тайм-фрейм по шибко волатильному инструменту). В этом случае получить ошибку переполнения не составит труда.
 

Из документации (Data types): Integer constants can assume values from -2147483648 to 2147483647. Июль 2002, EURUSD: максимальное количество тиков за месяц в истории, 670000. Чтобы получилось переполнение даже при таком максимальном тиковом объеме, нужно 3000 месяцев, т.е. 250 лет. С другой стороны, объемы могут и расти дальше, так что цифра не настолько недостижимая теоретически...

 
Mathemat:

Из документации (Data types): Integer constants can assume values from -2147483648 to 2147483647. Июль 2002, EURUSD: максимальное количество тиков за месяц в истории, 670000. Чтобы получилось переполнение даже при таком максимальном тиковом объеме, нужно 3000 месяцев, т.е. 250 лет. С другой стороны, объемы могут и расти дальше, так что цифра не настолько недостижимая теоретически...


Я сам задавал такой вопрос и получил именно такой ответ. Хоть в это и трудно поверить. Но если в МТ4 запихнуть котировки с фондового рынка ...
 
В том же месяце по _DJI - 42228720! Да уж...
 

Rosh, если я правильно понимаю Ваше молчание, то четкой формулировки, в каких случаях и для каких выражений/переменных нужна нормализация, не существует. Если это так, то может быть можно ответить на более простой вопрос: требуется ли нормализация расчетных значений вида

int StLs=25;
double prc = Ask + StLs*Point;

Или мне выяснять это самостоятельно, на эксперименте ?

Причина обращения: