Ecco il link https://www.mql5.com/ru/forum/50458
E i rapporti di Hearst sono contati in modo diverso. Ho sentito parlare di 3 modi, sul forum del risk manager.
Ho capito che la formula è
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); }
Solo quello che è, ma a giudicare dalla variabile PeriodHerst, è qualcosa che ha a che fare con Hearst
Grazie per il codice, Dimitri.
È una specie di indicatore sbagliato. La costante di Hurst dovrebbe fluttuare intorno a 0,5. NON più di 1 e non meno di 0. Questo è un po' diverso.
La cosa buona è che tutti conoscono la zona di valore di Hearst. L'unica cosa negativa è che nessuno guarda dentro il codice. Qualcuno può spiegarmi quale valore viene calcolato in questo indicatore dove dovrebbe essere calcolato da sko?
#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); } //+------------------------------------------------------------------+
Ciao Eugene!
Penso che la tua idea di usare il basso basso per calcolare Hearst sull'alto sia molto corretta. Ma lei calcola lo SCO in modo errato. Perché hai la differenza lì (Alto - Basso)? L'RMS è la somma dei quadrati delle deviazioni dei valori della serie dalla media. Quello che è commentato qui sotto è molto più simile a RMS.
Inoltre, Hurst non è un rapporto di logaritmi, ma la pendenza di una regressione lineare che è tracciata contro questi logaritmi. Non è necessario costruire la regressione. Basta considerare il termine additivo nell'equazione Log(R/S) = H*Log(N/2) +C in un altro modo.

- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Accetti la politica del sito e le condizioni d’uso
Se qualcuno ha un indicatore per l'indicatore di Hearst per favore lo mandi a
L'ho trovato solo su mql2 o 3
Ho provato a scriverlo da solo... è risultato sbagliato in qualche modo... (valori maggiori di 1)
Calcolato con la formula