
この戦略は,明快で操作可能な取引信号を提供するために,双指数移動平均 (EMA) フィルターとスマート区間とノイズ検出の仕組みを組み合わせた高度なトレンド追跡システムである.その核心設計理念は,波動的な市場を回避し,取引の精度を向上させ,異なる市場条件に適応できるようにすることです.この戦略は,EMA高線とEMA低線の交差によってトレンドの方向を判断し,区間フィルターと波動率フィルターを活用しながら横横または低波動環境での取引を避けるため,取引の成功率を大幅に向上させます.
戦略の核となる仕組みは,以下の重要な要素に基づいています.
ダブルEMAフィルタリングシステム戦略: 2つの指数移動平均 ((高価格EMAと低価格EMA) を使って市場動向を決定する.価格が同時に2つのEMAラインの上にいる時,多信号を生成する.価格が同時に2つのEMAラインの下にいる時,空信号を生成する.この二重確認機構は,偽の突破の発生を効果的に減らす.
区間検出機構策略は,価格範囲のパーセントに基づく区間識別アルゴリズムを採用し,市場が横横整理段階に入るとき (すなわち,価格変動範囲が設定された値より小さい) 取引を自動的に停止します. システムは,連続区間バーの数を継続的に監視し,市場が真の区間状態にあることを確認したときにのみ区間フィルターをアクティブにします. 最初の突破の機会を逃さないようにします.
波動率フィルター策略は,現在の価格に対するATR (真波動幅の平均値) の割合を計算することによって,低波動率の環境を認識し,これらの条件下で取引を避けることができます. このメカニズムは,市場に十分な動力がある場合にのみ取引を保証します.
トレンドごとに取引する原則: 策略は,同じトレンドの方向に,トレンドの方向が変わるまで,一回だけ取引を行うことを保証するトレンド状態のメカニズムを実装しています. これは,同じトレンドの方向に過剰な取引と信号の重複を回避します.
未開封区間を表示する戦略は,突破につながる可能性のある統合領域を検出し,表示し,潜在的に高確率の取引機会を特定するのに役立ちます.
ダイナミックなリスク管理策略:ATRベースのストップまたは固定パーセントストップ,および選択可能なパラグラフSARトラッキングストップを提供することで,リスク管理をより柔軟に,市場の変化に適応できます.
高度な適応性: この戦略は,異なる市場条件に自動的に適応し,トレンドの市場でトレンドを捉え,揺れの市場では見張りを保つことができます.この適応性は,さまざまな市場環境で安定的に維持します.
複数のフィルタリング戦略は,トレンド,区間,波動率の3重フィルタリングを組み合わせることで,取引信号の質を大幅に向上させ,誤信号と偽の突破取引を減少させました.
スマート波動率調整戦略: 市場の変動率の動向に応じてポジションのサイズを調整し,高変動の環境でリスクの開口を削減し,適度な変動の環境で収益の可能性を最大化します.
視覚化ツール戦略は,区間標識,未破区間枠,EMA線,SAR点など,多くの視覚的補助ツールを提供します.これは,トレーダーが市場状態と戦略の論理を直観的に理解できるようにします.
リスク管理の柔軟性複数のストップ・ロズ戦略のサポート (固定パーセント,ATR倍数,SAR追跡) により,トレーダーは個人リスクの好みや市場特性に応じて最も適切なリスク管理方法を選択できます.
一回取引の原則: トレンドステートメカニズムにより,各トレンド方向に1回の取引しか実行されないようにし,過度な取引や過度の資金が単方向のリスクにさらされないようにする.
トレンドの逆転が遅れた: EMAを主要なトレンド指標として使用しているため,戦略は急速なトレンド反転時に反応が遅いため,反転初期に一定の反転が起こる可能性があります. 解決策はEMA長さのパラメータを調整し,波動が大きい市場でより短いEMA長さを使用することができます.
横軸市場が効率的でないこと: 策略は区間フィルターを設計しているにもかかわらず,長期横断市場では長期間の取引機会がなくなり,資金利用の効率に影響を及ぼす可能性があります. 解決策は,複数の時間枠分析を組み合わせ,または異なる市場間を交互に使用する策略です.
パラメータ最適化依存性戦略の性能は,EMA長さ,区間値,ATR倍数などのパラメータ設定に高度に依存しています.異なる市場と時間枠には異なるパラメータの組み合わせが必要である可能性があります.特定の市場と時間枠でリターンでパラメータを最適化することをお勧めします.
突発的な大波動のリスク: 突発的な市場イベント (重大ニュースリリースなど) に起因する価格の飛躍の場合,ストップロスは予想した価格で実行できない可能性があり,実際の損失が予想以上に発生します. 単一取引のリスクエッジを制限する追加の資金管理規則の使用が推奨されます.
技術指標への過度な依存戦略は,基本的要因を無視して,技術的指標に完全に基づいています. 純粋な技術的分析は,重大な基本的変化のときに無効になる可能性があります. 基本的分析と組み合わせたリスクイベントのカレンダーを設定し,重要な経済データが出される前にポジションを減らすか取引を一時停止することをお勧めします.
多時間枠確認システム: 複数の時間枠分析を導入することで,戦略の正確性が著しく向上する. より高い時間枠のトレンド確認条件を追加し,より高い時間枠のトレンド方向が現在の取引方向と一致するときにのみ取引を実行することを推奨する.これは逆転取引を減少させ,勝率を向上させる.
ダイナミックなパラメータは自律的に: 戦略は,市場変動率とトレンドの強さに応じてEMA長さ,区間値,ATR倍数などのパラメータを自動的に調整する自己適応パラメータ調整メカニズムを統合できます.これは,戦略が異なる市場段階によりうまく適応できるようにします.
機械学習モデルを統合する: 入場タイミングを最適化し,区間突破の方向を予測する機械学習モデルを導入することで,戦略のパフォーマンスを大幅に向上させることができます.例えば,区間突破を予測する分類アルゴリズムを使用する真偽,または突破後の価格目標を予測する回帰モデルを使用する.
波動率フィルターの改善:現在の波動率フィルターは,単純なATRパーセントの値に基づいて,相対波動率指標にアップグレードすることができ,現在の波動率と歴史的な波動率分布を比較し,真の低波動環境をより正確に識別します.
トランザクション増量確認:取引信号の生成時に取引量確認条件を追加し,価格突破が取引量増加に伴っている場合にのみ取引を実行することで,偽突破のリスクを軽減できます.この改良は,特に株式市場と商品市場に適用されます.
資金管理アルゴリズムの最適化カレー指数または他の高度な資金管理アルゴリズムを戦略に統合し,歴史的な勝率と利益と損失の比率に基づいてポジションのサイズを動的に調整することで,長期的な利益を最大化し,リスクを最小限に抑えることができます.
双指数均線トレンド追跡と波動率のスマートフィルタリング戦略は,トレンド追跡,区間検出と波動率のフィルタリング技術を組み合わせて,取引信号の質と取引成功率を効果的に向上させる包括的で堅固な取引システムである.その独特の1つのトレンド毎の取引原理とダイナミックなリスク管理機構は,リスクを制御しながら,優れた収益性を維持することを可能にします.戦略の複数のフィルタリング機構と可視化ツールは,取引意思決定をより直観的かつ信頼性のあるものにします.
策略には,トレンド逆転の遅延やパラメータ依存などのリスクもあるが,多時間枠確認,ダイナミックパラメータの自己適応,機械学習モデルの統合など,提案された最適化方向によってこれらのリスクを効果的に管理することができる.適切なパラメータの最適化とリスク管理によって,この戦略は,さまざまな市場条件下で安定したパフォーマンスを維持することができ,長期的に使用し,継続的に改善する価値のある取引システムである.
/*backtest
start: 2024-08-01 00:00:00
end: 2025-07-30 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=5
strategy("Dubic EMA Strategy", overlay=true,
default_qty_type=strategy.percent_of_equity,
default_qty_value=100,
initial_capital=10000,
currency=currency.USD,
commission_value=0.1,
pyramiding=0,
calc_on_every_tick=true)
// Inputs
ema_length = input.int(40, "EMA Length")
tp_percent = input.float(2.0, "Take Profit %", step=0.1, minval=0.1) / 100
sl_offset = input.float(0.5, "Stop Loss Offset %", step=0.1, minval=0.1) / 100
// Toggles for SL/TP
use_take_profit = input.bool(true, "Use Take Profit")
use_stop_loss = input.bool(true, "Use Stop Loss")
// Range Detection
range_length = input.int(20, "Range Detection Length", minval=5)
range_threshold = input.float(2.0, "Range Threshold %", step=0.1) / 100
min_range_bars = input.int(3, "Min Range Bars", minval=1)
// Parabolic SAR
use_parabolic_sar = input.bool(true, "Use Parabolic SAR Trailing Stop")
sar_start = input.float(0.02, "SAR Start", step=0.01)
sar_increment = input.float(0.02, "SAR Increment", step=0.01)
sar_max = input.float(0.2, "SAR Maximum", step=0.01)
// ATR Stop Configuration
use_atr_stop = input.bool(true, "Use ATR Stop Instead of Fixed %")
atr_length = input.int(14, "ATR Length")
atr_mult = input.float(1.5, "ATR Multiplier", minval=0.5)
// Volatility Filter
min_atr = input.float(0.5, "Min ATR % for Trading", step=0.1) / 100
use_volatility_filter = input.bool(true, "Enable Volatility Filter")
// Unbroken Range Visualization
show_unbroken_range = input.bool(true, "Show Unbroken Range Visualization", group="Unbroken Range")
unbroken_length = input.int(20, 'Minimum Range Length', minval=2, group="Unbroken Range")
unbroken_mult = input.float(1., 'Range Width', minval=0, step=0.1, group="Unbroken Range")
unbroken_atrLen = input.int(500, 'ATR Length', minval=1, group="Unbroken Range")
upCss = input.color(#089981, 'Broken Upward', group="Unbroken Range")
dnCss = input.color(#f23645, 'Broken Downward', group="Unbroken Range")
unbrokenCss = input.color(#2157f3, 'Unbroken', group="Unbroken Range")
// Calculate Indicators
ema_high = ta.ema(high, ema_length)
ema_low = ta.ema(low, ema_length)
ema_200 = ta.ema(close, 200)
sar = ta.sar(sar_start, sar_increment, sar_max)
atr = ta.atr(atr_length)
// Volatility Filter
atr_percentage = (atr / close) * 100
sufficient_volatility = not use_volatility_filter or (atr_percentage >= min_atr * 100)
// Range Detection Logic
range_high = ta.highest(high, range_length)
range_low = ta.lowest(low, range_length)
range_size = range_high - range_low
range_percentage = (range_size / close) * 100
range_condition = range_percentage <= (range_threshold * 100)
// Consecutive range bars counter
var int range_bars_count = 0
range_bars_count := range_condition ? range_bars_count + 1 : 0
in_range = range_bars_count >= min_range_bars
// Visualize Range
bgcolor(in_range ? color.new(color.purple, 85) : na, title="Range Zone")
plot(in_range ? range_high : na, "Range High", color=color.purple, linewidth=2, style=plot.style_linebr)
plot(in_range ? range_low : na, "Range Low", color=color.purple, linewidth=2, style=plot.style_linebr)
// Trading Conditions
buy_condition = (close > ema_high) and (close > ema_low)
sell_condition = (close < ema_high) and (close < ema_low)
// Apply Filters
buy_signal = buy_condition and not in_range and sufficient_volatility
sell_signal = sell_condition and not in_range and sufficient_volatility
// Trend State Machine
var int currentTrend = 0 // 0=neutral, 1=long, -1=short
var bool showBuy = false
var bool showSell = false
trendChanged = false
if buy_signal and currentTrend != 1
currentTrend := 1
trendChanged := true
showBuy := true
showSell := false
else if sell_signal and currentTrend != -1
currentTrend := -1
trendChanged := true
showBuy := false
showSell := true
// Reset signals
showBuy := nz(showBuy[1]) and not trendChanged ? false : showBuy
showSell := nz(showSell[1]) and not trendChanged ? false : showSell
// Plot Indicators
plot(ema_high, "EMA High", color=color.blue, linewidth=2)
plot(ema_low, "EMA Low", color=color.orange, linewidth=2)
plot(ema_200, "200 EMA", color=color.white, linewidth=3)
// Plot SAR with color coding
color sarColor = strategy.position_size > 0 ? color.red :
strategy.position_size < 0 ? color.green :
color.gray
plot(use_parabolic_sar ? sar : na, "SAR", style=plot.style_circles, color=sarColor, linewidth=2)
// Plot signals
plotshape(showBuy, title="Buy Signal", text="BUY", style=shape.labelup,
location=location.belowbar, color=color.green, textcolor=color.white, size=size.tiny)
plotshape(showSell, title="Sell Signal", text="SELL", style=shape.labeldown,
location=location.abovebar, color=color.red, textcolor=color.white, size=size.tiny)
// Strategy Logic
var float long_sl = na
var float long_tp = na
var float short_sl = na
var float short_tp = na
var float long_trail_stop = na
var float short_trail_stop = na
// Position Sizing with Volatility Scaling
position_size = use_volatility_filter ? math.min(100, 100 * (min_atr * 100) / atr_percentage) : 100
// Execute trades
if (showBuy)
// Calculate stop loss and take profit
long_sl := use_atr_stop ? close - atr * atr_mult : ema_low * (1 - sl_offset)
long_tp := close * (1 + tp_percent)
long_trail_stop := use_parabolic_sar ? sar : na
strategy.close("Short", comment="Exit Short")
strategy.entry("Long", strategy.long, qty=position_size)
// Set exit orders with toggle support
if use_stop_loss or use_take_profit
strategy.exit("Long SL/TP", "Long",
stop=use_stop_loss ? long_sl : na,
limit=use_take_profit ? long_tp : na)
if use_parabolic_sar
strategy.exit("Long SAR", "Long", stop=long_trail_stop)
alert("BUY: " + syminfo.ticker, alert.freq_once_per_bar)
if (showSell)
// Calculate stop loss and take profit
short_sl := use_atr_stop ? close + atr * atr_mult : ema_high * (1 + sl_offset)
short_tp := close * (1 - tp_percent)
short_trail_stop := use_parabolic_sar ? sar : na
strategy.close("Long", comment="Exit Long")
strategy.entry("Short", strategy.short, qty=position_size)
// Set exit orders with toggle support
if use_stop_loss or use_take_profit
strategy.exit("Short SL/TP", "Short",
stop=use_stop_loss ? short_sl : na,
limit=use_take_profit ? short_tp : na)
if use_parabolic_sar
strategy.exit("Short SAR", "Short", stop=short_trail_stop)
alert("SELL: " + syminfo.ticker, alert.freq_once_per_bar)
// Update SAR trailing stops
if barstate.isrealtime and use_parabolic_sar
if strategy.position_size > 0
strategy.exit("Long SAR", "Long", stop=long_trail_stop)
else if strategy.position_size < 0
strategy.exit("Short SAR", "Short", stop=short_trail_stop)
// Plot SL/TP levels with toggle support
plot(strategy.position_size > 0 and use_stop_loss ? long_sl : na, "Long Stop", color=color.red, style=plot.style_linebr, linewidth=2)
plot(strategy.position_size > 0 and use_take_profit ? long_tp : na, "Long Take Profit", color=color.green, style=plot.style_linebr, linewidth=2)
plot(strategy.position_size < 0 and use_stop_loss ? short_sl : na, "Short Stop", color=color.red, style=plot.style_linebr, linewidth=2)
plot(strategy.position_size < 0 and use_take_profit ? short_tp : na, "Short Take Profit", color=color.green, style=plot.style_linebr, linewidth=2)
// Plot SAR trailing stops
plot(strategy.position_size > 0 and use_parabolic_sar ? long_trail_stop : na,
"Long Trail Stop", color=color.orange, style=plot.style_circles, linewidth=2)
plot(strategy.position_size < 0 and use_parabolic_sar ? short_trail_stop : na,
"Short Trail Stop", color=color.orange, style=plot.style_circles, linewidth=2)
// Alerts
alertcondition(showBuy, title="Buy Alert", message="BUY: {{ticker}}")
alertcondition(showSell, title="Sell Alert", message="SELL: {{ticker}}")