Fan sayfamıza katılın
Öyleyse bir link gönderin -
başkalarının da faydalanmasını sağlayın
- Görüntülemeler:
- 43
- Derecelendirme:
- Yayınlandı:
-
Bu koda dayalı bir robota veya göstergeye mi ihtiyacınız var? Freelance üzerinden sipariş edin Freelance'e git
Güncelleme:
Uzman danışmanlarımı optimize etmek için kullandığım bu kütüphanede önemli bir güncelleme yaptım. Bu sürüm modernize edilmiştir, ancak otomatikleştirmek isteyebileceğiniz günlük görevleri içerecek şekilde kolayca genişletebilirsiniz. Örneğin, başarısız bir prop firması mücadelesinden sonra ticarete kısıtlamalar ekleyebilir veya başarılı ya da başarısız bir mücadeleden sonra Pazartesi günü ticarete devam edebilirsiniz.
Bu kütüphanede yapılan tüm değişiklikler ve eklemeler kodun sonunda özetlenmiştir. Bu çerçeve esnektir ve ister alım satım kısıtlamaları için daha karmaşık mantık eklemek, ister alım satımları planlamak veya optimizasyon sonuçlarına göre performansa ince ayar yapmak olsun, özel ihtiyaçlarınıza göre uyarlanabilir.
Rutin görevleriniz için daha fazla özelleştirmekten çekinmeyin!
Bu kütüphane, MetaTrader 5'teki Uzman Danışmanları (EA'lar) özel firma ticaret gereksinimlerine odaklanarak test etmek için tasarlanmıştır. Amaç, yatırımcının bir firmanın mücadelesini geçmek için belirli kar ve zarar eşiklerini karşılaması gereken ticaret ortamlarını simüle etmektir. EA, birçok prop firmasının kurallarını taklit ederek, belirtilen kar veya zarar yüzdelerine ulaşıldığında hesap bakiyesini başlangıç değerine sıfırlayarak ayarlar.
BalanceReset.mqh kütüphanesini kullanan Uzman Danışman (EA) için eksiksiz yapı aşağıda verilmiştir. Bu kurulum, denge sıfırlama mantığını doğrudan EA'ya entegre ederken, #include yönergesi aracılığıyla işlevlerin temiz bir şekilde ayrılmasını sağlar:
#include <BalanceReset.mqh> // Bakiye sıfırlama kütüphanesini dahil edin //+------------------------------------------------------------------+ //| Uzman başlatma işlevi| //+------------------------------------------------------------------+ int OnInit() { InitBalance(); // Başlangıç bakiyesini başlatın return INIT_SUCCEEDED; } //+------------------------------------------------------------------+ //| Uzman tik fonksiyonu| //+------------------------------------------------------------------+ void OnTick() { CheckBalanceAndReset(); // Eşik değerlere göre bakiyeyi kontrol edin ve sıfırlayın } //+------------------------------------------------------------------+ //| Uzman başlangıçtan kaldırma işlevi| //+------------------------------------------------------------------+ void OnDeinit(const int reason) { PrintBalanceResetResults(); // Bakiye sıfırlama sonuçlarının günlüğe çıktısı }
Temel Fonksiyonlar
-
Ayarlanabilir Kar ve Zarar Eşikleri
- Kütüphane, geriye dönük test işlemi sırasında bakiye sıfırlamalarını tetikleyen kar ve zarar eşiklerini ayarlamanıza olanak tanır. Bu eşikler, test koşullarını özelleştirmeyi kolaylaştıran giriş parametreleri kullanılarak değiştirilebilir.
Örnek:
input double profit_threshold = 8.0; // Kâr eşiği, varsayılan değer %8'dir input double loss_threshold = -6.0; // Kayıp eşiği, varsayılan -%6'dır
2. İlk Bakiye Başlatma
- Bu fonksiyon testin başlangıcındaki ilk hesap bakiyesini saklar. İlk başlangıç bakiyesini yakalamak için yalnızca ilk tikte çalışır.
Örnek:
void InitBalance() { initial_balance = AccountInfoDouble(ACCOUNT_BALANCE); // Başlangıç bakiyesinin saklanması }
3. Denge Sıfırlama Mantığı
- Kütüphanenin çekirdeği, kar veya zarar yüzdesini hesaplamak için mevcut bakiyeyi başlangıç bakiyesine göre kontrol eder. Kâr belirtilen eşiği aşarsa (örn. %8) veya zarar eşiği aşarsa (örn. -%6), bakiye başlangıç değerine sıfırlanır.
- Kâr sıfırlama: TesterWithdrawal fonksiyonu, kar eşiğine ulaşıldığında bakiyeyi başlangıç değerine geri getirmek için fazla miktarı çekmek için kullanılır.
- Zarar sıfırlama: TesterDeposit işlevi, kayıp eşiği tetiklendiğinde bakiyeyi başlangıç tutarına geri yükler.
Örnek:
void CheckBalanceAndReset() { double current_balance = AccountInfoDouble(ACCOUNT_BALANCE); if (initial_balance == 0) { initial_balance = current_balance; // İlk tik, başlangıç bakiyesini sakla } double profit_percentage = (current_balance - initial_balance) / initial_balance * 100.0; if (profit_percentage >= profit_threshold) { double withdrawal_amount = current_balance - initial_balance; if (TesterWithdrawal(withdrawal_amount)) { successful_resets++; ArrayResize(reset_times, ArraySize(reset_times) + 1); reset_times[ArraySize(reset_times) - 1] = TimeCurrent(); Print("Profit reached. Balance has been reset to the initial value."); } } if (profit_percentage <= loss_threshold) { double deposit_amount = initial_balance - current_balance; if (TesterDeposit(deposit_amount)) { unsuccessful_resets++; ArrayResize(reset_times, ArraySize(reset_times) + 1); reset_times[ArraySize(reset_times) - 1] = TimeCurrent(); Print("Loss reached. Balance has been reset to the initial value."); } } }
4. Sonuç Günlüğü
- Test tamamlandıktan sonra, bu fonksiyon başarılı sıfırlamaların sayısını (hem kar hem de zarar için) ve her sıfırlama arasındaki gün sayısını verir. Bu, test sırasında terazi sıfırlamalarının ne sıklıkta gerçekleştiğine dair bilgi sağlar.
Örnek:
void PrintBalanceResetResults() { PrintFormat("Number of successful profit resets: %d", successful_resets); PrintFormat("Number of successful loss resets: %d", unsuccessful_resets); for (int i = 1; i < ArraySize(reset_times); i++) { int days_between_resets = (reset_times[i] - reset_times[i-1]) / 86400; // Bir günde 86400 saniye PrintFormat("Days between reset %d and reset %d: %d days", i, i + 1, days_between_resets); } }
Sonuç
Bu kütüphane, yaygın özel ticaret firması gereksinimlerine uyan bir ticaret ortamının simüle edilmesine yardımcı olur. Önceden tanımlanmış kar ve zarar eşikleri karşılandığında bakiyeyi sıfırlayarak, yatırımcıların stratejilerini daha etkili bir şekilde test etmelerine ve EA'larının performansını prop firması kurallarına göre analiz etmelerine olanak tanır.
Kod Değişikliklerinin ve İlavelerinin Açıklaması:
Yeni kod, eski koda kıyasla çeşitli geliştirmeler ve eklemeler içermektedir. Aşağıda nelerin eklendiğine ve değiştirildiğine dair ayrıntılı bir açıklama yer almaktadır:
Yeni Giriş Parametreleri:
-
max_loss ve min_won :
input double max_loss = 1; // Maksimum kayıp input double min_won = 1; // Min kazandı
Amaç: Bu giriş parametreleri izin verilen maksimum zararı ( max_loss ) ve gereken minimum başarılı kar sıfırlama sayısını ( min_won ) ayarlamanıza olanak tanır. Optimizasyon koşulları üzerinde daha fazla kontrol sağlarlar.
Ek Değişkenler:
-
reset_status[] :
string reset_status[]; // Her sıfırlamanın durumunu saklamak için dizi
Amaç: Her bakiye sıfırlama olayının durumunu ("Kar sıfırlama" veya "Zarar sıfırlama") saklamak için eklenen bir dizi.
stopOptimizasyon :
bool stopOptimization = false;
Amaç: Optimizasyonun belirli koşullara bağlı olarak ne zaman durdurulması gerektiğini belirtmek için kullanılan bir bayrak.
badResult :
bool badResult = false; // Kötü optimizasyon sonucunu gösteren bayrak
Amaç: Optimizasyon sonucunu olumsuz olarak işaretlemek için OnTester() içinde sonucu etkilemek için kullanılabilecek bir bayrak.
CheckBalanceAndReset() işlevindeki değişiklikler :
-
Kayıt Sıfırlama Durumu:
ArrayResize(reset_status, ArraySize(reset_status) + 1); // Sıfırlama durumunu kaydetmek için diziyi yeniden boyutlandırın reset_status[ArraySize(reset_status) - 1] = "Profit reset"; // Durumu kaydedin
Amaç: Bir kar sıfırlaması gerçekleştiğinde, durum reset_status[] dizisine kaydedilir.
Optimizasyon Durdurma Koşulu ile Kayıp Sıfırlamalarının İşlenmesi:
if (TesterDeposit(deposit_amount)) { unsuccessful_resets++; // Başarısız kayıp sıfırlamaları için sayacı artırın // Sıfırlama zamanını ve durumunu kaydedin ArrayResize(reset_status, ArraySize(reset_status) + 1); reset_status[ArraySize(reset_status) - 1] = "Loss reset"; { stopOptimization = true; CheckStopCondition(); // Optimizasyonun durdurulup durdurulmayacağını kontrol edin } PrintFormat("Loss reached. Balance has been reset to the initial value."); }
Amaç: Bir kayıp sıfırlamasından sonra kod artık unsuccessful_resets değerini artırır, durumu kaydeder, stopOptimization değerini true olarak ayarlar ve optimizasyonun durdurulup durdurulmayacağını belirlemek için CheckStopCondition() işlevini çağırır.
Yeni Fonksiyon CheckStopCondition() :
void CheckStopCondition() { if(stopOptimization) { Print("Stopping current optimization pass"); badResult = true; // Sonucu kötü olarak işaretle TesterStop(); } }
Amaç: Bu fonksiyon stopOptimization işlevinin doğru olup olmadığını kontrol eder ve doğruysa sonucu kötü olarak işaretler ve TesterStop() işlevini kullanarak mevcut optimizasyon geçişini durdurur.
Yeni Fonksiyon OnTester() :
double OnTester() { // Başarılı sıfırlama sayısı gereken minimum sayıdan azsa veya badResult ayarlanmışsa if(successful_resets < min_won || badResult) { Print("Optimization failed: returning a highly unfavorable result."); // Optimizasyon geçişini bozmak için oldukça elverişsiz bir sonuç döndür return -999999; } // Başarılı ve başarısız sıfırlamalar arasındaki farkı hesaplayın int reset_difference = successful_resets - unsuccessful_resets; // Farkın negatif olup olmadığını kontrol edin if(reset_difference < 0) { Print("Negative difference between successful and unsuccessful resets. Returning a highly unfavorable result."); // Fark negatifse oldukça olumsuz bir sonuç döndürür return -999999; } // Farkı günlüğe çıktı olarak ver PrintFormat("Difference between successful and unsuccessful resets: %d", reset_difference); // Farkı test edenin sonucu olarak döndür return reset_difference; }
Amaç: Bu fonksiyon optimizasyon süreci için özel bir kriter sağlar. Başarılı sıfırlama sayısının minimum gereksinimi karşılayıp karşılamadığını veya sonucun kötü olup olmadığını kontrol eder. Başarılı ve başarısız sıfırlamalar arasındaki farkı hesaplar ve fark negatif olmadığı sürece bu değeri döndürür, bu durumda optimize ediciyi etkilemek için oldukça elverişsiz bir sonuç döndürür.
PrintBalanceResetResults() işlevindeki geliştirmeler:
// Her sıfırlamanın tarihini ve aralarındaki gün sayısını çıktı olarak alın for(int i = 1; i < ArraySize(reset_times); i++) { // Sıfırlamalar arasındaki gün sayısını hesaplayın int days_between_resets = (reset_times[i] - reset_times[i-1]) / 86400; // Bir günde 86400 saniye // Sıfırlama tarihlerini, durumu ve aralarındaki günleri yazdır PrintFormat("Reset %d: %s (%s), Reset %d: %s (%s), Days between: %d days", i, TimeToString(reset_times[i-1], TIME_DATE), reset_status[i-1], i + 1, TimeToString(reset_times[i], TIME_DATE), reset_status[i], days_between_resets); }
Amaç: Fonksiyon artık yalnızca sıfırlama sayısını değil, aynı zamanda tarih, durum ve sıfırlamalar arasındaki gün sayısı dahil olmak üzere her sıfırlama olayının ayrıntılarını da verir. Bu, sıfırlama faaliyetlerinin daha kapsamlı bir kaydını sağlar.
Değişkenlerin Başlatılması ve Kullanımı:
-
İlk Bakiye Kontrolü:
if(initial_balance == 0) { initial_balance = current_balance; }
Amaç: initial_balance'ın ilk tikte doğru şekilde ayarlanmasını sağlar.
Kâr Yüzdesi Hesaplaması:
double profit_percentage = (current_balance - initial_balance) / initial_balance * 100.0;
Amaç: Başlangıç bakiyesine göre kar veya zarar yüzdesini hesaplar.
Eklemelerin Özeti:
-
Optimizasyon Süreci Üzerinde Kontrol:
- Kod artık maksimum başarısız sıfırlama sayısının aşılması veya minimum başarılı sıfırlama sayısına ulaşılamaması gibi belirli koşullara bağlı olarak optimizasyon sürecini durduracak mekanizmalar içermektedir.
-
Geliştirilmiş Günlük ve İzleme:
- PrintBalanceResetResults() işlevine reset_status[] ve ayrıntılı günlük kaydı eklenmesi, sıfırlama olaylarının ve sonuçlarının daha iyi izlenmesini sağlar.
-
OnTester() aracılığıyla Optimizer ile entegrasyon:
- Kod, OnTester() işlevini uygulayarak sonuçları optimizasyon motoruna geri iletebilir ve özel kriterlere dayalı parametre setlerinin seçimini etkileyebilir.
MetaQuotes Ltd tarafından İngilizceden çevrilmiştir.
Orijinal kod: https://www.mql5.com/en/code/52163

Adını tarihi bir figür olan Giuseppe Tardio'dan alan TardioBot V1.05, üçgen arbitraj stratejisi kullanan MetaTrader 5 için tasarlanmış bir Uzman Danışmandır.

Doğrusal regresyon algoritması kullanan hareketli ortalama.

John Ehlers tarafından yazılan "Hisse Senetleri ve Vadeli İşlemler için Sibernetik Analiz: İşlemlerinizi Geliştirmek için En İleri DSP Teknolojisi" kitabından iki hareketli ortalama göstergesi.

John Ehlers'ın "Cybernetic Analysis for Stocks and Futures: Cutting-Edge DSP Technology to Improve Your Trading" kitabından bir grafik üzerinde iki hareketli ortalamanın (Lead ve onun EMA ortalaması) bir göstergesi.