Aquí está el enlace https://www.mql5.com/ru/forum/50458
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)
#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
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?
#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.
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
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