การจัดการ Slippage และ Requote

IUX Markets Bonus

Slippage และ Requote เป็นสิ่งที่เกิดขึ้นได้บ่อยในการเทรด Forex โดยเฉพาะในช่วงที่ตลาดมีความผันผวนสูง การจัดการกับปัญหาเหล่านี้อย่างเหมาะสมจะช่วยให้ EA ของเราทำงานได้อย่างมีประสิทธิภาพมากขึ้น

จัดการ requote slippage
จัดการ requote slippage

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");
    }
}

  1. ฟังก์ชัน OpenOrder รับพารามิเตอร์ 4 ตัว:
    • type: ประเภทของออเดอร์ (OP_BUY หรือ OP_SELL)
    • lots: ขนาดของออเดอร์
    • price: ราคาที่ต้องการเปิดออเดอร์
    • slippage: ค่า slippage สูงสุดที่ยอมรับได้ (ในหน่วย point)
  2. กำหนดสีของลูกศรบนกราฟ: สีน้ำเงินสำหรับ Buy, สีแดงสำหรับ Sell
  3. ใช้ฟังก์ชัน OrderSend เพื่อส่งคำสั่งเปิดออเดอร์ โดยใช้พารามิเตอร์ที่รับเข้ามา
  4. ตรวจสอบผลลัพธ์ของ OrderSend:
    • ถ้าสำเร็จ จะได้เลขที่ออเดอร์ (ticket) มากกว่า 0
    • ถ้าไม่สำเร็จ จะได้ค่าน้อยกว่า 0
  5. ถ้าการส่งคำสั่งไม่สำเร็จ:
    • ดึงรหัสข้อผิดพลาดล่าสุดด้วย GetLastError()
    • แสดงข้อความแจ้งข้อผิดพลาดพร้อมคำอธิบาย
  6. ถ้าข้อผิดพลาดเป็น ERR_REQUOTE (เกิด requote):
    • ใช้ RefreshRates() เพื่อดึงราคาล่าสุด
    • ปรับราคาใหม่: ใช้ Ask สำหรับ Buy, Bid สำหรับ Sell
    • ลองส่งคำสั่งอีกครั้งด้วยราคาใหม่
  7. ส่งคืนเลขที่ออเดอร์ (ticket) ไม่ว่าจะสำเร็จหรือไม่

ฟังก์ชันนี้ช่วยจัดการทั้ง slippage และ requote:

  • จัดการ slippage โดยกำหนดค่า slippage สูงสุดที่ยอมรับได้
  • จัดการ requote โดยลองส่งคำสั่งใหม่ด้วยราคาปัจจุบันหากเกิด requote

การใช้ฟังก์ชันนี้ช่วยให้การเปิดออเดอร์มีความยืดหยุ่นและทนทานต่อสภาวะตลาดที่ผันผวนได้ดีขึ้น

2. การจัดการ Requote

Requote เกิดขึ้นเมื่อราคาเปลี่ยนแปลงอย่างรวดเร็วระหว่างที่เราส่งคำสั่งและคำสั่งนั้นถูกดำเนินการ เราสามารถจัดการโดยการลองส่งคำสั่งใหม่ด้วยราคาปัจจุบัน

ตัวอย่างโค้ด:

HFM Market Promotion

 



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");
            }
        }
    }
}

  1. ฟังก์ชัน ModifyOrder รับพารามิเตอร์ 5 ตัว:
    • ticket: เลขที่ออเดอร์ที่ต้องการแก้ไข
    • price: ราคาที่ต้องการแก้ไข (ถ้าไม่ต้องการแก้ไขราคา ใช้ราคาเปิดเดิม)
    • sl: ราคา Stop Loss ใหม่
    • tp: ราคา Take Profit ใหม่
    • retries: จำนวนครั้งที่จะลองแก้ไขออเดอร์ซ้ำหากไม่สำเร็จ (ค่าเริ่มต้นคือ 3)
  2. กำหนดตัวแปร result เป็น false และ attempt เป็น 0 เพื่อเริ่มต้นการทำงาน
  3. ใช้ loop while เพื่อพยายามแก้ไขออเดอร์จนกว่าจะสำเร็จหรือครบจำนวนครั้งที่กำหนด:
    • ใช้ฟังก์ชัน OrderModify เพื่อแก้ไขออเดอร์
  4. ถ้าการแก้ไขไม่สำเร็จ:
    • ดึงรหัสข้อผิดพลาดล่าสุดด้วย GetLastError()
    • แสดงข้อความแจ้งข้อผิดพลาดพร้อมคำอธิบาย
  5. ถ้าข้อผิดพลาดเป็น ERR_REQUOTE (เกิด requote):
    • ใช้ RefreshRates() เพื่อดึงราคาล่าสุด
    • ตั้งค่าราคาใหม่เป็นราคาเปิดเดิมของออเดอร์ (ใช้ OrderOpenPrice())
    • ใช้ continue เพื่อลองแก้ไขออเดอร์อีกครั้งทันที
  6. ถ้าไม่ใช่ error จาก requote:
    • ใช้ Sleep(1000) เพื่อรอ 1 วินาทีก่อนที่จะลองแก้ไขออเดอร์อีกครั้ง
  7. เพิ่มค่า attempt ขึ้น 1 ในแต่ละรอบ
  8. ส่งคืนค่า result ซึ่งจะเป็น true ถ้าแก้ไขออเดอร์สำเร็จ หรือ false ถ้าไม่สำเร็จ

ฟังก์ชันนี้ช่วยจัดการปัญหา requote และความล้มเหลวในการแก้ไขออเดอร์:

  • พยายามแก้ไขออเดอร์หลายครั้งหากไม่สำเร็จ
  • จัดการ requote โดยใช้ราคาเปิดเดิมและลองแก้ไขใหม่ทันที
  • รอระยะเวลาสั้นๆ ระหว่างการพยายามแก้ไขแต่ละครั้ง เพื่อให้ตลาดมีเวลาปรับตัว

การใช้ฟังก์ชันนี้ช่วยให้การแก้ไขออเดอร์มีความน่าเชื่อถือมากขึ้น โดยเฉพาะในสภาวะตลาดที่มีความผันผวนสูง

ในตัวอย่างนี้ เราได้สร้างฟังก์ชัน OpenOrder และ ModifyOrder ที่มีการจัดการทั้ง Slippage และ Requote:

  1. สำหรับ Slippage เรากำหนดค่า maximum slippage ที่ยอมรับได้เมื่อเปิดออเดอร์
  2. สำหรับ Requote เรามีการตรวจสอบข้อผิดพลาดและลองส่งคำสั่งใหม่ด้วยราคาปัจจุบันหากเกิด Requote
  3. ในกรณีของการแก้ไขออเดอร์ เรามีการลองส่งคำสั่งซ้ำหลายครั้งหากเกิด Requote

การจัดการ Slippage และ Requote อย่างเหมาะสมจะช่วยให้ EA ของเราทำงานได้อย่างมีประสิทธิภาพและน่าเชื่อถือมากขึ้น แม้ในสภาวะตลาดที่มีความผันผวนสูง

FOREXDUCK Logo

FOREXDUCK (นามปากกา) นักเขียนของเรามีประสบการณ์การเงินการลงทุนกว่า 10 ปี มีความเชี่ยวชาญในการวิเคราะห์ตลาด Forex และคริปโต โดยเฉพาะการวิเคราะห์ทางเทคนิค รวมถึงเทคนิคต่าง

HFM Promotion