Solusi Lengkap Off Quotes / Requote (MT5/MQL5) — 10021
Daftar Isi
- Apa Bedanya Kedua Error Ini (+ 136/138 di MT4)?
- ① TRADE_RETCODE_PRICE_OFF = 10021 (Tidak Ada Quote yang Bisa Diproses)
- ② TRADE_RETCODE_REQUOTE = 10004 (Requote = Penawaran Ulang Harga Baru)
- ③ Error 136 / 138 dari Era MT4
- Identifikasi Cepat dalam 30 Detik
- Penyebab dan Solusi (5 Pola)
- ① Pergerakan Pasar Mendadak / Lonjakan Saat Rilis Data (Harga yang Dikirim Sudah Basi Sebelum Sampai)
- ② Deviation (Slippage yang Diizinkan) Terlalu Ketat
- ③ Perbedaan Mode Eksekusi (Requote adalah Fenomena Khusus Eksekusi Instant)
- ④ Periode atau Simbol dengan Quote Tipis / Terhenti
- ⑤ Latensi Koneksi (VPS Jauh dari Server Broker)
- Kode untuk Mengurangi Error Ini di MQL5 (Untuk Developer EA)
- Mengatur Deviation dengan Satuan Point yang Tepat
- Retry Hanya untuk Retcode Terkait Harga (Kirim Ulang dengan Tick Terbaru)
- Menggunakan Harga Penawaran Ulang dari Requote (10004)
- Membuat Periode "Tidak Order Sama Sekali"
- Checklist Prioritas
- Kesimpulan
- FAQ
- Q: Mana yang lebih serius, 10004 atau 10021?
- Q: Apakah broker yang tidak pernah mengeluarkan requote itu lebih unggul?
- Q: EA MT4 saya mengeluarkan error 136 / 138. Apakah solusinya sama?
- Q: Tidak muncul saat backtest, tapi muncul di akun real. Kenapa?
Solusi Lengkap Off Quotes / Requote (MT5/MQL5)
Saat menjalankan EA, jika di Journal atau tab Expert muncul off quotes (10021) atau requote (10004), rasanya seperti "order ditolak broker" dan bikin khawatir. Padahal keduanya bukan masalah dana atau lot, melainkan masalah harga. Harga yang Anda kirim tidak cocok dengan harga yang saat ini dimiliki server — hanya itu saja. Sebagian besar penyebabnya jatuh pada salah satu dari: pergerakan pasar mendadak, slippage yang diizinkan, mode eksekusi, atau latensi koneksi.
Artikel ini ditujukan baik untuk pengguna EA di MT5 maupun pembuat EA di MQL5, merangkum 10021 (TRADE_RETCODE_PRICE_OFF) dan 10004 (TRADE_RETCODE_REQUOTE), serta error 136/138 dari era MT4 — mulai dari identitas, penyebab, solusi cepat, hingga penanganan permanen di sisi kode. Untuk daftar lengkap kode error lainnya, lihat Panduan Komprehensif Penanganan Kode Error MQL5 / MT5.
Artikel ini berdasarkan MT5 (build seri 4xxx) per Juli 2026. Detail perilaku (apakah server mengembalikan requote atau langsung mengeksekusi, dll.) dapat berbeda tergantung mode eksekusi broker.
Apa Bedanya Kedua Error Ini (+ 136/138 di MT4)?
Penolakan bertipe "harga tidak cocok" ini terbagi menjadi 2 jenis berdasarkan cara server merespons.
① TRADE_RETCODE_PRICE_OFF = 10021 (Tidak Ada Quote yang Bisa Diproses)
Nilai yang masuk ke MqlTradeResult.retcode dari hasil OrderSend(), menandakan penolakan "tidak ada quote untuk memproses request ini (There are no quotes to process the request)". Ini berarti server tidak memiliki harga valid, atau harga yang dikirim terlalu jauh dari quote saat ini sehingga tidak bisa diproses.
Arti : Tidak ada quote untuk memproses request
Konstanta: TRADE_RETCODE_PRICE_OFF
Nilai : 10021
② TRADE_RETCODE_REQUOTE = 10004 (Requote = Penawaran Ulang Harga Baru)
Juga merupakan retcode dari OrderSend(), tetapi ini bukan sekadar penolakan — melainkan "harga itu tidak bisa, tapi bagaimana dengan harga baru ini?" (requote/penawaran ulang). Field bid / ask pada MqlTradeResult akan berisi harga baru yang ditawarkan server.
Arti : Requote — penawaran ulang harga baru
Konstanta: TRADE_RETCODE_REQUOTE
Nilai : 10004
// Contoh output khas yang bisa dilihat di log
2026.07.07 21:30:02.118 EA_NAME EURUSD,M5: OrderSend error 10004 (requote)
2026.07.07 21:30:02.310 EA_NAME EURUSD,M5: OrderSend error 10021
③ Error 136 / 138 dari Era MT4
Di MQL4 (MT4), fenomena yang sama dikembalikan melalui kode error dari GetLastError().
| Konstanta MT4 | Nilai | Retcode MT5 yang Setara |
|---|---|---|
ERR_OFF_QUOTES | 136 | 10021 (TRADE_RETCODE_PRICE_OFF) |
ERR_REQUOTE | 138 | 10004 (TRADE_RETCODE_REQUOTE) |
Jika Anda menemukan "error 136" atau "error 138" di artikel lama atau log EA versi MT4, isi artikel ini berlaku sepenuhnya untuk kasus tersebut (di MT4, praktik standarnya adalah memanggil RefreshRates() untuk mengambil ulang harga sebelum mengirim ulang order. Cara penulisan di MT5 dibahas di bagian berikutnya).
Pemetaan praktis:
| Retcode | Alasan Server | Tindakan yang Harus Diambil EA |
|---|---|---|
| 10004 (requote) | "Harga sudah bergerak. Ini harga barunya" | Kirim ulang dengan harga terbaru (atau lewati) |
| 10021 (price off) | "Tidak ada quote yang bisa diproses" | Tunggu sebentar, kirim ulang dengan tick terbaru |
Keduanya adalah error sementara (bisa di-retry). Meski tidak bisa "dihilangkan sepenuhnya" hanya dengan perubahan kode atau setting, frekuensinya bisa dikurangi secara signifikan.
Identifikasi Cepat dalam 30 Detik
- Cek kapan error muncul dari waktu di Journal
- Tepat saat rilis data ekonomi (NFP, FOMC, dll.) → pergerakan pasar mendadak yang normal. Jika EA memiliki filter berita, aktifkan
- Sekitar jam 0 waktu server (rollover) atau gap awal pekan → periode quote tipis. Ini masih dalam batas wajar
- Muncul acak tanpa kaitan waktu tertentu → curigai koneksi, VPS, atau setting deviation
- Cek pada simbol apa error muncul
- Jika terkonsentrasi pada pasangan mata uang minor, eksotis, atau CFD dengan likuiditas rendah, penyebabnya adalah quote yang tipis pada simbol tersebut
- Coba order manual
- Jika order cepat manual berjalan normal tapi hanya EA yang ditolak → kemungkinan besar
deviation(slippage yang diizinkan) pada EA terlalu ketat
- Jika order cepat manual berjalan normal tapi hanya EA yang ditolak → kemungkinan besar
Dari 3 langkah ini, Anda bisa mengira-ngira apakah penyebabnya "kondisi pasar", "simbol tertentu", atau "setting/lingkungan", sebelum lanjut ke penanganan per penyebab berikut.
Penyebab dan Solusi (5 Pola)
① Pergerakan Pasar Mendadak / Lonjakan Saat Rilis Data (Harga yang Dikirim Sudah Basi Sebelum Sampai)
Gejala: 10004/10021 terkonsentrasi pada saat rilis data ekonomi, pernyataan pejabat penting, atau pagi hari Senin.
Penyebab: EA menghitung harga dari tick yang diterima, namun dalam rentang puluhan hingga ratusan milidetik sebelum order sampai ke server, harga sudah bergerak beberapa pips. Harga yang dikirim sudah tidak berlaku lagi, sehingga server mengembalikan requote (10004) atau tidak ada quote (10021). Ini bukan benar-benar error, melainkan hal yang wajar terjadi di pasar yang bergerak cepat.
Solusi:
- Hentikan entry baru di sekitar waktu rilis data (news filter). EA yang dibagikan di situs ini sudah dilengkapi
EconomicFiltersecara standar - Perlebar
deviation(slippage yang diizinkan) ke nilai yang lebih realistis (lihat ②) - Terapkan logika retry (kode dibahas di bawah)
② Deviation (Slippage yang Diizinkan) Terlalu Ketat
Gejala: Muncul sesekali bahkan saat pasar tenang. Order manual berjalan normal, tapi hanya EA yang ditolak.
Penyebab: MqlTradeRequest.deviation adalah deklarasi "sampai berapa point penyimpangan dari harga yang dikirim yang masih bisa diterima". Jika nilai ini dipersempit menjadi 0 hingga beberapa point saja, bahkan penyimpangan sebesar update tick normal pun bisa ditolak. Kesalahan umum lainnya adalah salah paham satuan — satuannya adalah points, bukan pips (untuk broker 5 digit, 1 pip = 10 points).
Solusi:
- Coba mulai dari
deviationsekitar 10–30 points (= 1–3 pips). Jika bukan strategi scalping, 20 points adalah titik awal yang aman - Periksa apakah ada kesalahan satuan, misalnya bermaksud deviation=5 tapi ternyata jadi 0,5 pips
- Jika strategi Anda sama sekali tidak ingin mentoleransi slippage, anggap penolakan sebagai hal wajar dan cukup kontrol jumlah retry-nya saja
③ Perbedaan Mode Eksekusi (Requote adalah Fenomena Khusus Eksekusi Instant)
Gejala: Sering terjadi di Broker A, tapi tidak pernah muncul di Broker B.
Penyebab: Requote (10004) adalah fenomena khas instant execution (eksekusi instan). Eksekusi instan berarti order "eksekusi pada harga ini", sehingga jika harga bergerak, server akan menawarkan ulang harga baru (requote). Sebaliknya, market execution (eksekusi market) berarti order "eksekusi pada harga pasar saat ini", sehingga secara prinsip requote tidak akan pernah terjadi — sebagai gantinya, order tetap dieksekusi pada harga yang sudah bergeser (slippage).
Jadi, "tidak pernah muncul requote" bukan berarti "lebih unggul" — ini adalah trade-off antara ditolak atau dieksekusi dengan slippage. Mode eksekusi suatu simbol bisa dicek di kolom Execution pada "Spesifikasi Simbol" MT5, atau lewat kode menggunakan SYMBOL_TRADE_EXEMODE.
Solusi:
- Periksa mode eksekusi akun Anda (banyak akun standar broker luar negeri menggunakan market execution, sehingga requote tidak pernah muncul sama sekali)
- Jika requote yang sering muncul mengganggu strategi Anda, pertimbangkan jenis akun atau broker dengan market execution
- Karena ada broker yang tetap menghormati
deviationdi market execution dan ada yang tidak, jika slippage ekstrem tidak bisa ditoleransi, verifikasi slippage aktual melalui riwayat transaksi
④ Periode atau Simbol dengan Quote Tipis / Terhenti
Gejala: 10021 muncul di sekitar jam 0 waktu server (rollover), tepat setelah pembukaan pasar awal pekan, musim sepi seperti liburan Natal, atau pada simbol minor.
Penyebab: Saat rollover, distribusi quote bisa terhenti sementara atau spread melebar ekstrem karena proses swap. Tepat setelah pembukaan awal pekan atau pada simbol berlikuiditas rendah, quote yang bisa diproses memang tipis sejak awal. Order dalam kondisi ini akan menghasilkan 10021 (tidak ada quote).
Solusi:
- Hindari entry baru di sekitar jam 23:55–0:05 waktu server (time filter)
- Hindari beberapa menit pertama setelah pembukaan pasar awal pekan (setting jenis
AvoidMondayOpen) - Terapkan spread filter (
MaxSpread). Karena spread melebar saat quote tipis, ini secara otomatis menghindari periode tersebut
⑤ Latensi Koneksi (VPS Jauh dari Server Broker)
Gejala: Frekuensinya jelas lebih tinggi dibanding lingkungan lain, tanpa kaitan dengan waktu atau simbol tertentu. Nilai ping besar.
Penyebab: Semakin panjang waktu tempuh pulang-pergi (latensi) order ke server, semakin besar kemungkinan harga bergerak dalam rentang waktu tersebut. Jika dijalankan di PC rumahan, atau VPS di region yang jauh dari lokasi server broker (umumnya London, New York, dll.), frekuensi 10004/10021 akan meningkat secara struktural. Nilai ping yang ditampilkan di pojok kanan bawah MT5 bisa jadi indikator (ratusan ms jelas merugikan, puluhan ms ke bawah lebih ideal).
Solusi:
- Cek nilai ping di pojok kanan bawah MT5. Jika selalu besar, tinjau ulang lingkungan eksekusi EA Anda
- Pindah ke VPS di region yang lebih dekat dengan server broker. Sejujurnya, 10004/10021 akibat latensi tidak bisa dikurangi lewat kode — satu-satunya solusi adalah mendekatkan diri secara fisik. Cara memilihnya dirangkum di Panduan Memilih VPS untuk EA
- Semakin scalping suatu EA, semakin besar dampak latensi. Untuk EA berbasis daily/H4, prioritas penyebab ini relatif rendah
Kode untuk Mengurangi Error Ini di MQL5 (Untuk Developer EA)
Ada 3 pendekatan: (1) mengatur deviation secara realistis, (2) mengambil ulang tick terbaru dan mengirim ulang saat ditolak, (3) membatasi retry hanya pada retcode terkait harga.
Mengatur Deviation dengan Satuan Point yang Tepat
MqlTradeRequest req; MqlTradeResult res;
ZeroMemory(req); ZeroMemory(res);
req.action = TRADE_ACTION_DEAL;
req.symbol = _Symbol;
req.type = ORDER_TYPE_BUY;
req.volume = lots;
req.deviation = 20; // Slippage yang diizinkan 20 points (2.0 pips untuk 5 digit)
// req.price / req.sl / req.tp / req.magic juga perlu diatur
Satuan deviation adalah points. Untuk broker dengan tampilan 5 digit (3 digit), 10 points = 1 pip. Nilai 0 atau terlalu kecil akan meningkatkan rasio penolakan secara tidak perlu.
Retry Hanya untuk Retcode Terkait Harga (Kirim Ulang dengan Tick Terbaru)
Poin pentingnya adalah mengambil ulang harga lewat SymbolInfoTick() setiap kali retry (mengirim ulang dengan harga lama hanya akan menghasilkan penolakan yang sama), dan membatasi target retry hanya pada 10004/10021. Mengirim ulang secara mekanis untuk dana tidak cukup (10019) atau request tidak valid (10013) tidak ada gunanya dan hanya mengotori log.
bool IsRetryableRetcode(uint rc)
{
return (rc == TRADE_RETCODE_REQUOTE // 10004
|| rc == TRADE_RETCODE_PRICE_OFF); // 10021
}
// Mengirim ulang hingga maksimal 3 kali sambil memperbarui harga dengan tick terbaru
bool SendWithRetry(MqlTradeRequest &req, MqlTradeResult &res, int maxTries = 3)
{
for(int attempt = 0; attempt < maxTries; attempt++)
{
MqlTick tick;
if(!SymbolInfoTick(req.symbol, tick))
{
Print("SymbolInfoTick failed: ", GetLastError());
return false;
}
req.price = (req.type == ORDER_TYPE_BUY) ? tick.ask : tick.bid;
if(OrderSend(req, res) && res.retcode == TRADE_RETCODE_DONE)
return true; // Order berhasil
if(!IsRetryableRetcode(res.retcode))
{
PrintFormat("OrderSend failed (no retry): retcode=%d", res.retcode);
return false; // Jangan retry selain retcode terkait harga
}
PrintFormat("Retry %d/%d after retcode=%d", attempt + 1, maxTries, res.retcode);
Sleep(200 + 150 * attempt); // Tunggu bertahap 200ms→350ms→500ms
}
Print("Order abandoned after retries (price kept moving).");
return false;
}
Waktu tunggu Sleep() dibuat bertahap karena jika dikirim berulang kali dengan 0ms saat pasar bergerak cepat, hasilnya tetap akan ditolak berulang. Sebaliknya jika terlalu lama menunggu, harga entry akan semakin menjauh dari asumsi strategi awal, jadi retry sebaiknya dibatasi 2–3 kali lalu menyerah. Untuk order pending (TRADE_ACTION_PENDING), perlu diperhatikan bahwa retcode keberhasilan adalah TRADE_RETCODE_PLACED (10008).
Menggunakan Harga Penawaran Ulang dari Requote (10004)
Saat terjadi 10004, field bid / ask pada MqlTradeResult berisi harga penawaran ulang dari server. Mengirim ulang dengan tick terbaru seperti di atas sudah cukup untuk kebutuhan praktis, tetapi jika ingin membangun logika "terima jika harga penawaran ulang masih dalam batas toleransi" pada eksekusi instan, Anda bisa membandingkan selisih antara res.ask / res.bid dengan harga asumsi awal dalam satuan points sebelum mengirim ulang.
Membuat Periode "Tidak Order Sama Sekali"
Retry di level kode adalah solusi simtomatik. Filter yang menghentikan entry baru di sekitar rollover, rilis data, atau saat spread melebar jauh lebih efektif secara mendasar.
// Contoh spread filter: lewati entry baru saat spread melebar
long spreadPts = SymbolInfoInteger(_Symbol, SYMBOL_SPREAD);
if(spreadPts > MaxSpreadPoints)
{
// Lewati entry baru (secara otomatis menghindari periode tipis yang rawan 10021)
return;
}
EA yang dibagikan FXEA365 sudah mengimplementasikan spread filter, news filter, dan auto-retry untuk retcode terkait harga secara standar.
Checklist Prioritas
| Prioritas | Pemeriksaan | Solusi |
|---|---|---|
| 🚨 Utama | Apakah terkonsentrasi saat rilis data / pergerakan mendadak? | Aktifkan news filter, anggap wajar pada periode tersebut |
| 🚨 Utama | Apakah deviation terlalu kecil (satuan points)? | Ubah ke 10–30 points, periksa kesalahan satuan pips/points |
| ⚠️ Berikutnya | Apakah terkonsentrasi pada rollover, awal pekan, simbol sepi? | Time filter + spread filter |
| ⚠️ Berikutnya | Apakah mode eksekusi instant? | Pertimbangkan akun market execution (trade-off dengan slippage) |
| ⚠️ Berikutnya | Apakah ping besar (ratusan ms)? | Pindah ke VPS yang lebih dekat dengan server |
| 🛠 Development | Apakah retry dibatasi hanya untuk retcode terkait harga? | Ambil ulang dengan SymbolInfoTick, batasi 2–3 kali retry |
Kesimpulan
- 10021 (TRADE_RETCODE_PRICE_OFF) berarti "tidak ada quote yang bisa diproses", 10004 (TRADE_RETCODE_REQUOTE) berarti "penawaran ulang harga baru". Sama seperti error 136/138 di era MT4, keduanya termasuk kelompok penolakan harga, bukan masalah dana atau lot.
- Penyebabnya terangkum dalam 5 hal: pergerakan pasar mendadak, deviation terlalu kecil, eksekusi instant, periode/simbol dengan quote tipis, dan latensi koneksi.
- Requote adalah fenomena khusus eksekusi instan; pada market execution, hal ini justru muncul sebagai slippage. "Tidak pernah muncul" bukan berarti "lebih baik" — ini trade-off.
- Developer EA sebaiknya menerapkan solusi permanen berupa retry 2–3 kali dengan tick terbaru (khusus 10004/10021) + pengaturan deviation yang tepat + filter waktu/spread. Khusus penyebab dari latensi, hanya bisa dikurangi lewat solusi fisik (VPS yang dekat dengan broker).
Untuk kode error secara keseluruhan, lihat Panduan Komprehensif Penanganan Kode Error MQL5 / MT5. Untuk EA gratis yang sudah mengimplementasikan solusi-solusi ini secara standar, lihat Daftar EA.
FAQ
Q: Mana yang lebih serius, 10004 atau 10021?
Keduanya sama-sama error harga sementara, tanpa perbedaan tingkat keparahan yang signifikan. 10004 berarti "ditawarkan harga baru", sedangkan 10021 berarti "tidak ada quote yang bisa diproses" — hanya beda cara responnya. Jika hanya muncul sesekali, tidak masalah untuk dibiarkan. Hanya jika sering terjadi pada waktu atau simbol tertentu, telusuri penyebabnya (data ekonomi, rollover, deviation, koneksi) dan atasi.
Q: Apakah broker yang tidak pernah mengeluarkan requote itu lebih unggul?
Kemungkinan besar itu hanya perbedaan mode eksekusi. Pada akun market execution, requote secara prinsip tidak akan pernah terjadi — jika harga bergerak, order tetap dieksekusi pada harga yang sudah bergeser (slippage). Karena ini trade-off antara ditolak atau slippage, sebaiknya periksa slippage aktual melalui riwayat transaksi sebelum menilai.
Q: EA MT4 saya mengeluarkan error 136 / 138. Apakah solusinya sama?
Ya. 136 (ERR_OFF_QUOTES) setara dengan 10021, dan 138 (ERR_REQUOTE) setara dengan 10004 — penyebab maupun solusinya sama. Di MQL4, praktik standarnya adalah memanggil RefreshRates() sebelum mengirim ulang untuk memperbarui Bid / Ask, dengan konsep yang sama seperti mengambil ulang harga via SymbolInfoTick() di MQL5.
Q: Tidak muncul saat backtest, tapi muncul di akun real. Kenapa?
Ini normal. Strategy Tester tidak memiliki (atau menyederhanakan) "waktu tunda order sampai ke server" dan "pergerakan harga dalam rentang waktu tersebut", sehingga 10004/10021 hanya benar-benar muncul saat forward (real-time). Meskipun hasil backtest bagus, di akun real tetap diperlukan pengaturan deviation, retry, dan lingkungan eksekusi (VPS) yang memadai secara terpisah.
Terkait
📧 Peringatan sebelum harga naik + kursus email gratis 5 hari
Semua EA dijual dengan harga peluncuran dan naik bertahap seiring penjualan. Dapatkan pemberitahuan sebelum setiap kenaikan, plus email harian tentang trading algo, membaca backtest, dan memilih broker.
* Privasi sangat dilindungi. Anda dapat berhenti berlangganan kapan saja.