2016年1月13日水曜日

[MQL超入門] その011 本格的にインジケータを作ってみよう。その3 移動平均を追加してみよう。

昨日の続きでです。

[MQL超入門] その010 本格的にインジケータを作ってみよう。その2 TICKの更新回数を描画する。
http://mt4program.blogspot.jp/2016/01/mql-010-tick.html


今日もいきなり結果から行きたいと思います。

・図011.01 TICK更新回数に単純移動平均を追加する。

赤い線が100本平均、青い線が現在値です。
TICK値は15分足が面白いと考えています。眺めていると何か使えそうな指標が見えてくるかもしれません。基本的には更新回数のピークアウト時に方向転換が発生する可能性が高いですし、平均以下のTICKの場合、あるきまった方向にだらだらと移動する習性があるように見受けられます。これは参加者が少ない場合は方向性に逆らいたくないという心境など心理面が解析としてあらわれいるのではないでしょうか?

平均値を入れることで一挙に何かが見えてくるような感じがしてきませんか?

さて、コードを見てみましょう。

//+------------------------------------------------------------------+
//|                                                   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 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-- )
   {
      tickVolume[i] = (double)tick_volume[i];
      
      // 単純平均を求める。
      double average = 0 ;
      int 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);
  }
//+------------------------------------------------------------------+

全く新しい記述として追加されているのは、次の一文です。
input int AveragePeriod = 100; //移動平均期間
これは、インジケータの入力パラメータを指定しています。
移動平均期間というint型の入力パラメータを指定しています。

なお、input構文は、最後にコメントをつけると入力画面にてコメントが表示できます。
詳しくはこちらをご覧ください。
[MT4プログラミング]小ネタ 入力パラメータの説明を置き換える。
http://mt4program.blogspot.jp/2015/11/mt4_10.html

ここ以外の構文は、その10までで説明した内容となります。現在値と平均値が同じ色だと見えにくいため線の色を変えています。
移動平均を求める処理は、足して割るという単純なものです。

さて、これで基本完成なのですが、もし私が使うインジケータでしたら、あと一工夫します。
TICK更新回数の現在値ですが、細かい変動が多く少し平滑化効果を入れたい気がしませんか?そこで、次回では、現在値に平滑化効果を入れてみたいと思います。

次の回へ


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