Форум » Индикаторы. » Почему мой индикатор не обновляет значения (см. видео)? » Ответить

Почему мой индикатор не обновляет значения (см. видео)?

genbachae: Написал индикатор [MT4] (скачатьhttp://www.uganskbuy.ru/downloads/soft/IndikNaprTrend_v1_5.mq4), кидаю в окно он благополучно отмечает вершины и провалы цены, но в процессе работы на вновь нарисованных свечах ничего не отмечает. Подробности на видео (5 Мб): видеоhttp://www.uganskbuy.ru/downloads/video/ ErrorMyIndicatorMT4.avi Помогите пожайлуста разобраться, в чём ошибка, сам ума не приложу, где она?

Ответов - 7

Scriptong: Скачал, посмотрел. На вновь появляющихся свечах индикатор отображает новые значения. Возможно, не понял суть ошибки, т.к. видео посмотреть не могу - выдает ошибку.

SK: В функции Start() есть такой код: Counted_bars=IndicatorCounted(); // Количество просчитанных баров j=Bars-Counted_bars-1; // Индекс первого непосчитанного while(j>=0) // Цикл по непосчитанным барам В обычном режиме вычисления производятся на каждом новом баре. Это значит, что j не поднимается выше значения 1. В редких случаях j может получить значение 2 (если сервер застревал, а потом выдал подряд пару баров, кот. и нужно пересчитать). Далее (я не стал разбираться зачем именно) значение j передаётся в функцию Opening(), где вычисляется следующее: int rez, rez2; if(j>=Interval) { rez = NaprTrend(j-Interval, Power); }else { rez = NaprTrend(j, Power); } Значение Interval задано в головной части: extern int Interval = 5; // Интервал анализа направления тренда Понятно, что результатом вычисления if(j>=Interval) всегда будет false, т.е. переменная res никогда не получит никакого значения, отличного от исходного 0, полученного при инициализации. И дальнейшие строки в функции Opening() не будут исполнены, т.к. их исполнение зависит от ненулевого res. Сама функция Opening() при этом возвращает 0. В операторе switch(rez) нет case = 0, т.е. буфера ничем не наполняются .. со всеми вытекающими последствиями. При первом включении, когда j большой, т.е. нужно просчитывать много баров истории, всё и расчитывается. А на новых нулевых барах ничего не считается.. в соответствии с кодом if(j>=Interval). Получается, что на новых барах индикатор может что-то построить только в случае, если на сервере была длительная задержка трафика, а потом разом выдано несколько баров общим количеством не меньше, чем Interval. Полагаю, причина в этом. Добавлено: Технология пересчёта нового бара, а именно, значение, возвращаемое функцией IndicatorCounted(), в процессе развития MQL 4 менялась. Возможно, в последних билдах МТ 4 это значение не меньше 2. (ошибка в представленном коде всё равно остаётся, но для построения точного кода рекомендуется проверить и это)

genbachae: Сейчас разбираюсь с кодом Кстати, рабочая ссылкавот правильная ссылка на видео!


genbachae: Добавил строчку в код индикатора: if(j<2){j=100;} После этого на свечах в диаппазоне: от 0 до 100, то появляются крестики, то пропадают, подобно тому как это происходит на видео, только теперь не нужно обновлять настройки индикатора вручную, всё происходит автоматически. Как это возможно, ведь я принимаю решение о том, ставить или не ставить крестик над/под свечёй на основе анализа предыдущих 5 свечей считая от текущей? Если поймаю момент, то выложу видео где будет видно как это происходит.

genbachae: SK пишет: Понятно, что результатом вычисления if(j>=Interval) всегда будет false нет не всегда, я думаю что этот участок кода не влияет на ту проблему что я здесь обозначил. Это условие необходимо для корректной работы индикатора у левого края экрана.

Scriptong: Посмотрел код. Проблема проста - неправильный подсчет начального номера бара. Если внимательно посмотреть справку по MQL4 (IndicatorCounted), то можно найти следующий код: int limit; int counted_bars=IndicatorCounted(); //---- последний посчитанный бар будет пересчитан if(counted_bars>0) counted_bars--; limit=Bars-counted_bars; В представленном индикаторе этот код, видимо, решено было оптимизировать. Но ошиблись со знаком: Counted_bars=IndicatorCounted(); // Количество просчитанных баров j=Bars-Counted_bars-1; // Индекс первого непосчитанного В итоге, если IndicatorCounted возвращает Bars, переменная j получает значение -1 вместо значения 0 и цикл while попросту не исполняется. Правильный вариант этого участка кода, при котором описанная проблема исчезает (проверено), будет таким: Counted_bars=IndicatorCounted(); // Количество просчитанных баров if (Counted_bars > 0) Counted_bars--; j=Bars-Counted_bars; // Индекс первого непосчитанного

genbachae: В итоге, если IndicatorCounted возвращает Bars, переменная j получает значение -1 вместо значения 0 и цикл while попросту не исполняется. Правильный вариант этого участка кода, при котором описанная проблема исчезает (проверено), будет таким: Да действительно, теперь работает.



полная версия страницы