- 1 1. บทนำ
- 2 2. เกี่ยวกับฟังก์ชัน OrderSend
- 3 3. รายละเอียดอาร์กิวเมนต์ของฟังก์ชัน OrderSend
- 3.1 คำอธิบายรายละเอียดของแต่ละอาร์กิวเมนต์
- 3.1.1 1. symbol (คู่สกุลเงิน)
- 3.1.2 2. cmd (ประเภทการซื้อขาย/ประเภทคำสั่ง)
- 3.1.3 3. volume (จำนวนล็อต)
- 3.1.4 4. price (ราคาใบสั่ง)
- 3.1.5 5. slippage (สลิปเพจ)
- 3.1.6 6. stoploss (ราคาออกกำไรขาดทุน)
- 3.1.7 7. takeprofit (ราคาออกกำไร)
- 3.1.8 8. comment (ความคิดเห็นคำสั่ง)
- 3.1.9 9. magic (หมายเลขมาจิก)
- 3.1.10 10. expiration (วันหมดอายุ)
- 3.1.11 11. arrow_color (สีลูกศร)
- 3.1 คำอธิบายรายละเอียดของแต่ละอาร์กิวเมนต์
- 4 4. รายละเอียดประเภทคำสั่ง
- 5 5. ตัวอย่างการใช้ฟังก์ชัน OrderSend
- 6 6. การจัดการข้อผิดพลาด
- 7 7. ข้อควรระวังเมื่อใช้ฟังก์ชัน OrderSend
- 7.1 ข้อควรระวัง 1: การทำให้ราคาปกติ (ฟังก์ชัน NormalizeDouble)
- 7.2 ข้อควรระวัง 2: การตั้งค่า slippage
- 7.3 ข้อควรระวัง 3: เวลาในการตอบสนองของเซิร์ฟเวอร์และข้อจำกัดการร้องขอ
- 7.4 ข้อควรระวัง 4: ตรวจสอบระดับ stop ต่ำสุด
- 7.5 ข้อควรระวัง 5: การใช้ magic number
- 7.6 ข้อควรระวัง 6: เวลาและสภาพคล่อง
- 7.7 ข้อควรระวัง 7: การดีบักและบันทึกล็อก
- 8 8. สรุป
1. บทนำ
MQL4 (MetaQuotes Language 4) เป็นภาษาการเขียนโปรแกรมที่ทำงานบนแพลตฟอร์ม MetaTrader 4 (MT4) และใช้สร้างระบบการซื้อขายอัตโนมัติและตัวบ่งชี้กำหนดเองในตลาดการเงิน เช่น FX และหุ้น ในหมวดนี้ ฟังก์ชัน OrderSend มีบทบาทสำคัญมาก
ฟังก์ชัน OrderSend ให้ความสามารถพื้นฐานในการส่งคำสั่งซื้อขายโดยตรงจากโปรแกรม การใช้ฟังก์ชันนี้ทำให้การทำงานของการซื้อขายเป็นอัตโนมัติเป็นไปได้ และสามารถสั่งซื้อขายตามเงื่อนไขเฉพาะได้ การเข้าใจฟังก์ชันนี้อย่างถูกต้องเป็นขั้นตอนที่ไม่อาจหลีกเลี่ยงได้ในการเรียนรู้การเขียนโปรแกรม MQL4 สำหรับผู้ใช้ตั้งแต่มือใหม่จนถึงมืออาชีพ
บทความนี้จะอธิบายอย่างเป็นขั้นเป็นตอนตั้งแต่กลไกพื้นฐานของฟังก์ชัน OrderSend ไปจนถึงรายละเอียดของอาร์กิวเมนต์ ตัวอย่างการใช้งานจริง และข้อควรระวัง การอ่านบทความนี้จะช่วยให้คุณมีพื้นฐานที่มั่นคงในการใช้ฟังก์ชัน OrderSend ของ MQL4

2. เกี่ยวกับฟังก์ชัน OrderSend
ฟังก์ชัน OrderSend เป็นฟังก์ชันที่ใช้ส่งคำสั่งซื้อขายใน MQL4 ในระบบการซื้อขายอัตโนมัติของ MetaTrader 4 มันทำหน้าที่ออกคำสั่งซื้อขายแบบโปรแกรมเมอร์ได้ ผู้เริ่มต้นจนถึงผู้เชี่ยวชาญ ทุกคนใช้ฟังก์ชันนี้เพื่อทำให้การซื้อขายเป็นอัตโนมัติและสร้างกลยุทธ์ขั้นสูง ซึ่งเป็นฟังก์ชันที่สำคัญมาก
ต่อไปนี้จะอธิบายโครงสร้างพื้นฐานและภาพรวมของฟังก์ชัน OrderSend
โครงสร้างพื้นฐานของฟังก์ชัน OrderSend
ไวยากรณ์ (Syntax) ของฟังก์ชัน OrderSend มีดังนี้
int OrderSend(
string symbol, // คู่เงิน
int cmd, // ประเภทการซื้อขาย (ประเภทคำสั่ง)
double volume, // จำนวนล็อต
double price, // ราคาคำสั่ง
int slippage, // สลิปเพจ
double stoploss, // ราคาตัดขาดทุน
double takeprofit, // ราคากำไร
string comment, // คอมเมนต์คำสั่ง
int magic, // หมายเลขมาจิก
datetime expiration, // วันหมดอายุ
color arrow_color // สีลูกศร
);
ค่ากลับพื้นฐาน
ฟังก์ชัน OrderSend จะคืนหมายเลขบัตร (int) เมื่อคำสั่งสำเร็จ ในกรณีที่ล้มเหลว จะคืนค่า -1 และตั้งค่าโค้ดข้อผิดพลาด โค้ดข้อผิดพลาดนี้สามารถดึงได้โดยใช้ฟังก์ชัน GetLastError
บทบาทของฟังก์ชัน OrderSend
- การทำให้การซื้อขายเป็นอัตโนมัติ
โดยใช้ฟังก์ชัน OrderSend ผู้เทรดสามารถทำให้การซื้อขายที่ทำด้วยมือเป็นอัตโนมัติได้ ซึ่งช่วยป้องกันข้อผิดพลาดของมนุษย์และทำให้การซื้อขายรวดเร็วและมีประสิทธิภาพ - การดำเนินกลยุทธ์
โดยกำหนดเงื่อนไขในโปรแกรมและดำเนินการสั่งซื้อตามนั้น สามารถเพิ่มความแม่นยำของกลยุทธ์การเทรดได้ เช่น การสั่งซื้อเมื่อราคาถึงระดับหนึ่งหรือในช่วงเวลาที่กำหนด - การจัดการตำแหน่งหลายตำแหน่ง
โดยใช้หมายเลขมาจิก (อาร์กิวเมนต์magic
) สามารถแยกแยะและจัดการตำแหน่งหลายตำแหน่งได้ง่ายขึ้น ซึ่งทำให้สามารถดำเนินกลยุทธ์ต่าง ๆ พร้อมกันได้

3. รายละเอียดอาร์กิวเมนต์ของฟังก์ชัน OrderSend
เพื่อใช้ฟังก์ชัน OrderSend อย่างถูกต้อง การเข้าใจความหมายและบทบาทของแต่ละอาร์กิวเมนต์เป็นสิ่งสำคัญ ในส่วนนี้จะอธิบายอาร์กิวเมนต์ของฟังก์ชัน OrderSend ทีละอัน และอธิบายวิธีการใช้งานอย่างเป็นรูปธรรม
คำอธิบายรายละเอียดของแต่ละอาร์กิวเมนต์
1. symbol
(คู่สกุลเงิน)
คำอธิบาย
กำหนดคู่สกุลเงินที่ทำการซื้อขาย เช่น "EURUSD"
หรือ "USDJPY"
เป็นต้น
ข้อควรระวัง
- ใช้คู่สกุลเงินที่แสดงบนแพลตฟอร์มเสมอ
- สามารถกำหนดคู่สกุลเงินที่แตกต่างจากแผนภูมิปัจจุบันได้ด้วย
ตัวอย่าง
OrderSend("EURUSD", OP_BUY, 1.0, Ask, 3, 0, 0, "", 0, 0, Blue);
2. cmd
(ประเภทการซื้อขาย/ประเภทคำสั่ง)
คำอธิบาย
กำหนดประเภทของการซื้อขาย ใช้ค่าคงที่ต่อไปนี้:
OP_BUY
:คำสั่งซื้อแบบตลาดOP_SELL
:คำสั่งขายแบบตลาดOP_BUYLIMIT
:คำสั่งซื้อแบบจำกัดOP_SELLLIMIT
:คำสั่งขายแบบจำกัดOP_BUYSTOP
:คำสั่งซื้อแบบสต็อปOP_SELLSTOP
:คำสั่งขายแบบสต็อป
ตัวอย่าง
OrderSend("USDJPY", OP_BUY, 1.0, Ask, 3, 0, 0, "", 0, 0, Blue);
3. volume
(จำนวนล็อต)
คำอธิบาย
กำหนดปริมาณการซื้อขายเป็นจำนวนล็อต เช่น “1.0” หมายถึง 1 ล็อต
ข้อควรระวัง
- จำนวนล็อตขั้นต่ำอาจแตกต่างกันตามบริษัทหลักทรัพย์ ตรวจสอบล่วงหน้า
- ตั้งขนาดล็อตที่เหมาะสมโดยพิจารณาจำนวนเงินมาร์จิ้นและการจัดการความเสี่ยงเป็นสิ่งสำคัญ
ตัวอย่าง
OrderSend("GBPUSD", OP_SELL, 0.1, Bid, 2, 0, 0, "", 0, 0, Red);
4. price
(ราคาใบสั่ง)
คำอธิบาย
กำหนดราคาที่จะออกใบสั่ง คำสั่งตลาดโดยปกติใช้ Ask
หรือ Bid
ส่วนคำสั่งจำกัดหรือสต็อปต้องระบุราคาอย่างชัดเจน
ข้อควรระวัง
- สำหรับคำสั่งจำกัดหรือสต็อป ให้ระบุราคาที่เหมาะสมเหนือหรือต่ำกว่าราคาปัจจุบัน
ตัวอย่าง
OrderSend("EURUSD", OP_BUYLIMIT, 1.0, 1.1000, 3, 0, 0, "", 0, 0, Blue);
5. slippage
(สลิปเพจ)
คำอธิบาย
กำหนดช่วงความคลาดเคลื่อนของราคาเมื่อทำการสั่งซื้อ (สลิปเพจ) หน่วยเป็นจุด (ไม่ใช่พิป)
ข้อควรระวัง
- ในช่วงที่ราคามีความผันผวนสูง สลิปเพจอาจเกิดขึ้นได้ง่าย จึงควรกำหนดขอบเขตที่เหมาะสม
ตัวอย่าง
OrderSend("USDJPY", OP_SELL, 1.0, Bid, 5, 0, 0, "", 0, 0, Green);
6. stoploss
(ราคาออกกำไรขาดทุน)
คำอธิบาย
กำหนดราคาที่จะออกกำไรขาดทุน (สต็อปโลส) ต้องตั้งในทิศทางตรงข้ามกับราคาสั่งซื้อ
ข้อควรระวัง
- หากไม่ตั้งค่า ให้ระบุ
0
- แนะนำให้ตั้งค่าตามกลยุทธ์การจัดการเงินของผู้ใช้
ตัวอย่าง
OrderSend("EURUSD", OP_BUY, 1.0, Ask, 3, 1.0950, 0, "", 0, 0, Blue);
7. takeprofit
(ราคาออกกำไร)
คำอธิบาย
กำหนดราคาที่จะออกกำไร (เท이크โปรฟิต) ตั้งในทิศทางเดียวกับราคาสั่งซื้อ
ข้อควรระวัง
- หากไม่ตั้งค่า ให้ระบุ
0
- การตั้งค่าระดับกำไรที่เหมาะสมช่วยให้กลยุทธ์การซื้อขายทำงานอัตโนมัติได้
ตัวอย่าง
OrderSend("GBPUSD", OP_SELL, 1.0, Bid, 3, 0, 1.2500, "", 0, 0, Red);
8. comment
(ความคิดเห็นคำสั่ง)
คำอธิบาย
เพิ่มความคิดเห็นตามต้องการให้กับคำสั่ง คำอธิบายนี้จะแสดงในประวัติการซื้อขาย
ตัวอย่าง
OrderSend("USDJPY", OP_BUY, 1.0, Ask, 3, 0, 0, "Test Order", 0, 0, Yellow);
9. magic
(หมายเลขมาจิก)
คำอธิบาย
กำหนดหมายเลขเพื่อระบุตำแหน่งคำสั่งที่โปรแกรมสร้างขึ้น ใช้เป็นประโยชน์เมื่อจัดการคำสั่งที่ทำงานกับ EA ต่าง ๆ
ตัวอย่าง
OrderSend("EURUSD", OP_BUY, 1.0, Ask, 3, 0, 0, "", 123456, 0, Blue);
10. expiration
(วันหมดอายุ)
คำอธิบาย
กำหนดวันหมดอายุของคำสั่ง เมื่อค่าตั้งไว้ คำสั่งที่หมดอายุจะถูกลบโดยอัตโนมัติ
ข้อควรระวัง
- หากไม่ตั้งค่า ให้ระบุ
0
ตัวอย่าง
OrderSend("GBPUSD", OP_BUYLIMIT, 1.0, 1.3000, 3, 0, 0, "", 0, TimeCurrent() + 3600, Green);
11. arrow_color
(สีลูกศร)
คำอธิบาย
กำหนดสีของลูกศรคำสั่งที่แสดงบนแผนภูมิ
ตัวอย่าง
OrderSend("USDJPY", OP_SELL, 1.0, Bid, 3, 0, 0, "", 0, 0, Blue);
การเข้าใจอาร์กิวเมนต์ของฟังก์ชัน OrderSend ช่วยให้สร้างโปรแกรมการซื้อขายที่ยืดหยุ่นและมีประสิทธิภาพมากขึ้นได้ ส่วนถัดไปจะอธิบายรายละเอียดของประเภทคำสั่ง

4. รายละเอียดประเภทคำสั่ง
เมื่อใช้ฟังก์ชัน OrderSend ของ MQL4 การเข้าใจประเภทคำสั่ง (อาร์กิวเมนต์ cmd
) อย่างถูกต้องและตั้งค่าอย่างเหมาะสมเป็นสิ่งสำคัญ ส่วนนี้จะอธิบายลักษณะและวิธีใช้ของแต่ละประเภทคำสั่งอย่างละเอียด。
ประเภทของคำสั่ง
1. คำสั่งตลาด(Market Orders)
คำสั่งตลาดเป็นประเภทคำสั่งที่ทำการสั่งซื้อทันทีที่ราคาตลาดปัจจุบัน。
ประเภท
OP_BUY
:ทำคำสั่งซื้อที่ราคาตลาดปัจจุบัน (ราคาAsk
)OP_SELL
:ทำคำสั่งขายที่ราคาตลาดปัจจุบัน (ราคาBid
)
ตัวอย่างการใช้
คำสั่งตลาดใช้เมื่อคุณต้องการเข้าตลาดอย่างรวดเร็ว เช่น เมื่อคุณต้องการติดตามแนวโน้มเฉพาะ。
ตัวอย่างโค้ด
// คำสั่งซื้อแบบตลาด
OrderSend("EURUSD", OP_BUY, 1.0, Ask, 3, 0, 0, "Market Buy", 123456, 0, Blue);
// คำสั่งขายแบบตลาด
OrderSend("EURUSD", OP_SELL, 1.0, Bid, 3, 0, 0, "Market Sell", 123456, 0, Red);
2. คำสั่งจำกัด(Limit Orders)
คำสั่งจำกัดใช้เมื่อคุณต้องการสั่งซื้อหรือขายที่ราคาที่ดีกว่าราคาตลาดปัจจุบัน。
ประเภท
OP_BUYLIMIT
:ทำคำสั่งซื้อที่ราคาต่ำกว่าราคาปัจจุบันOP_SELLLIMIT
:ทำคำสั่งขายที่ราคาสูงกว่าราคาปัจจุบัน
ตัวอย่างการใช้
ใช้ได้เมื่อคุณต้องการทำกลยุทธ์ต้านทานหรืออยากจับการย้อนกลับในช่วงราคาที่กำหนด。
ตัวอย่างโค้ด
// คำสั่งจำกัดซื้อ
OrderSend("USDJPY", OP_BUYLIMIT, 1.0, 135.50, 3, 135.00, 136.00, "Buy Limit Order", 123456, 0, Green);
// คำสั่งจำกัดขาย
OrderSend("USDJPY", OP_SELLLIMIT, 1.0, 136.50, 3, 137.00, 135.00, "Sell Limit Order", 123456, 0, Yellow);
3. คำสั่งหยุด(Stop Orders)
คำสั่งหยุดใช้เมื่อคุณต้องการสั่งซื้อหรือขายที่ราคาที่ไม่ดีกว่าราคาตลาดปัจจุบัน。
ประเภท
OP_BUYSTOP
:ทำคำสั่งซื้อที่ราคาสูงกว่าราคาปัจจุบันOP_SELLSTOP
:ทำคำสั่งขายที่ราคาต่ำกว่าราคาปัจจุบัน
ตัวอย่างการใช้
ใช้ได้เมื่อคุณต้องการทำกลยุทธ์ตามแนวโน้มหรืออยากทำการทะลุเส้นราคาเฉพาะ。
ตัวอย่างโค้ด
// คำสั่งหยุดซื้อ
OrderSend("GBPUSD", OP_BUYSTOP, 1.0, 1.3100, 3, 1.3000, 1.3200, "Buy Stop Order", 123456, 0, Blue);
// คำสั่งหยุดขาย
OrderSend("GBPUSD", OP_SELLSTOP, 1.0, 1.2900, 3, 1.3000, 1.2800, "Sell Stop Order", 123456, 0, Red);
เกณฑ์การเลือกประเภทคำสั่ง
สถานการณ์ที่ใช้คำสั่งตลาด
- เมื่อคุณต้องการติดตามแรงของตลาด
- เมื่อคุณต้องการทำจังหวะทะลุช่วงราคาที่สำคัญอย่างรวดเร็ว
สถานการณ์ที่ใช้คำสั่งจำกัด
- เมื่อคุณคาดการณ์การย้อนกลับจากราคาปัจจุบัน
- เมื่อคุณต้องการคาดการณ์จุดกลับตัวของแนวโน้มและเข้าตลาด
สถานการณ์ที่ใช้คำสั่งหยุด
- เมื่อคุณคาดการณ์การต่อเนื่องของแนวโน้ม
- เมื่อคุณต้องการทำจังหวะทะลุเส้นราคาเฉพาะ
ตัวอย่างการเลือกในสถานการณ์จริง
สถานการณ์ 1: การซื้อในจุดดันของแนวโน้ม
เมื่อราคาปัจจุบันอยู่ในแนวโน้มขึ้นและคุณคาดการณ์ว่าราคาจะลดลงชั่วคราวแล้วขึ้นอีกครั้ง:
- ประเภทคำสั่ง:คำสั่งจำกัด (
OP_BUYLIMIT
)
สถานการณ์ 2: กลยุทธ์การทะลุ
เมื่อคุณคาดการณ์ว่าราคาจะทะลุเส้นต้านทานสำคัญ:
- ประเภทคำสั่ง:คำสั่งหยุด (
OP_BUYSTOP
หรือOP_SELLSTOP
)

5. ตัวอย่างการใช้ฟังก์ชัน OrderSend
ที่นี่เราจะแสดงตัวอย่างโค้ดที่ใช้ OrderSend พร้อมอธิบายวิธีใช้ในสถานการณ์การเทรดต่าง ๆ ซึ่งจะช่วยให้เห็นภาพการใช้ฟังก์ชัน OrderSend ในโปรแกรม MQL4 จริง ๆ ได้ชัดเจนขึ้น
ตัวอย่าง 1: การสั่งซื้อแบบตลาด (Market Orders)
ตัวอย่างโค้ดสั่งซื้อ
โค้ดด้านล่างเป็นตัวอย่างการสั่งซื้อแบบตลาดที่ใช้ราคาปัจจุบัน Ask
ตัวอย่างโค้ด
int ticket = OrderSend(
"EURUSD", // คู่สกุลเงิน
OP_BUY, // สั่งซื้อ
1.0, // จำนวนล็อต
Ask, // ราคาปัจจุบัน
3, // สลิปเพจ
0, // ราคาหยุดขาดทุน
0, // ราคากำไร
"Market Buy Order", // ความคิดเห็น
0, // หมายเลขมาจิก
0, // วันหมดอายุ
Blue // สีลูกศร
);
if(ticket < 0) {
Print("คำสั่งล้มเหลว. รหัสข้อผิดพลาด: ", GetLastError());
} else {
Print("คำสั่งสำเร็จ. หมายเลขตั๋ว: ", ticket);
}
ตัวอย่างโค้ดสั่งขาย
โค้ดด้านล่างเป็นตัวอย่างการสั่งขายแบบตลาดที่ใช้ราคาปัจจุบัน Bid
ตัวอย่างโค้ด
int ticket = OrderSend(
"USDJPY", // คู่สกุลเงิน
OP_SELL, // สั่งขาย
0.5, // จำนวนล็อต
Bid, // ราคาปัจจุบัน
2, // สลิปเพจ
0, // ราคาหยุดขาดทุน
0, // ราคากำไร
"Market Sell Order", // ความคิดเห็น
123456, // หมายเลขมาจิก
0, // วันหมดอายุ
Red // สีลูกศร
);
ตัวอย่าง 2: การสั่งซื้อแบบจำกัด (Limit Orders)
ตัวอย่างโค้ดสั่งซื้อแบบจำกัด
สั่งซื้อที่ราคาต่ำกว่าราคาปัจจุบัน เช่น ราคาปัจจุบัน 1.1200 ถ้าลดลงถึง 1.1150 จะสั่งซื้อ
ตัวอย่างโค้ด
OrderSend(
"EURUSD",
OP_BUYLIMIT,
1.0,
1.1150, // ราคาจำกัด
3,
1.1100, // ราคาหยุดขาดทุน
1.1200, // ราคากำไร
"Buy Limit Order",
0,
0,
Green
);
ตัวอย่างโค้ดสั่งขายแบบจำกัด
สั่งขายที่ราคาสูงกว่าราคาปัจจุบัน เช่น ราคาปัจจุบัน 1.1200 ถ้าขึ้นถึง 1.1250 จะสั่งขาย
ตัวอย่างโค้ด
OrderSend(
"GBPUSD",
OP_SELLLIMIT,
0.5,
1.1250, // ราคาจำกัด
2,
1.1300, // ราคาหยุดขาดทุน
1.1200, // ราคากำไร
"Sell Limit Order",
0,
0,
Yellow
);
ตัวอย่าง 3: การสั่งซื้อแบบหยุด (Stop Orders)
ตัวอย่างโค้ดสั่งซื้อแบบหยุด
สั่งซื้อที่ราคาสูงกว่าราคาปัจจุบัน เช่น ราคาปัจจุบัน 1.1200 ถ้าเกิน 1.1250 จะสั่งซื้อ
ตัวอย่างโค้ด
OrderSend(
"USDJPY",
OP_BUYSTOP,
1.0,
135.00, // ราคาหยุด
3,
134.50, // ราคาหยุดขาดทุน
135.50, // ราคากำไร
"Buy Stop Order",
0,
0,
Blue
);
ตัวอย่างโค้ดสั่งขายแบบหยุด
สั่งขายที่ราคาต่ำกว่าราคาปัจจุบัน เช่น ราคาปัจจุบัน 1.1200 ถ้าลดลงต่ำกว่า 1.1150 จะสั่งขาย
ตัวอย่างโค้ด
OrderSend(
"EURUSD",
OP_SELLSTOP,
0.5,
1.1150, // ราคาหยุด
2,
1.1200, // ราคาหยุดขาดทุน
1.1100, // ราคากำไร
"Sell Stop Order",
0,
0,
Red
);
ตัวอย่าง 4: การจัดการข้อผิดพลาดของคำสั่ง
หากคำสั่งล้มเหลว จำเป็นต้องรับรหัสข้อผิดพลาดและตรวจสอบสาเหตุ โค้ดด้านล่างใช้ฟังก์ชัน GetLastError
เพื่อรับข้อมูลข้อผิดพลาด
ตัวอย่างโค้ด
int ticket = OrderSend("EURUSD", OP_BUY, 1.0, Ask, 3, 0, 0, "Error Test", 0, 0, Blue);
if(ticket < 0) {
int errorCode = GetLastError();
Print("คำสั่งล้มเหลว. รหัสข้อผิดพลาด: ", errorCode);
// เพิ่มการดำเนินการตามข้อผิดพลาดเฉพาะ
if(errorCode == 134) {
Print("ขาดเงินมาร์จิ้น กรุณาลดขนาดล็อต.");
} else if(errorCode == 130) {
Print("ระดับสต็อปไม่ถูกต้อง กรุณาตรวจสอบราคาอีกครั้ง.");
}
}
จากตัวอย่างเหล่านี้ คุณสามารถนำกลยุทธ์การเทรดจริงมาเขียนโปรแกรมได้ ส่วนถัดไปจะอธิบายรายละเอียดเกี่ยวกับ ‘6. การจัดการข้อผิดพลาด’

6. การจัดการข้อผิดพลาด
เมื่อใช้ฟังก์ชัน OrderSend ของ MQL4 อาจมีกรณีที่คำสั่งไม่ถูกประมวลผลอย่างถูกต้อง ในสถานการณ์เช่นนี้ การระบุข้อผิดพลาดอย่างถูกต้องและดำเนินการแก้ไขที่เหมาะสมเป็นสิ่งสำคัญ การจัดการข้อผิดพลาดเป็นองค์ประกอบที่ไม่อาจขาดได้เพื่อเพิ่มความเสถียรและความน่าเชื่อถือของโปรแกรม.
วิธีตรวจจับข้อผิดพลาด
ใน MQL4 ตรวจสอบค่ากลับของฟังก์ชัน OrderSend และหากเกิดข้อผิดพลาด ใช้ฟังก์ชัน GetLastError เพื่อรับรหัสข้อผิดพลาด.
โครงสร้างการตรวจสอบข้อผิดพลาดพื้นฐาน
int ticket = OrderSend(
"EURUSD", OP_BUY, 1.0, Ask, 3, 0, 0, "Order Test", 0, 0, Blue
);
if(ticket < 0) {
int errorCode = GetLastError();
Print("คำสั่งล้มเหลว รหัสข้อผิดพลาด: ", errorCode);
}
ticket
คืนค่าลบ หมายความว่าคำสั่งล้มเหลว จากนั้นระบุสาเหตุโดยอ้างอิงรหัสข้อผิดพลาด.
รหัสข้อผิดพลาดหลักและวิธีแก้ไข
130: ระดับสต็อปไม่ถูกต้อง
สาเหตุ
- ราคาสต็อปล็อค (stoploss) หรือราคากำไร (takeprofit) ที่ระบุอยู่นอกช่วงที่สามารถทำการซื้อขายได้.
วิธีแก้ไข
- ตรวจสอบระดับสต็อปขั้นต่ำที่ผู้ให้บริการหลักทรัพย์เสนอและปรับราคา.
- ทำให้ราคาปกติ (ใช้ฟังก์ชัน NormalizeDouble) เพื่อรับประกันความแม่นยำ.
ตัวอย่างโค้ดที่แก้ไขแล้ว
double stopLoss = NormalizeDouble(Ask - 0.0010, Digits);
double takeProfit = NormalizeDouble(Ask + 0.0020, Digits);
OrderSend("EURUSD", OP_BUY, 1.0, Ask, 3, stopLoss, takeProfit, "Normalized Price Test", 0, 0, Blue);
131: ขนาดล็อตไม่ถูกต้อง
สาเหตุ
- ขนาดล็อตอยู่นอกขอบเขตที่ผู้ให้บริการหลักทรัพย์ยอมรับ (เล็กเกินไปหรือใหญ่เกินไป).
วิธีแก้ไข
- ตรวจสอบขนาดล็อตขั้นต่ำและสูงสุดของผู้ให้บริการหลักทรัพย์และกำหนดค่าที่อยู่ในช่วง.
ตัวอย่างโค้ดที่แก้ไขแล้ว
double lotSize = 0.1;
if(lotSize < MarketInfo("EURUSD", MODE_MINLOT) || lotSize > MarketInfo("EURUSD", MODE_MAXLOT)) {
Print("ขนาดล็อตไม่ถูกต้อง กรุณากำหนดค่าที่เหมาะสม");
} else {
OrderSend("EURUSD", OP_BUY, lotSize, Ask, 3, 0, 0, "Lot Size Test", 0, 0, Blue);
}
134: ขาดเงินมาร์จิ้น
สาเหตุ
- เงินมาร์จิ้นที่จำเป็นสำหรับการสั่งซื้อไม่เพียงพอ.
วิธีแก้ไข
- ลดขนาดล็อตหรือเพิ่มเงินมาร์จิ้น.
- ใช้ฟังก์ชัน AccountFreeMargin เพื่อตรวจสอบเงินมาร์จิ้นที่มีอยู่.
ตัวอย่างโค้ดที่แก้ไขแล้ว
double freeMargin = AccountFreeMargin();
double requiredMargin = MarketInfo("EURUSD", MODE_MARGINREQUIRED) * 1.0;
if(freeMargin < requiredMargin) {
Print("ขาดเงินมาร์จิ้น กรุณาลดขนาดล็อต");
} else {
OrderSend("EURUSD", OP_BUY, 1.0, Ask, 3, 0, 0, "Margin Test", 0, 0, Blue);
}
146: ตลาดปิดการซื้อขาย
สาเหตุ
- เกิดขึ้นเมื่อพยายามสั่งซื้อในช่วงที่ตลาดปิด.
วิธีแก้ไข
- ตรวจสอบเวลาทำการของตลาดและสั่งซื้อในช่วงเวลาที่เปิดทำการ.
- ใช้ฟังก์ชัน MarketInfo เพื่อตรวจสอบสถานะของตลาด.
ตัวอย่างการจัดการข้อผิดพลาดทั่วไป
ด้านล่างเป็นโค้ดการจัดการข้อผิดพลาดทั่วไปที่แสดงข้อความข้อผิดพลาดที่เหมาะสมตามรหัสข้อผิดพลาด.
ตัวอย่างการจัดการข้อผิดพลาดทั่วไป
int ticket = OrderSend("EURUSD", OP_BUY, 1.0, Ask, 3, 0, 0, "Error Handling Test", 0, 0, Blue);
if(ticket < 0) {
int errorCode = GetLastError();
switch(errorCode) {
case 130:
Print("ระดับสต็อปไม่ถูกต้อง กรุณาตรวจสอบราคาอีกครั้ง");
break;
case 131:
Print("ขนาดล็อตไม่ถูกต้อง กรุณากำหนดค่าที่เหมาะสม");
break;
case 134:
Print("ขาดเงินมาร์จิ้น กรุณาปรับขนาดล็อต");
break;
case 146:
Print("ตลาดปิดการซื้อขาย กรุณาตรวจสอบช่วงเวลาที่เปิดทำการ");
break;
default:
Print("เกิดข้อผิดพลาดไม่ทราบ กรุณาใช้รหัสข้อผิดพลาด: ", errorCode);
break;
}
}
จุดสำคัญของการจัดการข้อผิดพลาด
- อย่าทำให้ข้อผิดพลาดถูกละเลย
การดำเนินการแก้ไขที่เหมาะสมเมื่อเกิดข้อผิดพลาดจะเพิ่มความน่าเชื่อถือของโปรแกรม. - ทำการตรวจสอบล่วงหน้า
ก่อนสั่งซื้อ ตรวจสอบขนาดล็อตและระดับสต็อป ฯลฯ เพื่อป้องกันข้อผิดพลาดก่อนเกิดขึ้น. - ใช้การบันทึกลงล็อก
ใช้ฟังก์ชัน Print เพื่อบันทึกรายละเอียดข้อผิดพลาดลงล็อก ทำให้การแก้ไขปัญหาง่ายขึ้น.

7. ข้อควรระวังเมื่อใช้ฟังก์ชัน OrderSend
ฟังก์ชัน OrderSend เป็นเครื่องมือที่ทรงพลังมากในการสั่งซื้อใน MQL4 แต่การใช้งานต้องระมัดระวัง ในส่วนนี้จะอธิบายจุดสำคัญที่ควรพิจารณาเมื่อใช้ OrderSend และวิธีป้องกันข้อผิดพลาดที่พบบ่อย
ข้อควรระวัง 1: การทำให้ราคาปกติ (ฟังก์ชัน NormalizeDouble)
ปัญหา
ใน MQL4 มีการจัดการกับคู่สกุลเงินหรือสินค้าที่มีจำนวนหลักทศนิยม ( Digits
) แตกต่างกัน ในกรณีนี้ หากผลลัพธ์การคำนวณราคาตรงกับข้อกำหนดของแพลตฟอร์มไม่ตรงกัน อาจทำให้คำสั่งถูกปฏิเสธ
วิธีแก้ไข
โดยใช้ฟังก์ชัน NormalizeDouble
เพื่อทำให้ราคาปกติ (ปรับจำนวนหลักทศนิยม) สามารถป้องกันปัญหานี้ได้
ตัวอย่าง
double stopLoss = NormalizeDouble(Ask - 0.0010, Digits);
double takeProfit = NormalizeDouble(Ask + 0.0020, Digits);
OrderSend("EURUSD", OP_BUY, 1.0, Ask, 3, stopLoss, takeProfit, "ทดสอบราคาปกติ", 0, 0, Blue);
ข้อควรระวัง 2: การตั้งค่า slippage
ปัญหา
เมื่อตลาดมีการเปลี่ยนแปลงอย่างรวดเร็ว อาจเกิด slippage (ความเบี่ยงเบนของราคาเมื่อสั่งซื้อ) หาก slippage เกินขอบเขตที่ยอมรับได้ อาจทำให้คำสั่งถูกปฏิเสธ
วิธีแก้ไข
การตั้งค่า slippage ที่เหมาะสมสามารถลดความเสี่ยงของการล้มเหลวในการทำธุรกรรม นอกจากนี้ ในช่วงเวลาที่คาดว่าจะมีการเปลี่ยนแปลงอย่างรวดเร็ว (เช่น การประกาศตัวเลขเศรษฐกิจ) ควรพิจารณาเพิ่ม slippage หรือหลีกเลี่ยงการทำธุรกรรม
ตัวอย่าง
int slippage = 5; // อนุญาต slippage 5 จุด
OrderSend("USDJPY", OP_BUY, 0.1, Ask, slippage, 0, 0, "ทดสอบ slippage", 0, 0, Green);
ข้อควรระวัง 3: เวลาในการตอบสนองของเซิร์ฟเวอร์และข้อจำกัดการร้องขอ
ปัญหา
เมื่อเซิร์ฟเวอร์ของบริษัทหลักทรัพย์แออัด อาจทำให้เวลาตอบสนองคำสั่งยาวขึ้น นอกจากนี้ บางบริษัทหลักทรัพย์อาจเกิดข้อผิดพลาดเมื่อส่งคำขอจำนวนมากในช่วงเวลาสั้น
วิธีแก้ไข
- เมื่อส่งคำสั่งหลายรายการต่อเนื่อง ควรเว้นช่วงเวลาที่เหมาะสม
- แนะนำให้ทำการติดตามการตอบสนองของเซิร์ฟเวอร์และเพิ่มระบบการลองใหม่เมื่อเกิด timeout
ข้อควรระวัง 4: ตรวจสอบระดับ stop ต่ำสุด
ปัญหา
ถ้าไม่สนใจระดับ stop ต่ำสุดที่ตั้งโดยแต่ละบริษัทหลักทรัพย์ ราคาหยุดขาดทุนหรือราคากำไรอาจถูกพิจารณาว่าไม่ถูกต้อง
วิธีแก้ไข
ใช้ฟังก์ชัน MarketInfo
เพื่อดึงระดับ stop ต่ำสุดและรวมตรรกะตรวจสอบล่วงหน้า
ตัวอย่าง
double minStopLevel = MarketInfo("EURUSD", MODE_STOPLEVEL) * Point;
if((Ask - minStopLevel) < NormalizeDouble(Ask - 0.0010, Digits)) {
Print("ราคาหยุดขาดทุนไม่ตรงกับระดับ stop ต่ำสุด");
} else {
OrderSend("EURUSD", OP_BUY, 1.0, Ask, 3, Ask - 0.0010, Ask + 0.0020, "ตรวจสอบระดับ stop", 0, 0, Blue);
}
ข้อควรระวัง 5: การใช้ magic number
ปัญหา
เมื่อมี Expert Advisor หลายตัวทำงานพร้อมกัน หากไม่ตั้ง magic number จะไม่สามารถแยกแยะได้ว่า EA ใดได้สั่งคำสั่ง
วิธีแก้ไข
ตั้ง magic number ที่ไม่ซ้ำกันสำหรับแต่ละ EA เพื่อให้สามารถจัดการตำแหน่งได้
ตัวอย่าง
int magicNumber = 123456; // magic number ที่ไม่ซ้ำกัน
OrderSend("GBPUSD", OP_BUY, 1.0, Ask, 3, 0, 0, "ทดสอบ magic number", magicNumber, 0, Yellow);
ข้อควรระวัง 6: เวลาและสภาพคล่อง
ปัญหา
ช่วงเวลาที่มีสภาพคล่องต่ำ (เช่น เช้าในเวลาญี่ปุ่น) หรือก่อนปิดตลาดในวันหยุดสุดสัปดาห์ อาจทำให้สเปรดขยายตัวหรือคำสั่งไม่ผ่านได้
วิธีแก้ไข
- กำหนดช่วงเวลาที่สามารถทำธุรกรรมได้ในโปรแกรมและหลีกเลี่ยงการส่งคำสั่งในช่วงเวลานั้น
- ใช้ฟังก์ชัน
TimeCurrent
เพื่อดึงเวลาปัจจุบันของเซิร์ฟเวอร์และจำกัดการทำธุรกรรมตามเงื่อนไข
ตัวอย่าง
datetime currentTime = TimeCurrent();
if(TimeHour(currentTime) >= 22 || TimeHour(currentTime) < 2) {
Print("ขณะนี้เป็นช่วงเวลาที่ควรหลีกเลี่ยงการทำธุรกรรม");
} else {
OrderSend("EURUSD", OP_BUY, 1.0, Ask, 3, 0, 0, "ทดสอบข้อจำกัดเวลา", 0, 0, Blue);
}
ข้อควรระวัง 7: การดีบักและบันทึกล็อก
ปัญหา
เมื่อโปรแกรมไม่ทำงานตามที่คาดหวัง การระบุสาเหตุของปัญหาอาจยาก
วิธีแก้ไข
- ใช้ฟังก์ชัน
Print
เพื่อบันทึกค่าตัวแปรสำคัญและผลลัพธ์ของฟังก์ชันลงในล็อก - ตรวจสอบล็อกในแท็บ
Experts
และJournal
เพื่อตรวจสอบว่ามีความผิดปกติหรือไม่
ตัวอย่าง
double stopLoss = NormalizeDouble(Ask - 0.0010, Digits);
Print("Stop Loss: ", stopLoss);
int ticket = OrderSend("EURUSD", OP_BUY, 1.0, Ask, 3, stopLoss, 0, "ทดสอบดีบัก", 0, 0, Blue);
if(ticket < 0) {
Print("คำสั่งล้มเหลว ข้อผิดพลาด: ", GetLastError());
}
เพื่อใช้ฟังก์ชัน OrderSend อย่างเหมาะสม จำเป็นต้องออกแบบโดยพิจารณาจุดควรระวังเหล่านี้ ในส่วนถัดไปคือ “8. สรุป” เพื่อสรุปเนื้อหาจนถึงตอนนี้

8. สรุป
ฟังก์ชัน OrderSend ของ MQL4 เป็นฟังก์ชันหลักที่สนับสนุนการทำงานอัตโนมัติของการซื้อขายใน MetaTrader 4 และเป็นสิ่งจำเป็นสำหรับการทำให้กลยุทธ์การเทรดที่มีประสิทธิภาพเป็นจริง ในบทความนี้ เราได้อธิบายอย่างละเอียดตั้งแต่พื้นฐานจนถึงการประยุกต์ใช้ของฟังก์ชัน OrderSend และครอบคลุมความรู้ที่จำเป็นสำหรับการสร้างโปรแกรมซื้อขายอัตโนมัติที่ประสบความสำเร็จ
หัวข้อสำคัญของฟังก์ชัน OrderSend
1. โครงสร้างพื้นฐานของฟังก์ชัน OrderSend
- ฟังก์ชัน OrderSend เป็นฟังก์ชันที่ใช้ส่งคำสั่งซื้อขายจากโปรแกรม และสามารถกำหนดรายละเอียดคำสั่งได้อย่างยืดหยุ่นโดยระบุอาร์กิวเมนต์ต่าง ๆ
- ตัวอย่างเช่น ต้องกำหนดคู่สกุลเงิน (
symbol
), ประเภทคำสั่ง (cmd
), จำนวนล็อต (volume
), ราคา (price
) ฯลฯ
2. ประเภทของประเภทคำสั่งและสถานการณ์การใช้งาน
- คำสั่งตลาด เหมาะสำหรับการสั่งซื้อขายทันทีที่ราคาตลาด
- คำสั่งจำกัดราคา เหมาะกับกลยุทธ์ซื้อขายกลับข้าง, คำสั่งจำกัดราคาต้าน มีประโยชน์กับกลยุทธ์ซื้อขายตามแนวโน้มหรือกลยุทธ์เบรกเอาต์
3. ความเข้าใจรายละเอียดของอาร์กิวเมนต์
- การตั้งค่าอาร์กิวเมนต์แต่ละตัว (เช่น
stoploss
หรือtakeprofit
) อย่างเหมาะสมช่วยให้ควบคุมกลยุทธ์ได้ละเอียดขึ้น - การใช้ฟังก์ชัน
NormalizeDouble
เป็นสิ่งสำคัญสำหรับการตั้งค่าราคาที่แม่นยำ
4. ตัวอย่างการใช้งานและโค้ดที่ใช้ได้จริง
- เราได้แนะนำตัวอย่างโค้ดเฉพาะสำหรับคำสั่งตลาด, คำสั่งจำกัดราคา, และคำสั่งจำกัดราคาต้าน
- แสดงสถานการณ์การใช้ในแต่ละกรณีและให้ความรู้ที่เป็นประโยชน์สำหรับการซื้อขายจริง
5. การจัดการข้อผิดพลาด
- การใช้ฟังก์ชัน
GetLastError
เพื่อระบุข้อผิดพลาดและดำเนินการแก้ไขตามรหัสข้อผิดพลาดเป็นสิ่งสำคัญ - เราได้อธิบายวิธีหลีกเลี่ยงข้อผิดพลาดทั่วไป เช่น ขนาดล็อต, ระดับสต็อป, การขาดเงินมาร์จิ้น พร้อมตัวอย่างเฉพาะ
6. ข้อควรระวังเมื่อใช้งาน
- เราได้อธิบายจุดสำคัญที่ควรระวังในการปฏิบัติ เช่น การทำให้ราคาปกติ, การตั้งค่า slippage, การพิจารณาเวลาตอบสนองของเซิร์ฟเวอร์
- เราได้แนะนำมาตรการปฏิบัติจริงเพื่อความเสถียรของโปรแกรม เช่น การใช้ magic number และการจัดการเวลาการซื้อขาย
คำแนะนำในการใช้ฟังก์ชัน OrderSend
- การออกแบบอย่างมีแผน
- โปรแกรมที่ใช้ฟังก์ชัน OrderSend ควรออกแบบอย่างระมัดระวังโดยพิจารณากลยุทธ์การซื้อขายและการจัดการความเสี่ยง
- การบันทึกและดีบัก
- ตรวจสอบประวัติการซื้อขายและบันทึกเป็นประจำ และเมื่อเกิดข้อผิดพลาดให้ตอบสนองอย่างรวดเร็ว
- ความเข้าใจตลาด
- ตรวจสอบเงื่อนไขการซื้อขายของบริษัทหลักทรัพย์ (สเปรด, ระดับสต็อป, ขนาดล็อต ฯลฯ) ล่วงหน้าและออกแบบโปรแกรมให้สอดคล้อง
- การปรับปรุงอย่างต่อเนื่อง
- อัปเดตโปรแกรมเป็นประจำตามสภาพตลาดและการเปลี่ยนแปลงกลยุทธ์เพื่อมุ่งสู่ผลลัพธ์ที่ดีกว่า
ผ่านบทความนี้ เราหวังว่าคุณจะเข้าใจฟังก์ชัน OrderSend ดีขึ้นและสร้างพื้นฐานสำหรับการพัฒนาโปรแกรม MQL4 ที่ใช้ได้จริง ขั้นตอนถัดไปคือการนำโค้ดที่แนะนำในบทความนี้ไปประยุกต์ใช้และสร้าง EA (ผู้แนะนำผู้เชี่ยวชาญ) ที่ตรงกับกลยุทธ์การซื้อขายของคุณเอง
ขอให้สนับสนุนชีวิตการซื้อขายอัตโนมัติที่ประสบความสำเร็จ!