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:
- 156
- Derecelendirme:
- Yayınlandı:
-
Bu koda dayalı bir robota veya göstergeye mi ihtiyacınız var? Freelance üzerinden sipariş edin Freelance'e git
CDebugLogger Sınıfı V2: MQL4/5 için Kapsamlı Bir Günlüğe Kaydetme Yardımcı Programı
CDebugLogger sınıfı, MQL4/5 ortamları için özel olarak tasarlanmış güçlü ve esnek bir günlük tutma aracıdır. Uygulamalarının davranışlarını hassas bir şekilde izlemesi, hata ayıklaması ve takip etmesi gereken geliştiriciler için önemli bir araçtır.
CDebugLogger sınıfının bu yeni sürümünde, işlevselliğini ve çok yönlülüğünü artırmak için çeşitli iyileştirmeler yaptım. Bu iyileştirmeler arasında OnTick, OnTimer ve OnChartEvent gibi olay odaklı sistemlerde aşırı günlük kaydını önlemek için bir debounce mekanizmasının yanı sıra geliştiricilerin en alakalı günlük girdilerine odaklanmasına yardımcı olmak için yeni filtreleme ve susturma seçenekleri yer alıyor.
Kullanıcılara ihtiyaçlarına en uygun uygulamayı seçme özgürlüğü vermek için bu güncellenmiş sürümü ayrı bir kod tabanı olarak yayınlamaya karar verdim. İster orijinal sürümü ister bu geliştirilmiş sürümü tercih edin, artık iş akışınıza ve proje gereksinimlerinize uygun günlük aracını seçme seçeneğine sahipsiniz.
Aşağıda, bu gelişmiş sınıfın temel özelliklerini ve yeteneklerini keşfediyoruz.
Temel Özellikler
- Çoklu Günlük Seviyeleri: CDebugLogger sınıfı INFO, WARNING, ERROR ve DEBUG dahil olmak üzere farklı önem seviyelerinde günlük tutmayı destekler. Bu, geliştiricilerin belirli öneme sahip mesajları filtrelemesine ve bunlara odaklanmasına olanak tanır.
- Zaman Damgası Ekleme: Geliştiriciler, özelleştirilebilir formatlarla günlük mesajlarına zaman damgası eklemeyi seçebilirler. Bu özellik, olayların tam zamanını izlemek ve zamana duyarlı sorunlarda hata ayıklamak için çok önemlidir.
- Dosya Günlüğü: Sınıf, dosyalara günlük kaydı için güçlü destek sağlar. Geliştiriciler dosya günlüğünü etkinleştirebilir veya devre dışı bırakabilir, günlük dosyasının yolunu belirleyebilir ve günlüklerin ortak bir klasöre kaydedilip kaydedilmeyeceğini seçebilir. Ayrıca, günlükler CSV formatında kaydedilerek ayrıştırılmaları ve analiz edilmeleri kolaylaştırılabilir.
- Bağlamsal Bilgi: Günlük mesajlarının netliğini artırmak için CDebugLogger sınıfı fonksiyon imzalarının, dosya adlarının ve satır numaralarının eklenmesine izin verir. Bu bağlamsal bilgiler, kod içindeki sorunların tam yerini belirlemeye yardımcı olur.
- Sessiz Anahtar Kelimeler: Bu sınıfın benzersiz bir özelliği, belirli anahtar kelimeler içeren günlükleri susturma yeteneğidir. Bu özellikle parolalar veya gizli veriler gibi hassas bilgilerin günlüğe kaydedilmesini önlemek için kullanışlıdır.
- Anahtar Kelimeleri Filtrele: Bu sınıfın bir diğer benzersiz özelliği de belirli anahtar kelimeler içeren günlükleri filtreleyebilmesidir. Bu, özellikle yalnızca belirli sorunlarla ilgili günlüklere odaklanarak hata ayıklama için kullanışlıdır. Geliştiriciler, günlük çıktısını yalnızca belirli terimleri içeren mesajları içerecek şekilde daraltabilir, böylece ilgisiz günlük girdileri tarafından boğulmadan bu terimlerle ilgili sorunları tanımlamayı ve ele almayı kolaylaştırır.
- Olaylar için Günlük Kaydında Debounce: Olay güdümlü sistemlerde (OnTick, OnTimer ve OnChartEvent gibi) günlük spam'lerini ve aşırı günlük kaydını önlemek için CDebugLogger sınıfı bir debouncing mekanizması içerir. Bu özellik, aynı olaydan tekrarlanan günlük girdilerinin geçici olarak bastırılmasını sağlayarak yalnızca benzersiz veya önemli değişikliklerin günlüğe kaydedilmesine olanak tanır. Bu, özellikle günlüklerdeki gürültüyü azaltmak ve yüksek frekanslı olay ortamlarında performans düşüşünü önlemek için kullanışlıdır.
Örnek Kullanım
Aşağıda, CDebugLogger sınıfının nasıl başlatılacağı ve kullanılacağına ilişkin bir örnek yer almaktadır:
// Logger'ı INFO seviyesinde bir dosyaya günlük tutacak şekilde başlatın CDebugLogger logger(INFO, true, "log.txt", true, TIME_DATE | TIME_MINUTES, false, true, true, true); // Basit bir mesaj günlüğe kaydedin logger.Log(INFO, "This is an info message"); // Bir anahtar sözcüğü susturun logger.AddSilentKeyword("password"); // Susturulacak bir mesaj kaydedin logger.Log(INFO, "User entered password: 1234"); // Dosya günlüğünü etkinleştir logger.EnableFileLogging(true, "debug.log", false); // Susturulmuş bir anahtar sözcüğü kaldırın logger.RemoveSilentKeyword("password"); // Anahtar kelimeyi sessizlik listesinden çıkardıktan sonra bir mesaj günlüğe kaydedin logger.Log(INFO, "User entered password: 1234"); // Günlükleri filtrelemek için bir anahtar sözcük ekleyin logger.AddFilterKeyword("success"); // Filtrelenecek bir mesajı günlüğe kaydedin logger.Log(INFO, "Operation failed"); // Filtreyi geçecek bir mesaj günlüğe kaydedin logger.Log(INFO, "Operation successful"); // Filtreden bir anahtar sözcüğü kaldırın logger.RemoveFilterKeyword("success"); // Genel Log işlevini kullanarak başlatma logging.Initialize(WARNING, true, "warnings.log", true, TIME_SECONDS, true, false, true, true); // Genel Log işlevini kullanarak bir uyarıyı günlüğe kaydedin Log(WARNING, "This is a warning message");
Betik Örneği
CDebugLogger sınıfını bir kodda kullanmak için, aşağıda gösterildiği gibi dosyanızın başına gerekli kütüphaneyi eklemeniz yeterlidir:
//--- Bu başlık dosyasını diğerlerinden önce dahil etmek önemlidir #include <Logging.mqh> //+------------------------------------------------------------------+ //| Betik program başlatma işlevi| //+------------------------------------------------------------------+ void OnStart() { //--- Kaydediciyi INFO düzeyinde başlatın, bir dosyaya kaydedin //--- Zaman damgalarını dahil etme ve CSV formatında kaydetme int log_options = 0; // DOSYA ADI | SATIR | FUNCSIG; logging.Initialize(INFO, true, "example_log.txt", true, TIME_DATE | TIME_MINUTES | TIME_SECONDS, false, log_options, true); //--- Basit bir bilgilendirme mesajı günlüğe kaydedin Log(INFO, "Script started successfully."); //--- Bir uyarı mesajı günlüğe kaydedin Log(WARNING, "This is a warning message."); //--- Bir hata mesajı günlüğe kaydedin Log(ERROR, "This is an error message."); //--- Bir hata ayıklama mesajı günlüğe kaydedin Log(DEBUG, "This is a debug message for debugging purposes."); //--- 'password' içeren günlükleri susturmak için bir anahtar sözcük ekleyin logging.AddSilentKeyword("password"); //--- Susturuldu anahtar sözcüğünü içeren bir mesajı günlüğe kaydetme girişimi Log(INFO, "User entered password: 12348"); // Bu mesaj susturulacaktır //--- Susturulmuş anahtar sözcüğünü kaldırın logging.RemoveSilentKeyword("password"); //--- Mesajı tekrar günlüğe kaydet, şimdi günlüğe kaydedilecek Log(INFO, "User entered password: 1234"); //--- Bir mesajı günlüğe kaydetmek için genel Log işlevini kullanın Log(INFO, "This message is logged using the generic Log function."); //--- INFO düzeyinde bir mesajı günlüğe kaydetmek için Yazdır makrosunu kullanın Print("This message is logged using the Print macro."); //--- Farklı seçenek kombinasyonları ile günlüğe kaydetmeyi gösterin logging.Initialize(INFO, true, "log_with_options.txt", true, TIME_DATE | TIME_MINUTES, false, FILENAME | LINE, true); Log(INFO, "This log includes only the file name and line number."); logging.Initialize(INFO, true, "log_with_funcsig.txt", true, TIME_DATE | TIME_MINUTES | TIME_SECONDS, false, FUNCSIG, true); Log(INFO, "This log includes only the function signature."); logging.Initialize(INFO, true, "log_custom_order.txt", true, TIME_MINUTES, false, LINE | FILENAME | FUNCSIG, true); Log(INFO, "This log includes line number, file name, and function signature in a custom order."); //--- 'important' içeren günlükleri filtrelemek için bir anahtar sözcük ekleyin logging.AddFilterKeyword("important"); //--- Filtreyi göstermek için bazı mesajları günlüğe kaydedin Log(INFO, "This is an important message."); // Bu mesaj görünür olacak Log(INFO, "This is a regular message."); // Bu mesaj görünür olmayacaktır //--- Tüm günlükleri göstermek için filtre anahtar sözcüğünü kaldırın logging.RemoveFilterKeyword("important"); //--- Komut dosyasının sonunu belirten bir son mesaj günlüğe kaydedin Log(INFO, "Script execution completed."); }
Çıktı CSV örneği:
Timestamp,Level,Message "2024.09.01 18:31:44","INFO","Script started successfully." "2024.09.01 18:31:44","WARNING","This is a warning message." "2024.09.01 18:31:44","ERROR","This is an error message." "2024.09.01 18:31:44","DEBUG","This is a debug message for debugging purposes." "2024.09.01 18:31:44","INFO","User entered password: 1234" "2024.09.01 18:31:44","INFO","This message is logged using the generic Log function." "2024.09.01 18:31:44","INFO","This message is logged using the Print macro."
Timestamp,Level,Message,Filename,Line "2024.09.01 18:31","INFO","This log includes only the file name and line number.","Logging.mq5","135"
Timestamp,Level,Message,Funcsig "2024.09.01 18:31:44","INFO","This log includes only the function signature.","void OnStart()"
Timestamp,Level,Message,Filename,Line,Funcsig "18:31","INFO","This log includes line number, file name, and function signature in a custom order.","Logging.mq5","141","void OnStart()" "18:31","INFO","This is an important message.","Logging.mq5","147","void OnStart()" "18:31","INFO","Script execution completed.","Logging.mq5","154","void OnStart()"
Exper Advisor Örneği
#include <Logging.mqh> //+------------------------------------------------------------------+ //| Uzman başlatma işlevi| //+------------------------------------------------------------------+ int OnInit() { int log_options = LINE | FUNCSIG; // FILENAME | LINE | FUNCSIG; veya 0 logging.Initialize(INFO, false, "example_log.txt", true, TIME_DATE | TIME_MINUTES | TIME_SECONDS, false, log_options, false); //--- zamanlayıcı oluştur EventSetMillisecondTimer(1); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Uzman başlangıçtan kaldırma işlevi| //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- zamanlayıcıyı yok et EventKillTimer(); } int counter = 0; datetime last_time = 0; //--- Sayacın en son ne zaman güncellendiğini saklar //+------------------------------------------------------------------+ //| Zamanlayıcı işlevi| //+------------------------------------------------------------------+ void OnTimer() { logging.BeginEvent(); //--- Yeni bir etkinlik başlatın Log(INFO, "Sample message"); Log(INFO, "Another message"); Log(INFO, "Sample message"); //--- Geçerli saati al datetime current_time = TimeLocal(); //--- Sayacın son güncellenmesinden bu yana en az 2 saniye geçip geçmediğini kontrol edin if (current_time - last_time >= 2) { //--- Sayacı güncelleyin counter++; //--- Son kez güncelleyin last_time = current_time; //--- Mesajı yeni sayaç değeriyle birlikte günlüğe kaydedin Log(INFO, "Counter value: " + IntegerToString(counter)); //--- Başka bir mesaj da kaydedebilirsiniz Log(INFO, "Updated after 2 seconds"); } else { //--- Zamanlayıcının etkin olduğunu ancak sayacın değişmediğini belirten bir mesaj günlüğe kaydedin Log(INFO, "Timer active but counter unchanged"); } }
Çıkış MT5 terminal örneği:
2024.09.22 13:00:29.589 test_logging (EURUSD,H1) 2024.09.22 13:00:29 Line: 43 Function: void OnTimer() [INFO] Sample message 2024.09.22 13:00:29.589 test_logging (EURUSD,H1) 2024.09.22 13:00:29 Line: 44 Function: void OnTimer() [INFO] Another message 2024.09.22 13:00:29.589 test_logging (EURUSD,H1) 2024.09.22 13:00:29 Line: 45 Function: void OnTimer() [INFO] Sample message 2024.09.22 13:00:29.589 test_logging (EURUSD,H1) 2024.09.22 13:00:29 Line: 55 Function: void OnTimer() [INFO] Counter value: 1 2024.09.22 13:00:29.589 test_logging (EURUSD,H1) 2024.09.22 13:00:29 Line: 57 Function: void OnTimer() [INFO] Updated after 2 seconds 2024.09.22 13:00:29.605 test_logging (EURUSD,H1) 2024.09.22 13:00:29 Line: 60 Function: void OnTimer() [INFO] Timer active but counter unchanged 2024.09.22 13:00:31.001 test_logging (EURUSD,H1) 2024.09.22 13:00:31 Line: 55 Function: void OnTimer() [INFO] Counter value: 2 2024.09.22 13:00:31.001 test_logging (EURUSD,H1) 2024.09.22 13:00:31 Line: 57 Function: void OnTimer() [INFO] Updated after 2 seconds 2024.09.22 13:00:31.017 test_logging (EURUSD,H1) 2024.09.22 13:00:31 Line: 60 Function: void OnTimer() [INFO] Timer active but counter unchanged 2024.09.22 13:00:33.001 test_logging (EURUSD,H1) 2024.09.22 13:00:33 Line: 55 Function: void OnTimer() [INFO] Counter value: 3 2024.09.22 13:00:33.001 test_logging (EURUSD,H1) 2024.09.22 13:00:33 Line: 57 Function: void OnTimer() [INFO] Updated after 2 seconds 2024.09.22 13:00:33.016 test_logging (EURUSD,H1) 2024.09.22 13:00:33 Line: 60 Function: void OnTimer() [INFO] Timer active but counter unchanged
Sonuç
CDebugLogger sınıfı, tüm MQL4/5 geliştiricileri için paha biçilmez bir araçtır. Çok çeşitli özelleştirilebilir özellikleriyle, uygulamaların hassas bir şekilde günlüğe kaydedilmesini ve izlenmesini sağlayarak daha kolay hata ayıklama ve daha iyi uygulama performansı takibini kolaylaştırır. İster basit mesaj günlüğüne ister ayrıntılı bağlamsal bilgilere ihtiyacınız olsun, CDebugLogger sınıfı geliştirme ihtiyaçlarınıza göre uyarlanmış güvenilir ve verimli bir çözüm sunar.
CDebugLogger sınıfı hakkında daha fazla bilgi almak veya diğer gelişmiş araçları ve çözümleri keşfetmek için StormWave Technologies'i ziyaret edin.
MetaQuotes Ltd tarafından İngilizceden çevrilmiştir.
Orijinal kod: https://www.mql5.com/en/code/52298
Position Risk Calculation Tool
Lot büyüklüğüne ve zararı durdurmaya dayalı olarak riski (yüzde ve para olarak) dinamik olarak hesaplayan bir gösterge
Stokastik Siber Döngü
Uyarlanabilir bir stokastik osilatör.
Günlük Menzil Projeksiyonları Tam
Mevcut grafiğin tüm çubukları için bir sonraki günlük mumun değişim aralıklarını tahmin etme.
Döngü Dönemi
Bu göstergenin amacı, bir finansal varlığın fiyatını değiştirme sürecinin periyodikliğini ölçmektir. Döngü Dönemi göstergesi yardımıyla osilatörlerin uyarlanabilir versiyonlarını oluşturmak mümkündür.