EAでボリンジャーバンドを使う(サンプルソース)

EA
スポンサーリンク

FXで売買タイミングとして使うボリンジャーバンドの、簡単なMT4のEAサンプルです。

何とか利益が出るような形で試行錯誤してサンプルを作った結果、ボリンジャーバンドの王道?である3σタッチで逆張りエントリーをするよりも、順張りエントリーしていく方が利益を出しやすいなーと思いました。

今回、以下の記事ではボリンジャーバンドのσタッチ関連での順張り目線でエントリーしていくサンプルを載せています。

主な構文

iBands()

【使用例】
iBands(NULL,0,20,3,0,PRICE_CLOSE,MODE_UPPER,0);

今回は、ボリンジャーバンドの値を取得できるiBands()関数を使っています。
※何で今回はいつも使っているiCustom()関数じゃないのかというと・・・、カスタムインジケータにボリンジャーバンドが存在しないからです(※MACDは存在しますが・・・)

引数は以下の通りです。

  1. 通貨ペア(NULLで当該通貨)
  2. 時間軸(0で当該時間軸)
  3. 期間(メインのラインとなる期間です)
  4. 偏差(3:3σ、2:2σ、1:1σ)
  5. 表示移動
  6. 適用価格
  7. モード(MODE_MAIN:中心線 MODE_UPPER:上線 MODE_LOWER:下線)
  8. バーシフト

基本的に、3,4,7,8ぐらいしか触らなさそうな設定ですね。

3:期間、4:偏差、5:表示移動、6:適用価格はMT4のボリンジャーバンド設定画面上で見るとイメージしやすいですね。

※ボリンジャーバンドの設定画面で触りそうなのは(3:期間、4:偏差)ですね

7:モードは、上線の値が欲しい場合はMODE_UPPERとし、中央線の値が欲しい場合はMODE_MAIN、下線の値が欲しい場合はMODE_LOWERとします。

8:バーシフトは過去のボリンジャーバンド値をとりたい場合変更します(0:最新バーの位置、1:1つ前のバーの位置)

以下サンプルソースでは、基本的なボリンジャーバンドの値(上線、下線の値)を使って判断するようにしています。

ソースコード


//+------------------------------------------------------------------+
//|                                       Bollinger bands_Sample.mq4 |
//|                                    Copyright 2020, mef Software. |
//|                                             https://fx-prog.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, mef Software."
#property link      "https://fx-prog.com/"
#property version   "1.00"

 
input int BB_KIKAN = 20;

input double Lots = 0.01;

input int SL = 220;
input int TP = 220;

 
double waitBB;
datetime prevtime;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//---
           
//---
   return(INIT_SUCCEEDED);
  }
        
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int start()
{
int orderPtn=0; //0:何もしない 1:買い 2:売り
int total=0;
        
int errorcode;               // エラーコード
int ea_ticket_No,ea_order_entry_Type=0,ea_order_MagicNo;  // チケットNo,エントリタイプ,マジックNo.
double ea_order_stop_price=0,ea_order_good_price=0,ea_order_entry_price=0; //ストップロスレート,利確レート,エントリーレート
        
//---
        
        
        
   //ボリンジャーバンドの値を取得
   double BB3UP = iBands(NULL,0,BB_KIKAN,3,0,PRICE_CLOSE,MODE_UPPER,0); //3σの上側
   double BB3LO = iBands(NULL,0,BB_KIKAN,3,0,PRICE_CLOSE,MODE_LOWER,0); //3σの下側
        
   double BB2UP = iBands(NULL,0,BB_KIKAN,2,0,PRICE_CLOSE,MODE_UPPER,0); //2σの上側
   double BB2LO = iBands(NULL,0,BB_KIKAN,2,0,PRICE_CLOSE,MODE_LOWER,0); //2σの下側
        
        
//***売買判断箇所***//
        
   //Askがボリンジャーバンドの上3σタッチで買いサイン
   if(BB3UP < Ask) 
   {
      orderPtn=1;
   }
   //Bidがボリンジャーバンドの下3σタッチで売りサイン
   else if(BB3LO > Bid)
   {
      orderPtn=2;
   }
   //それ以外は何もしない
   else
   {
      orderPtn=0;
   }
           
           
   //買いの場合 または 買い待ちの場合
   if((orderPtn==1) || waitBB>0 )
   {
      //2σ内で買いエントリー
      if((BB2UP > Ask && BB2LO < Bid ))
      {
         orderPtn=1;
         waitBB=0;
      }else{
         orderPtn=0;
         waitBB=1;  
      }
   }
   //売りの場合 または 売り待ちの場合
   if((orderPtn==2) || waitBB<0 )
   {
      //2σ内で売りエントリー   
      if((BB2LO < Bid && BB2UP > Ask ))
      {
         orderPtn=2;
         waitBB=0;
      }else{
         orderPtn=0;
         waitBB=-1;  
      }
   }   
//***売買判断箇所***//
        
   total=OrdersTotal();
           
   if(total == 1){
      //既に建玉を保有していたら何もしない
      waitBB=0; 
   }
        
//***エントリー箇所***//
   else if(total == 0 && orderPtn > 0)
   {
      if(orderPtn == 1)
      {
         ea_order_entry_price = Ask;               // 現在の買値でエントリー
         ea_order_entry_Type = OP_BUY;             //OP_BUY
         ea_order_stop_price = Ask - SL * Point;  //損切りポイント
         ea_order_good_price = Ask + TP * Point;  //利喰いポイント
      }
      else if(orderPtn == 2)
      {
         ea_order_entry_price = Bid;               // 現在の売値でエントリー
         ea_order_entry_Type = OP_SELL;            //OP_SELL      
         ea_order_stop_price = Bid + SL * Point;  //損切りポイント
         ea_order_good_price = Bid - TP * Point;  //利喰いポイント 
      }
              
      ea_order_MagicNo=0000;  //マジックナンバーは0000固定とする
        
      ea_ticket_No = OrderSend(   // 新規エントリー注文
            NULL,                     // 通貨ペア
            ea_order_entry_Type,      // オーダータイプ[OP_BUY / OP_SELL]
            Lots,                     // ロット(0.01単位,FXTFは1=10Lot)
            ea_order_entry_price,     // オーダープライスレート
            20,                       // スリップ上限
            ea_order_stop_price,      // ストップレート
            ea_order_good_price,      // リミットレート
            "テストオーダー",             // オーダーコメント
            ea_order_MagicNo,         // マジックナンバー(識別用)
            0,                        // オーダーリミット時間
            clrRed                    // オーダーアイコンカラー
          );
                
      if ( ea_ticket_No == -1)           // オーダーエラー
      {
         errorcode = GetLastError();      // エラーコード取得
         if( errorcode != ERR_NO_ERROR)   // エラー発生
         {
             printf("エラー");
         }
      }
      else {    // 注文約定
         Print("新規注文約定。 チケットNo=",ea_ticket_No);
      }
   }
        
        
   return(0);
}

3σで売り買いしたい場合

上記サンプルソースは2σでエントリーするタイプで作りましたが、もし3σでエントリーしたいといった場合、以下の部分を全て削除してもらったら3σで売り買いするようになります。

//買いの場合 または 買い待ちの場合
if((orderPtn==1) || waitBB>0 )
{
   //2σ内で買いエントリー
   if((BB2UP > Ask && BB2LO < Bid ))
   {
      orderPtn=1;
      waitBB=0;
   }else{
      orderPtn=0;
      waitBB=1;  
   }
}
//売りの場合 または 売り待ちの場合
if((orderPtn==2) || waitBB<0 )
{
   //2σ内で売りエントリー   
   if((BB2LO < Bid && BB2UP > Ask ))
   {
      orderPtn=2;
      waitBB=0;
   }else{
      orderPtn=0;
      waitBB=-1;  
   }
}   

エントリータイミング

ボリンジャーバンドの上3σタッチで買いエントリー待機です。その後、上2σ水準に来るまでは待ち(グローバル変数のwaitBB=1で管理)ます。waitBB=1でかつ上2σの水準まで来たら買いエントリーします。

同じく、ボリンジャーバンドの下3σタッチで売りエントリー待機です。その後、下2σ水準に来るまでは待ち(グローバル変数のwaitBB=-1で管理)ます。waitBB=-1でかつ下2σの水準まで来たら売りエントリーします。

結果を見た感じ、2σタッチでエントリーだと早すぎるのかも?1σタッチでエントリーとする等エントリーどころをもっと考えていけばもっと良くなるかもという印象でした。

あと、レンジ判定ができれば、3σタッチで逆張りも良さそうですがレンジ判定が難しいので今回は考えない事にしました。

決済タイミング

OCOの形で、損利共に22pipsです。

その他の仕様

設定値は以下の通りです。

  1. BB_KIKAN = 20 ⇒ ボリンジャーバンドの期間です
  2. Lots = 0.01 ⇒ ロット数です(0.01=1000通貨)
  3. SL = 220 ⇒ 損切り幅
  4. TP = 220 ⇒ 利確幅

既に建玉がある場合は追加でエントリーはしません。

値段が変わる度に処理を行いエントリー判断します。

EAレポート結果

2005年~2020年の期間の1時間足でバックテスト確認してみました。

今回は値段が変わる度に処理を行うタイプで作ったので、全ティックでのテストとなっています。全ティックでの開発とテストは、時間がかなり増えてしまうので個人的にあまり好きではないですね・・・。
※他のサンプルソースを見てもらったらわかりますが、足が確定した後にエントリーするタイプで基本作っています

今回は、ボリンジャーバンドの王道である3σで逆張りが全然機能しなかったので、順張り方向でのエントリーで考える事で何とか利益を出すことができました。利確ポイントや損切りポイントをもっと作り込むと3σで逆張りパターンの方が利益を出しやすいのかも・・・?

ただ、ボリンジャーバンドでも単純に順張りエントリーの方で利益が出せるというのは収穫でした。


 

※ EAのサンプルソースを一覧表にまとめました


※ オススメ記事(EAが使える国内FX業者の一覧)


※ 1からEAの作り方を学びたい人はこちら

コメント

タイトルとURLをコピーしました