datetime new_time=TimeCurrent()/period_seconds*period_seconds; // Geçerli grafikte çubuk açılış zamanı
Burada bir hata var. Dönem bir hafta ya da bir ay ise.
Dönem bir hafta ise, 1970.01.01 Perşembe olduğu için haftanın başlangıcı Çarşamba'dır.
Dönem bir ay ise ve içinde bulunulan ay 30 gün değilse, period_seconds 30 güne karşılık geldiği için bu da yanlış sayılır.
Burada bir hata var. Dönem bir hafta veya bir ay ise.
Dönem bir hafta ise, 1970.01.01 Perşembe olduğu için haftanın başlangıcı Çarşamba'dır.
Dönem bir aysa ve geçerli ayın 30 günü yoksa, period_seconds 30 güne karşılık geldiğinden bu da yanlış sayılır.
Kabul edildi. Bunu bu dönemler için OnNewBarCalculate.mqh içinde kullanabilirsiniz:
//+------------------------------------------------------------------+ //| Özel gösterge yineleme işlevi | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime& time[], const double& open[], const double& high[], const double& low[], const double& close[], const long& tick_volume[], const long& volume[], const int& spread[]) { //--- // Yeni bir çubuk göründüğünde, NewBar olay işleyicisini çalıştır if(current_chart.isNewBar()>0) OnNewBarCalculate(rates_total,prev_calculated,time,open,high,low,close,tick_volume,volume,spread); return(rates_total); }
Biraz başka amaçlar için, ama şimdilik buna benzer bir fonksiyon kullanıyorum:
datetime getHTFTime(datetime time, ENUM_TIMEFRAMES highTimeFrame) { int periodSeconds = PeriodSeconds(highTimeFrame); if(periodSeconds <= 60*60*24) return datetime(time/periodSeconds*periodSeconds); MqlDateTime sTime; TimeToStruct(time, sTime); if(highTimeFrame == PERIOD_W1) { TimeToStruct(time - datetime(sTime.day_of_week * 24 * 60 * 60), sTime); sTime.hour = 0; sTime.min = 0; sTime.sec = 0; } else if(highTimeFrame == PERIOD_MN1) { sTime.day = 1; sTime.hour = 0; sTime.min = 0; sTime.sec = 0; } return StructToTime(sTime); }
Girdi olarak bir tarih/saat ve bir zaman dilimi verilir. Çıktıda, bu zamanı içeren bu zaman dilimindeki çubuğun başlangıç zamanını alırız.
Kodu optimize etmek için herhangi bir öneriniz varsa, dinlemekten memnuniyet duyarım.
Elbette bu şekilde yapabilirsiniz:
datetime timeOut[1]; CopyTime(_Symbol, highTimeFrame, timeIn, 1, timeOut);
Ancak bu durumda bir senkronizasyon sorunu yaşadım. Yani, geçmişin yüklenmesini beklemeniz gerekir.
Özel göstergeniz için teşekkür ederim, ancak bunu kullandığımda, sadece bir kez uyarıyorum ve hata ayıklamayı bırakıyorum! Lütfen bana yardım edin!
Bunun yerine OnTick kullanırsam (ve OnInit ve OnCaculate işlevlerini kaldırırsam) bu makale gibi https://www.mql5.com/tr/articles/159 iyi çalışır, ancak gösterge gezgin pencerelerinde görüntülenmez. Ve OnInit ve OnCaculate işlevlerini eklediğimde çalışmıyor. OnInit ve OnCaculate fonksiyonlarını eklersem, gösterge navigator pencerelerinde görüntülenir mi?
Teşekkür ederim
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Göstergeler için yeni bar" olay işleyicisi:
OnCalculate() işlevinden farklı olarak, gösterge yalnızca grafikte yeni bir çubuk göründüğünde hesaplanır.
Author: Konstantin Gruzdev