2012年6月5日火曜日

FXのチャート分析ソフトMT4でボリンジャーバンドの1σ、2σ、3σを一度に表示するには

ボリンジャーバンドは、+1σと-1σの間で推移するのがおよそ68%、+2σと-2σの間で推移するのがおよそ95%、そして、+3σと-3σの間で推移するのがおよそ98%といわれています。

FX(外国為替証拠金取引)のチャート分析ソフトMT4(Meta Trader 4)には、インディケーターとしてボリンジャーバンドが用意されています。


上の図は、チャート画面にボリンジャーバンドを描画したものです。

しかし、σ(シグマ)は1つしか設定できません。そこで、MT4に実装されているボリンジャーバンドのインディケーター(bands.mq4)を改良して1σ、2σ、3σを一度に表示できるようにしました。

次のプログラムを「bands123.mq4」のファイル名で保存します。保存先は、MT4のインストールされているフォルダの「experts」フォルダ内の「indicators」を指定します。

「bands123.mq4」
//+------------------------------------------------------------------+
//| bands123.mq4 |
//| sample |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "sample"
#property link "http://www.metaquotes.net/"

#property indicator_chart_window
#property indicator_buffers 7
#property indicator_color1 LightSeaGreen
#property indicator_color2 Blue
#property indicator_color3 Blue
#property indicator_color4 Red
#property indicator_color5 Red
#property indicator_color6 Yellow
#property indicator_color7 Yellow
//---- indicator parameters
extern int BandsPeriod=20;
extern int BandsShift=0;
extern double BandsDeviations1=1.0;
extern double BandsDeviations2=2.0;
extern double BandsDeviations3=3.0;
//---- buffers
double MovingBuffer[];
double UpperBuffer1[];
double LowerBuffer1[];
double UpperBuffer2[];
double LowerBuffer2[];
double UpperBuffer3[];
double LowerBuffer3[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,MovingBuffer);
SetIndexStyle(1,DRAW_LINE);
SetIndexBuffer(1,UpperBuffer1);
SetIndexStyle(2,DRAW_LINE);
SetIndexBuffer(2,LowerBuffer1);
SetIndexStyle(3,DRAW_LINE);
SetIndexBuffer(3,UpperBuffer2);
SetIndexStyle(4,DRAW_LINE);
SetIndexBuffer(4,LowerBuffer2);
SetIndexStyle(5,DRAW_LINE);
SetIndexBuffer(5,UpperBuffer3);
SetIndexStyle(6,DRAW_LINE);
SetIndexBuffer(6,LowerBuffer3);
//----
SetIndexDrawBegin(0,BandsPeriod+BandsShift);
SetIndexDrawBegin(1,BandsPeriod+BandsShift);
SetIndexDrawBegin(2,BandsPeriod+BandsShift);
SetIndexDrawBegin(3,BandsPeriod+BandsShift);
SetIndexDrawBegin(4,BandsPeriod+BandsShift);
SetIndexDrawBegin(5,BandsPeriod+BandsShift);
SetIndexDrawBegin(6,BandsPeriod+BandsShift);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Bollinger Bands |
//+------------------------------------------------------------------+
int start()
{
int i,k,counted_bars=IndicatorCounted();
double deviation;
double sum,oldval,newres;
//----
if(Bars<=BandsPeriod) return(0); //---- initial zero if(counted_bars<1) for(i=1;i<=BandsPeriod;i++) { MovingBuffer[Bars-i]=EMPTY_VALUE; UpperBuffer1[Bars-i]=EMPTY_VALUE; LowerBuffer1[Bars-i]=EMPTY_VALUE; UpperBuffer2[Bars-i]=EMPTY_VALUE; LowerBuffer2[Bars-i]=EMPTY_VALUE; UpperBuffer3[Bars-i]=EMPTY_VALUE; LowerBuffer3[Bars-i]=EMPTY_VALUE; } //---- int limit=Bars-counted_bars; if(counted_bars>0) limit++;
for(i=0; iBandsPeriod-1) i=Bars-counted_bars-1;
while(i>=0)
{
sum=0.0;
k=i+BandsPeriod-1;
oldval=MovingBuffer[i];
while(k>=i)
{
newres=Close[k]-oldval;
sum+=newres*newres;
k--;
}
deviation=BandsDeviations1*MathSqrt(sum/BandsPeriod);
UpperBuffer1[i]=oldval+deviation;
LowerBuffer1[i]=oldval-deviation;
deviation=BandsDeviations2*MathSqrt(sum/BandsPeriod);
UpperBuffer2[i]=oldval+deviation;
LowerBuffer2[i]=oldval-deviation;
deviation=BandsDeviations3*MathSqrt(sum/BandsPeriod);
UpperBuffer3[i]=oldval+deviation;
LowerBuffer3[i]=oldval-deviation;
i--;
}
//----
return(0);
}
//+------------------------------------------------------------------+


上の図は、チャートにボリンジャーバンドの+1σ、-1σ、+2σ、-2σ、+3σ、-3σを描画したものです。なお、σの値や線の色、計算期間はパラメータにより変更できます。