ใน **MQL (MetaQuotes Language)** คำว่า **Slippage** หมายถึงค่าความคลาดเคลื่อนระหว่างราคาที่เราต้องการเทรดกับราคาที่เราถูกเปิดหรือปิดออเดอร์จริงในตลาด
### สาเหตุของ Slippage:
1. **ความผันผวนของตลาด (Market Volatility)**
- เกิดขึ้นเมื่อราคามีการเคลื่อนไหวรวดเร็ว ทำให้คำสั่งออเดอร์ของเราอาจไม่ได้รับการดำเนินการที่ราคาที่เราต้องการ
2. **สภาพคล่องของตลาด (Market Liquidity)**
- ถ้าตลาดมีสภาพคล่องต่ำ คำสั่งซื้อขายขนาดใหญ่หรือแม้แต่คำสั่งเล็กๆ อาจไม่ได้จับคู่ในราคาที่กำหนด
3. **ความเร็วของเซิร์ฟเวอร์โบรกเกอร์**
- หากโบรกเกอร์มีความล่าช้าในการดำเนินการคำสั่ง อาจทำให้ราคาเปลี่ยนไปจากราคาที่ร้องขอ
---
### การกำหนด Slippage ใน MQL4/MQL5
ในโค้ด MQL4/MQL5 เราสามารถกำหนดค่า slippage ได้โดยกำหนดเป็นพารามิเตอร์ของคำสั่ง `OrderSend()` หรือ `OrderModify()`
#### ตัวอย่างโค้ด MQL4:
```mql4
double lot = 0.1;
double price = Ask;
double stopLoss = price - 50 * Point;
double takeProfit = price + 50 * Point;
int slippage = 3; // ค่า Slippage ที่ยอมรับได้ (3 points)
int ticket = OrderSend(Symbol(), OP_BUY, lot, price, slippage, stopLoss, takeProfit);
if(ticket > 0){
Print("Order placed successfully.");
} else {
Print("Order failed. Error: ", GetLastError());
}
```
#### ตัวอย่างโค้ด MQL5:
```mql5
MqlTradeRequest request;
MqlTradeResult result;
request.action = TRADE_ACTION_DEAL;
request.symbol = Symbol();
request.volume = 0.1;
request.price = SymbolInfoDouble(Symbol(), SYMBOL_ASK);
request.slippage = 3; // ค่า Slippage ที่ยอมรับได้ (3 points)
request.tp = request.price + 50 * Point;
request.sl = request.price - 50 * Point;
request.type = ORDER_TYPE_BUY;
request.type_filling = ORDER_FILLING_IOC;
if(!OrderSend(request, result)){
Print("Order failed. Error: ", GetLastError());
}
```
---
### วิธีลดผลกระทบจาก Slippage:
1. **ใช้ Limit Orders แทน Market Orders**
- คำสั่ง **Buy Limit / Sell Limit** จะช่วยให้มั่นใจว่าเราจะได้ราคาตามที่ตั้งไว้
2. **เลือกโบรกเกอร์ที่มี Execution ดี**
- โบรกเกอร์ ECN หรือ STP มักจะมีการดำเนินการคำสั่งรวดเร็วกว่า
3. **เทรดในช่วงตลาดมีสภาพคล่องสูง**
- ช่วงที่ตลาดมีผู้เล่นเยอะ เช่น London และ New York session
4. **กำหนดค่าความยืดหยุ่นของ Slippage**
- ตั้งค่า slippage ใน `OrderSend()` ให้เหมาะสม (ไม่สูงเกินไปจนรับราคาห่างมาก และไม่ต่ำเกินไปจนคำสั่งถูกปฏิเสธ)
Slippage เป็นสิ่งที่เลี่ยงไม่ได้ในการเทรดจริง แต่สามารถบริหารจัดการให้เหมาะสมได้ 😊
----------------------------------------
ใน **MQL4/MQL5** ถ้ากำหนดค่า `slippage = 0` หมายความว่า **คุณไม่ต้องการให้มีความคลาดเคลื่อนของราคาจากคำสั่งที่ส่งไป** นั่นคือ คำสั่งซื้อขายจะต้องถูกดำเนินการที่ราคาที่ร้องขอเท่านั้น หรือไม่ก็ถูกปฏิเสธไปเลยถ้าราคามีการเปลี่ยนแปลง
---
### ผลกระทบของ `slippage = 0`:
1. **ออเดอร์อาจถูกปฏิเสธ (Rejection Rate สูงขึ้น)**
- ถ้าตลาดมีการเคลื่อนไหวเร็ว และราคาที่ร้องขอไม่มีอยู่ในขณะดำเนินการ คำสั่งจะถูกปฏิเสธโดยโบรกเกอร์
- ข้อผิดพลาดที่พบบ่อยใน MQL4 คือ `Error 138 (Requote)`
2. **เหมาะกับโบรกเกอร์ที่ไม่มี Requotes หรือมี Execution ดี**
- ถ้าโบรกเกอร์รองรับ Market Execution (โดยไม่มี requote) คำสั่งอาจถูกเปิดที่ราคาที่ดีที่สุดแทน
3. **ไม่แนะนำในตลาดที่มีความผันผวนสูง**
- เช่น ช่วงข่าวสำคัญ (High Impact News) หรือช่วงตลาดเปิด-ปิด ที่ราคาสามารถกระโดดได้
---
### ตัวอย่างการใช้งานใน **MQL4**:
```mql4
int ticket = OrderSend(Symbol(), OP_BUY, 0.1, Ask, 0, 0, 0);
if(ticket > 0) {
Print("Order placed successfully.");
} else {
Print("Order failed. Error: ", GetLastError());
}
```
**หมายเหตุ**: `slippage = 0` หมายความว่า **ถ้าราคาเปลี่ยนแปลงแม้แต่นิดเดียว คำสั่งจะถูกปฏิเสธทันที**
---
### ตัวอย่างการใช้งานใน **MQL5**:
```mql5
MqlTradeRequest request;
MqlTradeResult result;
request.action = TRADE_ACTION_DEAL;
request.symbol = Symbol();
request.volume = 0.1;
request.price = SymbolInfoDouble(Symbol(), SYMBOL_ASK);
request.slippage = 0; // ไม่ยอมรับ Slippage
request.tp = request.price + 50 * Point;
request.sl = request.price - 50 * Point;
request.type = ORDER_TYPE_BUY;
request.type_filling = ORDER_FILLING_IOC; // Immediate or Cancel
if(!OrderSend(request, result)){
Print("Order failed. Error: ", GetLastError());
}
```
---
### ควรใช้ `slippage = 0` หรือไม่?
✅ **กรณีที่ควรใช้**
- เทรดเดอร์ที่ต้องการให้คำสั่งถูกดำเนินการที่ราคาที่ร้องขอเท่านั้น
- ใช้กับโบรกเกอร์ที่มีการดำเนินการคำสั่งรวดเร็วและไม่มี requotes
❌ **กรณีที่ไม่ควรใช้**
- เทรดในช่วงข่าวที่มีความผันผวนสูง
- ใช้กับโบรกเกอร์ที่มี requotes บ่อยๆ เพราะออเดอร์อาจถูกปฏิเสธ
💡 **คำแนะนำ**: หากต้องการให้คำสั่งมีโอกาสถูกดำเนินการมากขึ้น ควรใช้ค่า `slippage` สัก **2-3 pips** แทนที่จะใช้ `0` เพื่อให้โบรกเกอร์มีความยืดหยุ่นในการเปิดคำสั่ง 😊