Ваши вопросы по языку MQL4

qqmber

Почетный гражданин
Всем добрый день!
Подскажите пожалуйста.

В индикаторе при выводе на график используется функция WindowPriceMax.
Что бы нагляднее был график используется ее значения для маштабирования выводимой информации. В общем все замечательно но при изменении таймфрейма , WindowPriceMax возвращает значение не текущего окна а предыдущего. К примеру запустили индикатор на D1, WindowPriceMax вернул значение для D1, перешли на H4 WindowPriceMax вернул значение для D1, перешли с H4 на H1 WindowPriceMax вернул значение для H4. Т.о. WindowPriceMax возвращает значение для предыдущего окна а не для текущего. Так и должно быть?
Возможно ли сделать так что бы WindowPriceMax возвращал значения для текущего окна а не для предыдущего?
Так не должно быть, это баг. Перерисовывай на втором тике после инициализации, там уже все нормально. Ну и метаквотам можно отписать.
 
  • Like
Реакции: aufx

qqmber

Почетный гражданин
Совсем недавно начал вникать в MQL и сразу же понял, что стандартной книги не хватает, слишком мало примеров. Если знаете стоящее чтиво - скиньте в ЛС, очень уж хочется изучить этот язык, а программировать через С/С++ слишком уж накладно по времени.

Стоящее чтиво это качественный код, имея базовые представления, тем паче знания С, смотрите как классики пишут, например KimIV, на codebase.mql4.com
 

AlexeyVik

Программист mql4 mql5
Стоящее чтиво это качественный код, имея базовые представления, тем паче знания С, смотрите как классики пишут, например KimIV, на codebase.mql4.com
А мне почему-то не нравится как пишет ким.
Какие-то лишние не нужные переменные втыкает, что-то куда-то переплетается одно с другим... Я посмотрел 1 или 2 его кода и больше не смог.
Мне нравится как пишет Кирилл (Programmer) на форуме Альпари. И его курс по mql4 прилично написан. Я зная только бейсик, по его урокам всё понял за пару недель. А-то и раньше.
 

qqmber

Почетный гражданин
А мне почему-то не нравится как пишет ким.
Какие-то лишние не нужные переменные втыкает, что-то куда-то переплетается одно с другим... Я посмотрел 1 или 2 его кода и больше не смог.
Мне нравится как пишет Кирилл (Programmer) на форуме Альпари. И его курс по mql4 прилично написан. Я зная только бейсик, по его урокам всё понял за пару недель. А-то и раньше.

Ага, Кирилла тоже советую почитать, он очень ответственно относится к делу, и у него практически нет ни технических ни логических ошибок, он Мастер.
 

AlexeyVik

Программист mql4 mql5
Всем добрый день!
Подскажите пожалуйста.

В индикаторе при выводе на график используется функция WindowPriceMax.
Что бы нагляднее был график используется ее значения для маштабирования выводимой информации. В общем все замечательно но при изменении таймфрейма , WindowPriceMax возвращает значение не текущего окна а предыдущего. К примеру запустили индикатор на D1, WindowPriceMax вернул значение для D1, перешли на H4 WindowPriceMax вернул значение для D1, перешли с H4 на H1 WindowPriceMax вернул значение для H4. Т.о. WindowPriceMax возвращает значение для предыдущего окна а не для текущего. Так и должно быть?
Возможно ли сделать так что бы WindowPriceMax возвращал значения для текущего окна а не для предыдущего?

Так не должно быть, это баг. Перерисовывай на втором тике после инициализации, там уже все нормально. Ну и метаквотам можно отписать.
Почему, сразу баг?
А разве не может быть ошибки в коде? В какой момент определяется тф и верхняя граница окна?
У меня есть индикатор с этими WindowPriceMax() и WindowPriceMin() всё работает исправно.
 

aufx

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

Вот пример

#property indicator_chart_window

int start()
{
Alert(WindowPriceMax());
return(0);
}

Где тут может быть ошибка?
 

aufx

Интересующийся
А что-ж ты скрин не приложил с неправильным показанием?

Немного изменив код, что бы было видно таймфрейм
Alert(Period()+" "+WindowPriceMax());

На рисунке во вложении видно что при переходе С D1 на H1
WindowPriceMax не поменял значение, хотя визуально видно
что максимальный размер шкалы больше чем выдал WindowPriceMax
 

Вложения

  • пример.PNG
    пример.PNG
    36,3 КБ · Просмотры: 23

AlexeyVik

Программист mql4 mql5
И всё-таки ты чуток лукавишь.
Этот alert у тебя в init() а не в start(). Не знаю можно-ли называть это багом??? Но, видимо, так устроен МТ. Открыт ТФ, получены все параметры, а когда ты переключаешь на другой ТФ, приоритет выполнения имеет пользовательский код. А такие параметры как WindowPriceMax() определяются позже. Отсюда и показание предыдущее.
Если поставить в start() то с приходом первого тика на новом ТФ показание будет правильным.
 

aufx

Интересующийся
И всё-таки ты чуток лукавишь.
Этот alert у тебя в init() а не в start(). Не знаю можно-ли называть это багом??? Но, видимо, так устроен МТ. Открыт ТФ, получены все параметры, а когда ты переключаешь на другой ТФ, приоритет выполнения имеет пользовательский код. А такие параметры как WindowPriceMax() определяются позже. Отсюда и показание предыдущее.
Если поставить в start() то с приходом первого тика на новом ТФ показание будет правильным.

Alert "стоит" в start

#property indicator_chart_window

int start()
{
Alert(Period()+" "+WindowPriceMax());
return(0);
}


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

AlexeyVik

Программист mql4 mql5
Ну пусть даже в старте. Я почему-то проверит решил в советнике, а старт не исполняется без тиков. Смотри в понедельник.
Вот мои строки из индикатора
Код:
            if(Corner < 0  || Bid > (WindowPriceMax()+WindowPriceMin())/2+5*Point)
             {
              y1 = 4.1+Y_order;
              y2 = 4.1-Y_order;
              [B]corn = 3;[/B]
             }
       else if(Corner >= 0 && Bid < (WindowPriceMax()+WindowPriceMin())/2-5*Point)
        {
         [B]corn = 1;[/B]
         y1 = 4.1-Y_order;
         y2 = 4.1+Y_order;
        }
Всё работает правильно. Здесь определяется в какой угол разместить информацию. В нижний правый или верхний правый.
 
Последнее редактирование:

qqmber

Почетный гражданин
Это на самом деле давно известный баг или не баг, смотря с чьей стороны смотреть.
На первом тике индикатор еще не знает, какие у него WindowPrice*, метаквоты считают, что это правильно, типа особенность индикаторов.
Я считаю, можно было бы в init() все уже выяснить.
Скрипты и эксперты этой особенности не имеют, у них все будет ОК.
 

AlexeyVik

Программист mql4 mql5
Это на самом деле давно известный баг или не баг, смотря с чьей стороны смотреть.
На первом тике индикатор еще не знает, какие у него WindowPrice*, метаквоты считают, что это правильно, типа особенность индикаторов.
Я считаю, можно было бы в init() все уже выяснить.
Скрипты и эксперты этой особенности не имеют, у них все будет ОК.
То-есть как не имеют? Скрипты, ладно. Там нет необходимости переключать ТФ во время выполнения кода. А в советниках при переключении ТФ то-же самое. Выполняется init() а потом собирается информация о состоянии окна и т.д. Тут и получишь WindowPriceМах / Min с предыдущего ТФ.
А как правильно, что должно иметь выше приоритет... Раз-на-раз не приходится. Если будет какая-то задержка в выполнении кода советника, то начнутся претензии с другой стороны. В общем надо подстраиваться к реалиям.
 

qqmber

Почетный гражданин
То-есть как не имеют? Скрипты, ладно. Там нет необходимости переключать ТФ во время выполнения кода. А в советниках при переключении ТФ то-же самое. Выполняется init() а потом собирается информация о состоянии окна и т.д. Тут и получишь WindowPriceМах / Min с предыдущего ТФ.
А как правильно, что должно иметь выше приоритет... Раз-на-раз не приходится. Если будет какая-то задержка в выполнении кода советника, то начнутся претензии с другой стороны. В общем надо подстраиваться к реалиям.

Советники получают правильный WindowPriceМах / Min на первом тике. Это торговый поток, там гарантируется корректное окружение.
Индикаторы получают его на втором. Это понятно почему для индикаторов _separate_window, но не для _chart_window. Возможно, есть неопубликованные сложности, заставляющие одинаково обрабатывать оба вида.
 

AlexeyVik

Программист mql4 mql5
Так ты-же говоришь о получении этих данных в init()
Я считаю, можно было бы в init() все уже выяснить.

а не на первом тике.
На первом тике и в советнике и в индикаторе покажет правильно.
Дело всё в целесообразности проверять/получать WindowPriceМах на каждом тике. А с другой стороны, если поставить проверку переключения ТФ то это опять-же не будет быстрей выполняться чем WindowPriceМах()
Потому я и говорю о приоритете выполнения, что важней, собрать информацию которой не часто пользуются или выполнить код советника в котором открытие, закрытие и модификация ордеров.
 

Britozavr

Заблокирован
Скажите дорогие программисты

возможно ли вывести инфу в отдельном индикаторе о количестве бычьих или медвежьих свечей на истории равных по цвету линии индикатора последней свечи данного таймфрейма. То есть если индикатор отображает 5 свечу медвежьего тренда в подряд красным цвеном, как вывести цифру пять?
 

AlexeyVik

Программист mql4 mql5
возможно ли вывести инфу в отдельном индикаторе о количестве бычьих или медвежьих свечей на истории равных по цвету линии индикатора последней свечи данного таймфрейма. То есть если индикатор отображает 5 свечу медвежьего тренда в подряд красным цвеном, как вывести цифру пять?
http://docs.mql4.com/ru/constants/wingdings
Код значка 133 или 144
 

Britozavr

Заблокирован
Мне не нужен код значков. Мне нужна цифра о количестве свеч равных бычьему или медвежьему пересечению линий индикатора.
 

AlexeyVik

Программист mql4 mql5
Мне не нужен код значков. Мне нужна цифра о количестве свеч равных бычьему или медвежьему пересечению линий индикатора.
Кто ясно мыслит, тот ясно излагает. ©
Выделенное я понял так, что надо посчитать и тебе сообщить.:D
Ну извини если я ошибся.
 
Верх