Pip và Point trong MT5 khác nhau thế nào? Cách quy đổi & đặt SL/TP chuẩn cho EA
Trong MT5, chỉ cần nhầm lẫn giữa Pip và Point, bạn có thể đặt Stop Loss sai 10 lần mà không hề hay biết — đến khi bot bị quét SL liên tục hoặc backtest "đẹp" nhưng live thua, bạn mới vỡ lẽ. Đây là một trong những lỗi cơ bản nhất của người mới làm quen với EA MQL5 và bot giao dịch.
Bài viết này giúp bạn phân biệt rõ ràng hai đơn vị này, nắm chắc cách quy đổi cho từng loại tài sản (cặp tiền, vàng, crypto...), và viết đúng code SL/TP trong MQL5 — để chiến lược của bạn chạy đúng như thiết kế.
Hiểu đúng Point — đơn vị "gốc" của nền tảng
Point (điểm) là bước nhảy giá nhỏ nhất mà một symbol có thể hiển thị trên MT5. Đây là đơn vị nội bộ mà nền tảng dùng để tính toán mọi thứ.
Point phụ thuộc vào số chữ số thập phân
Mỗi symbol có số chữ số thập phân (digits) riêng — và Point chính là đơn vị ứng với chữ số cuối cùng trên bảng giá:
| Loại symbol | Ví dụ giá | Digits | 1 Point |
|---|---|---|---|
| Cặp tiền chuẩn | EURUSD = 1.08432 | 5 | 0.00001 |
| Cặp JPY | USDJPY = 154.253 | 3 | 0.001 |
| Vàng 2 số | XAUUSD = 2415.50 | 2 | 0.01 |
| Vàng 3 số | XAUUSD = 2415.503 | 3 | 0.001 |
Nói gọn: Point = mức thay đổi giá tối thiểu của symbol đang xét. Đây cũng chính là định nghĩa được dạy trong khóa Kiến thức Giao dịch Tài chính Forex & MT5.
Lấy Point trong MQL5
MQL5 cung cấp sẵn giá trị Point và Digits qua hàm:
// Giá trị Point của symbol hiện tại
double point = SymbolInfoDouble(_Symbol, SYMBOL_POINT);
Print("Point = ", point);
// Số chữ số thập phân
int digits = (int)SymbolInfoInteger(_Symbol, SYMBOL_DIGITS);
Print("Digits = ", digits);Chạy thử trên vàng (XAUUSD) sẽ cho:
Point = 0.01
Digits = 2Còn trên EURUSD:
Point = 0.00001
Digits = 5Pip — đơn vị "thương mại" quen thuộc của trader
Pip (viết tắt của Percentage In Point) là đơn vị chuẩn mà trader dùng để trao đổi về biến động giá — kiểu như "cặp này ăn 30 pip", "SL 20 pip". Khác với Point (đơn vị nội bộ), Pip là ngôn ngữ chung của cộng đồng giao dịch.
Quy ước Pip theo từng tài sản
- Hầu hết cặp tiền tệ: 1 Pip = 0.0001 (4 chữ số).
- Các cặp chứa JPY: 1 Pip = 0.01 (2 chữ số).
- Vàng (XAUUSD): thường quy ước 1 Pip = 0.1 giá (tức 1.0 giá = 100 Point = 10 Pip).
Vì sao cần phân biệt?
Trước đây bảng giá chỉ hiển thị 4 chữ số thập phân, nên "một bước giá" và "một Pip" trùng nhau. Ngày nay MT5 hiển thị nhiều chữ số hơn (thường 5 số với cặp tiền), nên hai khái niệm tách rời:
- Một bước giá nhỏ nhất (Point) = 0.00001 (cặp 5 số).
- Một Pip vẫn được quy ước = 0.0001.
Kết quả: 1 Pip = 10 Point đối với hầu hết cặp tiền. Đây chính là mấu chốt khiến nhiều người nhầm lẫn.
Bảng quy đổi Pip ↔ Point nhanh
Để dễ tra cứu, đây là bảng quy đổi cho các symbol phổ biến:
| Symbol | Digits | 1 Point | 1 Pip | Quy đổi |
|---|---|---|---|---|
| EURUSD (5 số) | 5 | 0.00001 | 0.0001 | 10 Point |
| GBPUSD (5 số) | 5 | 0.00001 | 0.0001 | 10 Point |
| USDJPY (3 số) | 3 | 0.001 | 0.01 | 10 Point |
| EURJPY (3 số) | 3 | 0.001 | 0.01 | 10 Point |
| XAUUSD 2 số | 2 | 0.01 | 0.1 | 10 Point |
| XAUUSD 3 số | 3 | 0.001 | 0.1 | 100 Point |
| BTCUSD (2 số) | 2 | 0.01 | — | — |
Lưu ý: BTCUSD thường không dùng Pip theo quy ước truyền thống — bạn nên xác định theo digits của sàn.
Vì sao khi viết EA phải làm việc với Point?
Khi giao dịch tay, bạn nói "đặt SL 20 pip" — rất trực quan. Nhưng MQL5 tính toán bằng Point. Nếu bạn viết nhầm:
double sl = Bid - 20 * _Point; // ❌ Sai: chỉ cách 20 Point = 2 pipBạn vừa đặt SL cách giá 20 Point = 2 Pip — khoảng cách quá nhỏ, bot bị quét SL gần như ngay lập tức. Đây là lỗi cực phổ biến với người mới.
Quy đổi đúng trong MQL5
Muốn đặt SL/TP theo Pip, phải đổi sang Point trước:
// Số Point trong 1 Pip (mặc định 10)
int pointsPerPip = 10;
// Ngoại lệ: Vàng hiển thị 3 chữ số → 100 Point / Pip
if (SymbolInfoInteger(_Symbol, SYMBOL_DIGITS) == 3 &&
StringFind(_Symbol, "XAU") >= 0)
pointsPerPip = 100;
// SL cách 20 pip
double slDistance = 20 * pointsPerPip * _Point;
double slPrice = NormalizeDouble(Bid - slDistance, _Digits);Hoặc viết hẳn một hàm tiện ích dùng lại nhiều nơi:
int PointsPerPip(const string symbol)
{
int digits = (int)SymbolInfoInteger(symbol, SYMBOL_DIGITS);
if (digits == 3 && StringFind(symbol, "XAU") >= 0)
return 100; // vàng 3 số
return 10; // mặc định
}Thực hành: đặt SL/TP chuẩn cho Vàng (XAUUSD)
Giả sử giá vàng đang ở 2415.50, bạn muốn SL cách 200 Point và TP cách 400 Point (tức 20 Pip / 40 Pip).
Tính trên chart thủ công
Vì vàng 2 chữ số: 1 Point = 0.01 → 200 Point = 2.00 giá, 400 Point = 4.00 giá.
- SL = 2415.50 − 2.00 = 2413.50
- TP = 2415.50 + 4.00 = 2419.50
Tính trong MQL5
double entry = 2415.50;
double slPoints = 200; // = 20 pip
double tpPoints = 400; // = 40 pip
double sl = NormalizeDouble(entry - slPoints * _Point, _Digits);
double tp = NormalizeDouble(entry + tpPoints * _Point, _Digits);
Print("SL = ", sl, " | TP = ", tp); // SL = 2413.50 | TP = 2419.50Lệnh BUY hoàn chỉnh
MqlTradeRequest request = {};
MqlTradeResult result = {};
request.action = TRADE_ACTION_DEAL;
request.symbol = _Symbol;
request.volume = 0.10;
request.type = ORDER_TYPE_BUY;
request.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
request.sl = sl;
request.tp = tp;
request.deviation = 10;
request.type_filling = ORDER_FILLING_IOC;
request.comment = "Buy theo Point";
if (OrderSend(request, result))
Print("Lệnh mua OK: ", result.order);
else
Print("Thất bại: ", result.retcode, " ", result.comment);Tính khối lượng lệnh theo rủi ro (risk-based)
Hiểu đúng Pip/Point còn giúp tính lot chuẩn theo % vốn — nền tảng của quản trị rủi ro:
// Rủi ro 1% tài khoản, SL 20 pip
double balance = AccountInfoDouble(ACCOUNT_BALANCE);
double riskMoney = balance * 0.01;
double slDistanceInPrice = 20 * PointsPerPip(_Symbol) * _Point;
double tickValue = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE);
double tickSize = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE);
double volume = riskMoney / (slDistanceInPrice / tickSize * tickValue);
volume = NormalizeDouble(volume, 2);
Print("Khối lượng đề xuất: ", volume, " lot");Cách này đảm bảo dù bạn giao dịch cặp nào, mức rủi ro mỗi lệnh luôn bằng nhau — không bị lệch vì khác digits.
Những cái bẫy khiến SL/TP sai khi chạy EA
1. Coi "1 Pip = 1 Point"
Đây là sai lầm đắt giá nhất: với cặp 5 chữ số, bạn vô tình đặt SL nhỏ đi 10 lần → bot bị quét liên tục, backtest không khớp ý đồ chiến lược.
2. Bỏ qua NormalizeDouble
SL/TP phải làm tròn đúng số thập phân của symbol, nếu không broker sẽ từ chối lệnh:
double sl = NormalizeDouble(Bid - 20 * PointsPerPip(_Symbol) * _Point, _Digits);3. Tính SL/TP nhầm Bid/Ask
- Lệnh BUY: SL/TP tính từ giá ASK.
- Lệnh SELL: SL/TP tính từ giá BID.
- Kiểm tra chế độ khớp lệnh (
ORDER_FILLING_FOK / IOC) phù hợp với symbol.
4. Áp công thức cặp tiền cho Vàng
Vàng có đặc thù riêng (nhất là khi sàn hiển thị 3 chữ số). Luôn kiểm tra SYMBOL_DIGITS và SYMBOL_POINT trước khi tính.
Script kiểm tra nhanh Point/Pip
Chạy script sau trên chart EURUSD và XAUUSD để thấy rõ sự khác biệt:
//+------------------------------------------------------------------+
//| CheckPipPoint.mq5 — In thông số Point/Pip của symbol |
//+------------------------------------------------------------------+
#property strict
void OnStart()
{
string symbol = _Symbol;
double point = SymbolInfoDouble(symbol, SYMBOL_POINT);
int digits = (int)SymbolInfoInteger(symbol, SYMBOL_DIGITS);
int pointsPerPip = (digits == 3 && StringFind(symbol, "XAU") >= 0) ? 100 : 10;
Print("=== ", symbol, " ===");
Print("Point = ", point);
Print("Digits = ", digits);
Print("1 Pip = ", pointsPerPip, " Point");
Print("1 Pip = ", pointsPerPip * point, " giá");
}Lợi ích khi nắm vững Pip và Point
Khi đã rõ hai khái niệm này, bạn sẽ:
- Đặt SL/TP chuẩn — không còn bị quét SL vì khoảng cách sai.
- Tính lot đúng — dựa trên khoảng cách SL tính bằng Pip.
- Backtest nhất quán — tham số "SL/TP theo Pip" đồng bộ giữa các cặp.
- Giao tiếp chuẩn — đọc tài liệu, xem webinar, trao đổi với trader khác đều dùng Pip.
Đây chính là nền tảng nhỏ nhưng quyết định để xây dựng hệ thống giao dịch forex vận hành ổn định — từ khâu đặt lệnh cho đến backtest và tối ưu bot.
Câu hỏi thường gặp
Pip và Point có phải là một không?
Không. Point là bước giá nhỏ nhất của nền tảng; Pip là đơn vị đo biến động tiêu chuẩn của trader. Với hầu hết cặp tiền, 1 Pip = 10 Point.
1 Pip bằng bao nhiêu Point trong MT5?
- Cặp tiền 5 chữ số (EURUSD): 1 Pip = 10 Point.
- Cặp JPY 3 chữ số (USDJPY): 1 Pip = 10 Point.
- Vàng 2 chữ số: 1 Pip = 10 Point.
- Vàng 3 chữ số: 1 Pip = 100 Point.
1 Point của Vàng là bao nhiêu?
Với XAUUSD hiển thị 2 chữ số thập phân: 1 Point = 0.01 giá, tức 1.0 giá Vàng = 100 Point.
Khi viết EA nên dùng Pip hay Point?
Trong MQL5, lệnh luôn tính theo Point (biến _Point). Bạn phải quy đổi từ Pip sang Point trước khi đặt SL/TP.
Làm sao biết symbol có bao nhiêu chữ số?
Dùng SymbolInfoInteger(symbol, SYMBOL_DIGITS) hoặc xem mục "Specification" của symbol trong MT5.
Kết luận
Tóm lại: Point là đơn vị nội bộ của MT5 (bước giá nhỏ nhất), còn Pip là đơn vị chuẩn của trader để nói về biến động. Mối quan hệ phổ biến nhất: 1 Pip = 10 Point (với vàng 3 số thì 100 Point).
Hiểu đúng hai khái niệm này giúp bạn tránh lỗi SL/TP chết người khi lập trình bot, backtest chính xác hơn, và giao tiếp hiệu quả trong cộng đồng trader.
Nếu bạn muốn học bài bản từ nền tảng — từ nến, Pip/Point, lệnh cho đến viết bot EA MQL5 chạy thật — hãy tham gia khóa Kiến thức Giao dịch Tài chính & Lập trình Robot EA Forex (MT5 Cơ bản) tại DNT Digital, hoặc tiếp tục với khóa Lập Trình MT5 Nâng Cao – Hedging & Tự Động Hóa để làm chủ hệ thống bot thực chiến: Xem khóa MT5 Nâng Cao.
