หน้าหลัก > บล็อก > แก้ปัญหา Market closed (10018 / ข้อผิดพลาด 132) แบบครบวงจร

MT5MQL5ข้อผิดพลาดแก้ปัญหาEA

แก้ปัญหา Market closed (10018 / ข้อผิดพลาด 132) แบบครบวงจร

เผยแพร่: 2026-07-07เวลาอ่าน: ประมาณ 3 นาที
This article reflects information as of its publish date. EA performance figures (PF, DD, annual return) change with live trading and re-validation — check the latest on the EA pages. See the latest EA results

สารบัญ

  1. Market closed คืออะไร (ความแตกต่างระหว่าง 10018 กับ 132)
  2. ① TRADE_RETCODE_MARKET_CLOSED = 10018 (รหัสตอบกลับของ `OrderSend()` ใน MT5)
  3. ② ERR_MARKET_CLOSED = 132 (`GetLastError()` ของ MT4 / MQL4)
  4. วิธีวิเคราะห์เร่งด่วนใน 30 วินาที
  5. สาเหตุและวิธีแก้ (6 รูปแบบ)
  6. ① ตลาดปิดทั้งหมดเนื่องจากวันหยุดสุดสัปดาห์หรือวันหยุดนักขัตฤกษ์
  7. ② อยู่นอกช่วงเวลาซื้อขายเฉพาะสัญลักษณ์ (การหยุดพักรายวัน)
  8. ③ สับสนระหว่างเวลาเซิร์ฟเวอร์กับเวลาท้องถิ่น
  9. ④ สัญลักษณ์ถูกปิดการซื้อขายหรืออนุญาตเฉพาะการปิดสถานะ (SYMBOL_TRADE_MODE)
  10. ⑤ ช่วงเวลาทันทีหลังตลาดเปิดวันจันทร์หรือหลังเซสชันกลับมาเปิดใหม่
  11. ⑥ การหยุดการซื้อขายเนื่องจากข่าวหรือเหตุการณ์สำคัญ
  12. โค้ดป้องกันข้อผิดพลาดนี้ด้วย MQL5 (สำหรับนักพัฒนา EA)
  13. ตรวจสอบว่าอยู่ในช่วงเวลาซื้อขายหรือไม่
  14. ตรวจสอบโหมดการซื้อขาย (SYMBOL_TRADE_MODE)
  15. รวมเป็นด่านตรวจก่อนส่งคำสั่ง
  16. วิธีจัดการเมื่อยังได้รับ 10018 อยู่ดี
  17. รายการตรวจสอบตามลำดับความสำคัญ
  18. สรุป
  19. คำถามที่พบบ่อย
  20. ถาม: เจอ Market closed ทั้งที่เป็นช่วงกลางวันของวันธรรมดา เพราะอะไร?
  21. ถาม: 10018 กับ 132 ต่างกันอย่างไร?
  22. ถาม: EA แจ้งข้อผิดพลาดต่อเนื่องในวันเสาร์-อาทิตย์ ปล่อยไว้ได้ไหม?
  23. ถาม: เจอ Market closed กับคริปโตเคอร์เรนซี (BTCUSD) ด้วย ไม่ใช่ว่าซื้อขายได้ 24 ชั่วโมงหรือ?

แก้ปัญหา Market closed (MT5/MQL5) แบบครบวงจร

เมื่อ log ของ EA ขึ้นข้อความ Market closed หรือ market is closed มีเพียงครึ่งเดียวเท่านั้นที่สรุปได้ง่ายๆ ว่า "เพราะเป็นวันเสาร์-อาทิตย์" หลายคนเจอปัญหาแบบ เกิดขึ้นกลางวันของวันธรรมดา หรือ สัญลักษณ์อื่นส่งคำสั่งได้ปกติ แต่สัญลักษณ์นี้เท่านั้นที่เจอปัญหา ซึ่งเป็นรูปแบบที่ทำให้เทรดเดอร์จำนวนมากสับสน

สาเหตุไม่ได้มีแค่ "วันหยุดสุดสัปดาห์" เท่านั้น แต่ยังรวมถึง ช่วงเวลาซื้อขายเฉพาะสัญลักษณ์ (การหยุดพักรายวันของทองคำหรือดัชนีหุ้น) ความคลาดเคลื่อนระหว่างเวลาเซิร์ฟเวอร์ของโบรกเกอร์กับเวลาท้องถิ่นของคุณ และข้อจำกัดโหมดการซื้อขายของสัญลักษณ์ (เช่น close-only) บทความนี้เขียนขึ้นสำหรับทั้งผู้ใช้ EA บน MT5 และผู้ที่เขียน EA ด้วย MQL5 โดยจะสรุปทุกอย่างเกี่ยวกับ Market closed ตั้งแต่ ตัวตนที่แท้จริง สาเหตุทั้ง 6 ข้อ วิธีวิเคราะห์แบบเร่งด่วนใน 30 วินาที ไปจนถึงการป้องกันถาวรในโค้ด สำหรับรายการรหัสข้อผิดพลาดทั้งหมด สามารถดูได้ที่ คู่มือรวมวิธีแก้ไขรหัสข้อผิดพลาด MQL5 / MT5

บทความนี้อ้างอิงจาก MT5 (build 4xxx) ณ เดือนกรกฎาคม 2026 ช่วงเวลาเซสชันและชื่อหน้าจออาจแตกต่างกันไปตามโบรกเกอร์และเวอร์ชัน


Market closed คืออะไร (ความแตกต่างระหว่าง 10018 กับ 132)

รหัสที่แสดงว่า "ตลาดปิด" นั้น แตกต่างกันระหว่าง MT5 กับ MT4 (MQL4) ควรตีความให้ถูกต้องตามแพลตฟอร์มและจุดที่ดึงค่ามา

① TRADE_RETCODE_MARKET_CLOSED = 10018 (รหัสตอบกลับของ OrderSend() ใน MT5)

ผลลัพธ์จากการส่งคำสั่งด้วย OrderSend() ใน MQL5 จะถูกเก็บไว้ใน MqlTradeResult.retcode เมื่อเซิร์ฟเวอร์การซื้อขายตัดสินว่า "สัญลักษณ์นี้อยู่นอกเวลาซื้อขาย" และปฏิเสธคำสั่ง จะได้รหัส 10018 นี่ไม่ใช่ข้อผิดพลาดภายในของ MT5 แต่เป็น การแจ้งปฏิเสธจากเซิร์ฟเวอร์ของโบรกเกอร์

ความหมาย: ตลาดปิด (Market is closed)
ค่าคงที่ : TRADE_RETCODE_MARKET_CLOSED
ค่า      : 10018
// ตัวอย่างผลลัพธ์ทั่วไปที่พบใน log
2026.07.06 23:05:11.204 EA_NAME XAUUSD,M5: OrderSend error 10018 [Market closed]

② ERR_MARKET_CLOSED = 132 (GetLastError() ของ MT4 / MQL4)

ใน MT4 (MQL4) หลังจากที่ OrderSend() ล้มเหลว GetLastError() จะคืนค่า 132 ซึ่งมีความหมายเดียวกันกับ 10018 คือ "ตลาดปิด" หากใช้ EA เวอร์ชัน MT4 ควบคู่กัน สาเหตุเดียวกันจะปรากฏเป็น 10018 บน MT5 และ 132 บน MT4

ความหมาย: ตลาดปิด (Market is closed)
ค่าคงที่ : ERR_MARKET_CLOSED (MQL4)
ค่า      : 132

สรุปการใช้งานจริง:

แพลตฟอร์มแหล่งที่มาค่า
MT5 (MQL5)MqlTradeResult.retcode / CTrade.ResultRetcode()10018
MT4 (MQL4)GetLastError() หลัง OrderSend() ล้มเหลว132

ทั้งสองแบบมีสาเหตุหลักร่วมกันคือ "ส่งคำสั่งไปนอกช่วงเวลาซื้อขายของเซิร์ฟเวอร์ (หรือการซื้อขายของสัญลักษณ์ถูกจำกัด)" วิธีแก้ก็เหมือนกัน จึงขออธิบายรวมกันด้านล่าง


วิธีวิเคราะห์เร่งด่วนใน 30 วินาที

ก่อนรีสตาร์ท EA แบบไม่มีทิศทาง ให้ตรวจสอบ 4 ข้อนี้เพื่อจับสาเหตุคร่าวๆ

  1. ตรวจสอบช่วงเวลาซื้อขายของสัญลักษณ์ — ในหน้าต่างราคา (Market Watch) คลิกขวาที่สัญลักษณ์นั้น → "ข้อกำหนด (Specification)" → "ช่วงเวลาซื้อขาย" จะมี เวลาที่สามารถซื้อขายได้ในแต่ละวัน (เวลาเซิร์ฟเวอร์) เขียนไว้ ถ้าเวลาปัจจุบันอยู่นอกกรอบนี้ นั่นคือคำตอบ
  2. ตรวจสอบเวลาเซิร์ฟเวอร์ — เวลาที่แสดงด้านบนของหน้าต่างราคาคือ เวลาเซิร์ฟเวอร์ของโบรกเกอร์ การตัดสินช่วงเวลาซื้อขายใช้ เวลานี้ ไม่ใช่นาฬิกาของเครื่อง PC ของคุณ โดยปกติจะต่างจากเวลาไทยหลายชั่วโมง
  3. ตรวจสอบโหมดการซื้อขาย — ในหน้าจอ "ข้อกำหนด" เดียวกัน ช่อง "การซื้อขาย" เป็นค่าอื่นที่ไม่ใช่ Full access หรือไม่ (เช่น Disabled / Close only) ถ้าเป็นเช่นนั้น การเปิดออเดอร์ใหม่จะถูกปฏิเสธแม้อยู่ในช่วงเวลาซื้อขาย
  4. ทดลองกับสัญลักษณ์อื่น — หาก EA หรือคำสั่งซื้อขายด้วยมือทำงานได้ปกติกับคู่เงินหลักอย่าง EURUSD แสดงว่า ปัญหาไม่ได้อยู่ที่บัญชีหรือ EA แต่อยู่ที่ช่วงเวลาซื้อขาย/ข้อจำกัดของสัญลักษณ์นั้น

สาเหตุและวิธีแก้ (6 รูปแบบ)

① ตลาดปิดทั้งหมดเนื่องจากวันหยุดสุดสัปดาห์หรือวันหยุดนักขัตฤกษ์

อาการ: เกิดข้อผิดพลาดในวันเสาร์-อาทิตย์ หรือช่วงปีใหม่/คริสต์มาส เกิดขึ้นกับทุกสัญลักษณ์

สาเหตุ: ตลาด FX โดยทั่วไปไม่สามารถซื้อขายได้ตั้งแต่ ตลาดปิดวันศุกร์จนถึงเปิดวันจันทร์ (ตามเวลาเซิร์ฟเวอร์) วันหยุดนักขัตฤกษ์ (วันปีใหม่ คริสต์มาส ฯลฯ) แม้เป็นวันธรรมดาก็อาจปิดตลาดหรือซื้อขายในเวลาที่จำกัด หาก EA พยายามส่งคำสั่งในช่วงสุดสัปดาห์เนื่องจากการประมวลผลแท่งเทียนที่เหลือหรือปัจจัยของ timeframe ก็จะเกิด 10018/132 ต่อเนื่อง

วิธีแก้:

  1. ข้อผิดพลาดนี้ไม่มีผลเสียหายจริง จะหายไปเองเมื่อตลาดเปิด
  2. หากไม่ต้องการให้ log รก ให้เพิ่มการตรวจสอบวันและช่วงเวลาซื้อขายในฝั่ง EA เพื่อ ไม่ส่งคำสั่งตั้งแต่แรก (ดูโค้ดด้านล่าง)
  3. ปฏิทินวันหยุดแตกต่างกันไปตามโบรกเกอร์ ควรตรวจสอบประกาศตารางวันหยุดของโบรกเกอร์

② อยู่นอกช่วงเวลาซื้อขายเฉพาะสัญลักษณ์ (การหยุดพักรายวัน)

อาการ: แม้เป็นวันธรรมดา แต่สัญลักษณ์บางตัว (ทองคำ เงิน ดัชนีหุ้น CFD พลังงาน ฯลฯ) เกิดข้อผิดพลาด และมักเกิดในช่วงเวลาเดิมทุกวัน

สาเหตุ: คู่เงิน FX สามารถซื้อขายได้เกือบตลอด 24 ชั่วโมงในวันธรรมดา แต่ โลหะมีค่าและดัชนีหุ้น CFD มักมีช่วงหยุดพักการซื้อขายทุกวันตั้งแต่ไม่กี่สิบนาทีถึงหลายชั่วโมง ซึ่งสอดคล้องกับการบำรุงรักษาตลาดสินทรัพย์อ้างอิงหรือการโรลโอเวอร์ ช่วงเวลาจะแตกต่างกันไปตามโบรกเกอร์และสัญลักษณ์ หาก EA ส่งคำสั่งในช่วงหยุดพักนี้จะเกิด 10018

วิธีแก้:

  1. ตรวจสอบ ช่วงเวลาหยุดพักที่แน่นอนของสัญลักษณ์นั้น ผ่าน "ข้อกำหนด → ช่วงเวลาซื้อขาย" (เวลาที่เขียนไว้ตรงนี้เท่านั้นที่ถูกต้อง อย่าเชื่อเวลาจากบล็อกของคนอื่นเพราะแตกต่างกันไปตามโบรกเกอร์)
  2. ใช้ตัวกรองเวลาของ EA (เช่น TradeStartHour/TradeEndHour) เพื่อหลีกเลี่ยงช่วงหยุดพัก
  3. สำหรับนักพัฒนา ให้ตรวจสอบด้วยโค้ดผ่าน SymbolInfoSessionTrade() (ดูรายละเอียดด้านล่าง)

นอกจากนี้ คริปโตเคอร์เรนซี (เช่น BTCUSD) หลายโบรกเกอร์สามารถซื้อขายได้แม้วันเสาร์-อาทิตย์ แต่ก็ขึ้นอยู่กับโบรกเกอร์เช่นกัน อย่าตัดสินไปเองว่า "คริปโตต้องเทรดได้ 24/7" ควรตรวจสอบจากหน้าจอข้อกำหนดเสมอ


③ สับสนระหว่างเวลาเซิร์ฟเวอร์กับเวลาท้องถิ่น

อาการ: เกิดข้อผิดพลาดทั้งที่ "ช่วงเวลาซื้อขายในข้อกำหนดน่าจะอยู่ในเวลาทำการ" มักพบบ่อยเมื่อใช้โบรกเกอร์ต่างประเทศ

สาเหตุ: ทั้งช่วงเวลาซื้อขายที่ระบุในข้อกำหนดและเวลาที่แสดงใน MT5 ล้วนเป็น เวลาเซิร์ฟเวอร์ของโบรกเกอร์ โบรกเกอร์ต่างประเทศส่วนใหญ่ใช้ GMT+2/+3 (ตั้งค่าให้ตลาดนิวยอร์กปิดเวลาเที่ยงคืน) ซึ่ง ต่างจากเวลาไทย 6-7 ชั่วโมง แม้เวลาไทยจะบอกว่า "ยังเป็นคืนวันศุกร์" แต่เวลาเซิร์ฟเวอร์อาจเป็นวันเสาร์ไปแล้ว นี่คือความคลาดเคลื่อนตัวอย่างทั่วไป

วิธีแก้:

  1. ฝึกให้คิดโดยยึดเวลาในหน้าต่างราคา (= เวลาเซิร์ฟเวอร์) เป็นหลัก
  2. พารามิเตอร์ของ EA (เช่น ตัวกรองช่วงเวลาซื้อขาย) โดยทั่วไปมักกำหนดให้ ระบุเป็นเวลาเซิร์ฟเวอร์ ควรตรวจสอบว่าไม่ได้ตั้งค่าโดยเข้าใจผิดว่าเป็นเวลาไทย
  3. ในโค้ดให้ใช้ TimeTradeServer() (อย่าใช้ TimeLocal() ในการตัดสินช่วงเวลาซื้อขาย)

④ สัญลักษณ์ถูกปิดการซื้อขายหรืออนุญาตเฉพาะการปิดสถานะ (SYMBOL_TRADE_MODE)

อาการ: แม้อยู่ในช่วงเวลาซื้อขายและเป็นวันธรรมดา แต่สัญลักษณ์บางตัวถูกปฏิเสธคำสั่งใหม่ทั้งหมด บางครั้งการปิดสถานะเท่านั้นที่ทำได้

สาเหตุ: โบรกเกอร์สามารถตั้งค่าโหมดการซื้อขายแยกตามสัญลักษณ์ได้

SYMBOL_TRADE_MODEความหมาย
SYMBOL_TRADE_MODE_FULLไม่มีข้อจำกัด (ปกติ)
SYMBOL_TRADE_MODE_CLOSEONLYปิดสถานะได้เท่านั้น (เปิดใหม่ไม่ได้) เช่น CFD ที่ใกล้ถูกถอดออกจากตลาดหรือใกล้เปลี่ยนเดือนส่งมอบ
SYMBOL_TRADE_MODE_DISABLEDปิดการซื้อขายทั้งหมด
SYMBOL_TRADE_MODE_LONGONLY / SHORTONLYเปิดได้เฉพาะ Buy หรือเฉพาะ Sell

บัญชีเดโมและบัญชีจริงอาจตั้งค่าต่างกัน หรือสัญลักษณ์ที่ซื้อขายได้อาจแตกต่างกันตามประเภทบัญชี

วิธีแก้:

  1. ตรวจสอบช่อง "การซื้อขาย" ในหน้าจอ "ข้อกำหนด"
  2. หากเป็น Close only ให้ยอมรับว่าไม่สามารถเปิดออเดอร์ใหม่ได้และจัดการปิดสถานะที่มีอยู่ หากต้องการใช้สัญลักษณ์นี้ต่อไป ให้ตรวจสอบว่ามีสัญลักษณ์เดือนส่งมอบอื่นหรือสัญลักษณ์ที่มีซัฟฟิกซ์ต่างกัน (เช่น US500.f) หรือไม่
  3. หากยังเป็น Disabled ให้สอบถามโบรกเกอร์ว่าประเภทบัญชีนี้สามารถซื้อขายได้หรือไม่

⑤ ช่วงเวลาทันทีหลังตลาดเปิดวันจันทร์หรือหลังเซสชันกลับมาเปิดใหม่

อาการ: เกิดข้อผิดพลาดหรือถูกปฏิเสธการเข้าออเดอร์เฉพาะช่วงไม่กี่นาทีหลังตลาดเปิดวันจันทร์ หรือทันทีหลังพ้นช่วงหยุดพักรายวัน

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

วิธีแก้:

  1. เพิ่มตัวกรอง หลีกเลี่ยงการเข้าออเดอร์ใหม่ในช่วง ○ นาทีแรกหลังตลาดเปิด (เช่น AvoidMondayOpen) นี่คือเหตุผลที่ EA ที่แจกในเว็บไซต์นี้มีค่าเริ่มต้นให้หลีกเลี่ยงช่วง 0-3 นาฬิกาวันจันทร์ (เวลาเซิร์ฟเวอร์)
  2. ควรใช้ตัวกรองสเปรด (MaxSpread) ควบคู่เสมอ การเข้าออเดอร์ในสเปรดที่ผิดปกติทันทีหลังตลาดเปิดอาจสร้างความเสียหายมากกว่าข้อผิดพลาดเสียอีก
  3. ออกแบบให้เมื่อได้รับ 10018 อย่าลองส่งคำสั่งซ้ำทันที แต่ให้รอจนถึงแท่งเทียนถัดไป

⑥ การหยุดการซื้อขายเนื่องจากข่าวหรือเหตุการณ์สำคัญ

อาการ: เกิดข้อผิดพลาดชั่วคราวก่อนและหลังการประกาศตัวเลขเศรษฐกิจสำคัญ หรือเมื่อสัญลักษณ์เฉพาะมีความผันผวนผิดปกติ

สาเหตุ: บางโบรกเกอร์หรือบางสัญลักษณ์อาจหยุดการซื้อขายชั่วคราว (halt) หรือจำกัดคำสั่งใหม่ในช่วงเหตุการณ์สำคัญ สำหรับดัชนีหุ้น CFD อาจหยุดตามกลไก circuit breaker ของตลาดสินทรัพย์อ้างอิง คำสั่งในช่วงนี้จะถูกปฏิเสธในลักษณะตลาดปิด

วิธีแก้:

  1. เป็นเพียงชั่วคราว เมื่อเวลาผ่านไปจะกลับมาเป็นปกติ
  2. การใช้ตัวกรองข่าวเศรษฐกิจ (UseEconomicFilter ของ EA ในเว็บไซต์นี้) เพื่อหยุดการเข้าออเดอร์ใหม่ก่อนและหลังการประกาศตัวเลข จะช่วยหลีกเลี่ยงทั้งข้อผิดพลาดและความเสี่ยงจากความผันผวนรุนแรงไปพร้อมกัน

โค้ดป้องกันข้อผิดพลาดนี้ด้วย MQL5 (สำหรับนักพัฒนา EA)

Market closed ไม่ควรถูกจัดการแบบ "แก้หลังเกิดข้อผิดพลาด" แต่การออกแบบที่ถูกต้องคือ ตรวจสอบช่วงเวลาซื้อขายและโหมดการซื้อขายก่อนส่งคำสั่ง แล้วไม่ส่งคำสั่งหากตลาดปิดอยู่ วิธีนี้นอกจากทำให้ log สะอาดแล้ว ยังป้องกันคำขอที่ไม่จำเป็นไปยังเซิร์ฟเวอร์และการลองซ้ำที่ควบคุมไม่ได้

ตรวจสอบว่าอยู่ในช่วงเวลาซื้อขายหรือไม่

SymbolInfoSessionTrade() จะคืนเวลาเริ่มต้น/สิ้นสุดของเซสชันที่ i ของวันที่ระบุ (หน่วยเป็นวินาทีนับจากเที่ยงคืนตามเวลาเซิร์ฟเวอร์) เพื่อรองรับสัญลักษณ์ที่มีหลายเซสชัน (เช่น ดัชนีที่มีการหยุดพักรายวันคั่นกลาง) จึงต้องวนลูปตรวจสอบทุกเซสชัน

// ตรวจสอบว่าเวลาเซิร์ฟเวอร์ปัจจุบันอยู่ในช่วงเวลาซื้อขายของสัญลักษณ์นี้หรือไม่
bool IsTradeSessionOpen(const string symbol)
{
   MqlDateTime dt;
   TimeToStruct(TimeTradeServer(), dt);           // ต้องตัดสินด้วยเวลาเซิร์ฟเวอร์เท่านั้น
   int now = dt.hour*3600 + dt.min*60 + dt.sec;   // วินาทีที่ผ่านไปนับจากเที่ยงคืน

   datetime from, to;
   for(uint i = 0; SymbolInfoSessionTrade(symbol, (ENUM_DAY_OF_WEEK)dt.day_of_week, i, from, to); i++)
   {
      int f = (int)from;                 // วินาทีนับจากเที่ยงคืน
      int t = (int)to;                   // สิ้นสุดเวลา 24:00 จะเป็น 86400
      if(now >= f && now < t)
         return true;
   }
   return false;   // ไม่มีเซสชันที่ตรงกับวันนี้ (เช่นวันหยุดสุดสัปดาห์) หรืออยู่นอกทุกเซสชัน
}

ตรวจสอบโหมดการซื้อขาย (SYMBOL_TRADE_MODE)

// ตรวจสอบว่าสามารถเปิดออเดอร์ใหม่ได้ตามโหมดการซื้อขายหรือไม่
bool IsNewEntryAllowed(const string symbol, ENUM_ORDER_TYPE type)
{
   long mode = SymbolInfoInteger(symbol, SYMBOL_TRADE_MODE);
   if(mode == SYMBOL_TRADE_MODE_DISABLED)  return false; // ปิดการซื้อขาย
   if(mode == SYMBOL_TRADE_MODE_CLOSEONLY) return false; // ปิดสถานะได้เท่านั้น = เปิดใหม่ไม่ได้
   if(mode == SYMBOL_TRADE_MODE_LONGONLY  && type != ORDER_TYPE_BUY)  return false;
   if(mode == SYMBOL_TRADE_MODE_SHORTONLY && type != ORDER_TYPE_SELL) return false;
   return true;   // SYMBOL_TRADE_MODE_FULL เป็นต้น
}

รวมเป็นด่านตรวจก่อนส่งคำสั่ง

// ใน OnTick: แม้สัญญาณจะเกิดขึ้น แต่ถ้าตลาดปิดอยู่ก็ไม่ส่งคำสั่ง
if(!IsTradeSessionOpen(_Symbol) || !IsNewEntryAllowed(_Symbol, ORDER_TYPE_BUY))
{
   // ป้องกัน 10018 ล่วงหน้า เก็บ log แค่บรรทัดเดียวแล้วรอแท่งเทียนถัดไป
   return;
}

วิธีจัดการเมื่อยังได้รับ 10018 อยู่ดี

จังหวะการอัปเดตข้อมูลเซสชันหรือการถูกปฏิเสธทันทีหลังตลาดเปิดอาจทำให้หลุดผ่านด่านตรวจได้เสมอ ไม่สามารถทำให้เป็นศูนย์ได้ทั้งหมด กฎเหล็กคือเมื่อดู retcode ของ OrderSend() แล้วพบ 10018 ห้ามลองส่งซ้ำทันที (ต้องรอจนถึงแท่งเทียนถัดไป) การส่งซ้ำรัวๆ ขณะตลาดปิดมีแต่จะทำให้ log รกโดยไม่ช่วยแก้ปัญหาอะไรเลย

MqlTradeRequest req; MqlTradeResult res;
ZeroMemory(req); ZeroMemory(res);
// ... จัดเตรียม req ...
if(!OrderSend(req, res) || res.retcode != TRADE_RETCODE_DONE)
{
   if(res.retcode == TRADE_RETCODE_MARKET_CLOSED)   // 10018
      Print("Market closed. Skip and wait for the next session.");
   else
      PrintFormat("OrderSend failed: retcode=%d, lastError=%d", res.retcode, GetLastError());
}

พูดตรงๆ EA ที่ส่งคำสั่งทันทีหลังตลาดเปิดวันจันทร์หรือช่วงก่อน-หลังการหยุดพักรายวัน (โดยเฉพาะทองคำและดัชนีหุ้น) จะเจอข้อผิดพลาดนี้เป็นประจำ EA ที่คำนึงถึงตารางเวลา — มีการตรวจสอบเซสชัน หลีกเลี่ยงช่วงทันทีหลังตลาดเปิด และปิดสถานะก่อนวันหยุดสุดสัปดาห์ — นอกจากจะไม่สร้างข้อผิดพลาดที่ไม่จำเป็นแล้ว ยังหลีกเลี่ยงการเข้าออเดอร์ที่ไม่ดีในช่วงสภาพคล่องต่ำได้ด้วย EA ที่แจกโดย FXEA365 มีการติดตั้ง การหลีกเลี่ยงตลาดเปิดวันจันทร์ (AvoidMondayOpen) ตัวกรองเวลา และการปิดสถานะก่อนวันหยุดสุดสัปดาห์ (CloseAllBeforeWeekend) เป็นค่ามาตรฐาน


รายการตรวจสอบตามลำดับความสำคัญ

ลำดับตรวจสอบวิธีแก้
🚨 ก่อนอื่นตอนนี้เป็นวันหยุดสุดสัปดาห์หรือวันหยุดนักขัตฤกษ์หรือไม่ (ตามเวลาเซิร์ฟเวอร์)รอเฉยๆ ข้อผิดพลาดนี้ไม่มีผลเสียหาย
🚨 ก่อนอื่นอยู่ในกรอบ "ช่วงเวลาซื้อขาย" ตามข้อกำหนดหรือไม่หลีกเลี่ยงช่วงหยุดพักเฉพาะสัญลักษณ์ด้วยตัวกรองเวลา
⚠️ ถัดไปสับสนระหว่างเวลาเซิร์ฟเวอร์กับเวลาไทยหรือไม่ตั้งค่าใหม่โดยยึดเวลาในหน้าต่างราคาเป็นหลัก
⚠️ ถัดไปโหมดการซื้อขายเป็น Full access หรือไม่หากเป็น Close only / Disabled ให้ตรวจสอบข้อกำหนดของโบรกเกอร์
✅ ตรวจสอบไม่ใช่ช่วงทันทีหลังตลาดเปิดหรือหลังพ้นการหยุดพักหรือไม่เว้นระยะ ○ นาที และใช้ตัวกรองสเปรด
🛠 พัฒนาตรวจสอบเซสชัน/โหมดก่อนส่งคำสั่งหรือไม่ติดตั้งด่านตรวจ SymbolInfoSessionTrade

สรุป

  • Market closed คือ 10018 (TRADE_RETCODE_MARKET_CLOSED) ใน MT5 และ 132 (ERR_MARKET_CLOSED) ใน MT4 ความหมายเดียวกันคือ "คำสั่งอยู่นอกช่วงเวลาซื้อขาย/อยู่ระหว่างถูกจำกัดการซื้อขาย"
  • ไม่ได้เกิดเฉพาะวันหยุดสุดสัปดาห์เท่านั้น แต่ยังเกิดจาก การหยุดพักรายวันเฉพาะสัญลักษณ์ (ทองคำ ดัชนี) ความคลาดเคลื่อนของเวลาเซิร์ฟเวอร์ ข้อจำกัด SYMBOL_TRADE_MODE และการปฏิเสธทันทีหลังตลาดเปิด หากเกิดในวันธรรมดา ให้ตรวจสอบ "ข้อกำหนด → ช่วงเวลาซื้อขาย" ก่อนเป็นอันดับแรก
  • ช่วงเวลาซื้อขาย แตกต่างกันไปตามโบรกเกอร์และสัญลักษณ์ เวลาที่เขียนไว้ในหน้าจอข้อกำหนดของ MT5 ของคุณเท่านั้นที่ถูกต้อง
  • นักพัฒนา EA ควรป้องกันถาวรด้วยด่านตรวจก่อนส่งคำสั่งที่ใช้ SymbolInfoSessionTrade() + SYMBOL_TRADE_MODE + TimeTradeServer() และเมื่อได้รับ 10018 ต้องไม่ลองซ้ำทันที ให้รอจนถึงแท่งเทียนถัดไป

สำหรับรหัสข้อผิดพลาดทั้งหมด ดูได้ที่ คู่มือรวมวิธีแก้ไขรหัสข้อผิดพลาด MQL5 / MT5 และสำหรับ EA ฟรีที่ติดตั้งการหลีกเลี่ยงเซสชันและตัวกรองเวลาเป็นมาตรฐาน ดูได้ที่ รายการ EA


คำถามที่พบบ่อย

ถาม: เจอ Market closed ทั้งที่เป็นช่วงกลางวันของวันธรรมดา เพราะอะไร?

สาเหตุคือช่วงเวลาหยุดพักการซื้อขายเฉพาะของสัญลักษณ์นั้น (การหยุดพักรายวัน) หรือข้อจำกัดโหมดการซื้อขายของสัญลักษณ์ ทองคำ เงิน และดัชนีหุ้น CFD มีช่วงเวลาที่ไม่สามารถซื้อขายได้ทุกวันแม้เป็นวันธรรมดา คลิกขวาที่สัญลักษณ์ในหน้าต่างราคา → "ข้อกำหนด" → ตรวจสอบ "ช่วงเวลาซื้อขาย" และช่อง "การซื้อขาย"

ถาม: 10018 กับ 132 ต่างกันอย่างไร?

แตกต่างกันเพียงแพลตฟอร์มเท่านั้น ความหมายเหมือนกัน 10018 (TRADE_RETCODE_MARKET_CLOSED) คือรหัสตอบกลับของ OrderSend() ใน MT5 ส่วน 132 (ERR_MARKET_CLOSED) คือค่าของ GetLastError() ใน MT4 (MQL4) วิธีแก้ปัญหาเหมือนกัน

ถาม: EA แจ้งข้อผิดพลาดต่อเนื่องในวันเสาร์-อาทิตย์ ปล่อยไว้ได้ไหม?

ไม่มีผลเสียหายจริง จะหยุดไปเองเมื่อตลาดเปิด แต่หากกังวลเรื่อง log ที่รกหรือการแจ้งเตือน push ที่ดังต่อเนื่อง วิธีแก้ที่ต้นเหตุคือเพิ่มการตรวจสอบวัน/ช่วงเวลาซื้อขายในฝั่ง EA เพื่อข้ามการส่งคำสั่งไปเลย (ดูโค้ดในเนื้อหา)

ถาม: เจอ Market closed กับคริปโตเคอร์เรนซี (BTCUSD) ด้วย ไม่ใช่ว่าซื้อขายได้ 24 ชั่วโมงหรือ?

การที่ CFD คริปโตเคอร์เรนซีจะซื้อขายได้ในวันเสาร์-อาทิตย์หรือไม่นั้น ขึ้นอยู่กับโบรกเกอร์แต่ละราย บางโบรกเกอร์หยุดการซื้อขายในวันหยุดสุดสัปดาห์ หรือมีช่วงหยุดพักบำรุงรักษาสั้นๆ เช่นเดียวกับคู่เงิน FX ควรตรวจสอบ "ข้อกำหนด → ช่วงเวลาซื้อขาย" เพื่อดูเวลาที่สามารถซื้อขายได้จริงกับโบรกเกอร์ของคุณ

📧 แจ้งเตือนก่อนขึ้นราคา + คอร์สอีเมลฟรี 5 วัน

EA ทั้งหมดจำหน่ายในราคาเปิดตัวและจะปรับขึ้นเป็นขั้นตามยอดขาย รับการแจ้งเตือนก่อนการขึ้นราคาแต่ละครั้ง พร้อมอีเมลรายวันเกี่ยวกับการเทรดอัตโนมัติ การอ่านแบ็กเทสต์ และการเลือกโบรกเกอร์

* ปกป้องความเป็นส่วนตัวอย่างเคร่งครัด คุณสามารถยกเลิกการสมัครได้ตลอดเวลา

ความคิดเห็นและคำถาม