MQL4 - устраняем простые ошибки своими силами

  • Автор темы Автор темы gravity
  • Дата начала Дата начала

gravity

Местный знаток
Решил вот создать тему. Как-то хотел выучить MQL4, прочел весь справочник и видеоуроки смотрел. Но времени, чтобы практикаваться как-то пожалел. Но польза всё таки была и мало-мальскими знаниями я овладел. Думаю будет полезно, за одно и сам чего-нибудь нового узнаю. Глядишь и нормально разбираться начну:)
 

gravity

Местный знаток
Ошибки со старых билдов.

Исправляем ошибку char .

1) Попался индикатор под названием @Ratio_MACD_v3.mq4
2) Кидаем его на график и видим ошибку во вкладке "Эксперты"

334755

3) В навигаторе щелкаем правой кнопкой мыши по нашему индикатору и выбираем "Изменить",щёлкаем левой кнопкой мыши.

334756

4) После этого у нас откроется MetaEditor - это программка предназначена для написания, редактирования кода.
5) Нажимем кнопку "Компилировать"

334757

6) Внизу во вкладке "Ошибки" увидим следующую картину

334758

7) Наводим курсор на первую ошибку и два раза щелкаем левой кнопкой мыши. При этом мы переместимся на строку этой ошибки.

334759

8) Если хотим узнать, почему возникла эта ошибк, нажимаем F1. При нажатии этой клавиши открывается справочник, где в нашем случае мы увидим следующее.

334760

Из этого следует, что (так скажем) слово char выражает, показывает нам какой тип данных перед нами. Иными словами, это слово занято программой и его использовать нельзя.
Вот что по этому поводу говорят на сайте самого mql

h_ttps://www.mql5.com/ru/articles/1391 (уберите черточку после h, чтобы перейти на сайт)

334762

9) Меняем это слово на любое другое, или просто добавляем какой-нибудь символ к нему.
На картинке выше, добавили 1. Я обычно добавляю букву p.

334764

При этом слово становится черного цвета, а не синего как раньше.
В нашем примере всего 9 слов надо исправить.

10) Снова нажимаем кнопку компилировать. Внизу видим, что никаких ошибок нет.

334765

11) Закрываем метаэдитор. Заходим в терминал, кидаем индикатор на график и видим что он работает.

334767
 
Последнее редактирование модератором:

Ugar

Гуру форума
Перед тем как использовать переменную нужно её объявить (захвалить как в игре 1000).
При объявлении надо указать тип и имя переменной, можно сразу присвоить значение.
Типы переменных заданы в языке и определяет свойство переменной (диапазон значений и точность), имя сочиняет программист на своё усмотрение.
Формат: тип имя; или тип имя=значение. Например: int peremennaya=0;
Здесь int тип переменной. Означает что она целочисленная и её значения от -2 147 483 648 до 2 147 483 647. Это можно посмотреть в справочнике. peremennaya это имя переменной. =0 присвоенное значение.
char то же тип целочисленной переменной и её значения от -128 до 127.
Проблема оказалась в том что нельзя в качестве имени переменной использовать тип переменной. В старом языке не было такого типа как char, по этому программист спокойно использовал это имя переменной. В ново языке такое имя использовать нельзя. Именно по этому переименование этих переменных помогло.
 

Dersu

Местный знаток
В силу разных причин основная масса подходит к штанге, пробует и не поднимает
Перед купанием многие стоят в воде
Простые надобности на примерах
1. Ошибки со старых билдов
2. Толщина и цвет линии
3. Ограничение истории
4. Выставление стрелки и отступ
5. Вывод в настройки
6. Как найти буфер сигнала
7. Сообщения
8. Вывод сигнала или обьединение в другой индюк или сов
Это навскидку
Мона дополнять
 

BorisSedov

Активный участник
При изучении любого языка программирования, на начальном этапе, очень полезно решать простейшие задачки.
Напишите скрипт который выводит все числа от 1 до 1000, которые отвечают хотя бы одному условию.
  • Число четное
  • Число оканчивается цифрой 1 (пример 771).
 

gravity

Местный знаток
При изучении любого языка программирования, на начальном этапе, очень полезно решать простейшие задачки.
Напишите скрипт который выводит все числа от 1 до 1000, которые отвечают хотя бы одному условию.
  • Число четное
  • Число оканчивается цифрой 1 (пример 771).
Да все это хорошо и по карйней мере мне интересно. И я благодарен всем кто участвует.
Но как мне кажется, вот эти задачки надо все же перекинуть в тему вопросы по MQL4. А тут оставить конкретные примеры,ситуации, которые возникают у большинства обычных пользователей, как предложил Dersu.

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

BorisSedov

Активный участник
Да все это хорошо и по карйней мере мне интересно. И я благодарен всем кто участвует.
Но как мне кажется, вот эти задачки надо все же перекинуть в тему вопросы по MQL4. А тут оставить конкретные примеры,ситуации, которые возникают у большинства обычных пользователей, как предложил Dersu.

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

gravity

Местный знаток
Ошибки со старых билодов.

Ошибка '.' - semicolon expected - другими словами, недопустимый символ.

334840

1) Открываем индикатор в метаэдиторе, нажимаем "компилировать", видим в окне ошибки. Щелкаем по первой два раза левой кнопкой мыши, попадаем на строку ошибки.
2) Выделяем точку в этой строке, нажимаем "поиск" - "заменить".
334841

3) Откроется окошко. Где в поле "Найти" будет вписана точка, в поле "Заменить на" вписываем какой-либо символ кроме запрещенных $ @ . Нажимаем "Заменить".

334842

Так заменяем точку в строках 40, 43-48

334843

Как вариант, можно вообще просто удалить точку в этих строках, но с заменой быстрее.

4) Далее курсор перейдет на строку, где точка находится между цифрами.
334845

Там и далее пропускаем замену, нажав на кнопку "Найти далее".
5) Далее делаем замену во всех предложенных случаях, в строках от 170 до 227.
6) Все последующие строки, где точка является частью дробного числа, пропускаем.
Просматриваем точки до конца кода, после этого курсор перейдет на начало документа.
7) Нажимаем "Компилировать", если увидим такую картину, то все сделали правильно.
Желтый треугольник это предупреждение, и оно не является критической ошибкой, его можно пропустить.
334850

8) Если там все еще есть ошибки, то значит что-то пропустили. Исправляем.
9) Закрываем редактор и пользуемся индикатором.
334851

Нерабочий индикатор прикрепляю.
 

Вложения

Последнее редактирование модератором:

BorisSedov

Активный участник
В данном примере лучше использовать замену Bars.Count на Bars_Count, чтобы не попадать на точки в числах.
В поле "Найти" вставляем Bars.Count, а в поле "Заменить на" вставляем Bars_Count, это удобнее.
 

gravity

Местный знаток
В данном примере лучше использовать замену Bars.Count на Bars_Count, чтобы не попадать на точки в числах.
В поле "Найти" вставляем Bars.Count, а в поле "Заменить на" вставляем Bars_Count, это удобнее.
Там дело в том, что не только в Bars.Count надо заменить точку, там разных имен еще штук 5.

Чтоб не запутаться где надо,а где нет. Можно щелкать по каждой ошибке в окне ошибок и исправлять по отдельности. Но долго)
 

BorisSedov

Активный участник
Там дело в том, что не только в Bars.Count надо заменить точку, там разных имен еще штук 5.
Чтоб не запутаться где надо,а где нет. Можно щелкать по каждой ошибке в окне ошибок и исправлять по отдельности. Но долго)
В этих вещах всегда нужно искать золотую середину.
 

Ugar

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

gravity

Местный знаток
Ограничение истории (подвал, гистограмма)

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

1) Открываем индикатор в метаэдиторе и находим выведенные настройки индикатора. Они начинаются со слова extern (англ. "внешний")
2) Так как нам тоже надо вывести историю в настройки, мы пишем строку
extern (выводим во внешние настройки)
int (так как количество баров у нас целое число)
CountBars (задаем имя для выводимого параметра, оно и будет видно в настройках)
335084
3) Идем ниже, находим функцию int start ,
(эта функция осталась в индикаторах написанных раньше, на старых билдах.На новыйх функция int OnInit() )
335103
4) И меняем переменную Bars (количество баров на текущем графике) на имя, которое мы задали в строке 33. Меняем его только в выражении Bars-counted_bars. Компилируем.
335104

screenshot_2-jpg.335080


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

gravity

Местный знаток
Ошибки со старых билдов.
По умолчанию не отображаются уровни.

Чтобы исправить, надо просто перекомпилировать индикатор.
Пункты 3 - 5,11.
 

Вложения

  • Не видно уровней.jpg
    Не видно уровней.jpg
    62,8 КБ · Просмотры: 39
  • После перекомпилирования.jpg
    После перекомпилирования.jpg
    81,8 КБ · Просмотры: 38

ecurrencyteam

Новичок форума
If any one want to fix errors in MetaTrader 4 (mq4) indicators, i will try to fix issues for free of cost. based on my free time. I am learning mql coding, for my skills improvement only i am doing this one.
 

gravity

Местный знаток
If any one want to fix errors in MetaTrader 4 (mq4) indicators, i will try to fix issues for free of cost. based on my free time. I am learning mql coding, for my skills improvement only i am doing this one.
Я специально выкладывал не исправленные версии индикаторов, чтобы люди сами исправляли, а не скачивали готовое решение =)
 
Верх