แก้ปัญหา Market closed (10018 / ข้อผิดพลาด 132) แบบครบวงจร
สารบัญ
- Market closed คืออะไร (ความแตกต่างระหว่าง 10018 กับ 132)
- ① TRADE_RETCODE_MARKET_CLOSED = 10018 (รหัสตอบกลับของ `OrderSend()` ใน MT5)
- ② ERR_MARKET_CLOSED = 132 (`GetLastError()` ของ MT4 / MQL4)
- วิธีวิเคราะห์เร่งด่วนใน 30 วินาที
- สาเหตุและวิธีแก้ (6 รูปแบบ)
- ① ตลาดปิดทั้งหมดเนื่องจากวันหยุดสุดสัปดาห์หรือวันหยุดนักขัตฤกษ์
- ② อยู่นอกช่วงเวลาซื้อขายเฉพาะสัญลักษณ์ (การหยุดพักรายวัน)
- ③ สับสนระหว่างเวลาเซิร์ฟเวอร์กับเวลาท้องถิ่น
- ④ สัญลักษณ์ถูกปิดการซื้อขายหรืออนุญาตเฉพาะการปิดสถานะ (SYMBOL_TRADE_MODE)
- ⑤ ช่วงเวลาทันทีหลังตลาดเปิดวันจันทร์หรือหลังเซสชันกลับมาเปิดใหม่
- ⑥ การหยุดการซื้อขายเนื่องจากข่าวหรือเหตุการณ์สำคัญ
- โค้ดป้องกันข้อผิดพลาดนี้ด้วย MQL5 (สำหรับนักพัฒนา EA)
- ตรวจสอบว่าอยู่ในช่วงเวลาซื้อขายหรือไม่
- ตรวจสอบโหมดการซื้อขาย (SYMBOL_TRADE_MODE)
- รวมเป็นด่านตรวจก่อนส่งคำสั่ง
- วิธีจัดการเมื่อยังได้รับ 10018 อยู่ดี
- รายการตรวจสอบตามลำดับความสำคัญ
- สรุป
- คำถามที่พบบ่อย
- ถาม: เจอ Market closed ทั้งที่เป็นช่วงกลางวันของวันธรรมดา เพราะอะไร?
- ถาม: 10018 กับ 132 ต่างกันอย่างไร?
- ถาม: EA แจ้งข้อผิดพลาดต่อเนื่องในวันเสาร์-อาทิตย์ ปล่อยไว้ได้ไหม?
- ถาม: เจอ 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 ข้อนี้เพื่อจับสาเหตุคร่าวๆ
- ตรวจสอบช่วงเวลาซื้อขายของสัญลักษณ์ — ในหน้าต่างราคา (Market Watch) คลิกขวาที่สัญลักษณ์นั้น → "ข้อกำหนด (Specification)" → "ช่วงเวลาซื้อขาย" จะมี เวลาที่สามารถซื้อขายได้ในแต่ละวัน (เวลาเซิร์ฟเวอร์) เขียนไว้ ถ้าเวลาปัจจุบันอยู่นอกกรอบนี้ นั่นคือคำตอบ
- ตรวจสอบเวลาเซิร์ฟเวอร์ — เวลาที่แสดงด้านบนของหน้าต่างราคาคือ เวลาเซิร์ฟเวอร์ของโบรกเกอร์ การตัดสินช่วงเวลาซื้อขายใช้ เวลานี้ ไม่ใช่นาฬิกาของเครื่อง PC ของคุณ โดยปกติจะต่างจากเวลาไทยหลายชั่วโมง
- ตรวจสอบโหมดการซื้อขาย — ในหน้าจอ "ข้อกำหนด" เดียวกัน ช่อง "การซื้อขาย" เป็นค่าอื่นที่ไม่ใช่
Full accessหรือไม่ (เช่นDisabled/Close only) ถ้าเป็นเช่นนั้น การเปิดออเดอร์ใหม่จะถูกปฏิเสธแม้อยู่ในช่วงเวลาซื้อขาย - ทดลองกับสัญลักษณ์อื่น — หาก EA หรือคำสั่งซื้อขายด้วยมือทำงานได้ปกติกับคู่เงินหลักอย่าง EURUSD แสดงว่า ปัญหาไม่ได้อยู่ที่บัญชีหรือ EA แต่อยู่ที่ช่วงเวลาซื้อขาย/ข้อจำกัดของสัญลักษณ์นั้น
สาเหตุและวิธีแก้ (6 รูปแบบ)
① ตลาดปิดทั้งหมดเนื่องจากวันหยุดสุดสัปดาห์หรือวันหยุดนักขัตฤกษ์
อาการ: เกิดข้อผิดพลาดในวันเสาร์-อาทิตย์ หรือช่วงปีใหม่/คริสต์มาส เกิดขึ้นกับทุกสัญลักษณ์
สาเหตุ: ตลาด FX โดยทั่วไปไม่สามารถซื้อขายได้ตั้งแต่ ตลาดปิดวันศุกร์จนถึงเปิดวันจันทร์ (ตามเวลาเซิร์ฟเวอร์) วันหยุดนักขัตฤกษ์ (วันปีใหม่ คริสต์มาส ฯลฯ) แม้เป็นวันธรรมดาก็อาจปิดตลาดหรือซื้อขายในเวลาที่จำกัด หาก EA พยายามส่งคำสั่งในช่วงสุดสัปดาห์เนื่องจากการประมวลผลแท่งเทียนที่เหลือหรือปัจจัยของ timeframe ก็จะเกิด 10018/132 ต่อเนื่อง
วิธีแก้:
- ข้อผิดพลาดนี้ไม่มีผลเสียหายจริง จะหายไปเองเมื่อตลาดเปิด
- หากไม่ต้องการให้ log รก ให้เพิ่มการตรวจสอบวันและช่วงเวลาซื้อขายในฝั่ง EA เพื่อ ไม่ส่งคำสั่งตั้งแต่แรก (ดูโค้ดด้านล่าง)
- ปฏิทินวันหยุดแตกต่างกันไปตามโบรกเกอร์ ควรตรวจสอบประกาศตารางวันหยุดของโบรกเกอร์
② อยู่นอกช่วงเวลาซื้อขายเฉพาะสัญลักษณ์ (การหยุดพักรายวัน)
อาการ: แม้เป็นวันธรรมดา แต่สัญลักษณ์บางตัว (ทองคำ เงิน ดัชนีหุ้น CFD พลังงาน ฯลฯ) เกิดข้อผิดพลาด และมักเกิดในช่วงเวลาเดิมทุกวัน
สาเหตุ: คู่เงิน FX สามารถซื้อขายได้เกือบตลอด 24 ชั่วโมงในวันธรรมดา แต่ โลหะมีค่าและดัชนีหุ้น CFD มักมีช่วงหยุดพักการซื้อขายทุกวันตั้งแต่ไม่กี่สิบนาทีถึงหลายชั่วโมง ซึ่งสอดคล้องกับการบำรุงรักษาตลาดสินทรัพย์อ้างอิงหรือการโรลโอเวอร์ ช่วงเวลาจะแตกต่างกันไปตามโบรกเกอร์และสัญลักษณ์ หาก EA ส่งคำสั่งในช่วงหยุดพักนี้จะเกิด 10018
วิธีแก้:
- ตรวจสอบ ช่วงเวลาหยุดพักที่แน่นอนของสัญลักษณ์นั้น ผ่าน "ข้อกำหนด → ช่วงเวลาซื้อขาย" (เวลาที่เขียนไว้ตรงนี้เท่านั้นที่ถูกต้อง อย่าเชื่อเวลาจากบล็อกของคนอื่นเพราะแตกต่างกันไปตามโบรกเกอร์)
- ใช้ตัวกรองเวลาของ EA (เช่น
TradeStartHour/TradeEndHour) เพื่อหลีกเลี่ยงช่วงหยุดพัก - สำหรับนักพัฒนา ให้ตรวจสอบด้วยโค้ดผ่าน
SymbolInfoSessionTrade()(ดูรายละเอียดด้านล่าง)
นอกจากนี้ คริปโตเคอร์เรนซี (เช่น BTCUSD) หลายโบรกเกอร์สามารถซื้อขายได้แม้วันเสาร์-อาทิตย์ แต่ก็ขึ้นอยู่กับโบรกเกอร์เช่นกัน อย่าตัดสินไปเองว่า "คริปโตต้องเทรดได้ 24/7" ควรตรวจสอบจากหน้าจอข้อกำหนดเสมอ
③ สับสนระหว่างเวลาเซิร์ฟเวอร์กับเวลาท้องถิ่น
อาการ: เกิดข้อผิดพลาดทั้งที่ "ช่วงเวลาซื้อขายในข้อกำหนดน่าจะอยู่ในเวลาทำการ" มักพบบ่อยเมื่อใช้โบรกเกอร์ต่างประเทศ
สาเหตุ: ทั้งช่วงเวลาซื้อขายที่ระบุในข้อกำหนดและเวลาที่แสดงใน MT5 ล้วนเป็น เวลาเซิร์ฟเวอร์ของโบรกเกอร์ โบรกเกอร์ต่างประเทศส่วนใหญ่ใช้ GMT+2/+3 (ตั้งค่าให้ตลาดนิวยอร์กปิดเวลาเที่ยงคืน) ซึ่ง ต่างจากเวลาไทย 6-7 ชั่วโมง แม้เวลาไทยจะบอกว่า "ยังเป็นคืนวันศุกร์" แต่เวลาเซิร์ฟเวอร์อาจเป็นวันเสาร์ไปแล้ว นี่คือความคลาดเคลื่อนตัวอย่างทั่วไป
วิธีแก้:
- ฝึกให้คิดโดยยึดเวลาในหน้าต่างราคา (= เวลาเซิร์ฟเวอร์) เป็นหลัก
- พารามิเตอร์ของ EA (เช่น ตัวกรองช่วงเวลาซื้อขาย) โดยทั่วไปมักกำหนดให้ ระบุเป็นเวลาเซิร์ฟเวอร์ ควรตรวจสอบว่าไม่ได้ตั้งค่าโดยเข้าใจผิดว่าเป็นเวลาไทย
- ในโค้ดให้ใช้
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 |
บัญชีเดโมและบัญชีจริงอาจตั้งค่าต่างกัน หรือสัญลักษณ์ที่ซื้อขายได้อาจแตกต่างกันตามประเภทบัญชี
วิธีแก้:
- ตรวจสอบช่อง "การซื้อขาย" ในหน้าจอ "ข้อกำหนด"
- หากเป็น
Close onlyให้ยอมรับว่าไม่สามารถเปิดออเดอร์ใหม่ได้และจัดการปิดสถานะที่มีอยู่ หากต้องการใช้สัญลักษณ์นี้ต่อไป ให้ตรวจสอบว่ามีสัญลักษณ์เดือนส่งมอบอื่นหรือสัญลักษณ์ที่มีซัฟฟิกซ์ต่างกัน (เช่นUS500.f) หรือไม่ - หากยังเป็น
Disabledให้สอบถามโบรกเกอร์ว่าประเภทบัญชีนี้สามารถซื้อขายได้หรือไม่
⑤ ช่วงเวลาทันทีหลังตลาดเปิดวันจันทร์หรือหลังเซสชันกลับมาเปิดใหม่
อาการ: เกิดข้อผิดพลาดหรือถูกปฏิเสธการเข้าออเดอร์เฉพาะช่วงไม่กี่นาทีหลังตลาดเปิดวันจันทร์ หรือทันทีหลังพ้นช่วงหยุดพักรายวัน
สาเหตุ: มีช่วงเวลาห่างระหว่างขณะที่เซสชัน "เปิด" กับขณะที่สามารถส่งคำสั่งได้อย่างเสถียรจริง ทันทีหลังเปิดตลาด สภาพคล่องต่ำและสเปรดกว้างผิดปกติ และบางโบรกเกอร์อาจไม่รับคำสั่งจนกว่าราคาจะเริ่มไหลเข้ามาอย่างสม่ำเสมอ (ซึ่งจะถูกปฏิเสธในลักษณะตลาดปิด) EA ที่ส่งสัญญาณทันทีเช้าวันจันทร์ หรือ EA ทองคำที่เล่นช่วงหลังพ้นการหยุดพัก มักเจอปัญหานี้เป็นประจำ
วิธีแก้:
- เพิ่มตัวกรอง หลีกเลี่ยงการเข้าออเดอร์ใหม่ในช่วง ○ นาทีแรกหลังตลาดเปิด (เช่น
AvoidMondayOpen) นี่คือเหตุผลที่ EA ที่แจกในเว็บไซต์นี้มีค่าเริ่มต้นให้หลีกเลี่ยงช่วง 0-3 นาฬิกาวันจันทร์ (เวลาเซิร์ฟเวอร์) - ควรใช้ตัวกรองสเปรด (
MaxSpread) ควบคู่เสมอ การเข้าออเดอร์ในสเปรดที่ผิดปกติทันทีหลังตลาดเปิดอาจสร้างความเสียหายมากกว่าข้อผิดพลาดเสียอีก - ออกแบบให้เมื่อได้รับ 10018 อย่าลองส่งคำสั่งซ้ำทันที แต่ให้รอจนถึงแท่งเทียนถัดไป
⑥ การหยุดการซื้อขายเนื่องจากข่าวหรือเหตุการณ์สำคัญ
อาการ: เกิดข้อผิดพลาดชั่วคราวก่อนและหลังการประกาศตัวเลขเศรษฐกิจสำคัญ หรือเมื่อสัญลักษณ์เฉพาะมีความผันผวนผิดปกติ
สาเหตุ: บางโบรกเกอร์หรือบางสัญลักษณ์อาจหยุดการซื้อขายชั่วคราว (halt) หรือจำกัดคำสั่งใหม่ในช่วงเหตุการณ์สำคัญ สำหรับดัชนีหุ้น CFD อาจหยุดตามกลไก circuit breaker ของตลาดสินทรัพย์อ้างอิง คำสั่งในช่วงนี้จะถูกปฏิเสธในลักษณะตลาดปิด
วิธีแก้:
- เป็นเพียงชั่วคราว เมื่อเวลาผ่านไปจะกลับมาเป็นปกติ
- การใช้ตัวกรองข่าวเศรษฐกิจ (
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 ทั้งหมดจำหน่ายในราคาเปิดตัวและจะปรับขึ้นเป็นขั้นตามยอดขาย รับการแจ้งเตือนก่อนการขึ้นราคาแต่ละครั้ง พร้อมอีเมลรายวันเกี่ยวกับการเทรดอัตโนมัติ การอ่านแบ็กเทสต์ และการเลือกโบรกเกอร์
* ปกป้องความเป็นส่วนตัวอย่างเคร่งครัด คุณสามารถยกเลิกการสมัครได้ตลอดเวลา