คู่มือ OrderSend MQL4 | จากโครงสร้างพื้นฐานถึงแก้ไขข้อผิดพลาด

目次

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

  1. การทำให้การซื้อขายเป็นอัตโนมัติ
    โดยใช้ฟังก์ชัน OrderSend ผู้เทรดสามารถทำให้การซื้อขายที่ทำด้วยมือเป็นอัตโนมัติได้ ซึ่งช่วยป้องกันข้อผิดพลาดของมนุษย์และทำให้การซื้อขายรวดเร็วและมีประสิทธิภาพ
  2. การดำเนินกลยุทธ์
    โดยกำหนดเงื่อนไขในโปรแกรมและดำเนินการสั่งซื้อตามนั้น สามารถเพิ่มความแม่นยำของกลยุทธ์การเทรดได้ เช่น การสั่งซื้อเมื่อราคาถึงระดับหนึ่งหรือในช่วงเวลาที่กำหนด
  3. การจัดการตำแหน่งหลายตำแหน่ง
    โดยใช้หมายเลขมาจิก (อาร์กิวเมนต์ 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;
   }
}

จุดสำคัญของการจัดการข้อผิดพลาด

  1. อย่าทำให้ข้อผิดพลาดถูกละเลย
    การดำเนินการแก้ไขที่เหมาะสมเมื่อเกิดข้อผิดพลาดจะเพิ่มความน่าเชื่อถือของโปรแกรม.
  2. ทำการตรวจสอบล่วงหน้า
    ก่อนสั่งซื้อ ตรวจสอบขนาดล็อตและระดับสต็อป ฯลฯ เพื่อป้องกันข้อผิดพลาดก่อนเกิดขึ้น.
  3. ใช้การบันทึกลงล็อก
    ใช้ฟังก์ชัน 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

  1. การออกแบบอย่างมีแผน
  • โปรแกรมที่ใช้ฟังก์ชัน OrderSend ควรออกแบบอย่างระมัดระวังโดยพิจารณากลยุทธ์การซื้อขายและการจัดการความเสี่ยง
  1. การบันทึกและดีบัก
  • ตรวจสอบประวัติการซื้อขายและบันทึกเป็นประจำ และเมื่อเกิดข้อผิดพลาดให้ตอบสนองอย่างรวดเร็ว
  1. ความเข้าใจตลาด
  • ตรวจสอบเงื่อนไขการซื้อขายของบริษัทหลักทรัพย์ (สเปรด, ระดับสต็อป, ขนาดล็อต ฯลฯ) ล่วงหน้าและออกแบบโปรแกรมให้สอดคล้อง
  1. การปรับปรุงอย่างต่อเนื่อง
  • อัปเดตโปรแกรมเป็นประจำตามสภาพตลาดและการเปลี่ยนแปลงกลยุทธ์เพื่อมุ่งสู่ผลลัพธ์ที่ดีกว่า

ผ่านบทความนี้ เราหวังว่าคุณจะเข้าใจฟังก์ชัน OrderSend ดีขึ้นและสร้างพื้นฐานสำหรับการพัฒนาโปรแกรม MQL4 ที่ใช้ได้จริง ขั้นตอนถัดไปคือการนำโค้ดที่แนะนำในบทความนี้ไปประยุกต์ใช้และสร้าง EA (ผู้แนะนำผู้เชี่ยวชาญ) ที่ตรงกับกลยุทธ์การซื้อขายของคุณเอง

ขอให้สนับสนุนชีวิตการซื้อขายอัตโนมัติที่ประสบความสำเร็จ!

FX 比較

การพัฒนา MQL (MQL4/MQL5)の最新記事8件