prev_hesaplanmış - sayfa 2

 
Alexey Kozitsyn :
Ve 0 olduğunda tüm göstergeyi yeniden hesaplarsanız? Bana göre en iyi çözüm.
Tonlarca grafiğe sahip ağır bir gösterge için en iyisinden çok uzak. Hayır, çözüm basit - prev_calculated yerine kendi değişkeninizi, statik veya global kullanın. Ama bu hala bir koltuk değneği, ama bir tane daha yakmak istedim
 
Alexey Kozitsyn :
:) İşte bu yaptığım şey...
Anladım, sorunuzu alıntıladım ama gerçekte Alexander Puzanov'a cevap verdim. :)
 
Alexander Puzanov :
Tonlarca grafiğe sahip ağır bir gösterge için en iyisinden çok uzak. Hayır, çözüm basit - prev_calculated yerine kendi değişkeninizi (statik veya global) kullanın. Ama bu hala bir koltuk değneği, ama bir tane daha yakmak istedim

Koltuk değneği kelimesini kullanan kişi:

  • veya belgeleri okumak için tembel olun
  • ya da nasıl doğru olması gerektiğini henüz bilmiyor.
Tek doğru çözüm, prev_calculate==0 ise göstergeyi yeniden hesaplamaktır.

 
Alexander Puzanov :
Tonlarca grafiğe sahip ağır bir gösterge için en iyisinden çok uzak. Hayır, çözüm basit - prev_calculated yerine kendi değişkeninizi, statik veya global kullanın. Ama bu hala bir koltuk değneği, ama bir tane daha yakmak istedim
Asla koltuk değneği değil. Ben öyle yapıyorum .
 
Karputov Vladimir :
Ve geçmiş pompalanırsa, atlanan veya daha önce hesaplanmayan yeni çubuklar olabilir - yani, gösterge okumaları zaten yanlış olacaktır.

Slava :

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.

Her şey açık, ama ne yazık ki bu, şunu reddetmez:

Aleksandr Puzanov :

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

Göstergeler farklıdır, bazıları hesaplamalar için çubuklara ihtiyaç duymaz, diğerleri yalnızca canlı kenelere ihtiyaç duyar, diğerlerinin yeniden hesaplama derinliğinde bir sınırı vardır - tarihte neyin değiştiği, dördüncü iz grafik nesneleri vb. umurlarında değildir. Prev_calculated'a eklenen geçmişteki değişiklikleri izlemek için ek işlevlere ihtiyaçları yoktur, yalnızca buna ihtiyaçları vardır - 'önceki çağrıda işlenen çubuklar'. Bu değil

Genel olarak, uv programcıları, lütfen marangozun dikkatini 'olayını yakalamaktan' uzaklaştırmayın.

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

Bunun en iyi çözüm olduğunu söyleyemem. Her neyse, henüz en iyisi değil.

Hesaptaki mevcut düşüşü kaydeden bir gösterge yazmaya karar verdim, bu yüzden geçmişte hiçbir şeyi yeniden hesaplamama gerek yok. İlk satır böyle görünüyordu.

if (prev_calculated == 0 )   return (rates_total);
Ancak başladıktan sonra arabelleklerin boş olmadığını ve sıfırlanmadığını gördüm. Tamponlarda, bir miktar fiyat hiçbir yerden gelmez. Sıfır arabelleği zorlamak zorunda kaldım... Sonra başka bir sorun keşfedildi. Söz konusu olandır, prev_calculate sıfırlanır ve gösterge yeniden hesaplanır, sırasıyla tüm tamponları son çubuğa kadar sıfırlar. Genel olarak, şimdiye kadar bu girişimi terk etti.
 
Alexey Viktorov :

Bunun en iyi çözüm olduğunu söyleyemem. Her neyse, henüz en iyisi değil.

Hesaptaki mevcut düşüşü kaydeden bir gösterge yazmaya karar verdim, bu yüzden geçmişte hiçbir şeyi yeniden hesaplamama gerek yok. İlk satır böyle görünüyordu.

if (prev_calculated == 0 )   return (rates_total);
Ancak başladıktan sonra arabelleklerin boş olmadığını ve sıfırlanmadığını gördüm. Tamponlarda, bir miktar fiyat hiçbir yerden gelmez. Sıfır arabelleği zorlamak zorunda kaldım... Sonra başka bir sorun keşfedildi. Söz konusu olandır, prev_calculate sıfırlanır ve gösterge yeniden hesaplanır, sırasıyla tüm tamponları son çubuğa kadar sıfırlar. Genel olarak, şimdiye kadar bu girişimi terk etti.

"... hiçbir yerden gelmeyen bir fiyat...", gösterge arabelleği dizisinin BAŞLATILMAMIŞ öğelerinin çöplüğüdür. Nasıl yapılır:

  • prev_calculate==0 ise, bir döngüdeki gösterge arabelleğinin tüm öğelerini gözden geçirin ve bunlara değerler atayın. Aynı zamanda, yeni bir çubuk göründüğünde durumu izlemek gerekir ( oranları_toplam eksi ön_hesaplama sıfırdan büyük olacaktır) - bu durumda gösterge arabelleği buna göre artar ve bu yeni öğenin de başlatılması gerekir.

 

global değişkenler kullanmadan normal değerlerden çöplerin nasıl ayıklanacağına dair daha iyi bir örnek verin.

Belgeleri alıntılamak için hepsi çok fazla.


 

Kimsenin kimseye borcu yoktur. Yani, gösterge arabelleğinde, bağlamadan sonra, dizinin tüm öğelerini kendiniz başlatana kadar çöp olacaktır.

Katma:

Bir örnek oluşturalım...

//+------------------------------------------------------------------+
//|                                              prev_calculated.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots    1
#property indicator_type1   DRAW_LINE
#property indicator_color1   clrGray
#property indicator_label1   "prev_calculated"
//---- buffers
double ExtBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,ExtBuffer, INDICATOR_DATA );
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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 )
     {
       //--- инициализация элементов индикаторного буфера при первом запуске или при подкачке истории
       for ( int i= 0 ;i<rates_total;i++)
         ExtBuffer[i]= 1.01 ;
       return (rates_total);
     }
//--- пересчитываем самый правый бар или самый правый бар и один предыдущий при появлении нового бара
   int limit=rates_total-prev_calculated+ 1 ;
   for ( int i=rates_total-limit;i<rates_total;i++)
     {
       //--- визуализация пересчёта самого правого бара
       static bool drive= false ;
       if (!drive)
         ExtBuffer[i]= 1.03 ;
       else
         ExtBuffer[i]= 1.02 ;
      drive=!drive;
     }
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
M1'de başlatın. Sadece en sağdaki çubuğun yeniden hesaplandığı görülecektir.
Dosyalar:
 
Karputov Vladimir :

Kimsenin kimseye borcu yoktur. Yani, gösterge arabelleğinde, bağlamadan sonra, dizinin tüm öğelerini kendiniz başlatana kadar çöp olacaktır.

Katma:

Bir örnek oluşturalım...

//+------------------------------------------------------------------+
//|                                              prev_calculated.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots    1
#property indicator_type1   DRAW_LINE
#property indicator_color1   clrGray
#property indicator_label1   "prev_calculated"
//---- buffers
double ExtBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,ExtBuffer, INDICATOR_DATA );
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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 )
     {
       //--- инициализация элементов индикаторного буфера при первом запуске или при подкачке истории
       for ( int i= 0 ;i<rates_total;i++)
         ExtBuffer[i]= 1.01 ;
       return (rates_total);
     }
//--- пересчитываем самый правый бар или самый правый бар и один предыдущий при появлении нового бара
   int limit=rates_total-prev_calculated+ 1 ;
   for ( int i=rates_total-limit;i<rates_total;i++)
     {
       //--- визуализация пересчёта самого правого бара
       static bool drive= false ;
       if (!drive)
         ExtBuffer[i]= 1.03 ;
       else
         ExtBuffer[i]= 1.02 ;
      drive=!drive;
     }
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
M1'de başlatın. Sadece en sağdaki çubuğun yeniden hesaplandığı görülecektir.

Yanlış soruya cevap verme yeteneği...

Şimdi bana şu durumlarda ne olacağını açıklayın:

1. 100 bar yeniden hesaplandı, 0'dan 99'a kadar tamponlara girildi (yönü bir zaman serisi olarak ele alalım) değeri 1.03

2. Aniden geçmiş yüklendi ve prev_hesaplanan 0 oldu

Gösterge hangi çubuktan 1.03 değerini gösterecek?