マルチ移動平均トレンド強度取引戦略 - 移動平均偏差に基づく柔軟でインテリジェントな取引システム

MA ATR HTF RR TP SL
作成日: 2024-12-11 17:46:33 最終変更日: 2024-12-11 17:46:33
コピー: 0 クリック数: 446
1
フォロー
1617
フォロワー

マルチ移動平均トレンド強度取引戦略 - 移動平均偏差に基づく柔軟でインテリジェントな取引システム

概要

この戦略は,複数の移動平均とトレンドの強度に基づいたスマート取引システムである.それは,価格と異なる周期的な移動平均の間の偏差の程度を分析することによって,市場トレンドの強さを測定し,ATR変動率指標と組み合わせてポジション管理とリスク管理を行う.この戦略は高度にカスタマイズされ,異なる市場環境と取引のニーズに応じてパラメータを柔軟に調整することができます.

戦略原則

戦略の中核となるロジックは、次の側面に基づいています。

  1. 2つの異なる周期 (速いと遅い) の移動平均を使用して,トレンドの方向と交差信号を識別する
  2. 価格と移動平均の偏差を計算してトレンドの強さを量化する (ポイントで計算する)
  3. K線形状 ((吞没,,射星,十字星など) を併用して,補助的な確認信号として
  4. ATR指標を用いたストップ・ロストと利益目標の動的計算
  5. 部分利益とストップ・ロスの追跡による注文管理

戦略的優位性

  1. システムには高度な適応性があり,異なる市場環境にパラメータで適応できます
  2. 偏差値でトレンドの強さを測定し,トレンドが弱くなっているときに頻繁に取引を避ける
  3. 複数の技術指標と形状確認を組み合わせ,取引信号の信頼性を向上させる
  4. ATRベースのダイナミック・ストップ方式により,リスクを合理的に制御する
  5. 回復と固定ポジションの両方の資金管理をサポートする
  6. 部分利益と追跡停止機能を備えて,収益を効果的に保護する

戦略リスク

  1. 波動市場では偽信号が多く発生し,波動指標のフィルターを増やすことをお勧めします.
  2. 複数の指標の組み合わせにより,いくつかの取引機会を逃す可能性があります.
  3. パラメータを過度に最適化すると,過度に適合するリスクが生じる.
  4. 流動性の低い市場では,大額取引は滑り込みのリスクがあります.
  5. 合理的なストップレスの設定が求められ,単発損失が過大になるのを避ける

戦略最適化の方向性

  1. トレンド確認の補助指標として取引量指標を追加できます.
  2. 市場波動性指標の導入を検討し,取引頻度を動的に調整する
  3. 異なる時間周期における傾向一致性に基づく信号フィルタリング
  4. タイムストップなど,より多くのストップオプションを追加します.
  5. 戦略の適応性を向上させる適応型パラメータ最適化メカニズムを開発する

要約する

この戦略は,移動平均,トレンド強度定量化,K線形状,動的リスク管理を組み合わせて,包括的な取引システムを構築している.これは,戦略の論理の簡潔性を保ちながらも,複数の確認メカニズムによって取引の信頼性を高めている.戦略の高度なカスタマイズ性は,異なる取引スタイルと市場環境に適応することを可能にするが,使用時にはパラメータ最適化とリスク管理に注意する必要がある.

ストラテジーソースコード
/*backtest
start: 2024-12-03 00:00:00
end: 2024-12-10 00:00:00
period: 10m
basePeriod: 10m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Customizable Strategy with Signal Intensity Based on Pips Above/Below MAs", overlay=true)

// Customizable Inputs
// Account and Risk Management
account_size = input.int(100000, title="Account Size (USD)", minval=1)
compounded_results = input.bool(true, title="Compounded Results")
risk_per_trade = input.float(1.0, title="Risk per Trade (%)", minval=0.1, maxval=100) / 100

// Moving Averages Settings
ma1_length = input.int(50, title="Moving Average 1 Length", minval=1)
ma2_length = input.int(200, title="Moving Average 2 Length", minval=1)

// Higher Time Frame for Moving Averages
ma_htf = input.timeframe("D", title="Higher Time Frame for MA Delay")

// Signal Intensity Range based on pips
signal_intensity_min = input.int(0, title="Signal Intensity Start (Pips)", minval=0, maxval=1000)
signal_intensity_max = input.int(1000, title="Signal Intensity End (Pips)", minval=0, maxval=1000)

// ATR-Based Stop Loss and Take Profit
atr_length = input.int(14, title="ATR Length", minval=1)
atr_multiplier_stop = input.float(1.5, title="Stop Loss Size (ATR Multiplier)", minval=0.1)
atr_multiplier_take_profit = input.float(2.5, title="Take Profit Size (ATR Multiplier)", minval=0.1)

// Trailing Stop and Partial Profit
trailing_stop_rr = input.float(2.0, title="Trailing Stop (R:R)", minval=0)
partial_profit_percentage = input.float(50, title="Take Partial Profit (%)", minval=0, maxval=100)

// Trend Filter Settings
trend_filter_enabled = input.bool(true, title="Trend Filter Enabled")
trend_filter_sensitivity = input.float(50, title="Trend Filter Sensitivity", minval=0, maxval=100)

// Candle Pattern Type for Entry
entry_candle_type = input.string("Any", title="Entry Candle Type", options=["Any", "Engulfing", "Hammer", "Shooting Star", "Doji"])

// Moving Average Entry Conditions
ma_entry_condition = input.string("Both", title="MA Entry", options=["Fast Above Slow", "Fast Below Slow", "Both"])

// Trade Direction (Long, Short, or Both)
trade_direction = input.string("Both", title="Trade Direction", options=["Long", "Short", "Both"])

// ATR Calculation
atr_value = ta.atr(atr_length)

// Moving Average Calculations (using Higher Time Frame)
ma1_htf = ta.sma(request.security(syminfo.tickerid, ma_htf, close), ma1_length)
ma2_htf = ta.sma(request.security(syminfo.tickerid, ma_htf, close), ma2_length)

// Candle Pattern Conditions
is_engulfing = close[1] < open[1] and close > open and high > high[1] and low < low[1]
is_hammer = (high - low) > 3 * (close - open) and (close > open) and (low == ta.lowest(low, 5))
is_shooting_star = (high - low) > 3 * (open - close) and (open > close) and (high == ta.highest(high, 5))
is_doji = (close - open) <= ((high - low) * 0.1)

// Apply the selected candle pattern
candle_condition = false
if entry_candle_type == "Any"
    candle_condition := true
if entry_candle_type == "Engulfing"
    candle_condition := is_engulfing
if entry_candle_type == "Hammer"
    candle_condition := is_hammer
if entry_candle_type == "Shooting Star"
    candle_condition := is_shooting_star
if entry_candle_type == "Doji"
    candle_condition := is_doji

// Moving Average Entry Conditions
ma_cross_above = ta.crossover(ma1_htf, ma2_htf)
ma_cross_below = ta.crossunder(ma1_htf, ma2_htf)

// Calculate pips distance to MAs and normalize it for signal intensity
pip_size = syminfo.mintick * 10  // Assuming Forex; for other asset classes, modify as needed

// Calculate distances in pips between price and MAs
distance_to_ma1_pips = math.abs(close - ma1_htf) / pip_size
distance_to_ma2_pips = math.abs(close - ma2_htf) / pip_size

// Calculate signal intensity based on the pips distance
// Normalize the signal intensity between the user-specified min and max
signal_intensity = math.min(math.max((distance_to_ma1_pips + distance_to_ma2_pips), signal_intensity_min), signal_intensity_max)

// Trend Filter Condition (Optional)
trend_condition = false
if trend_filter_enabled
    trend_condition := ta.sma(close, ma2_length) > ta.sma(close, ma2_length + int(trend_filter_sensitivity))

// Entry Conditions Based on MA, Candle Patterns, and Trade Direction
long_condition = (trade_direction == "Long" or trade_direction == "Both") and (ma_entry_condition == "Fast Above Slow" or ma_entry_condition == "Both") and ma_cross_above and candle_condition and (not trend_filter_enabled or trend_condition) and signal_intensity > signal_intensity_min
short_condition = (trade_direction == "Short" or trade_direction == "Both") and (ma_entry_condition == "Fast Below Slow" or ma_entry_condition == "Both") and ma_cross_below and candle_condition and (not trend_filter_enabled or not trend_condition) and signal_intensity > signal_intensity_min

// Position Sizing Based on Risk Per Trade and ATR for Stop Loss
risk_amount = account_size * risk_per_trade
stop_loss_atr = atr_multiplier_stop * atr_value

// Calculate the position size based on the risk amount and ATR stop loss
position_size = risk_amount / stop_loss_atr

// If compounded results are not enabled, adjust position size for non-compounded returns
if not compounded_results
    position_size := position_size / account_size * 100000  // Adjust for non-compounded results

// Convert take profit and stop loss from ATR to USD
pip_value = syminfo.mintick * 10  // Assuming Forex; for other asset classes, modify as needed
take_profit_atr = atr_multiplier_take_profit * atr_value
take_profit_usd = (take_profit_atr * pip_value) * position_size
stop_loss_usd = (stop_loss_atr * pip_value) * position_size

// Trailing Stop
trail_stop_level = trailing_stop_rr * stop_loss_atr

// Initialize long_box_id and short_box_id as boxes (not ints)
var box long_box_id = na
var box short_box_id = na

// Track Monthly Profit
var float monthly_profit = 0.0
if (month(timenow) != month(timenow[1]))  // New month
    monthly_profit := 0

// Long Trade Management
if long_condition
    strategy.entry("Long", strategy.long, qty=position_size)
    // Partial Profit at 50% position close when 1:1 risk/reward
    strategy.exit("Partial Profit", from_entry="Long", limit=strategy.position_avg_price + stop_loss_atr, qty_percent=partial_profit_percentage / 100)
    // Full take profit and stop loss with trailing stop
    strategy.exit("Take Profit Long", from_entry="Long", limit=strategy.position_avg_price + take_profit_atr, stop=strategy.position_avg_price - stop_loss_atr, trail_offset=trail_stop_level)

    // Delete the old box if it exists
    if not na(long_box_id)
        box.delete(long_box_id)
    
    // Plot Take Profit and Stop Loss for Long Positions
    // long_box_id := box.new(left=bar_index - 1, top=strategy.position_avg_price + take_profit_atr, right=bar_index, bottom=strategy.position_avg_price - stop_loss_atr, bgcolor=color.new(color.green, 90), border_width=1, border_color=color.new(color.green, 0))

// Short Trade Management
if short_condition
    strategy.entry("Short", strategy.short, qty=position_size)
    // Partial Profit at 50% position close when 1:1 risk/reward
    strategy.exit("Partial Profit", from_entry="Short", limit=strategy.position_avg_price - stop_loss_atr, qty_percent=partial_profit_percentage / 100)
    // Full take profit and stop loss with trailing stop
    strategy.exit("Take Profit Short", from_entry="Short", limit=strategy.position_avg_price - take_profit_atr, stop=strategy.position_avg_price + stop_loss_atr, trail_offset=trail_stop_level)

    // Delete the old box if it exists
    // if not na(short_box_id)
    //     box.delete(short_box_id)

    // Plot Take Profit and Stop Loss for Short Positions
    // short_box_id := box.new(left=bar_index - 1, top=strategy.position_avg_price + stop_loss_atr, right=bar_index, bottom=strategy.position_avg_price - take_profit_atr, bgcolor=color.new(color.red, 90), border_width=1, border_color=color.new(color.red, 0))

// Plot MAs and Signals
plot(ma1_htf, color=color.blue, title="MA1 (HTF)")
plot(ma2_htf, color=color.red, title="MA2 (HTF)")
plotshape(series=long_condition, location=location.belowbar, color=color.green, style=shape.labelup, title="Buy Signal", text="BUY")
plotshape(series=short_condition, location=location.abovebar, color=color.red, style=shape.labeldown, title="Sell Signal", text="SELL")