過去記事はこちらから
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