MT5 "Not enough money" (10019/134): 6 สาเหตุและวิธีแก้
สารบัญ
แก้ปัญหา 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
ตรวจสอบเบื้องต้นภายใน 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 ล็อต) สูตรคร่าวๆ มีดังนี้
มาร์จิ้นที่ต้องใช้ ≈ (ล็อต × ขนาดสัญญา × ราคา) / เลเวอเรจ
เปรียบเทียบโบรกเกอร์แนะนำ →
🎁 ดาวน์โหลด EA ฟรี📧 คอร์สอีเมลฟรี (8 ฉบับ) + แพ็กอินดิเคเตอร์ MT5 13 ตัว เฉพาะสมาชิก
* ปกป้องความเป็นส่วนตัวอย่างเคร่งครัด คุณสามารถยกเลิกการสมัครได้ตลอดเวลา
ERR_NO_MONEY คืออะไร (MT5 คือ 10019, MT4 คือ 134)
ERR_NO_MONEY เป็นชื่อเรียกย่อที่ใช้กันทั่วไป ไม่ใช่ค่าคงที่อย่างเป็นทางการ เอกสารอ้างอิงของ MQL5 และ MQL4 ต่างก็ไม่ได้นิยามชื่อนี้ไว้ ชื่อและหมายเลขอย่างเป็นทางการขึ้นอยู่กับแพลตฟอร์ม (MQL5: รหัสตอบกลับของเซิร์ฟเวอร์เทรด, MQL4: รหัสข้อผิดพลาด)
① MT5: TRADE_RETCODE_NO_MONEY = 10019 (รหัสตอบกลับของเซิร์ฟเวอร์เทรด)
ใน MQL5 ผลลัพธ์ของ OrderSend() จะอยู่ใน MqlTradeResult.retcode เมื่อเซิร์ฟเวอร์ปฏิเสธคำสั่งเพราะเงินไม่พอ รหัสคือ 10019 (TRADE_RETCODE_NO_MONEY) ซึ่งเป็นการแจ้งปฏิเสธจากเซิร์ฟเวอร์ของโบรกเกอร์ ส่วน OrderCheck() จะตรวจสอบเงินก่อนส่งคำสั่ง และใส่ผลลัพธ์ไว้ใน MqlTradeCheckResult.retcode
ความหมาย: เงินทุนไม่เพียงพอสำหรับการดำเนินคำสั่ง (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
② MT4: ERR_NOT_ENOUGH_MONEY = 134 (GetLastError() ใน MQL4)
134 เป็นหมายเลขของ MT4 (MQL4) รายการ runtime error ของ MQL5 ที่ GetLastError() ส่งกลับไม่มีทั้ง 134 และไม่มีรหัสใดที่หมายถึงเงินไม่พอ ใน MT5 ให้ดูที่ retcode
ความหมาย: เงินทุนไม่พอสำหรับการดำเนินการซื้อขาย (not enough money)
ค่าคงที่: ERR_NOT_ENOUGH_MONEY
ค่า : 134 (MT4)
แนวทางการแยกใช้งานจริง:
| แหล่งที่มา | ค่า | เกิดขึ้นเมื่อ |
|---|---|---|
MqlTradeResult.retcode (MT5) | 10019 (TRADE_RETCODE_NO_MONEY) | OrderSend ถูกเซิร์ฟเวอร์ปฏิเสธ |
CTrade.ResultRetcode() (MT5) | 10019 | การส่งคำสั่งผ่าน CTrade ถูกปฏิเสธ |
GetLastError() (MT4) | 134 (ERR_NOT_ENOUGH_MONEY) | OrderSend (MT4 / MQL4) |
ถ้าใน log ขึ้น «10019» หรือ not enough money แสดงว่าเซิร์ฟเวอร์เทรดของ MT5 ปฏิเสธคำสั่ง ส่วน «134» มาจากเทอร์มินัลหรือ EA ของ MT4 สาเหตุหลักเหมือนกัน (มาร์จิ้นที่ต้องใช้ > มาร์จิ้นที่ใช้ได้) วิธีแก้จึงเหมือนกัน
สาเหตุและวิธีแก้ไข (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());
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 ก่อนส่งคำสั่ง | ใช้โค้ดตัวอย่างข้างต้น |
สรุป
- ใน MT5 เงินไม่พอคือ 10019 (TRADE_RETCODE_NO_MONEY) ส่วน 134 (ERR_NOT_ENOUGH_MONEY) เป็นหมายเลขของ MT4 และ
ERR_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 ต่างกันอย่างไร?
10019 (TRADE_RETCODE_NO_MONEY) คือรหัสตอบกลับของเซิร์ฟเวอร์เทรด MT5 ที่อยู่ในผลลัพธ์ของ OrderSend() ส่วน 134 (ERR_NOT_ENOUGH_MONEY) คือข้อผิดพลาดของ MT4 ที่ GetLastError() ส่งกลับ ต่างกันแค่แพลตฟอร์ม สาเหตุ (เงินไม่พอ) เหมือนกัน
ถาม: ไม่เกิดในการ 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 ได้ง่ายขึ้น
บทความที่เกี่ยวข้อง
📧 คอร์สอีเมลฟรี (8 ฉบับ) + แพ็กอินดิเคเตอร์ MT5 13 ตัว เฉพาะสมาชิก
* ปกป้องความเป็นส่วนตัวอย่างเคร่งครัด คุณสามารถยกเลิกการสมัครได้ตลอดเวลา
มีคำถามเกี่ยวกับ EA หรือ Forex ไหม?
คุณสามารถตั้งคำถามได้ที่ฟอรัมเทรดของ Nattzy (สมัครฟรี) ไม่จำเป็นต้องเกี่ยวกับบทความนี้ก็ได้ เช่น การตั้งค่า EA หรือการเลือกโบรกเกอร์
ถามที่ Nattzy ↗