Виды операций
В языке MQL4 различают следующие виды операций:
- арифметические операции;
- операции присваивания;
- операции отношения;
- логические операции;
- побитовые операции;
- операция запятая;
- вызов функции.
Арифметические операции
К символам арифметических операций относятся следующие:
Символ | Операция | Пример | Аналог |
---|---|---|---|
+ | Сумма величин | x + 2 | |
— | Вычитание величин или изменение знака | x — 3, y = — y | |
* | Умножение величин | 3 * x | |
/ | Частное от деления | x / 5 | |
% | Остаток от деления | minutes = time % 60 | |
++ | Добавление 1 к значению переменной | y++ | y = y + 1 |
— | Вычитание 1 из значения переменной | y— | y = y — 1 |
Операции присваивания
К символам операций присваивания относятся следующие:
Символ | Операция | Пример | Аналог |
---|---|---|---|
= | Присваивание значения x переменной y | у = x | |
+= | Увеличение значения переменной у на x | у += x | y = y + x |
-= | Уменьшение значения переменной y на x | y -= x | y = y — x |
*= | Умножение значения переменной y на x | y *= x | y = y * x |
/= | Деление значения переменной y на x | y /= x | y = y / x |
%= | Остаток от деления значения переменной y на x | y %= x | y = y % x |
Операции отношения
К символам операций отношения относятся следующие:
Символ | Операция | Пример |
---|---|---|
== | Истина, если x равно y | x == y |
!= | Истина, если x не равно y | x != y |
< | Истина, если x меньше y | x < y |
> | Истина, если x больше y | x > y |
<= | Истина, если x меньше или равно y | x <= y |
>= | Истина, если x больше или равно y | x >= y |
Логические операции
К символам логических операций относятся следующие:
Символ | Операция | Пример | Пояснения |
---|---|---|---|
! | НЕ (логическое отрицание) | ! х | ИСТИНА(1), если значение операнда ЛОЖЬ(0), и ЛОЖЬ(0), если значение операнда не ЛОЖЬ(0). |
|| | ИЛИ (логическое ИЛИ) | x < 5 || x > 7 | ИСТИНА(1), если истинно любое из значений |
&& | И (логическое И) | x == 3 && y < 5 | ИСТИНА(1), если истинны все значения |
Итак, с простыми операциями мы разобрались, а вот что такое выражение? А выражение — это совместное использование операций и идентификаторов(переменных).
Пример:
int MyVar = X + 5; // Сложение значения из идентификатора X и числа 5 с последующим присвоением результата в переменную MyVar.
В данном случае MyVar и X — это идентификаторы, знак «+» — это операция, а целиком строка из нашего примера это и будет выражение. Смысл любого выражения в формировании результата, а затем присваивания этого результата левому операнду.
Давайте продолжим и рассмотрим выражения на примерах побитовых операций.
Побитовые операции
Побитовые операции выполняются только с целыми числами. К побитовым операциям относятся следующие:
Дополнение значения переменной до единицы. Значение выражения содержит 1 во всех разрядах, в которых значения переменной содержат 0, и 0 во всех разрядах, в которых значения переменной содержат 1.
b = ~n;
Двоичное представление z сдвигается вправо на x разрядов. Сдвиг вправо логический, то есть освобождающиеся слева разряды будут заполняться нулями.
z = z >> x;
Двоичное представление x сдвигается влево на y разрядов; освобождающиеся справа разряды заполняются нулями.
d = d << k;
Побитовая операция И двоичных представлений d и k. Значение выражения содержит 1 (ИСТИНА) во всех разрядах, в которых и d, и k содержат не ноль; и 0 во всех остальных разрядах.
b = ((x & y) != 0);
Побитовая операция ИЛИ двоичных представлений x и y. Значение выражения содержит 1 во всех разрядах, в которых x или y не содержат 0, и 0 — во всех остальных разрядах.
b = x | y;
Побитовая операция «исключающее ИЛИ» двоичных представлений x и y. Значение выражения содержит 1 в тех разрядах, в которых x и y имеют разные двоичные значения, и 0 — во всех остальных разрядах.
b = x ^ y;
Операция запятая
Выражения, разделённые запятыми, вычисляются слева направо. Все побочные эффекты вычисления левого выражения могут возникать до вычисления правого выражения. Тип и значение результата совпадают с типом и значением правого выражения.
for(i=0,j=99; i<100; i++,j--) Print(my_array[i][j]); // Оператор цикла
Вызов функции
Теперь мы поговорим о функциях в языке программирования MQL.
Очень часто в программировании необходимо выполнять одни и те же действия. И вместо того чтобы каждый раз в теле советника повторять одни и те же строчки кода, эти самые строчки оформляют в виде функции, а затем производят её вызов в нужных местах.
- Любая функция имеет тип, также, как и любая переменная.
- Функция может возвращать значение, тип которого в большинстве случаев аналогично типу самой функции.
- Если функция не возвращает никакого значения, то она должна иметь тип void (такие функции иногда называют процедурами)
- При объявлении функции, после ее типа должно находиться имя функции и две круглые скобки — открывающая и закрывающая, внутри которых могут находиться один или несколько аргументов функции, которых также может не быть вообще.
- После списка аргументов функции ставится открывающая фигурная скобка, после которой находится само тело функции.
- В конце тела функции обязательно ставится закрывающая фигурная скобка.
Пример:
//+------------------------------------------------------------------+ //| Перенос уровня StopLoss | //| Параметры: | //| ldStopLoss - уровень StopLoss | //+------------------------------------------------------------------+ void ModifyStopLoss(double ldStopLoss) { bool fm; fm = OrderModify(OrderTicket(), OrderOpenPrice(), ldStopLoss, OrderTakeProfit(), 0, CLR_NONE); }
В этом примере мы объявили функцию ModifyStopLoss с типом void. Синтаксически тип void является фундаментальным типом наравне с типами bool, int, color, datetime и т.д. Этот тип используется либо для указания того, что функция не возвращает значения, либо в качестве параметра функции обозначает отсутствие параметров. Наша функция, состоит всего из двух строк, но тем не менее гораздо проще её вызвать с указанием всего одного параметра ldStopLoss, нежели в различных местах эксперта каждый раз вызывать функцию терминала OrderModify с передачей целой массы параметров.
В этом примере мы использовали функцию типа void, которые не возвращают никакого значения. Теперь давайте напишем функцию возвращающую результат. Оператор return используется для возвращения вычисляемого функцией значения.
Пример:
//+------------------------------------------------------------------+ //| Перенос уровня StopLoss | //| Параметры: | //| ldStopLoss - уровень StopLoss | //+------------------------------------------------------------------+ bool ModifyStopLoss(double ldStopLoss) { bool fm; fm = OrderModify(OrderTicket(), OrderOpenPrice(), ldStopLoss, OrderTakeProfit(), 0, CLR_NONE); return(fm); }
В этом варианте функция вернёт значение переменной fm, полученное в результате вызова функции OrderModify.