prev_hesaplanmış

 
" Hatalar, buglar, sorular " ile ilgili olmayan yorumlar bu başlığa taşınmıştır.
 

MT5 yapı 1455

Test göstergesi:

#property indicator_chart_window
#property indicator_buffers      0
#property indicator_plots         0

int OnInit ( void ) { return ( INIT_SUCCEEDED );}

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 &TickVolume[],
   const long & Volume [],
   const int &Spread[]
) {
   static int si_Tick = 0 ;
   Print (++si_Tick, ": prev_calculated = " , prev_calculated);
  
   return (rates_total);
}

1. Göstergeyi çizelgeye asıyorum

2. Terminali kapatıyorum

3. Terminali açıyorum

Günlükte:

2016.10 . 17 08 : 04 : 38.755 Test (USDJPY,M15)       1 : prev_calculated = 0
2016.10 . 17 08 : 04 : 38.757 Test (USDJPY,M15)       2 : prev_calculated = 100322
2016.10 . 17 08 : 04 : 39.060 Test (USDJPY,M15)       3 : prev_calculated = 0
2016.10 . 17 08 : 04 : 39.837 Test (USDJPY,M15)       4 : prev_calculated = 100322
2016.10 . 17 08 : 04 : 39.837 Test (USDJPY,M15)       5 : prev_calculated = 100322
...

Bir şeyi anlamıyor muyum veya prev_calculated değişkenine güvenmek imkansız mı, bir koltuk değneği kesmem gerekiyor mu?

 
Alexander Puzanov :

MT5 yapı 1455

Test göstergesi:

#property indicator_chart_window
#property indicator_buffers      0
#property indicator_plots         0

int OnInit ( void ) { return ( INIT_SUCCEEDED );}

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 &TickVolume[],
   const long & Volume [],
   const int &Spread[]
) {
   static int si_Tick = 0 ;
   Print (++si_Tick, ": prev_calculated = " , prev_calculated);
  
   return (rates_total);
}

1. Göstergeyi çizelgeye asıyorum

2. Terminali kapatıyorum

3. Terminali açıyorum

Günlükte:

2016.10 . 17 08 : 04 : 38.755 Test (USDJPY,M15)       1 : prev_calculated = 0
2016.10 . 17 08 : 04 : 38.757 Test (USDJPY,M15)       2 : prev_calculated = 100322
2016.10 . 17 08 : 04 : 39.060 Test (USDJPY,M15)       3 : prev_calculated = 0
2016.10 . 17 08 : 04 : 39.837 Test (USDJPY,M15)       4 : prev_calculated = 100322
2016.10 . 17 08 : 04 : 39.837 Test (USDJPY,M15)       5 : prev_calculated = 100322
...

Bir şeyi anlamıyor muyum veya prev_calculated değişkenine güvenmek imkansız mı, bir koltuk değneği kesmem gerekiyor mu?

Ön_hesaplanan değişken, sağlama toplamı değiştiyse geçmişi sayfalamadan bile 0'a sıfırlanabilir (bu, hizmet masasından alınan yaklaşık bir yanıttır).
 
Alexey Kozitsyn :
Ön_hesaplanan değişken, sağlama toplamı değiştiyse geçmişi sayfalamadan bile 0'a sıfırlanabilir (bu, hizmet masasından alınan yaklaşık bir yanıttır).
Apaçık. Teşekkür ederim. marangoz'a imza at..
 
Alexander Puzanov :
Apaçık. Teşekkür ederim. marangoz'a imza at..
Bu kadar abartmaya gerek yok - prev_calculate'den sıfıra dönmek en nadir olaydır. Programcının görevi, böyle bir olayı yakalamak ve bu durumda gösterge arabelleklerini doğru şekilde doldurmaktır. Daha fazla ve daha az değil.
 
Ilyas :

Operatörler *(Dereference/Inderection) ve &(Address-of) eklendi, dilde ek bir değişiklik yapılmayacak/planlanmayacak

Lütfen aşağıdakileri açıklayın:

* referansa göre bir değişken almak - yalnızca şunlar için geçerlidir:

1. Sınıf nesneleri

2. Yapı nesneleri

3. Temel türler

Bu bağlamda, sadece bir değer mi yoksa aynı zamanda bir değer mi?

 
Karputov Vladimir :
Programcının görevi böyle bir olayı yakalamaktır.

Yani ben bir programcı değilim - görevler farklı. Marangoz, muhtemelen - 'koltuk değneği keseceğim' ve 'etkinliği yakalıyorum' diye düşüneceğim

Ve hiçbir şeyi abartmıyorum çünkü bu değişkenin beyan edilen amacı:

prev_calculated   // обработано баров на предыдущем вызове

Bu randevuya ek olarak, tarihteki değişikliklerin bir bayrağı ve ayrıca izlenecek diğer bazı değişikliklerin bayrağı olarak asılır. Hepsi faydalıdır, ancak amaçlanan amacı için kullanılamaz - önceki çağrıda kaç tane 'bar işlendiğini' göstermek için - prev_calculated'a izin verilmez

 
Alexander Puzanov :

Yani ben bir programcı değilim - görevler farklı. Marangoz, muhtemelen - 'koltuk değneği keseceğim' ve 'etkinliği yakalıyorum' diye düşüneceğim

Ve hiçbir şeyi abartmıyorum çünkü bu değişkenin beyan edilen amacı:

prev_calculated   // обработано баров на предыдущем вызове

Bu randevuya ek olarak, tarihteki değişikliklerin bir bayrağı ve ayrıca izlenecek diğer bazı değişikliklerin bayrağı olarak asılır. Hepsi faydalıdır, ancak amaçlanan amacı için kullanılamaz - önceki çağrıda kaç tane 'bar işlendiğini' göstermek için - prev_calculated'a izin verilmez

Ve 0 olduğunda tüm göstergeyi yeniden hesaplarsanız? Bana göre en iyi çözüm.
 
Alexander Puzanov :

Yani ben bir programcı değilim - görevler farklı. Marangoz, muhtemelen - 'koltuk değneği keseceğim' ve 'etkinliği yakalıyorum' diye düşüneceğim

Ve hiçbir şeyi abartmıyorum çünkü bu değişkenin beyan edilen amacı:

prev_calculated   // обработано баров на предыдущем вызове

Bu randevuya ek olarak, tarihteki değişikliklerin bir bayrağı ve ayrıca izlenecek diğer bazı değişikliklerin bayrağı olarak asılır. Hepsi faydalıdır, ancak amaçlanan amacı için kullanılamaz - önceki çağrıda kaç tane 'bar işlendiğini' göstermek için - prev_calculated'a izin verilmez

prev_calculated=0 ise, tam bir yeniden hesaplama yapılması gerektiği anlamına gelir. Bu durumda tüm standart göstergeler tamamen yeniden hesaplanır.

Ne net değil?

Checksum'un tarihte değiştiği söyleniyor. Göstergeyi yeniden hesaplamak, sağlama toplamının neden değiştiğini bulmaktan daha ucuzdur.

Belgeler bunu açıkça söylüyor.

OnCalculate() işlevi tarafından döndürülen değer ile ikinci giriş parametresi prev_calculated arasındaki ilişkiye dikkat edin. İşlev çağrılırken prev_calculated parametresi , önceki çağrıda OnCalculate() işlevi tarafından döndürülen değeri içerir . Bu, bu işlevin önceki başlatılmasından bu yana değişmeyen çubuklar için yeniden hesaplamalardan kaçınmak için özel bir göstergeyi hesaplamak için ekonomik algoritmalar uygulamanıza olanak tanır.

Bunu yapmak için, geçerli işlev çağrısındaki çubuk sayısını içeren Rate_total parametresinin değerini döndürmek genellikle yeterlidir. OnCalculate() işlevine yapılan son çağrıdan bu yana fiyat verileri değiştiyse (daha derin bir geçmiş yüklendiyse veya geçmiş boşlukları doldurulduysa), prev_calculated girdi parametresinin değeri, terminalin kendisi tarafından sıfıra ayarlanacaktır .

 
Alexey Kozitsyn :
Ve 0 olduğunda tüm göstergeyi yeniden hesaplarsanız? Bana göre en iyi çözüm.
Yapmanız gereken tam olarak budur: prev_calculate==0 alındığında, ENTIRE göstergesini yeniden hesaplamanız gerekir. rev_calculate==0 olduğundan, bu genellikle bir geçmiş sayfalamasıdır. Ve geçmiş pompalanırsa, atlanan veya daha önce hesaplanmayan yeni çubuklar olabilir - yani, gösterge okumaları zaten yanlış olacaktır.
 
Karputov Vladimir :
Yapmanız gereken tam olarak budur: prev_calculate==0 alındığında, ENTIRE göstergesini yeniden hesaplamanız gerekir. rev_calculate==0 olduğundan, bu genellikle bir geçmiş sayfalamasıdır. Ve geçmiş pompalanırsa, atlanan veya daha önce hesaplanmayan yeni çubuklar olabilir - yani, gösterge okumaları zaten yanlış olacaktır.
:) İşte bu yaptığım şey...