MT5エキスパートアドバイザー EA05_BANDS.mq5

システムの概要

 今回シグナルに使うBANDSは1980年頃ジョン・ボリンジャー氏が考案したものです。
ボリンジャー・バンドあるいはボリン、BBで知られています。
ボリンジャー・バンドは単純移動平均線とその上下に標準偏差のバンド幅を計算したものです。E
M05_BANDS.mq5は、デフォルトの設定は±2σとなっっています。
チャート時間足の終値がこの値を超えた時に売買シグナルが出ます。
+2σより高くなった時売りのシグナル、マイナス2σより低くなった時買いのシグナルが出るように設定しています。
統計的な計算方法をもとにしていますが、大事なのはデータですので、
日足あるいは時間足では使い分ける必要があります。

 EM05_BANDS.mq5  のプログラムは下のダウンロードから行ってください。
ソースファイルですので、ダウンロードした後コンパイルが必要です。

ダウンロード

 ソースファイルはExpertsフォルダーに格納します。
Expertsフォルダーの開き方は、メタエディタのナビゲータでExpertsを選択し、
マウスの右ボタンをクリックします。そして「フォルダーを開く」を選択します。
Expertsフォルダーを開いた後、ファイルをコピー&ペーストします。
 コンパイルすると問題がなければ次のように表示されます。

0 error(s), 0 warning(s), compile time: 22982 msec  1 1

プログラムの変更箇所

 コードは以前作ったEMA_EA02.mq5を変更していますが、変更箇所は次のようになっています。

削除コード

input int      MA_Period=10;
int maH;
double maV[3];
----------
int OnInit()の削除コード

maH=iMA(_Symbol,_Period,MA_Period,0,MODE_EMA,PRICE_CLOSE);
if(maH==INVALID_HANDLE)
     {
      Print("Indicators error1");
      return(INIT_FAILED);
     }
----------
void OnDeinit(const int reason)の削除コード

IndicatorRelease(maH);

----------
void OnTick()の削除コード

if(CopyBuffer(maH,0,0,3,maV)<0)  return;

bool Buy_S1=(sclose>maV[1]);
bool Sell_S1=(sclose<maV[1]);

----------
追加コード

input int                  BANDS_Period=20; 
input int                  BANDS_Shift=0; 
input double               Deviation=2.0;

int BANDS_Handle;

double u_bands[3];//upper
double l_bands[3];//lower
double m_bands[3];//middle

----------
int OnInit()の追加コード

BANDS_Handle=iBands(_Symbol,_Period,BANDS_Period,BANDS_Shift,Deviation,PRICE_CLOSE); 

if(BANDS_Handle==INVALID_HANDLE)
     {
      Print("SIGNAL ERROR2");
      return(INIT_FAILED);
     }  

----------
void OnDeinit(const int reason)の追加コード

IndicatorRelease(BANDS_Handle);

----------
void OnTick()の追加コード

   if(CopyBuffer(BANDS_Handle,0,0,3,m_bands)<0)  return;
   if(CopyBuffer(BANDS_Handle,1,0,3,u_bands)<0)  return; 
   if(CopyBuffer(BANDS_Handle,2,0,3,l_bands)<0)  return; 

----------
void OnTick()の変更箇所

  Comment("  MIDDLE]  =  ",m_bands[1],"  UPPER  =  ",u_bands[1],"  LOWER  =  ",l_bands[1]);

if(sig == 1) //Buy_S1 && 

if(sig == -1) //Sell_S1 &&

//-------------------
iBANDSの使用方法

int  iBANDS( 
   string              symbol,               
   ENUM_TIMEFRAMES     period,               
   int                 bands_period,      
   int                 bands_shift,       
   double              deviation,            
   ENUM_APPLIED_PRICE  applied_price       
   );

Symbol:通貨ペア設定(_Symbol)
period:通貨ペアの時間足設定(_Period)
bands_period:ボリンジャーバンドの期間(BANDS_Period=20)
bands_shift:ボリンジャーバンドのシフト(BANDS_Shift=0) 
deviation:ボリンジャーバンドの偏差値(Deviation=2.0)
applied_price :適用価格(PRICE_CLOSE)

プログラムコード

 EA05_BANDS.mq5  のプログラムコードは以下のようになります。
赤字の部分は変更箇所です。


#property copyright "T.S"
#property link      "http://mt5myprogrammingts.blogspot.com"
#property version   "1.00"

#include <Trade/Trade.mqh>

//--- input parameters
input int      Stop=50;
input int      Take=100;
input int      Magic=1001;
input double   Lots=0.01;
input int      Slipage=10;

//---------------------------
//input int      MA_Period=10;

input int                  BANDS_Period=20; 
input int                  BANDS_Shift=0; 
input double               Deviation=2.0;

//int maH;

int BANDS_Handle;

//double maV[3];

double u_bands[3];//upper
double l_bands[3];//lower
double m_bands[3];//middle

double sclose;
int STP,TKP,SL;

//+---------------------------+
// Expert initialization function   
//+---------------------------+

int OnInit()
  {
//---
 //maH=iMA(_Symbol,_Period,MA_Period,0,MODE_EMA,PRICE_CLOSE);

   BANDS_Handle=iBands(_Symbol,_Period,BANDS_Period,BANDS_Shift,Deviation,PRICE_CLOSE); 
//--- What if handle returns Invalid Handle
  /*
   if(maH==INVALID_HANDLE)
     {
      Print("Indicators error1");
      return(INIT_FAILED);
     }
   */

   if(BANDS_Handle==INVALID_HANDLE)
     {
      Print("SIGNAL ERROR2");
      return(INIT_FAILED);
     }   

//---
   STP = Stop;
   TKP = Take;
   SL  = Slipage;

   if(_Digits==5 || _Digits==3) //EURUSD=5
     {
      STP = STP*10;
      TKP = TKP*10;
      SL  = Slipage*10;
     }

//---
   return(INIT_SUCCEEDED);
  }

//+----------------------------+
// Expert deinitialization function     
//+----------------------------+

void OnDeinit(const int reason)
  {
//---
   //IndicatorRelease(maH);
   IndicatorRelease(BANDS_Handle);
   Comment("");
  }
//+-----------------------------+
// Expert tick function        
//+-----------------------------+
void OnTick()
  {
//------------------------------
   MqlTick l_pr;
   MqlRates mrate[2];
//------------------------------

   if(!SymbolInfoTick(_Symbol,l_pr))
     {
      Print("the latest price  error");
      return;
     }

   if(CopyRates(_Symbol,_Period,0,2,mrate)!=2)
     {
      Print("CopyRates of ",_Symbol," failed, no history");
      return;
     }

//-----
   //if(CopyBuffer(maH,0,0,3,maV)<0)  return;

   if(CopyBuffer(BANDS_Handle,0,0,3,m_bands)<0)  return;
   if(CopyBuffer(BANDS_Handle,1,0,3,u_bands)<0)  return; 
   if(CopyBuffer(BANDS_Handle,2,0,3,l_bands)<0)  return;  

//-----   

   bool Buy_sig =false;
   bool Sell_sig=false;

   if(PositionSelect(_Symbol)==true)
     {
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
        {
         Buy_sig=true;
        }
      else if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
        {
         Sell_sig=true;
        }
     }

   sclose=mrate[0].close;

   //bool Buy_S1=(sclose>maV[1]);   

   int sig = 0;
   if(u_bands[1]<= sclose ) sig =-1;
   if(l_bands[1]>= sclose ) sig = 1;

   Comment("  MIDDLE]  =  ",m_bands[1],"  UPPER  =  ",u_bands[1],&quot
           ;  LOWER  =  ",l_bands[1]);

   if(sig == 1)//Buy_S1 && 
     {
      if(Buy_sig)  return;
      if(Sell_sig) return;

      double l = Lots;
      double p=NormalizeDouble(l_pr.ask,_Digits);
      double s = NormalizeDouble(l_pr.bid - STP*_Point,_Digits);
      double t = NormalizeDouble(l_pr.ask + TKP*_Point,_Digits);

      CTrade m_trade;
      m_trade.SetExpertMagicNumber(Magic);
      m_trade.PositionOpen(Symbol(),ORDER_TYPE_BUY,l,p,s,t,"");
     }

   //bool Sell_S1=(sclose<maV[1]);

   if( sig == -1)//Sell_S1 &&
     {
      if(Sell_sig) return;
      if(Buy_sig)  return;

      double l = Lots;
      double p = NormalizeDouble(l_pr.bid,_Digits);
      double s = NormalizeDouble(l_pr.ask + STP*_Point,_Digits);
      double t = NormalizeDouble(l_pr.bid - TKP*_Point,_Digits);

      CTrade m_trade;
      m_trade.SetExpertMagicNumber(Magic);
      m_trade.PositionOpen(Symbol(),ORDER_TYPE_SELL,l,p,s,t,"");
     }
  }
///END

注意事項:プログラムはあくまでFX個人投資家の学習のための、
デモ口座によるMQL5売買プログラミングの情報提供を目的としております。
プログラムによる運用結果につきましては、自己責任であることをご了承ください。
パラメータの設定、最適化は読者自ら行ってください。
リアルトレードではテストしておりません。