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

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

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

เผยแพร่: 2026-06-12เวลาอ่าน: ประมาณ 3 นาที
⏱ บทความนี้สะท้อนข้อมูล ณ วันที่เผยแพร่ ตัวเลขผลงาน EA (PF, DD, ผลตอบแทนต่อปี) เปลี่ยนแปลงตามการเทรดจริงและการตรวจสอบซ้ำ — ตรวจสอบล่าสุดได้ที่หน้า EA ดูผลงานล่าสุดของ 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


ตรวจสอบเบื้องต้นภายใน 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 ลึกหลายขั้น

วิธีแก้ไข:

  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());
      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 ↗

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