Índice Hearst

 

Si alguien tiene un indicador para el indicador de Hearst, por favor envíelo a
Lo encontré sólo en mql2 o 3
Traté de escribirlo yo mismo... resultó mal de alguna manera... (valores mayores que 1)

Calculado mediante la fórmula

      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;
 
Dame lo que tienes en mql2 o 3, voy a reescribir
 
Y los indicadores de Hearst se cuentan de diferentes maneras. He oído hablar de 3 maneras. En el foro del gestor de riesgos.
 
Integer писал (а):
Dame lo que tienes en mql2 o 3, voy a reescribir

Aquí está el enlace https://www.mql5.com/ru/forum/50458
 
favoritefx писал (а):
Y los ratios de Hearst se cuentan de forma diferente. He oído hablar de 3 maneras, en el foro del gestor de riesgos.


Entiendo que la fórmula es

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

 
Oasis писал (а):
Entero escribió (a):
Dame lo que tienes en mql2 o 3, voy a reescribir

aquí está el enlace 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);
}

Sólo lo que es, pero a juzgar por la variable PeriodHerst, es algo que tiene que ver con Hearst

 
Vamos a estar allí ... la clasificación de la misma ))))
Gracias por el código, Dimitri.
 

Es una especie de indicador erróneo. Se supone que la constante de Hurst fluctúa en torno a 0,5. No más de 1 y no menos de 0. Esto es algo diferente.

 

Lo bueno es que todo el mundo conoce la zona de valor de Hearst. Lo único malo es que nadie mira dentro del código. ¿Puede alguien explicarme qué valor se calcula en este indicador donde debería ser calculado por sko?

 
Oasis, yo mismo me inspiré en la discusión https://www.mql5.com/ru/forum/50458 e intenté escribirla. No es muy expresivo ni correcto. El principal problema es cómo calcular S, o cómo se puede sustituir de forma plausible. Al fin y al cabo, no estamos trabajando con ticks, sino con barras. Y los cálculos estrictamente de acuerdo con las definiciones no son buenos aquí... De todos modos, le envío mi resultado preliminar e insatisfactorio (perdón por el juego de palabras). Tal vez alguien lo encuentre útil.

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

Hola Eugene.

Me parece muy acertada tu idea de utilizar la baja para calcular Hearst en la alta. Pero calculas mal el SCO. ¿Por qué tiene la diferencia allí (Alta - Baja)? La RMS es la suma de los cuadrados de las desviaciones de los valores de la serie con respecto a la media. Lo que se comenta a continuación es mucho más parecido a RMS.

Además, Hurst no es una relación de logaritmos, sino la pendiente de una regresión lineal que se traza contra esos logaritmos. No tienes que construir la regresión. Basta con considerar el término aditivo de la ecuación Log(R/S) = H*Log(N/2) +C de otra manera.

Razón de la queja: