MT5 "Not enough money" (10019/134): 6 Neden ve Çözüm
İçindekiler
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.
Ö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ç
Önerilen Broker Karşılaştırma →
🎁 Ücretsiz EA İndir📧 Ücretsiz e-posta kursu (8 e-posta) + abonelere özel 13 MT5 göstergesi paketi
* Gizlilik kesinlikle korunur. İstediğiniz zaman abonelikten çıkabilirsiniz.
ERR_NO_MONEY nedir (MT5'te 10019, MT4'te 134)
ERR_NO_MONEY yaygın kullanılan bir kısaltmadır, resmi bir sabit değildir: ne MQL5 ne de MQL4 referansı bu adı tanımlar. Resmi ad ve numara platforma göre değişir (MQL5: işlem sunucusu dönüş kodları, MQL4: hata kodları).
① MT5: TRADE_RETCODE_NO_MONEY = 10019 (işlem sunucusu dönüş kodu)
MQL5'te OrderSend() sonucu MqlTradeResult.retcode alanına yazılır. Sunucu emri yetersiz bakiye nedeniyle reddettiğinde kod 10019 (TRADE_RETCODE_NO_MONEY) olur. Bu, broker sunucusundan gelen bir ret bildirimidir. OrderCheck() göndermeden önce bakiyeyi kontrol eder ve sonucu MqlTradeCheckResult.retcode alanına yazar.
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
② MT4: ERR_NOT_ENOUGH_MONEY = 134 (MQL4'te GetLastError())
134, MT4 (MQL4) numarasıdır. MQL5'te GetLastError() tarafından döndürülen çalışma zamanı hataları listesinde ne 134 ne de yetersiz bakiye için bir kod vardır; MT5'te retcode değerine bakın.
Anlamı: İşlem için gerekli para yeterli değil (not enough money)
Sabit : ERR_NOT_ENOUGH_MONEY
Değer : 134 (MT4)
Pratikte ayrım şöyle yapılır:
| Kaynak | Değer | Ne zaman görülür |
|---|---|---|
MqlTradeResult.retcode (MT5) | 10019 (TRADE_RETCODE_NO_MONEY) | OrderSend sunucu tarafından reddedildiğinde |
CTrade.ResultRetcode() (MT5) | 10019 | CTrade üzerinden gönderilen emir reddedildiğinde |
GetLastError() (MT4) | 134 (ERR_NOT_ENOUGH_MONEY) | OrderSend (MT4 / MQL4) |
Günlükte «10019» veya not enough money görünüyorsa emri MT5 işlem sunucusu reddetmiştir; «134» ise bir MT4 terminalinden veya MT4 EA'sından gelir. Kök neden aynıdır (gerekli teminat > kullanılabilir teminat), bu yüzden çözümler ortaktır.
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());
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
- MT5'te yetersiz bakiye 10019 (TRADE_RETCODE_NO_MONEY) kodudur; 134 (ERR_NOT_ENOUGH_MONEY) MT4 numarasıdır ve
ERR_NO_MONEYher ikisi için kullanılan bir kısaltmadır. Her iki durumda da neden aynıdı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?
10019 (TRADE_RETCODE_NO_MONEY), MT5'te OrderSend() sonucunda gelen işlem sunucusu dönüş kodudur; 134 (ERR_NOT_ENOUGH_MONEY) ise MT4'te GetLastError() tarafından döndürülen hatadır. Yalnızca platform farklıdır; neden (yetersiz bakiye) 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
📧 Ücretsiz e-posta kursu (8 e-posta) + abonelere özel 13 MT5 göstergesi paketi
* Gizlilik kesinlikle korunur. İstediğiniz zaman abonelikten çıkabilirsiniz.
EA'lar veya Forex hakkında bir sorunuz mu var?
Sorunuzu Nattzy'nin trading forumunda paylaşabilirsiniz (ücretsiz kayıt). Bu yazının dışındaki sorular da olur — EA ayarları, aracı kurum seçimi ve daha fazlası.
Nattzy'de sor ↗