MT5 "Not enough money" (134/10019): 7 Neden ve Çözüm
İçindekiler
- ERR_NO_MONEY Nedir (134 ve 10019 Arasındaki Fark)
- ① ERR_NO_MONEY = 134 (`GetLastError()` çalışma zamanı hatası)
- ② TRADE_RETCODE_NO_MONEY = 10019 (`OrderSend()` dönüş kodu)
- Önce 30 Saniyede Yapılabilecek Ayrım
- Nedenler ve Çözümler (6 Senaryo)
- ① Gerçekten teminat yetersiz
- ② Lot çok büyük (bakiyeye göre)
- ③ Kaldıraç düşük / hafta sonu veya önemli veri öncesi kısıtlanmış
- ④ Mevcut pozisyonlar teminatı kilitliyor
- ⑤ Bonus/kredi teminata dahil ediliyor
- ⑥ Hesap tipine göre kontrat büyüklüğü farkı (standart vs cent/mikro)
- Broker Bazında Dikkat Edilmesi Gerekenler
- MQL5'te Bu Hatayı Önleyen Kod (EA Geliştiricileri İçin)
- Emirden önce gerekli teminatı kontrol etme
- Lotu minimum/adım değerine normalize etme
- OrderSend'in retcode değerini mutlaka kontrol edin
- Teminat seviyesine göre acil durdurma
- Öncelik Sıralı Kontrol Listesi
- Özet
- Sıkça Sorulan Sorular
- S: Bakiye yeterli olduğu halde ERR_NO_MONEY alıyorum. Neden?
- S: 134 ile 10019 arasındaki fark nedir?
- S: Backtest'te çıkmıyor ama canlıda çıkıyor.
- S: Ortalama düşürme/grid EA'sında kademe derinleştikçe ERR_NO_MONEY alıyorum.
- S: EA kodunda otomatik olarak önlenebilir mi?
- S: En az ne kadar sermaye ile zorlanmadan başlanabilir?
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:
| Kaynak | Değer | Ne zaman görülür |
|---|---|---|
GetLastError() | 134 (ERR_NO_MONEY) | OrderCalcMargin gibi hesaplamalarda, iç kontrollerde |
MqlTradeResult.retcode | 10019 (TRADE_RETCODE_NO_MONEY) | OrderSend sunucu tarafından reddedildiğinde |
CTrade.ResultRetcode() | 10019 | CTrade ü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:
- Ek para yatırın, ya da
- Mevcut pozisyonlardan bir kısmını manuel kapatarak teminatı geri kazanın
- EA tarafında
RiskPercentdeğ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:
- Sabit lotu minimum (0,01) seviyesine düşürüp açılıp açılmadığını kontrol edin
- Risk% otomatik hesaplamaya geçin (
UseFixedLot=false/RiskPercent) - 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:
- Hesabın kaldıracını kontrol edin (broker üye paneli / MT5 hesap bilgileri)
- Sembol özelliklerindeki "teminat oranını" kontrol edin (bazı enstrümanlarda daha düşük olabilir)
- Hafta sonuna pozisyon taşımayan bir ayar kullanın (
CloseAllBeforeWeekend=truevb.) veya hafta sonu kaldıraç kısıtlaması olmayan bir brokere geçin - 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:
- "Trade" sekmesinde kullanılan teminatı (Margin) ve Free Margin'i kontrol edin
- Aynı hesapta çalışan EA'lar teminatı birbirinden çalıyor mu bakın (çoklu EA kullanımında)
- Aynı anda açık pozisyon sayısını EA parametresiyle sınırlayın
- 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:
- Küçük ve güvenli işlem yapmak istiyorsanız cent/mikro hesap kullanarak minimum lotta bile aşırı risk almaktan kaçının
- 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 | Özellik | ERR_NO_MONEY Sıklığı |
|---|---|---|
| XM | Hafta sonu kaldıraç kısıtlaması var, Stop Out %20 | Orta (hafta sonları daha yüksek) |
| Exness | Kaldıraç sınırsız hesap seçeneği var, Stop Out %0 | Düşük |
| HFM / FXGT vb. | Yüksek kaldıraçlı hesap seçenekleri var | Düşü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
| Öncelik | Kontrol | Çözüm |
|---|---|---|
| 🚨 Önce | Serbest teminat < gerekli teminat mı | Para yatır / kısmi kapat / lotu düşür |
| 🚨 Önce | Sabit lot bakiyeye göre aşırı büyük mü | 0,01'e düşür / risk% otomatiğe geç |
| ⚠️ Sonra | Hesap kaldıracı düşük mü, hafta sonu kısıtlaması var mı | Yüksek kaldıraçlı hesap / hafta sonu kapatma / lotu düşür |
| ⚠️ Sonra | Mevcut pozisyon veya diğer EA'lar teminatı kilitliyor mu | Aynı hesaptaki açık pozisyonları düzenle |
| ✅ Kontrol | Cent/standart kontrat büyüklüğü farkı | Hesap tipine uygun lota geç |
| 🛠 Geliştirme | Emirden önce OrderCalcMargin ile koruma | Yukarıdaki kodu uygula |
Özet
ERR_NO_MONEYhatası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
OrderCalcMarginkapı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.
İ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.