ชุดคำสั่งสำหรับการเปิดออเดอร์ (Market Orders, Pending Orders)
ในการเทรด Forex ด้วย Expert Advisor (EA) การเปิดออเดอร์เป็นหนึ่งในฟังก์ชันพื้นฐานที่สำคัญที่สุด MQL4 มีฟังก์ชัน OrderSend() ที่ใช้สำหรับการเปิดออเดอร์ทั้ง Market Orders และ Pending Orders ลองมาดูวิธีการใช้งานกัน:
- การเปิดออเดอร์แบ่งเป็นสองประเภทหลัก: Market Order และ Pending Order
- Market Order:
- Pending Order:
- ซื้อในอนาคต:
- Buy Limit: ตั้งคำสั่งซื้อที่ราคาต่ำกว่าราคาปัจจุบัน
- Buy Stop: ตั้งคำสั่งซื้อที่ราคาสูงกว่าราคาปัจจุบัน
- ขายในอนาคต:
- Sell Limit: ตั้งคำสั่งขายที่ราคาสูงกว่าราคาปัจจุบัน
- Sell Stop: ตั้งคำสั่งขายที่ราคาต่ำกว่าราคาปัจจุบัน
- ซื้อในอนาคต:
การเปิด Market Order
Market Order คือการเปิดออเดอร์ทันทีที่ราคาปัจจุบัน
int OpenMarketOrder(int type, double lots, double sl = 0, double tp = 0, string comment = "")
{
int ticket;
double price;
double stopLoss = sl;
double takeProfit = tp;
if(type == OP_BUY)
price = Ask;
else if(type == OP_SELL)
price = Bid;
else
return -1;
ticket = OrderSend(Symbol(), type, lots, price, 3, stopLoss, takeProfit, comment, 0, 0, clrNONE);
if(ticket < 0)
Print("Error opening market order: ", GetLastError());
else
Print("Market order opened successfully. Ticket: ", ticket);
return ticket;
}
// วิธีการใช้งาน
void OnTick()
{
// เปิด Buy order ขนาด 0.1 lot
OpenMarketOrder(OP_BUY, 0.1);
// เปิด Sell order ขนาด 0.1 lot พร้อม SL 50 pips และ TP 100 pips
OpenMarketOrder(OP_SELL, 0.1, Bid + 500 * Point, Bid - 1000 * Point, "My Sell Order");
}
Market Order คือการเปิดออเดอร์ทันทีที่ราคาปัจจุบัน โดยมีรายละเอียดดังนี้:
- ประเภทของ Market Order:
- OP_BUY: เปิดออเดอร์ซื้อทันที
- OP_SELL: เปิดออเดอร์ขายทันที
- ราคาเปิดออเดอร์:
- สำหรับ OP_BUY ใช้ราคา Ask
- สำหรับ OP_SELL ใช้ราคา Bid
- พารามิเตอร์ที่สำคัญ:
- Symbol(): คู่สกุลเงินที่ต้องการเทรด
- lots: ขนาดของออเดอร์ (เช่น 0.1 = 0.1 lot)
- slippage: ค่าความคลาดเคลื่อนของราคาที่ยอมรับได้ (ในตัวอย่างใช้ค่า 3)
- stopLoss: ราคาที่จะปิดออเดอร์เพื่อจำกัดการขาดทุน
- takeProfit: ราคาที่จะปิดออเดอร์เพื่อทำกำไร
- การใช้ฟังก์ชัน OrderSend(): ฟังก์ชันนี้ใช้สำหรับส่งคำสั่งเปิดออเดอร์ไปยังโบรกเกอร์ โดยมีรูปแบบดังนี้:
OrderSend(symbol, cmd, volume, price, slippage, stoploss, takeprofit, comment, magic, expiration, arrow_color)
- การตรวจสอบความสำเร็จ:
- ถ้า OrderSend() สำเร็จ จะคืนค่าเป็นหมายเลข ticket ของออเดอร์
- ถ้าไม่สำเร็จ จะคืนค่าเป็น -1 และสามารถตรวจสอบสาเหตุได้ด้วยฟังก์ชัน GetLastError()
- ข้อควรระวัง:
- ตรวจสอบว่ามี margin เพียงพอก่อนเปิดออเดอร์
- คำนึงถึง spread ในการคำนวณ Stop Loss และ Take Profit
- ระวังการเปิดออเดอร์ซ้ำๆ โดยไม่ตั้งใจ ควรมีการตรวจสอบจำนวนออเดอร์ที่เปิดอยู่ก่อน
- การปรับปรุงประสิทธิภาพ:
- ใช้ฟังก์ชัน RefreshRates() ก่อนเปิดออเดอร์เพื่อให้แน่ใจว่าใช้ราคาล่าสุด
- พิจารณาใช้ OrderSend() ในฟังก์ชัน OnTick() เพื่อตอบสนองต่อการเปลี่ยนแปลงราคาทันที
ตัวอย่างการใช้งานเพิ่มเติม:
void OnTick()
{
if(OrdersTotal() == 0) // ตรวจสอบว่าไม่มีออเดอร์เปิดอยู่
{
double accountRisk = 0.01; // ความเสี่ยง 1% ของพอร์ต
double lotSize = CalculateLotSize(accountRisk);
if(SomeEntryCondition()) // เงื่อนไขการเข้าเทรดของคุณ
{
RefreshRates(); // อัพเดทราคาล่าสุด
double stopLoss = Ask - 300 * Point; // SL 30 pips ใต้ราคาปัจจุบัน
double takeProfit = Ask + 600 * Point; // TP 60 pips เหนือราคาปัจจุบัน
int ticket = OpenMarketOrder(OP_BUY, lotSize, stopLoss, takeProfit, "My Strategy Buy");
if(ticket > 0)
{
Print("Buy order opened successfully");
}
}
}
}
การใช้ Market Order ให้มีประสิทธิภาพต้องคำนึงถึงการจัดการความเสี่ยง กลยุทธ์การเข้าเทรด และสภาพตลาด ณ ขณะนั้น อย่าลืมทดสอบ EA ของคุณอย่างละเอียดในบัญชีทดลองก่อนใช้งานจริงเสมอครับ
การเปิด Pending Order
Pending Order คือการตั้งคำสั่งซื้อขายล่วงหน้าที่ราคาที่กำหนด
int OpenPendingOrder(int type, double lots, double price, double sl = 0, double tp = 0, datetime expiration = 0, string comment = "")
{
int ticket;
ticket = OrderSend(Symbol(), type, lots, price, 3, sl, tp, comment, 0, expiration, clrNONE);
if(ticket < 0)
Print("Error opening pending order: ", GetLastError());
else
Print("Pending order placed successfully. Ticket: ", ticket);
return ticket;
}
// วิธีการใช้งาน
void OnTick()
{
double buyStopPrice = Ask + 200 * Point; // ราคา 20 pips เหนือราคาปัจจุบัน
double sellStopPrice = Bid - 200 * Point; // ราคา 20 pips ใต้ราคาปัจจุบัน
// เปิด Buy Stop order
OpenPendingOrder(OP_BUYSTOP, 0.1, buyStopPrice, buyStopPrice - 500 * Point, buyStopPrice + 1000 * Point);
// เปิด Sell Stop order
OpenPendingOrder(OP_SELLSTOP, 0.1, sellStopPrice, sellStopPrice + 500 * Point, sellStopPrice - 1000 * Point);
// เปิด Buy Limit order ที่จะหมดอายุใน 1 วัน
datetime expirationTime = TimeCurrent() + 86400; // 86400 วินาที = 1 วัน
OpenPendingOrder(OP_BUYLIMIT, 0.1, Bid - 300 * Point, 0, 0, expirationTime, "Buy Limit with expiration");
}
Pending Order คือการตั้งคำสั่งซื้อขายล่วงหน้าที่ราคาที่กำหนด โดยมีรายละเอียดดังนี้:
- ประเภทของ Pending Order:
- OP_BUYLIMIT: ตั้งคำสั่งซื้อที่ราคาต่ำกว่าราคาปัจจุบัน
- OP_BUYSTOP: ตั้งคำสั่งซื้อที่ราคาสูงกว่าราคาปัจจุบัน
- OP_SELLLIMIT: ตั้งคำสั่งขายที่ราคาสูงกว่าราคาปัจจุบัน
- OP_SELLSTOP: ตั้งคำสั่งขายที่ราคาต่ำกว่าราคาปัจจุบัน
- พารามิเตอร์ที่สำคัญ:
- Symbol(): คู่สกุลเงินที่ต้องการเทรด
- type: ประเภทของ Pending Order
- lots: ขนาดของออเดอร์
- price: ราคาที่ต้องการเปิดออเดอร์
- slippage: ค่าความคลาดเคลื่อนของราคาที่ยอมรับได้
- stopLoss: ราคา Stop Loss
- takeProfit: ราคา Take Profit
- expiration: เวลาหมดอายุของ Pending Order (ถ้ามี)
- การใช้ฟังก์ชัน OrderSend(): ใช้ฟังก์ชันเดียวกับ Market Order แต่กำหนดประเภทและราคาที่ต้องการ
- การตรวจสอบความสำเร็จ:
- ถ้า OrderSend() สำเร็จ จะคืนค่าเป็นหมายเลข ticket ของออเดอร์
- ถ้าไม่สำเร็จ จะคืนค่าเป็น -1 และสามารถตรวจสอบสาเหตุได้ด้วยฟังก์ชัน GetLastError()
- ข้อควรระวัง:
- ตรวจสอบว่าราคาที่ตั้งไว้เป็นไปตามกฎของโบรกเกอร์ (เช่น ระยะห่างขั้นต่ำจากราคาปัจจุบัน)
- ระวังการตั้ง Pending Order ซ้ำๆ โดยไม่ตั้งใจ
- คำนึงถึงเวลาหมดอายุของ Pending Order ถ้ากำหนดไว้
- การปรับปรุงประสิทธิภาพ:
- ใช้ฟังก์ชัน RefreshRates() ก่อนคำนวณราคาสำหรับ Pending Order
- พิจารณาใช้ OrderModify() เพื่อปรับเปลี่ยน Pending Order ที่มีอยู่แทนการลบและสร้างใหม่
ตัวอย่างการใช้งานเพิ่มเติม:
void PlacePendingOrders()
{
RefreshRates();
double accountRisk = 0.01; // ความเสี่ยง 1% ของพอร์ต
double lotSize = CalculateLotSize(accountRisk);
// ตั้ง Buy Stop
double buyStopPrice = Ask + 200 * Point; // 20 pips เหนือราคาปัจจุบัน
double buyStopSL = buyStopPrice - 300 * Point; // SL 30 pips ใต้ราคาเปิด
double buyStopTP = buyStopPrice + 600 * Point; // TP 60 pips เหนือราคาเปิด
int buyStopTicket = OpenPendingOrder(OP_BUYSTOP, lotSize, buyStopPrice, buyStopSL, buyStopTP, 0, "Buy Stop Order");
if(buyStopTicket > 0)
{
Print("Buy Stop order placed successfully");
}
// ตั้ง Sell Limit
double sellLimitPrice = Bid + 150 * Point; // 15 pips เหนือราคาปัจจุบัน
double sellLimitSL = sellLimitPrice + 300 * Point; // SL 30 pips เหนือราคาเปิด
double sellLimitTP = sellLimitPrice - 450 * Point; // TP 45 pips ใต้ราคาเปิด
datetime expirationTime = TimeCurrent() + 12 * 3600; // หมดอายุใน 12 ชั่วโมง
int sellLimitTicket = OpenPendingOrder(OP_SELLLIMIT, lotSize, sellLimitPrice, sellLimitSL, sellLimitTP, expirationTime, "Sell Limit Order");
if(sellLimitTicket > 0)
{
Print("Sell Limit order placed successfully");
}
}
ครับ ผมจะอธิบายเพิ่มเติมเกี่ยวกับการเปิด Pending Order
Pending Order คือการตั้งคำสั่งซื้อขายล่วงหน้าที่ราคาที่กำหนด โดยมีรายละเอียดดังนี้:
ประเภทของ Pending Order:
- OP_BUYLIMIT: ตั้งคำสั่งซื้อที่ราคาต่ำกว่าราคาปัจจุบัน
- OP_BUYSTOP: ตั้งคำสั่งซื้อที่ราคาสูงกว่าราคาปัจจุบัน
- OP_SELLLIMIT: ตั้งคำสั่งขายที่ราคาสูงกว่าราคาปัจจุบัน
- OP_SELLSTOP: ตั้งคำสั่งขายที่ราคาต่ำกว่าราคาปัจจุบัน
พารามิเตอร์ที่สำคัญ:
- Symbol(): คู่สกุลเงินที่ต้องการเทรด
- type: ประเภทของ Pending Order
- lots: ขนาดของออเดอร์
- price: ราคาที่ต้องการเปิดออเดอร์
- slippage: ค่าความคลาดเคลื่อนของราคาที่ยอมรับได้
- stopLoss: ราคา Stop Loss
- takeProfit: ราคา Take Profit
- expiration: เวลาหมดอายุของ Pending Order (ถ้ามี)
การใช้ฟังก์ชัน OrderSend():
ใช้ฟังก์ชันเดียวกับ Market Order แต่กำหนดประเภทและราคาที่ต้องการ
การตรวจสอบความสำเร็จ:
ถ้า OrderSend() สำเร็จ จะคืนค่าเป็นหมายเลข ticket ของออเดอร์
ถ้าไม่สำเร็จ จะคืนค่าเป็น -1 และสามารถตรวจสอบสาเหตุได้ด้วยฟังก์ชัน GetLastError()
ข้อควรระวัง:
ตรวจสอบว่าราคาที่ตั้งไว้เป็นไปตามกฎของโบรกเกอร์ (เช่น ระยะห่างขั้นต่ำจากราคาปัจจุบัน)
ระวังการตั้ง Pending Order ซ้ำๆ โดยไม่ตั้งใจ
คำนึงถึงเวลาหมดอายุของ Pending Order ถ้ากำหนดไว้
การปรับปรุงประสิทธิภาพ:
ใช้ฟังก์ชัน RefreshRates() ก่อนคำนวณราคาสำหรับ Pending Order
พิจารณาใช้ OrderModify() เพื่อปรับเปลี่ยน Pending Order ที่มีอยู่แทนการลบและสร้างใหม่
ตัวอย่างการใช้งานเพิ่มเติม:
void PlacePendingOrders()
{
RefreshRates();
double accountRisk = 0.01; // ความเสี่ยง 1% ของพอร์ต
double lotSize = CalculateLotSize(accountRisk);
// ตั้ง Buy Stop
double buyStopPrice = Ask + 200 * Point; // 20 pips เหนือราคาปัจจุบัน
double buyStopSL = buyStopPrice - 300 * Point; // SL 30 pips ใต้ราคาเปิด
double buyStopTP = buyStopPrice + 600 * Point; // TP 60 pips เหนือราคาเปิด
int buyStopTicket = OpenPendingOrder(OP_BUYSTOP, lotSize, buyStopPrice, buyStopSL, buyStopTP, 0, "Buy Stop Order");
if(buyStopTicket > 0)
{
Print("Buy Stop order placed successfully");
}
// ตั้ง Sell Limit
double sellLimitPrice = Bid + 150 * Point; // 15 pips เหนือราคาปัจจุบัน
double sellLimitSL = sellLimitPrice + 300 * Point; // SL 30 pips เหนือราคาเปิด
double sellLimitTP = sellLimitPrice - 450 * Point; // TP 45 pips ใต้ราคาเปิด
datetime expirationTime = TimeCurrent() + 12 * 3600; // หมดอายุใน 12 ชั่วโมง
int sellLimitTicket = OpenPendingOrder(OP_SELLLIMIT, lotSize, sellLimitPrice, sellLimitSL, sellLimitTP, expirationTime, "Sell Limit Order");
if(sellLimitTicket > 0)
{
Print("Sell Limit order placed successfully");
}
}
การใช้ Pending Order สามารถเป็นส่วนสำคัญของกลยุทธ์การเทรด โดยเฉพาะอย่างยิ่งสำหรับการเทรดแบบ breakout หรือการรอจังหวะเข้าเทรดที่ราคาที่ต้องการ อย่างไรก็ตาม ควรระมัดระวังในการใช้งานและทดสอบอย่างละเอียดเพื่อให้แน่ใจว่า EA ของคุณจัดการกับ Pending Order ได้อย่างถูกต้องในทุกสถานการณ์
FOREXDUCK (นามปากกา) นักเขียนของเรามีประสบการณ์การเงินการลงทุนกว่า 10 ปี มีความเชี่ยวชาญในการวิเคราะห์ตลาด Forex และคริปโต โดยเฉพาะการวิเคราะห์ทางเทคนิค รวมถึงเทคนิคต่าง