Изучаем язык программирования MQL4

BorisSedov

Активный участник
Тема создана для начинающих изучение языка программирования MQL4.

Рассматривая и изучая материал который рекомендуют опытные программисты в этой теме.
Решая простейшие задачи, шаг за шагом, вы научитесь самостоятельно создавать советники, индикаторы и скрипты для терминала MT4.
Самый простой в понимании и применении стиль программирования (по моему мнению), это процедурный стиль, в котором из объектов широко используются только функции (процедуры).

Чем хорош процедурный стиль программирования для начинающих?
Этот стиль программирования очень прост в изучении и понимании.

Начинающим очень полезно прочитать и понять следующие разделы Справочника MQL4.
В редакторе "MetaEditor 4" - Меню - Справка - Справочник MQL4

  • Основы языка
    • Типы данных
      • Целые типы
        • Типы char, short, int и long
        • Тип datetime
        • Тип bool
      • Вещественные типы (double, float)
      • Тип string
    • Операции и выражения
      • Выражения
      • Арифметические операции
      • Операции присваивания (до выражения y %= x; включительно)
      • Операции отношения
      • Логические операции
    • Операторы
      • Условный оператор if-else
      • Оператор-переключатель switch
      • Оператор цикла while
      • Оператор цикла for
      • Оператор завершения break
      • Оператор продолжения continue


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

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

Возможно многие из нас когда-то мечтали научиться программировать в будущем.
Будущее на много ближе чем мы думаем.
 
Последнее редактирование модератором:

BorisSedov

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

Юлия

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

BorisSedov

Активный участник
Борис, хорошо бы пример, от которого отталкиваться при написании. А так, неизвестно, куда лезть в справочнике-то. Поможете?
Для решения данной задачи нам понадобится одна переменная int для перебора всех чисел от 1 до 1000, один цикл for и одно условие if внутри цикла. В условие мы помещаем два выражения, в которых проверяем является ли число четным или оканчивается ли число цифрой 1. Если одно из проверяемых условий соответствует, то выводим число при помощи функции Print.

C++:
#property strict

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
int i;

for(i=1; i<=1000; i++)
   {
   if(i%2==0 || i%10==1) Print(i);
   }
}
//+------------------------------------------------------------------+

Если у кого-то есть вопросы для уточнения или не совсем понятны выражения в условии, пожалуйста спрашивайте в этой теме. Только через поиск ответов, и через преодоление трудностей, мы чему то учимся.
 
Последнее редактирование:

BorisSedov

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

  • Число должно быть нечетным.
    (или)
  • Число должно оканчиваться цифрами 44 (примеры: 344, 944).

Свои решения выкладывайте в любом удобном виде, но будет хорошо если решение спрятано в Спойлер.
;)
 
Последнее редактирование:

BorisSedov

Активный участник
Может вот это добавить в первое сообщение. Видео уроки по MQL4.
Это видео, а также многие другие видео, можно рекомендовать для ознакомления.

gravity, попробуйте решить аналогичную задачу с измененными условиями.
Если что-то непонятно, пожалуйста спрашивайте.
 

gravity

Местный знаток
Это видео, а также многие другие видео, можно рекомендовать для ознакомления.

gravity, попробуйте решить аналогичную задачу с измененными условиями.
Если что-то непонятно, пожалуйста спрашивайте.
Мне в первой задаче не понятно, как это все вычислилось в {теле цикла}
% - остаток от деления, из справочника. Это тоже самое что деление или как понять.
Надо разобрать скрипт по косточками.

Немного прокомментировал, чтобы было понятнее.
C-подобный:
void OnStart()  // Событие Start – это специальное событие для активизации скрипта после его загрузки. Это событие обрабатывается функцией OnStart.
  {             // Должна иметь тип void, параметров не имеет:
//---
   int i;                  // объявляем целый тип числа и присваиваем ему имя i

for(i=1; i<=1000; i++)     // объявляем оператор цикла for (выражение1;выражение2;выражение3)
                           // i=1, пока i больше или равно 1000 - будет выполнятся тело цикла for заключенное в {},
                           // i++ означает что прибавляем единицу к i=1 после каждой итерации(повторения действия)
   {
   if(i%2==0 || i%10==1) Print(i);
   }
  }
//+------------------------------------------------------------------+
 
Последнее редактирование:

gravity

Местный знаток
Нашел. % означает.

2 может поместиться в 1 ни одного раза=0 да
2 может поместиться в 2 один раз, остаток=0 да
2 может поместиться в 3 один раз, остаток=1
2 может поместиться в 4 два раза, остаток=0 да
5%2=1==0
6%2=0==0 да
7%2=1==0
8%2=0==0 да
9%2=1==0
10%2=0==0 да
11%2=1==0

Печатаем в журнале 1,2,4,6,8,10.
Или в первом случае не так, при 1 будет 1?

Получается, что при не четных числах, кроме 1, всегда будет остаток 1. и не будет выполнено условие 0==0.

1%10 = 0 ==1
10%10 = 0 ==1
11%10 = 1 ==1 условие выполнено.
12%10 = 2 ==1
13%10 =3 ==1
20%10 =0 ==1
21%10=1==1 условие выполнено.

Не понял че-то я логику.
 
Последнее редактирование:

BorisSedov

Активный участник
Не понял че-то я логику.
Логика очень простая, в цикле происходит перебор значений от 1 по возрастанию до тех пор, пока значение переменной i меньше или равно 1000. А в теле цикла мы в одно условие поместили два выражения для проверки.

if(i % 2 == 0 || i % 10 == 1) Print(i);
Это условие читается так:
если остаток от деления числа i на число 2 будет равен 0, то это условие выполнено (число четное, делится на 2 нацело).
|| (или)
если остаток от деления числа i на число 10 будет равен 1, то это условие выполнено (число оканчивается цифрой 1).
При выполнении одного из двух условий, срабатывает вывод числа в результаты.

i % 2 == 0 (проверка первого условия)
i делим на 2 и берем остаток от этого деления.
Если i = 1, то при делении на 2, остаток будет 1.
Если i = 2, то остаток 0, потому что делится нацело.
Если i = 3, то остаток снова 1, и т.д. с постоянным чередованием - четное/нечетное.

i % 10 == 1 (проверка второго условия)
При делении i на 10, мы хотим проверить последнюю цифру в числе, нас интересует цифра 1.
Если i = 11, то остаток от деления на 10 будет 1. Это и есть последняя цифра.

Например мы проверяем число 25 на наши два условия. Число должно быть четное или оканчиваться на 1.
25 % 2 = 1, остаток от деления числа 25 на число 2 равен 1, значит 25 нечетное, это условие не подходит.
25 % 10 = 5, а нам нужна цифра 1, это условие тоже не соблюдается, значит число 25 не будет выведено в результаты.

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

BorisSedov

Активный участник
Отмечу некоторые моменты из теории.

По типам данных.
Из целых типов, наиболее часто используются типы int, datetime и bool.
А из типов для хранения чисел с плавающей точкой, наиболее часто используется тип double.
Тип данных string, используется для работы со строками.

По циклам.
Если в программе нужно использовать циклы, то достаточно знать только оператор for.

Оператор switch, на начальном этапе, можно также не использовать.

Для организации в своей программе проверки каких-то условий нужно использовать оператор if.

Подведем итог.
Чтобы программировать на MQL4, нужно уметь использовать переменные типов int, datetime и bool, для хранения целых чисел, а также переменные типа double, для хранения чисел с плавающей точкой. Чтобы работать со строками, нужно уметь использовать переменные типа string. Для использования циклов в программе, нужно уметь использовать оператор for. А для проверки разных условий нужно уметь использовать оператор if.
Это тот минимум, который позволит вам создавать свои советники, индикаторы и скрипты.
 
Последнее редактирование:

gravity

Местный знаток
Прочитав минимум теории из первого сообщения темы, вы будете понимать как использовать арифметические операции для вычислений или проверки условий в вашей программе.
А почему в журнале начинает выводить числа, то с 612, то с 500 скольки, то с 700 c чем то? Каждый раз по разному.
 

Вложения

  • Screenshot_1.jpg
    Screenshot_1.jpg
    12,5 КБ · Просмотры: 16

BorisSedov

Активный участник
А почему в журнале начинает выводить числа, то с 612, то с 500 скольки, то с 700 c чем то? Каждый раз по разному.
Когда выводится много строк, первые строки скрываются и чтобы прочитать все выведенные строки нужно открыть файл журнала, в нем находятся все эти строки. Открыть файл журнала просто - нажимаем правой кнопкой мыши по любой строчке из журнала и далее нужно выбрать в контекстном меню пункт "Открыть". После этого откроется каталог, где нужно найти и открыть самый последний файл. Все файлы в каталоге подписаны датой и можно легко разобраться какой из них последний. В файле журнала, самая новая информация расположена в нижней части файла.
 
Последнее редактирование:

gravity

Местный знаток
i % 2 == 0 (проверка первого условия)
i делим на 2 и берем остаток от этого деления.
Если i = 1, то при делении на 2, остаток будет 1.
Если i = 2, то остаток 0, потому что делится нацело.
Если i = 3, то остаток снова 1, и т.д. с постоянным чередованием - четное/нечетное.

Почему когда 1%2, остаток будет=1?
 

BorisSedov

Активный участник
Надеюсь
Почему когда 1%2, остаток будет=1?
Потому что 1 делить на 2 будет 0 целых плюс остаток 1.
1 % 2, дает нам остаток от деления равный 1.
Вспоминайте деление уголком из начальной школы, когда после деления получали результат – сколько-то целых и остаток.
Это из этой оперы. :)
А какой остаток будет тут:
0 % 2 ?
Остаток 0, значит число 0 четное. :)
 
Последнее редактирование:

gravity

Местный знаток
Надеюсь

Потому что 1 делить на 2 будет 0 целых плюс остаток 1.
1 % 2, дает нам остаток от деления равный 1.
Вспоминайте деление уголком из начальной школы, когда после деления получали результат – сколько-то целых и остаток.
Это из этой оперы. :)
Вот так понятнее, нашел в гугле :)

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