赫斯特指数

 

如果谁有赫斯特的指标,请发到
我只在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 这个变量来看,它与赫斯特有关。

 
我们将在那里......把它整理出来 ))))
谢谢你的代码,迪米特里。
 

这是某种错误的指标。赫斯特常数应该是在0.5左右波动的。不大于1,也不小于0,这有些不同。

 

好在大家都知道赫斯特价值区。唯一不好的是,没有人查看代码内部。谁能解释一下这个指标的计算值是什么,它应该是由sko计算的?

 
绿洲,我自己受到讨论的启发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的计算是不正确的。为什么你在那里有差异(高-低)?有效值是指系列值与平均值的偏差的平方之和。下面评论的内容更像RMS。

另外,Hurst不是对数的比值,而是对这些对数绘制的线性回归 的斜率。你不需要建立回归。只要以另一种 方式考虑方程Log(R/S)=H*Log(N/2)+C 中的加法项。