Hàm lượng giác
MQL5 cung cấp ba hàm lượng giác chính (MathCos, MathSin, MathTan
) và các hàm ngược của chúng (MathArccos, MathArcsin, MathArctan
). Tất cả đều hoạt động với góc tính bằng radian. Đối với góc tính bằng độ, sử dụng công thức:
radians = degrees * M_PI / 180
Ở đây, M_PI
là một trong số các hằng số chứa các đại lượng lượng giác (pi và các dẫn xuất của nó) được tích hợp trong ngôn ngữ.
Hằng số | Mô tả | Giá trị |
---|---|---|
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 |
Hàm arctangent cũng có thể được tính cho một đại lượng biểu diễn bằng tỷ lệ của hai tọa độ y
và x
: phiên bản mở rộng này được gọi là MathArctan2
; nó có khả năng khôi phục góc trong toàn dải vòng tròn từ -M_PI đến +M_PI, không giống như MathArctan
, vốn bị giới hạn trong khoảng từ -M_PI_2 đến +M_PI_2.
Hàm lượng giác và các góc phần tư của vòng tròn đơn vị
Ví dụ về tính toán được đưa ra trong script MathTrig.mq5
(xem sau phần mô tả).
double MathCos(double value) ≡ double cos(double value)
Các hàm này lần lượt trả về cosin và sin của số được truyền vào (góc tính bằng radian).
double MathTan(double value) ≡ double tan(double value)
Hàm này trả về tang của số được truyền vào (góc tính bằng radian).
double MathArcsin(double value) ≡ double asin(double value)
Các hàm này lần lượt trả về giá trị của arccosin và arcsin của số được truyền vào, tức là góc tính bằng radian. Nếu x = MathCos(t)
, thì t = MathArccos(x)
. Sin và arcsin có sơ đồ tương tự. Nếu y = MathSin(t)
, thì t = MathArcsin(y)
.
Tham số phải nằm trong khoảng từ -1 đến +1. Nếu không, hàm sẽ trả về NaN.
Kết quả của arccosin nằm trong khoảng từ 0 đến M_PI
, và kết quả của arcsin nằm trong khoảng từ -M_PI_2 đến +M_PI_2. Các khoảng này được gọi là khoảng chính, vì các hàm này là đa trị, tức là giá trị của chúng lặp lại theo chu kỳ. Các nửa chu kỳ được chọn bao phủ hoàn toàn vùng xác định từ -1 đến +1.
Góc kết quả cho cosin nằm trong nửa vòng tròn trên, và nghiệm đối xứng trong nửa vòng tròn dưới có thể được lấy bằng cách thêm dấu, tức là t = -t
. Đối với sin, góc kết quả nằm trong nửa vòng tròn bên phải, và nghiệm thứ hai trong nửa vòng tròn bên trái là M_PI - t
(nếu với t
âm cũng cần lấy góc bổ sung âm, thì là -M_PI - t
).
double MathArctan(double value) ≡ double atan(double value)
Hàm này trả về giá trị của arctangent cho số được truyền vào, tức là góc tính bằng radian, trong khoảng từ -M_PI_2 đến +M_PI_2.
Hàm này là nghịch đảo của MathTan
, nhưng có một lưu ý.
Lưu ý rằng chu kỳ của tang nhỏ hơn 2 lần so với chu kỳ đầy đủ (chu vi) do tỷ lệ sin và cosin lặp lại ở các góc phần tư đối diện (tứ phân của vòng tròn) do sự chồng lấn của dấu. Do đó, chỉ giá trị tang không đủ để xác định duy nhất góc ban đầu trong toàn dải từ -M_PI đến +M_PI. Điều này có thể được thực hiện bằng hàm MathArctan2
, trong đó tang được biểu diễn bằng hai thành phần riêng biệt.
double MathArctan2(double y, double x) ≡ double atan2(double y, double x)
Hàm này trả về bằng radian giá trị của góc, mà tang của nó bằng tỷ lệ của hai số được chỉ định: tọa độ dọc theo trục y
và trục x
.
Kết quả (gọi là r
) nằm trong khoảng từ -M_PI đến +M_PI, và thỏa mãn điều kiện MathTan(r) = y / x
.
Hàm này xem xét dấu của cả hai đối số để xác định góc phần tư chính xác (tùy thuộc vào điều kiện biên, khi x
hoặc y
bằng 0, tức là nằm trên ranh giới của các góc phần tư):
- 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
Dưới đây là kết quả của việc gọi các hàm lượng giác trong script 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.0, 2.0)); // 0.4636476090008061, Q1
PRT(MathArctan2(-1.0, -2.0)); // -2.677945044588987, Q3
}
2
3
4
5
6
7
8
9
10
11
12
13