Slippage และ Requote เป็นสิ่งที่เกิดขึ้นได้บ่อยในการเทรด Forex โดยเฉพาะในช่วงที่ตลาดมีความผันผวนสูง การจัดการกับปัญหาเหล่านี้อย่างเหมาะสมจะช่วยให้ EA ของเราทำงานได้อย่างมีประสิทธิภาพมากขึ้น
1. การจัดการ Slippage
Slippage คือความแตกต่างระหว่างราคาที่คาดหวังกับราคาที่ได้จริงเมื่อคำสั่งซื้อขายถูกดำเนินการ เราสามารถจัดการ Slippage ได้โดยกำหนดค่า maximum slippage ที่ยอมรับได้
ตัวอย่างโค้ด:
int OpenOrder(int type, double lots, double price, int slippage)
{
color arrow_color = (type == OP_BUY) ? clrBlue : clrRed;
int ticket = OrderSend(Symbol(), type, lots, price, slippage, 0, 0, "Order", 0, 0, arrow_color);
if(ticket < 0) { int error = GetLastError(); Print("OrderSend failed with error #", error, ": ", ErrorDescription(error)); // ถ้าเกิด requote ลองส่งคำสั่งใหม่ด้วยราคาปัจจุบัน if(error == ERR_REQUOTE) { RefreshRates(); price = (type == OP_BUY) ? Ask : Bid; ticket = OrderSend(Symbol(), type, lots, price, slippage, 0, 0, "Order", 0, 0, arrow_color); } } return ticket; } // ใช้งานฟังก์ชัน void OnTick() { if(SomeCondition()) { double lots = 0.1; int slippage = 3; // ยอมรับ slippage ได้ไม่เกิน 3 pips int ticket = OpenOrder(OP_BUY, lots, Ask, slippage); if(ticket > 0)
Print("Order opened successfully");
}
}
- ฟังก์ชัน
OpenOrder
รับพารามิเตอร์ 4 ตัว:type
: ประเภทของออเดอร์ (OP_BUY หรือ OP_SELL)lots
: ขนาดของออเดอร์price
: ราคาที่ต้องการเปิดออเดอร์slippage
: ค่า slippage สูงสุดที่ยอมรับได้ (ในหน่วย point)
- กำหนดสีของลูกศรบนกราฟ: สีน้ำเงินสำหรับ Buy, สีแดงสำหรับ Sell
- ใช้ฟังก์ชัน
OrderSend
เพื่อส่งคำสั่งเปิดออเดอร์ โดยใช้พารามิเตอร์ที่รับเข้ามา - ตรวจสอบผลลัพธ์ของ
OrderSend
:- ถ้าสำเร็จ จะได้เลขที่ออเดอร์ (ticket) มากกว่า 0
- ถ้าไม่สำเร็จ จะได้ค่าน้อยกว่า 0
- ถ้าการส่งคำสั่งไม่สำเร็จ:
- ดึงรหัสข้อผิดพลาดล่าสุดด้วย
GetLastError()
- แสดงข้อความแจ้งข้อผิดพลาดพร้อมคำอธิบาย
- ดึงรหัสข้อผิดพลาดล่าสุดด้วย
- ถ้าข้อผิดพลาดเป็น
ERR_REQUOTE
(เกิด requote):- ใช้
RefreshRates()
เพื่อดึงราคาล่าสุด - ปรับราคาใหม่: ใช้ Ask สำหรับ Buy, Bid สำหรับ Sell
- ลองส่งคำสั่งอีกครั้งด้วยราคาใหม่
- ใช้
- ส่งคืนเลขที่ออเดอร์ (ticket) ไม่ว่าจะสำเร็จหรือไม่
ฟังก์ชันนี้ช่วยจัดการทั้ง slippage และ requote:
- จัดการ slippage โดยกำหนดค่า slippage สูงสุดที่ยอมรับได้
- จัดการ requote โดยลองส่งคำสั่งใหม่ด้วยราคาปัจจุบันหากเกิด requote
การใช้ฟังก์ชันนี้ช่วยให้การเปิดออเดอร์มีความยืดหยุ่นและทนทานต่อสภาวะตลาดที่ผันผวนได้ดีขึ้น
2. การจัดการ Requote
Requote เกิดขึ้นเมื่อราคาเปลี่ยนแปลงอย่างรวดเร็วระหว่างที่เราส่งคำสั่งและคำสั่งนั้นถูกดำเนินการ เราสามารถจัดการโดยการลองส่งคำสั่งใหม่ด้วยราคาปัจจุบัน
ตัวอย่างโค้ด:
bool ModifyOrder(int ticket, double price, double sl, double tp, int retries = 3)
{
bool result = false;
int attempt = 0;
while(!result && attempt < retries)
{
result = OrderModify(ticket, price, sl, tp, 0);
if(!result)
{
int error = GetLastError();
Print("OrderModify failed with error #", error, ": ", ErrorDescription(error));
if(error == ERR_REQUOTE)
{
RefreshRates();
price = OrderOpenPrice(); // ใช้ราคาเปิดเดิม
continue;
}
Sleep(1000); // รอ 1 วินาทีก่อนลองใหม่
}
attempt++;
}
return result;
}
// ใช้งานฟังก์ชัน
void OnTick()
{
for(int i = 0; i < OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderType() <= OP_SELL && OrderSymbol() == Symbol())
{
double newSL = (OrderType() == OP_BUY) ? Bid - 20*Point : Ask + 20*Point;
if(ModifyOrder(OrderTicket(), OrderOpenPrice(), newSL, OrderTakeProfit()))
Print("Order modified successfully");
}
}
}
}
- ฟังก์ชัน
ModifyOrder
รับพารามิเตอร์ 5 ตัว:ticket
: เลขที่ออเดอร์ที่ต้องการแก้ไขprice
: ราคาที่ต้องการแก้ไข (ถ้าไม่ต้องการแก้ไขราคา ใช้ราคาเปิดเดิม)sl
: ราคา Stop Loss ใหม่tp
: ราคา Take Profit ใหม่retries
: จำนวนครั้งที่จะลองแก้ไขออเดอร์ซ้ำหากไม่สำเร็จ (ค่าเริ่มต้นคือ 3)
- กำหนดตัวแปร
result
เป็น false และattempt
เป็น 0 เพื่อเริ่มต้นการทำงาน - ใช้ loop
while
เพื่อพยายามแก้ไขออเดอร์จนกว่าจะสำเร็จหรือครบจำนวนครั้งที่กำหนด:- ใช้ฟังก์ชัน
OrderModify
เพื่อแก้ไขออเดอร์
- ใช้ฟังก์ชัน
- ถ้าการแก้ไขไม่สำเร็จ:
- ดึงรหัสข้อผิดพลาดล่าสุดด้วย
GetLastError()
- แสดงข้อความแจ้งข้อผิดพลาดพร้อมคำอธิบาย
- ดึงรหัสข้อผิดพลาดล่าสุดด้วย
- ถ้าข้อผิดพลาดเป็น
ERR_REQUOTE
(เกิด requote):- ใช้
RefreshRates()
เพื่อดึงราคาล่าสุด - ตั้งค่าราคาใหม่เป็นราคาเปิดเดิมของออเดอร์ (ใช้
OrderOpenPrice()
) - ใช้
continue
เพื่อลองแก้ไขออเดอร์อีกครั้งทันที
- ใช้
- ถ้าไม่ใช่ error จาก requote:
- ใช้
Sleep(1000)
เพื่อรอ 1 วินาทีก่อนที่จะลองแก้ไขออเดอร์อีกครั้ง
- ใช้
- เพิ่มค่า
attempt
ขึ้น 1 ในแต่ละรอบ - ส่งคืนค่า
result
ซึ่งจะเป็นtrue
ถ้าแก้ไขออเดอร์สำเร็จ หรือfalse
ถ้าไม่สำเร็จ
ฟังก์ชันนี้ช่วยจัดการปัญหา requote และความล้มเหลวในการแก้ไขออเดอร์:
- พยายามแก้ไขออเดอร์หลายครั้งหากไม่สำเร็จ
- จัดการ requote โดยใช้ราคาเปิดเดิมและลองแก้ไขใหม่ทันที
- รอระยะเวลาสั้นๆ ระหว่างการพยายามแก้ไขแต่ละครั้ง เพื่อให้ตลาดมีเวลาปรับตัว
การใช้ฟังก์ชันนี้ช่วยให้การแก้ไขออเดอร์มีความน่าเชื่อถือมากขึ้น โดยเฉพาะในสภาวะตลาดที่มีความผันผวนสูง
ในตัวอย่างนี้ เราได้สร้างฟังก์ชัน OpenOrder
และ ModifyOrder
ที่มีการจัดการทั้ง Slippage และ Requote:
- สำหรับ Slippage เรากำหนดค่า maximum slippage ที่ยอมรับได้เมื่อเปิดออเดอร์
- สำหรับ Requote เรามีการตรวจสอบข้อผิดพลาดและลองส่งคำสั่งใหม่ด้วยราคาปัจจุบันหากเกิด Requote
- ในกรณีของการแก้ไขออเดอร์ เรามีการลองส่งคำสั่งซ้ำหลายครั้งหากเกิด Requote
การจัดการ Slippage และ Requote อย่างเหมาะสมจะช่วยให้ EA ของเราทำงานได้อย่างมีประสิทธิภาพและน่าเชื่อถือมากขึ้น แม้ในสภาวะตลาดที่มีความผันผวนสูง
FOREXDUCK (นามปากกา) นักเขียนของเรามีประสบการณ์การเงินการลงทุนกว่า 10 ปี มีความเชี่ยวชาญในการวิเคราะห์ตลาด Forex และคริปโต โดยเฉพาะการวิเคราะห์ทางเทคนิค รวมถึงเทคนิคต่าง