prev_calculated - 페이지 9

 
Alexey Kozitsyn :
예, 주기에 대해, 아마도 너무 많습니다. 그러나 prev_calculated = 0(이전에 채워진 버퍼 사용)으로 이 버퍼에서 일부 값이 재설정되면 아마도 이것은 실수일 수 있습니다. 이제 확인해보자...

정확하게 재설정되지는 않지만 전체 기록에 대한 전체 지표가 다시 계산됩니다. 따라서 맨 오른쪽 버퍼 인덱스만 채워야 하지만 왼쪽으로 이동하면 이러한 값이 유지되어야 하는 경우 두 가지 옵션이 있습니다.

1. 지시자 버퍼를 초기화 할 때 방해가 되고 정리가 필요한 쓰레기로 가득 차 있다.

2. 청소했지만 prev_calculated = 0이면 버퍼가 다시 지워지고 누적된 모든 값이 제거됩니다.


일반적으로 솔루션은 매우 간단합니다. prev_calculated = 0 플래그와 함께 이 문제를 해결합니다.

 
Alexey Viktorov :

...

일반적으로 솔루션은 매우 간단합니다. prev_calculated = 0 플래그와 함께 이 문제를 해결합니다.

결정하지 않습니다. 몇 개의 막대가 지속되는 연결 해제가 있을 것이며, 여러 막대는 가비지로 초기화되지 않을 것입니다.
 
Alexey Viktorov :

가장하지 마십시오 ... 모든 것이 명확하지만 그림은 특히 당신을위한 것입니다



컴퓨터가 꺼지지 않고 작동하고 차트가 닫히지 않고 차트에서 표시기가 제거되지 않았습니다 ...

질문: 2분 막대는 어디로 갔습니까???

코드에 버그가 있을 가능성이 큽니다. 이제 테스트 표시기를 작성했습니다. 새로 고침 버튼으로 재설정할 때 버퍼의 크기가 변경되지 않고 버퍼의 데이터가 변경되지 않습니다...

#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);
  }
 

prev_calculated에서 Rates_total로 버퍼를 지워야 합니다.

 
 
아니면, 위에서 Dmitry가 말했듯이 여러 마디에서 연결이 끊어졌습니다... 그런데, 연결이 끊어지면 prev_calculated도 0을 반환합니까?
 
Dmitry Fedoseev :
스튜디오 코드. 웃으면서 설명합시다.

나는 이미 재미있다.

/********************************************************************\
|                                               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);
  }
//+------------------------------------------------------------------+

밤 동안 prev_calculate의 재설정이 너무 많았습니다.

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 :

prev_calculated에서 Rates_total로 버퍼를 지워야 합니다.

이것이 내 대답이라면 표시기가 처음 실행될 때 버퍼가 주어진 값으로 완전히 초기화됩니다. 새로운 막대 가 형성되면 새로운 값이 추가됩니다.
 
Alexey Kozitsyn :
아니면, 위에서 Dmitry가 말했듯이 여러 마디에서 연결이 끊어졌습니다... 그런데, 연결이 끊어지면 prev_calculated도 0을 반환합니까?

옛날 옛적에는 모든 문제에 대해 prev_calculated가 0을 반환했습니다. 그런 다음 포럼에서 항상 0으로 재설정할 수는 없으며 어떤 경우에는 마지막 계산까지 가능하다는 토론이 있었습니다. value, Slava가 주제에 참여하고 문제를 처리하기로 약속했습니다.

얼마 후 prev_calculated에 중간 값이 있는 경우가 있습니다. 지금은 상황이 어떤지 모르겠지만 prev_calculated가 반환하는 내용을 매일 따르지는 않습니다.

 
Alexey Kozitsyn :
이것이 내 대답이라면 표시기가 처음 실행될 때 버퍼가 주어진 값으로 완전히 초기화됩니다. 새로운 막대 가 형성되면 새로운 값이 추가됩니다.
당신에게 아닙니다.
 
Alexey Viktorov :

나는 이미 재미있다.

/********************************************************************\
|                                               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);
  }
//+------------------------------------------------------------------+

잠재적으로 jamb는 다음과 같을 수 있습니다.

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

새 막대가 오면 값을 0으로 재설정합니다. 그러나 권장하지 않는 방식으로 minEquity와 0이 같은지 확인합니다.

내 말의 확인 - 당신의 그림. 그것은 당신이 말했듯이 "쓰레기"값이 거의 0에 있음을 보여줍니다.

그리고 당연히 "가비지" 값이 있는 데이터 창을 그림에 추가하는 것이 좋습니다.