Göstergem, yeni zaman çerçevesi grafiğine geçtiğimde kayboluyor - sayfa 3

 

Merhaba SDC,

Anladım. Çok teşekkürler.

100 bar varsa toplam oranlar 0'dan 99'a kadar başlar.

Başlangıçta, pre_cal =0 --> limit=100 bar - 0 =100.

for(int=1 to limit=100; I++)

en sonunda, I=100(indeks değeri) ve böyle bir çubuk 100 yok.

Bu nedenle maksimum I=99 yapmak için limit -1 koydum;

Daha iyi bir yol olup olmadığını merak ediyorum.

Üstelik kafamı karıştıran şey, diğer birçok göstergede aynı yaklaşımı kullanmam ve böyle bir menzil dışı problem olmaması.

Ayrıca, Uzman sekmesi için teşekkür ederiz.

SCFX


   int limit=rates_total-prev_calculated;
   if (limit<= 0 ) limit= 2 ;
//---
 
 for ( int i= 1 ;i<limit- 1   ;i++)
{   if ((High[i]-Low[i])== 0 ) continue ;

   if (   MathAbs (Close[i]-Open[i])/(High[i]-Low[i])< 0.50      ) 
      boring[i]=Close[i];
 
scfx :

Üstelik kafamı karıştıran şey, diğer birçok göstergede aynı yaklaşımı kullanmam ve böyle bir menzil dışı problem olmaması.



B600 menzil dışına çıkmadan önce kritik bir hata değildi
 
scfx : .

Bu nedenle maksimum I=99 yapmak için limit -1 koydum;

Daha iyi bir yol olup olmadığını merak ediyorum.

Kodunuz şimdi grafik geçmişini 1. çubuktan hatasız olarak çizecek, ancak yeni çubuklar için çizim yapmayacaktır. Ne yapmak istediğinize bağlı olarak kodlamanın birçok yolu vardır. MQ kodlayıcılarının bunu nasıl yaptığını görmek için meta düzenleyicide bulunan göstergelere bakın. Kodlarını okuyabildiğinizde ve her satırın nedenini anladığınızda, gösterge oluştururken sorun yaşamayacaksınız.

 

Şimdi SDC'yi aldım.

Kişisel olarak konuşursak, belgeyi okuduğumda hayal etmek zor. Yine de neden prev_calculated= Total_rates -1 olduğundan emin değilim.

Bu yüzden burada sayısal bir örnek yapıyorum. Umarım benim gibi yeni birine yardımcı olabilir.

Normalde şunları görürüz:

Limit= oranlar_toplam- önceki_hesaplanmış; //(no-1)

VEYA

for(i=1;i<limit;i++) veya for(i=1;i<=limit;i++)

Önemli olan LIMIT >=1 olduğundan emin olmaktır. Benim durumumda, LIMIT=0 ve bu nedenle, yeni kene geldiğinde gösterge YENİLENMİYOR.

Neden, bakalım. (Sanırım sebep, en azından benim durumumda prev_calculated)

Grafikte 100 çubuk olduğunda göstergeyi eklediğimi varsayarsak. İşte değişken değerleri:

İlk değer tablosu
Değişken
Toplam_oranlar 100
0-99 bar indeksi
prev_hesaplanan 0
100 sınırı
Döngü i değeri 1-99

Herşey iyi. Değer ilk kez çubuk 1'den grafiğin başına kadar görünecektir. Zaten kaç bar hesaplandı? Bu benim hatam için kritik bir nokta ve %100 net değilim.

Yeni çubuk başladığında, şimdi grafikte 101 bar. Gösterge, artık 1. çubuk olan zaten kapalı olan çubukta güncellenmez.

İkinci değer tablosu
Değişken
Toplam_oranlar 101
0-100 çubuğunun indeksi
prev_calculated 99 VEYA 100 (aşağıya bakın)
Sınır 2 VEYA 1
Döngü i değeri 1'e 1 VEYA 1'den 0'a

1. tabloya dayanarak, gösterge 99 barı hesaplar (1'den 99'a kadar döngü olarak).
Ancak belgede şöyle yazıyor: “AMA, start() öğesinin ilk çağrısı değilse, Çubuk-1'e eşit değer döndürülecektir). Yani 101-1=100 dönecektir.
Bu bir bar farklı sorun yaratır. Sistem prev_hesaplanmış olarak 100 döndürürse.
Görüyorsunuz, eğer prev_calculated=99 ise, döngü çalışacaktır.
Ancak, prev_calculated = 100 gibi görünün ve bu nedenle döngü, limit = 0 veya -1'e bağlı olarak çalışmayacaktır.
Bu durumda prev_calculated= Bars-1'in arkasındaki mantığı görmeme yardımcı olabilecek var mı?

Dolayısıyla çözüm oldukça açık: Make for(i=1; ___ burada bu, (<) için 1'den büyük veya (<=)___; i++ için 1'den büyük veya eşit olmalıdır). Son kodumda 0'a eşit.

   int pcal=prev_calculated;
   
   if (prev_calculated> 0 )
   pcal--; 
      
   int limit=rates_total-pcal;
   for(int i=1;i<=limit  ;i++)	//it is <=


//--------------OR ------------------------

  int limit=rates_total-prev_calculated-1;
  if (limit<= 0 ) limit= 2 ; //NOT limit

for(int i=1;i<=limit  ;i++) //it is <=

Umut ediyorum bu yardım eder.

SCFX

 

prev_hesaplanmış == oranlar_toplam

scfx :

Şimdi SDC'yi aldım.

Kişisel olarak konuşursak, belgeyi okuduğumda hayal etmek zor. Yine de neden prev_calculated= Total_rates -1 olduğundan emin değilim.

SCFX

Yeni bir gösterge oluşturun, bu kodu başlatma işlevine yerleştirin, 1 dakikalık bir tabloya ekleyin ve keneler geldiğinde uyarıları izleyin.

 Alert ( "rt = " ,rates_total, "  pc = " ,prev_calculated);

Rate_total'ın mevcut çubuk miktarı olduğunu göreceksiniz.

prev_hesaplanan, önceki onaydaki çubukların miktarıdır.

 
SDC :

prev_hesaplanmış == oranlar_toplam

Yeni bir gösterge oluşturun, bu kodu başlatma işlevine yerleştirin, 1 dakikalık bir tabloya ekleyin ve keneler geldiğinde uyarıları izleyin.

Rate_total'ın mevcut çubuk miktarı olduğunu göreceksiniz.

prev_hesaplanan, önceki onaydaki çubukların miktarıdır.


vay bu garip.

Daha önce yayınlanan bağlantıda, eğer :BUT start()'ın ilk çağrısı değilse, Bars-1'e eşit değerin döndürüleceğini söylediler.

Barları (Rate_totals) nasıl döndürüyor?

 

evet öyle dediklerini biliyorum ama tam olarak doğru değil.

gerçekte olan şudur.

Rates_total == Geçerli tik geldiğinde toplam çubuk miktarı. prev_calculated == önceki tik geldiğinde toplam çubuk miktarı.

Grafikteki Çubuklar Gösterge Durumu oranlar-toplam önceden hesaplanmış oranları_toplam-önceki_hesaplanmış
1000 yüklendiğinde ilk çalıştırma 1000 0 1000
1000 sonraki onay işareti 1000 1000 0
1000 sonraki onay işareti 1000 1000 0
1001 yeni çubuğun 1. işareti 1001 1000 1
1001 sonraki onay işareti 1001 1001 0
1001 sonraki onay işareti 1001 1001 0

Bu nedenle, önceden hesaplanmış ve oranları_toplam olarak 3 ana durumunuz var. Gösterge yüklendi, orta çubuk tıklanıyor, yeni çubuk ilk tıklanıyor.

prev_calculated == 0 ilk çalıştırmada çünkü gösterge yüklendiğinden beri bir önceki onay işareti yok.

Ayrıca grafik değiştirilirse veya geçmiş eklenirse, prev_calculated sıfırlanır.

OnCalculate'den gelen dönüş değeri kullanılmaz, ancak bunu düzeltmeleri durumunda varsayılan dönüşü (rates_total) kullanmak en iyisidir.

 
Grafikteki Çubuklar Gösterge Durumu oranlar-toplam önceden hesaplanmış oranları_toplam-önceki_hesaplanmış
1000 yüklendiğinde ilk çalıştırma 1000 0 1000
Ve çubuk 1000 mevcut değil.

Yeni belgelerin ne dediğini biliyorum . Bunu onların yöntemiyle yaparsanız, prev_calculated'ı sıfırdan farklı olarak test etmeniz ve Rate_total - prev_calculated'ı bir aşağı ayarlamanız gerekir. Bu, gösterge_sayılan karışıklığın azalmasına geri dönüyor.
 int OnCalculate ( const int rates_total,
                 const int prev_calculated, ...){
   #define LOOKBACK 1 // iMA(... iBar+1)
   int indicator_counted = prev_calculated;
   if (indicator_counted < LOOKBACK) indicator_counted = LOOKBACK;
   for (iBar = rates_total - 1 - indicator_counted; i>= 0 i--){
      Buffer[iBar] = ...;
   }
   return ( rates_total - 1 ); // Recalculate bar zero next tick.
}
Göstergenin ilerlemesini göster - MQL4 forumu
 

return( Rates_total - 1 ) yapmanın bir anlamı yok, prev_calculated'ın değeri, ne döndürmesini söylemiş olursanız olun, sanki return(rates_total) gibi.

 
SDC : return( Rates_total - 1 ) yapmanın bir anlamı yok, prev_calculated'ın değeri, ne döndürmesini söylemiş olursanız olun, sanki return(rates_total) gibi.
Sorunu servis masasına gönderdiniz mi?
Neden: