А я буду благодарен за четкую формулировку когда нужна нормализация 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).
Меня это двойное преобразование, когда я его увидел впервые, сильно смутило. На самом деле при выводе в лог экспертов вполне достаточно только
Print( DoubleToStr( var1, 5 ) );
Наверно, гораздо информативнее был бы пример с какой-нибудь торговой функцией, т.е. именно там, где нормализация и нужна по-настоящему. Здесь также был бы очень познавательным пример с функцией CompareDoubles() из stdlib.mq4 (грабли, на которые новички наступают почти неизменно):
// Функция корректного сравнения двух переменных типа double из библиотеки stdlib.mq4
boolCompareDoubles(doublenumber1,doublenumber2){if(NormalizeDouble(number1-number2,8)==0)return(true);
elsereturn(false);
}
Раз пошла такая пьянка, хочу задать свой вопрос, которым мучаюсь уже давно. Вот пример кода:
intstart(){doublehaOpen, haHigh, haLow, haClose;
if(Bars<=10)return(0);
ExtCountedBars=IndicatorCounted();
//---- check for possible errorsif(ExtCountedBars<0)return(-1);
В чем принципиальная разница между первым return(0) и вторым return(-1)? Как это влияет на процесс выполнения индикатора (или советника)? Что происходит при возврате отрицательного значения? И могу ли я написать нечто вроде:
Принципиальной разницы нет, так возвращаемое значение терминалом не анализиируется (на данный момент). Фактически, это стиль записи, который помогает самому программеру понять, что в данном случае происходит нестандартное завершение(значение минус 1) функции start().
Я к примеру в последнее время именно так и пишу. :) Более того, даже финальный return не использую совсем. Вроде даже где-то в документации было, что в функциях типа void финальный return не обязателен.
Изначально было не double, но в какой-то момент вдруг оказалось, что тип int не всегда подходит для хранения объемов (например, возьмите месячный тайм-фрейм по шибко волатильному инструменту). В этом случае получить ошибку переполнения не составит труда.
Из документации (Data types): Integer constants can assume values from -2147483648 to 2147483647. Июль 2002, EURUSD: максимальное количество тиков за месяц в истории, 670000. Чтобы получилось переполнение даже при таком максимальном тиковом объеме, нужно 3000 месяцев, т.е. 250 лет. С другой стороны, объемы могут и расти дальше, так что цифра не настолько недостижимая теоретически...
Из документации (Data types): Integer constants can assume values from -2147483648 to 2147483647. Июль 2002, EURUSD: максимальное количество тиков за месяц в истории, 670000. Чтобы получилось переполнение даже при таком максимальном тиковом объеме, нужно 3000 месяцев, т.е. 250 лет. С другой стороны, объемы могут и расти дальше, так что цифра не настолько недостижимая теоретически...
Я сам задавал такой вопрос и получил именно такой ответ. Хоть в это и трудно поверить. Но если в МТ4 запихнуть котировки с фондового рынка ...
Rosh, если я правильно понимаю Ваше молчание, то четкой формулировки, в каких случаях и для каких выражений/переменных нужна нормализация, не существует. Если это так, то может быть можно ответить на более простой вопрос: требуется ли нормализация расчетных значений вида
int StLs=25; double prc = Ask + StLs*Point;
Или мне выяснять это самостоятельно, на эксперименте ?
А я буду благодарен за четкую формулировку когда нужна нормализация double.
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.
Меня это двойное преобразование, когда я его увидел впервые, сильно смутило. На самом деле при выводе в лог экспертов вполне достаточно только
Наверно, гораздо информативнее был бы пример с какой-нибудь торговой функцией, т.е. именно там, где нормализация и нужна по-настоящему. Здесь также был бы очень познавательным пример с функцией CompareDoubles() из stdlib.mq4 (грабли, на которые новички наступают почти неизменно):
Renat, чем не вариант?
В чем принципиальная разница между первым return(0) и вторым return(-1)?
Как это влияет на процесс выполнения индикатора (или советника)?
Что происходит при возврате отрицательного значения?
И могу ли я написать нечто вроде:
И могу ли я написать нечто вроде:
Из документации (Data types): Integer constants can assume values from -2147483648 to 2147483647. Июль 2002, EURUSD: максимальное количество тиков за месяц в истории, 670000. Чтобы получилось переполнение даже при таком максимальном тиковом объеме, нужно 3000 месяцев, т.е. 250 лет. С другой стороны, объемы могут и расти дальше, так что цифра не настолько недостижимая теоретически...
Из документации (Data types): Integer constants can assume values from -2147483648 to 2147483647. Июль 2002, EURUSD: максимальное количество тиков за месяц в истории, 670000. Чтобы получилось переполнение даже при таком максимальном тиковом объеме, нужно 3000 месяцев, т.е. 250 лет. С другой стороны, объемы могут и расти дальше, так что цифра не настолько недостижимая теоретически...
Я сам задавал такой вопрос и получил именно такой ответ. Хоть в это и трудно поверить. Но если в МТ4 запихнуть котировки с фондового рынка ...
Rosh, если я правильно понимаю Ваше молчание, то четкой формулировки, в каких случаях и для каких выражений/переменных нужна нормализация, не существует. Если это так, то может быть можно ответить на более простой вопрос: требуется ли нормализация расчетных значений вида
int StLs=25;
double prc = Ask + StLs*Point;
Или мне выяснять это самостоятельно, на эксперименте ?