Введение в MQL5 (Часть 2): Предопределенные переменные, общие функции и операторы потока управления
Введение
Это вторая статья из серии, предназначенной для начинающих. В первой части мы обсудили самый азы алгоритмической торговли и основные концепции MQL5. Во второй части из этой серии статей мы более детально и глубоко рассмотрим некоторые концепции, продвигаясь постепенно от простого к сложному, чтобы все было понятно даже для тех, кто делает первые шаги в программировании. Если же вдруг что-то покажется сложным или запутанным, пишите комментарии и задавайте свои вопросы. Давайте вместе сделаем так, чтобы каждый голос и каждое мнение были услышаны.
Все же целевая аудитория этих статей - начинающие программисты. Поэтому мы вместе с вами будем разбирать все тонкости основ MQL5 так, чтобы все рассуждения были доступны и понятны каждому читателю. Кроме того, надеюсь эти материалы сподвигнут вас к более глубокому изучению и погружению в программирование на MQL5. При всем при этом, надо понимать, что простого чтения таких статей будет недостаточно, ведь программирование — это практика.
В частности, сегодня мы будем изучать предопределенные переменные, общие функции, операторы потока управления, арифметические и логические операции и операции сравнения. По мере продвижения в изучении концепций, мы в этих статьях подойдем к основной теме — созданию советников, движущей силы автоматической торговли. Вы узнаете, как вдохнуть жизнь в свои торговые стратегии и, предоставив автоматическим программам возможность принимать решения от вашего имени.
И, конечно же, какая польза от стратегии, если она не проверена на прочность? Поэтому мы познакомимся и с тестером стратегий, который позволяет оценивать надежность алгоритмов на исторических данных. Тут теория встречается с реальностью, и мы обязательно дойдем и до этого важного аспекта алгоритмической торговли. Так что приготовьтесь к освоению нового материала о языке MQL5. И не забывайте, что вы не просто учитесь программировать, вы получаете возможность вывести свою торговлю на новый уровень с помощью алгоритмов.
В этой статье мы рассмотрим следующие темы:
- Предопределенные переменные
- Общие функции
- Арифметические и логические операции, операции сравнения
-
Операторы потока управления
Прежде чем мы перейдем непосредственно к рассмотрению деталей второй части, предлагаю посмотреть видео, в котором я кратко описываю ключевые понятия, обсуждавшиеся в первой статье. Это видео поможет вам быстро освежить знания и поможет нам всем быть "на одной волне", перед тем как мы перейдем к более сложным темам по MQL5. Итак, давайте вспомним, что мы уже прошли.
1. Предопределенные переменные
Что такое предопределенные переменные?
В программировании переменные подобны контейнерам, содержащим информацию. Предопределенные переменные, как следует из названия, представляют собой специальные контейнеры, которые уже определены самим языком программирования. Эти контейнеры заполнены конкретной информацией о текущем состоянии программы, торговой среде или рыночных условиях.
Почему они называются предопределенными?
Потому что язык программирования (в данном случае MQL5) предварительно определил их — придал им определенное значение. Вам не нужно создавать или объявлять эти переменные, они уже готовы к использованию в любой момент, когда они понадобятся. При запуске программы MQL5 (например, эксперта, скрипта или пользовательского индикатора) запускается специальный набор предопределенных переменных. Они уже содержат информацию о том, как выглядит рынок в данный момент. Содержат данные, такие как цены, инструменты и время. Они дают снимок состояния рыночных условий на начало выполнения программы, предоставляя необходимые данные для принятия решений в рамках программы.
Аналогия
Предопределенные переменные можно представить как ящики в мастерской. У них w;t есть определенный функционал, и мастер дает им имена, чтобы было легче понять, что делает каждый ящик. Теперь представьте, что есть специальный ящик под названием «_Symbol». Конкретно он знает названия финансовых символов (EURUSD, GBPUSD).
Ящик «_Period» знает временные периоды (Timeframe), почти как специальные часы. Эти ящики предопределены, поскольку уже наделены нужными способностями еще до того, как вы преступили к работе. И когда вам понадобится эта информация при разработке программы, вы сразу же можете использовать предопределенные поля, чтобы быстро получить нужную информацию.
И не нужно тратить время на их создание. Все уже доступно в готовом для использования виде. Такой доступный готовый набор ускоряет разработку программ, ведь не нужно создавать весь необходимый функционал с нуля.
1.1. Примеры предопределенных переменных в MQL5
1.1.1. _Symbol
В программировании, связанном с трейдингом на финансовых рынках, переменная _Symbol позволяет программе точно знать, с каким финансовым инструментом она имеет дело. Торговый символ — одна из основных переменных в наших программах. Примерами торговых символов могут быть EURUSD, GBPJPY и др. При этом переменная _Symbol указывает нашей программе, с каким символом она имеет дела, и нам не придется упоминать об этом вручную каждый раз, когда программа сталкивается с такими данными.
Надо сказать, что сталкивается программа с такими данными довольно часто, ведь все торговые решения принимаются программой для конкретного символа, на который и указывает переменная _Symbol. Поэтому можно сказать, что предопределенная переменная _Symbol, несомненно, важна для работы любой программы. Всегда используйте ее и создавайте умный и гибкий код, который легко ориентируется в постоянно меняющемся мире торговых символов.
Пример:
void OnStart() { Alert(_Symbol); }
В этом примере функция Alert использует предопределенную переменную _Symbol для получения текущего торгового символа и последующего вывода алерта на график. При запуске этого кода в платформе MetaTrader он отобразит текущий торговый символ.
1.1.2. _Period
Предопределенная переменная _Period в MQL5 предоставляет информацию о таймфрейме или периоде рассматриваемого в данный момент графика. Он служит встроенной ссылкой на таймфрейм, на котором работает торговый алгоритм.
Пример:
void OnStart() { // a sample Script that prints the current timeframe to the user Print(_Period); }
Как и _Symbol, _Period способствует адаптивности торговых алгоритмов, позволяя им реагировать именно на тот таймфрейм, на котором они применяются. Это как часы, которые в любой момент сообщают программе, на каком временном интервале она работает.
Итак, у нас есть _Symbol для указания на торговый символ и _Period для указания на торгуемый или анализируемый таймфрейм. Но это не все основные переменный. Есть и другие, которые очень сильно помогают при разработке кода.
1.1.3. _Digits
В контексте MQL5 предопределенная переменная _Digits предоставляет практическую информацию о количестве знаков после запятой в цене текущего торгового инструмента. Эта небольшая деталь имеет огромное значение, когда мы говорим о пунктах и пипсах в валютной торговле. Пипс, или процент пункта, представляет собой наименьшее движение цены курса валютной пары. Количество десятичных знаков влияет на точность оценки движения цены. Переменная _Digits в этом плане позволяет трейдерам быстро получить доступ к этой информации.
Точное знание правильного значения количества знаков после запятой в валюте инструмента влияет на корректность всех расчетов. Например, если для параметра _Digits установлено значение 4, это означает точность до четырех знаков после запятой, что характерно для многих валютных пар.
Пример:
void OnStart() { // Use the "_Digits" predefined variable to get the number of decimal places int decimalPlaces = _Digits; // Print the result to the console Print("Number of Decimal Places: ", decimalPlaces, " (Each movement is a pip!)") }
1.1.4. _Point
Еще одна важная предопределенная переменная в MQL5 применительно к трейдингу это _Point. Она позволяет получить представление о минимальном движении цены текущего торгового инструмента. По сути, это наименьшее измеримое приращение цены — пункт. В пунктах измеряются изменения цены инструмента. Значение переменной _Point варьируется для разных финансовых инструментов и дает трейдерам точное понимание того, насколько цена может меняться при каждом движении. Знание пунктов, например, важно для настройки уровней стоп-лосс и тейк-профит в программах. Этого всего лишь один из примеров для пояснения концепции. Больше вариантов использования мы увидим позднее.
Пример:
void OnStart() { // setting sl by subtracting 15 pips from a ask price of 1.2222 double Ask = 1.2222; // current market price double sl = Ask - (_Point * 15); Alert(sl); // Result will be 1.2207 }
Итак, мы с вами рассмотрели фундаментальные предопределенные переменные в MQL5, а именно _Symbol, _Digits, _Point и _Period. Они служат основополагающими элементами, предоставляя представление о текущем торговом инструменте, точности его цены, минимальном движении и рассматриваемом временном интервале. Вообще в MQL5, конечно, больше предопределенных переменных, но мы сосредоточились только на нескольких из них, которые имеют максимально высокое значение на ранних этапах изучения языка. И далее, чтобы не усложнять, мы будем двигаться постепенно от простого к сложному во всех статьях из этой серии. Поэтому следите за публикациями.
2. Общие функции
Что такое общие функции?
В MQL5 общие функции — это инструменты, которые трейдеры и разработчики используют для автоматизации различных аспектов алгоритмической торговли. Эти функции служат конкретным целям: от отображения предупреждений и печати сообщений для отладки до управления ордерами, закрытия позиций и получения информации о торговом счете. Функции можно представить как строительные блоки, которые позволяют эффективно реализовывать стратегии и принимать решения. Они облегчают процесс написания кода, улучшают реализацию стратегии и способствуют более динамичному и оперативному торговому процессу.
Аналогия
Функции можно представить как определенные инструкции, написанные на понятном для программы языке. Используя функции, вы даете вашей программе понять, что вы от нее хотите. И таким образом вы можете добиться решения самых разнообразных задач.
2.1. Примеры общих функций в MQL5
2.1.1. Alert
Alert (алерт) — это сигнал, который оперативно сообщает вам, когда происходит что-то интересное или важное. Это самый быстрый и эффективный способ привлечь ваше внимание к чему-то нужному. Чтобы настроить получение уведомлений, используйте функцию Alert, которая будет отправлять сообщения прямо на график во время работы вашей программы при выполнении определенного условия.
Примеры:
void OnStart() { Alert("Discoveries Await!"); }
Если посмотреть с общей точки зрения, программирование похоже на общение на языке, близком к человеческому выражению. Что это значит применительно к нашей функции Alert. Когда мы используем функцию Alert в программе на MQL5, мы как бы говорим программе: «Отправь сигнал, когда произойдет что-то интересное!» Это похоже на разговор с торговым помощником на языке, который кажется интуитивно понятным и знакомым, что делает процесс программирования одновременно доступным и увлекательным.
2.1.2. Печать
Функция Print, как может быть понятно из ее названия, печатает сообщения. Когда мы вызываем функцию Print, мы явно указываем программе, что она должны напечатать и рассказать о том, что произошло. Это как волшебное перо, которое рассказывает о приключениях и записывает их в дневник. С функцией Print действия программы волшебным образом превращаются в слова и создают повествование о некоем событии.
Пример:
void OnStart() { Print("Discoveries Await!"); }
2.1.3. Комментарий
Функция Comment — это волшебный инструмент, делающий яркие аннотации к нашему торговому полю. С помощью этой "заклинания" Comment мы как будто оставляем подсказки, которые помогут нам и другим пользователям. Это "заклинание" позволяет писать заметки и символы прямо на наших графиках, превращая их в свитки, рассказывающие историю наших торговых стратегий. Благодаря функции Comment наши графики приобретают информативность, помогают понять происходящее, сопровождают важные моменты ценными комментариями. В целом, прямое назначение функции Comment — отобразить сообщение на графике торгового инструмента.
Пример:
{ Comment("I love MQL5!"); }
2.1.4. PlaySound
Функция PlaySound в MQL5 — полезный инструмент, позволяющий трейдерам включать аудио сигналы в свои скрипты и советники. Эту функцию можно использовать для воспроизведения звуковых файлов в различных ситуациях, предоставляя трейдерам дополнительные алерты или предупреждения помимо визуальных элементов. Если у вас есть звуковой файл с именем alert.wav в каталоге Sounds, вы можете воспроизводить этот звук при выполнении определенного условия в вашем торговом скрипте.
Пример:
void OnStart() { // Check a condition if(5>4) { // Play the sound PlaySound("alert.wav"); } }
alert.wav — имя звукового файла, который будет воспроизводиться. Файл должен находиться в каталоге Sounds терминала.
На этом мы завершим раздел, посвященный общим функциям в MQL5. Однако важно понимать, что то, с чем мы здесь столкнулись, — это всего лишь беглый взгляд на обширный набор инструментов, доступных для алгоритмической торговли. Мы рассмотрели функции Alert, Print, Comment и PlaySound — это лишь несколько из огромного множества возможностей.
3. Арифметические и логические операции, операции сравнения
3.1. Арифметические операции
Арифметические операции — это фундаментальные математические операции, которые играют важную роль в программировании, включая MQL5 для алгоритмического трейдинга. К этим операциям относятся сложение (+), вычитание (-), умножение (*), деление (/), модуль (%), оператор приращения (++) и оператор декремента (--). Они позволяют разработчикам выполнять в коде математические вычисления.
Сложение (+) и вычитание (-)
Сложение и вычитание — основные арифметические операции, которые позволяют складывать или разделять величины.
Пример:
void OnStart() { int num1 = 8; int num2 = 5; //addition of values int sum = num1 + num2; //subtraction of values int minus = num1 - num2; Alert("Sum = ",sum,", minus = ",minus); }
Умножение (*) и деление (/)
Пример:
void OnStart() { double price = 50.25; int quantity = 10; double totalCost = price * quantity; // Multiplication double averagePrice = totalCost / quantity; // Division Alert("totalCost = ",totalCost,", averagePrice = ",averagePrice); }
Модуль
Оператор модуля, представленный символом «%», представляет собой математическую операцию, возвращающую остаток от деления одного числа на другое. Оператор модуля особенно полезен при программировании для таких задач, как перебор определенного количества элементов, проверка четных или нечетных чисел или обеспечение того, чтобы значения оставались в пределах определенного диапазона.
Пример:
void OnStart() { int num1 = 10; int num2 = 3; int remainder = num1 % num2; // The variable 'remainder' now holds the value 1 }
Инкремент и декремент
Операторы «++» и «--» известны как операторы инкремента и декремента соответственно. Это унарные операторы, то есть они работают с одним операндом.
Пример:
void OnStart() { int x = 5; int y = 8; x++; // After this line, the value of 'x' is 6 y--; // After this line, the value of 'y' is 7 }
Примечание: эти операторы часто используются для обновления значений переменных в циклах, счетчиках или других сценариях, где вы хотите увеличить или уменьшить значение на фиксированную величину.
3.2. Логические операции
Логические операции в программировании включают оценку условий или выражений, результатом которых является логическое значение (истина или ложь). Эти операции имеют основополагающее значение для принятия решений и управления ходом программы. Логические операторы часто используются в условных операторах (if, else, switch), циклах и других ситуациях, когда необходимо принимать решения на основе определенных условий. Они являются неотъемлемой частью создания выразительной и гибкой логики в программировании.
Во многих языках программирования, включая MQL5, принято считать, что «1» обычно представляет истину, а «0» представляет ложь в контексте булевой логики.
К общим логическим операторам относятся:
Символ | Операция | Пример | Обозначения |
---|---|---|---|
|| | логическое ИЛИ | y > 2 || y < 7 | Значение y больше 2 или меньше 7 |
! | логическое НЕ | !y | Если операнд имеет значение true, оператор NOT делает его ложным. |
&& | логическое И | y > 2 && y < 7 | Значение y больше 2 и меньше 7 |
3.3. Операции сравнения
Такие операции в программировании производят сравнение значений для определения связи между ними. Эти операции обычно приводят к логическому значению (true или false).
К общим операторам сравнения относятся:
Символ | Операция | Пример |
---|---|---|
> | Проверяет, больше ли значение слева, чем значение справа. | x > y |
< | Проверяет, меньше ли значение слева, чем значение справа. | x < y |
!= | Проверяет неравенство двух значений | x != y |
== | Проверяет равенство двух значений | x == y |
>= | Проверяет, значение слева больше ли или равно значению справа. | x >= y |
<= | Проверяет, значение слева меньше ли или равно значению справа. | x <= y |
Примечание: знак равенства ( = ) и двойной знак равенства ( ==) служат разным целям в программировании и используются в разных контекстах.
Одиночный знак равенства «=» — это оператор присваивания, используемый для присвоения значения переменной.
Пример:
int x = 10; // Assigns the value 10 to the variable x
Знак двойного равенства «==» — это оператор отношения, используемый для сравнения и проверки равенства между двумя значениями.
Пример:
int a = 5; int b = 7; bool isEqual = (a == b); // Checks if 'a' is equal to 'b'; 'isEqual' is false
4. Операторы потока управления
В мире программирования операторы потока управления выступают в роли навигационного компаса, прокладывающего курс выполнения программы. Представьте свой код как корабль, плывущий по сложным водам команд и логики. В этом динамичном путешествии операторы потока управления действуют как компас, направляя судно через точки принятия решений, циклы и различные условия.
Подобно тому, как капитан корабля плывет по бурному морю, программист использует операторы потока управления, чтобы указать направление, в котором должен двигаться код. Будь то принятие решений на основе конкретных условий, перебор данных или многократное выполнение определенных действий, эти утверждения являются инструментами стратега для организации целенаправленного путешествия через сложности алгоритмической логики.
Как он работает?
Представьте, что у вас есть волшебный питомец, который любит следовать вашим инструкциям, но вам нужен способ сказать ему, что делать в различных ситуациях. И вот это как раз можно сделать с помощью кода и специальных слов — операторов потока управления.
4.1. Оператор If/Else
Вы говорите своему питомцу: «Если (If) светит солнце, лети в небо, иначе (else) оставайся на земле и вздремни». То есть, «Если что-то случится, сделай это, иначе сделай то».
Пример:
if(sun_is_shining) { Codey_fly_high_in_the_sky() } else { Codey_take_a_nap_on_the_ground() }
4.2. Цикл While
Цикл while — инструмент для выполнения повторяющихся задач, перебора последовательностей и придания вашему коду динамической составляющей. Это позволяет программам MQL5 адаптироваться и реагировать на меняющиеся условия, делая торговые стратегии гибкими и устойчивыми в постоянно меняющемся мире финансовых рынков. С помощью этого цикла мы указываем компьютеру продолжать выполнять команду, пока условие истинно.
Синтаксис:
while (условие) { // Код, который будет выполняться, пока условие истинно }
Пример:
void OnTick() { // Initialization int numberOfTrades = 0; // While loop condition while(numberOfTrades < 5) { // Magic within the loop Print("You can take a trade ", numberOfTrades + 1); // Counter increment numberOfTrades ++; } // Magical finale Print("Trade complete!"); }
Примечание: более подробное объяснение функции OnTick появится позже.
Цикл while работает как конструкция, которая повторяет блок кода до тех пор, пока заданное условие остается истинным. Он предоставляет возможность выполнять итеративные задачи до тех пор, пока определенное условие не перестанет выполняться.
Давайте разберем элементы примера:
Инициализация: int numberOfTrades = 0;
- Мы инициализируем переменную-счетчик, чтобы отслеживать наши итерации.
Условия цикла while: while (numberOfTrades < 5)
- Цикл проверяет, верно ли что число numberOfTrades меньше 5. Если это правда, код внутри цикла выполняется. Это условие позволяет циклу продолжаться до тех пор, пока число сделок будет меньше 5.
Магия внутри цикла: Print("You can take a trade ", numberOfTrades + 1);
- Внутри цикла мы выполняем какое-то действие. В данном случае мы выводим сообщение все время, пока numberOfTrades < 5.
Увеличение счетчика: numberOfTrades++
- Число сделок numberOfTrades увеличивается с каждой итерацией, приближая нас к нашей цели — 5.
Завершение цикла: Print("Trade complete!");
- Как только цикл завершит свои итерации, другое сообщение будет выведено на печать.
4.3. Цикл For
Цикл for обеспечивает краткий способ выполнения итеративных задач. Это особенно удобно, когда вы заранее знаете количество итераций, которые хотите выполнить. Вы можете использовать цикл for практически для всего, для чего можно использовать цикл while, но цикл for имеет некоторые преимущества.
Преимущества:
- Краткость — цикл for объединяет операторы инициализации, проверки условий и итерации в одну строку, что делает ваш код более элегантным.
- Читабельность — повышает ясность вашего кода, облегчая его понимание с первого взгляда.
- Контролируемая итерация — благодаря явному контролю над переменной цикла вы можете точно определить количество итераций.
Синтаксис:
for (initialization; condition; iteration) { // Code to be executed in each iteration }
Пример:
void OnTick() { // For loop to iterate from 1 to 5 for(int i = 1; i <= 5; i++) { // Magic within the loop //i represents number of trades Print("You can take a trade ", i); } // Magical finale Print("Trade complete!"); }
Объяснение:
Инициализация (int i = 1;):
- Мы инициализируем переменную цикла i, чтобы начать наши итерации с 1.
Условие (i <= 5;):
- Цикл продолжается до тех пор, пока условие (i меньше или равно 5) выполняется.
Итерация (i++):
- После каждой итерации переменная цикла i увеличивается на 1.
Магия внутри цикла: Print("You can take a trade ", i);
- Внутри цикла мы выполняем какое-то действие. В данном случае мы выводим сообщение пока numberOfTrades < 5.
Завершение цикла: Print("Trade complete!");
- Как только цикл завершит свои итерации, другое сообщение будет выведено на печать.
Заключение
В этой второй статье из нашей серии об основах MQL5 мы рассмотрели основные понятия. Мы рассмотрели предопределенные переменные, общие функции и сложную среду арифметических, реляционных и логических операций, а также операторы потока управления. Что делает наше путешествие исключительным, так это его простота и приглашение к взаимодействию. Задавайте вопросы, если что-то осталось непонятно. Эта глава завершена, время готовиться к следующей. Очень скоро мы перейдем к разработке собственного торгового робота. Оставайтесь с нами, и давайте продолжим наше путешествие по миру MQL5.
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/13997
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Очень хорошо. Но мне не хватало, чтобы вы прокомментировали тернарный оператор. ( ?: ), поскольку он довольно практичен в разное время. И в своих кодах я часто его использую. Было бы здорово, если бы он был включен. Таким образом, люди смогли бы лучше понимать коды в моих статьях 🙂 . В любом случае, мне понравилась ваша инициатива по созданию мини-курса по MQL5, чтобы помочь с документацией. 😁👍
Здравствуйте, Дэниел,
Спасибо за ваш вклад! Я ценю ваше предложение по поводу троичного оператора (?:). Я включу его в будущие статьи, чтобы улучшить понимание кода. Ваши отзывы очень ценны и способствуют улучшению наших ресурсов для сообщества.
Израиль, мне нравятся ваши аналогии и то, как вы описываете "создание волшебства". Спасибо.