백테스트 중 발견된 문제점과 근본 원인을 찾지 못함! - 페이지 5

 
jollydragon :

. 나는 아직도 봉우리가 사라지는 것을 볼 수 없습니다. "재초기화"하는 방법은 무엇입니까?

시간 프레임을 변경하여 다시 초기화할 수 있습니다.

또는

표시기 입력 창을 열고 확인을 클릭합니다.

 

검라이 2015.05.14 21:51 #

You can re-initialise by either changing timeframes

or

표시기 입력 창을 열고 확인을 클릭합니다.


해보고 나니 봉우리 위치가 바뀐다는 말과 같은 의미로 이해가 됩니다. 옳은?

친애하는 검라이,

 
WHRoeder :

모든 반복(첫 번째 제외)에서 Fish1 은 이전 버퍼 요소의 값이지만 ExtBuffer1[limit] 로 초기화하지 않습니다.

따라서 초기 반복의 경우(limit == 막대일 때) ExtBuffer1[0] = 1.1* ExtBuffer1[1] 을 설정합니다.

그러나 후속 틱의 경우(limit == 1일 때) ExtBuffer1[0] = 1.1* 0.00001 로 설정합니다.

친애하는 WHRoeder님,

대단히 감사합니다. 귀하의 지시에 따라 문제가 조금 더 잘 보입니다.

그러나 더 명확히 하기 위해 몇 가지 질문이 더 필요할 수 있습니다.

1. "double Fish1=0.00001; "이 모든 함수의 시작 부분에 정의되어 있는 것을 볼 수 있습니다.

따라서 전역 변수여야 하며 새로운 후속 틱이 와도 마지막 ExBuffer1[0]으로 할당되었음을 이해합니다.

아니면 새 틱이 올 때마다 자동으로 "0.00001"로 복구됩니까?

2. 이제 모든 막대가 단일 눈금 또는 여러 후속 눈금으로 다르게 칠해졌는데 라이브 M1 차트에서 .., bar[8], ..., bar[1]이 다시 칠해진 것을 볼 수 있는 이유는 무엇입니까? 방해 없이?

3. 새로 고침 후 피크 위치가 변경된 이유는 무엇입니까?

4. 라이브 M1 차트에서 일부 피크(약 959870576)가 " EMPTY_VALUE "(2147483647)보다 훨씬 적게 형성된 것을 볼 수 있는 이유는 무엇입니까?

5. 새 막대가 나오면 이전 ExtBuffer1[0]이 자동으로 ExtBuffer1[1]로 변경됩니다. 옳은?

6. 잠재적인 재초기화 또는 재도장을 방지하는 방법은 무엇입니까?

어쩌면 나는 여전히 몇 가지 중요한 점에서 혼란스럽고 도움이 될 수 있도록 큰 인내심이 필요합니다! 질문에 하나하나 도움을 주시면 정말 감사하겠습니다!

 

친애하는 WHRoeder, GumRai,

귀하의 게시물을 다시 읽은 후 이해에 따라 아래 코드로 내 지표를 업데이트했습니다.

백 테스트에 사용한 후 결과는 지표와 훨씬 더 일치합니다. 그러나 아직 2가지 문제가 있습니다. 아래 스크린샷을 참조하세요.

1. 첫 주문부터 4개의 지표 신호 이후에 거래가 이루어집니다.

2. 표시기 신호보다 4바 앞서서 한 번의 주문 변경이 발생합니다.

아래는 업데이트된 표시기 코드입니다.

 #property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.50"
#property strict
#property   indicator_separate_window
#property   indicator_buffers 2

extern int     period= 35 ;
extern double smooth= 0.3 ;

datetime        lastAlertTime;
double          ExtBuffer0[];
double          ExtBuffer1[];
double          ExtValue[];
double          Value1= 0 ,Buffer0_1= 0 ;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit ()
  {
   IndicatorBuffers( 3 );
   SetIndexBuffer ( 0 ,ExtBuffer0); SetIndexStyle( 0 , DRAW_LINE , STYLE_SOLID , 1 , clrWhiteSmoke );
   SetIndexBuffer ( 1 ,ExtBuffer1); SetIndexStyle( 1 , DRAW_LINE , STYLE_SOLID , 1 , clrGoldenrod );
   SetIndexBuffer ( 2 ,ExtValue);
   IndicatorShortName( " Solar Joy   ^v^  " );
   ArraySetAsSeries (ExtBuffer0, true );
   ArraySetAsSeries (ExtBuffer1, true );
   ArraySetAsSeries (ExtValue, true );

   SetIndexDrawBegin( 1 ,period);
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit()
  {
   return ( 0 );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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 (rates_total<=period)     return ( 0 );

   int     i,limit;
   double price,MinL,MaxH;

   if (prev_calculated<rates_total- 1 ) limit=rates_total-period- 1 ;
   else                               limit= 1 ;

   for (i=limit- 1 ; i>= 0 ; i--)
     {
      MaxH = High[iHighest( NULL , 0 ,MODE_HIGH,period,i)];
      MinL = Low[iLowest( NULL , 0 ,MODE_LOW,period,i)];
      price=(High[i]+Low[i])/ 2 ;
       if (limit== 1 )
        {
         Value1=ExtValue[ 1 ];
         Buffer0_1=ExtBuffer0[ 1 ];
        }
      ExtValue[i]=( 1 -smooth)*( 2 *(price-MinL)/(MaxH-MinL)- 1.0 ) + smooth*Value1;
      ExtValue[i]= MathMin ( MathMax (ExtValue[i],- 0.999 ), 0.999 ); // Value=Value>0.999?0.999:Value<-0.999?-0.999:Value;
      ExtBuffer0[i]=( 1 -smooth)* MathLog (( 1 +ExtValue[i])/( 1 -ExtValue[i]))+smooth*Buffer0_1;
      Value1=ExtValue[i];
      Buffer0_1=ExtBuffer0[i];
       if (ExtBuffer0[i]> 0 ) ExtBuffer1[i]= 3 ;
       else ExtBuffer1[i]=- 3 ;
     }

   return (rates_total);
  }
//+------------------------------------------------------------------+

 
jollydragon :

1. "double Fish1=0.00001;"이 모든 함수의 시작 부분에 정의되어 있는 것을 볼 수 있습니다.

따라서 전역 변수여야 하며 새로운 후속 틱이 와도 마지막 ExBuffer1[0]으로 할당되었음을 이해합니다.

아니면 새 틱이 올 때마다 자동으로 "0.00001"로 복구됩니까?

아니요. "하지만 ExtBuffer1[limit] 로 초기화하지 않습니다"의 어떤 부분이 불분명합니까?
 if (prev_calculated<rates_total- 1 ) { limit=rates_total-period- 1 ; Fish1= 0.00001 ;       }
else                              { limit= 1 ;                     Fish1=ExtBuffer0[ 1 ]; }
for (i=limit- 1 ; i>= 0 ; i--)
  {
   ExtBuffer1[i]= 1.1 *Fish1;
   Fish1=ExtBuffer1[i];
   if (Fish1>= EMPTY_VALUE )
      Fish1= 1 ;
  }

개인적으로 저는 차트/버퍼가 시계열이기 때문에 Rates_total/prev_calculated/OnCalculate 인수는 가증하다고 생각하며 이전 방식으로 수행할 것입니다.
 int counted = IndicatorCounted();
limit = Bars - MathMax (counted, period- 1 ); // Lookback period-1
Fish1 = counted == 0 ? 0.00001 : ExtBuffer0[limit];
for (i=limit- 1 ; i>= 0 ; i--)