MQL5 – Математические функции и циклы

Всем привет! В этом уроке мы познакомимся с математическими функциями, предусмотренными в языке mql5, и, что более важно, рассмотрим операторы цикла. Это важные знания, особенно при работе с массивами. А массивов при программировании торговых роботов вам встретится огромное множество.

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


Предыдущие уроки


MQL5 программирование: Математические функции и циклы

Функции округления

Таких функций несколько.

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 прекращает выполнение ближайшего вложенного внешнего оператора switchwhiledo-while или for. Управление передается оператору, следующему за заканчиваемым. Одно из назначений этого оператора – закончить выполнение цикла при присваивании некоторой переменной определенного значения:

//--- поиск первого нулевого элемента
for(i=0;i<array_size;i++) {
    if(array[i]==0) {
        break;

    }
}

Оператор продолжения continue

Оператор continue передает управление в начало ближайшего внешнего оператора цикла whiledo-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

Уроки по MQL5 , , ,