[EA作成]ボリンジャーバンドの収縮後のブレイクアウトロジックでトレード

スポンサーリンク

MT4 EAトレードネタ:ボリンジャーバンドの収縮後のブレイクアウトロジックでトレード

期間設定を長めにしたBB(ボリンジャーバンド)が収縮した後の、バンドブレイクアウトを利用したトレード方法を検討、検証し、稼いでくれる(はずの)EAを作成しました。

相場(通貨の価格)が長い間停滞した後、急に動き出すと、急激に価格が上昇(または下降)することがあります。
そのFXの特性を狙ったエントリー方法です。

BB(ボリンジャーバンド)使って、相場が停滞していることを検出(バンドが収縮したことで検出)し、そのバンドをブレークしたタイミングで、その方向にポジション(買いまたは売りポジション)を持ちます。

BBの期間設定は一般的な20や21よりかなり長めで、60~150とかに設定するとかなり有効です。

いろいろバックテストしていたところ、この事実に気付きました!
結構、自動売買(システムトレード)のネタとして使えそうです!!

15分足で検証しています。

相場が上下どっちにも動けない状態(みんなが様子を伺っている状態)から、急に動き出すと、ずっと待っていた人たちが一気にポジションを持ち、大きく上昇または下降を開始し、トレンドが形成されることがよくあるため、それを狙ったエントリー方法です。

(1)トレードプログラム(EA)のロジック

BBが収縮した後、その収縮したBBのバンドをローソク足が抜けたタイミングで、買いポジションまたは売りポジションを持ちます。
その際、決済指値、決済逆指値も設定しておきます。

チャートで示すと以下のような感じです。

USDJPYM15
 

青三角(>)のタイミングでエントリーし、点線の間ポジションを保持し、青三角(<)でポジションを閉じています。
BBを抜けた後、上昇していることがわかると思います。

以下はこのトレードプログラム(EA)のソースコードです。私はこのような感じでこのロジックを再現しました。

自動売買プログラム(EA)フォーマット」で記載したEAプログラムフォーマットをベースに作成しています。
こちらに記載している内容については省略しています。
#define COMMENT_HL "TRADE_HL_1-1"


/// 外部パラメータ
extern double Lots = 0.1;
extern int timeframe = PERIOD_M15;  // timeframe 

extern double RegOpen_Bbb = 0;      //ローソク足の長さ
extern double RegOpenSkip_Bbb = 1000;      //エントリーを控えるローソク足の長さ
extern double close_price_Bbb=300;
extern double take_price_Bbb=300;

extern int BBPeriod_Bbb = 60;        // ボリンジャーバンドの期間
extern double BBDev_Bbb = 2;            // 標準偏差の倍率
extern double BBwidth_Bbb = 100;


// 内部パラメータ
/* 省略 */

/// ===================
/// トレード用の実装(トレードロジックに依存)
/// ===================
/// 初期化関数                                                       |
int OnInit()
{
   /* 省略 */
}


void OnDeinit(const int reason)
{
   /* 省略 */
}

// エントリ判定
void EntrySignal(void)
{
   // オープンポジションの計算
   double pos = OpenOrders(MagicNumber);

   // for Minutes
   double bbU1 = iBands(NULL, timeframe, BBPeriod_Bbb, BBDev_Bbb, 0, PRICE_CLOSE, MODE_UPPER, 1);
   double bbL1 = iBands(NULL, timeframe, BBPeriod_Bbb, BBDev_Bbb, 0, PRICE_CLOSE, MODE_LOWER, 1);

   double open_0 = iOpen(NULL, timeframe, 1);
   double open_1 = iOpen(NULL, timeframe, 1);
   double close_1 = iClose(NULL, timeframe, 1);
   double high_1 = iHigh(NULL, timeframe, 1);
   double low_1 = iLow(NULL, timeframe, 1);

   bool order_buy = False;
   bool order_sell = False;
   double stop_loss = 0;
   double stop_take = 0;


   int ret = 0;

   int entry = ENTRY_NONE;
   int entry_reason = ENTRY_NONE;

   if( (bbU1 - bbL1) < BBwidth_Bbb*Point ){

      if(newtrend == TREND_LONG){
         entry |= ENTRY_LONG_BB;
      }
      else if(newtrend == TREND_SHORT){
         entry |= ENTRY_SHORT_BB;
      }
      else if(newtrend == TREND_RENGE){
         entry |= ENTRY_LONG_BB | ENTRY_SHORT_BB;
      }
   }

   // 買い
   if( !order_buy && (entry & ENTRY_LONG_BB) != 0 ){
      if( (close_1 - low_1) > RegOpen_Bbb*Point && close_1 > bbU1
         && (close_1 - open_1) < RegOpenSkip_Bbb*Point ){
   		 order_buy = True;
         stop_loss = Bid-close_price_Bbb*Point;
         stop_take = Bid+take_price_Bbb*Point;
         entry_reason = ENTRY_LONG_BB;
      }
   }

   // 売り
   if( !order_sell && (entry & ENTRY_SHORT_BB) != 0 ){
      if( (high_1 - close_1) > RegOpen_Bbb*Point && close_1 < bbL1
         && (open_1 - close_1) < RegOpenSkip_Bbb*Point ){
   		 order_sell = True;
         stop_loss = Ask+close_price_Bbb*Point;
         stop_take = Ask-take_price_Bbb*Point;
         entry_reason = ENTRY_SHORT_BB;
      }
   }


   //買い注文
   bool RO = TRUE;
   if( order_buy && (ordered_open == -1) ){
      // 買い注文処理
      
      // 売りポジションが残っていたら決済する
      if( pos<0 ){
         RO = CloseOrder(Symbol(), OP_SELL, Slippage, MagicNumber, clrBlueViolet);
      }
      
      // 決済が成功したか確認
      if( RO ){
      
         // 既に買いポジションを持っていないか確認
         if ( pos<=0 ){
            // 買い注文発行
            if(SendOrder(OP_BUY, Lots, Ask, stop_loss, stop_take, Slippage, MagicNumber, COMMENT_BBB)){
               // 注文完了を保持(すぐにポジションクローズしてしまわないように)
               ordered_open = open_0;
               order_count_Bbb++;
            }
         }
      }
   }

   //売り注文
   if( order_sell && (ordered_open == -1) ){
      // 売り注文処理
      
      // 買いポジションが残っていたら決済する
      if ( pos>0 ){
         RO = CloseOrder(Symbol(), OP_BUY, Slippage, MagicNumber, clrBlueViolet);
      }

      // 決済が成功したか確認
      if( RO ){

         // 既に売りポジションを持っていないか確認
         if ( pos>=0 ){
            // 売り注文発行
            if(SendOrder(OP_SELL, Lots, Bid, stop_loss, stop_take, Slippage, MagicNumber, COMMENT_BBB)){
               // 注文完了を保持(すぐにポジションクローズしてしまわないように)
               ordered_open = open_0;
               order_count_Bbb++;
            }
         }
      }
   }
}


void OnTick()
{
/* 省略 */
}

(2)このロジックを利用して作成したEA

上で紹介したロジックを利用してEAを作成し、検証を行いました。

これに、以下の対応も行うことで収益性を上げています。
■エントリー条件
移動平均(EMA)を利用して、トレンドの方向を確認
明らかなトレンド発生している場合は、逆方向にはエントリーしない
■クローズタイミング
エントリーに設定した指値、逆指値(バックテストで最適値を調整)での決済をベースとし、
以下のような条件を満たした場合にも、勢いがなくなったと判断して、ポジションをクローズする。
・短期間で一気に上昇(下降)
・最近の最高値(最安値)を一旦超えたが、すぐに最高値(最安値)以下に戻された
・エントリー後、一定時間経過した(だいたい1日)
狙った方向に動かなかったら(逆方向に動いてしまったら)早めに諦めるため、勝率は高くはないですが、負け額よりも大きく利益を取る、損小利大(リスクリワードを高くする)タイプのロジックになります。

(3)バックテストでの検証

#バックテスト結果

MT4のストラテジーテスタで、2007/1/1~2019/6/30までのおよそ12年間の過去の相場データで、バックテストしパラメータを調整した結果です。
※後述している簡易フォワードテストもやりたかったので、2019/6/30までにしています

15分足で検証しています。

以下、通貨はGBPJPYでバックテストした結果です。

GBPJPY_back

1万通貨固定の約13年の運用(1ポジションのみ、複利運用なし、スプレッド20)、総取引数は1849で、純利益は18577ドル、プロフィットファクタは1.44、勝率39.53%の結果となりました。

基本的にトレンドフォロー型で、損小利大のリスクリワードを高くするタイプのEAになるので、劇的な勝率、プロフィットファクタではありませんが、利益はだいぶ積み上げられているかと思います。

いろいろEAを作成し、バックテストし、実際に運用でも使っている感じでは、取引数が多くて結果が出ていることが重要だと感じており、こういうタイプの方が実運用では活躍してくれると感じています。
(シンプルなロジックで、再現性が高いことが重要!!)

#簡易フォワードテスト

バックテストの結果(期待値)が今後も続きそうかを検証するため、簡易フォワードテストもやってみました。

以下が、その結果です。
2019/7/1~2020/10/30まで運用した場合の見込みです。

GBPJPY_forward

純利益 1592ドル、プロフィットファクタ 1.34、勝率41%です。
仮に、1万通貨で、2019/07/01~2020/10/30まで運用していたとしたら、約16万もプラスにできているので、結構な成績ではないでしょうか。

実運用だと大きく相場が動いたときに、スプレッドが広がったりなど、この通りには行かなかった可能性もありますが、プラスにはできたのではないかと思います。

#他の通貨ペアでの検証結果

他の通貨ペアで検証した結果は以下になります。
バックテストには若干劣る部分もありますが、いずれも簡易フォワードテストがプラスになっています。
これは、今までの作成したEAの中でも、かなり良い結果です!
期待高いです!!

backtest

#複利運用のバックテストをしてみる

複利運用モード(こちら「複利運用ロジック追加:有効証拠金の増減に応じて注文ロット数を変更する」の記事参照)で、Lots=0.08(8千通貨)、複利運用基準値=100000円の設定で
通貨ペア=GBPJPY、有効証拠金=100000円で、2007/01/01に運用開始した場合、

2013/01には1億円を超えるシミュレーション結果になってます。
(2000/01/01~2020/10/30の期間で、分かりやすく、円表示でシミュレーションしています。)

GBPJPY_fukuri

2007.01月、10万円で開始
2007.12月、100万円越え
2010.02月、1000万円越え
2013.01月、1億円越え(※1ポジションの上限の関係上、複利運用は2500万くらいまで)

あくまでもバックテストなので、ここまでは難しいとは思いますが、夢は膨らみますね(笑)

#本格フォワードテスト(デモトレードでのフォワードテスト)

GoGoJungle“さんで、デモ口座を使って、本EA(名付けて「BB break M15BBブレイクを使ったトレンドフォロー型EA。複利運用モードを使うと3万円が4年で100万円、6年半で1000万円のシミュレーション結果に。 | GogoJungle」)のフォワードテストを実施頂いています。

ボリンジャーバンド(BB)収縮後のブレイクでエントリーするトレンドフォロー型EA(15分足用)

BB break M15ボリンジャーバンド(BB)収縮後のブレイクでエントリーするトレンドフォロー型EA(15分足用) | GogoJungle

今のところ(20/11/29現在)、結構いい結果が出ています!!

もし、自分で作るのも面倒くさいし、私が作ったものを使ってみたい、と思ってもらえるようであれば、利用してもらえたら嬉しいです!!
「(4)他の通貨ペアでの検証結果」で検証した通貨ペアはすべて使用可能にしています。

関連記事

スポンサーリンク
海外FXキャッシュバック口座開設ならTariTali(タリタリ)

コメント

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