TMAバンド(三角移動平均)とバブルバンドを使ったFX自動売買戦略の検証

2017年3月13日

TMAバンド

先日、こんなFX売買戦略の記事が私の目にとまりました。

ブラッドリーさん(その2)「買いバブル」と「売りバブル」についてはコチラ!

ブラッドリーさん(その3)「フラクタル・エッジ」の基本についてはコチラ!

ちゃんとした説明は上記記事を読んでいただきたいのですが、簡単に説明すると、このような売買戦略です。画像は上記サイトより引用させていただいております。

三角移動平均

TMA(三角移動平均)という、EMA(指数移動平均)やWMA(加重移動平均)より反応が早い移動平均を使う。TMA : Triangular moving average

TMA

TMAバンドとバブルバンド

また、それをATRを使いバンド化した、TMAバンドとバブルバンドという2つのバンドを使う

TMAバンド

売買

バブルバンドとローソク足(確定足)がTMAバンドの外に行き、ローソク足が内側に戻ってきて確定したら売買

TMAバンド

ストップロスとテイクプロフィット

ストップロスは直近高値安値の少し上(最低20pips離す)、テイクプロフィットは同幅

ストップロス

戦略が明確でプログラム化できそうですし、インジケータも作者サイトで無料配布されていたので、コードを書いて試してみることにしました。

MQLコード

作者サイトからインジケータをダウンロードし、コードを書いてみます。私の理解が正しければ、コードはこんな感じになるはずです。

同時に何ポジション保有するかは書かれていませんでしたが、条件を満たしても無限にポジションを持たないように設定しておきましょう。

static datetime lastExecuted = 0;       
if(lastExecuted < Time[0]){
   lastExecuted = Time[0];
   int currentBuy = CountBuyPositions();
   int currentSell = CountSellPositions();

   if(currentSell < _maxPosition && Bubble(UP,2) > TMA(UP,2) && Close[2] > TMA(UP,2) && Close[1] < TMA(UP,1)){
      double stoploss = MathMax(Bid+200*Point,10*Point + iHigh(Symbol(),PERIOD_CURRENT,iHighest(Symbol(),PERIOD_CURRENT,MODE_HIGH,_barPeriod,1)));
      double takeprofit = Bid - (stoploss-Bid);
      doOrderSend(OP_SELL,_lot,Bid,stoploss,takeprofit,_magic);
   }
   if(currentBuy < _maxPosition && Bubble(DOWN,2) < TMA(DOWN,2) && Close[2] < TMA(DOWN,2) && Close[1] > TMA(DOWN,1)){
      double stoploss = MathMin(Ask-200*Point,-10*Point+iLow(Symbol(),PERIOD_CURRENT,iLowest(Symbol(),PERIOD_CURRENT,MODE_LOW,_barPeriod,1)));
      double takeprofit = Ask + (Ask-stoploss);
      doOrderSend(OP_BUY,_lot,Ask,stoploss,takeprofit,_magic);
   }

結果

バックテスト結果はこちらです。EURUSD、15分足、2007年から2016年までの10年間、スプレッドは10point、0.1ロットでのバックテストです。最大ポジション数は3です。

バックテスト

「おつかれ!」と言いたくなるグラフです。著者はこの戦略で年利35%を記録したらしいです。素晴らしいですね。

損切りトレードの例

青い点線が損切りトレードです。この場合は舌から突き抜けてきたので買いを入れていますが、損切りしています。

損切り

利確トレードの例

この場合は利益確定しています。青い点線の始めで買いを入れ、終わりで決済しています。

※このインジケータ、リペイントが激しいので(インジケータの線が後から書き換わる)
この図で見ると、「エントリーしている位置、違わない?」と思われるかもしれません。

利益確定

戦略の改善

一方的に負けすぎていますので次の戦略を試してみました。

  • テイクプロフィットをTMAバンドの中央に設定
  • ストップロスは同幅
if(currentSell < _maxPosition && Bubble(UP,2) > TMA(UP,2) && Close[2] > TMA(UP,2) && Close[1] < TMA(UP,1)){
   takeprofit = TMA(CENTER,0);
   stoploss = Bid + (Bid - takeprofit);
   doOrderSend(OP_SELL,_lot,Bid,stoploss,takeprofit,_magic);
}
if(currentBuy < _maxPosition && Bubble(DOWN,2) < TMA(DOWN,2) && Close[2] < TMA(DOWN,2) && Close[1] > TMA(DOWN,1)){
   takeprofit = TMA(CENTER,0);
   stoploss = Ask - (takeprofit-Ask);
   doOrderSend(OP_BUY,_lot,Ask,stoploss,takeprofit,_magic);
}

バックテスト結果

バックテスト結果はこちらです。同じくEURUSD、15分足、2007年から2016年までの10年間、スプレッドは10point、0.1ロットでのバックテストです。最大ポジション数は3です。

バックテスト

先ほどよりはだいぶ良くなりました。グラフ左〜中央あたりでは猛烈に勝っていますが、最終的には負けています。

一方的に負けているわけではないので、何かしらのフィルタを入れれば最終的には勝てそうです。

トレンドフィルタを導入

こんなフィルタを考えてみました。トレンドに逆らわない戦略です。

  • 長期(56期間)TMAが上向きなら買いのみ
  • 長期(56期間)TMAが下向きなら売りのみ

バックテスト結果

トレード回数が激減している上に結果は良くなっていないという、ダメフィルターの典型となりました。

フィルター

EMAによるトレンドフィルタを導入

今度はこんなフィルタです。同じくトレンドに逆らわない戦略ですが、EMAを使っています。

  • 中期(21期間)EMAが上向きなら買いのみ
  • 中期(21期間)EMAが下向きなら売りのみ

バックテスト結果

今度もダメですね。

EMA

ちなみに期間を変えたり、SMAでも試してみましたがダメでした。

他に考えている戦略

あと考えられるものとしては、、

  • RSIやCCIなどのオシレータ系インジケータを入れて、買われすぎのときのみ売りを仕掛ける
  • ボリンジャーバンドなど他のバンドを入れて、2つともバンドを出ている場合に仕掛ける

などでしょうか。。。時間があったら試してみます。

※ちなみに建値決済とトレーリングストップは入れても改善しませんでした

アイデア募集

どなたか、この戦略を改善させる方法を思いついた方は、ぜひ本ブログの「 お問い合わせ」またはTwitterまでご意見を下さい。

見事に右肩上がりとなる戦略をくださいましたら、このEAをプレゼントさせていただきます!