ชุดคำสั่งสำหรับการปิดและแก้ไขออเดอร์

IUX Markets Bonus

ชุดคำสั่งสำหรับการปิดและแก้ไขออเดอร์ (Close Order, Modify Order)

การแก้ไขออเดอร์และปิดออเดอร์
การแก้ไขออเดอร์และปิดออเดอร์
  1. จัดการออเดอร์: เป็นหัวข้อหลักที่แบ่งออกเป็น 3 ส่วนย่อย
  2. ปิดออเดอร์:
    • CloseOrder(): ใช้สำหรับปิดออเดอร์เดี่ยวที่ระบุด้วย ticket
    • CloseAllOrders(): ใช้สำหรับปิดทุกออเดอร์ที่เปิดอยู่
  3. แก้ไขออเดอร์:
    • ModifyOrder(): ใช้สำหรับแก้ไข Stop Loss (SL) และ Take Profit (TP) ของออเดอร์ที่ระบุ
  4. Trailing Stop:
    • ApplyTrailingStop(): ใช้สำหรับปรับ Stop Loss แบบอัตโนมัติตามการเคลื่อนไหวของราคา

หัวข้อนี้แสดงให้เห็นภาพรวมของการจัดการออเดอร์และความสัมพันธ์ระหว่างฟังก์ชันต่างๆ ที่ใช้ในการจัดการออเดอร์

ข้อสังเกตเพิ่มเติม:

  • การปิดออเดอร์ใช้ฟังก์ชัน OrderClose() ภายใน
  • การแก้ไขออเดอร์ใช้ฟังก์ชัน OrderModify() ภายใน
  • Trailing Stop เป็นการปรับ SL อัตโนมัติตามการเคลื่อนไหวของราคา โดยใช้ฟังก์ชัน ModifyOrder() ที่สร้างไว้

การปิดออเดอร์

ฟังก์ชัน CloseOrder() ใช้สำหรับปิดออเดอร์ที่ระบุด้วย ticket โดยมีรายละเอียดดังนี้:

  • พารามิเตอร์ ticket คือหมายเลขออเดอร์ที่ต้องการปิด
  • พารามิเตอร์ lots (ตัวเลือก) คือจำนวน lot ที่ต้องการปิด ถ้าไม่ระบุหรือระบุมากกว่าที่มี จะปิดทั้งออเดอร์
  • ฟังก์ชันจะเลือกออเดอร์ด้วย OrderSelect() ก่อนทำการปิด
  • ใช้ราคา Bid สำหรับปิดออเดอร์ Buy และราคา Ask สำหรับปิดออเดอร์ Sell
  • ส่งคืนค่า true ถ้าปิดออเดอร์สำเร็จ, false ถ้าไม่สำเร็จ


bool CloseOrder(int ticket, double lots = 0.0)
{
   if(!OrderSelect(ticket, SELECT_BY_TICKET))
   {
      Print("Error selecting order ", ticket, " for closing. Error: ", GetLastError());
      return false;
   }
   
   double closeLots = (lots <= 0.0 || lots > OrderLots()) ? OrderLots() : lots;
   double closePrice = OrderType() == OP_BUY ? MarketInfo(OrderSymbol(), MODE_BID) : MarketInfo(OrderSymbol(), MODE_ASK);
   
   bool result = OrderClose(ticket, closeLots, closePrice, 3, clrRed);
   
   if(!result)
   {
      Print("Error closing order ", ticket, ". Error: ", GetLastError());
   }
   
   return result;
}

การปิดทุกออเดอร์ (Close All)

ฟังก์ชัน CloseAllOrders() ใช้สำหรับปิดทุกออเดอร์ที่เปิดอยู่:

  • วนลูปผ่านทุกออเดอร์ที่เปิดอยู่ โดยเริ่มจากออเดอร์ล่าสุดไปยังออเดอร์แรก
  • ใช้ฟังก์ชัน CloseOrder() ที่สร้างไว้ก่อนหน้านี้เพื่อปิดแต่ละออเดอร์
  • การวนลูปจากท้ายไปหัวช่วยป้องกันปัญหาการเลื่อนของ index เมื่อปิดออเดอร์

 


void CloseAllOrders()
{
   for(int i = OrdersTotal() - 1; i >= 0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         CloseOrder(OrderTicket());
      }
   }
}


 

การแก้ไขออเดอร์ (Modified Order)

HFM Market Promotion

ฟังก์ชัน ModifyOrder() ใช้สำหรับแก้ไข Stop Loss (SL) และ Take Profit (TP) ของออเดอร์ที่ระบุ:

  • พารามิเตอร์ ticket คือหมายเลขออเดอร์ที่ต้องการแก้ไข
  • พารามิเตอร์ newSL และ newTP คือค่า Stop Loss และ Take Profit ใหม่ที่ต้องการตั้ง
  • ฟังก์ชันจะเลือกออเดอร์ด้วย OrderSelect() ก่อนทำการแก้ไข
  • ใช้ OrderModify() เพื่อแก้ไขออเดอร์ โดยคงราคาเปิดเดิมไว้
  • ส่งคืนค่า true ถ้าแก้ไขสำเร็จ, false ถ้าไม่สำเร็จ

 


bool ModifyOrder(int ticket, double newSL, double newTP)
{
   if(!OrderSelect(ticket, SELECT_BY_TICKET))
   {
      Print("Error selecting order ", ticket, " for modification. Error: ", GetLastError());
      return false;
   }
   
   bool result = OrderModify(ticket, OrderOpenPrice(), newSL, newTP, 0, clrBlue);
   
   if(!result)
   {
      Print("Error modifying order ", ticket, ". Error: ", GetLastError());
   }
   
   return result;
}


 

การใช้ Trailing Stop

ฟังก์ชัน ApplyTrailingStop() ใช้สำหรับปรับ Stop Loss แบบ Trailing Stop:

  • พารามิเตอร์ ticket คือหมายเลขออเดอร์ที่ต้องการใช้ Trailing Stop
  • พารามิเตอร์ trailingPoints คือระยะห่างในหน่วย point ที่ต้องการให้ SL ตามราคา
  • ทำงานได้ทั้งกับออเดอร์ Buy และ Sell
  • สำหรับออเดอร์ Buy, จะปรับ SL ขึ้นเมื่อราคาเคลื่อนที่สูงขึ้น
  • สำหรับออเดอร์ Sell, จะปรับ SL ลงเมื่อราคาเคลื่อนที่ต่ำลง
  • ใช้ฟังก์ชัน ModifyOrder() ที่สร้างไว้ก่อนหน้านี้เพื่อแก้ไข SL

 



void ApplyTrailingStop(int ticket, int trailingPoints)
{
   if(!OrderSelect(ticket, SELECT_BY_TICKET))
   {
      Print("Error selecting order ", ticket, " for trailing stop. Error: ", GetLastError());
      return;
   }
   
   double newSL;
   
   if(OrderType() == OP_BUY)
   {
      newSL = NormalizeDouble(MarketInfo(OrderSymbol(), MODE_BID) - trailingPoints * Point, Digits);
      if(newSL > OrderStopLoss())
      {
         ModifyOrder(ticket, newSL, OrderTakeProfit());
      }
   }
   else if(OrderType() == OP_SELL)
   {
      newSL = NormalizeDouble(MarketInfo(OrderSymbol(), MODE_ASK) + trailingPoints * Point, Digits);
      if(newSL < OrderStopLoss() || OrderStopLoss() == 0)
      {
         ModifyOrder(ticket, newSL, OrderTakeProfit());
      }
   }
}

 

 

FOREXDUCK Logo

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

HFM Promotion