Hearst-Index

 

Wenn jemand einen Indikator für den Hearst-Indikator hat, senden Sie ihn bitte an
Ich habe ihn nur auf mql2 oder 3 gefunden
Ich habe versucht, ihn selbst zu schreiben, aber es hat sich als falsch herausgestellt...(der Wert ist größer als 1)

Berechnet nach der Formel

      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;
 
Geben Sie mir, was Sie auf mql2 oder 3 haben, ich werde umschreiben
 
Und die Hearst-Indikatoren werden auf unterschiedliche Weise gezählt. Ich habe von 3 Möglichkeiten gehört. Im Forum für Risikomanager.
 
Integer писал (а):
Geben Sie mir, was Sie auf mql2 oder 3 haben, ich werde umschreiben

Hier ist der Link https://www.mql5.com/ru/forum/50458
 
favoritefx писал (а):
Und die Hearst-Quoten werden unterschiedlich gezählt. Ich habe im Risikomanager-Forum von 3 Möglichkeiten gehört.


Ich verstehe die Formel wie folgt

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

 
Oasis писал (а):
Ganzzahlig geschrieben (a):
Geben Sie mir, was Sie auf mql2 oder 3 haben, ich werde umschreiben

hier ist der Link 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);
}

Was genau es ist, aber nach der Variable PeriodHerst zu urteilen, hat es etwas mit Hearst zu tun

 
Wir sind gleich da... und klären das ))))
Danke für den Code, Dimitri.
 

Das ist eine Art falscher Indikator. Es wird angenommen, dass die Hurst-Konstante um 0,5 schwankt. NICHT mehr als 1 und nicht weniger als 0. Dies ist etwas anders.

 

Das Gute daran ist, dass jeder das Hearst-Wertgebiet kennt. Der einzige Nachteil ist, dass niemand in den Code schaut. Kann mir jemand erklären, welcher Wert in diesem Indikator berechnet wird, wo er von sko berechnet werden sollte?

 
Oasis, ich selbst habe mich von der Diskussion https://www.mql5.com/ru/forum/50458 inspirieren lassen und versucht, sie zu schreiben. Es ist nicht sehr aussagekräftig oder korrekt. Das Hauptproblem besteht darin, wie S zu berechnen ist bzw. wie es plausibel ersetzt werden kann. Schließlich arbeiten wir nicht mit Ticks, sondern mit Balken, und Berechnungen streng nach Definitionen sind hier kaum sinnvoll... Wie auch immer, ich sende Ihnen mein vorläufiges und unbefriedigendes (entschuldigen Sie das Wortspiel) Ergebnis. Vielleicht findet sie ja jemand nützlich.

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

Hallo Eugene!

Ich denke, Ihre Idee, das niedrige Tief zur Berechnung von Hearst auf dem Hoch zu verwenden, ist sehr richtig. Aber Sie berechnen die SCO falsch. Warum gibt es dort einen Unterschied (Hoch - Niedrig)? Der RMS ist die Summe der Quadrate der Abweichungen der Reihenwerte vom Mittelwert. Was im Folgenden kommentiert wird, entspricht eher dem RMS.

Außerdem ist Hurst nicht ein Verhältnis von Logarithmen, sondern die Steigung einer linearen Regression, die gegen diese Logarithmen aufgetragen wird. Sie müssen die Regression nicht selbst durchführen. Betrachten Sie einfach den additiven Term in der Gleichung Log(R/S) = H*Log(N/2) +C auf andere Weise.

Grund der Beschwerde: