今回は前回の「【MQL4:サインツール編①】任意条件(RSI)でサインを出す<バイナリーオプション>」の続きとなります。

前回の記事ではコードサンプルとしてサインコードの原型を記載しましたが、今回もその原型を用いて他のアロー条件に変更していこうと思います。

前回から変更する項目

前回は【RSI:70以上30以下】のサインを出していましたが、今回は

【ボリンジャーバンド(20):3σタッチ】でサインを出すものを制作しようと思います。

ボリンジャーバンドでの表現はいくつか注意すべきことがあったりしますが

先にコードのサンプルを掲載してその後に説明しようと思います。

サンプルコード(ボリンジャーバンド:アロー)

【ボリンジャーバンド(20):3σタッチ】のサンプルコードは下記の通りです。

#property copyright "TAKULOG"
#property version "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2    //インジケータのバッファを2つ用意
#property indicator_color1 Red   //1つ目のインジケータを赤色に設定
#property indicator_color2 Blue  //2つ目のインジケータを青色に設定
#property indicator_width1 1     //1つ目のインジケータの太さを3に設定
#property indicator_width2 1     //2つ目のインジケータの太さを3に設定

//バッファー用意///////////////////////////////////////////////
//※バッファーという理由は詳しくないですが、≪値を格納する箱≫ 的な認識でOK
double ArrowUp[]; //上矢印用バッファー
double ArrowDown[]; //下矢印用バッファー
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit(){ //初期化関数---主に初期条件やチャート更新時に決めておく内容を書く項目
 //下矢印1
 SetIndexBuffer(0,ArrowDown);  //バッファを用意
 SetIndexStyle(0,DRAW_ARROW);  //矢印を出す
 SetIndexArrow(0,238);         //矢印の種類設定 調べると各矢印形等の番号が出る
 SetIndexEmptyValue(0,0.0);
 SetIndexLabel(0,"arrow_Down");//ラベル(名前)を決める
 //上矢印1
 SetIndexBuffer(1,ArrowUp);    //バッファを用意
 SetIndexStyle(1,DRAW_ARROW);  //矢印を出す
 SetIndexArrow(1,236);         //矢印の種類設定 調べると各矢印形等の番号が出る
 SetIndexEmptyValue(1,0.0);
 SetIndexLabel(1,"arrow_Up");  //ラベル(名前)を決める
 //---
 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[])
{
 int limit = rates_total - prev_calculated;
 int n = 2; //array out of range対処
 if (limit > 1) {limit = rates_total - n - 1;}

 // <<アロー用forループ開始>>///////////////////////////////////////////
 for(int i=limit; i>=0; i--){//for開始
  if(i+1 >= Bars-1){continue;}
  //↓↓↓↓↓↓↓↓↓↓↓↓↓↓【今回変更する項目】↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
  ////// 【BB値取得】 ///////////////////////////////////////////
  double BBUpper = iBands(NULL,0,20,3.0,0,PRICE_CLOSE,MODE_UPPER,i);//+σ
  double BBMAIN  = iBands(NULL,0,20,3.0,0,PRICE_CLOSE,MODE_MAIN,i); //センターライン(今回使用していません)
  double BBLower = iBands(NULL,0,20,3.0,0,PRICE_CLOSE,MODE_LOWER,i);//-σ
  // <<アロー条件定義>> ////////////////////////////////////////////
  if(BBUpper<=High[i]){  //条件①
   ArrowUp[i] =0;        //0に返す
   ArrowDown[i]=High[i]; //下矢印を高値に表示
  }
  else if(BBLower>=Low[i]){ //条件②
   ArrowUp[i]=Low[i];       //上矢印を安値に表示
   ArrowDown[i]=0;          //0に返す
  }
  else{
   ArrowDown[i]=0;   //0に返す
   ArrowUp[i] =0;    //0に返す
  }
 }
 //↑↑↑↑↑↑↑↑↑↑↑↑【今回変更する項目】↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
 // <<アロー用forループ終了>> ///////////////////////////////////
 //--- return value of prev_calculated for next call
 return(rates_total);
}

コンパイルしたもの

前回から変更されている箇所

前回のコード一部

//アローを出す条件記開始
////// 【RSI値取得】 ///////////////////////////////////////////
double RsiCL =iRSI(NULL,0,14,PRICE_CLOSE,i); //現行足RSI
// <<アロー条件定義>> ////////////////////////////////////////////
if(RsiCL>=70){         //条件①
 ArrowUp[i] =0;        //0に返す
 ArrowDown[i]=High[i]; //下矢印を高値に表示
 }
else if(RsiCL<=30){    //条件②
 ArrowUp[i]=Low[i];    //上矢印を安値に表示
 ArrowDown[i]=0;       //0に返す
}
else{
 ArrowDown[i]=0;       //0に返す
 ArrowUp[i] =0;        //0に返す
}
// アローを出す条件終了

今回変更した箇所

//↓↓↓↓↓↓↓↓↓↓↓↓↓↓【今回変更する項目】↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
////// 【BB値取得】 ///////////////////////////////////////////
double BBUpper = iBands(NULL,0,20,3.0,0,PRICE_CLOSE,MODE_UPPER,i);//+σ
double BBMAIN = iBands(NULL,0,20,3.0,0,PRICE_CLOSE,MODE_MAIN,i); //センターライン(今回使用していません)
double BBLower = iBands(NULL,0,20,3.0,0,PRICE_CLOSE,MODE_LOWER,i);//-σ
// <<アロー条件定義>> ////////////////////////////////////////////
if(BBUpper<=High[i]){   //条件①
 ArrowUp[i] =0;         //0に返す
 ArrowDown[i]=High[i];  //下矢印を高値に表示
}
 else if(BBLower>=Low[i]){ //条件②
 ArrowUp[i]=Low[i];        //上矢印を安値に表示
 ArrowDown[i]=0;           //0に返す
}
 else{
 ArrowDown[i]=0;  //0に返す
 ArrowUp[i] =0;   //0に返す
}

見比べるとほとんど変更がないというのは分かって頂けるのではないでしょうか?

実際に変更しているのは使用するインジケーターを取得する為のiRSIとiBans各種

アローを出す条件となるif( )とelse if( )の中身を変更しています。

ボリンジャーバンドをMQL4で取得する上での注意点

ボリンジャーバンドをMQL4で取得する際には下記の注意が必要です。

  • MODE指定:+σ,-σ,センターラインの使用するものをそれぞれ取得する
  • 取得している値は通貨毎の価格帯

この2点を知っておく必要があります。

MODE指定

今回のコードを例に説明していきます。

double BBUpper = iBands(NULL,0,20,3.0,0,PRICE_CLOSE,MODE_UPPER,i);//+σ
double BBMAIN  = iBands(NULL,0,20,3.0,0,PRICE_CLOSE,MODE_MAIN,i); //センターライン(今回使用していません)
double BBLower = iBands(NULL,0,20,3.0,0,PRICE_CLOSE,MODE_LOWER,i);//-σ

コード内後半部分にて

iBands(~~~MODE_○○, i )の○○の部分がUPPER、MAIN、LOWERとありますがそれぞれ、+σ、センターライン、-σを意味します。

使用したい線の数値を取得するようにしましょう。

取得している値

ボリンジャーバンドに限らず、主にメインウィンドウに表示するインジケーター(MA等も含む)ではRSIなどのオシレーターとは異なり、計算された価格を取得していることになります。

その為、タッチやオーバーを表現する際は四本値(始値、終値、高値、安値)< open[], close[], high[], low[] >と比較する必要があります。