int nslow=30; double slowSC=(2/(nslow+1)); развернем: double slowSC= 2 / (30 +1) = 2 / 31 = 0
так как Вы выполняете исключительно целочисленные вычисления (все константы целочисленные и
nslow тоже integer), то результат вычислений сводится к целым числам. В данном случае результат
меньше единицы и дробная часть отбрасывается - получаем ноль. А уж потом целочисленный ноль
присваиваем переменной с плавающей запятой.
Чтобы таких проблем небыло, поставьте double nslow=30
>> Чтобы таких проблем небыло, поставьте double nslow=30
Что-то не похоже на язык С. Может имеет смысл это внести в хелп по MQL4?
честно говоря это весьма не интуитивно. А как задать требуюмую точность double переменной?
а все еще проще-
double slowSC=( 2.0 / (nslow+1));
Индикатор после этого заработал.
p.s Ув. Ренат и ко - не могли бы Вы пояснить принцип работы функции Indicator-counted()?
интересует как система узнает что бары были подсчитаны? и поясните хотя бы на примере моего инндикатора как сделать чтобы он не пересчитывал позиции при каждом тике, хотя нудно персчитывать только текущий бар и несколько баров назад?
Заранее благодарен.
Это как раз и есть чистый С.
double slowSC=( 2.0 / (nslow+1));
Да, это более элегантный вариант в данном случае. Только тогда уже везде контролируйте
наличие явного/неявного приведения к double. Можно в другом месте нарваться на засаду.
Терминал точно знает об изменениях, которые произошли с каждым графиком и может дать эту
информацию кастом индикатору. Если в истории произошли серьезные изменения (подкачка,
модификация из history center и тд), то эта функция выдаст 0, что означает - "надо бы с самого
начала все пересчитать от греха подальше". Иначе выдается номер бара, с которого (по мнению
терминала) надо пересчитатать индикатор.
Посмотрите в примерах индикаторов из стандартной поставки - там эта функция вовсю используется.
К сожалению, сейчас у нас абсолютно нет времени заниматься чужими индикаторами - исправляем
ошибки в МetaTrader4.
double slowSC=( 2.0 / (nslow+1));
Данная конструкция с одной стороны смахивает на обычное преобразование типов в С. А с другой стороны больше похоже на переобьявление типа переменной. Просто, раз уж к слову пришлось, не могли бы Вы реализовать в MQL4 С-ишное преобразование типа:
int bbb;
...
bbb=int(aaa);
Или такой реализации не надо? Т.е. можно просто написать bbb=aaa и всё будет Ок, и ошибки не возникнет, и значения переменных будут правильными?
double aaa;
int bbb;
...
bbb=int(aaa);
Вы правы, что нужно преобразование типа, но просто bbb=aaa не получится т.к. вы присваиваете меньшей точноти большую, а в С разрешено обратное.
То Renat
Моей ошибки не было бы, если бы Вы реализовали принудительное приведение типов как это и рекомендуется тем же к&r.
double aaa=10; int bbb=5; bbb=aaa; Print("New bbb=",bbb);
выдаст 10
Сработает как в C/C++ (с выдачей предупреждения о потере точности при автоматическом приведении),
так и в MQL4 (без выдачи предупреждения - преобразования автоматические).
Все будет правильно - работает автоматическое приведение типов.
Это программирование - в нем много засад. И если программист создал конструкцию из целочисленных
вычислений, то именно они(целочисленные вычисления) и должны быть произведены.
fastSC=2/(double(nfast)+1);
то есть достаточно один из членов выражения явно объявить даблом
fastSC=2.0/(nfast+1);
а выражение bbb=int(aaa); полностью аналогично выражению bbb=aaa;
за исключением того, что второе выражение должно генерировать предупреждение при компиляции.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
При работе индикатора получается такой вывод в лог
................
14:15:30 Kaufman2 GBPUSD,H1: ------------------------ 0
14:15:30 Kaufman2 GBPUSD,H1: nfast: 2
14:15:30 Kaufman2 GBPUSD,H1: nslow: 30
14:15:30 Kaufman2 GBPUSD,H1: slowSc: 0
14:15:30 Kaufman2 GBPUSD,H1: fastSc: 0
14:15:30 Kaufman2 GBPUSD,H1: signal: 0.0124
14:15:30 Kaufman2 GBPUSD,H1: noise: 0.0246
14:15:30 Kaufman2 GBPUSD,H1: SSC: 1002
14:15:30 Kaufman2 GBPUSD,H1: AMA0: 1.9198
14:15:30 Kaufman2 GBPUSD,H1: AMA: 1.9198
14:15:30 Kaufman2 GBPUSD,H1: MathPow: 0
14:15:30 Kaufman2 GBPUSD,H1: pos: 65
14:15:30 Kaufman2 GBPUSD,H1: ------------------------ 0
.................................
Т.е. обычная формула
slowSC=(2/(nslow+1));
дает 0;
Где ошибка?