MT5 "Not enough money" (134/10019): 7 สาเหตุและวิธีแก้
สารบัญ
- ERR_NO_MONEY คืออะไร (ความแตกต่างระหว่าง 134 กับ 10019)
- ① ERR_NO_MONEY = 134 (รหัสข้อผิดพลาดขณะรันจาก `GetLastError()`)
- ② TRADE_RETCODE_NO_MONEY = 10019 (รหัสคืนค่าของ `OrderSend()`)
- ตรวจสอบเบื้องต้นภายใน 30 วินาที
- สาเหตุและวิธีแก้ไข (6 รูปแบบ)
- ① เงินทุนไม่เพียงพอจริงๆ
- ② ล็อตใหญ่เกินไป (เมื่อเทียบกับยอดเงินคงเหลือ)
- ③ เลเวอเรจต่ำ หรือถูกจำกัดช่วงวันหยุดสุดสัปดาห์/ข่าวสำคัญ
- ④ มาร์จิ้นถูกกันไว้จากโพซิชันที่มีอยู่เดิม
- ⑤ นับโบนัส/เครดิตรวมเป็นมาร์จิ้น
- ⑥ ขนาดสัญญาต่างกันตามประเภทบัญชี (Standard เทียบกับ Cent/Micro)
- ข้อควรระวังตามโบรกเกอร์
- โค้ด MQL5 สำหรับป้องกันข้อผิดพลาดนี้ (สำหรับนักพัฒนา EA)
- ตรวจสอบมาร์จิ้นที่ต้องใช้ก่อนส่งคำสั่ง
- ปรับขนาดล็อตให้เป็นไปตามขั้นต่ำ/สเต็ปที่ถูกต้อง
- ตรวจสอบ retcode ของ OrderSend ทุกครั้ง
- หยุดฉุกเฉินเมื่อระดับมาร์จิ้นต่ำ
- รายการตรวจสอบตามลำดับความสำคัญ
- สรุป
- คำถามที่พบบ่อย
- ถาม: มียอดเงินคงเหลือเพียงพอ แต่ยังเกิด ERR_NO_MONEY เพราะอะไร?
- ถาม: 134 กับ 10019 ต่างกันอย่างไร?
- ถาม: ไม่เกิดในการ Backtest แต่เกิดในการเทรดจริง เพราะอะไร?
- ถาม: EA แบบ Martingale/Grid ยิ่งเพิ่มจำนวนขั้นยิ่งเกิด ERR_NO_MONEY ทำไม?
- ถาม: สามารถป้องกันด้วยโค้ด EA โดยอัตโนมัติได้หรือไม่?
- ถาม: เริ่มต้นด้วยเงินทุนขั้นต่ำเท่าไหร่จึงจะไม่ฝืนเกินไป?
แก้ปัญหา 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.retcode | 10019 (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 ลึกหลายขั้น
วิธีแก้ไข:
- ฝากเงินเพิ่ม หรือ
- ปิดโพซิชันที่ถืออยู่บางส่วนด้วยตนเองเพื่อดึงมาร์จิ้นกลับคืน
- ลดค่า
RiskPercentของ EA เพื่อลดขนาดล็อตในครั้งต่อไป
หาก EA เกิดปัญหานี้ซ้ำๆ แสดงว่าขนาดล็อตใหญ่เกินไปเมื่อเทียบกับเงินทุน ให้ดูข้อ ② ต่อไป
② ล็อตใหญ่เกินไป (เมื่อเทียบกับยอดเงินคงเหลือ)
อาการ: มียอดเงินคงเหลืออยู่ แต่เกิด ERR_NO_MONEY ตั้งแต่คำสั่งแรก พบบ่อยในการใช้ล็อตคงที่
สาเหตุ: FixedLot ไม่สอดคล้องกับยอดเงินคงเหลือและเลเวอเรจของบัญชี เช่น บัญชีที่มีเงิน 100,000 เยน (≈$670) หากพยายามเปิด XAUUSD 0.1 ล็อต มาร์จิ้นที่ต้องใช้อาจเกินยอดเงินคงเหลือขึ้นอยู่กับเลเวอเรจ
วิธีแก้ไข:
- ลดล็อตคงที่ลงเหลือค่าต่ำสุด (0.01) แล้วดูว่าเปิดได้หรือไม่
- เปลี่ยนไปใช้การคำนวณล็อตอัตโนมัติตามเปอร์เซ็นต์ความเสี่ยง (
UseFixedLot=false/RiskPercent) - หากยังเปิด 0.01 ไม่ได้ แสดงว่าเลเวอเรจหรือเงินทุนของบัญชีไม่เพียงพอ → ไปดูข้อ ③ หรือ ⑥
เกณฑ์อ้างอิง: การออกแบบให้เริ่มต้นได้จาก บัญชี Standard เงินทุน 100,000 เยน (≈$670) ด้วยล็อตขั้นต่ำ 0.01 เป็นมาตรฐานที่ไม่ฝืนเกินไป หากมีเงินทุนน้อยกว่านี้หรือต้องการเทรดด้วยความเสี่ยงที่ต่ำและปลอดภัยกว่า ควรพิจารณา "บัญชี Micro (Cent)" ที่จะกล่าวถึงถัดไป
③ เลเวอเรจต่ำ หรือถูกจำกัดช่วงวันหยุดสุดสัปดาห์/ข่าวสำคัญ
อาการ: EA และขนาดล็อตเดียวกัน เปิดได้ในบัญชีอื่นแต่เกิด ERR_NO_MONEY เฉพาะบัญชีนี้ หรือข้อผิดพลาดเกิดขึ้นกระจุกตัวช่วงเย็นวันศุกร์ถึงเช้าวันจันทร์
สาเหตุ: หากเลเวอเรจของบัญชีต่ำ (เช่น บัญชีภายใต้กฎ EU ที่ 1:30 เทียบกับบัญชีต่างประเทศที่ 1:1000) มาร์จิ้นที่ต้องใช้จะต่างกันหลายสิบเท่า นอกจากนี้ บางโบรกเกอร์ลดเลเวอเรจในช่วงวันหยุดสุดสัปดาห์หรือรอบตัวเลขเศรษฐกิจสำคัญ (เช่น XM จำกัดเลเวอเรจเหลือ 200:1 ในวันหยุดสุดสัปดาห์) ทำให้มาร์จิ้นที่ต้องใช้เพิ่มขึ้นกะทันหันขณะถือโพซิชันอยู่ นอกจากนี้ทองคำและคริปโตบางครั้งมีเพดานเลเวอเรจที่กำหนดแยกตามสัญลักษณ์ด้วย
วิธีแก้ไข:
- ตรวจสอบเลเวอเรจของบัญชี (หน้าสมาชิกของโบรกเกอร์ หรือข้อมูลบัญชีใน MT5)
- ตรวจสอบ "อัตรามาร์จิ้น" ในสเปกของสัญลักษณ์ (บางสินค้าอาจต่ำกว่าปกติ)
- ใช้การตั้งค่าที่ไม่ถือข้ามวันหยุดสุดสัปดาห์ (เช่น
CloseAllBeforeWeekend=true) หรือเปลี่ยนไปใช้โบรกเกอร์ที่ไม่มีการจำกัดเลเวอเรจช่วงวันหยุดสุดสัปดาห์ - เปลี่ยนไปใช้บัญชีเลเวอเรจสูง หรือลดขนาดล็อต
④ มาร์จิ้นถูกกันไว้จากโพซิชันที่มีอยู่เดิม
อาการ: โพซิชันแรกเปิดได้ แต่พอเปิดโพซิชันที่สองเป็นต้นไป หรือเพิ่มไม้ (Martingale) แล้วเกิด ERR_NO_MONEY
สาเหตุ: โพซิชันที่ถืออยู่แล้วกันมาร์จิ้นไว้ ทำให้ Free Margin ต่ำกว่าจำนวนที่ต้องใช้สำหรับโพซิชันใหม่ มักเกิดขึ้นเมื่อรันหลายคู่เงินหรือหลาย EA ในบัญชีเดียวกัน
วิธีแก้ไข:
- ตรวจสอบมาร์จิ้นที่ใช้อยู่ (Margin) และ Free Margin ในแท็บ "Trade"
- ตรวจสอบว่า EA แต่ละตัวแย่งใช้มาร์จิ้นในบัญชีเดียวกันหรือไม่ (กรณีรันหลาย EA)
- จำกัดจำนวนโพซิชันที่เปิดพร้อมกันผ่านพารามิเตอร์ของ EA
- 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 ใช้ล็อตคงที่โดยไม่แยกแยะประเภทบัญชี จะทำให้มาร์จิ้นไม่พอในบัญชีฝั่งใดฝั่งหนึ่ง
วิธีแก้ไข:
- หากต้องการเทรดด้วยเงินทุนน้อยและปลอดภัย ให้ใช้ บัญชี Cent/Micro เพื่อไม่ให้เกิดความเสี่ยงเกินตัวแม้จะใช้ล็อตขั้นต่ำ
- ออกแบบ 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 ทั้งหมดจำหน่ายในราคาเปิดตัวและจะปรับขึ้นเป็นขั้นตามยอดขาย รับการแจ้งเตือนก่อนการขึ้นราคาแต่ละครั้ง พร้อมอีเมลรายวันเกี่ยวกับการเทรดอัตโนมัติ การอ่านแบ็กเทสต์ และการเลือกโบรกเกอร์
* ปกป้องความเป็นส่วนตัวอย่างเคร่งครัด คุณสามารถยกเลิกการสมัครได้ตลอดเวลา