把你在mql2或3上的东西给我,我就重写
#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); }
只是它是什么,但从PeriodHerst 这个变量来看,它与赫斯特有关。
我们将在那里......把它整理出来 ))))
谢谢你的代码,迪米特里。
谢谢你的代码,迪米特里。
这是某种错误的指标。赫斯特常数应该是在0.5左右波动的。不大于1,也不小于0,这有些不同。
好在大家都知道赫斯特价值区。唯一不好的是,没有人查看代码内部。谁能解释一下这个指标的计算值是什么,它应该是由sko计算的?
绿洲,我自己受到讨论的启发https://www.mql5.com/ru/forum/50458,并试图写出来。这不是很有表现力,也不正确。主要问题是如何计算S,或如何合理地替代它。毕竟,我们的工作不是用刻度线,而是用条形图。 严格按照定义进行计算,在这里是很难做到的......总之,我把我的初步和不满意(请原谅双关语)的结果发给你。也许有人会发现它很有用。
#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); } //+------------------------------------------------------------------+
如果谁有赫斯特的指标,请发到
我只在mql2或3上发现了它
我试着自己写......结果不知怎么就错了......(数值大于1)。
使用公式计算