ชุดคำสั่งสำหรับการปิดและแก้ไขออเดอร์ (Close Order, Modify Order)
- จัดการออเดอร์: เป็นหัวข้อหลักที่แบ่งออกเป็น 3 ส่วนย่อย
- ปิดออเดอร์:
- CloseOrder(): ใช้สำหรับปิดออเดอร์เดี่ยวที่ระบุด้วย ticket
- CloseAllOrders(): ใช้สำหรับปิดทุกออเดอร์ที่เปิดอยู่
- แก้ไขออเดอร์:
- ModifyOrder(): ใช้สำหรับแก้ไข Stop Loss (SL) และ Take Profit (TP) ของออเดอร์ที่ระบุ
- 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)
ฟังก์ชัน 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 (นามปากกา) นักเขียนของเรามีประสบการณ์การเงินการลงทุนกว่า 10 ปี มีความเชี่ยวชาญในการวิเคราะห์ตลาด Forex และคริปโต โดยเฉพาะการวิเคราะห์ทางเทคนิค รวมถึงเทคนิคต่าง