prev_hesaplanmış - sayfa 6

 
Sadece ütüleri fındıkla delmeyin.
 
Alexey Viktorov :
Bu belgelerde DEĞİLDİR! Bu nedenle, bunlar ücretsiz bir tema üzerine denemelerdir. Otomatik başlatma hakkındaki ifademin yanı sıra, daha da havalı. En azından benimki bir uyarı ile oldu ...

Kesinlikle her şey belgelerde açıklanamaz.

"prev_calculate==0" elde ettik, bu da tüm gösterge arabelleğini gözden geçirmemiz gerektiği anlamına geliyor. "prev_calculate!=0", bu durumda yalnızca en sağdaki çubuğu veya birkaç yeni çubuğu saydığımız anlamına geliyorsa ( limit kullanın):

                 const int &spread[])
  {
//---
   if (prev_calculated== 0 )
     {
       Print ( "prev_calculated==0" );
             for ( int i= 0 ;i<rates_total;i++)
              {
               //--- здесь принудительно каждому элементу массива присваиваем значение (мне лень писать эти массивы :) )
      
              }
       return (rates_total);
     }
//--- экономный пересчёт только самого правого бара или новых баров
   int limit=rates_total-prev_calculated+ 1 ;

//--- а ниже нужно использовать цикл для обсчета самого правого бара или новых баров
   for ( int i=0;i<limit;i++)
     {
      ExtBuffer[i]=чевой-то там;
     }
 
Karputov Vladimir :

Kesinlikle her şey belgelerde açıklanamaz.

"prev_calculate==0" elde ettik, bu da tüm gösterge arabelleğini gözden geçirmemiz gerektiği anlamına geliyor. "prev_calculate!=0", bu durumda yalnızca en sağdaki çubuğu veya birkaç yeni çubuğu saydığımız anlamına geliyorsa ( limit kullanın):

                 const int &spread[])
  {
//---
   if (prev_calculated== 0 )
     {
       Print ( "prev_calculated==0" );
             for ( int i= 0 ;i<rates_total;i++)
              {
               //--- здесь принудительно каждому элементу массива присваиваем значение (мне лень писать эти массивы :) )
      
              }
       return (rates_total);
     }
//--- экономный пересчёт только самого правого бара или новых баров
   int limit=rates_total-prev_calculated+ 1 ;

//--- а ниже нужно использовать цикл для обсчета самого правого бара или новых баров
   for ( int i=0;i<limit;i++)
     {
      ExtBuffer[i]=чевой-то там;
     }




Anlamı nedir??? En sağdaki çubuk dışında herhangi bir değere ihtiyacım yok. AMA !!! Daha sonra, bu en sağdaki sola kaydığında, oraya konulan bu verilerin kaydedilmesi gerekir...

Tüm tamponları yazmama gerek yok ama benim isteklerim dikkate alınarak bir tane yazılabilirdi. Bu ilk çalıştırmaysa, tüm geçmiş boş olmalıdır. Ön_hesaplananın sıfırlanması, takas geçmişinin bir sonucu olarak meydana geldiyse, arabelleğe konulan HER ŞEY değişmeden kalmalıdır. Delikler olsa bile.

 
Karputov Vladimir :

Ön sonuçlar:

1. Göstergelerde, OnInit() içindeki gösterge dizilerinin başlatılmasına güvenemezsiniz:

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
...
   ArrayInitialize (balance, 0.0 );     // принудительная
   ArrayInitialize (equityMax, 0.0 );   // инициализация
   ArrayInitialize (equityMaxB, 0.0 ); // всех
   ArrayInitialize (equityMin, 0.0 );   // буферов
   ArrayInitialize (equityMinB, 0.0 ); // индикатора

...
//---
   return ( INIT_SUCCEEDED );
  }

2. Göstergelerde, tüm diziyi veya yalnızca OnCalculate()'de değiştirilen öğeleri gözden geçirmek gerekir.

Neden saçmalık taşıyorsun? Böyle bir başlatma OnCalculate'e konursa, herhangi bir döngü olmaksızın bir patlama ile sıfırlanır. Ancak ön_hesaplanan sıfırlanırsa, çalışma sırasında biriken tüm verileri sıfırlar...
 
Alexey Viktorov :
Neden saçmalık taşıyorsun? Böyle bir başlatma OnCalculate'e konursa, herhangi bir döngü olmaksızın bir patlama ile sıfırlanır. Ancak ön_hesaplanan sıfırlanırsa, çalışma sırasında biriken tüm verileri sıfırlar...
Lütfen ifadeleri seçin. Ve standart teslimattaki gösterge örneklerini inceleyin: data directory\MQL5\Indicators\Examples\
 
Alexey Viktorov :

Anlamı nedir??? En sağdaki çubuk dışında herhangi bir değere ihtiyacım yok. AMA !!! Daha sonra, bu en sağdaki sola kaydığında, oraya konulan bu verilerin kaydedilmesi gerekir...

...

Zaten bir yol önerdim:

açılış zamanı ile senkronizasyondur, ancak burada nüanslar olabilir: örneğin, çubuk açılış zamanı (bir dosyaya kaydedilmiş) 2016.09.05 idi. 25:02 ve şimdi grafikte zamanı 2016.09.05 olan bir çubuk var. 25:01.

Gösterge bir veri tabanı veya depo değildir.

Bu nedenle, gösterge geçmiş için hesaplanamayan verileri görüntülerse, geriye kalan tek şey gösterge arabelleğini bir dosyaya kaydetmek ve ardından (geçmişin değiştirilmesi durumunda) dosyayı ve çubukları okuyup senkronize etmektir.
 
Karputov Vladimir :

Zaten bir yol önerdim:

Gösterge bir veri tabanı veya depo değildir.

Bu nedenle, gösterge geçmiş için hesaplanamayan verileri görüntülerse, geriye kalan tek şey gösterge arabelleğini bir dosyaya kaydetmek ve ardından (geçmişin değiştirilmesi durumunda) dosyayı ve çubukları okuyup senkronize etmektir.

Alexey Viktorov :

... ve tercihen bir dosyaya yazmadan, hatta daha fazlası GV'de.

prev_calculated
prev_calculated
  • www.mql5.com
Форум трейдеров MQL5.community
 

Vladimir, bu konuyu prev_calculated için bir uzman olarak seçtiğine göre, bu konuyu bu konu için faydalı yap. İlk olarak, genellikle bu değişkenle karşılaşılan sorunu belirlemek gerekir. Bu sorunlara aşina değilseniz, formüle edeceğim

---

ve - en azından söylediği yardımda

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

sadece bunun için kullanamazsınız - her an bir incir gösterebilir. Bunun nedeni (geliştiriciler tarafından söylenen yardımda + yazılmıştır), sağlama toplamı değiştirildiğinde, genellikle geçmiş sayfalama nedeniyle değişkenin sıfıra sıfırlanmasıdır.

---

b - OnCalculate'in ilk başlatılması için de prev_calculated == 0'ı bayrak olarak kullanamazsınız. Aynı sebepten

---

c - ve geçmiş sayfalama bayrağı olarak prev_calculated == 0 da kullanılamaz

---

Kullanıcılar tarafından tırmık aşınmasını ve yıpranmasını azaltmak için, bunu kısa ve net bir şekilde formüle etmek arzu edilir: eğer mevcut OnCalculate çağrısında geçmiş sayfalaması gerçekleşmediyse, prev_calculated bir öncekinde işlenen çubukların sayısını içerir. Olursa sıfırlanır.

---

Listelenen 3 fişin tümü koltuk değneği ile atlanabilir. Ancak tanım gereği MT5'te koltuk değneği olmadığı için, siz Vladimir, bu 3 görev için güzel bir çözüm bulabilirdiniz. Bunun gibi çirkin bir şey:

#property indicator_chart_window
#property indicator_buffers    0
#property indicator_plots      0


struct BROWNIE {
   int    i_Prew_Calculated;   // кол-во посчитанных баров
   bool   b_First_Run;         // флаг первого запуска
   bool   b_History_Updated;   // флаг обновления истории
  
  BROWNIE() {
    i_Prew_Calculated = WRONG_VALUE ;
    b_First_Run = true ;
    b_History_Updated = false ;
  }
  
   void f_Reset( bool b_Reset_First_Run = true ) {
    i_Prew_Calculated = WRONG_VALUE ;
     if (b_Reset_First_Run) b_First_Run = true ;
    b_History_Updated = false ;
  }
  
   void f_Update( int i_New_Prew_Calculated = WRONG_VALUE ) {
     if (i_New_Prew_Calculated > - 1 ) {
      b_History_Updated = i_New_Prew_Calculated == 0 && i_Prew_Calculated > WRONG_VALUE ;
       if (b_First_Run) b_First_Run = false ;
      
       if (i_Prew_Calculated == WRONG_VALUE ) i_Prew_Calculated = i_New_Prew_Calculated;
       else if (i_New_Prew_Calculated > 0 ) i_Prew_Calculated = i_New_Prew_Calculated;
    }
  }
};
BROWNIE go_Brownie;


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


void OnDeinit ( const int reason) {
  go_Brownie.f_Reset(reason != REASON_CHARTCHANGE );
}



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[]
) {
   if (go_Brownie.b_First_Run) { /* обработка 1го запуска */ }
   if (go_Brownie.b_History_Updated) { /* обработка обновления истории */ }
  go_Brownie.f_Update(prev_calculated);
  
   return (rates_total);
}

Feragatname: kod çıplak bir fikirdir, grafikte çalıştırmadım

OnDeinit'in arabellek kullanmayan bir gösterge için örnek işlemesi vardır, zaman çerçeveleri ve sembollerle ilgilenmez, her zaman çerçevesi/sembol değişikliği ile her şeyi sıfırdan başlatmanız gerekmez. Örneğin, mevcut grafik öğelerle çalışır, hesabın durumu, siparişler vb. hakkında bilgileri görüntüler.

---

Bu arada

Karputov Vladimir :

daha sonra yalnızca gösterge arabelleğini bir dosyaya kaydetmek ve ardından (geçmişin değiştirilmesi durumunda) dosyayı ve çubukları okuyup senkronize etmek için kalır.

Vidayı ezmek gerekli değildir, grafikteki grafik öğelere kaydedebilirsiniz.
 
Alexey Viktorov :
... ve tercihen bir dosyaya yazmadan, hatta daha fazlası GV'de.
Belki bu sana yakışır?
 
Konstantin Gruzdev :
Belki bu sana yakışır?

Ayrıntılara girmedim, ancak bu, bu kod satırıyla çözüldü. Dizin kayması ile bir diziyi kendisine kopyalama.

double arr[ 5 ];
ArrayCopy (arr, arr, 0 , 1 , 4 );
// и дальнейшее заполнение 4го индекса массива.
Sıfırdan çevirebilir ve kopyalayabilir ve ilkinden yapıştırabilirsiniz. Daha sonra dizinin sıfır indeksi doldurulur. Ve bu tamamen farklı bir operadan ...)))