Ошибки в функции WindowFirstVisibleBar().

 
Обнаружил не приятную ошибку в функции WindowFirstVisibleBar().
Почему-то при переключениях ТФ от MN1 до Н1 функция выдаёт слишком большие значения.
При переключениях отМ1 до MN1 всё в порядке.
Прикрепил файл с контролем этой функции через комент. Попробуйте.
Большая просьба к Метаквотам, исправить это к следующему билду МТ4.
 

но когда он на автопрокрутке, это непонятно, с приходом нового тика все встает на свои места:)



Всё очень просто. Поступает тик, все индикаторы пересчитываются, только потом идёт команда на перерисовку графика. Во время перерисовки значение первого видимого бара может сбиться.

Прошу меня извинить. Вместо нажатия на кнопку "ответить" нажал на правку и безвозвратно отредактировал Ваше сообщение. Слава.


Ничего, бывает, не суть важно здесь:)

 
xnsnet:

Она помойму выдает во всех переходах, от большего к меньшему слишком большие значения:)

Вот что отвечают Метаквоты.
=======
К сожалению, не удаётся воспроизвести Вашу проблему.
Количество баров, которое возвращает функция WindowFirstVisibleBar(), на > всех таймфреймах при одном и том же масштабе одинаковое.
Пришлите, пожалуйста, Ваш код.

Ваш код работает так, как должен работать.
Возможно дело в том, что функция Start() выполняется только при приходе нового тика, а не при переключении на другой таймфрейм.
Попробуйте прикрепить Ваши индикатор к графику с быстрыми движениями, и проверьте ещё раз.
=======
Я так понимаю, это стандартный ответ у них?
Они так отвечают на любой вопрос?
 

Вы хотя бы примерно представляете, как это работает? Поменяли Вы таймфрейм, график перерисовался, индикатор пересчитался и выдал значение первого видимого бара. И вдруг (у большинства включен автоскроллинг графика) неожиданно график возьми и скакни назад. А индикатор-то не пересчитался!

Или другой момент. Индикатор пересчитался и показал правильное значение первого видимого бара. График не дёргается. И тики не приходят. Раз тики не приходят, то индикатор и не пересчитывается. Вы будете листать график туда-сюда, а значение, выведенное в коммент, меняться не будет. Сюрприз?

Это поведение уже обсуждалось. Надо было просто поискать. Здесь или на основном форуме http://www.metatrader4.com/ru/forum

 
Согласен, логично!
 
stringo:

Вы хотя бы примерно представляете, как это работает? Поменяли Вы таймфрейм, график перерисовался, индикатор пересчитался и выдал значение первого видимого бара. И вдруг (у большинства включен автоскроллинг графика) неожиданно график возьми и скакни назад. А индикатор-то не пересчитался!

Или другой момент. Индикатор пересчитался и показал правильное значение первого видимого бара. График не дёргается. И тики не приходят. Раз тики не приходят, то индикатор и не пересчитывается. Вы будете листать график туда-сюда, а значение, выведенное в коммент, меняться не будет. Сюрприз?

Это поведение уже обсуждалось. Надо было просто поискать. Здесь или на основном форуме http://www.metatrader4.com/ru/forum

Конечно не представляю как работает. Потому и спрашиваю.
Автоскроллинг включён.
И это не объясняет почему при разных направлениях переключения разные результаты.
 

Я думаю что есть некоторые проблеммы в последовательности обработки, поэтому событие приходит пойзже, а ведь сначала отрисовка по позиции, а только потом авто скролинг перетягивает график, хотя исправить я думаю это можно было бы, вопрос в другом ради чего. Что касаемо тиков, то о пролистывании я вообще молчу, тики не событие графика, а событие сервера, которое от клиента никак не зависит. При смене ТФ происходит реинициализация. А start насколько я помню обрабатывается без прихода тика только на индикаторе и в скрипте при старте, если я ошибаюсь поправьте меня, насколько я так же помню, старт при старте индикатора повторяется по количеству баров в окне, отрисовывая, а затем уже выполняются операции по передвижению позиции к концу автоскролом.

 
xnsnet:

Я думаю что есть некоторые проблеммы в последовательности обработки, поэтому событие приходит пойзже, а ведь сначала отрисовка по позиции, а только потом авто скролинг перетягивает график, хотя исправить я думаю это можно было бы, вопрос в другом ради чего. Что касаемо тиков, то о пролистывании я вообще молчу, тики не событие графика, а событие сервера, которое от клиента никак не зависит. При смене ТФ происходит реинициализация. А start насколько я помню обрабатывается без прихода тика только на индикаторе и в скрипте при старте, если я ошибаюсь поправьте меня, насколько я так же помню, старт при старте индикатора повторяется по количеству баров в окне, отрисовывая, а затем уже выполняются операции по передвижению позиции к концу автоскролом.

Думаю, что исправить конечно же надо раз есть такая функция.
А для чего...
Применяю нормализацию по длине видимой части графика.
При переключении ТФ WindowFirstVisibleBar() выдаёт значения, которые за тем попадают в функцию поиска максимумов и минимумов.
Наверно понимаете к чему это приводит?
 
#property indicator_chart_window
#include <WinUser32.mqh>
int start()
{
int WFVB = WindowFirstVisibleBar();
if (WFVB > 500) PostMessageA (WindowHandle (Symbol(), Period()), WM_COMMAND, 33324, 0);
Comment ("WindowFirstVisibleBar() = ", WFVB);
return(0);
}
Сделал так.
Условие конечно условно. В моей программе оно другое.
Маразм конечно...
 

Мы не будем исправлять это поведение. Некоторое время назад индикаторы пересчитывались на каждый чих, при каждой перерисовке графика. Потом мы убрали эту тормозуху.

Отгадайте с трёх раз что важнее: правильная работа одной функции (предназначенной для скриптов) в одном индикаторе или экономичный пересчёт всех индикаторов?

Изначально эта функция предназначалась для скриптов, так как их можно безболезненно зацикливать. Порядок выполнения индикаторов и экспертов не предполагает безупречного выполнения функции WindowFirstVisibleBar.

А если Вы не представляете как это всё работает, добро пожаловать в документацию по MQL4. Там подробно всё описано, особенно здесь https://docs.mql4.com/ru/runtime/start

 
Я вот тоже бьюсь над этой проблемой:
Посмотрите, пожалуйста, внимательно: иногда при переключении тайм-фрейма показывает правильное значение, а иногда нет. Причем этот эффект проявляется в основном при переключении от старших тайм-фреймов к младшим. Неужели это правильная работа ф-ции? Исправление действительно происходит с приходом первого тика. Но уже ДО этого ф-ция ОБЯЗАНА показывать ПРАВИЛЬНОЕ значение. Почему сразу этого не происходит? Почему при переключении таймфрейма идет НЕПРАВИЛЬНАЯ обработка ф-ции start(). И только при приходе нового тика и повторном вызове ф-ции start() ситуация нормализуется? Почему при двух вызовах start() ф-ция возвращает совершенно РАЗНЫЕ значения? Что происходит между этими двумя событиями? Или ВЫ считаете ЭТО правильным поведением ф-ции?

И еще:
Если, как вы утверждаете функция Start() выполняется только при приходе нового тика,
то почему при переключении тайм-фрейма ДО прихода нового тика показания ф-ции УЖЕ меняются?

Не надо делать "пересчет индикатора на каждый чих". Просто сделайте одинаковой последовательность обработки событий при загрузке индикатора и при переключении тайм-фрейма. Потому-что при переключении тайм-фрейма чего-то не хватает.

С уважением.
Причина обращения: