Slippage ใน EA (Expert Advisor) บน MT4 และ MT5 หมายถึง **ความแตกต่างระหว่างราคาที่ส่งคำสั่งซื้อขายกับราคาที่ระบบได้รับการยืนยันจริงในตลาด** ซึ่งเกิดขึ้นได้เมื่อราคาตลาดเปลี่ยนแปลงอย่างรวดเร็วหรือมีความผันผวนสูง ส่งผลให้ราคาที่เปิดออเดอร์จริงไม่ตรงกับราคาที่ EA ต้องการเปิด
---
### อธิบายง่าย ๆ
* สมมติ EA ต้องการเปิดออเดอร์ที่ราคา 1.2000
* แต่เมื่อส่งคำสั่งไปถึงโบรกเกอร์ ราคาตลาดเปลี่ยนเป็น 1.2005
* EA จะเปิดออเดอร์ที่ราคา 1.2005 แทน ซึ่งราคานี้เรียกว่า **เกิด slippage 5 pip**
---
### สาเหตุของ Slippage
* ตลาดมีความผันผวนสูง (เช่นข่าวเศรษฐกิจ)
* สภาพคล่องของตลาดต่ำ (ปริมาณซื้อขายน้อย)
* ความล่าช้าในการส่งคำสั่งซื้อขาย
---
### ตัวอย่างโค้ด EA ใน MT4 ที่ใช้กำหนด Slippage
```mql4
double price = Ask;
int slippage = 3; // กำหนด Slippage สูงสุด 3 pips
int ticket = OrderSend(Symbol(), OP_BUY, 0.1, price, slippage, 0, 0, "Buy Order", 12345, 0, clrGreen);
if(ticket < 0)
{
Print("OrderSend failed with error #", GetLastError());
}
else
{
Print("Order opened with ticket #", ticket);
}
```
* ในโค้ดนี้ `slippage` คือจำนวน pip ที่ยอมให้ราคาผิดเพี้ยนจากที่ตั้งไว้ได้ (เช่น 3 pips)
* ถ้าตลาดเปลี่ยนราคามากกว่า 3 pip คำสั่งจะไม่ถูกเปิด
---
### สรุป
* Slippage คือความแตกต่างระหว่างราคาที่ส่งคำสั่งกับราคาที่เปิดจริง
* มีผลต่อการเข้า-ออกออเดอร์ใน EA
* ควรกำหนดค่า slippage ในคำสั่งเปิดออเดอร์เพื่อควบคุมความเสี่ยง
----------------------------------------------
ได้เลยครับ! นี่คือตัวอย่างโค้ด EA แบบง่าย ๆ ทั้งใน **MT4** และ **MT5** ที่ใช้กำหนดค่า Slippage เวลาเปิดคำสั่งซื้อ (Buy Order) พร้อมอธิบายประกอบโค้ดให้ครับ
---
## ตัวอย่างโค้ด MT4 (MQL4)
```mql4
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
Print("EA เริ่มทำงาน");
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
double lotSize = 0.1; // ขนาดล็อต
double price = Ask; // ราคาซื้อปัจจุบัน
int slippage = 3; // กำหนด Slippage 3 pips
// ตรวจสอบว่าไม่มีออเดอร์เปิดอยู่แล้ว
if(OrdersTotal() == 0)
{
int ticket = OrderSend(Symbol(), OP_BUY, lotSize, price, slippage, 0, 0, "Buy Order", 12345, 0, clrGreen);
if(ticket < 0)
{
Print("เปิดออเดอร์ล้มเหลว! Error: ", GetLastError());
}
else
{
Print("เปิดออเดอร์สำเร็จ! Ticket: ", ticket);
}
}
}
```
---
## ตัวอย่างโค้ด MT5 (MQL5)
```mql5
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
Print("EA เริ่มทำงาน");
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
double lotSize = 0.1; // ขนาดล็อต
double price = SymbolInfoDouble(_Symbol, SYMBOL_ASK); // ราคาซื้อปัจจุบัน
int slippage = 3; // กำหนด Slippage 3 points (ใน MT5 เป็น points ไม่ใช่ pips)
MqlTradeRequest request;
MqlTradeResult result;
ZeroMemory(request);
ZeroMemory(result);
request.action = TRADE_ACTION_DEAL; // เปิดคำสั่งตลาด
request.symbol = _Symbol;
request.volume = lotSize;
request.type = ORDER_TYPE_BUY;
request.price = price;
request.deviation = slippage; // กำหนด Slippage
request.magic = 12345;
request.comment = "Buy Order";
if(!OrderSend(request, result))
{
Print("OrderSend ล้มเหลว! Error: ", GetLastError());
}
else
{
if(result.retcode == TRADE_RETCODE_DONE)
Print("เปิดออเดอร์สำเร็จ! Ticket: ", result.order);
else
Print("เปิดออเดอร์ไม่สำเร็จ! รหัส: ", result.retcode);
}
}
```
---
### **ข้อสังเกต**
* MT4 ใช้หน่วยเป็น **pip** ในการกำหนด slippage
* MT5 ใช้หน่วยเป็น **point** (1 pip = 10 points ในคู่เงินที่มีทศนิยม 5 ตำแหน่ง เช่น EURUSD 1.23456)
-----------------------------------------------------