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

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

 YWO 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 ของเราทำงานได้อย่างมีประสิทธิภาพและน่าเชื่อถือมากขึ้น แม้ในสภาวะตลาดที่มีความผันผวนสูง

 Exness Promotion
PNFPB Install PWA using share icon

For IOS and IPAD browsers, Install PWA using add to home screen in ios safari browser or add to dock option in macos safari browser