АвторСообщение



Пост N: 3
Зарегистрирован: 04.11.11
ссылка на сообщение  Отправлено: 04.11.11 13:37. Заголовок: Почему мой индикатор не обновляет значения (см. видео)?


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


Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 7 [только новые]


постоянный участник


Пост N: 222
Зарегистрирован: 03.09.09
ссылка на сообщение  Отправлено: 04.11.11 15:26. Заголовок: Скачал, посмотрел. Н..


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

Спасибо: 1 
ПрофильЦитата Ответить
Автор




Пост N: 914
Зарегистрирован: 21.05.06
Откуда: Украина, Днепропетровск
ссылка на сообщение  Отправлено: 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.
(ошибка в представленном коде всё равно остаётся, но для построения точного кода рекомендуется проверить и это)

Спасибо: 1 
ПрофильЦитата Ответить



Пост N: 4
Зарегистрирован: 04.11.11
ссылка на сообщение  Отправлено: 07.11.11 07:23. Заголовок: Спасибо за ответ


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

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 6
Зарегистрирован: 04.11.11
ссылка на сообщение  Отправлено: 10.11.11 13:28. Заголовок: Попыталься исправить, но не получилось



Добавил строчку в код индикатора:

 цитата:
if(j<2){j=100;}


После этого на свечах в диаппазоне: от 0 до 100, то появляются крестики, то пропадают, подобно тому как это происходит на видео, только теперь не нужно обновлять настройки индикатора вручную, всё происходит автоматически.
Как это возможно, ведь я принимаю решение о том, ставить или не ставить крестик над/под свечёй на основе анализа предыдущих 5 свечей считая от текущей?
Если поймаю момент, то выложу видео где будет видно как это происходит.


Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 7
Зарегистрирован: 04.11.11
ссылка на сообщение  Отправлено: 10.11.11 13:31. Заголовок: Ответ на Ваш пост


SK пишет:

 цитата:
Понятно, что результатом вычисления if(j>=Interval) всегда будет false



нет не всегда, я думаю что этот участок кода не влияет на ту проблему что я здесь обозначил. Это условие необходимо для корректной работы индикатора у левого края экрана.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост 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; // Индекс первого непосчитанного





Спасибо: 1 
ПрофильЦитата Ответить



Пост N: 8
Зарегистрирован: 04.11.11
ссылка на сообщение  Отправлено: 11.11.11 12:36. Заголовок: Теперь работает нормально



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


Да действительно, теперь работает.

Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 0
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет