Всем привет! В этом уроке мы познакомимся с математическими функциями, предусмотренными в языке mql5, и, что более важно, рассмотрим операторы цикла. Это важные знания, особенно при работе с массивами. А массивов при программировании торговых роботов вам встретится огромное множество.
Математические функции нужны для быстрых вычислений результатов каких-либо математических операций, например, возведения в степень или округления. Я бы разбил их на несколько групп: функции округления, сравнения, вычислительные (вроде возведения в степень или получения остатка от деления) и геометрические. Давайте рассмотрим функции каждой из групп.
Предыдущие уроки
- MQL5 Урок 1 – Редактор кода, События, Устройство mql-программ
- MQL5 Урок 2 – Типы переменных
- MQL5 Урок 3 – Операции и Выражения
- MQL5 Урок 4 – Операторы
Функции округления
Таких функций несколько.
MathRound – возвращает значение, округленное до ближайшего целого числа указанного числового значения:
double MathRound(
double value // округляемое значение
);
MathCeil – возвращает ближайшее сверху целое числовое значение:
double MathCeil(
double val // число
);
MathFloor – возвращает ближайшее снизу целое числовое значение:
double MathFloor(
double value // число
);
Обратите внимание, что в языке mql нет функции, которая позволяла бы округлять до определенного разряда. Тем не менее, мы можем сделать это таким вот хитрым приемом:
MathRound(2.325 * 100) / 100;
Функции сравнения
Среди таких функций есть функции MathMax и MathMin, позволяющие выбрать максимальное или минимальное число из двух.
MathMax – функция возвращает максимальное из двух числовых значений:
double MathMax(
double value1, // первое число
double value2 // второе число
);
MathMin – функция возвращает минимальное из двух числовых значений:
double MathMin(
double value1, // первое число
double value2 // второе число
);
Вычислительные функции
MathMod – возвращает вещественный остаток от деления двух чисел:
double MathMod(
double value, // делимое
double value2 // делитель
);
MathPow – возводит основание в указанную степень:
double MathPow(
double base, // основание
double exponent // показатель степени
);
MathSqrt – возвращает квадратный корень числа:
double MathSqrt(
double value // положительное число
);
MathRand – возвращает псевдослучайное целое число в диапазоне от 0 до 32767:
int MathRand();
MathSrand – устанавливает начальное состояние для генерации ряда псевдослучайных целых чисел:
void MathSrand(
int seed // инициализирующее число
);
MathExp – возвращает значение числа e в степени d:
double MathExp(
double value // степень для числа e
);
MathLog – возвращает натуральный логарифм:
double MathLog(
double value // число для взятия логарифма
);
MathLog10 – возвращает логарифм числа по основанию 10:
double MathLog10(
double val // число для взятия логарифма
);
Геометрические функции
MathTan – возвращает тангенс числа:
double MathTan(
double rad // аргумент в радианах
);
MathSin – возвращает синус указанного угла:
double MathSin(
double value // число
);
MathCos – функция возвращает косинус угла:
double MathCos(
double value // число
);
MathArccos – возвращает значение арккосинуса x в диапазоне 0 к π в радианах:
double MathArccos(
double value // -1<val<1
);
MathArcsin – возвращает арксинус x в диапазоне от -π/2 до π/2 радианов:
double MathArcsin(
double value // -1<value<1
);
MathArctan – возвращает арктангенс x. Если x равен 0, функция возвращает 0:
double MathArctan(
double value // тангенс
);
Оператор цикла FOR
Оператор for состоит из трех выражений и выполняемого оператора:
for(выражение1; выражение2; выражение3) {
оператор;
}
Выражение1 описывает инициализацию цикла. Выражение2 – проверка условия завершения цикла. Если оно истинно, то выполняется оператор тела цикла for. Все повторяется, пока выражение2 не станет ложным. Если оно ложно, цикл заканчивается и управление передается следующему оператору. ВыражениеЗ вычисляется после каждой итерации.
Кстати, любое из трех или все три выражения в операторе for могут отсутствовать, но разделяющие их точки с запятыми (;) опускать нельзя. Если опущено выражение2, то считается, что оно постоянно истинно и оператор for(;;) представляет собой бесконечный цикл.
Если в цикле предполагается обрабатывать большое количество итераций, то рекомендуется проверять факт принудительного завершения программы с помощью функции IsStopped():
for(x=1;x<=7000; x++)
{
if(IsStopped()) {
break;
}
Print(MathPower(x,2));
}
Тут мы применили оператор break, о котором речь будет немного ниже. Вкратце – оператор break прекращает выполнение ближайшего вложенного внешнего оператора, и таким образом с его помощью мы выходим из цикла, если работа программы принудительно завершена.
Оператор цикла while
Оператор while состоит из проверяемого выражения и оператора, который должен быть выполнен:
while(выражение) {
оператор;
}
Если выражение истинно, то оператор выполняется до тех пор, пока выражение не станет ложным. Если выражение ложно, то управление передается следующему оператору. Значение выражения определяется до выполнения оператора. Поэтому, если выражение ложно с самого начала, то оператор вообще не выполняется.
В примере ниже цикл отработает 10 000 раз:
n = 10000;
k = 0;
while(k<n)
{
y=y*x;
k++;
}
Оператор завершения break
Оператор break прекращает выполнение ближайшего вложенного внешнего оператора switch, while, do-while или for. Управление передается оператору, следующему за заканчиваемым. Одно из назначений этого оператора – закончить выполнение цикла при присваивании некоторой переменной определенного значения:
//--- поиск первого нулевого элемента
for(i=0;i<array_size;i++) {
if(array[i]==0) {
break;
}
}
Оператор продолжения continue
Оператор continue передает управление в начало ближайшего внешнего оператора цикла while, do-while или for, вызывая старт следующей итерации. Этот оператор по действию противоположен оператору break:
//--- сумма всех ненулевых элементов
int sum_func(int array[])
{
int array_size=ArraySize(array);
int sum=0;
for(int i=0;i<array_size; i++) {
if(a[i]==0) {
continue;
}
sum+=a[i];
}
return(sum);
}
Оператор цикла do while
Циклы for и while производят проверку окончания в начале, а не в конце цикла. Третий оператор цикла do-while проверяет условие окончания в конце, после каждого прохода цикла. Тело цикла всегда выполняется по крайней мере один раз:
do {
оператор;
}
while(выражение);
Сначала выполняется оператор, затем вычисляется выражение. Если оно истинно, то оператор выполняется снова, и так далее. Если выражение становится ложным, цикл заканчивается:
//--- вычисление последовательности чисел Фибоначчи
int counterFibonacci=15;
int i=0,first=0,second=1;
int currentFibonacciNumber;
do
{
currentFibonacciNumber=first+second;
Print("i = ",i," currentFibonacciNumber = ",currentFibonacciNumber);
first=second;
second=currentFibonacciNumber;
i++; // без этого оператора получится бесконечный цикл!!
}
while(i<counterFibonacci && !IsStopped());
На этом все, всем пока!
С уважением, Дмитрий аkа Silentspec
Tlap.com
Топ Брокеров 2025 по версии TLAP
Центовые счета
Быстрый ввод и вывод
Платформа CopyFx для копирования сигналов
Отличное исполнение
На рынке с 1998 года
Низкие спреды
Быстрый ввод и вывод
Хорошее исполнение
Множество способов пополнения
С 2007 года на рынке
Счета Zero с нулевыми спредами
Система Копи-трейдинга
Хорошее исполнение
Более 500 торговых инструментов
Комиссия на пополнение 0%
Лицензия ЦБ РФ
Удобный ввод и вывод средств
Подходит для крупных трейдеров
Крупнейший форекс дилер в России
Компания – налоговый агент, выплата налогов без участия клиента
Торговля через MetaTrader 5
Форекс, фондовые индексы и нефть
Низкие спреды
Хорошее исполнение
Подходит для торговли советниками
Торговля криптовалютами
Центовые счета со стартовым лотом 0.01
Система копирования сделок Share4You
Низкие спреды
Подходит для новичков
Лучшие на рынке условия для работы с сеточниками и мартингейлом
Исполнение без вмешательства дилинга
Низкие спреды
Трейдинг Forex, CFD и Crypto
Полная прозрачность работы
Множество представительств компании, в том числе в Великобритании
На рынке с 2006 года
| ||
| ||
| ||
| ||
| ||
| ||
|