指数移動平均ローソク足ストップ取引戦略

EMA RSI SUPPORT RESISTANCE BREAKOUT
作成日: 2025-02-25 11:11:35 最終変更日: 2025-02-25 11:11:35
コピー: 8 クリック数: 348
2
フォロー
319
フォロワー

指数移動平均ローソク足ストップ取引戦略 指数移動平均ローソク足ストップ取引戦略

概要

指数移動平均線台停止取引戦略は,台形状と移動平均線トレンド確認に基づく定量取引システムである.この戦略は,主に,特定の台形状 (すなわち”台停止”信号) を入場点として識別し,EMA (指数移動平均線) と組み合わせて,全体的な市場トレンドを交叉確認し,市場突破を識別するために動的サポート位とレジスタンス位を使用する.この戦略は,プレスセットの損失位置とリスク・リターン比に基づくストップ・ストップ戦略を含む厳格なリスク管理機構を採用し,各取引のリスクを制御することを保証する.

戦略原則

この戦略の核心原則は,市場における特定の暴落の形状を識別することであり,これらの形状は,通常,市場が短期的に逆転する可能性を示している.戦略の動作の仕組みは以下の通りである.

  1. トレンド判断:EMA20とEMA90の相対的な位置を比較して市場のトレンドを判断する.EMA20がEMA90上位であるときは上昇傾向として判断する.EMA20がEMA90以下であるときは下降傾向として判断する.

  2. 信号が止まった:

    • 上昇傾向の台停止信号要求:下影線は実体より少なくとも0.8倍長,上影線は実体より小さい,閉盘価格は開盤価格より高い ((陽線) 。
    • ダウントレンドの台停止信号要求:上影線は実体より少なくとも0.8倍の長さ,下影線は実体より小さい,そして閉盘価格は開盤価格より低い ((陰線) 。
  3. 突破検知:現在の閉盤価格とサポート/レジスタンスレベルを比較して市場突破を識別する.

  4. 入場条件:市場が特定のトレンドにあり,破局状態ではないとき,暴落の停止信号が発生した場合,戦略は,既定のリスクパラメータ (取引当たり2.5%のリスク) に従って入場する.

  5. 止損設定:多頭ポジションでは,止損は入場価格の下2.5%に設定され,空頭ポジションでは,止損は入場価格上2.5%に設定されます.

  6. ストップ条件:利益率とリスク・リターン比率に基づく組合せ条件.多頭は利益率の少なくとも7%とリスク・リターン比率の少なくとも3を要求する.空頭は利益率の少なくとも6%とリスク・リターン比率の少なくとも3を要求する.

戦略的優位性

  1. 明確な入場・出場シグナル:特定の下落の形状と移動均線の傾向によって明確な取引シグナルを提供し,主観的な判断による感情的影響を軽減する.

  2. 総合的なトレンド確認機構: 複数の時間周期のEMA指標を使用して,市場のトレンドを確認し,取引信号の信頼性を向上させる.

  3. ダイナミック・サポートとレジスタンス識別: ロールウィンドウで計算されたダイナミック・サポートとレジスタンス,戦略を異なる市場段階に適応させる.

  4. 厳格なリスク管理: リスクパラメータを事前に設定する (取引ごとに2.5%のリスク) とリスク・リターン比に基づく停止条件により,資金管理の合理性を確保する.

  5. 異なる多空取引基準:多頭と空頭取引に対して異なる入場条件と利益目標を設定し,市場の非対称性特性に適応する.

  6. ダイナミックポジション計算: ストップダストの距離に基づいて適切なポジションサイズを自動的に計算し,各取引のリスクの一致性を確保する.

戦略リスク

  1. 指数遅滞性:遅滞指数であるEMAは,急速に変化する市場で遅延信号を提供し,入場タイミングが悪いことを引き起こします.

  2. 偽の突破リスク:市場には偽の突破現象が発生し,誤ったシグナルが生成される可能性があります. 解決方法は,取引量確認を導入するか,突破確認周期を増やすことです.

  3. 感度調整の課題: 台風停止信号のパラメータ (例えば影線と実体比) は,異なる市場と周期に応じて調整する必要がある.過度に感度が高すぎると過度取引が起こり,過度に厳格すぎると機会が逃れることがある.

  4. トレンド転換期リスク: トレンド転換期の間,戦略は一連の損益取引を発生させることがあります. 解決策は,トレンド強度フィルターを追加するか,トレンドが不明なときに取引頻度を減らすことです.

  5. 固定ストップ距離の不適合性:すべての取引に対して同じパーセンテージのストップ距離 ((2.5%) を使用すると,異なる市場の変動率に適合しない可能性があります. 変動率に基づくダイナミックストップ距離を使用することを考慮することができます.

  6. RSIフィルタリング条件の限界:空頭取引のみにRSIフィルタリングを使用すると,不均衡な取引頻度が生じることがあります.マルチヘッダ取引にも同様のフィルタリング機構を導入するか,現在のRSIパラメータを最適化することを検討することができます.

戦略最適化の方向性

  1. 波動率自己適応パラメータ:波動率指数 (ATRなど) を導入して,台停止信号の影線比率要求と止損距離を動的に調整することで,戦略が異なる市場条件により良く適応できるようにする.

  2. 多時間枠確認:より高い時間枠を再び導入する傾向を確認し,取引信号の信頼性を高め,偽信号の影響を軽減する.

  3. 入場タイミングの最適化: トレンド強度指数,取引量確認などの追加のフィルター条件を追加することで,入場タイミングを最適化して取引成功率を向上させる.

  4. 部分ストップメカニズム:リスクとリターンのバランスを良くするために,一定の利益を達成した後にストップをコスト価格に移動したり,利益の一部をロックしたりする分期ストップメカニズムを導入する.

  5. 回測周期の拡張:戦略の安定性と適応性を検証するために,異なる市場周期と条件下でより全面的な回測を行う.

  6. 機械学習最適化: 特定の市場向けに最適なパラメータの組み合わせを見つけるために,機械学習の方法を使用して,戦略パラメータを自動的に最適化します.

  7. 取引頻度制御:取引回数制限または冷却期メカニズムを導入し,不利な市場条件下での過度な取引を避ける.

要約する

指数移動均線台停止取引戦略は,技術分析とリスク管理を組み合わせた量化取引システムであり,特定の台形状を特定し,トレンド確認と組み合わせて取引信号を生成する.この戦略の主要な利点は,明確な取引規則と厳格なリスク制御機構であり,取引意思決定をより体系化して規律的にします.しかし,技術分析戦略と同様に,指標の遅れや市場の変化への適応などの課題に直面しています.

波動率自己適応パラメータ,多時間枠の確認および入場タイミングの最適化などの方向の改善を導入することにより,この戦略は,異なる市場環境でより安定したパフォーマンスを発揮する可能性がある.特に,パラメータの最適化に機械学習の方法を適用することは,戦略の適応性と全体的なパフォーマンスを大幅に向上させる可能性があります.いずれにせよ,この戦略を実際に展開する前に,実際の市場条件下でそのパフォーマンスを検証するために十分な反省と前向きなテストを行うことが推奨されています.

ストラテジーソースコード
/*backtest
start: 2024-02-26 00:00:00
end: 2025-02-23 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Binance","currency":"SOL_USDT"}]
*/

//@version=6
strategy("Advanced Candle Stop Strategy Backtest - Tuned v9 - Max Trades", overlay=true)

// --- EMA Variables ---
ema5_length = 5
ema20_length = 20
ema90_length = 90

ema5 = ta.ema(close, ema5_length)
ema20 = ta.ema(close, ema20_length)
ema90 = ta.ema(close, ema90_length)

// --- Support, Resistance, and Volume Calculation ---
lookback_support_resistance = 30
support_level = ta.lowest(low, lookback_support_resistance)
resistance_level = ta.highest(high, lookback_support_resistance)

// --- Volume Condition for Short (Removed) ---
avg_volume_lookback = 20
avg_volume = ta.sma(volume, avg_volume_lookback)

// --- RSI Condition for Short (Removed) ---
rsi_length = 14
rsi_overbought = 70
rsi = ta.rsi(close, rsi_length)


// --- Candle Stop Function ---
is_candle_stop(trend) =>
    body = math.abs(close - open)
    upper_shadow = high - math.max(open, close)
    lower_shadow = math.min(open, close) - low

    if trend == "up"
        lower_shadow >= 0.8 * body and upper_shadow < body and close > open // Shadow ratio reduced to 0.8 for longs
    else if trend == "down"
        upper_shadow >= 0.8 * body and lower_shadow < body and close < open // Shadow ratio reduced to 0.8 for shorts - EMA5 and Volume conditions removed
    else
        false

// --- Trend Determination (only 15m, no 1H confirmation) ---
trend = ema20 > ema90 ? "up" : ema20 < ema90 ? "down" : "neutral"
final_trend = trend  // حذف تأیید با تایم‌فریم 1H

// --- Breakout Detection ---
var bool breakout_detected = false
if final_trend == "up" and close > resistance_level
    breakout_detected := true
    alert("شکست صعودی تشخیص داده شد! منتظر پولبک 🚀", alert.freq_once_per_bar)
else if final_trend == "down" and close < support_level
    breakout_detected := true
    alert("شکست نزولی تشخیص داده شد! منتظر پولبک 📉", alert.freq_once_per_bar)

// --- Entry and Exit Conditions ---
var float position = 0.0
var float entry_price = 0.0
var float stop_loss_price = na
var bool take_profit_long = false  // Declare take_profit_long
var bool stop_loss_hit_long = false // Declare stop_loss_hit_long
var bool take_profit_short = false // Declare take_profit_short
var bool stop_loss_hit_short = false // Declare stop_loss_hit_short
risk_per_trade_percent = 2.5  // افزایش ریسک به 2.5٪ برای موقعیت‌های بیشتر


if not breakout_detected
    if position == 0 and is_candle_stop(final_trend)
        risk_amount_usd = strategy.initial_capital * (risk_per_trade_percent / 100)
        if final_trend == "up"
            stop_loss_price := close * 0.975 // Stop loss at 2.5% below entry for longs
            if (close - stop_loss_price) != 0
                position_size_usd = risk_amount_usd / (close - stop_loss_price)
                amount = position_size_usd / close
                strategy.entry("Long", strategy.long, qty=amount)
                position := amount
                entry_price := close
        else if final_trend == "down"
            stop_loss_price := close * 1.025 // Stop loss at 2.5% above entry for shorts
            if (stop_loss_price - close) != 0
                position_size_usd = risk_amount_usd / (stop_loss_price - close)
                amount = position_size_usd / close
                if rsi >= rsi_overbought // RSI condition for short entry - No Change, still using RSI but not enforcing it for now - Consider removing RSI condition as well for max trades
                    strategy.entry("Short", strategy.short, qty=amount)
                    position := amount
                    entry_price := close

if position > 0
    profit_percent_long = (close - entry_price) / entry_price * 100
    profit_percent_short = (entry_price - close) / entry_price * 100
    loss_percent_long = (entry_price - close) / entry_price * 100
    loss_percent_short = (close - entry_price) / entry_price * 100

    risk_reward_long = loss_percent_long != 0 ? profit_percent_long / loss_percent_long : (profit_percent_long != 0 ? 99999 : 0)
    risk_reward_short = loss_percent_short != 0 ? profit_percent_short / loss_percent_short : (profit_percent_short != 0 ? 99999 : 0)


    take_profit_long := profit_percent_long >= 7 and risk_reward_long >= 3
    stop_loss_hit_long := close <= stop_loss_price
    take_profit_short := profit_percent_short >= 6 and risk_reward_short >= 3 // Reduced Take Profit for Shorts to 6% - No Change
    stop_loss_hit_short := close >= stop_loss_price

    if (final_trend == "up" and (take_profit_long or stop_loss_hit_long)) or (final_trend == "down" and (take_profit_short or stop_loss_hit_short))
        if final_trend == "up"
            strategy.close("Long")
        else
            strategy.close("Short")
        position := 0
        entry_price := 0.0
        breakout_detected := false

// --- Plotting EMAs and Support/Resistance Levels ---
plot(ema5, color=color.blue, title="EMA5")
plot(ema20, color=color.red, title="EMA20")
plot(ema90, color=color.green, title="EMA90")
plot(resistance_level, color=color.orange, style=plot.style_line, title="Resistance")
plot(support_level, color=color.orange, style=plot.style_line, title="Support")