Off Quotes / Requote (MT5) — Hata 10021
İçindekiler
- Bu ikisi (+ MT4'teki 136/138) arasındaki fark nedir
- ① TRADE_RETCODE_PRICE_OFF = 10021 (İşlenebilecek kotasyon yok)
- ② TRADE_RETCODE_REQUOTE = 10004 (Requote = yeni fiyat teklifi)
- ③ MT4 döneminden kalan 136 / 138 hataları
- Önce 30 saniyede yapılabilecek ayrım
- Nedenler ve Çözümler (5 senaryo)
- ① Ani piyasa hareketi / veri açıklaması sıçraması (gönderilen fiyat ulaşmadan eskiyor)
- ② deviation (izin verilen slipaj) çok dar tutulmuş
- ③ Execution yöntemi farkı (requote instant execution'a özgü bir olgudur)
- ④ Kotasyonun seyrek olduğu veya durduğu saat/enstrüman
- ⑤ Bağlantı gecikmesi (VPS broker sunucusundan uzak)
- MQL5'te bu hatayı azaltan kod (EA geliştiricileri için)
- deviation'ı point cinsinden uygun ayarlama
- Yalnızca fiyat kaynaklı retcode'larda retry yapma (en güncel tick ile yeniden gönderim)
- Requote (10004) ile gelen yeni fiyat teklifini kullanma
- Zaten işlem açmayan saat dilimleri oluşturma
- Öncelik kontrol listesi
- Özet
- SSS
- S: 10004 ve 10021'den hangisi daha ciddidir?
- S: Hiç requote vermeyen bir broker daha mı iyidir?
- S: MT4 EA'sında error 136 / 138 alıyorum. Aynı çözümler geçerli mi?
- S: Backtest'te çıkmıyor ama canlıda çıkıyor.
Off Quotes / Requote (MT5/MQL5) Sorununu Kesin Çözüme Kavuşturun
EA çalıştırırken Journal veya Experts sekmesinde off quotes (10021) ya da requote (10004) gördüğünüzde, sanki "broker işlemi reddetti" gibi hissedip endişelenebilirsiniz; ancak bu ikisi bakiye veya lot sorunu değil, tamamen "fiyat" sorunudur. Gönderdiğiniz fiyat ile sunucunun o an elinde bulunan fiyat uyuşmamıştır — hepsi bu. Nedenlerin neredeyse tamamı ani piyasa hareketi, izin verilen slipaj, execution yöntemi veya bağlantı gecikmesinden birine dayanır.
Bu yazı, hem MT5'te EA kullananlar hem de MQL5 ile EA yazanlar için 10021 (TRADE_RETCODE_PRICE_OFF) ve 10004 (TRADE_RETCODE_REQUOTE) ile MT4 döneminden kalan 136/138 hata kodlarının ne olduğunu, nedenlerini, hemen uygulanabilecek çözümleri ve kod tarafında kalıcı önlemleri tek bir yazıda toplayan kesin rehberdir. Hata kodlarının genel listesi için MQL5 / MT5 Hata Kodları Kapsamlı Çözüm Rehberi yazısına bakabilirsiniz.
Bu yazı 2026 Temmuz itibarıyla MT5'in (build 4xxx serisi) güncel sürümünü esas almaktadır. Davranış detayları (requote döndürmesi mi yoksa doğrudan işlemi gerçekleştirmesi mi gibi) broker'ın execution yöntemine göre değişebilir.
Bu ikisi (+ MT4'teki 136/138) arasındaki fark nedir
"Fiyat uyuşmuyor" türündeki reddler, sunucunun yanıt verme biçimine göre iki türe ayrılır.
① TRADE_RETCODE_PRICE_OFF = 10021 (İşlenebilecek kotasyon yok)
OrderSend() sonucunda MqlTradeResult.retcode alanına yazılan bir değerdir ve "isteği işlemek için kotasyon (fiyat teklifi) bulunmuyor" (There are no quotes to process the request) anlamına gelen bir reddir. Sunucu tarafında geçerli bir fiyat olmadığını veya gönderilen fiyatın mevcut kotasyondan çok uzaklaştığı için işlenemediğini gösterir.
Anlamı: İsteği işleyecek kotasyon yok
Sabit : TRADE_RETCODE_PRICE_OFF
Değer : 10021
② TRADE_RETCODE_REQUOTE = 10004 (Requote = yeni fiyat teklifi)
Yine OrderSend() retcode değeridir; ancak bu sadece bir red değil, "bu fiyatla olmaz ama şu yeni fiyatla ister misiniz" şeklinde yeniden fiyat teklifi (requote) anlamına gelir. MqlTradeResult içindeki bid / ask alanlarına sunucunun yeniden sunduğu fiyat yazılarak döner.
Anlamı: Requote — yeni fiyat teklifi
Sabit : TRADE_RETCODE_REQUOTE
Değer : 10004
// Logda görülebilecek tipik çıktı örneği
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
③ MT4 döneminden kalan 136 / 138 hataları
MQL4'te (MT4) aynı durum GetLastError() üzerinden hata kodu olarak dönüyordu.
| MT4 Sabiti | Değer | Karşılık gelen MT5 retcode |
|---|---|---|
ERR_OFF_QUOTES | 136 | 10021 (TRADE_RETCODE_PRICE_OFF) |
ERR_REQUOTE | 138 | 10004 (TRADE_RETCODE_REQUOTE) |
Eski EA anlatım yazılarında veya MT4 sürümü EA loglarında "error 136", "error 138" görürseniz, bu yazının içeriği doğrudan sizin için de geçerlidir (MT4'te yeniden göndermeden önce RefreshRates() ile fiyatı tazelemek standart yöntemdi. MT5'teki karşılığına ileride değineceğiz).
Pratik ayrım:
| Retcode | Sunucunun söylediği | EA'nın yapması gereken |
|---|---|---|
| 10004 (requote) | "Fiyat hareket etti, yeni fiyat sunuyorum" | Güncel fiyatla yeniden gönder (veya vazgeç) |
| 10021 (price off) | "İşlenebilecek kotasyon yok" | Biraz bekleyip en güncel tick ile yeniden gönder |
İkisi de geçici (yeniden denenebilir) hatalardır ve kod değişikliği ya da ayar değişikliğiyle "kesinlikle hiç çıkmaz" hale getirilemez; ancak sıklığı önemli ölçüde azaltılabilir.
Önce 30 saniyede yapılabilecek ayrım
- Ne zaman çıktığını Journal'daki saat damgasından kontrol edin
- İstihdam verileri, FOMC gibi veri açıklama anları → normal piyasa hareketi. EA'nızda veri filtresi varsa etkinleştirin
- Sunucu saatiyle gece yarısı civarı (rollover) veya hafta başı açılış boşluğu → kotasyonun seyrek olduğu saatler. Bu durum normaldir
- Saatten bağımsız rastgele sık sık çıkıyorsa → bağlantı, VPS veya deviation ayarından şüphelenin
- Hangi enstrümanda çıktığını kontrol edin
- Minör paritelere, egzotik paritelere veya CFD gibi likiditesi düşük enstrümanlara yoğunlaşıyorsa, neden o enstrümanın kotasyon seyrekliğidir
- Manuel emirde de çıkıyor mu test edin
- Manuel hızlı emir sorunsuz geçerken sadece EA reddediliyorsa → EA'nın
deviation(izin verilen slipaj) değeri çok dar tutulmuş olabilir
- Manuel hızlı emir sorunsuz geçerken sadece EA reddediliyorsa → EA'nın
Bu üç adımla "piyasadan mı", "enstrümandan mı" yoksa "ayar/ortamdan mı" kaynaklandığına dair bir fikir edindikten sonra aşağıdaki nedene özel çözümlere geçebilirsiniz.
Nedenler ve Çözümler (5 senaryo)
① Ani piyasa hareketi / veri açıklaması sıçraması (gönderilen fiyat ulaşmadan eskiyor)
Belirti: Ekonomik veri açıklama saatlerinde, önemli açıklamalarda, pazartesi sabahı erken saatlerde 10004/10021 yoğunlaşır.
Neden: EA bir tick alıp fiyatı hesaplar; ancak emrin sunucuya ulaşmasına kadar geçen birkaç on ila birkaç yüz ms içinde fiyat birkaç pip hareket eder. Gönderilen fiyat artık mevcut olmadığından sunucu ya requote (10004) ya da kotasyon yok (10021) döndürür. Bu bir hata değil, hızlı piyasalarda olması doğal bir durumdur.
Çözüm:
- Veri açıklaması öncesi ve sonrasında yeni işlem açmayı durdurun (haber filtresi). Sitemizde dağıtılan EA'lar standart olarak
EconomicFilteriçerir deviation(izin verilen slipaj) değerini gerçekçi bir seviyeye genişletin (bkz. ②)- Retry (yeniden deneme) mantığı ekleyin (kod aşağıda)
② deviation (izin verilen slipaj) çok dar tutulmuş
Belirti: Sakin piyasalarda bile ara sıra çıkar. Manuel emir geçerken sadece EA reddedilir.
Neden: MqlTradeRequest.deviation, "gönderilen fiyattan kaç point sapma kabul edilir" beyanıdır. Bu değer 0 ile birkaç point arasında dar tutulursa, olağan tick güncellemesi kadar küçük bir sapma bile reddedilir. pips değil points olduğu (5 haneli broker'da 1 pip = 10 points) karıştırılan klasik bir noktadır.
Çözüm:
deviationdeğerini 10-30 point (= 1-3 pips) civarından başlatıp sonucu izleyin. Scalping stratejisi değilse 20 point makul bir başlangıç noktasıdır- "deviation=5 dedim ama aslında 0.5 pips oldu" gibi birim karışıklığı olup olmadığını kontrol edin
- Slipaja hiç izin vermek istemeyen bir strateji uyguluyorsanız, reddi kabul edip sadece retry sayısını kontrol edin
③ Execution yöntemi farkı (requote instant execution'a özgü bir olgudur)
Belirti: A broker'da sık sık çıkarken B broker'da hiç görülmez.
Neden: Requote (10004), instant execution'a özgü bir olgudur. Instant execution "bu fiyattan işlemi gerçekleştir" talebidir; fiyat hareket ederse sunucu yeni fiyatı tekrar sunar (requote). Buna karşılık market execution, "şu anki piyasa fiyatından işlemi gerçekleştir" talebidir; bu nedenle requote prensip olarak hiç oluşmaz, bunun yerine sapan fiyattan doğrudan işlem gerçekleşir (slipaj).
Yani "requote çıkmıyor = iyi" değildir; reddedilme ile slipajla işlem gerçekleşmesi arasında bir denge (trade-off) söz konusudur. Sembolün execution yöntemi, MT5'teki "Sembol Özellikleri (Specification)" sekmesindeki Execution alanından veya kod tarafında SYMBOL_TRADE_EXEMODE ile kontrol edilebilir.
Çözüm:
- Kendi hesabınızın execution yöntemini kontrol edin (birçok yurt dışı broker'ın standart hesapları market execution kullanır ve requote hiç oluşmaz)
- Sık requote stratejinize engel oluyorsa, market execution sunan hesap türü/broker'ı değerlendirin
- Market execution'da bile
deviation'a saygı gösteren ve göstermeyen broker'lar olduğundan, aşırı slipaja tahammülünüz yoksa işlem geçmişinden gerçek slipajı doğrulayın
④ Kotasyonun seyrek olduğu veya durduğu saat/enstrüman
Belirti: Sunucu saatiyle gece yarısı civarı (rollover), hafta başı açılış hemen sonrası, Noel gibi durgun dönemlerde, minör enstrümanlarda 10021 çıkar.
Neden: Rollover sırasında swap işlemleri nedeniyle kotasyon akışı geçici olarak durabilir veya spread aşırı genişleyebilir. Hafta başı açılış hemen sonrasında ya da likiditesi düşük enstrümanlarda zaten işlenebilecek kotasyon zayıftır. Bu durumda emir gönderilirse 10021 (kotasyon yok) alınır.
Çözüm:
- Sunucu saatiyle 23:55-0:05 civarında yeni işlem açmaktan kaçının (zaman filtresi)
- Hafta başı açılışın ilk birkaç dakikasından kaçının (
AvoidMondayOpentürü ayarlar) - Spread filtresi (
MaxSpread) ekleyin. Kotasyonun seyrek olduğu saatlerde spread genişlediğinden, bu ayar aslında o saatleri otomatik olarak dışlar
⑤ Bağlantı gecikmesi (VPS broker sunucusundan uzak)
Belirti: Saat ve enstrümandan bağımsız olarak diğer ortamlara göre belirgin şekilde daha sık çıkar. Ping değeri yüksektir.
Neden: Emrin sunucuya ulaşmasına kadar geçen gidiş-dönüş süresi (gecikme) uzadıkça, bu süre içinde fiyatın hareket etme olasılığı artar. Ev bilgisayarında veya broker sunucusunun bulunduğu bölgeden (genellikle Londra, New York vb.) uzak bir VPS bölgesinde çalıştırıyorsanız, 10004/10021 sıklığı yapısal olarak artar. MT5'in sağ alt köşesinde görünen ping değeri buna dair bir gösterge sağlar (birkaç yüz ms açıkça dezavantajlı, birkaç on ms altı tercih edilir).
Çözüm:
- MT5 sağ altındaki ping değerini kontrol edin; sürekli yüksekse EA'nın çalıştığı ortamı gözden geçirin
- Broker sunucusuna yakın bir bölgedeki VPS'e taşıyın. Açıkçası, gecikmeden kaynaklanan 10004/10021 kodla azaltılamaz, tek çözüm fiziksel olarak yakınlaşmaktır. Seçim kriterleri için EA İçin VPS Seçim Rehberi yazısına bakabilirsiniz
- Scalping tarzı EA'larda gecikmenin etkisi daha büyüktür. Günlük veya H4 zaman dilimindeki EA'larda bu neden önceliği düşüktür
MQL5'te bu hatayı azaltan kod (EA geliştiricileri için)
Strateji üç noktadan oluşur: (1) deviation'ı gerçekçi ayarlamak, (2) reddedilince en güncel tick'i alıp yeniden göndermek, (3) yalnızca fiyat kaynaklı retcode'larda retry yapmak.
deviation'ı point cinsinden uygun ayarlama
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; // İzin verilen slipaj 20 points (5 haneli ise 2.0 pips)
// req.price / req.sl / req.tp / req.magic gibi alanlar da ayarlanmalı
deviation biriminin points olduğuna dikkat edin. 5 haneli (3 haneli) gösterim yapan broker'larda 10 points = 1 pip. 0 veya aşırı küçük bir değer, red oranını gereksiz yere artırır.
Yalnızca fiyat kaynaklı retcode'larda retry yapma (en güncel tick ile yeniden gönderim)
Önemli olan nokta, her retry'de SymbolInfoTick() ile fiyatı tazelemek (eski fiyatla tekrar göndermek aynı reddi almaktan başka bir işe yaramaz) ve retry hedefini yalnızca 10004/10021 ile sınırlamaktır. Yetersiz bakiye (10019) veya geçersiz istek (10013) gibi hataları mekanik olarak yeniden göndermenin bir anlamı yoktur; sadece logları kirletir.
bool IsRetryableRetcode(uint rc)
{
return (rc == TRADE_RETCODE_REQUOTE // 10004
|| rc == TRADE_RETCODE_PRICE_OFF); // 10021
}
// En güncel tick ile fiyatı güncelleyerek en fazla 3 kez yeniden gönder
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; // İşlem başarılı
if(!IsRetryableRetcode(res.retcode))
{
PrintFormat("OrderSend failed (no retry): retcode=%d", res.retcode);
return false; // Fiyat dışı hatalarda retry yapma
}
PrintFormat("Retry %d/%d after retcode=%d", attempt + 1, maxTries, res.retcode);
Sleep(200 + 150 * attempt); // 200ms → 350ms → 500ms şeklinde küçük artışlarla bekle
}
Print("Order abandoned after retries (price kept moving).");
return false;
}
Sleep() bekleme süresinin kademeli artırılmasının nedeni, ani hareket anında 0ms ile art arda denemenin aynı reddi almaya devam etmesidir. Tersine çok uzun beklemek de giriş fiyatının strateji beklentisinden uzaklaşmasına yol açar; bu yüzden retry'ı 2-3 denemede bırakmak sağlıklıdır. Bekleyen emirlerde (TRADE_ACTION_PENDING) başarı durumunda dönen retcode'un TRADE_RETCODE_PLACED (10008) olduğuna da dikkat edin.
Requote (10004) ile gelen yeni fiyat teklifini kullanma
10004 döndüğünde, MqlTradeResult içindeki bid / ask alanlarına sunucunun yeniden sunduğu fiyat yazılır. Yukarıdaki gibi en güncel tick ile yeniden göndermek pratikte yeterlidir; ancak instant execution'da "yeniden sunulan fiyat kabul edilebilir aralıktaysa kabul et" mantığı kurmak isterseniz, res.ask / res.bid ile orijinal beklenen fiyat arasındaki farkı point cinsinden karşılaştırıp ardından yeniden göndermeniz gerekir.
Zaten işlem açmayan saat dilimleri oluşturma
Koddaki retry, semptomatik bir çözümdür. Rollover öncesi/sonrası, veri açıklaması öncesi/sonrası ve spread genişlediğinde yeni işlemi durduran filtreler çok daha kalıcı bir etki sağlar.
// Spread filtresi örneği: spread açıldığında yeni işlemi ertele
long spreadPts = SymbolInfoInteger(_Symbol, SYMBOL_SPREAD);
if(spreadPts > MaxSpreadPoints)
{
// Yeni işlemi ertele (10021'in sık çıktığı seyrek saatleri otomatik olarak dışlar)
return;
}
FXEA365 tarafından dağıtılan EA'lar, bu spread filtresi, veri filtresi ve fiyat kaynaklı retcode'lar için otomatik retry özelliklerini standart olarak içerir.
Öncelik kontrol listesi
| Öncelik | Kontrol | Çözüm |
|---|---|---|
| 🚨 Önce | Veri açıklaması / ani hareket anlarında mı yoğunlaşıyor | Haber filtresini etkinleştirin, o saatleri normal kabul edin |
| 🚨 Önce | deviation çok mu küçük (birim points) | 10-30 points'e çekin, pips/points karışıklığını kontrol edin |
| ⚠️ Sonra | Rollover, hafta başı, durgun enstrümanlarda mı yoğunlaşıyor | Zaman filtresi + spread filtresi |
| ⚠️ Sonra | Execution yöntemi instant mı | Market execution hesabını da değerlendirin (slipaj ile trade-off) |
| ⚠️ Sonra | Ping yüksek mi (birkaç yüz ms) | Sunucuya yakın bir VPS'e taşıyın |
| 🛠 Geliştirme | Retry yalnızca fiyat kaynaklı retcode'larla mı sınırlı | SymbolInfoTick ile tazeleyip 2-3 denemede durdurun |
Özet
- 10021 (TRADE_RETCODE_PRICE_OFF) "işlenebilecek kotasyon yok" anlamına gelirken, 10004 (TRADE_RETCODE_REQUOTE) "yeni fiyat teklifi" anlamına gelir. MT4 döneminin 136/138 kodlarıyla aynı fiyat reddi ailesindendir; bakiye veya lot sorunu değildir.
- Nedenler ani piyasa hareketi, deviation'ın çok küçük olması, instant execution, kotasyonun seyrek olduğu saat/enstrüman ve bağlantı gecikmesi olmak üzere 5 başlıkta toplanır.
- Requote, instant execution'a özgü bir olgudur; market execution'da bunun yerine slipaj olarak ortaya çıkar. "Çıkmıyor = iyi" değil, bir denge meselesidir.
- EA geliştiricileri, en güncel tick ile tazeleyerek 2-3 kez retry (yalnızca 10004/10021 için) + deviation'ın uygun ayarlanması + zaman/spread filtreleri ile kalıcı çözüm sağlamalıdır. Yalnızca gecikmeden kaynaklanan kısım fiziksel önlemle (broker'a yakın VPS) azaltılabilir.
Hata kodlarının genel listesi için MQL5 / MT5 Hata Kodları Kapsamlı Çözüm Rehberi, bu önlemleri standart olarak uygulayan ücretsiz EA'lar için EA Listesi sayfasına bakabilirsiniz.
SSS
S: 10004 ve 10021'den hangisi daha ciddidir?
İkisi de geçici fiyat kaynaklı hatalardır ve ciddiyet açısından büyük fark yoktur. 10004 "yeni fiyat teklif edildi", 10021 ise "işlenebilecek kotasyon bulunamadı" şeklinde farklı yanıtlardır. Tek seferlik oluşuyorsa göz ardı edilebilir; yalnızca belirli saatlerde veya enstrümanlarda sık sık tekrarlanıyorsa nedeni (veri açıklaması, rollover, deviation, bağlantı) ortadan kaldırın.
S: Hiç requote vermeyen bir broker daha mı iyidir?
Büyük olasılıkla execution yöntemi farkından kaynaklanır. Market execution hesaplarda requote prensip olarak hiç oluşmaz; fiyat hareket ederse sapan fiyattan doğrudan işlem gerçekleşir (slipaj). Reddedilme ile slipaj arasında bir denge söz konusu olduğundan, gerçek slipajı işlem geçmişinden kontrol ederek karar verin.
S: MT4 EA'sında error 136 / 138 alıyorum. Aynı çözümler geçerli mi?
Evet. 136 (ERR_OFF_QUOTES) 10021'e, 138 (ERR_REQUOTE) 10004'e karşılık gelir; nedenleri ve çözümleri ortaktır. MQL4'te yeniden göndermeden önce RefreshRates() çağırarak Bid / Ask değerlerini tazelemek standart yöntemdi; bu, MQL5'te SymbolInfoTick() ile fiyatı tazelemekle aynı mantıktır.
S: Backtest'te çıkmıyor ama canlıda çıkıyor.
Bu normaldir. Strategy Tester'da "emrin sunucuya ulaşmasına kadar geçen gecikme" ve "bu süre içindeki fiyat hareketi" bulunmadığından (veya basitleştirildiğinden), 10004/10021 yalnızca forward (canlı) ortamda ortaya çıkar. Backtest sonuçları iyi olsa bile, canlıda deviation ayarı, retry mekanizması ve çalışma ortamının (VPS) ayrıca düzenlenmesi gerekir.
İlgili
📧 Fiyat artışı öncesi uyarılar + ücretsiz 5 günlük e-posta kursu
Tüm EA'lar lansman fiyatında ve satışlarla birlikte kademeli olarak artıyor. Her artıştan önce bildirim alın; ayrıca algoritmik ticaret, backtest okuma ve broker seçimi üzerine günlük bir e-posta.
* Gizlilik kesinlikle korunur. İstediğiniz zaman abonelikten çıkabilirsiniz.