허스트 지수

 

Hurst 지수의 지표 가 있는 사람이 있으면 폐기하십시오.
그리고 인터넷에서 mql2 또는 3에서만 찾았습니다.
나는 나 자신이 어떻게 든 비뚤어지게 쓰려고 시도했지만 ... (1보다 큰 값)

공식에 따라 계산

      double Max = iHigh ( NULL , 0 , iHighest ( NULL , 0 , MODE_HIGH , N - 1 , i )) ;
      double Min = iLow ( NULL , 0 , iLowest ( NULL , 0 , MODE_LOW , N - 1 , i )) ;
      double R = Max - Min ;
      double MA = iMA ( NULL , 0 , N , 0 , MODE_SMA , PRICE_CLOSE , i ) ;
      double D = 0 ;
         for ( int a = 0 ; a <= N ; a ++ )
            {
             D = D + MathPow (( Close [ i - a ] - MA ) , 2 ) ;
            }
      double S = MathSqrt ( D / ( N - 1 )) /*iStdDev(NULL, 0, N, 0, MODE_SMA, PRICE_CLOSE, i)*/ ;
      double H = MathLog ( R / S ) / MathLog ( N / 2 ) ;
      ExtMapBuffer1 [ i ] = R ;
 
mql2 또는 3에 있는 내용을 다시 작성해 보겠습니다.
 
그리고 허스트 지표 는 다르게 간주됩니다. 3가지 방법을 들었습니다. 위험 관리자 포럼에서.
 
Integer писал (а):
mql2 또는 3에 있는 내용을 다시 작성해 보겠습니다.

여기 링크가 있습니다 https://www.mql5.com/en/forum/50458
 
favoritefx писал (а):
그리고 허스트 지표는 다르게 간주됩니다. 3가지 방법을 들었습니다. 위험 관리자 포럼에서.


내가 이해하는 공식은

H = MathLog (R/S)/MathLog(N/2)

 
Oasis писал (а):
정수 는 다음과 같이 썼습니다.
mql2 또는 3에 있는 내용을 다시 작성해 보겠습니다.

여기 링크가 있습니다 https://www.mql5.com/en/forum/50458





 #property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_color2 Yellow
extern int PeriodHerst = 24 , PeriodA = 100 ;
double ExtMapBuffer1 [] ; double ExtMapBuffer2 [] ;
int init (){
   SetIndexStyle ( 0 , DRAW_LINE ) ;
   SetIndexBuffer ( 0 , ExtMapBuffer1 ) ;
   SetIndexStyle ( 1 , DRAW_LINE ) ;
   SetIndexBuffer ( 1 , ExtMapBuffer2 ) ;
   SetIndexDrawBegin ( 0 , PeriodHerst + PeriodA ) ;
   SetIndexDrawBegin ( 1 , PeriodHerst + PeriodA ) ;   
   return ( 0 ) ;
}
int start (){
   int    limit = Bars - IndicatorCounted () ;
   for ( int i = limit - 1 ; i >= 0 ; i -- ){
      int MaxH = Highest ( NULL , 0 , MODE_HIGH , PeriodHerst , i ) ;
      int MinL = Lowest ( NULL , 0 , MODE_LOW , PeriodHerst , i ) ;  
      double Average = iMA ( NULL , 0 , PeriodA , 0 , 0 , 0 , i ) ;
      double swap = 0 ;
         for ( int j = 0 ; j < PeriodA ; j ++ ){
            swap = swap + MathPow ( Open [ j + i ] - Average , 2 ) ;
            swap = swap + MathPow ( High [ j + i ] - Average , 2 ) ;
            swap = swap + MathPow ( Low [ j + i ] - Average , 2 ) ;
            swap = swap + MathPow ( Close [ j + i ] - Average , 2 ) ;            
         }       
      double Deviation = MathSqrt ( swap / (( PeriodA - 1 ) * PeriodA )) ;
      ExtMapBuffer1 [ i ] = ( High [ MaxH ] - Low [ MinL ]) / Deviation ;
        for ( j = 0 ; j < PeriodA ; j ++ ){
           swap = swap + ExtMapBuffer1 [ i + j ] ;
        }
     ExtMapBuffer2 [ i ] = swap / PeriodA ;
   }
   return ( 0 ) ;
}

나는 그것이 무엇인지 이해하지 못했지만 PeriodHerst 변수로 판단하면 이것은 Hurst와 관련이 있습니다.

 
이제 우리는 .. 이해할 것입니다))))
코드 Dmitry 주셔서 감사합니다.
 

이것은 일종의 오해의 소지가 있는 지표입니다. Hurst 상수는 0.5 주변에서 변동해야 합니다. 1보다 크지도 않고 0보다 작지도 않습니다. 그러나 여기서는 약간 다릅니다.

 

모두가 Hurst 범위를 알고 있는 것이 좋습니다. 유일한 나쁜 점은 아무도 코드 내부를 보지 않는다는 것입니다. 속도를 계산해야 하는 이 표시기에서 계산된 값을 누군가 나에게 설명할 수 있습니까?

 
Oasis, 나 자신은 토론 https://www.mql5.com/en/forum/50458 에서 영감을 받아 이것을 작성하려고 했습니다. 너무 표현적이지 않고 너무 정확하지 않은 것으로 나타났습니다. 주요 오해는 S를 계산하는 방법 또는 S가 그럴듯하게 대체될 수 있는 것입니다. 결국, 우리는 진드기가 아니라 막대로 작업합니다. 정의에 따라 엄격하게 계산하는 것은 여기에 거의 적합하지 않습니다 ... 일반적으로 나는 예비적이고 불만족스러운 (말장난 죄송합니다) 결과를 보냅니다. 아마도 누군가가 도움이 될 것입니다.

 
#property copyright " Черный Кот "
#property link      ""
 
#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 1
#property indicator_buffers 1
#property indicator_color1 Red
 
 
extern int nBars = 1000 ; 
extern int PerM = 1 ;     
 
//поля в массиве Rates
#define RATE_TIME  0 
#define RATE_OPEN  1
#define RATE_LOW   2
#define RATE_HIGН  3
#define RATE_CLOS  4
#define RATE_VOL   5
 
 
 
 
//---- buffers
double HurstBuf [] ;   //буфер индикатора
double RateM [][ 6 ] ;   //массив баров младшего таймфрейма, по которому вычисляется Херст
int nM ;              //число баров младшего таймфрейма, доступных в истории
 
 
bool CriticalError = false ; //флаг критической ошибки устанавливается если не удалось
//загрузить младший таймфрейм
 
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init ()
{
//инициализируем буфер
   SetIndexStyle ( 0 , DRAW_LINE ) ;
   SetIndexBuffer ( 0 , HurstBuf ) ;
   
//получаем доступ к младшему таймфрейму
   CriticalError = false ;
   for ( int i = 0 ; i < 10 ; i ++ ) //делаем 10 попыток
   {
      nM = ArrayCopyRates ( RateM , NULL , PerM ) ;
      if ( GetLastError () == 0 ) break ;
      Sleep ( 5000 ) ;
   }         
   if ( i == 10 )
   {
      Print ( " Cannot load lower timeframe " ) ;
      CriticalError = true ;
   }   
   Print ( " nM= " , nM ) ;  
   return ( 0 ) ;
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit ()
{
//----
   
//----
   return ( 0 ) ;
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
 
 
 
 
int start ()
{
   if ( CriticalError ) return ( 0 ) ;
   int counted_bars = IndicatorCounted () ;
//   for(int i=1; i<nBars; i++) HurstBuf[i]=0.5;
   for ( int i = 1 ; i < nBars ; i ++ ) //считаем с первого бара
   {
      double avg = ( High [ i ] + Low [ i ]) / 2 ; //среднее в баре
      double R = High [ i ] - Low [ i ] ;       //размах бара       
            
      //находим последний бар младшего таймфрейма, принадлежащий i-му бару текущего
      datetime t = Time [ i ] + Period () * 60 ; //время закрытия i-го бара в секундах
//      Print("Bar ",i," Time=",TimeToStr(Time[i]));
      for ( int j = 0 ; j < nM ; j ++ ) //ищем во всей доступной истории
      {
//         Print("*****Bar ",j," Time=",TimeToStr(RateM[j][RATE_TIME]));  
         if ( RateM [ j ][ RATE_TIME ] <= t ) break ;
      }           
      if ( j == nM ) return ( 0 ) ; //история по младшему таймфрейму кончилась и считать больше нечего
                        
      //сейчас j указывает на искомый последний бар в младшем таймфрейме
      //вычисляем СКО. Как его считать, это самый непонятный во всём этом момент
      int N = 0 ;
      double s = 0 ;
      while ( Time [ i ] <= RateM [ N + j ][ RATE_TIME ]) //считаем пока находимся в пределах i-го бара
      {
         //double m=avg - (RateM[N+j][RATE_HIGН]+RateM[N+j][RATE_LOW ])/2;
         double m = RateM [ N + j ][ RATE_HIG ] - RateM [ N + j ][ RATE_LOW ] ;
         s += m * m ;
         
//         s += (avg - RateM[N+j][RATE_HIGН])*(avg - RateM[N+j][RATE_HIGН]);
//         s += (avg - RateM[N+j][RATE_LOW ])*(avg - RateM[N+j][RATE_LOW ]);         
         N ++;
      }                    
      double S = MathSqrt ( s / N ) ;
      
      double h = MathLog ( R / S ) / MathLog ( N ) ; //вычисляем показатель Херста
//      Print("Lo=", Low[i], " Hi=",High[i], " t=",TimeToStr(Time[i]), " h=",h, " R=",R, " S=", S, " avg=", avg);                  
      HurstBuf [ i ] = h ; //загоняем его в буфер      
   }   
//   CriticalError=true;
   return ( 0 ) ;
}
//+------------------------------------------------------------------+
 

안녕하세요 유진입니다!

내 생각에는 더 오래된 것에서 Hurst를 계산하기 위해 더 어린 t / f를 사용하는 당신의 생각은 매우 정확합니다. 그러나 당신은 SKO가 틀렸다고 생각합니다. 왜 거기에 차이(높음 - 낮음)가 있습니까? RMS는 평균에서 계열 값의 제곱 편차의 합입니다. 아래에 주석으로 표시된 것은 COEX와 훨씬 유사합니다.

또한 Hurst는 로그의 비율이 아니라 이러한 로그를 기반으로 하는 선형 회귀의 기울기입니다 . 회귀를 작성하지 않을 수 있습니다. Log(R/S) = H*Log(N/2) +C 방정식의 덧셈 항을 다른 방식으로 고려하십시오.