Автор | Сообщение |
|
| |
Пост N: 3
Зарегистрирован: 04.11.11
|
|
Отправлено: 04.11.11 13:37. Заголовок: Почему мой индикатор не обновляет значения (см. видео)?
|
|
|
Ответов - 7
[только новые]
|
|
|
| постоянный участник
|
Пост N: 222
Зарегистрирован: 03.09.09
|
|
Отправлено: 04.11.11 15:26. Заголовок: Скачал, посмотрел. Н..
Скачал, посмотрел. На вновь появляющихся свечах индикатор отображает новые значения. Возможно, не понял суть ошибки, т.к. видео посмотреть не могу - выдает ошибку.
|
|
|
|
Отправлено: 04.11.11 18:43. Заголовок: В функции Start() е..
В функции 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. (ошибка в представленном коде всё равно остаётся, но для построения точного кода рекомендуется проверить и это)
|
|
|
|
| |
Пост N: 4
Зарегистрирован: 04.11.11
|
|
Отправлено: 07.11.11 07:23. Заголовок: Спасибо за ответ
|
|
|
|
| |
Пост N: 6
Зарегистрирован: 04.11.11
|
|
Отправлено: 10.11.11 13:28. Заголовок: Попыталься исправить, но не получилось
Добавил строчку в код индикатора: После этого на свечах в диаппазоне: от 0 до 100, то появляются крестики, то пропадают, подобно тому как это происходит на видео, только теперь не нужно обновлять настройки индикатора вручную, всё происходит автоматически. Как это возможно, ведь я принимаю решение о том, ставить или не ставить крестик над/под свечёй на основе анализа предыдущих 5 свечей считая от текущей? Если поймаю момент, то выложу видео где будет видно как это происходит.
|
|
|
|
| |
Пост N: 7
Зарегистрирован: 04.11.11
|
|
Отправлено: 10.11.11 13:31. Заголовок: Ответ на Ваш пост
SK пишет: цитата: | Понятно, что результатом вычисления if(j>=Interval) всегда будет false |
| нет не всегда, я думаю что этот участок кода не влияет на ту проблему что я здесь обозначил. Это условие необходимо для корректной работы индикатора у левого края экрана.
|
|
|
|
| постоянный участник
|
Пост N: 233
Зарегистрирован: 03.09.09
|
|
Отправлено: 10.11.11 21:17. Заголовок: Посмотрел код. Проб..
Посмотрел код. Проблема проста - неправильный подсчет начального номера бара. Если внимательно посмотреть справку по 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; // Индекс первого непосчитанного |
|
|
|
|
|
| |
Пост N: 8
Зарегистрирован: 04.11.11
|
|
Отправлено: 11.11.11 12:36. Заголовок: Теперь работает нормально
цитата: | В итоге, если IndicatorCounted возвращает Bars, переменная j получает значение -1 вместо значения 0 и цикл while попросту не исполняется. Правильный вариант этого участка кода, при котором описанная проблема исчезает (проверено), будет таким: |
| Да действительно, теперь работает.
|
|
|
|