หน้าหลัก > บล็อก > แก้ Unsupported filling mode (MT5 10030)

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

แก้ Unsupported filling mode (MT5 10030)

เผยแพร่: 2026-07-07เวลาอ่าน: ประมาณ 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. 10030 (TRADE_RETCODE_INVALID_FILL) คืออะไร
  2. วิธีจับคู่คำสั่ง (type_filling) ทั้ง 4 แบบ
  3. ทำไมถึงกลายเป็น "ไม่ถูกต้อง" — SYMBOL_FILLING_MODE
  4. ทำไมถึงเกิดขึ้น "วันที่เปลี่ยนโบรกเกอร์"
  5. ความสัมพันธ์กับโหมดการดำเนินการ (SYMBOL_TRADE_EXEMODE)
  6. วิธีตรวจสอบเบื้องต้นใน 30 วินาที
  7. ① ดูวิธีจับคู่คำสั่งที่โบรกเกอร์อนุญาตสำหรับสัญลักษณ์นั้น (หน้าจอ MT5)
  8. ② ตรวจสอบพารามิเตอร์อินพุตของ EA
  9. ③ ตรวจสอบด้วยโค้ด (สำหรับนักพัฒนา)
  10. วิธีแก้ปัญหาถาวร — โค้ด MQL5 ที่เลือกโหมดอัตโนมัติจากแฟล็กที่ได้รับอนุญาต
  11. ฟังก์ชันเลือกโหมดอัตโนมัติ
  12. วิธีใช้งานกับ OrderSend
  13. กรณีที่ใช้ CTrade
  14. ข้อควรระวังเมื่อใช้คำสั่ง Limit (BOC)
  15. ข้อควรระวังเกี่ยวกับโบรกเกอร์ (ตรวจสอบซ้ำเมื่อย้าย)
  16. รายการตรวจสอบตามลำดับความสำคัญ
  17. สรุป
  18. คำถามที่พบบ่อย (FAQ)
  19. ถาม: EA ที่ใช้งานได้ปกติเมื่อวาน พอเปลี่ยนโบรกเกอร์แล้วเกิด 10030 จนส่งออเดอร์ไม่ได้เลย EA เสียหรือไม่?
  20. ถาม: ควรใช้ FOK หรือ IOC ดี?
  21. ถาม: ไม่เกิด 10030 ตอนทดสอบย้อนหลัง แต่เกิดขึ้นในบัญชีจริง เพราะอะไร?
  22. ถาม: โบรกเกอร์เดียวกัน แต่บางสัญลักษณ์เกิด 10030 บางสัญลักษณ์ไม่เกิด เพราะอะไร?
  23. ถาม: แก้โค้ด EA ไม่ได้ (มีแค่ไฟล์ .ex5) ควรทำอย่างไร?

แก้ปัญหา Unsupported filling mode (ข้อผิดพลาด MT5 10030) แบบเบ็ดเสร็จ

EA ที่เมื่อวานยังทำงานปกติกับโบรกเกอร์เดิม พอย้ายไปบัญชีใหม่กลับขึ้น Unsupported filling mode หรือ OrderSend error 10030 เต็มแท็บ Expert จน ส่งออเดอร์ไม่ได้แม้แต่รายการเดียว — นี่คือปัญหาคลาสสิกที่พบบ่อยที่สุดเมื่อย้ายโบรกเกอร์ในการใช้งาน EA บน MT5 ไม่ใช่เพราะ EA พังหรือบัญชีมีปัญหา แต่เป็นเพราะ รูปแบบการส่งคำสั่ง "วิธีจับคู่คำสั่ง (filling mode)" ที่ EA กำหนดไว้ ไม่ได้รับอนุญาตสำหรับสัญลักษณ์นั้นในโบรกเกอร์ใหม่ เท่านั้นเอง

บทความนี้เขียนขึ้นสำหรับทั้งผู้ใช้ EA บน MT5 และผู้พัฒนา EA ด้วย MQL5 โดยรวบรวมทุกอย่างเกี่ยวกับ TRADE_RETCODE_INVALID_FILL (10030) ไว้ในที่เดียว ตั้งแต่ ความหมายที่แท้จริง ความหมายของ FOK/IOC/RETURN วิธีตรวจสอบใน 30 วินาที ไปจนถึงวิธีแก้ปัญหาถาวรในโค้ด สำหรับรายการข้อผิดพลาดทั้งหมด สามารถดูได้ที่ คู่มือรวมวิธีแก้ปัญหารหัสข้อผิดพลาด MQL5 / MT5

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


10030 (TRADE_RETCODE_INVALID_FILL) คืออะไร

ผลลัพธ์ของ OrderSend() จะถูกส่งกลับมาใน MqlTradeResult.retcode โดยค่า 10030 = TRADE_RETCODE_INVALID_FILL ที่ปรากฏขึ้นคือ การปฏิเสธจากฝั่งเซิร์ฟเวอร์ ที่แจ้งว่า "type_filling (วิธีจับคู่คำสั่ง) ที่ระบุมาในคำขอ ไม่ได้รับอนุญาตสำหรับสัญลักษณ์นี้"

ความหมาย: ประเภทการจับคู่คำสั่ง (filling type) ที่ระบุไม่รองรับ
ค่าคงที่ : TRADE_RETCODE_INVALID_FILL
ค่า      : 10030
ข้อความ  : Unsupported filling mode / Invalid order filling type
// ตัวอย่าง log ที่พบได้ทั่วไป
2026.07.07 09:15:32.441 EA_NAME EURUSD,M15: OrderSend error 10030
2026.07.07 09:15:32.441 EA_NAME EURUSD,M15: failed market buy 0.10 EURUSD [Unsupported filling mode]

ประเด็นสำคัญคือ เรื่องนี้ไม่เกี่ยวข้องกับเงินทุน ล็อต หรือราคาใดๆ ทั้งสิ้น 10030 เป็นปัญหาที่เกิดจากฟิลด์ MqlTradeRequest.type_filling เพียงจุดเดียวเท่านั้น เมื่อแก้ตรงนี้ คำสั่งเดิมจะสามารถส่งผ่านได้ทันที

วิธีจับคู่คำสั่ง (type_filling) ทั้ง 4 แบบ

ใน MQL5 ประเภท ENUM_ORDER_TYPE_FILLING มีค่าอยู่ 4 แบบ

ค่าคงที่ชื่อเรียกทั่วไปความหมาย
ORDER_FILLING_FOKFill or Killดำเนินการเฉพาะเมื่อสามารถจับคู่ได้ เต็มจำนวน เท่านั้น หากส่งคำสั่ง 1 ล็อตแต่มีสภาพคล่องรองรับได้เพียง 0.7 ล็อต จะยกเลิกทั้งคำสั่ง
ORDER_FILLING_IOCImmediate or Cancelดำเนินการทันที เท่าที่จับคู่ได้ ส่วนที่เหลือ จะถูกยกเลิก เช่น จับคู่ได้ 0.7 ล็อต ส่วนอีก 0.3 ล็อตจะหายไป
ORDER_FILLING_RETURNReturnดำเนินการในส่วนที่จับคู่ได้ ส่วนที่เหลือ จะถูกวางเป็นคำสั่งค้างในตลาด (รอจับคู่เพิ่มภายหลัง) ใช้ในการดำเนินการแบบตลาดหลักทรัพย์
ORDER_FILLING_BOCBook or Cancelรับคำสั่งเฉพาะกรณีที่ เข้าไปรออยู่ในบุ๊ก (แบบ passive) เท่านั้น หากราคาที่ระบุจะทำให้จับคู่ได้ทันทีจะถูกปฏิเสธ ใช้ได้เฉพาะคำสั่ง limit/stop-limit เท่านั้น (เพิ่มเข้ามาใน build รุ่นใหม่ๆ)

สำหรับ EA เทรด Forex ทั่วไป ที่ใช้จริงมีแทบจะแค่ FOK หรือ IOC เท่านั้น ส่วน RETURN จะมีความหมายในการดำเนินการแบบตลาดหลักทรัพย์ (Exchange execution) เช่น หุ้นหรือฟิวเจอร์ส และ BOC เป็นการใช้งานเฉพาะทางสำหรับต้องการบังคับให้เป็นคำสั่งแบบ maker เท่านั้น

ทำไมถึงกลายเป็น "ไม่ถูกต้อง" — SYMBOL_FILLING_MODE

วิธีจับคู่คำสั่งแบบใดที่จะได้รับอนุญาต ขึ้นอยู่กับ แฟล็กที่โบรกเกอร์กำหนดไว้สำหรับแต่ละสัญลักษณ์ (SYMBOL_FILLING_MODE) ซึ่งสามารถอ่านค่าได้จาก MQL5 ดังนี้

long flags = SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE);
// ถ้ามีแฟล็ก SYMBOL_FILLING_FOK จะใช้ FOK ได้
// ถ้ามีแฟล็ก SYMBOL_FILLING_IOC จะใช้ IOC ได้

SYMBOL_FILLING_MODE เป็นบิตแฟล็กที่บอก สถานะการอนุญาตของ FOK และ IOC (หากอนุญาตทั้งคู่ จะมีแฟล็กทั้งสองตัวติดขึ้น) ส่วน RETURN ไม่ได้รวมอยู่ในแฟล็กนี้ แต่ขึ้นอยู่กับโหมดการดำเนินการของสัญลักษณ์ (อธิบายด้านล่าง)

สรุปแล้วโครงสร้างของปัญหา 10030 นั้นเรียบง่ายมาก

type_filling ที่ EA ส่งมา ∉ วิธีจับคู่คำสั่งที่ได้รับอนุญาตสำหรับสัญลักษณ์นั้น → 10030

เท่านี้เอง


ทำไมถึงเกิดขึ้น "วันที่เปลี่ยนโบรกเกอร์"

เหตุผลที่ 10030 ถูกเรียกว่าเป็น "ข้อผิดพลาดคลาสสิกของการย้ายโบรกเกอร์" มีดังนี้

  1. วิธีจับคู่คำสั่งที่ได้รับอนุญาตแตกต่างกันไปตามโบรกเกอร์และตามสัญลักษณ์ โบรกเกอร์บางแห่งอนุญาตเฉพาะ FOK สำหรับสัญลักษณ์ Forex บางแห่งอนุญาตเฉพาะ IOC และบางแห่งอนุญาตทั้งสองแบบ แม้แต่ในโบรกเกอร์เดียวกัน การตั้งค่าของ Forex กับ CFD หรือหุ้นก็มักจะต่างกันด้วย
  2. EA จำนวนมากเขียน type_filling แบบตายตัว (hardcode) ตัวอย่างเช่น EA ที่เขียนว่า request.type_filling = ORDER_FILLING_FOK; จะทำงานได้ตลอดหลายปีบนโบรกเกอร์ A ที่อนุญาต FOK เพราะทำงานได้บนสภาพแวดล้อมของผู้พัฒนา จึงไม่ถูกมองว่าเป็นบั๊กและถูกเผยแพร่ออกไป
  3. หากโบรกเกอร์ B ที่ย้ายไปไม่อนุญาต FOK ออเดอร์แรกก็จะล้มเหลวทั้งหมดทันที และมักไม่ปรากฏในการทดสอบย้อนหลัง (พฤติกรรมของ Strategy Tester มักผ่อนปรนกว่าเซิร์ฟเวอร์จริง) ทำให้ปัญหาปรากฏชัดเจนเฉพาะ "วันที่ย้ายไปใช้บัญชีจริง" เท่านั้น

กล่าวอีกนัยหนึ่ง 10030 ไม่ใช่บั๊กของ EA แต่เป็นการเปิดเผยว่า EA มีการตั้งสมมติฐานผูกติดกับสภาพแวดล้อมเดิม มองในมุมกลับกัน หากแก้ให้ EA อ่านแฟล็กที่อนุญาตของสัญลักษณ์แล้วเลือกวิธีจับคู่คำสั่งแบบไดนามิก ก็จะกลายเป็น EA ที่ทำงานได้กับทุกโบรกเกอร์ (ดูโค้ดด้านล่าง)

ความสัมพันธ์กับโหมดการดำเนินการ (SYMBOL_TRADE_EXEMODE)

นอกจากวิธีจับคู่คำสั่งแล้ว แต่ละสัญลักษณ์ยังมี โหมดการดำเนินการ (execution mode) ซึ่งมีผลต่อว่าวิธีจับคู่คำสั่งแบบใดจะมีความหมาย

โหมดการดำเนินการค่าคงที่ตัวอย่างทั่วไปแนวโน้มของวิธีจับคู่คำสั่ง
InstantSYMBOL_TRADE_EXECUTION_INSTANTForex บางส่วน (มักพบในระบบ DD)ดำเนินการที่ราคาที่ระบุ อยู่ในโลกของ FOK/IOC และ requote
MarketSYMBOL_TRADE_EXECUTION_MARKETForex/CFD ส่วนใหญ่ (ระบบ NDD)ดำเนินการแบบ market FOK หรือ IOC (ขึ้นอยู่กับการตั้งค่าโบรกเกอร์)
ExchangeSYMBOL_TRADE_EXECUTION_EXCHANGEหุ้น ฟิวเจอร์สดำเนินการผ่านบุ๊กคำสั่ง โดยทั่วไปใช้ RETURN
RequestSYMBOL_TRADE_EXECUTION_REQUESTระบบเก่าดำเนินการแบบ request (ปัจจุบันพบน้อย)

การผสมผสานที่ได้รับอนุญาตอย่างเคร่งครัดนั้นขึ้นอยู่กับการตั้งค่าเซิร์ฟเวอร์ของแต่ละโบรกเกอร์ แต่ในทางปฏิบัติ จำง่ายๆ ว่า "Forex/CFD ที่เป็น Market execution ใช้ FOK หรือ IOC ส่วนแบบตลาดหลักทรัพย์ใช้ RETURN" ก็เพียงพอแล้ว โหมดการดำเนินการสามารถตรวจสอบได้ด้วย SymbolInfoInteger(_Symbol, SYMBOL_TRADE_EXEMODE) เช่นกัน


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

① ดูวิธีจับคู่คำสั่งที่โบรกเกอร์อนุญาตสำหรับสัญลักษณ์นั้น (หน้าจอ MT5)

เปิด หน้าต่างแสดงราคา (Market Watch) → คลิกขวาที่สัญลักษณ์ → Specification (รายละเอียดสัญลักษณ์) แล้วดูแถว "Filling" (การจับคู่คำสั่ง) ซึ่งจะแสดงเป็น Fill or Kill / Immediate or Cancel หรือทั้งสองแบบ หาก EA ส่งวิธีที่ไม่ปรากฏในนี้ ก็เกิด 10030 แน่นอน

② ตรวจสอบพารามิเตอร์อินพุตของ EA

EA ที่ออกแบบมาดีมักมีอินพุตชื่อ FillingType หรือ Filling Mode หากมี เพียงแค่เปลี่ยนค่าให้ตรงกับวิธีที่ได้รับอนุญาตตามที่ตรวจสอบในข้อ ① ก็แก้ปัญหาได้ทันที (ไม่ต้องแก้โค้ด)

③ ตรวจสอบด้วยโค้ด (สำหรับนักพัฒนา)

long flags = SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE);
PrintFormat("%s filling: FOK=%s IOC=%s exemode=%d",
            _Symbol,
            ((flags & SYMBOL_FILLING_FOK) != 0) ? "yes" : "no",
            ((flags & SYMBOL_FILLING_IOC) != 0) ? "yes" : "no",
            (int)SymbolInfoInteger(_Symbol, SYMBOL_TRADE_EXEMODE));

รันโค้ดนี้เป็นสคริปต์ก็จะได้ผลลัพธ์แสดงสถานะการอนุญาตจริงของโบรกเกอร์และสัญลักษณ์นั้นในบรรทัดเดียว


วิธีแก้ปัญหาถาวร — โค้ด MQL5 ที่เลือกโหมดอัตโนมัติจากแฟล็กที่ได้รับอนุญาต

วิธีแก้ 10030 ที่ถูกต้องไม่ใช่ "ปรับด้วยมือทุกครั้งที่ย้ายโบรกเกอร์" แต่คือ ให้ EA อ่านแฟล็กที่อนุญาตของสัญลักษณ์แล้วเลือกโหมดโดยอัตโนมัติ ต่อไปนี้คือโค้ดมาตรฐานที่นำไปใช้ได้ทันที

ฟังก์ชันเลือกโหมดอัตโนมัติ

// คืนค่าวิธีจับคู่คำสั่งที่ได้รับอนุญาตจริงสำหรับสัญลักษณ์นั้น
// ลำดับความสำคัญ: FOK → IOC → RETURN (สำรองสำหรับแบบตลาดหลักทรัพย์)
ENUM_ORDER_TYPE_FILLING GetFillingMode(const string symbol)
{
   long flags = SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE);

   if((flags & SYMBOL_FILLING_FOK) != 0)
      return ORDER_FILLING_FOK;    // ดำเนินการเฉพาะเมื่อจับคู่ได้เต็มจำนวน (ไม่มีการจับคู่บางส่วน)

   if((flags & SYMBOL_FILLING_IOC) != 0)
      return ORDER_FILLING_IOC;    // ดำเนินการเท่าที่จับคู่ได้ ส่วนที่เหลือยกเลิก

   return ORDER_FILLING_RETURN;    // ไม่มีแฟล็ก = แบบตลาดหลักทรัพย์เป็นต้น ให้ส่งด้วย RETURN
}

วิธีใช้งานกับ OrderSend

MqlTradeRequest req; MqlTradeResult res;
ZeroMemory(req); ZeroMemory(res);

req.action       = TRADE_ACTION_DEAL;
req.symbol       = _Symbol;
req.volume       = lots;
req.type         = ORDER_TYPE_BUY;
req.price        = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
req.deviation    = 20;
req.magic        = MagicNumber;
req.type_filling = GetFillingMode(_Symbol);   // ← ไม่เขียนตายตัว (hardcode)

if(!OrderSend(req, res) || res.retcode != TRADE_RETCODE_DONE)
{
   if(res.retcode == TRADE_RETCODE_INVALID_FILL)   // 10030
      PrintFormat("Unsupported filling mode: sent=%d, allowed flags=%d",
                  (int)req.type_filling,
                  (int)SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE));
   else
      PrintFormat("OrderSend failed: retcode=%d", res.retcode);
}

ด้วยวิธีนี้ EA ตัวเดียวกันจะทำงานได้ทั้งบนโบรกเกอร์ที่รองรับเฉพาะ FOK และเฉพาะ IOC โดยไม่ต้องแก้ไขทุกครั้งที่ย้ายโบรกเกอร์

กรณีที่ใช้ CTrade

ไลบรารีมาตรฐาน CTrade มีฟังก์ชัน SetTypeFillingBySymbol() ที่ตั้งค่าวิธีจับคู่คำสั่งโดยอัตโนมัติจากแฟล็กที่อนุญาตของสัญลักษณ์

#include <Trade/Trade.mqh>
CTrade trade;

int OnInit()
{
   trade.SetExpertMagicNumber(MagicNumber);
   trade.SetTypeFillingBySymbol(_Symbol);   // อ่านแฟล็กที่อนุญาตแล้วตั้งค่าอัตโนมัติ
   return INIT_SUCCEEDED;
}

EA ที่เขียนแบบเก่าอย่าง trade.SetTypeFilling(ORDER_FILLING_FOK); (กำหนดตายตัว) ซึ่งเป็นสาเหตุของ 10030 สามารถแก้ได้เพียงเปลี่ยนมาใช้บรรทัดนี้บรรทัดเดียว หากต้องการกำหนดเองก็สามารถส่งผลลัพธ์จาก GetFillingMode() ที่กล่าวไปข้างต้นให้กับ SetTypeFilling() ได้ผลลัพธ์เดียวกัน

ข้อควรระวังเมื่อใช้คำสั่ง Limit (BOC)

ORDER_FILLING_BOC (Book or Cancel) ใช้ได้ เฉพาะคำสั่ง limit และ stop-limit เท่านั้น หากระบุราคาที่จะทำให้จับคู่ได้ทันทีจะถูกปฏิเสธ การนำไปใช้กับคำสั่ง market ถือเป็นความผิดพลาด ดังนั้น EA ประเภท market ไม่จำเป็นต้องใส่ BOC เป็นตัวเลือก


ข้อควรระวังเกี่ยวกับโบรกเกอร์ (ตรวจสอบซ้ำเมื่อย้าย)

  • การตั้งค่าวิธีจับคู่คำสั่งที่อนุญาตนั้น ไม่เพียงแตกต่างกันไปตามแต่ละโบรกเกอร์เท่านั้น แต่ยังแตกต่างกันไปตามแต่ละสัญลักษณ์ (กลุ่มสินค้า) แม้ในโบรกเกอร์เดียวกัน เช่น Forex อาจใช้ IOC ได้ แต่หุ้น CFD อาจใช้ได้เฉพาะ RETURN เป็นเรื่องปกติ
  • การเปลี่ยนประเภทบัญชีหรือเซิร์ฟเวอร์ก็อาจทำให้การตั้งค่าเปลี่ยนไปได้เช่นกัน ไม่ใช่แค่การย้ายโบรกเกอร์เท่านั้น แม้แต่การย้ายเซิร์ฟเวอร์ การเปลี่ยนประเภทบัญชี หรือการปรับปรุงข้อกำหนดของสัญลักษณ์ภายในโบรกเกอร์เดียวกัน ก็อาจทำให้ 10030 ปรากฏขึ้นอย่างกะทันหันได้
  • ดังนั้น เป็นกฎการปฏิบัติงานที่ควรทำเป็นนิสัย คือ "เมื่อบัญชี เซิร์ฟเวอร์ หรือสัญลักษณ์อย่างใดอย่างหนึ่งเปลี่ยนแปลง ให้ตรวจสอบวิธีจับคู่คำสั่งอีกครั้งที่หน้าจอ Specification (หรือด้วยสคริปต์)" หาก EA มีโค้ดเลือกโหมดอัตโนมัติอยู่แล้ว ก็ไม่จำเป็นต้องตรวจสอบด้วยตนเองอีกต่อไป

ข้อมูลเฉพาะของโบรกเกอร์ เช่น "สัญลักษณ์นี้อนุญาตเฉพาะ FOK" นั้นอาจล้าสมัยได้เมื่อมีการเปลี่ยนแปลงการตั้งค่าเซิร์ฟเวอร์ บทความนี้จึงไม่ขอระบุรายละเอียดเจาะจง กรุณาตรวจสอบข้อกำหนดของสัญลักษณ์ในบัญชีของตนเองเสมอ


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

ลำดับความสำคัญสิ่งที่ต้องตรวจสอบวิธีแก้ไข
🚨 ก่อนอื่นช่อง "Filling" ในข้อกำหนดสัญลักษณ์ตรงกับที่ EA กำหนดหรือไม่ปรับให้ตรงกับวิธีที่ได้รับอนุญาต
🚨 ก่อนอื่นEA มีอินพุต FillingType หรือไม่เปลี่ยนค่าอินพุตอย่างเดียวก็แก้ได้ (ไม่ต้องแก้โค้ด)
⚠️ ถัดไปในโค้ด EA มีการเขียน type_filling แบบตายตัวหรือไม่เปลี่ยนเป็น GetFillingMode() / SetTypeFillingBySymbol()
⚠️ ถัดไปมีการย้ายโบรกเกอร์ เปลี่ยนเซิร์ฟเวอร์ หรือเปลี่ยนประเภทบัญชีหรือไม่หลังเปลี่ยนแปลงต้องตรวจสอบข้อกำหนดใหม่เสมอ
✅ ตรวจสอบความแตกต่างของโหมดการดำเนินการ (Instant/Market/Exchange)สัญลักษณ์แบบตลาดหลักทรัพย์ใช้ RETURN เป็นหลัก
🛠 พัฒนามีการจัดการ 10030 แยกตาม retcode หรือไม่บันทึกวิธีที่ส่งไปและแฟล็กที่อนุญาตลง log

สรุป

  • Unsupported filling mode (10030 / TRADE_RETCODE_INVALID_FILL) คือการปฏิเสธจากเซิร์ฟเวอร์เมื่อ type_filling ของคำสั่ง (FOK / IOC / RETURN / BOC) ไม่ได้รับอนุญาตสำหรับสัญลักษณ์นั้น ไม่เกี่ยวข้องกับเงินทุนหรือล็อตแต่อย่างใด
  • เนื่องจากวิธีที่ได้รับอนุญาตนั้น แตกต่างกันไปตามโบรกเกอร์และตามสัญลักษณ์ EA ที่เขียน type_filling แบบตายตัวจึงมักเกิด 10030 พร้อมกันทั้งหมดในวันที่ย้ายโบรกเกอร์ นี่คือรูปแบบทั่วไปของข้อผิดพลาดนี้
  • สำหรับผู้ใช้งาน สามารถแก้ได้ทันทีด้วย "ดูช่อง Filling ในข้อกำหนดสัญลักษณ์ → เปลี่ยนอินพุตของ EA" ส่วนผู้พัฒนาสามารถ แก้ปัญหาถาวร ได้ด้วยการอ่านแฟล็กจาก SymbolInfoInteger(SYMBOL_FILLING_MODE) แล้วเลือกโหมดอัตโนมัติ (หรือใช้ CTrade::SetTypeFillingBySymbol())

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


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

ถาม: EA ที่ใช้งานได้ปกติเมื่อวาน พอเปลี่ยนโบรกเกอร์แล้วเกิด 10030 จนส่งออเดอร์ไม่ได้เลย EA เสียหรือไม่?

ไม่ได้เสียหาย เพียงแค่วิธีจับคู่คำสั่งที่ EA กำหนดไว้ (เช่น FOK) ไม่ได้รับอนุญาตจากโบรกเกอร์ใหม่สำหรับสัญลักษณ์นั้นเท่านั้น ให้ตรวจสอบช่อง "Filling" ในข้อกำหนดสัญลักษณ์ แล้วปรับอินพุตของ EA (เช่น FillingType) ให้ตรงกัน หรือแก้โค้ดให้เลือกโหมดอัตโนมัติ ก็จะกลับมาใช้งานได้ตามปกติ

ถาม: ควรใช้ FOK หรือ IOC ดี?

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

ถาม: ไม่เกิด 10030 ตอนทดสอบย้อนหลัง แต่เกิดขึ้นในบัญชีจริง เพราะอะไร?

การประมวลผลการจับคู่คำสั่งของ Strategy Tester ไม่ได้จำลองการตั้งค่าของเซิร์ฟเวอร์จริงได้ครบถ้วน ทำให้ปัญหาความไม่ตรงกันของ type_filling อาจไม่ปรากฏในการทดสอบ เมื่อเริ่มใช้งานครั้งแรกในบัญชีจริงหรือบัญชีทดลอง ให้ตรวจสอบกับช่อง Filling ในข้อกำหนดสัญลักษณ์ก่อนเป็นอันดับแรก

ถาม: โบรกเกอร์เดียวกัน แต่บางสัญลักษณ์เกิด 10030 บางสัญลักษณ์ไม่เกิด เพราะอะไร?

เป็นพฤติกรรมปกติ (ที่เป็นไปได้) เนื่องจากการอนุญาตวิธีจับคู่คำสั่งเป็นการตั้งค่าระดับสัญลักษณ์ จึงแตกต่างกันไปตามกลุ่มสินค้า เช่น คู่เงิน Forex อาจใช้ IOC ได้ ในขณะที่หุ้น CFD อาจใช้ได้เฉพาะ RETURN EA ที่เทรดหลายสัญลักษณ์ควรอ่านค่า SYMBOL_FILLING_MODE แยกตามแต่ละสัญลักษณ์เสมอ

ถาม: แก้โค้ด EA ไม่ได้ (มีแค่ไฟล์ .ex5) ควรทำอย่างไร?

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

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

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

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

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