Переменные являются одной из важнейших основ программирования. Без них не может быть создано ни одной программы. Убедитесь, что вы понимаете переменные в MQL4 и как их можно использовать, потому что вы будете постоянно с ними работать.
Переменные — это контейнеры с информацией. Вы можете присвоить им определенное значение, изменить его, объединить значения и снова его использовать.
Переменные должны быть определенного типа данных. При этом переменная может содержать только значения, разрешенные ее типом данных. Например, если переменная целого типа, она не может содержать букв алфавита.
Переменные имеют жизненный цикл. Они создаются, им присваиваются значения, значения меняются в зависимости от их назначения, а затем они уничтожаются.
MQL4 — это язык, чувствительный к регистру, поэтому во всех операциях, выполняемых с переменными и функциями, нужно быть осторожным с регистром. К примеру, a отличается от A, а функция OpenTrade отличается от opentrade.
Объявление переменных в MQL4
Чтобы использовать переменную, вы должны сначала объявить ее. Это действие говорит программе, что создается переменная с определенным типом данных. Чтобы объявить переменную, напишите тип данных, затем пробел и имя переменной, закройте строку с помощью точки с запятой.
Вот несколько примеров объявления переменных:
int i; // i - целая переменная string s; // s - строковая переменная bool enabled; // логическая переменная
Инициализация переменных
Как только переменная объявлена, вы можете присвоить ей значение. Инициализация — это присвоение значения переменной.
Если вы попытаетесь присвоить значение переменной, которая не была объявлена, компилятор выдаст ошибку.
Чтобы инициализировать переменную, напишите имя переменной, далее знак равенства и значение, которое вы хотите ей присвоить, закройте все с помощью точки с запятой.
Вот несколько примеров:
i=1; //переменной i присвоено значение 1 s="Привет"; //переменной s присвоена строка "Привет" enabled=true; //переменной enabled присвоено значение true
Объявления и инициализация
В зависимости от программы и вашего стиля написания кода вы можете сразу же инициализировать переменную при ее объявлении. Чтобы объявить и инициализировать переменную одновременно, напишите тип данных, затем пробел, имя переменной, знак равенства, закройте все с помощью точки с запятой.
int i=1; //объявлена целая переменная i и ей присвоено значение 1 string s="Привет"; //объявлена строковая переменная s и ей присвоено значение "Привет" bool enabled=true; //объявлена логическая переменная enabled и ей присвоено значение true
Использование переменных
Чтобы использовать переменную, вам просто нужно вызвать имя переменной в какой-либо функции или любой другой операции.
//+------------------------------------------------------------------+ //| Test1.mq4 | //| Copyright 2019, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2019, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- string s="Привет"; // объявлена переменная строкового типа s и ей присвоено значение "Привет" Print(s); // Значение переменной s будет выведено в окне сообщений в терминале } //+------------------------------------------------------------------+
Область действия переменных
Область действия переменной определяет, для каких функций она доступна и как долго она остается в памяти. В MQL4 область действия может быть локальной или глобальной. Локальная переменная также может быть статической.
Локальная переменная — это переменная, объявленная внутри функции. Локальные переменные доступны только внутри функций, в которых они объявлены. Переменная инициализируется при каждом запуске функции. После выхода из функции переменная и ее данные удаляются из памяти.
Исключением является статическая локальная переменная. Статические переменные остаются в памяти даже после выхода из функции. Когда функция запускается снова, переменная не инициализируется повторно, а вместо этого сохраняет свое предыдущее значение.
Статическая переменная объявляется путем ввода static перед объявлением переменной. Вот пример объявления статической переменной:
static int MyStaticVar;
Если статическая переменная должна быть доступна более чем в одной функции, используйте вместо нее глобальную переменную. В этом случае вам не нужно объявлять переменную как статическую.
Глобальная переменная — это переменная, которая доступна всем функциям в программе. Пока программа работает, значение глобальной переменной сохраняется. Глобальные переменные объявляются вне функций, обычно в верхней части исходного кода.
Обновление значений переменных
Значение переменной может измениться во время выполнения программы. Именно поэтому переменная называется переменной. Если бы нам была нужна переменная с фиксированным значением, вместо этого мы бы использовали константу. Для обновления значения переменных используется тот же код, что и для инициализации. Используйте имя переменной, далее знак равенства и новое значение.
int i=1; // объявлена целая переменная i и ей присвоено значение 1 i=2; // значение i изменяется на 2 i=10; // значение i меняется на 10
Вы также можете использовать одни переменные для присвоения значений другим переменным.
//+------------------------------------------------------------------+ //| Test1.mq4 | //| Copyright 2019, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2019, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- int i=10; //объявлена целая переменная i и ей присвоено значение 10 int j=20; //объявлена целая переменная j и ей присвоено значение 20 int k=i+j; //объявляется переменная k и ей присваивается сумма переменных i + j string greeting="Привет"; //объявлена строковая переменная greeting и ей присвоено значение Привет string name="Александр"; //объявлена строковая переменная name и ей присвоено значение Александр string welcome=greeting+" "+name; //объявлена строковая переменная welcome и ей присвоено значение переменных greeting и name Print("k=",k); //Значение k будет напечатано на вкладке «Терминал - Эксперты» Print(welcome); //Значение welcome будет напечатано на вкладке «Терминал - Эксперты» } //+------------------------------------------------------------------+
Внешние переменные
Внешние переменные — это переменные, значение которых вы можете изменить при запуске советника (или индикатора).
Внешние переменные чрезвычайно важны, потому что:
- Они позволяют настраивать ваш советник и изменять его параметры до запуска.
- Они позволяют оптимизировать советник по результатам его тестирования на истории.
Предположим, у вас есть советник, и вы хотите иметь возможность изменять размер позиции, который будет использоваться при его запуске. Вы можете это сделать с помощью внешней переменной.
Или, предположим, у вас есть советник, который торгует с использованием скользящей средней. Вы хотите выбирать период скользящей средней перед запуском советника. Это также удобно делать с помощью внешней переменной.
Или у вас есть строгие правила риск-менеджмента, и вы не хотите открывать новые ордера, если определенный процент вашего депозита уже задействован. И здесь вы можете определить процент используемой маржи с помощью запуска советника с внешней переменной.
Внешние переменные могут быть инициализированы значениями по умолчанию. Кроме того, у внешних переменных может быть описание.
Чтобы определить переменную как внешнюю, вам нужно ее объявить с помощью extern.
Посмотрим на пример:
#property copyright "Александр Паркер" #property link "https://traderblog.net/" #property version "1.00" #property strict //Мы объявляем и инициализируем целую внешнюю переменную x. extern int x=10; //Каждый x тик будет выводиться цена Ask. //Объявим целую переменную i, которая будет выполнять роль счетчика. int i=1; int OnInit() { return(INIT_SUCCEEDED); } void OnDeinit(const int reason) { } void OnTick() { //Если счетчик кратен х (то есть остаток от деления равняется 0), советник выводит цену Ask if(i%x==0) { Alert("Цена Ask равна ",Ask," значение i равно ",i); } //i++ увеличивает значение i на единицу. i++; }
При запуске советника появится всплывающее окно с параметрами, в этом случае в окне также будет вкладка «Входные параметры». Здесь вы найдете внешние переменные, которые вы можете изменить.
Для нашего советника мы увидим:
Когда мы запустим советник, мы увидим:
Внешние переменные могут относиться к переменным разного типа. Например, если у нас есть советники, которые отправляют электронные письма, у нас может быть внешняя переменная EmailTo типа string для указания адреса, куда нужно отправлять электронные письма.
Если мы добавим строку
extern string EmailTo="admin@traderblog.net"; // Отправить письмо на admin@traderblog.net,
результат будет следующим:
Переменные как константы
В некоторых программах вы можете захотеть использовать переменные со значением, которое не может быть изменено во время работы программы. Именно в этом случае вам помогут константы.
Константа — это переменная со значением, которое нельзя изменить во время работы программы.
Есть несколько причин, которые могут побудить вас использовать константы в ваших программах. Это зависит от вашей программы и выполняемой ею задачи. Если вы хотите убедиться, что значение переменной не изменится, объявите ее как константу. Как только переменная объявляется константой, ее уже нельзя изменить.
Для того, чтобы объявить переменную как константу, нам нужно добавить const перед объявлением переменной:
//+------------------------------------------------------------------+ //| Test1.mq4 | //| Copyright 2019, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2019, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- const int i=10; //i объявлена как переменная-константа и ей присвоено значение 10 Print(i); // Команда вывести значение i в журнал } //+------------------------------------------------------------------+
Если мы попытаемся изменить значение константы в коде, а затем попробуем его скомпилировать, мы получим ошибку:
//+------------------------------------------------------------------+ //| Test1.mq4 | //| Copyright 2019, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2019, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- const int i=10; //i объявлена как переменная-константа и ей присвоено значение 10 i=20; // мы пытаемя присвоить i новое значение Print(i); // Команда вывести значение i в журнал } //+------------------------------------------------------------------+