dikey çizgi. - sayfa 4

 

Göstergelerin inceliklerini hâlâ anlıyorum ve sorularım var. Gösterge arabelleğini OnInit() içinde sıfırlıyorum , ancak nedense gösterge derlendiğinde arabellek sıfırlanmıyor. Mantıksal olarak, derlemelerden sonra her arabellek için bir tam hücre olmalıdır, ancak resim birçoğunun olduğunu gösteriyor (bunların önceki arabellek hücreleri olduğunu düşünüyorum). Hatam nerede?

 int OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,ColorHistogram_2Buffer1, INDICATOR_DATA );
   SetIndexBuffer ( 1 ,ColorHistogram_2Buffer2, INDICATOR_DATA );
   SetIndexBuffer ( 2 ,ColorHistogram_2Colors, INDICATOR_COLOR_INDEX );
//--- установим пустое значение
   PlotIndexSetDouble ( 0 , PLOT_EMPTY_VALUE , 0 );

   ArrayInitialize (ColorHistogram_2Buffer1, 0 );
   ArrayInitialize (ColorHistogram_2Buffer2, 0 );
   ArrayInitialize (ColorHistogram_2Colors, EMPTY_VALUE );

   Print ( "-INITALIZATION-" );

   false ;
//---
   return ( INIT_SUCCEEDED );
  }
      if(rates_total-8==i)// || rates_total-5==i || rates_total-2==i)
        {
         ColorHistogram_2Buffer1[i]=high[i];
         ColorHistogram_2Buffer2[i]=low[i];
         ColorHistogram_2Colors[i]=0;
        }


.
 
Nauris Zukas :

Göstergelerin inceliklerini hâlâ anlıyorum ve sorularım var. Gösterge arabelleğini OnInit() içinde sıfırlıyorum , ancak nedense gösterge derlendiğinde arabellek sıfırlanmıyor. Mantıksal olarak, derlemelerden sonra her arabellek için bir tam hücre olmalıdır, ancak resim birçoğunun olduğunu gösteriyor (bunların önceki arabellek hücreleri olduğunu düşünüyorum). Hatam nerede?

OnInit'te gösterge arabelleklerinin uzunluğu sıfırdır.


O halde onlarla gönlünün istediğini yap, bütün bunlar onlar için ölü bir lapa gibidir.

Ancak kod yürütme OnCalculate'e gittiğinde, boyut hemen Rates_total'a eşit olur.

ve dizinin tüm hücrelerinde "çöp" var. Göstergenin eski hesaplamasından da kalabilir.

 
Alexey Viktorov :

OnInit'te gösterge arabelleklerinin uzunluğu sıfırdır.


O halde onlarla gönlünün istediğini yap, bütün bunlar onlar için ölü bir lapa gibidir.

Ancak kod yürütme OnCalculate'e gittiğinde, boyut hemen Rates_total'a eşit olur.

ve dizinin tüm hücrelerinde "çöp" var. Göstergenin eski hesaplamasından da kalabilir.

Çok teşekkür ederim, her şeyi anladım ve her şey yolunda gitti! Böyle mi yaptı:

 bool ResetOnInit= false ;
int OnInit ()
  {   
   ResetOnInit= false ;
   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 &tick_volume[],
                 const long &volume[],
                 const int &spread[])
  {
   if (!ResetOnInit)
     {
       ArrayInitialize (ColorHistogram_2Buffer1, 0 );
       ArrayInitialize (ColorHistogram_2Buffer2, 0 );
       ArrayInitialize (ColorHistogram_2Colors, EMPTY_VALUE );
      ResetOnInit= true ;
     }
  }
 
Nauris Zukas :

Çok teşekkür ederim, her şeyi anladım ve her şey yolunda gitti! Böyle mi yaptı:

Neden bir değişkene iki kez bir değer atanır?

 bool ResetOnInit= false ;
int OnInit ()
  {   
   ResetOnInit= false ;
   return ( INIT_SUCCEEDED );
  }

Ve soru şu: Bütün bunlar neden gerekli? Sonuçta, bir döngüdeki tüm çubuklardan geçerek, dizinin tüm hücreleri zaten bir şeyle doldurulmalıdır. Gösterge yalnızca geçerli konumu göstermedikçe, ancak dizi yalnızca başlangıçta değil, her çubukta başlatılmalıdır...

 
Alexey Viktorov :

Neden bir değişkene iki kez bir değer atanır?

OnInit()'in çizelgedeki tüm eylemleri, örneğin zaman dilimlerini değiştirmeyi taklit ettiğinden emin değildim. Zaman dilimlerinin değişikliği sıfırlandı (şu anda kontrol ettim), ama belki başka bir şey vardır, bu yüzden emin olmak için ikincisini OnInit () içine koydum. Ama yapmazsan, oraya bahse girmem.
 
Alexey Viktorov :

Ve soru şu: Bütün bunlar neden gerekli? Sonuçta, bir döngüdeki tüm çubuklardan geçerek, dizinin tüm hücreleri zaten bir şeyle doldurulmalıdır. Gösterge yalnızca geçerli konumu göstermedikçe, ancak dizi yalnızca başlangıçta değil, her çubukta başlatılmalıdır...

Bu örnekte, sadece arabelleğin nasıl temizleneceğini anlamak istedim. Ancak gelecekte (şu anda üzerinde çalıştığım göstergede), önceki hücreleri tutmam ve yenilerini eklemem gerekecek. Ve tam olarak bunun üzerinde çalışmaya başladım, yani - ilk testler.

 
Nauris Zukas :
OnInit()'in çizelgedeki tüm eylemleri, örneğin zaman dilimlerini değiştirmeyi taklit ettiğinden emin değildim. Zaman dilimlerinin değişikliği sıfırlandı (şu anda kontrol ettim), ama belki başka bir şey vardır, bu yüzden emin olmak için ikincisini OnInit () içine koydum. Ama yapmazsan, oraya bahse girmem.

Ahh... Evet, grafik periyodunu değiştirirken global seviyedeki değişkenler başlatılmaz. ???Tam hatırlamıyorum.

Ve genel olarak, bu ek bool değişkeni olmadan yapabilirsiniz.

 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[])
  {
   if (prev_calculated == 0 )
     {
       ArrayInitialize (ColorHistogram_2Buffer1, 0 );
       ArrayInitialize (ColorHistogram_2Buffer2, 0 );
       ArrayInitialize (ColorHistogram_2Colors, EMPTY_VALUE );
     }
  }
 
Alexey Viktorov :

Ve genel olarak, bu ek bool değişkeni olmadan yapabilirsiniz.

Evet, bu doğru, daha da iyi, teşekkürler.

 

Süre 30 dakikadan fazlaysa neden böyle garip bir sayı döndürdüğünü söyleyebilir misiniz?

 Print ( "PERIOD: " , Period ()); 

KP 0 14:33:22.423 Test_DRAW_COLOR_HISTOGRAM2 (EURUSD,M30) DÖNEM: 30

GG 0 14:33:24.402 Test_DRAW_COLOR_HISTOGRAM2 (EURUSD,H1) DÖNEM: 16385

RJ 0 14:33:25.675 Test_DRAW_COLOR_HISTOGRAM2 (EURUSD,H4) DÖNEM: 16388
 
Nauris Zukas :

Süre 30 dakikadan fazlaysa neden böyle garip bir sayı döndürdüğünü söyleyebilir misiniz?

MT5'te, periyotların değerleri, MT4'teki gibi dakika sayısına eşit değildir.