
二重MACDトレンドシグナルキャプチャとフィルター量化戦略は,2つの異なるタイムフレームの移動平均集散指標 ((MACD) に基づく量化取引戦略である.この戦略は,短期と長期のトレンドシグナルを組み合わせて市場取引の機会をキャプチャし,市場騒音を効果的にフィルターし,取引信号の正確性を向上させる.この戦略は,TradingViewプラットフォーム上で実装され,価格グラフの重ね合わせとは独立したもので,株式,先物,外為を含む様々な金融市場に適用されます.
戦略の核心は,2つのMACD指標:MACD1 (短期) とMACD2 (長期) を利用することにある.MACD1のデフォルトの急速長さは34で,ゆっくりとした長さは144で,信号の平滑度は9で,短期的なトレンドの変化を検出する.MACD2のデフォルトの急速長さは100で,ゆっくりとした長さは200で,信号の平滑度は50で,長期的なトレンドの方向性を評価する.ユーザーは高速,遅い,速度と信号の長さをカスタマイズすることができ,計算中にSMA (単純移動平均線EMA) または (指数移動平均線) を選択する.
二重MACD戦略の核心原理は,市場動向を識別し,二つの異なる時間枠のMACD指標から取引信号を生成することである.戦略コードは,まず二つのMACD指標とその関連パラメータを計算する.
MACD1 (短期指数) は
MACD2 (長期指数):
取引の論理は明確で厳格に設計されています.
複数の条件がある:
公開条件:
戦略はまた,リスク管理措置を含み,調整可能なストップとストップのパラメータを設定し,デフォルトのストップは1% (最小0.1%),ストップは1.5% (最小0.1%),入場価格の動態に基づいて計算する.取引はKラインの終了時に処理され,信号の安定性を確保する.
この2つのMACD戦略は,コードを深く分析することで,多くの利点を示しています.
双重トレンド確認機構:短期MACDと長期MACDを組み合わせることで,戦略は市場のノイズを効果的にフィルターし,偽信号を軽減し,取引の正確性を向上させます.短期と長期の信号が一致するときにのみ,戦略は取引信号を生成します.
柔軟なパラメータ設定: 戦略は,ユーザがカスタマイズできるMACDパラメータ (高速長さ,遅い長さ,シグナルスムーズ) と計算方法 (SMAまたはEMA) を使って,戦略が異なる市場環境とユーザの好みに適応できるようにする.
直感的な視覚的フィードバック:戦略は,動的な色変化によって (上昇傾向は深緑,下降傾向は深赤) 傾向の強さを直感的に示すことで,トレーダーが市場状況をよりよく理解するのを助けます.
優れたリスク管理:内蔵の調整可能な止損および停止パラメータで,資金の安全を保ち,利益をロックします. これらのパラメータは,市場の波動性および個人のリスク承受能力に応じて調整できます.
リアルタイムアラート機能:戦略は,多行と空行の入場シグナルアラートを提供し,取引をリアルタイムで監視し,取引を自動化し,取引者が市場機会を迅速に把握できるようにする.
適用幅広: 戦略は,株式,期貨,外為を含む様々な金融市場に適用され,複数の取引シナリオで実用的なツールになります.
双重MACD策略は合理的に設計されているが,いくつかの潜在的なリスクがある.
トレンド反転リスク: 激しい変動のある市場では,トレンドが急速に反転し,戦略が損失を招く可能性があります. ストップ・損失設定がある場合でも,極端な市場条件では,実際のストップ・損失価格が大きく滑り落ちる可能性があります.
パラメータの感受性:戦略の性能はMACDパラメータの設定に強く依存する.不適切なパラメータは,多量の偽信号または重要な取引機会を逃す可能性があります.ユーザーは特定の市場と時間枠に応じてパラメータを注意深く最適化する必要があります.
遅滞性問題:MACDは本質的に遅滞指数であり,歴史的な価格データに基づいて計算される.急速な変化の市場では,信号が遅れてきて,最適な入場点を逃したり,不必要な損失を引き起こす可能性があります.
横軸市場の不良なパフォーマンス:この戦略は強いトレンドの市場では最適ですが,横軸整理または無方向の市場では頻繁に偽信号を生じ,連続した小損失を引き起こす可能性があります.
資金管理のリスク: 口座の100%の資金を使用する取引をデフォルトで設定します.これは過剰なレバレッジと資金管理の不適切につながります. 取引者は,取引ごとに資金の割合を減らすことを検討し,リスクをより良く管理する必要があります.
これらのリスクを軽減するために,トレーダーは,他の技術指標と組み合わせたクロス検証,定期的な戦略パラメータの反省と最適化,市場条件に応じて資金配分の調整,極端な市場条件で手動介入,合理的なリスク/リターン比率の設定を考慮する必要があります.
このコードの詳細を分析すると,以下のような最適化方向が考えられます.
フィルタリング条件の追加: 偽信号を減らすためにフィルターとして追加の技術指標 (RSIやブリン帯など) を追加できます. 例えば,RSIが市場が超買/超売り状態ではないことを示す場合にのみ取引します.
自動適応パラメータ:MACDパラメータの自己適応調整を実現し,市場の波動性に応じて自動的に調整する.高い波動性のある市場で,快速と遅速の長さを増やして騒音を減らすことができる.低波動性のある市場で,パラメータを小さくして感受性を高めることができる.
改善したストップ戦略:固定パーセントではなくATR (真波幅平均) に基づくストップ設定のような変動性に基づくダイナミックなストップを実現する.これは,現在の市場条件に適したストップを可能にします.
部分平仓メカニズムの追加:特定の利益目標を達成したときに部分平仓を許可し,部分利益をロックし,残りのポジションを利益に留める.
取引時間フィルター:取引時間フィルターを追加し,市場開盤/閉盤などの高波動時間または低流動性の時間に取引を避ける.
資金管理の最適化:ケリー指針または固定比率リスクモデルに基づく資金管理を実現し,勝率とリスク/リターンの比率に応じて動的にポジションサイズを調整する.
複数のタイムサイクルを組み合わせる:現在の2つのMACDに加えて,より包括的な市場視点を提供するために,第3のより長期のMACDを追加することを検討する.
市場状態の分類:市場状態の分類ロジックを追加し,異なる市場状態に応じて取引戦略とパラメータを調整する.
これらの最適化により,戦略の安定性と適応性が向上し,さまざまな市場条件下で優れたパフォーマンスを維持できます.
双MACDトレンドシグナルキャプチャとフィルター量化戦略は,短期と長期のMACD指標を巧妙に組み合わせることで,強力なトレンド追跡システムを創造する.この戦略の核心的な優点は,偽の信号を効果的に削減し,取引の正確性を向上させる厳格な二重確認メカニズムである.同時に,柔軟なパラメータ設定と直感的な視覚的フィードバックは,あらゆる種類の市場参加者にとって実用的なツールになる.
トレンド反転,パラメータの感受性,横軸市場の不良なパフォーマンスなどのリスクがあるにもかかわらず,適切なリスク管理措置と戦略の最適化によってこれらのリスクを効果的に制御することができます.将来の最適化の方向は,追加のフィルタリング条件を追加し,適応パラメータを実現し,損失防止戦略を改善し,資金管理の最適化などの側面を含むことができます.
全体として,二重MACD戦略は,定量トレーダーのための堅固な枠組みを提供し,特に中短期トレンドトレーダーに適しています. 伝統的な技術分析ツールと柔軟な取引ルールを組み合わせることで,この戦略は,一貫したリターンを追求するトレーダーのための堅固な取引システムを提供しています. パラメータを最適化し,その潜在的リスクを理解するために時間を費やしたいトレーダーにとって非常に価値のある戦略です.
/*backtest
start: 2024-03-25 00:00:00
end: 2025-03-24 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=6
strategy(title="Dual MACD Strategy [Jason Kasei]", shorttitle="DualMACD", overlay=false, margin_long=0, margin_short=0, default_qty_type=strategy.percent_of_equity,
default_qty_value=100, process_orders_on_close=true, initial_capital=10000)
// --- 输入参数 ---
// MACD1 参数
macd1_fast_length = input.int(title="MACD1 Fast Length", defval=34)
macd1_slow_length = input.int(title="MACD1 Slow Length", defval=144)
macd1_signal_length = input.int(title="MACD1 Signal Smoothing", minval=1, maxval=50, defval=9)
macd1_sma_source = input.string(title="MACD1 Oscillator MA Type", defval="EMA", options=["SMA", "EMA"])
macd1_sma_signal = input.string(title="MACD1 Signal Line MA Type", defval="EMA", options=["SMA", "EMA"])
// MACD2 参数
macd2_fast_length = input.int(title="MACD2 Fast Length", defval=100)
macd2_slow_length = input.int(title="MACD2 Slow Length", defval=200)
macd2_signal_length = input.int(title="MACD2 Signal Smoothing", minval=1, maxval=50, defval=50)
macd2_sma_source = input.string(title="MACD2 Oscillator MA Type", defval="EMA", options=["SMA", "EMA"])
macd2_sma_signal = input.string(title="MACD2 Signal Line MA Type", defval="EMA", options=["SMA", "EMA"])
// 止损止盈参数
stop_loss_pct = input.float(title="Stop Loss %", defval=1.0, minval=0.1, step=0.1)
take_profit_pct = input.float(title="Take Profit %", defval=1.5, minval=0.1, step=0.1)
// --- 计算 MACD1 ---
src = close
macd1_fast_ma = macd1_sma_source == "SMA" ? ta.sma(src, macd1_fast_length) : ta.ema(src, macd1_fast_length)
macd1_slow_ma = macd1_sma_source == "SMA" ? ta.sma(src, macd1_slow_length) : ta.ema(src, macd1_slow_length)
macd1 = macd1_fast_ma - macd1_slow_ma
macd1_signal = macd1_sma_signal == "SMA" ? ta.sma(macd1, macd1_signal_length) : ta.ema(macd1, macd1_signal_length)
macd1_hist = macd1 - macd1_signal
// --- 计算 MACD2 ---
macd2_fast_ma = macd2_sma_source == "SMA" ? ta.sma(src, macd2_fast_length) : ta.ema(src, macd2_fast_length)
macd2_slow_ma = macd2_sma_source == "SMA" ? ta.sma(src, macd2_slow_length) : ta.ema(src, macd2_slow_length)
macd2 = macd2_fast_ma - macd2_slow_ma
macd2_signal = macd2_sma_signal == "SMA" ? ta.sma(macd2, macd2_signal_length) : ta.ema(macd2, macd2_signal_length)
macd2_hist = macd2 - macd2_signal
// --- 绘制 MACD1 和 MACD2
hline(0, "Zero Line", color=color.new(#787B86, 50))
plot(macd1_hist, title="MACD1 Histogram", style=plot.style_line, color=(macd1_hist >= 0 ? (macd1_hist[1] < macd1_hist ? #26A69A : #B2DFDB) : (macd1_hist[1] < macd1_hist ? #FFCDD2 : #FF5252)))
plot(macd2_hist, title="MACD2 Histogram", style=plot.style_histogram, color=(macd2_hist >= 0 ? (macd2_hist[1] < macd2_hist ? #26A69A : #B2DFDB) : (macd2_hist[1] < macd2_hist ? #FFCDD2 : #FF5252)))
// --- 交易条件 ---
is_deep_green_macd2 = ta.cross(macd2_hist, 0) and macd2_hist > 0 and macd2_hist[1] < macd2_hist
is_deep_red_macd2 = ta.cross(macd2_hist, 0) and macd2_hist < 0 and macd2_hist[1] > macd2_hist
// 检测 MACD1 hist 穿越零轴
macd1_cross_up = macd1_hist > 0
macd1_cross_down = macd1_hist < 0
// 做多条件
long_condition = macd1_cross_up and macd2_hist > 0 and is_deep_green_macd2
// 做空条件
short_condition = macd1_cross_down and macd2_hist < 0 and is_deep_red_macd2
// --- 交易逻辑 ---
if long_condition
strategy.entry("Long", strategy.long)
stop_loss_long = strategy.position_avg_price * (1 - stop_loss_pct / 100)
take_profit_long = strategy.position_avg_price * (1 + take_profit_pct / 100)
strategy.exit("Long Exit", "Long", stop=stop_loss_long, limit=take_profit_long)
if short_condition
strategy.entry("Short", strategy.short)
stop_loss_short = strategy.position_avg_price * (1 + stop_loss_pct / 100)
take_profit_short = strategy.position_avg_price * (1 - take_profit_pct / 100)
strategy.exit("Short Exit", "Short", stop=stop_loss_short, limit=take_profit_short)
// --- 警报条件 ---
alertcondition(long_condition, title="Long Entry", message="Dual MACD Strategy: Long Entry Signal")
alertcondition(short_condition, title="Short Entry", message="Dual MACD Strategy: Short Entry Signal")