[SERVICE DESK] Zamanlayıcıda kıdemli TF'nin zamanı alınırken hata oluştu! - sayfa 5
Alım-satım fırsatlarını kaçırıyorsunuz:
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Kayıt
Giriş yap
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Hesabınız yoksa, lütfen kaydolun
iBarShift ile alım, geçmişteki delikleri tanımlamanıza izin verir, ancak bunun için belirli aralıklarla yün atmanız gerekir. Bunu yapan kendime bir prosedür yazdım, ondan sonra MTF programlarındaki boşlukları unuttum.
Veriler 4066 hatasıyla yüklenir, ardından meta alıntılar yapılamaz, büyük olasılıkla alınan veriler bu durum için işlenir, hata icat edilmedi. Ve bu noktaya kadar her şey mantıklı.
Bir hatanın "icat edilmemiş" olması, var olmadığı anlamına gelmez.
Buradaki konuşma "deliklerin" tanımlanmasıyla ilgili değildi. Adamın tarihteki son barı alması gerekiyordu. Ve bu mutlaka zaman içinde geçerli çubuk değildir.
Bu iBarShift() ile ilgili değil. Sonuçta, iTime() ile aynı hataları SeriesInfoInteger() ile gönderir. Buradaki koltuk değneği, başlatma sırasında elde edilen süreyi karşılaştırmak ve ardından bunu zamanlayıcıdan gelen zamanla karşılaştırmaktır. Bu, terminali yüklerken IBarShift() değil, doğru güncel verileri almamıza izin verdi.
Evet ve saat 15:00:45 ise (örneğin) ve barda henüz 15:00 tik yoksa ve son saatlik barın açılış saati 14:00 ise her şey doğru, Bence. Ancak sistem 13:00'e dönerse - sorun burada.
1. Igor, koda baktın mı? OnInit() içinde bir şeyi nereden edinebilirim?
Sizin durumunuzda, OnInit()'ten hemen sonra bir veya daha fazla OnTimer çağrısı yapılır. Henüz OnCalculate() olayı yoktu.
2. Kontroller nelerdir? Doğru işlem için göstergenin OnCalculate()'i en az bir kez kullanması gerektiği nerede yazıyor?
Bu, terminalin mantığının anlaşılmasını gerektirir. Gösterge grafiğe bağlandığında hemen OnInit() çağrılır. Terminal başlatıldığında, grafik penceresi oluşturulduktan hemen sonra gösterge tabloya bağlanır. Şu anda, terminal sunucuya bir istek bile göndermedi.
Yerel olarak mevcut alıntılar okunduktan sonra ilk OnCalculate() çağrılır. Bazı nadir durumlarda, yerel olarak hiçbir şey olmaz. Ardından, Zaman[0]'a atıfta bulunan göstergeler, bir dizi sınır dışı hatası nedeniyle uçar. Bu nedenle, iTime işlevlerini ve benzerlerini kullanmak daha iyidir.
İkinci ve sonraki OnCalculate(), geçmiş değiştirildiğinde veya keneler gerçekten geldiğinde gerçekleşir.
Yerel olarak mevcut alıntılar okunduktan sonra ilk OnCalculate() çağrılır. Bazı nadir durumlarda, yerel olarak hiçbir şey olmaz. Ardından, Zaman[0]'a atıfta bulunan göstergeler, bir dizi sınır dışı hatası nedeniyle uçar. Bu nedenle, iTime işlevlerini ve benzerlerini kullanmak daha iyidir.
muhtemelen hala OHLC'nin hazırlanmasının MT4'teki ile aynı olmadığı MQL5'ten bahsediyoruz
Uzun zamandır bir şablona göre göstergeler yazıyorum:
MT4'te OHLC dizilerinin ötesine geçerken hiçbir zaman bir "gösterge çökmesi" olmadı, sanırım MT4 grafik hazırlanana kadar OnCalculate()'i ilk kez başlatmayacak ve geçmiş yüklendiyse, o zaman kaç tane başlatmadı? kontrol edin, ancak prev_calculated== 0 , MT5'te yazdığınız gibi olacak - OHLC verilerinin hazır olduğuna dair ek kontrollere ihtiyacınız var
Sizin durumunuzda, OnInit()'ten hemen sonra bir veya daha fazla OnTimer çağrısı yapılır. Henüz OnCalculate() olayı yoktu.
Bu, terminalin mantığının anlaşılmasını gerektirir. Gösterge grafiğe bağlandığında hemen OnInit() çağrılır. Terminal başlatıldığında, grafik penceresi oluşturulduktan hemen sonra gösterge tabloya bağlanır. Şu anda, terminal sunucuya bir istek bile göndermedi.
Yerel olarak mevcut alıntılar okunduktan sonra ilk OnCalculate() çağrılır. Bazı nadir durumlarda, yerel olarak hiçbir şey olmaz. Ardından, Zaman[0]'a atıfta bulunan göstergeler, bir dizi sınır dışı hatası nedeniyle uçar. Bu nedenle, iTime işlevlerini ve benzerlerini kullanmak daha iyidir.
İkinci ve sonraki OnCalculate(), geçmiş değiştirildiğinde veya keneler gerçekten geldiğinde gerçekleşir.
Sorunu çözmek için ne önerirsiniz (sence var mı)? OnCalculate() 1-2 kez çağrılana kadar bekleyin?
Sorunu çözmek için ne önerirsiniz (sence var mı)? OnCalculate() 1-2 kez çağrılana kadar bekleyin?
prev_calculated== 0 değerini global görünürlük seviyesindeki bir değişkene kopyalamayı deneyebilir ve OnTimer()'da göstergenin hesaplanıp hesaplanmadığını görebilirsiniz, MT4'te yanlış OnCalculate() hesaplaması ile hiç hata görmediğimi yukarıda yazdım - bu her durumda hesaplanacak, TF verileri hazır değilse, dönüşün (rates_total) 0 döndüreceğinden şüpheleniyorum, bu, bir sonraki OnCalculate() çağrısında prev_calculated== 0 işareti olacak, bunun gibi bir şey :
prev_calculated== 0 değerini global görünürlük seviyesindeki bir değişkene kopyalamayı deneyebilir ve OnTimer()'da göstergenin hesaplanıp hesaplanmadığını görebilirsiniz, MT4'te yanlış OnCalculate() hesaplaması ile hiç hata görmediğimi yukarıda yazdım - bu her durumda hesaplanacak, TF verileri hazır değilse, dönüşün (rates_total) 0 döndüreceğinden şüpheleniyorum, bu, bir sonraki OnCalculate() çağrısında prev_calculated== 0 işareti olacaktır.
Görünüşe göre en güvenilir çözüm aslında OnCalculate() çağrısını beklemek ve ticaret sunucusuyla bağlantı kurmanın zorunlu kontrolü. Bağlantıyı kontrol etmezsek (IsConnected()), o zaman OnCalculate() içinde bile terminali yüklerken şunu elde ederiz:
Ancak, bu tüm soruları çözmez:
1. OnCalculate() içindeki kıdemli TF'nin verilerini (en azından) almadan önce çağrılması gerektiği IsConnected() belgelerinde neden yazılmıyor?
2. OnTimer() içindeki IsConnected() neden gerçekten çalışmıyor? Sonuçta bir ticaret sunucusuyla bağlantı kurmanın bize veri almanın mümkün olduğunu söylemesi gerekmez mi?
3. Ticaret sunucusuyla bir bağlantı kurduğumuz ve OnTimer()'da veri almaya çalıştığımız için, iTime(), iBarShift(), SeriesInfoInteger() ve benzer işlevler, veriler aynı kaynaktan geliyorsa hata döndürmemelidir. bilgileri aldıkları ticaret sunucusu henüz senkronize değil mi? Aksi takdirde, bir zamanlar size 4066 hatasını döndüreceğimiz ve daha sonra sahip olduğunuz verilerle istediğiniz gibi yaşayacağımız gibi bir tür saçmalık ortaya çıkıyor.
Ancak, bu tüm soruları çözmez:
1. OnCalculate() içindeki kıdemli TF'nin verilerini (en azından) almadan önce çağrılması gerektiği IsConnected() belgelerinde neden yazılmıyor?
2. OnTimer() içindeki IsConnected() neden gerçekten çalışmıyor? Sonuçta bir ticaret sunucusuyla bağlantı kurmanın bize veri almanın mümkün olduğunu söylemesi gerekmez mi?
3. Ticaret sunucusuyla bir bağlantı kurduğumuz ve OnTimer()'da veri almaya çalıştığımız için, iTime(), iBarShift(), SeriesInfoInteger() ve benzer işlevler, veriler aynı kaynaktan geliyorsa hata döndürmemelidir. bilgileri aldıkları ticaret sunucusu henüz senkronize değil mi? Aksi takdirde, bir zamanlar size 4066 hatasını döndüreceğimiz ve daha sonra sahip olduğunuz verilerle istediğiniz gibi yaşayacağımız gibi bir tür saçmalık ortaya çıkıyor.
1. peki, hiç kimse geçmiş verilerdeki göstergeyi çağırma durumunu iptal etmedi, çevrimiçi çalışmanız gerekiyorsa, bağlantıyı kontrol edin, gerekli değil veya daha doğrusu önemli değil, o zaman şablon sürümüm çalışıyor. IsConnected() işlevleri grubu genellikle biraz zor, bir nedenden dolayı IsTradeContextBusy() burada kesişiyor ve IsConnected()'in kendisi IsTradeAllowed() oluyor ... ama burada sunucu tarafında kimyasal olarak bir şeyler yapıldığını düşünüyorum ve haber veya başka bir manipülasyon sırasında terminaller kapatılır
2.3. çalışır, ancak GetLastError() öğesinin çağrıdan sonra durumunu sıfırlayacağını unutursunuz ve GetLastError() durumunu güncellemek için kontrolü uçbirime aktarmanız gerekebilir, belki de uçbirimin yeniden yapmak için zamanı yoktur. IsConnected() durumunu zamanlayıcıdan gelen çağrınızdan önce GetLastError() içinde ayarlayın. ... OnTimer() işlevinin kendisinin veri almak için tasarlanmadığını düşünüyorum: "MQL4 Reference / Status Check" - OnTimer() çağrılacak, ancak terminal ortam değişkenleri güncellendikleri gerçeği değil, OnCalculate() orada, terminalin bir onay geldiğinde tüm verileri hazırlayacağı garanti edilir.
1. peki, tarihsel verilerdeki göstergeyi arama davası iptal edilmedi...
2.3. çalışır, ancak GetLastError() öğesinin çağrıdan sonra durumunu sıfırlayacağını unutursunuz ve GetLastError() durumunu güncellemek için kontrolü uçbirime aktarmanız gerekebilir, belki de uçbirimin yeniden yapmak için zamanı yoktur. IsConnected() durumunu zamanlayıcıdan gelen çağrınızdan önce GetLastError() içinde ayarlayın. ... OnTimer() işlevinin kendisinin veri almak için tasarlanmadığını düşünüyorum: "MQL4 Reference / Status Check" - OnTimer() çağrılacak, ancak terminal ortam değişkenleri güncellendikleri gerçeği değil, OnCalculate() orada, terminalin bir onay geldiğinde tüm verileri hazırlayacağı garanti edilir.
1. 0 numaralı çubuk yanlış bir zamana sahipse, tarihin geri kalanının doğru bir zamana sahip olacağını düşünüyor musunuz? :)
2.3. Veri erişim işlevlerinin anlamlı bir hata ayarlamak için yeterli zamanı yoksa, bir şekilde bildirmelerine izin verin, ancak kesinlikle hata kodunu = 0 (hata yok) döndürmesinler. "Belki"nin geri kalanı sadece tahminden ibarettir. Ve kanıt olmadan, konuşacak bir şey yok.
OnTimer() işlevi veri almak için tasarlanmamıştır...
Yorum yok.
OnTimer() çağrılacak, ancak terminalin ortam değişkenleri güncellendikleri gerçeği değil