2011/11/23

ボリンジャーバンドを作ってみました。■■■

ATC参戦用のEAを作るのに時間を取られ、後回しにしてきたことをコツコツと行っています。その中の一つがRの使い方の習得でした。今回は、Rの学習の一環としてボリンジャーバンドもどきを作ってみました。

ヒストグラムの作成

今回は、MQL4のスクリプトでUSDJPYH1をヒストグラム化してみました。Rの勉強になってない。。
以下がコードです。
//+------------------------------------------------------------------+
//|                                                    Copyprice.mq4 |
//|                                        Copyright ゥ 2009, bighope |
//|                       http://expertadviser-bighope.blogspot.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright ゥ 2009, bighope"
#property link      "http://expertadviser-bighope.blogspot.com/"
#property show_inputs
extern string Filename  = "USDJPYH1"; 

int bufindex(){
   int hiindex,lowindex,sd;
   double st;
   hiindex  = iHighest(NULL,0,MODE_HIGH);
   lowindex = iLowest(NULL,0,MODE_LOW);
   st = High[hiindex] - Low[lowindex];
   sd = st/Point*0.1;
   return(sd);
}

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
//----
   int handle,index;
   bool ret;
   int HL;
   double Ds[];
   index = bufindex();
   
   ArrayResize(Ds,index);
   handle=FileOpen(Filename+".csv",FILE_CSV|FILE_WRITE,',');
   if(handle<1) return(false);
  
   for(int i=0;i<Bars;i++){
      HL=MathRound((High[i]-Low[i])*MathPow(10,Digits)) ;
      Ds[HL]++;
   }

   for(i=0;i<index;i++){
      ret = FileWrite(handle,i,Ds[i]/Bars);
      if(ret==false)return(0);
   }
   FileClose(handle);
   Comment("Get Data OK");
//----
   return(0);
  }
//+------------------------------------------------------------------+

スクリプトを作動させると、・・・//experts/filesにCSVファイルが作られます。
※これをRに読み取らせる訳ですが、Rのアイコンを右クリック→プロパティを選択し、作業フォルダーのアドレスを変更しておくと、ひと手間省けて便利です。
syo-to
Rを起動し以下のコードでヒストグラムが表示されます。
#データの読み込み(リスト形式)
 d<-read.csv("UJH1.csv") #データの代入
 x<-d[[1]]
y<-d[[2]]
#表示
plot(x,y,main="USDJPU1時間足(Hi-Low)",xlab="pips",ylab="頻度%",xlim=c(0,80), ylim=c(0,0.06),col=1)
r
※Rはデータの種類がいろいろあって、はじめは、ここでつまずきました。 リストとは


確立密度関数の推定

当初は、ガンマ分布を当てはめようと考えていましたが、ある方から、対数正規分布を教えて頂いたので今回は、対数正規分布を当てはめてみました。回帰方法は、nls() 関数を使用しましたが、初期値設定を導くために以下のコードを追加しています。
rt
結果をグラフ化したものが以下の通りです。
r
対数正規分布の性質から平均と分散(偏差)が求まります。
平均=EXP(meanlog+(sdlog^2)/2)=19.01149(pips)
分散=EXP(2×meanlog+sdlog^2)×(EXP(sdlog^2)-1)=148.6416
偏差=√分散=12.19187

時間単位での変化

時間単位で調べてみると以下の表のようになりました。
時間帯 meanlog sdlog 平均 偏差
0 2.875508 0.508818 20.18533 10.9727
1 2.706802 0.567246 17.59625 10.84084
2 2.462878 0.565203 13.77155 8.448786
3 2.356058 0.561678 12.35177 7.522623
4 2.440356 0.562824 13.4468 8.209028
5 2.593056 0.522776 15.32834 8.593275
6 2.947423 0.468463 21.2669 10.53519
7 3.016413 0.479638 22.90693 11.65029
8 2.948864 0.466359 21.27663 10.48733
9 2.849121 0.495672 19.53029 10.30681
10 2.80227 0.487687 18.56335 9.619049
11 2.857566 0.47229 19.47429 9.735056
12 3.191692 0.516832 27.80594 15.38629
13 3.113179 0.503577 25.53306 13.71777
14 3.242793 0.51251 29.19876 16.00329
15 3.034412 0.475586 23.27787 11.72715
16 2.822379 0.50759 19.12895 10.36999
17 2.655229 0.517096 16.2635 9.004569
18 2.662298 0.519839 16.40218 9.136312
19 2.436341 0.53617 13.1982 7.616876
20 2.371655 0.582975 12.69978 8.079605
21 2.4068 0.499943 12.57576 6.701269
22 2.522685 0.492323 14.06762 7.367471
23 2.745907 0.502226 17.67272 9.465938
※時間は、GMT時間を採用
平均値(期待値)が、時間帯によって倍以上の違いがあることがわかります。


ボリンジャーバンドもどき

平均と偏差と聞いて思い出すのがボリンジャーバンド!と言うことで、上記の内容を踏まえて指標の作成です。
tty
//+----------------------------------------------------------------------------+
//|                                                              BBands.mq4|
//|                                                  Copyright ゥ 2009, bighope | 
//|                                 http://expertadviser-bighope.blogspot.com/ |
//+----------------------------------------------------------------------------+ 
#property copyright "Copyright ゥ 2011, bighope" 
#property link http://expertadviser-bighope.blogspot.com/ 
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Yellow
#property indicator_color2 Yellow
extern int    GMT      =   1;
extern double Multiple = 1.0;
double Average[24]   = {0.202,0.176,0.138,0.124,0.134,0.153,0.213,0.229,0.213,0.195,0.186,0.195,0.278,0.255,0.292,0.233,0.191,0.163,0.164,0.132,0.127,0.126,0.141,0.177};
double Deviation[24] = {0.110,0.108,0.084,0.075,0.082,0.086,0.105,0.117,0.105,0.103,0.096,0.097,0.154,0.137,0.160,0.117,0.104,0.090,0.091,0.076,0.081,0.067,0.074,0.095}; 

double  Hibands[];
double  Lowbands[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   IndicatorBuffers(2);
//---- indicator line
   SetIndexStyle(0,DRAW_LINE);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(0,Hibands);
   SetIndexBuffer(1,Lowbands);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int i,h,counted_bars=IndicatorCounted();
   double hig,lowg,cg;
//----
   if(Multiple<0)return(0);
   if(counted_bars>0) counted_bars--;
   int limit=Bars-counted_bars;
   
   for(i=0; i<limit; i++){
      h    = TimeHour(Time[i]);
      hig  = High[iHighest(NULL,0,MODE_HIGH,12,i)];
      lowg = Low[iLowest(NULL,0,MODE_LOW,12,i)];
      h = h-GMT;
      if(h<0)h=24+h;
      cg=(hig+lowg)/2;
      Hibands[i]  = cg + (Average[h]/2) + (Deviation[h] * Multiple);
      Lowbands[i] = cg  - (Average[h]/2) - (Deviation[h] * Multiple);  
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+


※USDJPY M5用に作成しています。
 

まとめ

かなり飛ばしてまとめてしまいました。^^;