Hier ist der Link https://www.mql5.com/ru/forum/50458
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)
#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
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?
#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.
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
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