
この戦略は,マルチタイムフレーム分析に基づく定量取引システムで,主にMACD指標,RSI指標,VWAP平均線,ATR波動率フィルターの30分と1時間の時間フレーム上の総合信号を使用して取引を実行する.この戦略は,多引と空引の両方をサポートし,異なる時間フレームの技術指標の交差信号によって確認され,取引品質を向上させるために波動率条件のフィルタリングと組み合わせます.この戦略は,固定パーセントのストップ・ローズメカニズムを内蔵し,技術指標が逆転したときに取引を終了します.
この戦略の核となる原則は,多重条件確認による低品質信号のフィルタリングであり,主に以下のいくつかの重要な構成要素を含んでいる.
マルチタイムフレームMACD交差信号:
RSIは過買過売のフィルター:
VWAPの価格位置が確認されました.:
波動率フィルター:
多層退出メカニズム:
この多層の条件のフィルタリングと確認により,戦略は明確な方向性を持つ中短期の波動を捕捉し,低品質の信号をフィルタリングし,勝率と損益率を向上させることを目的としています.
複数時間枠確認: 30分と1時間の時間枠を組み合わせたシグナルにより,戦略は真のトレンドをよりよく認識し,偽のシグナルの影響を減らすことができます. 特に,1時間のMACDトレンド確認機能は,反転トレンドの取引を避けるのに役立ちます.
変動率の適応性ATRの波動率フィルターは,市場が十分な動力がある場合にのみ策略が入場することを保証し,低波動区間の内での取引を避けるため,死区震のリスクを効果的に軽減します.
フレキシブルな退出方法戦略には,固定ストップ・ロスのほか,指数反転に基づくダイナミック・エクジット・メカニズムも含まれています.これは,価格がストップに達していないが,市場が反転し始めているときに,タイムリーで出場して利益を保護することを可能にします.
双重価格位置確認: 価格が2つのタイムフレームVWAPの上方 ((多行) または下方 ((空行) を同時に要求する.これは,価格の動きと方向をさらに確認し,偽突破を減らす.
リスク管理の内蔵戦略には,ストップ・ロスの仕組みとポジション管理が組み込まれています (デフォルトでは,取引ごとに5%の口座利息を使用します) これは,取引毎のリスク・エッジを制御し,資本を保護するのに役立ちます.
低勝利率の挑戦: コード注釈に記載されているように,戦略は勝率偏差の問題に直面する可能性がある.これは,多重条件のフィルタリングが信号品質を向上させる一方で,取引頻度を著しく減少させ,サンプル量が小さく,統計的意味が制限されるためである.
パラメータ感度戦略は,MACD長さ,RSI値,ATRフィルターパラメータなど,複数の調整可能なパラメータを使用しています.これらのパラメータの微小な変更は,戦略のパフォーマンスに顕著な影響を及ぼし,過度に最適化のリスクがあります.
固定パーセンテージストップ損失の限界:すべての市場環境に対して同じストップ ((1.5%) とストップ ((0.5%) の比率を使用し,異なる波動率の環境に適応できないかもしれない.高い波動の市場では,ストップは過度に緊密なかもしれない.低波動の市場では,ストップは過度に長いかもしれない.
複数の時間枠の遅延:より長い時間枠 ((例えば1時間) を使った信号は,確認として遅延を導入し,入場機会を逃すか退場を遅らせる可能性があります.
市場環境への適応能力の欠如: 戦略には,異なる市場環境 ((トレンド/振動) を区別する仕組みが含まれておらず,特定の市場条件下では不良な結果が出る可能性があります.
解決策は
ダイナミック・ストップ・ストラスト・最適化: 固定パーセントのストップ・ロスをATRに基づく動的値に変更する.例えば,1.5×ATRをストップとして,3×ATRをストップとして使用する.こうすることで,戦略が異なる市場変動環境により適した状態に適応し,高い波動期にはより緩やかなストップを提供し,低い波動期にはストップ・ターゲットを締めることができる.
市場環境の分類:市場環境識別機構を導入し,トレンド市場と振動市場を区別する. ADX,ブリン帯域または価格と長期移動平均の関係を使用して市場の状態を識別し,それに応じて戦略パラメータを調整するか,または取引論理を完全に切り替えることができます.
入場時間の最適化: 現在の戦略 MACD交差で発生した現在のK線入場は,滑り点または実行遅延に直面する可能性があります.交差が確認された後の次のK線開場時に入場を考慮するか,特定の価格領域で入場を制限する価格を設定して,より良い実行価格を得る.
タイムフィルター:取引時間フィルターを追加し,特定の低効率の取引時間を回避する.例えば,アジア時間帯の尾行またはヨーロッパ・アメリカ交差時間などの流動性が低いまたは不規則な取引を避ける.
値のパラメータは自律的に:MACD,RSI,ATRのパラメータを,最近の市場の変動または周期的な自動調整に基づいて,自己適応値として設計する.例えば,高波動の市場でより短いMACDパラメータを使用し,低波動の市場でより長いパラメータを使用する.
信号の強度階層:入場信号のための強度評価システムを構築し,複数の要因 (MACD柱体サイズ,RSI偏差度,VWAP距離など) に基づいて信号にスコアを付け,強度が特定の値を超えた取引のみを実行するか,信号強度動向に応じてポジションサイズを調整する.
機械学習の強化: 機械学習モデルを導入して,どのシグナルが利益をもたらす可能性が高いかを予測し,歴史データ訓練モデルに基づいて最も価値のあるパターン組み合わせを識別します. これは,戦略の適応性と勝利率を向上させることができます.
これらの最適化方向は,戦略の安定性,適応性,長期的なパフォーマンスを向上させ,その核心的な論理を保持することを目的としています. これらの改善によって,戦略は,異なる市場環境と条件の変化により良く対応することができます.
マルチタイムフレーム MACD-RSIクロス波動率過量化取引戦略は,複数の技術指標と複数のタイムフレームのシグナルを組み合わせて高品質の取引機会を識別するために設計された包括的な取引システムである. この戦略の核心的な優位性は,多層のシグナル確認機構と内蔵されたリスク管理機能により,価格の波動を捉えながらリスクを制御することができます.
低勝率の課題があるにもかかわらず,戦略は,平均利益取引の収益を向上させることで,正の期待値を維持している.推奨された最適化措置,特にダイナミックストップ・ストップ・損失,市場環境分類,信号強度等を実施することで,戦略の性能がさらに向上する見込みがある.
この戦略は,技術分析に基づく体系化された取引方法を求め,リスク管理を重視するトレーダーに特に適しています.戦略の多条件確認機構は,取引頻度を減らす一方で,取引毎の質を向上させています.これは”少なめは多”の取引哲学と一致し,質を重視し,数量ではなくです.
実用的には,トレーダーに最初にシミュレーション環境でこの戦略をテストし,特に各種の最適化措置の効果をテストし,その後それを慎重に実体取引に適用することをお勧めします. 同時に,市場条件の変化を継続的に監視し,適切なタイミングで戦略パラメータを調整することで,長期にわたって安定したパフォーマンスを維持するのに役立ちます.
/*backtest
start: 2025-01-01 00:00:00
end: 2025-06-08 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
// This Pine Script® code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © GentlemanOfTrading
//@version=6
strategy(title = "ETH Day Trader", overlay = true, margin_long = 100, margin_short = 100, default_qty_type = strategy.percent_of_equity, default_qty_value = 5)
// ==== 1) USER INPUTS ====
// MACD/RSI lengths
fastLen = input.int(12, title="MACD Fast EMA Length", minval=1)
slowLen = input.int(26, title="MACD Slow EMA Length", minval=1)
signalLen = input.int(9, title="MACD Signal EMA Length", minval=1)
rsiLen = input.int(14, title="RSI Length", minval=1)
// RSI thresholds
rsiThreshLong30 = input.int(55, title="RSI30m > (Long)", minval=1, maxval=100)
rsiThreshShort30= input.int(45, title="RSI30m < (Short)", minval=1, maxval=100)
rsiThresh1h = input.int(50, title="RSI1h Threshold", minval=1, maxval=100)
// ATR filter (30m)
atrLen = input.int(14, title="ATR Length (30m)", minval=1)
atrMaLen = input.int(20, title="ATR MA Length (30m)", minval=1)
// Take Profit / Stop Loss (percent)
tpPerc = input.float(1.5, title="Take Profit (%)", minval=0.1) / 100
slPerc = input.float(0.5, title="Stop Loss (%)", minval=0.1) / 100
// Toggle whether to use 1h trend confirmation
use1hTrend = input.bool(true, title="Use 1h MACD Trend Confirmation?")
// ==== 2) FETCH INDICATORS ON 30m ====
// We assume this script is applied on a chart ≤ 30m (e.g. 15m or 5m),
// but if you apply it on a 30m chart it still works: security() with "30" just returns the same bar.
[macd30m, macdSig30m, _] = ta.macd(close, fastLen, slowLen, signalLen)
rsi30m = ta.rsi(close, rsiLen)
atr30m = ta.atr(atrLen)
// ==== 3) FETCH INDICATORS ON 1h & VWAPs via request.security() ====
// --- 1h MACD & RSI ---
[macd1h, macdSig1h, _] = request.security(syminfo.tickerid, "60", ta.macd(close, fastLen, slowLen, signalLen), lookahead=barmerge.lookahead_off)
rsi1h = request.security(syminfo.tickerid, "60", ta.rsi(close, rsiLen), lookahead=barmerge.lookahead_off)
// --- 30m VWAP & 1h VWAP (session VWAP) ---
vwap30m = request.security(syminfo.tickerid, "30", ta.vwap(close), lookahead=barmerge.lookahead_off)
vwap1h = request.security(syminfo.tickerid, "60", ta.vwap(close), lookahead=barmerge.lookahead_off)
// ==== 4) BUILD VOLATILITY FILTER (30m ATR vs ATR MA) ====
atr30m_ma = ta.sma(atr30m, atrMaLen)
volatilityOK = atr30m >= atr30m_ma
// ==== 5) MULTI-TIMEFRAME CROSS CONDITIONS ====
// 30m MACD cross signals
longCross30m = ta.crossover(macd30m, macdSig30m)
shortCross30m = ta.crossunder(macd30m, macdSig30m)
// 1h MACD trend confirmation
macdTrendUp1h = macd1h > macdSig1h
macdTrendDown1h = macd1h < macdSig1h
// ==== 6) ENTRY & EXIT CONDITIONS ====
// LONG ENTRY:
// • 30m MACD crossover
// • 30m RSI > rsiThreshLong30
// • (optionally) 1h MACD line > 1h MACD signal
// • Price > 30m VWAP AND Price > 1h VWAP
// • 30m ATR ≥ 30m ATR MA (volatility filter)
longEntryCond =
longCross30m
and (rsi30m > rsiThreshLong30)
and (close > vwap30m)
and (close > vwap1h)
and volatilityOK
and (use1hTrend ? macdTrendUp1h : true)
// LONG EXIT:
// • fixed TP/SL
// OR • 30m MACD crossunder
// OR • 1h MACD falls below signal (trend flipped)
var float entryPriceLong = na
longExitCond = false
if (strategy.position_size > 0)
// Price-based TP / SL checks
entryPriceLong := nz(entryPriceLong[1], strategy.position_avg_price)
longTPprice = entryPriceLong * (1 + tpPerc)
longSLprice = entryPriceLong * (1 - slPerc)
// check TP/SL first
longExitTP = high >= longTPprice
longExitSL = low <= longSLprice
// fallback: MACD crossunder on 30m OR 1h trend flips
macdTrendFlip1h = macdTrendUp1h and (macd1h < macdSig1h)
macdCross30m = shortCross30m
longExitCond := longExitTP or longExitSL or macdCross30m or macdTrendFlip1h
else
entryPriceLong := na // reset when no position
// SHORT ENTRY:
// • 30m MACD crossunder
// • 30m RSI < rsiThreshShort30
// • (optionally) 1h MACD line < 1h MACD signal
// • Price < 30m VWAP AND Price < 1h VWAP
// • 30m ATR ≥ 30m ATR MA (volatility filter)
shortEntryCond =
shortCross30m
and (rsi30m < rsiThreshShort30)
and (close < vwap30m)
and (close < vwap1h)
and volatilityOK
and (use1hTrend ? macdTrendDown1h : true)
// SHORT EXIT:
// • fixed TP/SL
// OR • 30m MACD crossover
// OR • 1h MACD flips up
var float entryPriceShort = na
shortExitCond = false
if (strategy.position_size < 0)
entryPriceShort := nz(entryPriceShort[1], strategy.position_avg_price)
shortTPprice = entryPriceShort * (1 - tpPerc)
shortSLprice = entryPriceShort * (1 + slPerc)
// check TP/SL first
shortExitTP = low <= shortTPprice
shortExitSL = high >= shortSLprice
macdTrendFlipUp1h = macdTrendDown1h and (macd1h > macdSig1h)
macdCrossUp30m = longCross30m
shortExitCond := shortExitTP or shortExitSL or macdCrossUp30m or macdTrendFlipUp1h
else
entryPriceShort := na // reset when no position
// ==== 7) EXECUTE STRATEGY ORDERS WITH LABELS & ALERTS ====
// — Long Entry —
if (longEntryCond and strategy.position_size == 0)
strategy.entry("Long", strategy.long)
label.new(bar_index, low, text="Buy (LT)", style=label.style_label_up, color=color.new(color.green, 0), textcolor=color.white, yloc=yloc.belowbar)
alert("Buy (LT)", alert.freq_once_per_bar_close)
// — Long Exit —
if (strategy.position_size > 0 and longExitCond)
strategy.close("Long")
label.new(bar_index, high, text="Sell (LT)", style=label.style_label_down, color=color.new(color.red, 0), textcolor=color.white, yloc=yloc.abovebar)
alert("Sell (LT)", alert.freq_once_per_bar_close)
// — Short Entry —
if (shortEntryCond and strategy.position_size == 0)
strategy.entry("Short", strategy.short)
label.new(bar_index, high, text="Sell (ST)", style=label.style_label_down, color=color.new(color.red, 0), textcolor=color.white, yloc=yloc.abovebar)
alert("Sell (ST)", alert.freq_once_per_bar_close)
// — Short Exit —
if (strategy.position_size < 0 and shortExitCond)
strategy.close("Short")
label.new(bar_index, low, text="Buy (ST)", style=label.style_label_up, color=color.new(color.green, 0), textcolor=color.white, yloc=yloc.belowbar)
alert("Buy (ST)", alert.freq_once_per_bar_close)
// ==== 8) OPTIONAL PLOTTING (for debugging) ====
// We’ve removed any `transp`/`opacity` arguments. Instead, we use `color.new(baseColor, α)`
// for transparency, where α = 0 is fully opaque and α = 255 is fully transparent.
// 30m VWAP
plot(vwap30m, title = "VWAP 30m", color = color.new(color.teal, 80)) // ~31% transparentlinewidth= 1
// 1h VWAP
plot(vwap1h, title = "VWAP 1h", color = color.new(color.fuchsia, 80), linewidth= 1) // ~31% transparent
// 30m ATR vs ATR_MA
plot(atr30m, title = "ATR 30m", color = color.new(color.orange, 80))
plot(atr30m_ma, title = "ATR30m MA", color = color.new(color.yellow, 80))
// 30m MACD Histogram (bars)
plot(macd30m - macdSig30m, title = "MACD Histogram (30m)", style = plot.style_columns, color = (macd30m - macdSig30m >= 0 ? color.new(color.green, 80) : color.new(color.red, 80)))
// 1h MACD Histogram (area)
h1 = request.security(syminfo.tickerid, "60", macd1h - macdSig1h, lookahead=barmerge.lookahead_off)
plot(1, title = "MACD Hist (1h)", style = plot.style_area, color = (h1 >= 0 ? color.new(color.green, 80) : color.new(color.red, 80)))