【解説】【MQL5 community】 FIR_filter : これは一種の移動平均で、特に、ここでは「Hann Window(ハン窓, 最もよく使われる窓関数の一つ)」と呼ばれる窓関数を使用し、次期の価格を予測している。
w(x) = 0.5-0.5cos2πx, if 0 ≦ x ≦ 1.
【シグナル】
移動平均のラインを上抜けしたら、「買い」、下抜けしたら「売り」。 上昇基調になりそうな(移動平均が右肩上がり)場合のトレンドを把握することができる。
//+--------------------------------------------------------------------------------------+ //| FIR_filter.mq5 | //| Copyright gpwr. | //+--------------------------------------------------------------------------------------+ #property copyright "gpwr" #property version "1.00" #property indicator_chart_window #property indicator_buffers 1 #property indicator_plots 1 #property indicator_label1 "FIR filter" #property indicator_type1 DRAW_LINE #property indicator_color1 Red #property indicator_style1 STYLE_SOLID #property indicator_width1 1 #property indicator_applied_price PRICE_OPEN // Global constants #define pi 3.141592653589793238462643383279502884197169399375105820974944592 //===================================== INPUTS =========================================== input int Per=50; // # of filter taps (period) // Global variables double w[],wsum; // Indicator buffers double x[]; // Custom indicator initialization function ---------------------------------------------+ void OnInit() { // Calculate weights according to Hann window ArrayResize(w,Per); ArrayInitialize(w,0); for(int k=0;k<Per;k++) { w[k]=0.5-0.5*MathCos(2.*pi*(k+1)/(Per+1)); wsum+=w[k]; } // Map indicator buffer SetIndexBuffer(0,x,INDICATOR_DATA); IndicatorSetInteger(INDICATOR_DIGITS,5); IndicatorSetString(INDICATOR_SHORTNAME,"FIR_filter("+string(Per)+")"); PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,Per); } //====================================== MAIN ============================================ int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) { // Check for insufficient data if(rates_total<Per) return(0); // Main cycle ---------------------------------------------------------------------------+ int i=prev_calculated-1; if(i<Per-1) i=Per-1; while(i<rates_total) { x[i]=0.0; for(int k=0;k<Per;k++) x[i]+=price[i-k]*w[k]; x[i]/=wsum; i++; } return(rates_total); }
【表示結果】
Back to Meta Trader