4066 hatası MTF hindileri için tipik bir sorundur, terminal diğer TF'lerden veri yüklemedi, diğer TF'lerin veri bütünlüğünü kontrol etmek gerekiyor.
Tavsiye vermeden önce koda ve yazdıklarıma daha yakından bakın.
Kodun hata kontrolü ve boş veri kontrolü vardır. Ve bir fonksiyon hatasız yanlış veri döndürdüğünde, bu bir hatadır!
Tavsiye vermeden önce koda ve yazdıklarıma daha yakından bakın.
Kodun hata kontrolü ve boş veri kontrolü vardır. Ve bir fonksiyon hatasız yanlış veri döndürdüğünde, bu bir hatadır!
Belki bir şeyi kaçırdım, örneğin CheckCurrentHourOpenTime () prosedüründe geçmişin bütünlüğünü nerede kontrol ettiğinizi gösterin.
Tarihin bütünlüğünden ne anlıyorsunuz?
Geçmiş değerleri alınırken hata kontrolü yapıldığından bahsediyorum. Her fonksiyonda bir kontrol var. İşte burada:
//--- Проверяем, получено ли время открытия часового бара if (tempHourOpenTime== 0 || err!= 0 ) // Если время бара не получено return ( false ); // Возвращаем ложь
Onlar. boş bir değer veya bir hata alınırsa, zaman global değişkene yazılmaz. Sizce bu yeterli değil mi?
Sonuç olarak, SeriesInfoInteger() işlevi önce bir hata döndürür, ancak sonraki çalıştırmada - HAYIR! Üstelik doğru değeri de döndürmez!SeriesInfoInteger() yalnızca belirli bir istekle ilgili bilgileri döndürür, bu durumda tarihte bilinen son çubuğun açılış zamanını sembol ve nokta ile döndürmeyi istiyoruz. Burada bir hata yok, ki o an aşırıydı, sonra iade etti. Şimdi büyük bir bilgisayara gideceğim ve size geçmişin bütünlüğünü nasıl kontrol edebileceğinizi göstereceğim.
SeriesInfoInteger() yalnızca belirli bir istekle ilgili bilgileri döndürür, bu durumda tarihte bilinen son çubuğun açılış zamanını sembol ve nokta ile döndürmeyi istiyoruz. Burada bir hata yok, ki o an aşırıydı, sonra iade etti. Şimdi büyük bir bilgisayara gideceğim ve size geçmişin bütünlüğünü nasıl kontrol edebileceğinizi göstereceğim.
Ne demek hata yok? Ve neden o zaman "sol" hata kodları veriyor. Tarihin yanlış olduğu yerde doğru olduğunu söylüyor...
Ne demek hata yok? Ve neden o zaman "sol" hata kodları veriyor. Tarihin yanlış olduğu yerde doğru olduğunu söylüyor...
Bir kez daha, bu işlev geçmişin bütünlüğünü kontrol etmez! İçinde bulabildiği bilgileri geri verir. Belirli bir durumda, terminalin kapatıldığı anda talep edilen saatlik bir bar buldu. Hikayenin geri kalanı henüz yüklenmedi.
Belirli bir TF'nin geçmişinin tamamen değiştirildiğini kontrol etmek için işlevi kullanmak yeterlidir:
bool IsTFDataReady( ENUM_TIMEFRAMES eTF) { ResetLastError (); iTime ( NULL , eTF, 1 ); return GetLastError () == ERR_NO_ERROR ; }
İşlev false döndürürse, istenen TF'deki veriler eksiktir. Aksi takdirde, tamamlayın.
Bir kez daha, bu işlev geçmişin bütünlüğünü kontrol etmez! İçinde bulabildiği bilgileri geri verir. Belirli bir durumda, terminalin kapatıldığı anda talep edilen saatlik bir bar buldu. Hikayenin geri kalanı henüz yüklenmedi.
Tekrar. Bu hiçbir yerde bahsedilmiyor. Bu ilk. İkincisi, neden önce 4066 hata kodunu gösterip sonra değil de yanlış yönlendiriyor?
Belirli bir TF'nin geçmişinin tamamen değiştirildiğini kontrol etmek için işlevi kullanmak yeterlidir:
İşlev false döndürürse, istenen TF'deki veriler eksiktir. Aksi takdirde, tamamlayın.
Zamanlayıcıyı kontrol ettiniz mi? Yorumladığım satırları görüyor musun? Bu işlevi kontrol ettim, hiç hata göstermedi ve ayrıca yanlış veriler gösterdi. Tekrar kontrol edeceğim.
- Ü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örev: göstergeyi başlatırken, zamanlayıcıdaki gerçek verileri alın: haftalık, günlük ve saatlik çubuğun açılış saati. Sonra bunları daha sonra kullanmak üzere global değişkenlere yazın. Mevcut TF M1'dir.
Gerçekleştirme: SeriesInfoInteger() işlevini kullanarak çubukların zamanını elde ederiz.
Sonuç: Sonuç olarak, eğer terminal birkaç saat boyunca ÇALIŞMIYORSA , örneğin, gece için kapatıldıysa, ilk (günlük) başlatıldığında aşağıdaki sonucu alırız:
Gördüğünüz gibi, veri alma zamanı 2018.09.21 11:11 ve bu sefer için günün açık zamanını = 2018.09.20 (2018.09.21 olmasına rağmen) ve açık zamanını alıyoruz. saat = 2018.09.20 16:00 (2018.09 .21 11:00 olmasına rağmen). Ayrıca, terminal tarafından döndürülen zaman, son kez kapatıldığı andaki veriden başka bir şey değildir. Onlar. veriler, terminalin kapatılmış olmasına bakılmaksızın önbelleğe alınır ve döndürülür. Ve anlıyorum ki, veriler güncellenene kadar her seferinde #4066 hatası (güncelleme durumunda istenen geçmiş veriler) döndürülürse, ancak hayır, döndürülen ERROR verileridir! Bu hata yalnızca bir kez döndürülür ve ardından - istediğiniz gibi yaşayın. Bu açık bir önbelleğe alma hatası. Geliştiricilerden ( @Slava ) buna dikkat etmelerini rica ediyorum!
Tekrarlıyorum. Zamanlayıcıda talep ederseniz hatalı veriler görünür!
Terminal sürümü: x64, 1090.