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.
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");
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."); }
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()"
#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"); } }
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
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.