Ana Sayfa > Blog > MT5 "Not enough money" (134/10019): 7 Neden ve Çözüm

MT5MQL5HataSorun GidermeEATeminat

MT5 "Not enough money" (134/10019): 7 Neden ve Çözüm

Yayınlandı: 2026-06-12Okuma süresi: yaklaşık 6 dk
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

ERR_NO_MONEY (MT5/MQL5) Hatasının Kesin Çözümü

EA çalıştırırken Expert sekmesinde veya Journal'da ERR_NO_MONEY ya da not enough money hatasını gördüğünüzde "paramız mı bitti?" diye endişelenebilirsiniz, ama bu hata bakiyede yeterli miktar olsa bile ortaya çıkabilir. Nedeni sadece "bakiye sıfır" değildir; lot hesaplama, kaldıraç, mevcut pozisyonların yol açtığı teminat kilitlenmesi gibi birçok farklı sebep söz konusu olabilir.

Bu yazı, hem MT5'te EA kullananlar hem de MQL5 ile EA yazanlar için ERR_NO_MONEY hatasının ne olduğunu, 6 farklı nedenini, hemen uygulanabilecek çözümleri, brokere özgü dikkat noktalarını ve kod tarafında kalıcı önlemleri tek bir yazıda toplayan nihai rehberdir. Hata kodlarının tamamı için MQL5 / MT5 Hata Kodları Kapsamlı Çözüm Rehberi sayfasına bakabilirsiniz.

Bu yazı 2026 Haziran itibarıyla MT5'in (4xxx build serisi) güncel sürümünü esas almaktadır. Rakamlar ve ekran isimleri brokere ve build sürümüne göre az miktarda farklılık gösterebilir.


ERR_NO_MONEY Nedir (134 ve 10019 Arasındaki Fark)

MQL5'te "yetersiz bakiye" durumunu ifade eden değer, nereden alındığına bağlı olarak iki farklı türde karşımıza çıkar. Bu ikisini birbirine karıştırmak, kök nedeni bulmayı zorlaştırır.

① ERR_NO_MONEY = 134 (GetLastError() çalışma zamanı hatası)

GetLastError() fonksiyonunun döndürdüğü çalışma zamanı hata koduduur. OrderCalcMargin() veya OrderCalcProfit() gibi hesaplama fonksiyonlarında, ya da eski tarz kodlarda "gerekli teminat, serbest teminatı aşıyor" tespit edildiğinde 134 döner.

Anlamı: İşlem için gerekli para yeterli değil (not enough money)
Sabit  : ERR_NO_MONEY
Değer  : 134

② TRADE_RETCODE_NO_MONEY = 10019 (OrderSend() dönüş kodu)

MQL5'te gerçek emir gönderimi olan OrderSend() fonksiyonunun sonucu MqlTradeResult.retcode içinde döner. Emrin sunucu tarafından reddedildiği "yetersiz bakiye" durumu 134 değil, 10019 (TRADE_RETCODE_NO_MONEY) olarak görünür. Bu, MT5 tarafında bir hata değil, broker sunucusundan gelen ret bildirimidir.

Anlamı: Emri tamamlamak için yeterli para yok (There is not enough money to complete the request)
Sabit  : TRADE_RETCODE_NO_MONEY
Değer  : 10019
// Logda görebileceğiniz tipik çıktı örneği
2026.06.12 09:15:32.441 EA_NAME XAUUSD,H1: OrderSend error 10019

Pratikte ayrım şöyle yapılır:

KaynakDeğerNe zaman görülür
GetLastError()134 (ERR_NO_MONEY)OrderCalcMargin gibi hesaplamalarda, iç kontrollerde
MqlTradeResult.retcode10019 (TRADE_RETCODE_NO_MONEY)OrderSend sunucu tarafından reddedildiğinde
CTrade.ResultRetcode()10019CTrade üzerinden gönderilen emir reddedildiğinde

Logda "134" görüyorsanız hesaplama/iç kontrol aşamasında, "10019" veya Expert sekmesinde not enough money görüyorsanız sunucu reddi aşamasında olduğunuzu anlarsınız. Her iki durumda da kök neden aynıdır (gerekli teminat > kullanılabilir teminat), dolayısıyla çözüm de ortaktır.


Önce 30 Saniyede Yapılabilecek Ayrım

MT5'te "Toolbox → Trade" sekmesinde şu üç değere bakın.

Bakiye (Balance)             : Hesaptaki nakit
Özsermaye (Equity)           : Bakiye ± açık pozisyon kâr/zararı
Serbest Teminat (Free Margin): Şu an yeni işlem için kullanılabilir teminat ← Asıl belirleyici
Teminat Seviyesi (Margin Level %): Equity / Margin × 100
  • Serbest teminat (Free Margin), açmak istediğiniz 1 pozisyon için gerekli teminattan azsa → %100 ERR_NO_MONEY alırsınız.
  • Bakiye yeterli olduğu halde hata alıyorsanız, aşağıda anlatılan "②aşırı lot", "④mevcut pozisyonların teminatı kilitlemesi" veya "⑥hesap tipi farkı" nedenlerinden biridir.

1 pozisyon için gerekli teminatı, MT5'te "Market Watch → sembole sağ tık → Özellikler" üzerinden görebilirsiniz (1 lot için teminat). Kabaca formül şöyledir:

Gerekli Teminat ≈ (Lot × Kontrat Büyüklüğü × Fiyat) / Kaldıraç

Nedenler ve Çözümler (6 Senaryo)

① Gerçekten teminat yetersiz

Belirti: Açık zarar büyümüş, Free Margin yeni işlem için gerekenin altına düşmüş. Art arda kayıplardan sonra veya derin martingale/ortalama düşürme kademelerinde sıkça görülür.

Çözüm:

  1. Ek para yatırın, ya da
  2. Mevcut pozisyonlardan bir kısmını manuel kapatarak teminatı geri kazanın
  3. EA tarafında RiskPercent değerini düşürerek sonraki lotları küçültün

Bu durum tekrar tekrar yaşanıyorsa, sorun genelde lotun bakiyeye göre baştan çok büyük olmasıdır. ②'ye bakın.


② Lot çok büyük (bakiyeye göre)

Belirti: Bakiye yeterli olduğu halde ilk emirden itibaren ERR_NO_MONEY alınıyor. Sabit lot kullanımında sık görülür.

Neden: FixedLot değeri, hesap bakiyesi ve kaldıracıyla uyumsuz. Örneğin 100.000 Yen (≈670 dolar) bakiyeli bir hesapta XAUUSD için 0.1 lot açmaya çalışmak, kaldıraca bağlı olarak gerekli teminatın bakiyeyi aşmasına yol açabilir.

Çözüm:

  1. Sabit lotu minimum (0,01) seviyesine düşürüp açılıp açılmadığını kontrol edin
  2. Risk% otomatik hesaplamaya geçin (UseFixedLot=false / RiskPercent)
  3. 0,01 lot bile açılamıyorsa hesabın kaldıracı veya bakiyesi yetersizdir → ③ ve ⑥'ya bakın

Referans: 100.000 Yen (≈670 dolar) standart hesapta minimum 0,01 lottan başlayabilecek bir tasarım, zorlamasız bir eşiktir. Bu tutarın altında sermayeniz varsa veya daha küçük ve güvenli işlem yapmak istiyorsanız aşağıdaki "mikro (cent) hesap" seçeneğini değerlendirin.


③ Kaldıraç düşük / hafta sonu veya önemli veri öncesi kısıtlanmış

Belirti: Aynı EA, aynı lot başka bir hesapta sorunsuz açılırken bu hesapta ERR_NO_MONEY veriyor. Ya da hata Cuma akşamı ile Pazartesi sabahı arasında yoğunlaşıyor.

Neden: Hesabın kaldıracı düşükse (örneğin 1:30 AB düzenlemeli hesap ile 1:1000 offshore hesap arasında) gerekli teminat onlarca kat farklılaşır. Ayrıca bazı brokerler hafta sonları veya önemli veri açıklamaları öncesinde kaldıracı düşürür (XM hafta sonu kaldıracı 200:1'e sınırlandırır) ve pozisyon açıkken gerekli teminat aniden artabilir. Altın veya kripto gibi enstrümanlarda sembol bazında ayrı kaldıraç üst sınırları da olabilir.

Çözüm:

  1. Hesabın kaldıracını kontrol edin (broker üye paneli / MT5 hesap bilgileri)
  2. Sembol özelliklerindeki "teminat oranını" kontrol edin (bazı enstrümanlarda daha düşük olabilir)
  3. Hafta sonuna pozisyon taşımayan bir ayar kullanın (CloseAllBeforeWeekend=true vb.) veya hafta sonu kaldıraç kısıtlaması olmayan bir brokere geçin
  4. Daha yüksek kaldıraçlı bir hesaba geçin ya da lotu düşürün

④ Mevcut pozisyonlar teminatı kilitliyor

Belirti: İlk pozisyon açıldı ama ikincisinde veya ek kademelerde (ortalama düşürme) ERR_NO_MONEY alınıyor.

Neden: Zaten açık olan pozisyonlar teminatı kilitliyor ve Free Margin yeni işlem için yetersiz kalıyor. Aynı hesapta birden fazla parite veya birden fazla EA çalıştırıldığında sık görülür.

Çözüm:

  1. "Trade" sekmesinde kullanılan teminatı (Margin) ve Free Margin'i kontrol edin
  2. Aynı hesapta çalışan EA'lar teminatı birbirinden çalıyor mu bakın (çoklu EA kullanımında)
  3. Aynı anda açık pozisyon sayısını EA parametresiyle sınırlayın
  4. Ortalama düşürme/grid EA'larında kademe derinleştikçe teminat tüketimi hızlanır → kademe üst sınırı, lot çarpanı ve acil kapatma ayarlarını gözden geçirin

⑤ Bonus/kredi teminata dahil ediliyor

Belirti: "Bakiye + bonus" toplamı yeterli görünüyor ama yine de ERR_NO_MONEY alınıyor.

Neden: Bazı brokerlerde kredi (bonus) teminat hesabına dahil edilmez veya kısmen dahil edilir. Ekranda görünen bakiye ile sunucunun kullandığı teminat farklılaşır.

Çözüm: Broker bonus şartlarında "kredinin teminata dahil edilip edilmediğini" kontrol edin. Dahil edilmiyorsa, sadece gerçek yatırılan miktarla karşılanabilecek bir lota düşürün.


⑥ Hesap tipine göre kontrat büyüklüğü farkı (standart vs cent/mikro)

Belirti: Aynı "0,01 lot" olmasına rağmen hesap değiştirildiğinde aniden ERR_NO_MONEY alınıyor. Ya da tam tersi, lot fazla büyük kalıyor.

Neden: Cent (mikro) hesap ile standart hesap arasında kontrat büyüklüğü yaklaşık 100 kat farklıdır. Cent hesapta 0,01 lot, gerçek maruziyet olarak yaklaşık 1/100'e denk gelir. EA hesap tipini ayırt etmeden sabit lot kullanırsa, bir tarafta teminat yetersizliği ortaya çıkar.

Çözüm:

  1. Küçük ve güvenli işlem yapmak istiyorsanız cent/mikro hesap kullanarak minimum lotta bile aşırı risk almaktan kaçının
  2. EA'yı hesap tipini koda sabitlemeden, OrderCalcMargin() ile gerçek gerekli teminatı hesaplayıp lot belirleyecek şekilde tasarlayın (sonraki bölüm)

Broker Bazında Dikkat Edilmesi Gerekenler

BrokerÖzellikERR_NO_MONEY Sıklığı
XMHafta sonu kaldıraç kısıtlaması var, Stop Out %20Orta (hafta sonları daha yüksek)
ExnessKaldıraç sınırsız hesap seçeneği var, Stop Out %0Düşük
HFM / FXGT vb.Yüksek kaldıraçlı hesap seçenekleri varDüşük

Exness'in kaldıraç sınırsız hesapları (Pro/Raw Spread hesapları), serbest teminat neredeyse sıfır olsa bile yeni emrin geçtiği durumlar sık görülür ve bu hata daha az ortaya çıkar. Ortalama düşürme tabanlı EA'larla uyumu iyi olsa da, stop-out mekanizması etkili çalışmadığından zararın büyümesi kolaylaşan ters bir risk taşır, bu noktaya dikkat edin. Broker karşılaştırması için Broker Karşılaştırma Sayfası sayfasına da bakabilirsiniz.


MQL5'te Bu Hatayı Önleyen Kod (EA Geliştiricileri İçin)

Sadece "düzeltmek" değil, ERR_NO_MONEY hatasını emirden önce baştan engellemek doğru EA tasarımıdır. Buradaki mantık: emir göndermeden önce gerekli teminatı hesaplayıp yetersizse pozisyon açmamak veya lotu küçültmek.

Emirden önce gerekli teminatı kontrol etme

// Emir öncesi kapı: gerekli teminat <= serbest teminat kontrolünü yapıp sonra OrderSend çağır
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()); // 134 vb.
      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;   // Pozisyon açma = ERR_NO_MONEY'i baştan önle
   }
   return true;
}

Lotu minimum/adım değerine normalize etme

Risk% ile hesaplanan değeri olduğu gibi göndermek, minimum lot veya lot adımına uymadığı için reddedilir (normalize edilmemesi, emir reddinin tipik bir nedenidir). Açılamıyorsa vazgeçmek yerine açılabilecek aralığa küçültmek fırsat kaybını azaltır.

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;          // Adıma yuvarla
   lots = MathMax(minLot, MathMin(maxLot, lots)); // Min-max aralığına sıkıştır
   return NormalizeDouble(lots, 2);
}

OrderSend'in retcode değerini mutlaka kontrol edin

OrderSend() fonksiyonunun dönüş değerine (bool) ek olarak result.retcode değerine de bakıp 10019'u (TRADE_RETCODE_NO_MONEY) ayrıca yönetin.

MqlTradeRequest req; MqlTradeResult res;
ZeroMemory(req); ZeroMemory(res);
// ... req oluşturulur ...
if(!OrderSend(req, res) || res.retcode != TRADE_RETCODE_DONE)
{
   if(res.retcode == TRADE_RETCODE_NO_MONEY)   // 10019
      Print("Not enough money. Lotu küçültün veya para yatırın.");
   else
      PrintFormat("OrderSend failed: retcode=%d, lastError=%d", res.retcode, GetLastError());
}

CTrade kullanıyorsanız trade.ResultRetcode() değerinin 10019 olup olmadığını, veya trade.ResultRetcodeDescription() ile açıklamasını kontrol edebilirsiniz.

Teminat seviyesine göre acil durdurma

Teminat seviyesi belirli bir yüzdenin altına düştüğünde yeni emirleri durduran/tüm pozisyonları kapatan bir güvenlik mekanizması eklemek, hem ardı ardına ERR_NO_MONEY almayı hem de hesabın erimesini önler.

double level = AccountInfoDouble(ACCOUNT_MARGIN_LEVEL); // Teminat seviyesi %
if(level > 0 && level < EmergencyMarginLevel)          // Örn: %150
{
   // Yeni giriş yapmayı durdur / gerekirse mevcut pozisyonların bir kısmını kapat
}

FXEA365'in sunduğu EA'lar, bu "risk% otomatik lot", "emir öncesi teminat kontrolü" ve "teminat seviyesine göre acil durdurma" (UseMarginEmergencyClose) özelliklerini standart olarak uyguladığı için minimum sermayeyle bile zorlanmadan çalıştırılabilir.


Öncelik Sıralı Kontrol Listesi

ÖncelikKontrolÇözüm
🚨 ÖnceSerbest teminat < gerekli teminat mıPara yatır / kısmi kapat / lotu düşür
🚨 ÖnceSabit lot bakiyeye göre aşırı büyük mü0,01'e düşür / risk% otomatiğe geç
⚠️ SonraHesap kaldıracı düşük mü, hafta sonu kısıtlaması var mıYüksek kaldıraçlı hesap / hafta sonu kapatma / lotu düşür
⚠️ SonraMevcut pozisyon veya diğer EA'lar teminatı kilitliyor muAynı hesaptaki açık pozisyonları düzenle
✅ KontrolCent/standart kontrat büyüklüğü farkıHesap tipine uygun lota geç
🛠 GeliştirmeEmirden önce OrderCalcMargin ile korumaYukarıdaki kodu uygula

Özet

  • ERR_NO_MONEY hatasının 134 (GetLastError) ve 10019 (OrderSend'in retcode değeri = TRADE_RETCODE_NO_MONEY) olmak üzere iki farklı görünümü vardır, ancak kök neden ortaktır: "gerekli teminat > kullanılabilir teminat".
  • Bakiye yeterli olsa bile aşırı lot, düşük kaldıraç (hafta sonu kısıtlaması dahil), mevcut pozisyonların teminatı kilitlemesi ve hesap tipi farkı nedeniyle ortaya çıkabilir.
  • EA kullanıcıları "risk% otomatik lot" ve "uygun hesap tipi" seçimiyle önleyebilir; EA geliştiricileri ise "emir öncesi OrderCalcMargin kapısı", "lot normalizasyonu" ve "retcode 10019 yönetimi" ile kalıcı çözüm uygulayabilir.

Hata kodlarının tamamı için MQL5 / MT5 Hata Kodları Kapsamlı Çözüm Rehberi sayfasına, zorlamasız bir sermaye ile çalışan ücretsiz EA'lar için EA Listesi sayfasına bakabilirsiniz. Sitemizin EA'sını kullanıyorsanız ve ayar değişikliğiyle sorun çözülmüyorsa, destek formundan hesabınızın teminat durumuna ait ekran görüntüsünü ekleyerek bizimle iletişime geçebilirsiniz.


Sıkça Sorulan Sorular

S: Bakiye yeterli olduğu halde ERR_NO_MONEY alıyorum. Neden?

Çünkü değerlendirme bakiyeye (Balance) göre değil, serbest teminata (Free Margin) göre yapılır. Açık zarar veya mevcut pozisyonların teminatı kilitlemesi nedeniyle Free Margin azalmışsa, bakiye yeterli olsa bile yeni pozisyon açılamaz. "Trade" sekmesindeki Free Margin değerini kontrol edin.

S: 134 ile 10019 arasındaki fark nedir?

134 (ERR_NO_MONEY), GetLastError() fonksiyonunun döndürdüğü çalışma zamanı hatasıdır; 10019 (TRADE_RETCODE_NO_MONEY) ise OrderSend() fonksiyonunun sonucudur (retcode). Sadece ortaya çıktıkları yer farklıdır, neden (yetersiz teminat) aynıdır.

S: Backtest'te çıkmıyor ama canlıda çıkıyor.

Canlı hesabın kaldıracı, hesap tipi (cent/standart) ve mevcut pozisyonları test ayarlarından farklı olduğu için oluşur. Özellikle kaldıraç farkı ve kontrat büyüklüğü farkı büyük etki yapar.

S: Ortalama düşürme/grid EA'sında kademe derinleştikçe ERR_NO_MONEY alıyorum.

Bu, normal davranışın bir adım öncesidir. Kademe arttıkça teminat tüketimi hızlanır. Kademe üst sınırını ve lot çarpanını düşürün, UseMarginEmergencyClose gibi acil kapatma özelliklerini mutlaka etkinleştirin ve sadece kaybetmeyi göze alabileceğiniz sermaye ile işlem yapın.

S: EA kodunda otomatik olarak önlenebilir mi?

Evet, önlenebilir. Emirden önce OrderCalcMargin() ile gerekli teminatı hesaplayıp AccountInfoDouble(ACCOUNT_MARGIN_FREE) değerini aşıyorsa pozisyon açmayan (veya lotu küçülten) bir kapı ekleyin. Metindeki kod örneğine bakabilirsiniz.

S: En az ne kadar sermaye ile zorlanmadan başlanabilir?

100.000 Yen (≈670 dolar) standart hesapta minimum 0,01 lottan başlamak, zorlamasız bir eşiktir. Bundan daha az sermayeniz varsa veya daha güvenli işlem yapmak istiyorsanız cent (mikro) hesap kullanmak, minimum lotta bile gerçek maruziyeti küçültüp ERR_NO_MONEY hatasından kaçınmayı kolaylaştırır.

📧 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.

Yorumlar ve sorular