今回は国内外とても人気の高いインジケーターQQEをストラテジー化して、使い続けると本当に勝てるのか?というのをグラフ化して検証してみました。
実際に使ったオリジナルQQEインジケーターも無料でダウンロードできるので、ぜひ参考にしてくださいね!
QQEって?
QQE(Quantitative Qualitative Estimation)とは、RSIをベースにノイズを減らして売買シグナルを分かりやすくしたテクニカル指標。
RSIよりも滑らかに動くためトレンドの方向性を把握しやすく、主にラインのクロスを利用して買い・売りのタイミングを判断します。
QQEとRSIの違い

- RSI:買われすぎ・売られすぎを判断するための指標
- QQE:RSIのノイズを減らし、トレンドや売買タイミングを見やすくした指標
簡単に言うと、RSIは「相場の勢い」を見るための指標、QQEは「トレンドの方向やエントリータイミング」を判断しやすくした指標です。
QQEを検証
検証条件は利益によってロット数を増やしたりせず、毎回同じ数量。
そして取引手数料は片道0.03%計算です。
ザックリ
XAUUSD 4,500ドル × 0.03% = 片道 1.35ドル/oz
EURUSD 1.08ドル × 0.03% = 片道 0.000324ドル/unit
NAS100 20,000ドル × 0.03% = 片道 6ドル/枚
です。
GOLD
5分足

コチラがGoldの5分足QQEの検証結果。冗談か?ってぐらい右肩下がり。
とてもじゃないですが使い物になりませんね。
15分足

15分の足も微妙。ジグザグですが結果マイナスになっていますし使う価値はありません。
1時間足

1時間足の結果がこちら。なんと大幅プラスという結果に。キレイな右肩上がりではないので、トレンドがキレイな時にプラスになるけどそれ以外はジグザグという感じですね。
4時間足

コチラが4時間足。長い期間マイナスでしたが、2025年から一気に大幅プラスに。
大幅プラスが始まったあたりを確認してみると、大きなと上昇トレンドだったことがわかります。
1日足

一番驚異的だったのが1日足。とても理想的な1右肩上がりになっています。

これは純粋にGOLDの1日足がキレイな右肩上がりになっていたため。
トレンドの波を捉えるQQEにはまさに理想の展開と言えますね。
ただ1日足となるとかなり長期的な視点が必要。株においても通貨などにしても「これは将来的に上がるだろうなと自信のあるものであればトレンドの波を捉えることができると思います。
そんな場合は「買いだけ」に絞るのもいいかもしれませんね。
BTC(ビットコイン)で検証
5分足

マイナスだらけ。動きが大きくて短い足の通貨は不安定でしかありませんね。
15分足

15分足も結果は悪いですね。レンジ期間中はマイナス続きになっています。
1時間足

1時間足は基本的にマイナス推移。時々トレンドが出た時にプラスに転じるけど、決していい結果とは言えません。
4時間足

4時間足も、計測段階では一応プラス。しかし、マイナスのふり幅とプラスのふり幅が同じぐらいなので良くはないですね。
1日足

1日足は、2025年あたりまでは大幅プラスでした。
しかし、2025年ぐらいから日足レベルの大きなレンジで大幅損失。
結果マイナスまで下がっていますね。こちらも続ける価値はなさそう。
QQEが成績の良かった通貨と足を紹介
あくまで私が検証した期間内ですが、成績の良かった通貨、時間足を紹介します。
検証は特に取引量の多い
- EUR/USD
- USD/JPY
- GBP/USD
- AUD/USD
- USD/CAD
で行っています。
EUR/USD 4時間足

4時間足も比較的理想な右肩上がりですね。時間足が大きければ大きいほど張り付く必要がないので楽。
プラスUSDがやたら低いのは、数量を「1」という単位で検証しているからです。
AUD/USD 週足

一週間足なのでかなり大きな単位。一週間に一度の確認なのでかなりゆったりな取引ですね。
こちらも2013年頃から一気にプラスに。
今回検証に使ったQQEインジケーター
今回検証に使ったオリジナルインジケーターは、
QQE Trend Strategy [Long/Short] という名前で無料公開しています。

もし英語が得意でない方は、下のコードを使うと日本語になっているので使いやすいと思います。
//@version=5
strategy("QQE オリジナル戦略",
shorttitle = "QQE-STR",
overlay = false,
margin_long = 100,
margin_short = 100,
default_qty_type = strategy.fixed,
default_qty_value = 1,
commission_type = strategy.commission.percent,
commission_value = 0.03, // 片道 0.03% | 銘柄に応じてPropertiesから変更可
slippage = 1) // 1ティック | スキャル時は2〜3に上げても可
// ═══════════════════════════════════════════════════════════
// ◆ INPUTS
// ═══════════════════════════════════════════════════════════
g1 = "◆ QQE 設定"
rsiLen = input.int (14, "RSI 期間", minval=2, group=g1)
rsiSmooth = input.int (5, "平滑化 EMA 期間", minval=1, group=g1)
fastFactor = input.float(2.618, "Fast バンド係数", minval=0.1, step=0.001, group=g1)
slowFactor = input.float(4.236, "Slow バンド係数", minval=0.1, step=0.001, group=g1)
g2 = "◆ ストラテジー設定"
sigMode = input.string("Slow", "シグナルバンド",
options=["Fast","Slow"], group=g2,
tooltip="Slow=精度重視 / Fast=反応速度重視")
use50Filter = input.bool (true, "50 ライン方向フィルター",
group=g2, tooltip="ONにすると 50ライン超=ロング・50ライン以下=ショートのみ許可")
tradeDir = input.string("Both", "売買方向",
options=["Both","Long Only","Short Only"], group=g2)
qtyFixed = input.float (1.0, "数量 (oz / 枚数)", minval=0.01, step=0.01, group=g2)
useStopLoss = input.bool (false, "ストップロス使用", group=g2)
stopLossPct = input.float (1.0, "SL (%)",
minval=0.1, step=0.1, group=g2,
tooltip="エントリー価格からの距離 (例: 1.0 = 1%)")
g3 = "◆ 表示設定"
showFastBand = input.bool(true, "Fast バンド表示", group=g3)
showSlowBand = input.bool(true, "Slow バンド表示", group=g3)
showHist = input.bool(true, "ヒストグラム表示", group=g3)
showBgColor = input.bool(true, "背景色表示", group=g3)
showBarColor = input.bool(false, "バーカラー変更", group=g3,
tooltip="メインチャートのローソク足を上昇/下降でカラーリング")
showSignals = input.bool(true, "シグナルマーク表示", group=g3)
// ═══════════════════════════════════════════════════════════
// ◆ QQE 計算関数
// RSI → EMA平滑化 → ATRスムージング → トレーリングバンド
// ═══════════════════════════════════════════════════════════
qqeCalc(int rsiPeriod, int sf, float factor) =>
// Step 1: RSI → スムーズ化(QQEライン)
rsi = ta.rsi(close, rsiPeriod)
qqeL = ta.ema(rsi, sf)
// Step 2: ATRスムージング(ダブルEMA)でバンド幅を算出
wp = sf * 2 - 1
dar = ta.ema(ta.ema(math.abs(qqeL - qqeL[1]), wp), wp) * factor
// Step 3: トレーリングバンド(ラチェット式)
var float lb = na // Long Band (サポート:上昇トレンド時に有効)
var float sb = na // Short Band (レジスタンス:下降トレンド時に有効)
var int tr = 1 // トレンド方向: 1=上昇, -1=下降
// Long Band: QQEラインの下でラチェット上昇
lb := qqeL > nz(lb, qqeL - dar)
? math.max(nz(lb, qqeL - dar), qqeL - dar)
: qqeL - dar
// Short Band: QQEラインの上でラチェット下降
sb := qqeL < nz(sb, qqeL + dar)
? math.min(nz(sb, qqeL + dar), qqeL + dar)
: qqeL + dar
// Step 4: バンドとのクロスでトレンド転換を検出
tr := ta.crossover (qqeL, sb[1]) ? 1 : // Short Band 上抜け → 上昇転換
ta.crossunder(qqeL, lb[1]) ? -1 : // Long Band 下抜け → 下降転換
nz(tr, 1)
// アクティブなバンドを返す(上昇: LB / 下降: SB)
band = tr == 1 ? lb : sb
[qqeL, band, tr]
// ─── 2系統のQQEを計算 ────────────────────────────
[fLine, fBand, fTrend] = qqeCalc(rsiLen, rsiSmooth, fastFactor)
[sLine, sBand, sTrend] = qqeCalc(rsiLen, rsiSmooth, slowFactor)
// ═══════════════════════════════════════════════════════════
// ◆ シグナル生成
// ═══════════════════════════════════════════════════════════
// どちらのバンドのトレンド転換をシグナルに使うか
activeTrend = sigMode == "Fast" ? fTrend : sTrend
// トレンド転換をエントリーシグナルに
rawBuy = activeTrend == 1 and activeTrend[1] == -1
rawSell = activeTrend == -1 and activeTrend[1] == 1
// 50ライン方向フィルター
f50Buy = use50Filter ? fLine > 50 : true
f50Sell = use50Filter ? fLine < 50 : true
buySignal = rawBuy and f50Buy and tradeDir != "Short Only"
sellSignal = rawSell and f50Sell and tradeDir != "Long Only"
// ═══════════════════════════════════════════════════════════
// ◆ ストラテジー実行
// ═══════════════════════════════════════════════════════════
if buySignal
strategy.entry("Long", strategy.long, qty=qtyFixed)
if sellSignal
strategy.entry("Short", strategy.short, qty=qtyFixed)
// ストップロス(ポジション保有中に常に更新)
if useStopLoss
if strategy.position_size > 0
strategy.exit("SL-Long", from_entry="Long",
stop = strategy.position_avg_price * (1 - stopLossPct / 100))
if strategy.position_size < 0
strategy.exit("SL-Short", from_entry="Short",
stop = strategy.position_avg_price * (1 + stopLossPct / 100))
// ═══════════════════════════════════════════════════════════
// ◆ プロット
// ═══════════════════════════════════════════════════════════
// ── 基準ライン ───────────────────────────────────
hline(50, "Mid (50)", color=color.new(color.gray, 40), linestyle=hline.style_dashed)
hline(70, "OB (70)", color=color.new(color.red, 70), linestyle=hline.style_dotted)
hline(30, "OS (30)", color=color.new(color.lime, 70), linestyle=hline.style_dotted)
// ── ヒストグラム(QQEライン - 50)───────────────
histVal = fLine - 50
histCol = fLine >= 50 ? color.new(color.teal, 50) : color.new(color.red, 50)
plot(showHist ? histVal : na, "Histogram",
style=plot.style_histogram, color=histCol, linewidth=3)
// ── QQEライン ────────────────────────────────────
plot(fLine, "QQE Line",
color=color.new(color.purple, 0), linewidth=2)
// ── Fast バンド(上昇=緑、下降=赤)─────────────
fBandCol = fTrend == 1 ? color.new(color.lime, 10)
: color.new(color.red, 10)
plot(showFastBand ? fBand : na, "Fast Band",
color=fBandCol, linewidth=1, style=plot.style_stepline)
// ── Slow バンド(上昇=teal、下降=orange)────────
sBandCol = sTrend == 1 ? color.new(color.teal, 10)
: color.new(color.orange, 10)
plot(showSlowBand ? sBand : na, "Slow Band",
color=sBandCol, linewidth=1, style=plot.style_stepline)
// ── シグナルマーク ────────────────────────────────
plotshape(showSignals and buySignal, "BUY Signal",
shape.triangleup, location.bottom,
color.new(color.lime, 0), size=size.small)
plotshape(showSignals and sellSignal, "SELL Signal",
shape.triangledown, location.top,
color.new(color.red, 0), size=size.small)
// ── 背景色(アクティブトレンド方向)────────────
bgUpColor = showBgColor and activeTrend == 1 ? color.new(color.teal, 90) : na
bgDownColor = showBgColor and activeTrend == -1 ? color.new(color.red, 90) : na
bgcolor(bgUpColor, title="上昇背景")
bgcolor(bgDownColor, title="下降背景")
// ── バーカラー(メインチャートのローソク足)─────
barCol = showBarColor ? (fTrend == 1 ? color.new(color.teal, 30) : color.new(color.red, 30)) : na
barcolor(barCol, title="バーカラー")
// ═══════════════════════════════════════════════════════════
// ◆ アラート条件
// ═══════════════════════════════════════════════════════════
alertcondition(buySignal,
"QQE BUY Signal",
"QQE-STR: BUY シグナル | {{ticker}} {{interval}}")
alertcondition(sellSignal,
"QQE SELL Signal",
"QQE-STR: SELL シグナル | {{ticker}} {{interval}}")
alertcondition(buySignal or sellSignal,
"QQE Any Signal",
"QQE-STR: シグナル | {{ticker}} {{interval}}")
緑△でトレンド切り替えのBUYサイン。赤▽でSELLサインです。
平均線とヒストグラムを載せてあり、1から作ってあるのでオリジナルです。
ストラテジーの買い、売りの量は一定。
アラートに対応しているので、 各種検証などにも使いください。
今回の検証はあくまで検証時に成績の良かったものを紹介しています。
FX取引している人なら分かると思いますが、必ずしも今後の結果が保証されるものではないということをご理解ください。


コメント