Index de Hearst

 

Si quelqu'un a un indicateur pour l'indicateur de Hearst, veuillez l'envoyer à
Je l'ai trouvé seulement sur mql2 ou 3
J'ai essayé de l'écrire moi-même... il s'est avéré faux d'une manière ou d'une autre... (valeurs supérieures à 1)

Calculé à l'aide de la formule

      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;
 
Donnez-moi ce que vous avez sur mql2 ou 3, je vais réécrire
 
Et les indicateurs de Hearst sont comptés de différentes manières. J'ai entendu parler de 3 façons. Sur le forum des gestionnaires de risques.
 
Integer писал (а):
Donnez-moi ce que vous avez sur mql2 ou 3, je vais réécrire

Voici le lien https://www.mql5.com/ru/forum/50458
 
favoritefx писал (а):
Et les ratios de Hearst sont comptés différemment. J'ai entendu parler de 3 façons, sur le forum du gestionnaire de risques.


Je comprends que la formule est la suivante

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

 
Oasis писал (а):
Entier écrit (a) :
Donnez-moi ce que vous avez sur mql2 ou 3, je vais réécrire

Voici le lien 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);
}

Juste ce que c'est, mais à en juger par la variable PeriodHerst, c'est quelque chose à voir avec Hearst.

 
Nous serons juste là... pour faire le tri. ))))
Merci pour le code, Dimitri.
 

C'est une sorte de mauvais indicateur. La constante de Hurst est censée fluctuer autour de 0,5. PAS plus de 1 et pas moins de 0. C'est un peu différent.

 

La bonne chose est que tout le monde connaît la zone de valeur de Hearst. La seule mauvaise chose est que personne ne regarde dans le code. Quelqu'un peut-il m'expliquer quelle valeur est calculée dans cet indicateur où elle devrait être calculée par sko ?

 
Oasis, j'ai moi-même été inspiré par la discussion https://www.mql5.com/ru/forum/50458 et j'ai essayé de l'écrire. Ce n'est pas très expressif ou correct. Le principal problème est de savoir comment calculer S, ou comment le substituer de manière plausible. Après tout, nous ne travaillons pas avec des ticks, mais avec des barres. Et les calculs strictement conformes aux définitions ne sont guère bons ici... Quoi qu'il en soit, je vous envoie mon résultat préliminaire et insatisfaisant (pardonnez le jeu de mots). Peut-être que quelqu'un le trouvera utile.

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

Bonjour Eugène !

Je pense que votre idée d'utiliser le bas du bas pour calculer Hearst sur le haut est très correcte. Mais vous avez mal calculé l'OCS. Pourquoi cette différence (High - Low) ? La RMS est la somme des carrés des écarts des valeurs de la série par rapport à la moyenne. Ce qui est commenté ci-dessous ressemble beaucoup plus à RMS.

De plus, Hurst n'est pas un rapport de logarithmes, mais la pente d'une régression linéaire qui est tracée contre ces logarithmes. Vous n'avez pas à construire la régression. Il suffit de considérer le terme additif de l'équation Log(R/S) = H*Log(N/2) +C d'une autre manière.