ハーストの索引

 

ハーストの インジケータを持っている人がいたら送ってください
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/ru/forum/50458
 
favoritefx писал (а):
ハーストの比率は別カウントですしね。リスクマネージャーフォーラムで、3つの方法を聞いたことがあります。


という式になると理解しています。

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

 
Oasis писал (а):
整数で 書いた(a)。
mql2や3で作ったものを渡してくれれば、書き直します。

リンクはこちら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);
}

ただ、PeriodHerstという 変数から判断すると、Hearstに関係するものだと思います

 
私たちはすぐそこにいる...整理している )))
Dimitriさん、コードをありがとうございました。
 

これはある種の間違った指標です。ハースト定数は0.5前後で変動するとされています。NOT more than 1 and not less than 0.これはやや違う。

 

ハーストのバリューエリアは誰もが知っているのが良いところです。ただ、悪いのは、誰もコードの中を見ないことです。このインジケーターで計算される値は、skoが計算すべき値なのか、どなたか教えてください。

 
Oasisさん、私自身は、議論https://www.mql5.com/ru/forum/50458 に触発されて書いてみたんです。表現力が乏しいというか、正しくないんですよね。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);
}
//+------------------------------------------------------------------+
 

Eugeneさん、こんにちは。

安値のローを使って高値のハーストを計算するという考え方は非常に正しいと思います。しかし、SCOの計算を間違えている。なぜ、そこに(High - Low)差があるのでしょうか?RMSは、平均値からの系列値の偏差の二乗の合計です。以下にコメントアウトされたものは、よりRMSに近いものです。

また、ハーストは対数の比ではなく、その対数に対してプロットした線形回帰の 傾きである。リグレッションを構築する必要はありません。ただ、Log(R/S) = H*Log(N/2) +Cという 方程式の加法項を別の方法で 考えてみてください。

理由: