[SERVICE DESK] Zamanlayıcıda kıdemli TF'nin zamanı alınırken hata oluştu! - sayfa 5

 
Vitaly Gorbunov :
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.
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.
 
Vitaly Gorbunov :
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.

 
Alexey Navoykov :
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.

 
Alexey Kozitsyn :

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.

 
Ihor Herasko :

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:

 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[])
  {
//---
   int i,limit;
   if (prev_calculated== 0 )
     {
      limit=rates_total- 1 ;     //--- Первый вызов индикатора или смена таймфрейма или подгрузка данных из истории
     }
   else limit=rates_total-prev_calculated+ 1 ;
   for (i=limit;i>= 0 ;i--)       //---- Основной цикл расчета
     {                        
     }
   return (rates_total);
  }

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

 
Ihor Herasko :

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?

 
Alexey Kozitsyn :

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 :

 void OnTimer (){
   if (Global_prev_calculated== 0 ) return ;
}
 
Igor Makanu :

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:

 2018.09 . 21 23 : 45 : 27.128 test_isNewDayInOnCalculate_iBarShift() EURGBP.e,M1: test_isNewDayInOnCalculate_iBarShift().mq4: Актуальное время открытия бара М 15 = 2018.09 . 21 21 : 30 . Ошибка # 0
2018.09 . 21 23 : 45 : 25.990 test_isNewDayInOnCalculate_iBarShift() EURGBP.e,M1: initialized
2018.09 . 21 23 : 45 : 25.975 Custom indicator test_isNewDayInOnCalculate_iBarShift() EURGBP.e,M1: loaded successfully

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.

 
Alexey Kozitsyn :

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.

 
Igor Makanu :

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

4066 hatası ne olacak?