Bollinger Bands при вызове даёт значение равное 4-м знакам

Павел Козлов
28
Всем привет. Я настолько редко обращаюсь с просьбами на форум, проще самому поискать в инете, но тут случай отдельный. Проблема в следующем. При вызове в моём индикаторе 
iBands(NULL,0,20,2,0,PRICE_HIGH,MODE_UPPER,1);
Он даёт значение с 4-мя знаками после точки. А мне, например, что бы определить вышла ли свеча за верхнюю границу нужно сравнивать значения соответственно свечей и бб. Но он их сравнивает по 4-м знакам(собственно именно 4 знака и выдаёт код выше). Пробовал уже всё менять местами, что ток можно пробовал. Кстати как понял про 4 знака - пропринтовал. В инете искал инфу, так что не пинайте, сам не ахти в программировании, но свои индикаторы с горем пополам пишу, методом тыка и крови xD. В общем побуду наглым и попрошу у вас кусок кода исправить или подсказать, что не так делаю.  Кстати залазил в сам индикатор BB и принтовал непосредственно напрямую, он после запятой фиг знает сколько вообще знаков выдает. 
double bb=iBands(NULL,0,20,2,0,PRICE_HIGH,MODE_UPPER,1);
if (bb <Low[1]){
        чертова туча невероятных гралей
}
Vladimir Karputov
Модератор
270920

Если посмотреть в код индикатора \MQL5\Indicators\Examples\BB.mq5, то видно, что он выдаёт значения

   PlotIndexSetInteger(2,PLOT_SHIFT,ExtBandsShift);
//--- number of digits of indicator value
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1);
//---- OnInit done
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,

на один разряд точнее.


Для Ваших расчётов нужно сравнивать два вещественных числа

Павел Козлов
28
Vladimir Karputov:

Если посмотреть в код индикатора \MQL5\Indicators\Examples\BB.mq5, то видно, что он выдаёт значения

на один разряд точнее.


Для Ваших расчётов нужно сравнивать два вещественных числа

Прошу прощения за неуточнение, я работаю с mql4. Посмотрел код BB и там 
   IndicatorDigits(Digits);
Но если честно я не понял что вы мне хотели сказать, повторюсь, я плуг в програмировании и если можно, то приведите пример. Т.е. я понимаю про вещественные числа, но как добиться точности в 5 знаков после запятой от BB я так и не понял.
Павел Козлов
28
Кстати вдогонку , так сказать в помощь в поиске проблемы. при вызове и принте(собственно именно тот способ по которому я и определил что 4 знака дает, а не 5) он еще и округляет число.
double bb=iBands(NULL,0,20,2,0,PRICE_HIGH,MODE_UPPER,1);
Print(bb);

2018.04.20 16:44:57.550GBPUSD,M1: 1.4037

Хотя при наведении на полосу ВВ на графике значение показывает  1.40368


Alexey Viktorov
38438
Павел Козлов:
Кстати вдогонку , так сказать в помощь в поиске проблемы. при вызове и принте(собственно именно тот способ по которому я и определил что 4 знака дает, а не 5) он еще и округляет число.

2018.04.20 16:44:57.550GBPUSD,M1: 1.4037

Хотя при наведении на полосу ВВ на графике значение показывает  1.40368


Вероятно, что в момент распечатки значение индикатора было 1.40370 и этот незначащий 0 был отброшен. При распечатке значений цены и в данном случае индикатора пользуйтесь функцией Print(DoubleToString(value, _Digits));

DoubleToString - Преобразование данных - Справочник MQL4
DoubleToString - Преобразование данных - Справочник MQL4
  • docs.mql4.com
[in]  Формат точности. Если значение digits лежит в диапазоне от 0 до 16, то будет получено строковое представление числа с указанным количество знаков после запятой. Если значение digits лежит в диапазоне от -1 до -16, то...
Павел Козлов
28
Alexey Viktorov:

Вероятно, что в момент распечатки значение индикатора было 1.40370 и этот незначащий 0 был отброшен. При распечатке значений цены и в данном случае индикатора пользуйтесь функцией Print(DoubleToString(value, _Digits));

Самое забавное, что он начал показывать действительно 5 знаков. Только вот попробуйте вставить этот код и сравнить значения на графике(возьмем сформировавшуюся и закрытую свечу для точности) и посмотрите что он выдаёт разные значения да и вообще он чушку пишет если чесн. Просто вопрос уже стоит в том, что либо я тупой и чего-то не понимаю, либо тут есть проблема на которую мне не хватает знаний.
double bb=iBands(NULL,0,20,2,0,PRICE_HIGH,MODE_UPPER,1);
Print(DoubleToString(bb,Digits)); 
Кстати дело было не в нуле, это просто пример такой попался, он на всех значениях окруляет до 4-х знаков.
Artyom Trishkin
Модератор
82812
Павел Козлов:
Самое забавное, что он начал показывать действительно 5 знаков. Только вот попробуйте вставить этот код и сравнить значения на графике(возьмем сформировавшуюся и закрытую свечу для точности) и посмотрите что он выдаёт разные значения да и вообще он чушку пишет если чесн. Просто вопрос уже стоит в том, что либо я тупой и чего-то не понимаю, либо тут есть проблема на которую мне не хватает знаний.
Кстати дело было не в нуле, это просто пример такой попался, он на всех значениях окруляет до 4-х знаков.
Вы смотрите код кастомного ВВ, а используете стандартный.
Aleksey Lebedev
7574
Павел Козлов:
  Он даёт значение с 4-мя знаками после точки.

Это не так, значения индикатора имеют тип double - 8 байт, даёт полностью)
т.е. внутри всегда максимально возможная точность, вывод на экран/принт - округляется.

Vladimir Mokrushin
263

Уже 2021 год, а у меня такая же проблема.

При вызове

iBands(NULL,0,B,OTKL,0,PRICE_WEIGHTED,MODE_UPPER,k)

в индикатор значения с 15 знаками после запятой, а при вызове 

iBands(NULL,0,B,OTKL,0,PRICE_WEIGHTED,MODE_UPPER,k)

в советник округляет до 4 знаков после запятой.

В советнике

Comment(DoubleToString(iBands(NULL,0,B,OTKL,0,PRICE_WEIGHTED,MODE_UPPER,k),15))

Тоже выдает число с 4-мя знаками после запятой.

Где конфигурационные настройки метатрейдера4, отвечающие за это?

Alexey Viktorov
38438
Vladimir Mokrushin #:

Уже 2021 год, а у меня такая же проблема.

При вызове

в индикатор значения с 15 знаками после запятой, а при вызове 

в советник округляет до 4 знаков после запятой.

Значит шестнадцатый знак нуль…

Vladimir Mokrushin
263
Alexey Viktorov #:

Значит шестнадцатый знак нуль…

Да это понятно. Речь о том что при вызове в советнике 4 знака, хотя в котировках 5 знаков.