Hurst üssü

 

Hurst üssünün bir göstergesine sahip olan varsa, lütfen atın
Ve internette sadece mql2 veya 3'te buldum
Ben kendim bir şekilde çarpık yazmaya çalıştım ... (1'den büyük değerler)

Formüle göre hesaplayın

      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 veya 3'te olanı yeniden yazalım
 
Ve Hurst göstergeleri farklı olarak kabul edilir. 3 şekilde duydum. Risk yöneticileri forumunda.
 
Integer писал (а):
mql2 veya 3'te olanı yeniden yazalım

işte bağlantı https://www.mql5.com/en/forum/50458
 
favoritefx писал (а):
Ve Hurst göstergeleri farklı olarak kabul edilir. 3 şekilde duydum. Risk yöneticileri forumunda.


formül anladığım kadarıyla

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

 
Oasis писал (а):
Tamsayı yazdı:
mql2 veya 3'te olanı yeniden yazalım

işte bağlantı https://www.mql5.com/ru/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 ) ;
}

Ne olduğunu anlamadım ama PeriodHerst değişkenine bakılırsa, bunun Hurst ile bir ilgisi var.

 
Şimdi anlayacağız .. anlayacağız))))
Dmitry kodu için teşekkürler.
 

Bu bir tür yanıltıcı göstergedir. Hurst sabiti 0,5 değeri civarında dalgalanmalıdır. 1'den büyük değil ve 0'dan az değil. Ama burada durum biraz farklı.

 

Herkesin Hurst serisini bilmesi güzel. Tek kötü şey, kimsenin kodun içine bakmamasıdır. Biri bana hızın hesaplanması gereken bu göstergede hangi değerin hesaplandığını açıklayabilir mi?

 
Oasis, https://www.mql5.com/en/forum/50458 tartışmasından esinlenerek kendim yazmaya çalıştım. Çok anlamlı ve çok doğru olmayan bir şey ortaya çıktı. Ana yanlış anlama, S'nin nasıl sayılacağı veya S'nin makul bir şekilde neyle değiştirilebileceğidir. Sonuçta, kenelerle değil, çubuklarla çalışıyoruz. ve kesinlikle tanımlara göre yapılan hesaplamalar burada pek uygun değil ... Genel olarak, ön ve yetersiz (punto için üzgünüm) sonucumu gönderiyorum. Belki birisi işe yarar.

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

Merhaba Eugene!

Hurst'u daha yaşlı olanda hesaplamak için genç t / f'yi kullanma fikriniz bence çok doğru. Ama SKO'nun yanlış olduğunu düşünüyorsunuz. Orada neden (Yüksek - Düşük) bir fark var? RMS, serinin değerlerinin ortalamadan sapmalarının karelerinin toplamıdır. Aşağıda yorumlananlar, COEX'e çok daha benzer.

Ek olarak Hurst, logaritmaların bir oranı değil, bu logaritmalar üzerine inşa edilen doğrusal bir regresyonun eğimidir. Bir gerileme inşa etmemek mümkündür. Log(R/S) = H*Log(N/2) +C denklemindeki toplamsal terimi farklı bir şekilde düşünün.