2016年1月14日木曜日

[MQL超入門] その012 本格的にインジケータを作ってみよう。その4 平滑化をかけてみる。

さて、Tick更新回数インジケータ作成の流れを、考え方も含めて説明してきましたが、今回が最後となります。

過去記事はこちらから
http://mt4program.blogspot.com/2016/01/mql-009.html
http://mt4program.blogspot.com/2016/01/mql-010-tick.html
http://mt4program.blogspot.jp/2016/01/mql-011.html

こちらも効果から見ていきましょう。

・図12.01 Tick更新回数 平滑化有り無しの効果

上が平滑化あり、下が平滑化なしです。
どうですか?効果は一目かと思います。

平滑化ですが、私は線形加重移動平均の4期間を主に使用します。遅延量が1本とわかりやすいためです。このあたりのお話しは過去のシリーズをご覧ください。

移動平均の遅延利用シリーズ
http://mt4program.blogspot.jp/2015/10/blog-post_33.html
http://mt4program.blogspot.jp/2015/10/mama_8.html

移動平均は遅れている
http://mt4program.blogspot.jp/2015/10/blog-post_83.html

ここでは、線形加重移動平均ってなに?というところは除外させていただきます。

ソースコードですが、もうここまでお読みいただいた皆様でしたら、読み解くことが可能かと思います。解説は特にしませんので、ぜひ皆さま何をやっているのか見てみてください。
//+------------------------------------------------------------------+
//|                                                   TickVolume.mq4 |
//|                                         Copyright 2016, Daisuke. |
//|                                   http://mt4program.blogspot.jp/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Daisuke"
#property link      "http://mt4program.blogspot.jp/"
#property version   "1.00"
#property strict
#property indicator_separate_window

//インジケータで使用するバッファの数を指定する。
#property indicator_buffers 2

//描画する線の情報を指定する。
#property indicator_label1  "TickVolume"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrAqua
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

#property indicator_label2  "TickAverage"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrIndianRed
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1

input int SmoothPeriod = 4;   // ボリューム値平滑化期間
input int AveragePeriod = 100; //単純移動平均期間

// 表示バッファ
double tickVolume[];
double tickAverage[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,tickVolume);
   SetIndexBuffer(1,tickAverage);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   for( int i = rates_total - prev_calculated - 1; i >= 0; i-- )
   {
      // 線形加重移動平均にて平滑化を行う。
      int count = 0 ;
      double smoothVolume = 0;
      for( int j = 0; j < SmoothPeriod && (i + j) < rates_total; j++ )
      {
         int weight = SmoothPeriod - j;
         count += weight;
         smoothVolume += (double)tick_volume[i + j] * weight;
      }
      if( count > 0 )
      {
         tickVolume[i] = smoothVolume / count;
      }
      
      // 単純平均を求める。
      double average = 0 ;
      count = 0 ;

      for( int j = 0; j < AveragePeriod && (i + j) < rates_total; j++ )
      {
         count++;
         average += tickVolume[i + j];
      }
      if( count > 0 )
      {
         average = average / count;
      }
      tickAverage[i] = average;
   }
//--- return value of prev_calculated for next call
   return(rates_total - 1);
  }
//+------------------------------------------------------------------+

・・・・と思ったら、前回ふくめて+=演算子の説明していませんでした。
[a += 3]は[a = a + 3]の省略形です。同じように[-=][*=][/=]演算子があります。その意味では、[average = average / count;]は[average /= count;]と書き換え可能ですね。コードに統一性がないって言われそう^^;;;;すみません。

次回は、途中説明をかっ飛ばした関数とOnCalculateを中心に解説したいと思います。

次の回へ


ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログへ