MT4 EAトレードネタ:ボリンジャーバンドの収縮後のブレイクアウトロジックでトレード
期間設定を長めにしたBB(ボリンジャーバンド)が収縮した後の、バンドブレイクアウトを利用したトレード方法を検討、検証し、稼いでくれる(はずの)EAを作成しました。
相場(通貨の価格)が長い間停滞した後、急に動き出すと、急激に価格が上昇(または下降)することがあります。
そのFXの特性を狙ったエントリー方法です。
BB(ボリンジャーバンド)使って、相場が停滞していることを検出(バンドが収縮したことで検出)し、そのバンドをブレークしたタイミングで、その方向にポジション(買いまたは売りポジション)を持ちます。
BBの期間設定は一般的な20や21よりかなり長めで、60~150とかに設定するとかなり有効です。
いろいろバックテストしていたところ、この事実に気付きました!
結構、自動売買(システムトレード)のネタとして使えそうです!!
15分足で検証しています。
(1)トレードプログラム(EA)のロジック
BBが収縮した後、その収縮したBBのバンドをローソク足が抜けたタイミングで、買いポジションまたは売りポジションを持ちます。
その際、決済指値、決済逆指値も設定しておきます。
チャートで示すと以下のような感じです。
青三角(>)のタイミングでエントリーし、点線の間ポジションを保持し、青三角(<)でポジションを閉じています。
BBを抜けた後、上昇していることがわかると思います。
以下はこのトレードプログラム(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を作成し、検証を行いました。
(3)バックテストでの検証
#バックテスト結果
MT4のストラテジーテスタで、2007/1/1~2019/6/30までのおよそ12年間の過去の相場データで、バックテストしパラメータを調整した結果です。
※後述している簡易フォワードテストもやりたかったので、2019/6/30までにしています
15分足で検証しています。
以下、通貨はGBPJPYでバックテストした結果です。
1万通貨固定の約13年の運用(1ポジションのみ、複利運用なし、スプレッド20)、総取引数は1849で、純利益は18577ドル、プロフィットファクタは1.44、勝率39.53%の結果となりました。
基本的にトレンドフォロー型で、損小利大のリスクリワードを高くするタイプのEAになるので、劇的な勝率、プロフィットファクタではありませんが、利益はだいぶ積み上げられているかと思います。
いろいろEAを作成し、バックテストし、実際に運用でも使っている感じでは、取引数が多くて結果が出ていることが重要だと感じており、こういうタイプの方が実運用では活躍してくれると感じています。
(シンプルなロジックで、再現性が高いことが重要!!)
#簡易フォワードテスト
バックテストの結果(期待値)が今後も続きそうかを検証するため、簡易フォワードテストもやってみました。
以下が、その結果です。
2019/7/1~2020/10/30まで運用した場合の見込みです。
純利益 1592ドル、プロフィットファクタ 1.34、勝率41%です。
仮に、1万通貨で、2019/07/01~2020/10/30まで運用していたとしたら、約16万もプラスにできているので、結構な成績ではないでしょうか。
実運用だと大きく相場が動いたときに、スプレッドが広がったりなど、この通りには行かなかった可能性もありますが、プラスにはできたのではないかと思います。
#他の通貨ペアでの検証結果
他の通貨ペアで検証した結果は以下になります。
バックテストには若干劣る部分もありますが、いずれも簡易フォワードテストがプラスになっています。
これは、今までの作成したEAの中でも、かなり良い結果です!
期待高いです!!
#複利運用のバックテストをしてみる
2013/01には1億円を超えるシミュレーション結果になってます。
(2000/01/01~2020/10/30の期間で、分かりやすく、円表示でシミュレーションしています。)
2007.01月、10万円で開始
2007.12月、100万円越え
2010.02月、1000万円越え
2013.01月、1億円越え(※1ポジションの上限の関係上、複利運用は2500万くらいまで)
あくまでもバックテストなので、ここまでは難しいとは思いますが、夢は膨らみますね(笑)
#本格フォワードテスト(デモトレードでのフォワードテスト)
“GoGoJungle“さんで、デモ口座を使って、本EA(名付けて「BB break M15」)のフォワードテストを実施頂いています。
今のところ(20/11/29現在)、結構いい結果が出ています!!
もし、自分で作るのも面倒くさいし、私が作ったものを使ってみたい、と思ってもらえるようであれば、利用してもらえたら嬉しいです!!
「(4)他の通貨ペアでの検証結果」で検証した通貨ペアはすべて使用可能にしています。
コメント