prev_hesaplanmış - sayfa 9

 
Alexey Kozitsyn :
Evet, döngü hakkında, belki de çok fazla. Ancak prev_calculated = 0 (önceden doldurulmuş bir tamponla) ile bu tamponda bazı değerler sıfırlanırsa, belki de bu bir hatadır. Şimdi kontrol edelim...

Tam olarak sıfırlanmazlar, ancak tarihin tüm derinliği için tüm gösterge yeniden hesaplanır. Buna göre, sadece en sağdaki tampon indeksi doldurmam gerekiyorsa, ancak sola kaydırıldığında bu değerler kalmalı, o zaman iki seçenek var:

1. Gösterge arabelleği başlatılırken, müdahale eden ve temizlenmesi gereken çöplerle doludur.

2. Temizlendi, ancak prev_calculated = 0 olduğunda, arabellek tekrar temizlenir ve birikmiş tüm değerleri kaldırır.


Genel olarak, çözüm delice basittir. prev_calculated = 0 bayrağı ile birlikte bu sorunu çözer.

 
Alexey Viktorov :

...

Genel olarak, çözüm delice basittir. prev_calculated = 0 bayrağı ile birlikte bu sorunu çözer.

Karar vermiyor. Birkaç çubuk süren bir bağlantı kesintisi olacak, birkaç çubuk çöple başlatılmayacak.
 
Alexey Viktorov :

Rol yapma ... Her şey açık, ama resim özellikle senin için



Bilgisayar kapanmadan çalıştı, çizelge kapanmadı, gösterge tablodan kaldırılmadı...

Soru: 2 dakikalık çubuklar nereye gitti???

Büyük olasılıkla kodunuzda bir hata var. Şimdi bir test göstergesi yazdım, yenile butonu ile resetleyince tamponun boyutu değişmiyor, tampondaki veriler değişmiyor...

#property indicator_buffers 1
#property indicator_plots 1
#property indicator_chart_window
#property indicator_type1 DRAW_NONE
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double buf[];
const double _price= 98000 ;
bool _firstLaunch= true ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
   SetIndexBuffer ( 0 ,buf);
//---
   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 )
     {
       if (_firstLaunch)
        {
         Print ( __FUNCTION__ , ": Первый запуск! Размер буфера = " , ArraySize (buf));
         ArrayInitialize (buf,_price);
         _firstLaunch= false ;
        }
       else
        {
         Print ( __FUNCTION__ , ": prev_calculated после обновления = " ,prev_calculated, ". Размер буфера = " , ArraySize (buf));
         //--- Проверяем отличие значений от эталонного
         for ( int i=rates_total- 1 ; i>= 0 ; i--)
             if (buf[i]!=_price)
               Print ( __FUNCTION__ , ": Значение #" ,i, " '" + DoubleToString (buf[i], _Digits )+
                     "' отличается от эталонного '" + DoubleToString (_price, _Digits ));
        }
     }
   else
     {
       if (rates_total>prev_calculated)
         buf[rates_total- 1 ]=_price;
     }
   return (rates_total);
  }
 

Ön_hesaplanandan oranlar_toplamına kadar olan arabelleği temizlemek gerekir.

 
 
Veya yukarıda Dmitry'nin dediği gibi birkaç çubukta bağlantı koptu... Bu arada prev_calculated bağlantı koptuğunda da 0 döndürür mü?
 
Dmitry Fedoseev :
Stüdyo kodu. Gülelim ve açıklayalım.

ben zaten komikim

/********************************************************************\
|                                               BalansEquityTest.mq5 |
|                                                           Viktorov |
|                                                  v4forex@yandex.ru |
\********************************************************************/

#property copyright "Viktorov"
#property link        "v4forex@yandex.ru"
#property version    "1.00"
#property indicator_separate_window
#property indicator_buffers    6
#property indicator_plots      3
#property indicator_type1     DRAW_COLOR_LINE
#property indicator_color1     clrGold , clrGreen , clrRed
#property indicator_width1     2
#property indicator_label1     "Balance"
#property indicator_type2     DRAW_HISTOGRAM2
#property indicator_color2     clrCrimson
#property indicator_width2     2
#property indicator_label2     "EquityMin"
#property indicator_type3     DRAW_HISTOGRAM2
#property indicator_color3     clrDarkViolet
#property indicator_width3     2
#property indicator_label3     "EquityMax"

double balance[];
double clrBalance[];
double equityMaxB[];
double equityMinB[];
double equityMax[];
double equityMin[];
double maxEquity, minEquity;

bool flag = true ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 , balance, INDICATOR_DATA );
   SetIndexBuffer ( 1 , clrBalance, INDICATOR_COLOR_INDEX );
   SetIndexBuffer ( 2 , equityMin, INDICATOR_DATA );
   SetIndexBuffer ( 3 , equityMinB, INDICATOR_DATA );
   SetIndexBuffer ( 4 , equityMax, INDICATOR_DATA );
   SetIndexBuffer ( 5 , equityMaxB, INDICATOR_DATA );
   PlotIndexSetDouble ( 0 , PLOT_EMPTY_VALUE , 0.0 );
   PlotIndexSetDouble ( 1 , PLOT_EMPTY_VALUE , 0.0 );
   PlotIndexSetDouble ( 2 , PLOT_EMPTY_VALUE , 0.0 );
   PlotIndexSetDouble ( 3 , PLOT_EMPTY_VALUE , 0.0 );
   PlotIndexSetDouble ( 4 , PLOT_EMPTY_VALUE , 0.0 );
   ArraySetAsSeries (balance, true );
   ArraySetAsSeries (clrBalance, true );
   ArraySetAsSeries (equityMax, true );
   ArraySetAsSeries (equityMaxB, true );
   ArraySetAsSeries (equityMin, true );
   ArraySetAsSeries (equityMinB, true );
   IndicatorSetInteger ( INDICATOR_DIGITS , 2 );
   IndicatorSetString ( INDICATOR_SHORTNAME , "Show Money" );
//---
   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 )
  {
   Print ( "prev_calculated = " , prev_calculated);
   if (flag)
    {
     ArrayInitialize (balance, 0.0 );
       ArrayInitialize (equityMax, 0.0 );
       ArrayInitialize (equityMaxB, 0.0 );
       ArrayInitialize (equityMin, 0.0 );
     ArrayInitialize (equityMinB, 0.0 );
      flag = false ;
    }
   return (rates_total);
  }
   double bal = NormalizeDouble ( AccountInfoDouble ( ACCOUNT_BALANCE ), 2 );
   double equity = NormalizeDouble ( AccountInfoDouble ( ACCOUNT_EQUITY ), 2 );
   if (rates_total > prev_calculated)
   {
    minEquity = 0 ;
    maxEquity = 0 ;
   }
   minEquity = NormalizeDouble ( fmin ((minEquity == 0 ? bal : minEquity), equity), 2 );
    maxEquity = NormalizeDouble ( fmax (maxEquity, equity), 2 );
    balance[ 0 ] = bal;
    clrBalance[ 0 ] = 0.0 ;
    equityMinB[ 0 ] = balance[ 0 ];
    equityMin[ 0 ] = minEquity;
    equityMaxB[ 0 ] = balance[ 0 ];
    equityMax[ 0 ] = maxEquity;
     if (balance[ 0 ] > balance[ 1 ])
     clrBalance[ 0 ] = 1.0 ;
     if (balance[ 0 ] < balance[ 1 ])
     clrBalance[ 0 ] = 2.0 ;
     Comment ( PositionsTotal ());
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+

Gece boyunca çok fazla prev_calculate sıfırlaması yapıldı

2016.10 . 19 08 : 42 : 23.309 BalansEquityTest (EURUSD,M1)    prev_calculated = 0
2016.10 . 19 05 : 47 : 04.915 BalansEquityTest (EURUSD,M1)    prev_calculated = 0
2016.10 . 19 05 : 47 : 04.075 BalansEquityTest (EURUSD,M1)    prev_calculated = 0
2016.10 . 19 04 : 46 : 15.300 BalansEquityTest (EURUSD,M1)    prev_calculated = 0
2016.10 . 19 04 : 46 : 15.030 BalansEquityTest (EURUSD,M1)    prev_calculated = 0
2016.10 . 19 04 : 45 : 37.590 BalansEquityTest (EURUSD,M1)    prev_calculated = 0
2016.10 . 19 04 : 45 : 37.100 BalansEquityTest (EURUSD,M1)    prev_calculated = 0
2016.10 . 19 01 : 40 : 31.224 BalansEquityTest (EURUSD,M1)    prev_calculated = 0
2016.10 . 19 00 : 00 : 32.196 BalansEquityTest (EURUSD,M1)    prev_calculated = 0
2016.10 . 19 00 : 00 : 31.806 BalansEquityTest (EURUSD,M1)    prev_calculated = 0
2016.10 . 18 20 : 33 : 02.954 BalansEquityTest (EURUSD,M1)    prev_calculated = 0 // Это время последнего запуска индикатора.
 
Dmitry Fedoseev :

Ön_hesaplanandan oranlar_toplamına kadar olan arabelleği temizlemek gerekir.

Cevabım buysa, gösterge ilk kez başlatıldığında, arabellek verilen değerle tamamen başlatılır. Yeni bir çubuk oluştuğunda yeni değerler eklenir.
 
Alexey Kozitsyn :
Veya yukarıda Dmitry'nin dediği gibi birkaç çubukta bağlantı koptu... Bu arada prev_calculated bağlantı koptuğunda da 0 döndürür mü?

Bir zamanlar tüm problemler için prev_calculated 0 döndürürdü. Sonra forumda 0'a sıfırlamanın her zaman mümkün olmayacağı ve bazı durumlarda en son hesaplanana kadar olabileceği konusunda bir tartışma vardı. değer, Slava konuya katıldı ve konuyla ilgileneceğine söz verdi.

Bir süre sonra, prev_calculated'ın bazen ara değerlere sahip olduğunu fark ettim. Şimdi işlerin nasıl olduğunu bilmiyorum, her gün prev_calculated'ın orada ne döndürdüğünü takip etmiyorum.

 
Alexey Kozitsyn :
Cevabım buysa, gösterge ilk kez başlatıldığında, arabellek verilen değerle tamamen başlatılır. Yeni bir çubuk oluştuğunda yeni değerler eklenir.
Sana değil.
 
Alexey Viktorov :

ben zaten komikim

/********************************************************************\
|                                               BalansEquityTest.mq5 |
|                                                           Viktorov |
|                                                  v4forex@yandex.ru |
\********************************************************************/

#property copyright "Viktorov"
#property link        "v4forex@yandex.ru"
#property version    "1.00"
#property indicator_separate_window
#property indicator_buffers    6
#property indicator_plots      3
#property indicator_type1     DRAW_COLOR_LINE
#property indicator_color1     clrGold , clrGreen , clrRed
#property indicator_width1     2
#property indicator_label1     "Balance"
#property indicator_type2     DRAW_HISTOGRAM2
#property indicator_color2     clrCrimson
#property indicator_width2     2
#property indicator_label2     "EquityMin"
#property indicator_type3     DRAW_HISTOGRAM2
#property indicator_color3     clrDarkViolet
#property indicator_width3     2
#property indicator_label3     "EquityMax"

double balance[];
double clrBalance[];
double equityMaxB[];
double equityMinB[];
double equityMax[];
double equityMin[];
double maxEquity, minEquity;

bool flag = true ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 , balance, INDICATOR_DATA );
   SetIndexBuffer ( 1 , clrBalance, INDICATOR_COLOR_INDEX );
   SetIndexBuffer ( 2 , equityMin, INDICATOR_DATA );
   SetIndexBuffer ( 3 , equityMinB, INDICATOR_DATA );
   SetIndexBuffer ( 4 , equityMax, INDICATOR_DATA );
   SetIndexBuffer ( 5 , equityMaxB, INDICATOR_DATA );
   PlotIndexSetDouble ( 0 , PLOT_EMPTY_VALUE , 0.0 );
   PlotIndexSetDouble ( 1 , PLOT_EMPTY_VALUE , 0.0 );
   PlotIndexSetDouble ( 2 , PLOT_EMPTY_VALUE , 0.0 );
   PlotIndexSetDouble ( 3 , PLOT_EMPTY_VALUE , 0.0 );
   PlotIndexSetDouble ( 4 , PLOT_EMPTY_VALUE , 0.0 );
   ArraySetAsSeries (balance, true );
   ArraySetAsSeries (clrBalance, true );
   ArraySetAsSeries (equityMax, true );
   ArraySetAsSeries (equityMaxB, true );
   ArraySetAsSeries (equityMin, true );
   ArraySetAsSeries (equityMinB, true );
   IndicatorSetInteger ( INDICATOR_DIGITS , 2 );
   IndicatorSetString ( INDICATOR_SHORTNAME , "Show Money" );
//---
   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 )
  {
   Print ( "prev_calculated = " , prev_calculated);
   if (flag)
    {
     ArrayInitialize (balance, 0.0 );
       ArrayInitialize (equityMax, 0.0 );
       ArrayInitialize (equityMaxB, 0.0 );
       ArrayInitialize (equityMin, 0.0 );
     ArrayInitialize (equityMinB, 0.0 );
      flag = false ;
    }
   return (rates_total);
  }
   double bal = NormalizeDouble ( AccountInfoDouble ( ACCOUNT_BALANCE ), 2 );
   double equity = NormalizeDouble ( AccountInfoDouble ( ACCOUNT_EQUITY ), 2 );
   if (rates_total > prev_calculated)
   {
    minEquity = 0 ;
    maxEquity = 0 ;
   }
   minEquity = NormalizeDouble ( fmin ((minEquity == 0 ? bal : minEquity), equity), 2 );
    maxEquity = NormalizeDouble ( fmax (maxEquity, equity), 2 );
    balance[ 0 ] = bal;
    clrBalance[ 0 ] = 0.0 ;
    equityMinB[ 0 ] = balance[ 0 ];
    equityMin[ 0 ] = minEquity;
    equityMaxB[ 0 ] = balance[ 0 ];
    equityMax[ 0 ] = maxEquity;
     if (balance[ 0 ] > balance[ 1 ])
     clrBalance[ 0 ] = 1.0 ;
     if (balance[ 0 ] < balance[ 1 ])
     clrBalance[ 0 ] = 2.0 ;
     Comment ( PositionsTotal ());
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+

Potansiyel olarak, söve burada olabilir:

if (rates_total > prev_calculated)
   {
    minEquity = 0 ;
    maxEquity = 0 ;
   }
   minEquity = NormalizeDouble ( fmin ((minEquity == 0 ? bal : minEquity), equity), 2 );
    maxEquity = NormalizeDouble ( fmax (maxEquity, equity), 2 );

Yeni bir çubuk geldiğinde değerleri 0 - iyi olarak sıfırlarsınız. Ancak daha sonra, önerilmeyen bir şekilde eşitlik için minEquity ve 0'ı kontrol edersiniz.

Sözlerimin teyidinde - senin çizimin. Dediğiniz gibi "çöp" değerlerinin yaklaşık sıfır olduğunu gösteriyor.

Ve elbette, şekle "çöp" değeri olan bir veri penceresi eklemek daha iyidir.