【検証】YouTubeで話題のBB+RSI(2)戦略、EURUSDじゃなくてBTCで使え!2年間251トレードの真実
YouTubeのBB+RSI(2)戦略、本当の使い方はBTCだった
😤 きっかけはYouTube
YouTubeでこんな戦略が紹介されていた。
📺 参考動画: BB+RSI(2)逆張り戦略
【戦略ルール】時間足: 30分足通貨ペア: EURUSD(と紹介されていた)
エントリー条件(ロング):1. BB下限(-2σ) > 100SMA(上昇トレンド中)2. 価格がBB下限(-2σ)にタッチ3. RSI(2) ≤ 5
利確: BB上限(+2σ)に到達損切り: 終値が100SMAを下回る「売られすぎからの反発を狙う」シンプルな逆張り戦略。
本当に勝てるのか? 検証してみた。
📊 まずEURUSDで検証(2025年1月〜)
Pythonバックテスト結果
| 条件 | 累計pips | PF |
|---|---|---|
| 楽観的(シグナル足終値エントリー) | +403.3 | 1.58 |
| 現実的(次足始値エントリー) | +367.9 | 1.51 |
| 悲観的(SL優先評価) | +347.7 | 1.47 |
| スプレッド1pip込み | +259.7 | 1.33 |
厳しく見積もっても**+259pips、PF1.33**。
「お、意外と使えるじゃん」と思った。
😱 30通貨ペアで検証したら...
MT5のストラテジーテスターで30通貨ペア × 2年間を一気に検証。
衝撃の結果
| 通貨ペア | 損益 | PF | 判定 |
|---|---|---|---|
| BTCJPYm | +1,901.63 | 1.31 | ⭕ 最強 |
| USDCADm | +279.24 | 1.39 | ⭕ |
| EURUSDm | +181.71 | 1.17 | △ |
| CADJPYm | +56.16 | 1.04 | △ |
| XAUUSDm | -457.29 | 0.94 | ❌ |
| GBPJPYm | -1,475.81 | 0.45 | ❌ |
| GBPNZDm | -1,555.69 | 0.41 | ❌ |
| ...他24ペア | 全部マイナス | - | ❌ |
30通貨ペア中、プラスはたった4つ!
しかもBTCJPYが圧倒的。EURUSDの10倍以上の利益。
🏆 BTCJPYの2年間バックテスト結果
検証条件
| 項目 | 設定 |
|---|---|
| EA | BB_RSI2_Strategy |
| 通貨ペア | BTCJPYm |
| 時間足 | M30(30分足) |
| 期間 | 2023.01.01 〜 2025.12.20 |
| 初期資金 | 1,000,000 USD |
| モデル | 1分足OHLC |
結果詳細
| 指標 | 結果 |
|---|---|
| 総損益 | +1,901.63 |
| PF | 1.31 |
| 期待利得 | 7.58 |
| シャープレシオ | 3.18 |
| リカバリファクター | 2.54 |
| 取引数 | 251 |
| 勝ちトレード | 121 (48.21%) |
| 負けトレード | 130 (51.79%) |
| 最大勝ちトレード | 287.42 |
| 最大負けトレード | -283.37 |
| 最大ドローダウン | 0.06% (616.58) |
資産曲線
綺麗な右肩上がり! 特に2024年後半からの伸びが顕著。
💡 なぜBTCで効くのか
EURUSDとBTCの違い
【EURUSD】- ボラティリティ: 低〜中- 動き方: 緩やか、レンジが多い- RSI(2)≤5: あまり発生しない- 発生しても反発が弱い
【BTCJPY】- ボラティリティ: 高- 動き方: 急落・急騰が多い- RSI(2)≤5: 急落時に頻発- 急落後のV字回復が多いこの戦略の本質
BB + RSI(2) = 「急落後の反発」を狙う
条件:- BB下限 > 100SMA → 上昇トレンド中- 価格がBB下限タッチ → 一時的な急落- RSI(2)≤5 → 極端な売られすぎ
→ 「上昇トレンド中の押し目買い」→ BTCの急落後V字回復にピッタリ🔧 EA(MT5用)完全公開
以下のEAをMT5のExpertsフォルダに保存してコンパイルすれば使えます。
ソースコード
//+------------------------------------------------------------------+//| BB_RSI2_EURUSD_M30.mq5 |//| BB + RSI(2) Strategy EA |//| |//| 戦略ルール: |//| - エントリー条件(ロング): |//| 1. BB下限(-2σ) > 100SMA |//| 2. 価格が-2σにタッチ(安値が-2σ以下) |//| 3. RSI(2) ≤ 5 |//| - 利確: BB上限(+2σ)に到達 |//| - 損切り: 終値が100SMAを下回る |//+------------------------------------------------------------------+#property copyright "BB RSI2 Strategy"#property link ""#property version "1.00"#property strict
#include <Trade\Trade.mqh>
//--- Input parametersinput group "=== 基本設定 ==="input double LotSize = 0.1; // ロットサイズinput int MagicNumber = 20251227; // マジックナンバーinput string TradeComment = "BB_RSI2"; // コメント
input group "=== インジケーター設定 ==="input int SMA_Period = 100; // SMA期間input int BB_Period = 20; // ボリンジャーバンド期間input double BB_Deviation = 2.0; // ボリンジャーバンド偏差input int RSI_Period = 2; // RSI期間input double RSI_Threshold = 5.0; // RSIしきい値
input group "=== 時間設定 ==="input int MaxBarsHold = 100; // 最大保有本数
//--- Global variablesCTrade trade;int handleSMA;int handleBB;int handleRSI;
datetime lastBarTime = 0;datetime entryBarTime = 0;int barsHeld = 0;
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+int OnInit(){ // インジケーターハンドル作成 handleSMA = iMA(_Symbol, PERIOD_CURRENT, SMA_Period, 0, MODE_SMA, PRICE_CLOSE); handleBB = iBands(_Symbol, PERIOD_CURRENT, BB_Period, 0, BB_Deviation, PRICE_CLOSE); handleRSI = iRSI(_Symbol, PERIOD_CURRENT, RSI_Period, PRICE_CLOSE);
if(handleSMA == INVALID_HANDLE || handleBB == INVALID_HANDLE || handleRSI == INVALID_HANDLE) { Print("インジケーター作成失敗"); return INIT_FAILED; }
// Trade設定 trade.SetExpertMagicNumber(MagicNumber); trade.SetDeviationInPoints(10); trade.SetTypeFilling(ORDER_FILLING_IOC);
Print("BB + RSI(2) EA 初期化完了"); Print("SMA期間: ", SMA_Period); Print("BB期間: ", BB_Period, " 偏差: ", BB_Deviation); Print("RSI期間: ", RSI_Period, " しきい値: ", RSI_Threshold);
return INIT_SUCCEEDED;}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+void OnDeinit(const int reason){ if(handleSMA != INVALID_HANDLE) IndicatorRelease(handleSMA); if(handleBB != INVALID_HANDLE) IndicatorRelease(handleBB); if(handleRSI != INVALID_HANDLE) IndicatorRelease(handleRSI);
Print("BB + RSI(2) EA 終了");}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+void OnTick(){ // 新しいバーでのみ処理 datetime currentBarTime = iTime(_Symbol, PERIOD_CURRENT, 0); if(currentBarTime == lastBarTime) return; lastBarTime = currentBarTime;
// インジケーター値取得 double sma[], bbUpper[], bbMiddle[], bbLower[], rsi[];
if(CopyBuffer(handleSMA, 0, 1, 1, sma) <= 0) return; if(CopyBuffer(handleBB, 0, 1, 1, bbMiddle) <= 0) return; if(CopyBuffer(handleBB, 1, 1, 1, bbUpper) <= 0) return; if(CopyBuffer(handleBB, 2, 1, 1, bbLower) <= 0) return; if(CopyBuffer(handleRSI, 0, 1, 1, rsi) <= 0) return;
// 前のバーの価格 double prevLow = iLow(_Symbol, PERIOD_CURRENT, 1); double prevClose = iClose(_Symbol, PERIOD_CURRENT, 1);
// ポジションチェック bool hasPosition = HasPosition();
if(hasPosition) { barsHeld++; CheckExitConditions(sma[0], bbUpper[0]); } else { CheckEntryConditions(sma[0], bbLower[0], bbUpper[0], rsi[0], prevLow); }}
//+------------------------------------------------------------------+//| エントリー条件チェック |//+------------------------------------------------------------------+void CheckEntryConditions(double sma, double bbLower, double bbUpper, double rsi, double prevLow){ // 条件1: BB下限 > 100SMA(上昇トレンド中) if(bbLower <= sma) return;
// 条件2: 価格が-2σにタッチ if(prevLow > bbLower) return;
// 条件3: RSI(2) ≤ 5 if(rsi > RSI_Threshold) return;
// 全条件満たした → エントリー double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
if(trade.Buy(LotSize, _Symbol, ask, 0, 0, TradeComment)) { Print("買いエントリー: ", ask); Print(" BB下限: ", bbLower, " > SMA: ", sma); Print(" RSI: ", rsi); Print(" TP目標(BB上限): ", bbUpper);
entryBarTime = iTime(_Symbol, PERIOD_CURRENT, 0); barsHeld = 0; } else { Print("エントリー失敗: ", GetLastError()); }}
//+------------------------------------------------------------------+//| 決済条件チェック |//+------------------------------------------------------------------+void CheckExitConditions(double sma, double bbUpper){ double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); double prevClose = iClose(_Symbol, PERIOD_CURRENT, 1); double prevHigh = iHigh(_Symbol, PERIOD_CURRENT, 1);
string exitReason = ""; bool shouldExit = false;
// 条件1: TP - 高値がBB上限に到達 if(prevHigh >= bbUpper) { exitReason = "TP (BB上限到達)"; shouldExit = true; } // 条件2: SL - 終値が100SMAを下回る else if(prevClose < sma) { exitReason = "SL (100SMA下抜け)"; shouldExit = true; } // 条件3: タイムアウト else if(barsHeld >= MaxBarsHold) { exitReason = "TIMEOUT"; shouldExit = true; }
if(shouldExit) { CloseAllPositions(exitReason); }}
//+------------------------------------------------------------------+//| ポジション有無チェック |//+------------------------------------------------------------------+bool HasPosition(){ for(int i = PositionsTotal() - 1; i >= 0; i--) { ulong ticket = PositionGetTicket(i); if(ticket > 0) { if(PositionGetString(POSITION_SYMBOL) == _Symbol && PositionGetInteger(POSITION_MAGIC) == MagicNumber) { return true; } } } return false;}
//+------------------------------------------------------------------+//| 全ポジション決済 |//+------------------------------------------------------------------+void CloseAllPositions(string reason){ for(int i = PositionsTotal() - 1; i >= 0; i--) { ulong ticket = PositionGetTicket(i); if(ticket > 0) { if(PositionGetString(POSITION_SYMBOL) == _Symbol && PositionGetInteger(POSITION_MAGIC) == MagicNumber) { double profit = PositionGetDouble(POSITION_PROFIT);
if(trade.PositionClose(ticket)) { Print("決済: ", reason); Print(" 利益: ", profit); Print(" 保有バー数: ", barsHeld); } else { Print("決済失敗: ", GetLastError()); } } } }}//+------------------------------------------------------------------+使い方
- 上記コードを
BB_RSI2_BTCJPY.mq5として保存 - MT5のExpertsフォルダに配置
- コンパイル
- BTCJPYの30分足チャートにドラッグ
⚠️ 注意点
この戦略が有効な条件
⭕ 有効:- BTCJPY(最強)- USDCAD(まあまあ)- 上昇トレンド中
❌ 無効:- ほぼ全てのFX通貨ペア- ゴールド(XAUUSD)- クロス円全般リスク管理
- 勝率は48%程度(負けの方が多い)
- 利益は「勝ちトレードの大きさ」で稼ぐ
- 最大ドローダウンは小さい(0.06%)が、連敗はある
🎯 結論
YouTubeの戦略、正しい使い方
| 項目 | YouTubeの紹介 | 検証結果 |
|---|---|---|
| 通貨ペア | EURUSD | BTCJPY |
| 期待利得 | 不明 | 7.58 |
| PF | 不明 | 1.31 |
| 判定 | - | BTC専用戦略 |
最終結論
【答え】
BB + RSI(2)戦略は「BTC用」だった。
理由:1. 30通貨ペア中、プラスは4つだけ2. BTCJPYが圧倒的に好成績3. ボラティリティの高い急落後反発に最適化された戦略4. FX通貨ペアには向いていない
YouTubeでEURUSD用として紹介されていたが、本当の使い方はBTCだった。📚 検証の経緯まとめ
- YouTubeで戦略を発見
- Pythonで2025年のEURUSDを検証 → +259pips、PF1.33で「使える」と判断
- MT5で30通貨ペア×2年間を検証 → ほぼ全滅
- BTCJPYだけが突出して好成績 → 本当の用途が判明
- EA化して公開
「紹介された通貨ペアが正解とは限らない」 という教訓。
検証大事。
📺 参考動画: BB+RSI(2)逆張り戦略
🎁おすすめツール・サービス
※上記リンクにはプロモーション(広告)が含まれています
量子相場謀略|ホソノP
ブログでは書けない本音のトレード戦略とEA開発の裏側を公開。 データに基づいた検証で、再現性のある手法だけをお届けします。