หน้าหลัก > บล็อก > MT5 "Not enough money" (134/10019): 7 สาเหตุและวิธีแก้

MT5MQL5ข้อผิดพลาดการแก้ปัญหาEAมาร์จิ้น

MT5 "Not enough money" (134/10019): 7 สาเหตุและวิธีแก้

เผยแพร่: 2026-06-12เวลาอ่าน: ประมาณ 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. ERR_NO_MONEY คืออะไร (ความแตกต่างระหว่าง 134 กับ 10019)
  2. ① ERR_NO_MONEY = 134 (รหัสข้อผิดพลาดขณะรันจาก `GetLastError()`)
  3. ② TRADE_RETCODE_NO_MONEY = 10019 (รหัสคืนค่าของ `OrderSend()`)
  4. ตรวจสอบเบื้องต้นภายใน 30 วินาที
  5. สาเหตุและวิธีแก้ไข (6 รูปแบบ)
  6. ① เงินทุนไม่เพียงพอจริงๆ
  7. ② ล็อตใหญ่เกินไป (เมื่อเทียบกับยอดเงินคงเหลือ)
  8. ③ เลเวอเรจต่ำ หรือถูกจำกัดช่วงวันหยุดสุดสัปดาห์/ข่าวสำคัญ
  9. ④ มาร์จิ้นถูกกันไว้จากโพซิชันที่มีอยู่เดิม
  10. ⑤ นับโบนัส/เครดิตรวมเป็นมาร์จิ้น
  11. ⑥ ขนาดสัญญาต่างกันตามประเภทบัญชี (Standard เทียบกับ Cent/Micro)
  12. ข้อควรระวังตามโบรกเกอร์
  13. โค้ด MQL5 สำหรับป้องกันข้อผิดพลาดนี้ (สำหรับนักพัฒนา EA)
  14. ตรวจสอบมาร์จิ้นที่ต้องใช้ก่อนส่งคำสั่ง
  15. ปรับขนาดล็อตให้เป็นไปตามขั้นต่ำ/สเต็ปที่ถูกต้อง
  16. ตรวจสอบ retcode ของ OrderSend ทุกครั้ง
  17. หยุดฉุกเฉินเมื่อระดับมาร์จิ้นต่ำ
  18. รายการตรวจสอบตามลำดับความสำคัญ
  19. สรุป
  20. คำถามที่พบบ่อย
  21. ถาม: มียอดเงินคงเหลือเพียงพอ แต่ยังเกิด ERR_NO_MONEY เพราะอะไร?
  22. ถาม: 134 กับ 10019 ต่างกันอย่างไร?
  23. ถาม: ไม่เกิดในการ Backtest แต่เกิดในการเทรดจริง เพราะอะไร?
  24. ถาม: EA แบบ Martingale/Grid ยิ่งเพิ่มจำนวนขั้นยิ่งเกิด ERR_NO_MONEY ทำไม?
  25. ถาม: สามารถป้องกันด้วยโค้ด EA โดยอัตโนมัติได้หรือไม่?
  26. ถาม: เริ่มต้นด้วยเงินทุนขั้นต่ำเท่าไหร่จึงจะไม่ฝืนเกินไป?

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

เมื่อรัน EA แล้วเห็น ERR_NO_MONEY หรือ not enough money ขึ้นในแท็บ Expert หรือ Journal หลายคนอาจตกใจว่า "เงินทุนไม่พอแล้วหรือ?" แต่ในความเป็นจริง ข้อผิดพลาดนี้เกิดขึ้นได้แม้ยอดเงินคงเหลือยังมีเหลือเฟือ สาเหตุไม่ได้มีแค่ "เงินทุนเป็นศูนย์" เท่านั้น แต่ยังรวมถึงการคำนวณล็อต เลเวอเรจ และการกันมาร์จิ้นจากโพซิชันที่มีอยู่เดิม เป็นต้น

บทความนี้เขียนขึ้นสำหรับทั้งผู้ใช้ EA บน MT5 และผู้พัฒนา EA ด้วย MQL5 โดยรวบรวม ความหมายที่แท้จริง สาเหตุ 6 ประการ วิธีแก้ไขที่ทำได้ทันที ข้อควรระวังตามโบรกเกอร์ และการป้องกันถาวรในระดับโค้ด ของ ERR_NO_MONEY ไว้ในที่เดียว สำหรับรายการรหัสข้อผิดพลาดทั้งหมด สามารถดูได้ที่ คู่มือรวมวิธีแก้ไขรหัสข้อผิดพลาด MQL5 / MT5

บทความนี้อ้างอิงจาก MT5 (build 4xxx) ณ เดือนมิถุนายน 2026 ตัวเลขและชื่อหน้าจออาจแตกต่างกันเล็กน้อยตามโบรกเกอร์และเวอร์ชัน build


ERR_NO_MONEY คืออะไร (ความแตกต่างระหว่าง 134 กับ 10019)

ค่าที่แสดงถึง "เงินทุนไม่พอ" ใน MQL5 มี 2 แบบ ขึ้นอยู่กับว่าดึงมาจากที่ใด หากสับสนระหว่างสองค่านี้จะทำให้การหาสาเหตุอ้อมไปไกล

① ERR_NO_MONEY = 134 (รหัสข้อผิดพลาดขณะรันจาก GetLastError())

เป็น รหัสข้อผิดพลาดขณะรัน (runtime error) ที่ GetLastError() ส่งคืน ค่า 134 จะถูกตั้งเมื่อฟังก์ชันคำนวณอย่าง OrderCalcMargin() หรือ OrderCalcProfit() หรือโค้ดสไตล์เก่า ตัดสินว่า "มาร์จิ้นที่ต้องใช้เกินกว่ามาร์จิ้นอิสระ"

ความหมาย: เงินทุนไม่พอสำหรับการดำเนินการซื้อขาย (not enough money)
ค่าคงที่: ERR_NO_MONEY
ค่า    : 134

② TRADE_RETCODE_NO_MONEY = 10019 (รหัสคืนค่าของ OrderSend())

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

ความหมาย: เงินทุนไม่เพียงพอสำหรับการดำเนินคำสั่ง (There is not enough money to complete the request)
ค่าคงที่: TRADE_RETCODE_NO_MONEY
ค่า    : 10019
// ตัวอย่างผลลัพธ์ทั่วไปที่พบในล็อก
2026.06.12 09:15:32.441 EA_NAME XAUUSD,H1: OrderSend error 10019

แนวทางการแยกใช้งานจริง:

แหล่งที่มาค่าเกิดขึ้นเมื่อ
GetLastError()134 (ERR_NO_MONEY)การคำนวณอย่าง OrderCalcMargin หรือการตรวจสอบภายใน
MqlTradeResult.retcode10019 (TRADE_RETCODE_NO_MONEY)OrderSend ถูกเซิร์ฟเวอร์ปฏิเสธ
CTrade.ResultRetcode()10019การส่งคำสั่งผ่าน CTrade ถูกปฏิเสธ

หากในล็อกขึ้น "134" แสดงว่าอยู่ในขั้นตอนคำนวณ/ตรวจสอบภายใน แต่ถ้าเป็น "10019" หรือแท็บ Expert ขึ้น not enough money แสดงว่าอยู่ในขั้นตอนถูกเซิร์ฟเวอร์ปฏิเสธ ทั้งสองกรณี มีสาเหตุหลักเดียวกัน (มาร์จิ้นที่ต้องใช้ > มาร์จิ้นที่ใช้ได้) ดังนั้นวิธีแก้ไขจึงเหมือนกัน


ตรวจสอบเบื้องต้นภายใน 30 วินาที

ให้ดูที่แท็บ "Toolbox → Trade" ของ MT5 ใน 3 รายการต่อไปนี้

ยอดเงินคงเหลือ (Balance)         : เงินสดในบัญชี
มาร์จิ้นที่มีผล (Equity)         : Balance ± กำไร/ขาดทุนที่ยังไม่รับรู้
มาร์จิ้นอิสระ (Free Margin)      : มาร์จิ้นที่ใช้เปิดโพซิชันใหม่ได้ตอนนี้ ← ตัวนี้สำคัญ
ระดับมาร์จิ้น (Margin Level %)   : Equity / Margin × 100
  • หากมาร์จิ้นอิสระ (Free Margin) น้อยกว่ามาร์จิ้นที่ต้องใช้สำหรับโพซิชันที่กำลังจะเปิด จะเกิด ERR_NO_MONEY ทันที 100%
  • หากยอดเงินคงเหลือมีเพียงพอแต่ยังขึ้นข้อผิดพลาดนี้ สาเหตุคือหนึ่งใน "②ล็อตเกินขนาด" "④การกันมาร์จิ้นจากโพซิชันเดิม" หรือ "⑥ประเภทบัญชีไม่ตรงกัน" ที่จะกล่าวถึงถัดไป

มาร์จิ้นที่ต้องใช้สำหรับ 1 โพซิชันสามารถตรวจสอบได้จาก MT5 ที่ "Market Watch → คลิกขวาที่สัญลักษณ์ → Specification" (มาร์จิ้นสำหรับ 1 ล็อต) สูตรคร่าวๆ มีดังนี้

มาร์จิ้นที่ต้องใช้ ≈ (ล็อต × ขนาดสัญญา × ราคา) / เลเวอเรจ

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

① เงินทุนไม่เพียงพอจริงๆ

อาการ: ขาดทุนลอยขยายตัวขึ้น จน Free Margin ต่ำกว่าจำนวนที่ต้องใช้สำหรับโพซิชันใหม่ พบบ่อยหลังจากขาดทุนติดต่อกันหรือเมื่อ Martingale ลึกหลายขั้น

วิธีแก้ไข:

  1. ฝากเงินเพิ่ม หรือ
  2. ปิดโพซิชันที่ถืออยู่บางส่วนด้วยตนเองเพื่อดึงมาร์จิ้นกลับคืน
  3. ลดค่า RiskPercent ของ EA เพื่อลดขนาดล็อตในครั้งต่อไป

หาก EA เกิดปัญหานี้ซ้ำๆ แสดงว่าขนาดล็อตใหญ่เกินไปเมื่อเทียบกับเงินทุน ให้ดูข้อ ② ต่อไป


② ล็อตใหญ่เกินไป (เมื่อเทียบกับยอดเงินคงเหลือ)

อาการ: มียอดเงินคงเหลืออยู่ แต่เกิด ERR_NO_MONEY ตั้งแต่คำสั่งแรก พบบ่อยในการใช้ล็อตคงที่

สาเหตุ: FixedLot ไม่สอดคล้องกับยอดเงินคงเหลือและเลเวอเรจของบัญชี เช่น บัญชีที่มีเงิน 100,000 เยน (≈$670) หากพยายามเปิด XAUUSD 0.1 ล็อต มาร์จิ้นที่ต้องใช้อาจเกินยอดเงินคงเหลือขึ้นอยู่กับเลเวอเรจ

วิธีแก้ไข:

  1. ลดล็อตคงที่ลงเหลือค่าต่ำสุด (0.01) แล้วดูว่าเปิดได้หรือไม่
  2. เปลี่ยนไปใช้การคำนวณล็อตอัตโนมัติตามเปอร์เซ็นต์ความเสี่ยง (UseFixedLot=false / RiskPercent)
  3. หากยังเปิด 0.01 ไม่ได้ แสดงว่าเลเวอเรจหรือเงินทุนของบัญชีไม่เพียงพอ → ไปดูข้อ ③ หรือ ⑥

เกณฑ์อ้างอิง: การออกแบบให้เริ่มต้นได้จาก บัญชี Standard เงินทุน 100,000 เยน (≈$670) ด้วยล็อตขั้นต่ำ 0.01 เป็นมาตรฐานที่ไม่ฝืนเกินไป หากมีเงินทุนน้อยกว่านี้หรือต้องการเทรดด้วยความเสี่ยงที่ต่ำและปลอดภัยกว่า ควรพิจารณา "บัญชี Micro (Cent)" ที่จะกล่าวถึงถัดไป


③ เลเวอเรจต่ำ หรือถูกจำกัดช่วงวันหยุดสุดสัปดาห์/ข่าวสำคัญ

อาการ: EA และขนาดล็อตเดียวกัน เปิดได้ในบัญชีอื่นแต่เกิด ERR_NO_MONEY เฉพาะบัญชีนี้ หรือข้อผิดพลาดเกิดขึ้นกระจุกตัวช่วงเย็นวันศุกร์ถึงเช้าวันจันทร์

สาเหตุ: หากเลเวอเรจของบัญชีต่ำ (เช่น บัญชีภายใต้กฎ EU ที่ 1:30 เทียบกับบัญชีต่างประเทศที่ 1:1000) มาร์จิ้นที่ต้องใช้จะต่างกันหลายสิบเท่า นอกจากนี้ บางโบรกเกอร์ลดเลเวอเรจในช่วงวันหยุดสุดสัปดาห์หรือรอบตัวเลขเศรษฐกิจสำคัญ (เช่น XM จำกัดเลเวอเรจเหลือ 200:1 ในวันหยุดสุดสัปดาห์) ทำให้มาร์จิ้นที่ต้องใช้เพิ่มขึ้นกะทันหันขณะถือโพซิชันอยู่ นอกจากนี้ทองคำและคริปโตบางครั้งมีเพดานเลเวอเรจที่กำหนดแยกตามสัญลักษณ์ด้วย

วิธีแก้ไข:

  1. ตรวจสอบเลเวอเรจของบัญชี (หน้าสมาชิกของโบรกเกอร์ หรือข้อมูลบัญชีใน MT5)
  2. ตรวจสอบ "อัตรามาร์จิ้น" ในสเปกของสัญลักษณ์ (บางสินค้าอาจต่ำกว่าปกติ)
  3. ใช้การตั้งค่าที่ไม่ถือข้ามวันหยุดสุดสัปดาห์ (เช่น CloseAllBeforeWeekend=true) หรือเปลี่ยนไปใช้โบรกเกอร์ที่ไม่มีการจำกัดเลเวอเรจช่วงวันหยุดสุดสัปดาห์
  4. เปลี่ยนไปใช้บัญชีเลเวอเรจสูง หรือลดขนาดล็อต

④ มาร์จิ้นถูกกันไว้จากโพซิชันที่มีอยู่เดิม

อาการ: โพซิชันแรกเปิดได้ แต่พอเปิดโพซิชันที่สองเป็นต้นไป หรือเพิ่มไม้ (Martingale) แล้วเกิด ERR_NO_MONEY

สาเหตุ: โพซิชันที่ถืออยู่แล้วกันมาร์จิ้นไว้ ทำให้ Free Margin ต่ำกว่าจำนวนที่ต้องใช้สำหรับโพซิชันใหม่ มักเกิดขึ้นเมื่อรันหลายคู่เงินหรือหลาย EA ในบัญชีเดียวกัน

วิธีแก้ไข:

  1. ตรวจสอบมาร์จิ้นที่ใช้อยู่ (Margin) และ Free Margin ในแท็บ "Trade"
  2. ตรวจสอบว่า EA แต่ละตัวแย่งใช้มาร์จิ้นในบัญชีเดียวกันหรือไม่ (กรณีรันหลาย EA)
  3. จำกัดจำนวนโพซิชันที่เปิดพร้อมกันผ่านพารามิเตอร์ของ EA
  4. EA แบบ Martingale/Grid จะใช้มาร์จิ้นมากขึ้นอย่างรวดเร็วเมื่อจำนวนขั้นลึกขึ้น → ควรทบทวนการจำกัดจำนวนขั้น อัตราคูณล็อต และการตั้งค่าปิดฉุกเฉิน

⑤ นับโบนัส/เครดิตรวมเป็นมาร์จิ้น

อาการ: ถ้ารวม "ยอดเงินคงเหลือ + โบนัส" แล้วน่าจะเพียงพอ แต่กลับเกิด ERR_NO_MONEY

สาเหตุ: บางโบรกเกอร์มีการตั้งค่าที่เครดิต (โบนัส) ไม่ถูกนับรวม หรือถูกนับรวมเพียงบางส่วน ในการคำนวณมาร์จิ้น ทำให้ยอดเงินคงเหลือที่แสดงกับมาร์จิ้นที่เซิร์ฟเวอร์ใช้จริงไม่ตรงกัน

วิธีแก้ไข: ตรวจสอบเงื่อนไขโบนัสของโบรกเกอร์ว่า "เครดิตถูกนับรวมเป็นมาร์จิ้นหรือไม่" หากไม่ถูกนับรวม ให้ลดขนาดล็อตให้พอดีกับมาร์จิ้นที่ต้องใช้โดยคำนวณจากยอดเงินฝากจริงเท่านั้น


⑥ ขนาดสัญญาต่างกันตามประเภทบัญชี (Standard เทียบกับ Cent/Micro)

อาการ: เป็น "0.01 ล็อต" เหมือนกัน แต่พอเปลี่ยนบัญชีกลับเกิด ERR_NO_MONEY ทันที หรือในทางกลับกันกลายเป็นล็อตที่ใหญ่เกินไป

สาเหตุ: บัญชี Cent (Micro) กับบัญชี Standard มีขนาดสัญญาต่างกันประมาณ 100 เท่า 0.01 ในบัญชี Cent มี exposure จริงประมาณ 1/100 หาก EA ใช้ล็อตคงที่โดยไม่แยกแยะประเภทบัญชี จะทำให้มาร์จิ้นไม่พอในบัญชีฝั่งใดฝั่งหนึ่ง

วิธีแก้ไข:

  1. หากต้องการเทรดด้วยเงินทุนน้อยและปลอดภัย ให้ใช้ บัญชี Cent/Micro เพื่อไม่ให้เกิดความเสี่ยงเกินตัวแม้จะใช้ล็อตขั้นต่ำ
  2. ออกแบบ EA ไม่ให้ฮาร์ดโค้ดประเภทบัญชี แต่ให้ใช้ OrderCalcMargin() เพื่อคำนวณมาร์จิ้นที่ต้องใช้จริงแล้วกำหนดขนาดล็อต (ดูหัวข้อถัดไป)

ข้อควรระวังตามโบรกเกอร์

โบรกเกอร์ลักษณะเด่นความถี่ในการเกิด ERR_NO_MONEY
XMมีการจำกัดเลเวอเรจช่วงวันหยุดสุดสัปดาห์ / Stop Out 20%ปานกลาง (สูงขึ้นช่วงวันหยุดสุดสัปดาห์)
Exnessมีบัญชีเลเวอเรจไม่จำกัด / Stop Out 0%ต่ำ
HFM / FXGT เป็นต้นมีบัญชีเลเวอเรจสูงต่ำ

บัญชีเลเวอเรจไม่จำกัดของ Exness (บัญชี Pro/Raw Spread) มักจะส่งคำสั่งใหม่ผ่านได้แม้มาร์จิ้นอิสระแทบเป็นศูนย์ ทำให้ข้อผิดพลาดนี้เกิดขึ้นได้ยาก ซึ่งเข้ากันได้ดีกับ EA แบบ Martingale แต่ในทางกลับกัน Stop Out ทำงานได้ยากขึ้น จึงมี ความเสี่ยงแฝงที่ขาดทุนอาจบานปลาย ควรระมัดระวังด้วย สำหรับการเปรียบเทียบโบรกเกอร์ สามารถดูได้ที่ หน้าเปรียบเทียบโบรกเกอร์


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

การออกแบบ EA ที่ถูกต้องไม่ใช่แค่ "แก้ไข" แต่ควรเป็นการ ป้องกัน ERR_NO_MONEY ตั้งแต่ก่อนส่งคำสั่ง โดยมีหลักการคือ "คำนวณมาร์จิ้นที่ต้องใช้ก่อนส่งคำสั่ง หากไม่พอก็ไม่เปิด/ลดขนาดล็อตลง"

ตรวจสอบมาร์จิ้นที่ต้องใช้ก่อนส่งคำสั่ง

// ประตูก่อนส่งคำสั่ง: ตรวจสอบว่ามาร์จิ้นที่ต้องใช้ <= มาร์จิ้นอิสระ ก่อนเรียก OrderSend
bool HasEnoughMargin(ENUM_ORDER_TYPE type, double lots)
{
   double price = (type == ORDER_TYPE_BUY)
                  ? SymbolInfoDouble(_Symbol, SYMBOL_ASK)
                  : SymbolInfoDouble(_Symbol, SYMBOL_BID);

   double margin = 0.0;
   if(!OrderCalcMargin(type, _Symbol, lots, price, margin))
   {
      Print("OrderCalcMargin failed: ", GetLastError()); // เช่น 134
      return false;
   }
   double freeMargin = AccountInfoDouble(ACCOUNT_MARGIN_FREE);
   if(margin > freeMargin)
   {
      PrintFormat("Skip: need %.2f > free %.2f (ERR_NO_MONEY guard)", margin, freeMargin);
      return false;   // ไม่เปิดออเดอร์ = ป้องกัน ERR_NO_MONEY ล่วงหน้า
   }
   return true;
}

ปรับขนาดล็อตให้เป็นไปตามขั้นต่ำ/สเต็ปที่ถูกต้อง

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

double NormalizeLot(double lots)
{
   double minLot  = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);
   double maxLot  = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX);
   double step    = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);
   lots = MathFloor(lots / step) * step;          // ปรับให้ตรงกับสเต็ป
   lots = MathMax(minLot, MathMin(maxLot, lots)); // จำกัดค่าให้อยู่ระหว่างขั้นต่ำ-สูงสุด
   return NormalizeDouble(lots, 2);
}

ตรวจสอบ retcode ของ OrderSend ทุกครั้ง

นอกจากค่าที่ OrderSend() ส่งคืน (bool) แล้ว ควรตรวจสอบ result.retcode ด้วย เพื่อจัดการกับ 10019 (TRADE_RETCODE_NO_MONEY) แยกต่างหาก

MqlTradeRequest req; MqlTradeResult res;
ZeroMemory(req); ZeroMemory(res);
// ... สร้าง req ...
if(!OrderSend(req, res) || res.retcode != TRADE_RETCODE_DONE)
{
   if(res.retcode == TRADE_RETCODE_NO_MONEY)   // 10019
      Print("Not enough money. ต้องลดขนาดล็อตหรือฝากเงินเพิ่ม");
   else
      PrintFormat("OrderSend failed: retcode=%d, lastError=%d", res.retcode, GetLastError());
}

หากใช้ CTrade สามารถตรวจสอบได้ว่า trade.ResultRetcode() เป็น 10019 หรือไม่ หรือดูรายละเอียดจาก trade.ResultRetcodeDescription()

หยุดฉุกเฉินเมื่อระดับมาร์จิ้นต่ำ

การใส่กลไกความปลอดภัยที่หยุดเปิดออเดอร์ใหม่/ปิดทั้งหมดเมื่อระดับมาร์จิ้นต่ำกว่าเปอร์เซ็นต์ที่กำหนด จะช่วยป้องกันทั้ง ERR_NO_MONEY ที่เกิดซ้ำๆ และการล้างพอร์ตได้

double level = AccountInfoDouble(ACCOUNT_MARGIN_LEVEL); // ระดับมาร์จิ้น %
if(level > 0 && level < EmergencyMarginLevel)          // เช่น 150%
{
   // หยุดการเปิดออเดอร์ใหม่ / ปิดโพซิชันบางส่วนหากจำเป็น
}

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


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

ลำดับสิ่งที่ต้องตรวจสอบวิธีแก้ไข
🚨 ก่อนอื่นFree Margin < มาร์จิ้นที่ต้องใช้หรือไม่ฝากเงิน / ปิดโพซิชันบางส่วน / ลดล็อต
🚨 ก่อนอื่นล็อตคงที่ใหญ่เกินไปเทียบกับยอดเงินคงเหลือหรือไม่ลดเหลือ 0.01 / เปลี่ยนเป็นล็อตอัตโนมัติตามความเสี่ยง
⚠️ ถัดไปเลเวอเรจบัญชีต่ำ หรือมีการจำกัดวันหยุดสุดสัปดาห์หรือไม่เปลี่ยนบัญชีเลเวอเรจสูง / ปิดก่อนวันหยุดสุดสัปดาห์ / ลดล็อต
⚠️ ถัดไปมาร์จิ้นถูกกันจากโพซิชันเดิมหรือ EA อื่นหรือไม่จัดระเบียบโพซิชันในบัญชีเดียวกัน
✅ ตรวจสอบขนาดสัญญาต่างกันระหว่าง Cent/Standard หรือไม่ปรับล็อตให้เหมาะกับประเภทบัญชี
🛠 พัฒนาป้องกันด้วย OrderCalcMargin ก่อนส่งคำสั่งใช้โค้ดตัวอย่างข้างต้น

สรุป

  • ERR_NO_MONEY มีสองรูปแบบคือ 134 (GetLastError) และ 10019 (retcode ของ OrderSend = TRADE_RETCODE_NO_MONEY) แต่ต้นตอเดียวกันคือ "มาร์จิ้นที่ต้องใช้ > มาร์จิ้นที่ใช้ได้"
  • แม้จะมียอดเงินคงเหลือ ก็อาจเกิดขึ้นได้จาก ล็อตใหญ่เกินไป เลเวอเรจต่ำ (รวมถึงการจำกัดช่วงวันหยุดสุดสัปดาห์) การกันมาร์จิ้นจากโพซิชันเดิม หรือประเภทบัญชีไม่ตรงกัน
  • ผู้ใช้ EA ควรป้องกันด้วย "ล็อตอัตโนมัติตามเปอร์เซ็นต์ความเสี่ยง" และ "เลือกประเภทบัญชีที่เหมาะสม" ส่วนผู้พัฒนา EA ควรแก้ไขถาวรด้วย "ประตูตรวจสอบ OrderCalcMargin ก่อนส่งคำสั่ง" "การปรับขนาดล็อตให้ถูกต้อง" และ "การจัดการ retcode 10019"

สำหรับรหัสข้อผิดพลาดทั้งหมด ดูได้ที่ คู่มือรวมวิธีแก้ไขรหัสข้อผิดพลาด MQL5 / MT5 และสำหรับ EA ฟรีที่ใช้งานได้โดยไม่ฝืนเงินทุน ดูได้ที่ รายการ EA หากกำลังใช้ EA ของเว็บไซต์นี้อยู่และแก้ไขการตั้งค่าแล้วยังไม่หาย กรุณาแนบภาพหน้าจอสถานะมาร์จิ้นของบัญชีมาติดต่อผ่านแบบฟอร์มซัพพอร์ต


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

ถาม: มียอดเงินคงเหลือเพียงพอ แต่ยังเกิด ERR_NO_MONEY เพราะอะไร?

เนื่องจากการตัดสินใช้ มาร์จิ้นอิสระ (Free Margin) ไม่ใช่ยอดเงินคงเหลือ (Balance) หาก Free Margin ลดลงจากขาดทุนลอยหรือการกันมาร์จิ้นจากโพซิชันเดิม แม้จะมียอดเงินคงเหลืออยู่ก็ไม่สามารถเปิดโพซิชันใหม่ได้ กรุณาตรวจสอบ Free Margin ในแท็บ "Trade"

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

134 (ERR_NO_MONEY) เป็นข้อผิดพลาดขณะรันที่ GetLastError() ส่งคืน ส่วน 10019 (TRADE_RETCODE_NO_MONEY) เป็นผลลัพธ์ (retcode) ของ OrderSend() ต่างกันแค่จุดที่เกิด แต่สาเหตุ (เงินทุนไม่พอ) เหมือนกัน

ถาม: ไม่เกิดในการ Backtest แต่เกิดในการเทรดจริง เพราะอะไร?

เนื่องจากเลเวอเรจ ประเภทบัญชี (Cent/Standard) และโพซิชันที่มีอยู่เดิมของบัญชีจริงแตกต่างจากการตั้งค่าทดสอบ โดยเฉพาะความต่างของเลเวอเรจและขนาดสัญญามีผลอย่างมาก

ถาม: EA แบบ Martingale/Grid ยิ่งเพิ่มจำนวนขั้นยิ่งเกิด ERR_NO_MONEY ทำไม?

เป็นพฤติกรรมปกติก่อนถึงจุดวิกฤต ยิ่งจำนวนขั้นเพิ่มขึ้น การใช้มาร์จิ้นก็ยิ่งเร่งตัวขึ้น ควรลดจำนวนขั้นสูงสุดและอัตราคูณล็อต และเปิดใช้ฟังก์ชันปิดฉุกเฉินอย่าง UseMarginEmergencyClose เสมอ พร้อมใช้เงินทุนที่รับความเสี่ยงจากการสูญเสียได้

ถาม: สามารถป้องกันด้วยโค้ด EA โดยอัตโนมัติได้หรือไม่?

ได้ โดยคำนวณมาร์จิ้นที่ต้องใช้ด้วย OrderCalcMargin() ก่อนส่งคำสั่ง แล้วใส่เงื่อนไขว่าหากเกิน AccountInfoDouble(ACCOUNT_MARGIN_FREE) ก็ไม่เปิดออเดอร์ (หรือลดขนาดล็อตลง) ดูตัวอย่างโค้ดในเนื้อหาด้านบน

ถาม: เริ่มต้นด้วยเงินทุนขั้นต่ำเท่าไหร่จึงจะไม่ฝืนเกินไป?

เกณฑ์ที่ไม่ฝืนคือบัญชี Standard เงินทุน 100,000 เยน (≈$670) เริ่มต้นด้วยล็อตขั้นต่ำ 0.01 หากมีเงินทุนน้อยกว่านี้หรือต้องการเทรดด้วยความปลอดภัยที่สูงกว่า การใช้บัญชี Cent (Micro) จะทำให้ exposure จริงเล็กลงแม้ใช้ล็อตขั้นต่ำ ช่วยหลีกเลี่ยง ERR_NO_MONEY ได้ง่ายขึ้น

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

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

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

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