Тригонометрические функции

В MQL5 представлены 3 основных тригонометрических функции (MathCos, MathSin, MathTan) и обратные им (MathArccos, MathArcsin, MathArctan). Все они работают с углами в радианах. Для углов в градусах используйте известную формулу:

radians = degrees * M_PI / 180

Здесь M_PI — одна из нескольких констант с тригонометрическими величинами (число Пи и производные от него), встроенных в язык.

Константа

Описание

Значение

M_PI

π

3.14159265358979323846

M_PI_2

π/2

1.57079632679489661923

M_PI_4

π/4

0.785398163397448309616

M_1_PI

1/π

0.318309886183790671538

M_2_PI

2/π

0.636619772367581343076

Арктангенс можно также рассчитать для величины, представленной соотношением двух координат y и x: этот расширенный вариант называется MathArctan2, он способен восстанавливать углы в полном диапазоне окружности от -M_PI до +M_PI, в отличие от MathArctan, который ограничен диапазоном от -M_PI_2 до +M_PI_2.

Тригонометрические функции и квадранты единичного круга

Тригонометрические функции и квадранты единичного круга

Примеры расчетов приведены в скрипте MathTrig.mq5 (см. после описаний).

 

double MathCos(double value) ≡ double cos(double value)

double MathSin(double value) ≡ double sin(double value)

Функции возвращают, соответственно, косинус и синус переданного числа (угла в радианах).

 

double MathTan(double value) ≡ double tan(double value)

Функция возвращает тангенс переданного числа (угла в радианах).

 

double MathArccos(double value) ≡ double acos(double value)

double MathArcsin(double value) ≡ double asin(double value)

Функции возвращают значение, соответственно, арккосинуса и арксинуса переданного числа, то есть угол в радианах. Если x = MathCos(t), то t = MathArccos(x). Для синуса и арксинуса — аналогично. Если y = MathSin(t), то t = MathArcsin(y).

Параметр должен находиться в пределах от -1 до +1. В противном случае функция вернет NaN.

Результат арккосинуса лежит в диапазоне от 0 до M_PI, а арксинуса — от -M_PI_2 до +M_PI_2. Указанные диапазоны называются главными, поскольку функции являются многозначными, то есть их значения периодически повторяются. Выбранные полупериоды полностью покрывают область определения от -1 до +1.

Полученный угол для косинуса лежит в верхнем полукруге, и симметричное решение в нижнем полукруге может быть получено добавлением знака, то есть t = -t. Для синуса полученный угол находится в правом полукруге, и второе решение в левом полукруге равно M_PI - t (если для отрицательного t требуется получить также отрицательный дополнительный угол, то -M_PI - t).

 

double MathArctan(double value) ≡ double atan(double value)

Функция возвращает для переданного числа значение арктангенса, то есть угол в радианах, в диапазоне от -M_PI_2 до +M_PI_2.

Функция является обратной по отношению к MathTan, но с одним нюансом.

Обратите внимание, что период тангенса в 2 раза меньше полного периода (длины окружности) за счет того, что отношение синуса и косинуса повторяются в противоположных квадрантах (четвертях окружности) из-за наложения знаков. В результате этого, самого по себе значения тангенса недостаточно, чтобы однозначно определить исходный угол в полном диапазоне от -M_PI до +M_PI. Это можно сделать с помощью функции MathArctan2, в которой тангенс представлен двумя раздельными компонентами.

 

double MathArctan2(double y, double x) ≡ double atan2(double y, double x)

Функция возвращает в радианах значение угла, тангенс которого равен отношению двух указанных чисел: координат по оси y и по оси x.

Результат (обозначим его как r) лежит в диапазоне от -M_PI до +M_PI, причем для него выполняется условие MathTan(r) = y / x.

Функция принимает во внимание знак обоих аргументов, чтобы определить правильный квадрант (с учетом граничных условий, когда либо x, либо y равны 0, то есть находятся на границе квадрантов).

  • 1 — x >= 0, y >= 0, 0 <= r <= M_PI_2
  • 2 — x < 0, y >= 0, M_PI_2 < r <= M_PI
  • 3 — x < 0, y < 0, -M_PI < r < -M_PI_2
  • 4 — x >= 0, y < 0, -M_PI_2 <= r < 0

Ниже представлены результаты вызовов тригонометрических функций в скрипте MathTrig.mq5.

void OnStart()
{
   PRT(MathCos(1.0));     // 0.5403023058681397
   PRT(MathSin(1.0));     // 0.8414709848078965
   PRT(MathTan(1.0));     // 1.557407724654902
   PRT(MathTan(45 * M_PI / 180.0)); // 0.9999999999999999
   
   PRT(MathArccos(1.0));         // 0.0
   PRT(MathArcsin(1.0));         // 1.570796326794897 == M_PI_2
   PRT(MathArctan(0.5));         // 0.4636476090008061, Q1
   PRT(MathArctan2(1.02.0));   // 0.4636476090008061, Q1
   PRT(MathArctan2(-1.0, -2.0)); // -2.677945044588987, Q3
}