EMA、マドリッドバンド、ドンチャンチャネルに基づくマルチモードのストッププロフィットおよびストップロストレンドフォロー戦略

EMA RRR
作成日: 2025-01-10 16:24:30 最終変更日: 2025-01-10 16:24:30
コピー: 2 クリック数: 418
1
フォロー
1617
フォロワー

EMA、マドリッドバンド、ドンチャンチャネルに基づくマルチモードのストッププロフィットおよびストップロストレンドフォロー戦略

概要

これは、指数移動平均 (EMA)、マドリッド リボン、ドンチャン チャネルを組み合わせたトレンド追跡戦略です。この戦略のユニークな点は、ポイントベース、金​​額ベース、リスクリターン比ベースの 3 つの切り替え可能なストッププロフィット モードとストップロス モードを提供していることです。二次信号確認メカニズムによってトランザクションの信頼性が向上し、有効な信号が 2 回目に表示された場合にのみトランザクションが実行されます。

戦略原則

この戦略では、3 つのテクニカル指標を組み合わせて取引機会を特定します。

  1. 200期間の指数移動平均は、全体的なトレンドの方向を決定するために使用されます。
  2. マドリッドバンド(5期間EMAと100期間EMAのクロスオーバー)は中期トレンドを判断するために使用されます。
  3. 特定のエントリータイミングのためのドンチャンチャネルブレイクアウト

ロング取引条件: 価格が 200EMA を上回り、マドリッド バンドが強気に転じ、価格がドンチャン チャネル上部を突破します。 ショート取引条件: 価格が 200EMA を下回り、マドリッド バンドが弱気に転じ、価格がドンチャン チャネルの下部を突破します。 誤ったシグナルを減らすために、この戦略では、有効なシグナルが 2 回目に表示された場合にのみ取引を実行します。

戦略的優位性

  1. さまざまな取引スタイルに応じてモードを切り替えることができる柔軟なストッププロフィットおよびストップロス管理システム
  2. 複数のテクニカル指標を組み合わせることで、より信頼性の高い取引シグナルが得られます。
  3. 二次確認メカニズムは、誤った信号の影響を効果的に軽減します。
  4. この戦略は先読みバイアスを完全に回避し、再描画の問題は発生しません。
  5. さまざまな市場環境に適応できるよう高度にカスタマイズ可能

戦略リスク

  1. トレンドが反転すると、より大きなリトレースメントが発生する可能性がある 解決策: 指標パラメータを調整することで戦略の感度を向上させることができます。
  2. テクニカル指標に過度に依存すると、市場機会を逃す可能性がある 解決策:ファンダメンタル分析を組み合わせることをお勧めします
  3. 固定ストップロスとテイクプロフィットは、すべての市場状況に適しているわけではない。 解決策: ボラティリティに基づいて利益確定と損切りのレベルを動的に調整する

戦略最適化の方向性

  1. 利益確定と損切りレベルを動的に調整するボラティリティ指標を導入
  2. 信号の信頼性を向上させるためにボリューム分析を追加しました
  3. 市場センチメント指標の追加
  4. 適応型パラメータ最適化システムの開発
  5. 最大ドローダウン制御などのリスク管理モジュールを追加する

要約する

これは、複数の古典的なテクニカル指標を組み合わせたトレンド追跡戦略であり、柔軟なストッププロフィットとストップロスの管理と二次確認メカニズムを通じて取引の安定性を向上させます。この戦略はカスタマイズ性が高く、さまざまな市場環境や取引スタイルに適応できます。実際の使用前に十分な履歴データのバックテストを実施し、特定の市場特性に応じてパラメータ設定を調整することをお勧めします。

ストラテジーソースコード
/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-08 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":49999}]
*/

//@version=6
strategy("Pamplona Enhanced TP/SL Toggleable", overlay=true, default_qty_type=strategy.fixed, default_qty_value=1)

// Input settings
use_tick_based = input.bool(false, title="Use Tick-Based TP/SL")
use_dollar_based = input.bool(false, title="Use Dollar-Based TP/SL")
use_risk_reward = input.bool(true, title="Use Risk-Reward TP/SL") // Default option

tick_size = input.float(0.1, title="Tick Size (for Tick-Based)", minval=0.0001, step=0.0001)
ticks = input.int(10, title="Ticks (for Tick-Based TP/SL)", minval=1)
dollar_tp = input.float(10.0, title="Dollar Take Profit (for Dollar-Based)", minval=0.01, step=0.01)
dollar_sl = input.float(10.0, title="Dollar Stop Loss (for Dollar-Based)", minval=0.01, step=0.01)
risk_reward_ratio = input.float(2.0, title="Risk-Reward Ratio (for Risk-Reward TP/SL)", minval=0.1, step=0.1)
contract_size = input.int(1, title="Contract Size", minval=1)

// Retrieve indicators
ema200 = ta.ema(close, 200)
src = close
ma05 = ta.ema(src, 5)
ma100 = ta.ema(src, 100)
madrid_green = ma05 > ma100
dlen = input.int(20, title="Donchian Channel Period")
highest_d = ta.highest(high, dlen)
lowest_d = ta.lowest(low, dlen)
donchian_green = close > highest_d[1]
donchian_red = close < lowest_d[1]

// Track signals
var int long_signal_count = 0
var int short_signal_count = 0

// Conditions
long_condition_raw = madrid_green and donchian_green and close > ema200
short_condition_raw = not madrid_green and donchian_red and close < ema200

// Update signal counters
if long_condition_raw
    long_signal_count += 1
else
    long_signal_count := 0

if short_condition_raw
    short_signal_count += 1
else
    short_signal_count := 0

// Final conditions to enter on the second signal
long_condition = long_signal_count == 2
short_condition = short_signal_count == 2

// Ensure exactly one TP/SL mode is enabled
tp_sl_mode_count = (use_tick_based ? 1 : 0) + (use_dollar_based ? 1 : 0) + (use_risk_reward ? 1 : 0)
if tp_sl_mode_count != 1
    runtime.error("Enable exactly ONE TP/SL mode (Tick-Based, Dollar-Based, or Risk-Reward).")

// Function to calculate TP/SL based on active mode
calc_tp_sl(entry_price, is_long) =>
    float tp = na
    float sl = na
    if use_tick_based
        tp := is_long ? entry_price + ticks * tick_size : entry_price - ticks * tick_size
        sl := is_long ? entry_price - ticks * tick_size : entry_price + ticks * tick_size
    else if use_dollar_based
        tp := is_long ? entry_price + (dollar_tp / contract_size) : entry_price - (dollar_tp / contract_size)
        sl := is_long ? entry_price - (dollar_sl / contract_size) : entry_price + (dollar_sl / contract_size)
    else if use_risk_reward
        risk = is_long ? close - low : high - close
        tp := is_long ? close + (risk * risk_reward_ratio) : close - (risk * risk_reward_ratio)
        sl := is_long ? close - risk : close + risk
    [tp, sl]

// Entry logic
if long_condition
    [take_profit, stop_loss] = calc_tp_sl(close, true)
    strategy.entry("Long", strategy.long, qty=contract_size)
    strategy.exit("Take Profit", from_entry="Long", limit=take_profit, stop=stop_loss)

if short_condition
    [take_profit, stop_loss] = calc_tp_sl(close, false)
    strategy.entry("Short", strategy.short, qty=contract_size)
    strategy.exit("Take Profit", from_entry="Short", limit=take_profit, stop=stop_loss)

// Plot indicators
plot(ema200, title="200 EMA", color=color.white, linewidth=2)
bgcolor(long_condition ? color.new(color.green, 90) : short_condition ? color.new(color.red, 90) : na)