Уроки MQL4 для начинающих

mql4 программирование пошаговая инструкция, для начинающих, чайников, новичков

Содержание:

  1. Первое знакомство с MQL4

  2. Исходный код и компиляция программы

  3. Переменные MQL4

  4. Комментарии в коде программы MQL4

  5. Работа с переменными в MQL4

  6. Функции MQL4

  7. Массивы в MQL4

  8. Предопределенные массивы и переменные MQL4

  9. Оператор цикла for

  10. Условный оператор if ... else

  11. Функция Print()

  12. Операторы сравнения в MQL4

  13. Логические операции && и ||

  14. Группировка условий

 Первое знакомство с MQL4

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

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

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

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

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

Все эти программы мы напишем в специальном редакторе - MetaEditor 4 . Чтобы использовать его, вы должны сначала установить терминал MetaTrader 4 (MT4), который можно загрузить здесь. После его установки вы увидите окно терминала на мониторе, которое будет выглядеть следующим образом (рис. 1).

терминал мт4 - основное окно

Если вы хотите изменить язык терминала на русский, то в строке меню нажмите на вторую вкладку «Вид» , затем наведите курсор мыши на «Языки» , в раскрывающемся списке выберите «Русский», и после перезапуска терминала язык будет изменен.

Чтобы запустить MetaEditor 4, в открытом терминале на клавиатуре нажмите F4 или в строке меню нажмите "Сервис", а затем Редактор языка MQL4 или нажмите специальный значок в терминале

вызов редактора mql4

  • Может возникнуть вопрос, а можно ли установить MetaEditor 4 без необходимости установки MT4? 

Нет. Он является неотъемлемой частью терминала и не будет работать без него. 

  • Также может возникнуть второй вопрос: можно ли использовать другие редакторы для создания программ для MT4? 

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

После запуска MetaEditor 4 появится окно этого редактора

Окно MetaEditor 4.

Чтобы изменить язык на русский, нажмите на вкладку «Вид» в строке меню , наведите курсор мыши на «Языки» , нажмите на «русский» в раскрывающемся списке, и после перезапуска язык будет установлен на «русский». Чтобы создать новую программу, нажмите кнопку «Создать» в верхней левой части редактора или нажмите Ctrl + N на клавиатуре

создаем программу на mql4

Появится окно, в котором вы должны выбрать тип программы, которую хотите создать. Выберите «Скрипт» и нажмите «Далее»

окно выбора типа программы mql4

В следующем окне в поле «Имя» введите имя сценария, например, «Тест» . При желании вы можете ввести свое имя в поле « Автор» , а также  заполнить поле  «Ссылка»

создаем скрипт на mql4

После нажатия кнопки «Готово» появится окно с исходным кодом. Видите ли, даже пустой свежеиспеченный скрипт уже содержит некоторый код. В окне "Навигатор" , которое находится в левой части редактора на рисунке 8 ниже, вы можете видеть, что этот файл скрыт в папке с именем Scripts.

Если вы хотите найти этот файл на жестком диске, щелкните правой кнопкой мыши имя файла в окне навигатора и выберите «Открыть папку» (рис. 9). Если навигатор исчез какой - то причине, он вызывается нажатием кнопки в строке меню "Вид" -> "Навигатор"  или комбинацию клавиш Ctrl + D .

открыть папку со скриптом

Теперь все готово для написания программ на MQL4.

Исходный код и компиляция

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

В строках с 1 по 5 после символов двойной косой черты // есть комментарий. Собственно комментарий и обозначается //

 Записи Test.mq4 - это имя файла и его тип, остальное - это информация, которая была сохранена при создании файла. 

Далее, в строках с 6 по 9, вы можете увидеть четыре записи, которые начинаются со слова #property. Это так называемая директива препроцессора. Эта запись определяет некоторые свойства будущей программы. При создании сценария были добавлены четыре директивы, которые содержат четыре свойства: 

  • авторское право - автор программы, 
  • ссылка- ссылка на сайт автора. 
  • Следующее свойство version является версией программы. При создании новой программы версия «1,00» будет введена автоматически . 
  • Четвертое свойство strict - очень важный элемент программы.  #property strict подтверждает использование компилятора MQL4.

Прежде чем начать писать какую-либо программу, вы должны понять одну очень важную вещь. В MetaEditor 4 вы пишете исходный код, то есть последовательность команд, которые будут выполняться одна за другой. Однако терминал не может работать напрямую с исходным кодом. Такой код понимает человек, но не MetaTrader 4. Чтобы его понимал терминал, он должен быть «переведен» на машинный язык. Для этого на клавиатуре, нажмите F7 или меню панели, щелкните мышью на пункте меню "Файл"  а затем "Компилировать" или сразу нажать на иконку "Компилировать".

компилировать mql4

Компиляция - это процесс преобразования файла, содержащего исходный код с расширением * .mq4, в файл с расширением * .ex4, который будет понят MetaTrader 4.

Чтобы немного сократить код без ущерба для его функциональности, удалите комментарии и первые 3 директивы препроцессора. Оставьте #property strict и основную функцию сценария void OnStart ()  и нажмите компилировать. 

#property strict 
void  OnStart () 
  { 
// ---

   }

Если вы сейчас перейдете в папку с файлами сценариев, вы найдете там два файла наших сценариев тестирования: Test.mq4 - файл исходного кода и Test.ex4 - скомпилированный файл

Хорошо, у нас уже есть файл, который можно проверить в MetaTrader 4. Вернитесь к терминалу сейчас. В навигаторе вы можете увидеть четыре основные папки: счетаиндикаторы ,советники и скрипты. Если по каким - либо причинам окно навигатора вы не видите в терминале, в строке меню нажмите Вид, а затем выберите "Навигатор" или  нажмите сочетание клавиш Ctrl + N .

Слева от скриптов, нажмите на плюс, чтобы раскрыть содержимое этой папки. Найдите там тестовый файл и, чтобы запустить его, дважды щелкнув на его имя или перетащите его на график. Ничего не произойдет, потому что скрипт пуст. Если вы щелкнете по имени скрипта только один раз, выбрав его, а затем нажмете Enter на клавиатуре, MetaEditor 4 откроется с исходным кодом при условии, что файл Test.mq4 присутствует в папке Scripts.

скрипт mql4

Теперь вы знаете, каков процесс написания программы на mql4:

  1. вы пишете исходный код

  2. компилируйте программу

  3.  запускаете программу в терминале мт4

  4. смотрите на результат

  5. если нужно, исправляете код

    1. компилируете

    2.  ... и так до тех пор, пока не получите желаемый результат.

Переменные MQL4

Что такое переменная? Попробуйте ответить на этот вопрос самостоятельно, и я вам помогу. Сколько вам лет? Сколько вам будет через пять лет? Ваш возраст - просто переменная. Другими словами, его первой характеристикой является изменчивость.

Другой пример, какой был ваш рост в возрасте двух лет? Вероятно, намного меньше, чем сейчас, Рост является еще одним примером переменной. Но есть важное отличие. Мы обычно измеряем возраст, используя целое число. Рост гораздо проще измерить в десятичных числах. Например, возраст - 20 или 25 лет, рост - 1,80 или 1,95 м.

В MQL4 каждая переменная имеет определенный тип.

Теперь мы научимся правильно создавать переменные в MQL4. Посмотрите на код ниже.

//код 1
#property strict

int age = 25;

void OnStart()
  {
//---

  }

До того, как была написана основная функция скрипта OnStart (), мы написали:

int age = 25;

Что сделает компьютер, когда увидит это? Во-первых, в оперативной памяти ОЗУ будет зарезервировано место, где будет храниться номер:

  •  int-это ключевое слово языка MQL4, обозначающее целое число (integer).
  • age-это имя переменной, то есть слово, с помощью которого компьютер будет получать это число.

Затем для age в RAM будет записано число 25, используя символ уравнения =, и вся эта конструкция закрывается символом точки с запятой;

В MQL4 схема создания переменной, определения ее типа и присвоения значения выглядит следующим образом:

тип переменной имя переменной = значение переменной ;

Если вы сохраните только тип и имя переменной, т.е. создадите ее только в ОЗУ, это действие будет называться объявлением переменной. В этом случае этой переменной будет присвоено нулевое значение по умолчанию. Но если программист сразу назначит ей конкретное значение, например, как в приведенном выше примере, число 25, то эта переменная будет называться инициализированной. 

В этом примере мы видим 3 шага:

  • определение типа переменной:   int ,
  • присвоение имение переменной:   age
  • присвоение ей значения:   25 .

Все это называется инструкцией. Здесь три действия были выполнены в одной инструкции, а точка с запятой обозначает конец этой инструкции.

Не забудьте написать точку с запятой в конце каждого оператора.

Этот код также можно написать по-другому, поместив инструкцию для создания переменной в теле основной функции, то есть в скобках { и }

  • Слово void определяет тип функции - это пустой тип. 
  • OnStart - это имя функции. 
  • В скобках функции () сохраняются конкретные значения, на основании которых она выполняет действия (в этой функции ничего не сохраняется). 
  • Скобки {} определяют область действия функции (т. н. тело функции) и то, что будет сохранено в них, будет реализовано OnStart().
//код 3
#property strict
void OnStart()
  {
//---

   int age = 25;

  }

Коды 1 и 3 будут работать одинаково. Создание переменной перед или внутри функции, то есть между {}, влияет на доступность переменной в программе. В первом примере она будет доступен для всей программы, а не только для функции OnStart (). 

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

Следующий пример.

double height = 1.95;

Здесь мы создали переменную типа double (десятичная дробь, число с плавающей запятой, floating-point number), дали ей имя height, которому сразу же присвоили значение 1.95, используя оператор уравнения =. А что в самом конце? Да, там стоит точка с запятой.

Какие еще типы переменных существуют в MQL4? Существует текстовый тип. Как следует из названия, он используется для хранения текста.

string name = "Важное сообщение";

Здесь string (строка) -тип переменной, name-имя переменной, а "Важное сообщение" - значение этой переменной. Обратите внимание, что текст должен быть сохранен между двумя кавычками "".

Еще один часто используемый в программировании тип-bool. Это так называемый логический тип, и переменные этого типа могут принимать только два значения: true (истина) или false (ложь).

bool trend = false;

В дополнение к этим четырем типам переменных есть много других типов. Поскольку вы только изучаете Программирование на mql4, то предлагаем вам пока ограничиться знанием этих четырех основных типов.

В MQL4 очень важно, пишете ли вы ЗАГЛАВНЫМИ или строчными буквами. Например, если вы объявляете несколько переменных с одинаковыми именами, но используете буквы разного размера, то это будут совершенно разные переменные. Приведенный ниже код создаст четыре переменные типа double.

double height; 
double HEIGHT; 
double Height; 
double HeighT;

Еще один пример.

DOUBLE height; 
Double height;
doublE height;

! Этот код не будет работать, потому что слова DOUBLE, Double и doublE не будут рассматриваться компилятором MQL4 как ключевые слова.

MQL4 - это регистрозависимый язык.

Имена переменных не могут начинаться с цифры. Они не могут содержать специальные символы (@, &,%, $, ...), точки, знаки минус, знаки плюс, умножение и деление. Следующий код содержит недопустимые имена переменных.

double 1price;    
double %price;    
int    Star-Wars; 
bool   Mario@2;   
string bla.bla; 

Имена переменных могут состоять из строчных и заглавных букв a-z, A-Z, цифр 0-9 и символа подчеркивания _ , а длина имени не должна превышать 63 символов.

Некоторые примеры правильно сохраненных имен переменных (код 10).

double p1rice;
double price;
int    Star_Wars;
bool   Mario255H;
string blabla;

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

int age;       double height       =1.95; 


string    name
=
"Важное сообщение"

                    ;

Этот код будет работать правильно! Но давайте напишем этот код, как настоящие профессионалы.

int    age;
double height = 1.95; 
string name   = "Важное сообщение";

Если мы хотим создать (объявить) более 1 переменной одного типа, мы можем сделать это в одной инструкции. Некоторым из них могут быть сразу назначены (инициализированы) определенные значения без того, чтобы все эти переменные были в одной строке. Их имена должны быть разделены запятой и в конце ставить точку с запятой в качестве символа для конца инструкции. В приведенном ниже примере (код 13) компьютер в оперативной памяти зарезервирует место для 7 переменных типа int и 2 переменных типа double . С помощью этой переменной age и таблицы сразу назначат значения 25 и 3 .

int age = 25, number, tables = 3,
    Houses, houses, HOUses,
    result;

double height, weight;

Комментарии в коде программы MQL4

Комментарии являются еще одним полезным элементом в программировании. С их помощью вы можете создать своеобразную заметку в исходном коде, которая улучшает качество его понимания и намерения программиста. Если вы напишите символ двойной косой черты справа // (двойная косая черта), текст в строке справа будет прокомментирован . Это однострочный комментарий . Если вы хотите написать более крупный комментарий, введите текст между / * и * / . Эти символы могут быть в разных строках. Это многострочный комментарий . Комментарии не влияют на работу программы, потому что они игнорируются во время компиляции.

 

// это однострочный комментарий 
int     age = 25 ;   // это однострочный комментарий 
double height = 1 , 95 ; // это однострочный комментарий 

string name = "Down Crumbs" ; 
/ * 
это 
многострочный комментарий 
* /

Если символы комментария // или / * и * / вы наберете между кавычки «» внутри строковой переменной, то текст не будет возможности комментировать (код 2).

// это комментарий
string name = "это // не комментарий"; //Это комментарий

/* это комментарий */
string name = "это /* не */ комментарий"; /* Это комментарий */

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

Работа с переменными в MQL4

Теперь давайте посмотрим, что вы можете делать с переменными после их объявления. Вот несколько примеров:

# Property strict

double A = 50.0; // объявляем переменную a десятичным числом и инициируем его значением 50.0

double B = 2.0; // объявляем переменную B десятичным числом и инициализируем его значением 2.0

double C; // мы просто объявляем переменную C по умолчанию C будет равна 0.0

void OnStart () // основная функция скрипта
{
//---
C = A + B; / * мы присваиваем переменной c сумму переменных
A и B. теперь C равно 52.0
Как и после любой другой инструкции
нужно сохранить точку с запятой */

C = A-B; // вычитание, C = 50.0-2.0 = 48.0
C = A * B; // умножение, C = 50.0 * 2.0 = 100.0
C = A / B; // деление, C = 50.0 / 2.0 = 25.0

C = A + B* A; / * по правилам математики сначала
мы получим значение умножения B на A, затем
мы добавим к A и назначим результат переменной C
C = 50.0 + 2.0 * 50.0 = 50.0 + 100.0 = 150.0 */

C = A + B/A - B; // C = 50.0 + 2.0 / 50.0 - 2.0 = 50.0 + 0.04 - 2.0 = 48.04

C = (A + B) * A; /* в скобках нужно размещать операции, которые должны быть сделаны в первую очередь. В этом случае сначала мы получим сумму A и B, затем эта сумма он будет умножен на A и назначена переменной C
C = (50.0 + 2.0) * 50.0 = 52.0 * 50.0 = 2600.0 */

C = (A + B) / (A - B); // C = (50.0 + 2.0) / (50.0 - 2.0) = 52.0 / 48.0 = 1.083333333333330
}

В этом коде перед OnStart() мы создали 3 переменные a, B и C типа double и сразу A и B присвоили определенные значения. Затем в теле основной функции сценария мы записали математические действия. Справа, используя символы комментария / / и /* ... * / мы описали эти действия.

Если вам нужно выполнить какое-то математическое действие с переменной и той же переменной сразу назначить результат, то вы можете сделать следующее:

# Property strict

int a = 10; // объявляем переменную a целым числом и присваиваем ей 10

void OnStart () // основная функция скрипта
{
//---
A = a + 5; // мы увеличиваем A на 5 и присваиваем a результат, A = 10 + 5 = 15
A += 5; // начальное значение A увеличивается на 5, a = 15

A = a-5; / / мы уменьшаем A на 5 и присваиваем a результат, A = 10-5 = 5
A - = 5; // начальное значение A уменьшаем на 5, a = 5

A = a * 5; // умножаем A на 5 и присваиваем a результат, A = 10 * 5 = 50
A * = 5; // начальное значение A умножаем на 5, a = 50

A = a / 5; // мы делим A на 5 и присваиваем a результат, A = 10 / 5 = 2
A / = 5; // начальное значение A делим на 5, a = 2
}

Если вам нужно увеличить или уменьшить только на 1, используйте следующие записи:

#property строгого 

INT А = 10 ; 
void  OnStart () 
  { 
// ---
    A ++;   // увеличиваем A на 1 (с приращением), A = 10 + 1 = 11
    A--;   // уменьшить A на 1 (уменьшение), A = 10 - 1 = 9
   }

В этом примере запись A ++ идентична в своей работе записям  A = A + 1 и A + = 1 . Обозначения A-- идентичны позициям A = A - 1 и A - = 1 . Далее рассмотрим, как выводить результаты расчетов на монитор.

Функции MQL4

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

Для вызова функции сначала нужно написать ее имя. Не забывайте о регистре! MetaEditor 4 имеет очень полезный механизм для подсказки имен функций и других ключевых слов после написания первых 3 букв (при настройке редактора по умолчанию). Среди прочего, поэтому мы призываем вас писать программы на MQL4 именно в этом редакторе. Для отображения текста на мониторе теперь мы будем использовать Alert().

функция алерт в mql4

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

Теперь просто введите левую круглую скобку после имени функции ( . В этот момент появится другое приглашение относительно типа функции и аргументов, которые она может принимать.

Как вы можете видеть из этой подсказки, Alert () имеет тип void (пустой тип). Ранее мы уже познакомились с другой функцией onStart () типа void. Разница между ними заключается в том, что OnStart () является основной функцией скрипта, и без нее скрипт вообще не будет работать. В исходном коде перед каждой основной функцией всегда нужно писать ее тип.

Alert () - это стандартная функция, которая отображает сообщение в отдельной области. Существуют и другие типы функций, например, математические, функции для работы с текстом и т., вы даже можете создавать свои собственные функции. Однако в исходном коде перед ними не нужно писать их тип. Просто нужно запомнить это.

В MQL4 каждая функция имеет определенный тип.

В области подсказки между скобками мы видим многоточие ... . Что это значит? На клавиатуре теперь нажмите Esc, чтобы всплывающее окно подсказки исчезло. Затем переместите курсор куда-нибудь в центр слова Alert и нажмите F1. Появится справка редактора с описанием свойств этой функции.

справка функции алерт mql4

Из этого описания можно сделать вывод, что после открывающей скобки должны быть записаны аргументы, разделенные запятыми, а после закрывающей скобки точка с запятой. Мы также видим, что для функции Alert () количество аргументов не должно превышать 64. Так вы можете найти такую ​​полезную информацию для каждого зарезервированного слова MQL4. Еще одним источником информации об этой функции и всех других важных элементах этого языка программирования является учебник по mql4, который можно скачать бесплатно или официальный веб-сайт MQL4 .

Вариант 1. В заголовке функции Alert () , то есть в скобках, введите один аргумент - текст «Мой первый скрипт работает» .

// вариант 1 
#property strict 

void OnStart()
  {
//---
 Alert ("Мой первый скрипт работает"); 
   
  }

Скомпилируйте этот код, перейдите в MetaTrader 4, в панели навигатора дважды щелкните имя скрипта или перетащите его в окно цитаты и отпустите его. Появится окно сообщения.

alert mql4

Отлично! Ваша первая программа, написанная на MQL4, работает! Ниже покажем еще несколько примеров того, как вы можете получить тот же результат.

// вариант 2
#property strict

void OnStart()
  {
//---
   Alert("Message" , 35 , " lat");
  }

Второй аргумент - математическая операция 2020 - 1990 гг. Это приемлемо в MQL4.

// вариант 3
#property strict

void OnStart()
  {
//---
   Alert("Message " , 2020 - 1990 , " lat");
  }

Вариант 4. Перед основной функцией были объявлены 3 переменные: YearOfBirth , YearNow и Age . Первым двум были сразу присвоены значения, соответственно 1990 и 2020 . Затем, в теле основной функции, сначала переменной Age была присвоена разница первых двух переменных ( Age = YearNow - YearOfBirth ), а затем Age была передана в заголовке функции Alert () вместо второго аргумента.

#property strict

int YearOfBirth = 1990;
int YearNow     = 2020;
int Age;

void OnStart()
  {
//---
   Age = YearNow - YearOfBirth;
   Alert("Message " , Age , " lat");
  }

Вариант 5. Перед основной функцией OnStart () в одной инструкции были объявлены 2 переменные YearOfBirth и YearNow. В теле этой функции этим переменным были присвоены значения соответственно 1990 и 2020. Следующим вместо второго аргумента в заголовке Alert () была математическая операция: YearNow - YearOfBirth . Также обратите внимание, что аргументы в заголовке Alert () не записаны в одной строке, и в этом нет ошибки.

// вариант 5 
#property strict 

int YearOfBirth, YearNow; 

void  OnStart () 
  { 
// ---
    YearOfBirth = 1990 ; 
   YearNow = 2015 ; 

   Alert ( "Message" , 
         YearNow - YearOfBirth, 
         "lat" ); 
  }

 

На этих примерах хорошо видно разнообразие языка MQL4. Как видите, каждая программа может быть написана разными способами. Здесь мы имели дело с очень простым сценарием, поэтому достаточно применить только его первый вариант, и в случае изменения содержания сообщения Вы можете легко найти место для исправления. В случае, если бы мы работали с кодом, который насчитывал бы несколько тысяч строк и более, где было бы много переменных, каждая из которых была бы использована много раз, тогда лучше создать переменную в самом начале, присвоить ей значение и в случае каких-либо изменений, просто в одном месте, присвоить ей новое значение, чем всему коду искать все места, где это значение встречается. При таком подходе вариант 4 или 5 хорош.

Массивы MQL4

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

Давайте вместе рассмотрим следующий пример. В память компьютера нужно положить 5 цифр, которые мы позже будем использовать для расчетов. Как сделать Вы можете создать 5 переменных отдельно и присвоить им значения.

#property strict

double price_Bartek = 1.2341,
       price_Kasia  = 1.2321,
       price_Michal = 1.2361,
       price_Magda  = 1.2411,
       price_Benek  = 1.2301;

void OnStart()
  {
//---
   
  }

Здесь в пределах одного оператора создаются 5 переменных типа double и им присваиваются числовые значения. Вы можете сделать по-другому, используя один массив

#property strict 

double price_Friend [5];      // объявление массива, состоящего из 5 элементов 

void  OnStart () 
  { 
// ---
    price_Friend [0] = 1.2341 ; // мы присваиваем значение первому элементу массива 
                             // с индексом ноль [0]. 
   price_Friend [1] = 1,2321 ; 
   price_Friend [2] = 1,2361 ; 
   price_Friend [3] = 1,2411 ; 
   price_Friend [4] = 1,2301 ;
  }

Здесь перед основной функцией OnStart () был объявлен массив, а затем в теле функции каждому элементу массива было присвоено соответствующее числовое значение. Объявление массива в этом примере выглядит следующим образом:

double price_Friend [5];

Чтобы создать массив, сначала укажите его тип (double), затем его имя (price_Friend), затем в квадратных скобках укажите количество элементов этого массива [5] и, наконец, введите точку с запятой. В MQL4 схема создания массива выглядит следующим образом:

  • тип массива имя массива [ количество элементов  массива];

 Объявление массива отличается от объявления переменной только тем, что вам нужно записать количество элементов после имени в квадратных скобках [] . В нашем примере массив будет содержать 5 элементов.

До OnStart () мы определили тип массива как double , и каждый из его элементов также будет иметь этот тип. Присвоение значения элементу массива отличается от присвоения значения переменной только тем, что должен быть записан индекс [] соответствующего элемента массива.

price_Friend[0] = 1,2341 ;

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

В массивах индексация элементов начинается с нуля [0] , а не с одного [1] !

В нашем примере массив с именем price_Friend состоит из 5 элементов: первый имеет индекс 0, второй имеет индекс 1, а последний пятый элемент имеет индекс 4 в массиве .

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

#property strict 

void  OnStart () 
  { 
// --- 
   string word [2]; // объявление типа строки text 'string', 2 ​​элемента 
   int year [2]; // объявление типа целочисленного массива 'int', 2 элемента 

// --- присвоение значения элементов элементам
   word[0] = "Mam "; word[1] = " lat";
   year[0] = 1990;   year[1] = 2015;

// --- отображаем результат
 Alert( word[0] , year[1] - year[0] , word[1] );
  }

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

#property strict 

void  OnStart () 
  { 
// --- 
   string word [] = { "Мне сейчас" , "лет" }; // объявление и инициализация массива слов 
   int     year [] = { 1990 , 2020 };     // объявление и инициализация массива года 

// --- отображение результата 
   Alert (word [ 0 ], year [ 1 ] - year [ 0 ], word [ 1 ]); 
  }

В этом коде для массива word компилятор создаст 2 элемента, потому что в скобках мы сохранили 2 значения: "Мне сейчас" и " лет". Первому элементу, т. е. word[0], компилятор назначит значение "Мне сейчас", а word[1] будет иметь значение "лет". Таким же образом компилятор будет обрабатывать массив year.

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

Предопределенные массивы и переменные MQL4

Когда в MetaTrader 4 запускается MQL4-программа (скрипт, индикатор или советник), в памяти компьютера автоматически создаются определенные предопределенные переменные и предопределенные массивы . Например, предопределенная переменная _Symbol хранит имя финансового инструмента окна котировки, в котором был запущен MQL4. В свою очередь, предопределенная переменная _Digits хранит количество символов после десятичной точки, которые определяют точность измерения цены этого финансового инструмента (символа).

В ранее созданном скрипте с именем Test введите следующий код:

#property strict 

void  OnStart () 
  { 
// --- 
   Alert ( "Symbol =" , _Symbol , 
         ". Точность измерения цены =" , _Digits , " символа." ); 
  }

Скомпилируйте скрипт, а затем в MetaTrader 4 запустите его, например, на EURUSD.

результат выполнения кода

Обратите внимание, что нигде в коде выше мы не объявляли ни _Symbol, ни _Digits, и все же скрипт правильно определил название финансового инструмента (EURUSD) и количество знаков после запятой (5).Благодаря тому, что программы, подготовленные на MQL4, могут сами создавать некоторые переменные, это облегчает работу программиста. Существует много таких предопределенных переменных, и мы думаем, что по мере того, как ваши программы станут больше, вы оцените их полезность.

Для лучшего понимания предопределенных массивов, давайте вспомним, какую информацию содержат японские свечи. Наведите курсор мыши на правую свечу для любого символа (на рисунке ниже 2 это GBPUSD, интервал времени 30 минут (M30)), чтобы появилась подсказка.

информация японские свечи

Здесь мы видим шесть значений:

  • время создания свечи (Time),
  • цена ее открытия (Open),
  • самая высокая цена (High),
  • самая низкая цена (Low),
  • цена закрытия (Close)
  • количество тиков (Volume). 

Как получить эти данные с помощью MQL4? Они хранятся в следующих предопределенных массивах: Time [] , Open [] , High [] , Low [] , Close [] и Volume [] .

В разделе, посвященном массивам, мы подчеркнули, что индексация элементов массивов начинается с нуля [0]. Для котировок текущая свеча, т. е. первая справа, имеет индекс 0. Слева от него есть индекс 1 и т. д. Посмотрите на рисунок ниже.

нумерация свечей

Ниже скрипт, который покажет нам цены Open, High, Low и Close свечи с индексом 3.

#property strict

void OnStart()
  {
//---
   Alert("Свеча с индексом " , 3,
         " цена Open = " , Open[3],
         " цена High = " , High[3],
         " цена Low = " , Low[3],
         " цена Close = " , Close[3]);
  }

После запуска этого скрипта в окне листинга наведите курсор на свечу с индексом 3, чтобы появилась информация о свойствах этой свечи, и сравните их с данными в окне сообщения. Запустите сценарий для других символов (финансовых инструментов), например, USDJPY, AUDUSD при различных настройках временного интервала, например, M30, H4, и сравните полученные данные.

Оператор цикла for

Циклы - еще один мощный инструмент MQL4. Они полезны для повторяющихся действий одного типа . Предположим, вам нужно найти среднее значение самых высоких цен для 5 свечей, то есть от 0 до 4. Вы можете сделать это, как показано в коде 1.

#property strict

void OnStart()
  {
//---
   double Av_High = 0.0;

   Av_High = ( High[0] + High[1] + High[2] + High[3] + High[4] ) / 5; 
                           
// --- отображаем результат 
   Alert ( "Средняя цена High свечей от 0 до 4 =" , Av_High); 
  }

В приведенном выше коде сначала была объявлена переменная Av_High типа double и ей было присвоено значение 0.0. Далее были суммированы значения High пяти свечей от [0] до [4], который потом были разделены на 5, и результат был присвоен Av_High. Последней инструкцией является отображение сообщения с помощью функции Alert ().

Здесь мы видим несколько повторяющихся математических действий,а именно суммирование пяти High. Давайте запишем этот код немного по-другому:

# Property strict

void OnStart()
{
//---
double Av_High = 0.0;

Av_High + = High[0]; // к Av_High мы добавляем значение цены High свечи с индексом 0
Av_High + = High[1];
Av_High + = High[2];
Av_High + = High[3];
Av_High + = High[4]; // Av_High равна сумме цен High свечей от 0 до 4
//---
Av_High / = 5; // Av_High равна одной пятой ранее полученной суммы

//--- просмотр результата
Alert ("Средняя цена High свечей от 0 до 4=", Av_High);
}

В этом коде мы использовали метод, описанный в разделе Работа с переменными в MQL4и здесь Av_High мы увеличиваем на другое значение High, используя обозначение + = . Запись Av_High / = 5 говорит о том , что сумма Av_High была разделена на 5 и разделить результат снова был присвоен переменной Av_High.

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

В переменную Av_High мы по очереди добавляем значения цен из массива High [] . Изменяется только индекс от [0] до [4] . Было бы намного проще использовать счетчик, который можно использовать для извлечения данных из этой таблицы. Посмотрите, как этот алгоритм может быть реализован с помощью цикла for :

#property strict 

void  OnStart () 
  { 
// --- 
   double Av_High = 0.0 ; 
// --- 'for' 
   for loop ( int i = 0 ; i < 5 ; i ++) 
     { 
      Av_High + = High [i]; 
     } 
// ---
    Av_High / = 5 ; 
// --- отображаем результат 
 Alert ( «Средняя цена свечей High от 0 до 4 =» , Av_High); 
  }

Цикл состоит из ключевого слова for. В круглых скобках (), т. е. в заголовке оператора, нужно ввести три аргумента, отделенных друг от друга точкой с запятой. Затем между  { }, т. е. в теле цикла, следует ввести повторяющиеся действия. Ниже приведена схема этого цикла.

for(condition_1 ; condition_2 ; condition_3)
  {
   // повторяющиеся действия
  }
  • Condition_1: выполняется объявление и инициализация переменной, которая будет выступать в качестве счетчика. Ее имя может быть любым. Применяется только тип int. Здесь необходимо указать начальное значение индекса, с которого цикл начнет работать. Запись int i = 0 означает:

    • int - это тип переменной-счетчика,

    • i - это имя, а начальный индекс равен 0. 

  • Condition_2: здесь проверяется условие прерывания цикла. Если значение счетчика не соответствует описанному здесь условию, цикл прерывается. Запись i < 5 означает – если значение счетчика  i соответствует этому условию ( 0 < 5 - true), тогда программа переходит к вычислениям, хранящимся в теле цикла, другими словами, к итерации (итерация - повторение той же операции).

  • Condition_3: после выполнения вычислений в теле цикла, счетчик увеличивается на заданное значение. Запись i++ означает, что после завершения итерации счетчик и увеличится на 1.

В нашем примере выще в начале 4-й итерации, то есть, когда i = 3 , после завершения всех операций i будет увеличен на 1. Перед переходом к следующей итерации проверяется правильность второго условия и, если оно верно (в этом случае да, потому что 4 < 5 верно), тогда программа перейдет к выполнению последующих действий в теле цикла.

В конце 5-й итерации ( i = 4 ) i будет равен 5, и следующая итерация не будет реализована, поскольку второе условие больше не будет истинным ( 5 < 5 - false), это нарушит цикл for, и программа перейдет к действиям, написанным после цикла ,

Условие прерывания цикла ( Condition_2 ) может быть другим.

i < = 5 // цикл работает до тех пор, пока i меньше или равно 5
i > 10 / / цикл работает в то время как i больше, чем 10
i >= 777 // цикл работает до тех пор, пока i больше или равно 777

Счетчик также можно изменить по-другому ( Condition_3 ):

i--      //  счетчик 'i' будет уменьшен на 1
i -= 2   //  счетчик 'i' будет уменьшен на 2
i += 25  // счетчик 'i' будет увеличен на 25

Чтобы закрепить материал, давайте теперь найдем среднее значение самых низких цен (Low) для 6 свечей с четными индексами, то есть свечей с индексами 0, 2, 4, 6, 8 и 10. Для небольшой сложности начнем считать с 10 до 0

#property strict 
void  OnStart () 
  { 
// --- 
   double Av_High = 0.0 ; 
   int     Start = 10 ; 
   int     End = 0 ; 

// --- 'for' 
   for loop ( int i = Start; i> = End; i - = 2 ) 
     { 
      Av_High + = Low [i]; 
     } 
// ---
    Av_High / = 6 ; 

// --- отображаем результат 
   Alert ( «Среднее значение цен Low четных свечей от 10 до 0 =» , Av_High); 
  }

Условный оператор if ... else

Давайте разберемся, как использовать очень важный элемент MQL4, который является условием . В своей жизни вы часто мыслите условно, например: «Если в воскресенье солнечно, я пойду погулять. В противном случае я останусь дома. " В упрощенном виде на MQL4 это условие можно описать следующим образом:

#property strict 

void  OnStart () 
  { 
// --- 
   if ( / * Если в воскресенье солнечно * / ) 
     { 
        / * Я пойду гулять * /
      } 
   иначе
      { 
        / * Я останусь дома * /
      } 
  }

Это синтаксис условия в MQL4. Здесь вы можете увидеть условный оператор if (если) в сочетании с else (иначе). После слова if в круглых скобках () , т. е. в заголовке оператора, опишите условие, а затем опишите действия, которые будут выполнены в зависимости от выполнения этого условия. Если условие истинно (true), то желаемое действие должно быть описано в скобках {} ( я пойду на прогулку ). Если условие ложно (ложь), или в противном случае, после слова еще между фигурными скобками {} описывает альтернативное действие ( остаться дома ).

Теперь рассмотрим следующий пример:

// --- код 1
#property strict 
void  OnStart () 
  { 
// --- объявление переменных A и B и их инициализация 
   int A = 0 , B = 0 ; 
   if (A == 555 ) / * результат сравнения - false, в результате чего 
                     B не меняет свое значение на 100 
                     и действие переходит к оператору 'else' * /
      { 
        B = 100 ; 
     } 
   else
      { 
        B = 200 ;  // B принимает значение 200
      } 

// --- отображаем результат 
   Alert ("B =" , B); 
  }

В этом примере  в теле основной функции скрипта OnStart () объявлены первые две переменные A и B , присваивающие 0 каждому. Тогда при использовании оператора сравнения ==  А сравнивается с числом 555 . Это все равно что задавать программе вопрос «Является ли 0 равным 555?», Помня, что вместо переменной А программа видит 0 . Результат - ложь, потому что 0 не равно 555 . Согласно этому результату действие переходит к другому , где в теле этого оператора, то есть между {} , переменной B присваивается значение 200 . Наконец, функция Alert () отобразит «B = 200» на мониторе.

Вам не нужно использовать оператор else . Если в приведенном выше примере мы удалим else {...} , то переменная B останется неизменной и будет равна 0, как и во время инициализации.

#property strict 

void  OnStart () 
  { 
// --- объявление переменных A и B и их инициализация 
   int A = 0 , B = 0 ; 

   if (A == 555 ) / * результат сравнения - false и в результате 
                     B не меняет свое значение на 100 * /
      { 
        B = 100 ; 
     } 

// --- отображаем результат 
   Alert ( "B =" , B); // B = 0
   }

Также помните, что должны сравниваться только сопоставимые переменные и значения.

// --- объявление и инициализация переменных 
int     IntValue = 555 ; 
double DoubleValue = 1,3 ; 
string StringValue = "Какая-то информация" ; 
bool    BoolValue = true ; 

// --- 1) 
если (IntValue < 10 ) / * условие записано правильно, 
                     сравниваются два целых числа 555 и 10 * /
   { 
     // ...
   } 
// --- 2) 
if (DoubleValue> 2.5 ) / * правильно,
                         сравниваются два числа с плавающей точкой 1.3 и 2.5 * /
   { 
     // ...
   } 
// --- 3) 
если (IntValue> 2.5 )    / * правильно сохраненное условие, 
                         разрешено сравнивать две цифры 
                         разных типов, например, int и double * /
   { 
     // ...
   } 
// --- 4) 
если (StringValue == 1 )   / * полная ерунда, 
                         вы не можете сравнить текст с числом * /
   { 
     // ...
   } 
// --- 5) 
if (StringValue == "Word" ) // условие сохранено правильно
   { 
     // ...
   } 
// --- 6) 
если (StringValue> "Word" )   / * полная ерунда, 
                              невозможно сравнить, 
                              больше или меньше 
                              значение самого текста, чем значение другого текста, 
                              речь идет не о сравнении количества символов в этих текстах * /
   { 
     // ...
   } 
// --- 7) 
если (BoolValue == true ) / * правильно сохраненное условие, 
                         логическая переменная сравнивается
                         с логическим значением (true или false) * /
   { 
     // ...
   }

 Если после if между {} есть только одна инструкция (B = 100), то {} можно не писать. То же самое можно сделать и с else. В приведенном выше примере (код 1) после else между {} мы также видим только одну инструкцию (B = 200), поэтому скобки также могут быть опущены.

#property strict

int A = 0 , B = 0;
   
void OnStart()
  {
//---
   if(A == 555)  // Результат сравнения - false, операция переходит к оператору 'else'
      B = 100;
   else
      B = 200;   // zmienna B przyjmuje wartość 200
//---
   Print("B = " , B);  // переменная B принимает значение 200 
  }

Это тот же код, что и предыдущий, но немного более тонкий, потому что здесь нет {}. С другой стороны, если после операторов if или else необходимо написать два или более оператора, они должны быть заключены в фигурные скобки.

#property strict

int A = 0 , B = 0 , C = 0;

void OnStart()
  {
//---
   if(A == 555) // Результат сравнения - false, операция переходит к оператору 'else'
     {
      B = 100;
      C = 111;
     }
   else
     {
      B = 200;  // переменная B принимает значение 200
      C = 222;  // переменная C принимает значение 222
     }
//---
   Print("B = " , B , " a C = " , C); // B = 200 a C = 222
  }

В приведенном выше примере мы видим, что два оператора (B = 100 и C = 111) относятся к if и были бы реализованы, если бы условие было истинным, поскольку они находятся внутри скобок. Две инструкции (B = 200 и C = 222) относятся к else и также записываются между скобками.

Использование оператора else не требуется, если не предусмотрено альтернативное действие. Если в коде выше удалить else вместе с {...}, то начальные значения B и C не изменятся и все равно будут равны 0 (код 4).

#property strict

int A = 0 , B = 0 , C = 0;

void OnStart()
  {
//---
   if(A == 555) // Результат сравнения - false
     {
      B = 100;
      C = 111;
     }
                // из-за того, нет «else» B и C по-прежнему будет 0 
//---
   Print("B = " , B , " a C = " , C);  // B = 0 a C = 0
  }

 А что будет, если мы уберем {} и после if ? Сделайте это и запустите такой скрипт в MetaTrader 4.

#property строгого 

INT А = 0 , В = 0 , С = 0 ; 

void  OnStart () 
  { 
// --- 
   if (A == 555 ) // Результат сравнения - false
       B = 100 ;  // B не принимает значение 100
       C = 111 ;  // C принимает значение 111 
// --- 
   Print ( "B =" , B, "a C =" , C);  // B = 0 и C = 111
   }

В этом случае без {} только один оператор (B = 100) будет зависеть от оператора if. Второй оператор (C = 111) будет реализован независимо от if, поскольку в такой системе он не связан с этим оператором.

Вложение условий if ... else в MQL4

В MQL4 есть возможность вложения операторов if и else, т. е. конкретное действие может зависеть от реализации нескольких условий. Подобные примеры многоуровневых условий можно изобразить следующим образом: "если в воскресенье будет солнце, то я пойду гулять. Если нет, то я посмотрю, будет ли по телевизору новый фильм, и если да, то посмотрю его, а если нет, то почитаю про MQL4"”. Сначала мы проверим, будет ли Солнце в воскресенье, и мы либо пойдем гулять, либо посмотрим, что будет по телевизору. Наши дальнейшие действия зависят от того, будет ли показан новый фильм. Как бы выглядел алгоритм принятия решений в человеческом мозге, если бы мы использовали язык MQL4?

#property strict

void OnStart()   // мы начинаем думать * :)
  {
//---
   if(/* Если в воскресенье будет солнце */)       // условие 1
     {
      /* пойду прогуляюсь */
     }
   else                                            // иначе
     {
      if(/* Если по телевизору будет новый фильм */) // вложенное условие 2
         {
          /* я буду смотреть новый фильм */
         }
      else                                         // иначе
         {
          /* почитаю про MQL4 */
         }
     }
//---
  }

В этом случае (код выше) наша прогулка будет зависеть только от одного условия: будет ли солнечное воскресенье. В свою очередь, о MQL4 мы прочитаем в случае, если не будет солнца и выяснится, что по телевизору не будет нового фильма. Давайте подготовим код сценария, как если бы мы уже знали, что воскресенье не будет солнечным, а на телевидении будет новый фильм (Код 2):

#property strict

void OnStart()
  {
   bool IsSunnySunday = false; // воскресенье не будет солнечным
   bool IsNewMovie    = true;  // будет новый фильм

//---
   if(IsSunnySunday == true)   /* результат сравнения-ложь,вот почему мы не пойдем на прогулку действие переходит к оператору 'else' */
     {
      Print("Пойду прогуляюсь.");
     }
   else                        //мы проходим здесь
     {
      if(IsNewMovie == true)   /*вложенное условие результат сравнения-правда, поэтому мы будем смотреть фильм, а не читать о MQL4*/
         {
          Print("Я буду смотреть новый фильм.");
         }
      else
         {
          Print("Я почитаю о MQL4.");
         }
     }
//---
  }

Функция Print, которая используется в этом коде описана ниже.

Что, если новый фильм окажется скучным? Лучше заняться чем-нибудь более приятным, например, почитать о MQL4. Мы можем добавить и такое условие и добавить, что мы будем делать в такой ситуации. Как я уже было написано выше, если после операторов if или else есть только одно действие, то скобки {} можно не писать. Кроме того, оператор else может быть опущен, если альтернативное действие не предусмотрено.

#property strict

void OnStart()
  {
   bool IsSunnySunday = false; // воскресенье не будет солнечным
   bool IsNewMovie    = true;  // будет новый фильм
   bool IsBoringMovie = true;  // фильм окажется неинтересным

//--- 
   if(IsSunnySunday == true)        // результат сравнения-ложь
      Print("Пойду прогуляюсь.");

   else                             // переходим сюда
     {
   //---
      if(IsNewMovie == true)        /* вложенное условие, результат сравнения-правда */
        {
          Print("Я буду смотреть новый фильм.");
          
          if(IsBoringMovie == true) // результат сравнения-правда
             Print("Фильм будет скучным, я лучше почитаю о MQL4.");
        }
      else
          Print("Я почитаю о MQL4.");
   //---
     }
  }

Теперь мы знаем, что если новый фильм окажется скучным, мы лучше читаем о MQL4. Однако, если фильм не разочаровывает наших ожиданий, мы ничего не меняем в нашей операции и продолжаем смотреть, потому что нет описания альтернативного действия, то есть больше ничего не связано с условием if ( IsBoringMovie == true ) . Теперь попробуйте инициализировать логическую переменную IsSunnySunday как true. Теперь при проверке первого условия скрипт немедленно отправит нас на прогулку, пропустив проверку следующих условий. В свою очередь, если мы заменим только логическую переменную IsNewMovie на false, нам не нужно проверять фильм, чтобы сразу начать читать о MQL4.

MQL4 позволяет вкладывать операторы if и else многими способами без ограничений. Существуют ситуации, когда вам необходимо описать очень сложные и обширные зависимости, например, некоторые действия могут зависеть от выполнения многих условий. Вы можете упростить ввод кода, используя логические символы && (I) и || (Или) о чем будет написано далее. Вы также можете писать свои собственные функции на mql4, используя такие сложные условия.

Функция Print() в MQL4

В этой главе мы познакомимся с очень полезной функцией Print (). В MQL4 он используется для отображения текста в журнале логов терминала MetaTrader 4.

#property strict 

void  OnStart () 
  { 
// --- 
   Print ("Это важное информационное сообщение"); 
  }

Сохраните этот код в тестовом скрипте , скомпилируйте и запустите его в MT4. 

результат выполнения функции print mql4

На вкладке Эксперты мы увидим результат этого скрипта:

  • Сначала терминал сообщит, что скрипт с именем Test успешно запущен в окне EURUSD.
  • Затем идет запись инициализации скрипта.
  • Результат сценария, то есть сообщение, сохраненное в сценарии.
  • Деинициализация скрипта с указанием причины (0 означает отсутствие ошибки).
  • Удаление скрипта из окна листинга.

Если по какой-либо причине вы не видите журнал терминала, то есть все нижнее окно, нажмите Ctrl + T или в строке меню Вид -> Терминал .

В приведенном выше примере заголовок функции Print () содержит 1 аргумент типа текста «Это важное информационное сообщение». Ниже рассмотрим некоторые другие примеры использования этой функции.

Вариант 2. В заголовке Print () есть 2 аргумента типа текста: первый - «День недели» ,  «Воскресенье». ,

#property strict

void OnStart()
  {
//---
   Print("День недели" , "Воскресенье.");
  }

Вариант 3. Сначала были объявлены две переменные Age_string и Height_string типа строка (string) и им присвоены текстовые значения. Затем в теле основной функции OnStart () Age_string был передан в заголовок Print () , а второй аргумент для Height_string был помещен после десятичной точки .

#property strict

string Age_string    = "25 лет ";
string Height_string = "мой рост 1,8.";

void OnStart()
  {
//---
   Print(Age_string , Height_string);
  }

Вариант 4. Сначала переменная Age_int целочисленного типа int и переменная Height_double типа с плавающей точкой double были объявлены и им были присвоены соответствующие значения. Затем в заголовок функции Print () было записано 5 аргументов: 1 - текстовый аргумент «Мне» , 2 - переменная Age_int , 3 - текст «лет и» , 4 - переменная Height_double и 5 - последний аргумент - текст «height m».

#property strict 

int     Age_int = 25 ; 
double Height_double = 1,95 ; 

void  OnStart () 
  { 
// --- 
   Print ( "Мне , 
         Age_int, 
         "лет и" , 
         Height_double, 
         "height m" ); 
  }

Операторы сравнения MQL4

До сих пор при обсуждении условного оператора if мы использовали оператор сравнения == . Напомнии, что один знак равенства = используется для присвоения значения переменной, а двойной знак равенства == используется для сравнения двух переменных. В этой части статьи мы узнаем о других операторах сравнения, используемых в MQL4.

 оператор  описание
   A == B   Истинно, если A - B 
   A! = B.   Истинно, если A не равно B 
   A <B   Истинно, если A меньше, чем B 
   A> B.   Истинно, если A больше, чем B 
   A <= B.   Истинно, если A меньше или равно B 
   A> = B.   Истинно, если A больше или равно B

Ниже несколько примеров использования этих операторов.

#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
///--- объявление и инициализация переменных 
   int    A_1 = 1,         A_2 = 1;
   double B_1 = -2.2,      B_2 = 5.5;
   string C_1 = "Pu ", C_2 = "Ok";
   bool   D_1 = true,      D_2 = false;

//--- 1)
   if(A_1 == A_2) // результат сравнения - true 
      Print("A_1 равно A_2");
   else
      Print("A_1 не равно A_2");

//--- 2)
   if(B_1 == B_2) 
      Print("B_1 равно B_2");
   else
      Print("B_1 не равно B_2");

//--- 3)
   if(C_1 == C_2) 
      Print("C_1 равно C_2");
   else
      Print("C_1 не равно C_2");

//--- 4)
   if(D_1 == D_2) 
      Print("D_1 равно D_2");
   else
      Print("D_1 не равно D_2");
 
  }
//+------------------------------------------------------------------+

Скопируйте этот код в скрипт, затем запустите его в терминале, и вы увидите сообщения на вкладке «Эксперты» . Затем скопируйте все коды ниже один за другим и проверьте их работу.

результат выполнения скрипта ==

Примеры использования! = (... не равно ...):

#property strict

void OnStart()
  {
   string C_1 = "Pu ", C_2 = "Ok";
   bool   D_1 = true,      D_2 = false;

//--- 1)
   if(C_1 != C_2) 
      Print("C_1 не равно C_2");
   else
      Print("C_1 равно C_2");

//--- 2)
   if(D_1 != D_2) 
      Print("D_1 не равно D_2");
   else
      Print("D_1 равно D_2");
  }

Примеры использования <(... меньше чем ...): 

#property strict

void OnStart()
  {
   int    A_1 = 1,    A_2 = 1;
   double B_1 = -2.2, B_2 = 5.5;

//--- 1)
   if(A_1 < A_2) 
      Print("A_1 меньше, чем A_2");
   else
      Print("A_1 не меньше, чем A_2");

//--- 2)
   if(B_1 < B_2) 
      Print("B_1 меньше, чем B_2");
   else
      Print("B_1 не меньше B_2");
  }

Примеры применения > (... это больше, чем ): 

#property strict

void OnStart()
  {
   int    A_1 = 1,    A_2 = 1;
   double B_1 = -2.2, B_2 = 5.5;

//--- 1)
   if(A_1 > A_2) // 

      Print("A_1 больше, чем A_2");
   else
      Print("A_1 не больше, чем A_2");

//--- 2)
   if(B_1 > B_2) // wynik porównania - fałsz

      Print("B_1 больше, чем B_2");
   else
      Print("B_1 не больше, чем B_2");
  }

Логические операции && и || в MQL4

С целью демонстрации работы операторов && и || предлагаем проанализировать следующий пример: "если сегодня воскресенье и (&&) есть солнце, то я иду на прогулку. Иначе я останусь дома". Давайте подготовим такой сценарий.

#property strict

void OnStart()
  {
   bool IsTodaySunday = true;  //сегодня воскресенье
   bool IsTodaySunny  = true;  // сегодня солнце
   
//---
   if(IsTodaySunday == true && IsTodaySunny == true)
      Print("Я иду на прогулку, потому что это воскресенье, и есть солнце.");
   else
      Print("Я остаюсь дома.");
//---
  }

В заголовке оператора if, т. е. между скобками (), мы видим два условия, разделенных символом &&. В первом выражении мы проверяем, что переменная IsTodaySunday равна true: да, это правда, потому что во время инициализации ей было присвоено именно такое значение. Во втором выражении мы проверяем, что IsTodaySunny тоже равен true: да-правда. Поскольку эти два условия одновременно реальны, мы можем пойти на прогулку. Если бы оказалось, что хотя бы один из них не был истиной, например. во время инициализации одна из переменных будет иметь значение false, то в соответствии с сохраненным кодом мы не можем пойти на прогулку.

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

В MQL4 таким образом в одном if можно одновременно проверять несколько условий.

#property strict

void OnStart()
  {
   bool IsTodaySunday = true;   // сегодня воскресенье
   bool IsTodaySunny  = true;   // сегодня солнце
   bool IsNewMovie    = false;  // нет нового фильма

//---
   if(IsTodaySunday == true &&  // правда-сегодня воскресенье
      IsTodaySunny  == true &&  // правда-сегодня солнце
      IsNewMovie    == false)   // правда-нового фильма нет
      Print("Я иду на прогулку, потому что это воскресенье, и есть солнце, и нет нового фильма.");
   else
      Print("Я остаюсь дома.");
//---
  }

В приведенном выше примере мы дополнительно проверяем, идет ли новый фильм по телевизору. Во время инициализации мы присвоили IsNewMovie значение false, т. е. нет нового видео. В заголовке if в третьем выражении мы проверяем это условие и видим, что оно истинно (false равно false что верно), и поскольку все 3 условия истинны, мы идем на прогулку. Попробуйте какую-нибудь переменную инициализировать по-другому, и вы увидите, что скрипт будет приказывать вам оставаться дома.

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

Проверьте, как будет работать следующий скрипт.

#property strict

void OnStart()
  {
   bool IsTodaySunday = true;  // сегодня воскресенье
   bool IsTodaySunny  = false; // сегодня нет солнца

//---
   if(IsTodaySunday == true || IsTodaySunny == true)
      Print("Я иду на прогулку, потому что либо воскресенье, либо солнце.");
   else
      Print("Я остаюсь дома.");
//---
  }

Такой сценарий отправит нас на прогулку, потому что для выполнения хотя бы одного из условий достаточно. Здесь первое условие реально, а второе нет. Если бы все было наоборот, то есть сегодня не было бы воскресенье, но было бы солнце, нам также пришлось бы выйти на улицу, чтобы проветрить. Только если ни одно из условий не было выполнено, действие перешло бы к оператору else, и сценарий попросил бы нас остаться дома. Аналогично && , с оператором || вы можете проверить много условий одновременно.

 Группировка условий

Давайте рассмотрим, как сгруппировать несколько условий внутри оператора if . Проанализируйте код ниже.

#property strict 

void  OnStart () 
  { 
   int A = 0 , B = 1 , C = 2 , D = 3 ; 

// --- 
  if (A == 0 && B <- 9 )       /* group # 1 (A == 0 - true, B <-9 - false) 
                                общий результат сравнения - ложное 
                                действие переходит к оператору 'else' */ 
      Print ("Желаемое действие № 1"); 
   else
      { 
      if (C!=0 && D>-9)   /*группа № 2 (C! = 0 - true, D> -9 - true) 
                                общий результат сравнения - true */ 
         Print ( "Желаемое действие № 1" ); 
      else 
         Print ( "Альтернативное действие № 2" ); 
     } 
// ---
   }

Мы видим, что желаемое действие № 1 зависит от того, верно ли сравнение переменных A и B вместе. Если бы это было так, сценарий отображал бы сообщение, сохраненное в первой функции Print (), и сценарий заканчивался бы там. У нас это не так, поэтому скрипт перейдет к другому условию и выполнит действия, сохраненные в {} . Там, в if , мы видим вторую группу условий для переменных C и D , где оба выражения верны, поэтому будет отображаться сообщение «Желаемое действие № 1». , Допустим, сравнения A и B являются группой № 1, а сравнения C и D - группой № 2.

В первой группе сравнение A с числом 0 дает результат - true, но сравнение B с числом - 9 дает результат - false. Оператор логического произведения && (||) записан в этой группе , поэтому конечный результат для этой группы - ложь. Во второй группе сравнение как C, так и D дает реальные результаты, и, поскольку && также записывается здесь, результат всей группы является истинным. Если оказалось, что для обеих групп результаты сравнения были ложными, тогда сценарий запустил бы альтернативное действие № 2. Поэтому для выполнения требуемого действия № 1 первой или второй группе достаточно дать результат - true.

Теперь посмотрим, как вы можете сохранить тот же код короче.

#property strict 
void  OnStart () 
  { 
   int A = 0 , B = 1 , C = 2 , D = 3 ; 
// --- 
   if ((A == 0 && B <- 9 ) || (C! = 0 && D> - 9 )) 
      Print ( "Желаемое действие № 1" ); 
   else 
      Print ( "Альтернативное действие № 2" ); 
// ---
   }

Теперь в if с помощью скобок мы создали группу № 1 (A == 0 && B <- 9 ) и группу № 2 (C! = 0 && D> - 9 ) . В этом случае оператор if сначала проверит результаты для отдельных переменных, затем оценит общий результат для каждой из этих групп, а затем сравнит результаты самих групп. Чтобы было понятнее, посмотрите на рисунок ниже:

mql4

 

пятница, марта 27, 2020

Еще на эту тему:

отложенные ордера в мт4 как пользоваться

Ранее мы познакомились мы ознакомились с работой в терминале MetaTrader 4, что...

читать
mt4

Для работы на валютной бирже Форекс существует удобная площадка Метатрейдер 4, которая представляет собой сочетание новейших торговых и...

читать
построение отчета в метатрейдер 4

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

читать
Нейросетевая торговая система Meta Trader 4 + MATLAB. Пошаговая разработка. Издание второе - скачать книгу

Книга для новичков и продвинутых трейдеров, желающих раздвинуть горизонты традиционного анализа рынка. Пошаговая...

читать
метатрейдер 4 для чайников

MetaTrader 4 от компании Metaquotes Software Corp,пожалуй, -  один из самых распространенных торговых терминалов в мире. Трудно представить себе...

читать
терминал МТ4

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

читать
учебник по mql5

Если Вы интересуетесь трейдингом, то наверняка уже наткнулись на термин „автоматическая торговая система“ или "советник" в терминале...

читать
стакан цен в метатрейдер

Многие Форекс - трейдеры хотели бы научиться правильно использовать стакан цен (или биржевой стакан) на практике. В этом материале разберемся,...

читать

Работа на рынке Форекс требует постоянного внимания к множеству деталей. Профессионалам, не говоря уже о новичках, бывает сложно быстро...

читать
тестер стратегий для mt4

В этой статье рассмотрим зачем нужен тестер ручных стратегий и как его установить и использовать в терминале MT4. 

Содержание:...

читать

МЫ ВКОНТАКТЕ - Подпишитесь, чтобы не пропустить новые материалы

© forex-method.xyz, 2024 - любое копирование материалов только при указании ссылки на источник

Go to top