리소스 로딩... 로딩...

다중 MA 트렌드 강도 거래 전략 - MA 오차에 기반한 유연한 스마트 거래 시스템

저자:차오장, 날짜: 2024-12-11 17:46:33
태그:MAATRHTFRRTPSL

img

전반적인 설명

이 전략은 여러 이동 평균과 트렌드 강도를 기반으로 하는 지능형 거래 시스템이다. 이 전략은 포지션 관리 및 위험 통제를 위한 ATR 변동성 지표와 결합하여 다른 기간의 가격과 이동 평균 사이의 오차를 분석하여 시장 트렌드 강도를 측정한다. 이 전략은 높은 사용자 정의성을 제공하며 다른 시장 환경과 거래 필요에 따라 매개 변수를 유연하게 조정할 수 있다.

전략 원칙

전략의 핵심 논리는 다음 측면에 기초합니다.

  1. 트렌드 방향과 교차 신호를 식별하기 위해 서로 다른 기간의 두 개의 이동 평균 (고속 및 느린) 을 사용합니다.
  2. 가격과 이동 평균 사이의 오차를 계산하여 트렌드 강도를 정량화합니다 (점으로)
  3. 확증 신호로 촛불 패턴을 포함합니다. (물망, 망치, 내리는 별, 도지)
  4. ATR 지표를 사용하여 스톱 로스 및 수익 목표를 동적으로 계산합니다.
  5. 주문 관리에 부분 이익과 후속 중지 사용

전략적 장점

  1. 시스템은 다른 시장 환경에 대한 매개 변수 조정을 통해 강력한 적응력을 가지고 있습니다.
  2. 약한 트렌드에서 빈번한 거래를 피하기 위해 오차 측정을 통해 트렌드 강도를 정량화합니다.
  3. 신호 신뢰성을 향상시키기 위해 여러 가지 기술 지표와 패턴을 결합합니다.
  4. 적당한 위험 통제를 위해 ATR 기반의 동적 스톱 손실을 사용합니다.
  5. 화합물 및 고정 위치 사이징 방법 모두 지원
  6. 이윤을 효과적으로 보호하기 위한 부분적인 수익 취득 및 후속 중단

전략 위험

  1. 범위 시장에서 잘못된 신호를 생성 할 수 있습니다, 오시레이터 필터를 추가하는 것을 고려
  2. 여러 지표 조합은 일부 거래 기회를 놓칠 수 있습니다.
  3. 매개 변수의 과도한 최적화는 과도한 적합 위험으로 이어질 수 있습니다.
  4. 유동성이 낮은 시장에서 큰 거래는 미끄러짐 위험이 발생할 수 있습니다.
  5. 과도한 단일 손실을 피하기 위해 적절한 스톱 손실 설정을 요구합니다.

전략 최적화

  1. 부가적인 트렌드 확인으로 부피 지표를 추가할 수 있습니다.
  2. 거래 빈도를 동적으로 조정하기 위해 변동성 지표를 도입하는 것을 고려하십시오.
  3. 다른 시간 프레임에 걸쳐 트렌드 일관성을 기반으로 신호를 필터링
  4. 시간 기반 스톱과 같은 더 많은 스톱 손실 옵션을 추가합니다.
  5. 전략의 적응성을 향상시키기 위한 적응적 매개 변수 최적화 메커니즘을 개발

요약

이 전략은 이동 평균, 트렌드 강도 정량화, 촛불 패턴 및 동적 리스크 관리 등을 결합하여 포괄적인 거래 시스템을 구축합니다. 여러 확인 메커니즘을 통해 거래 신뢰성을 향상시키는 동시에 전략적 단순성을 유지합니다. 이 전략의 높은 사용자 정의 가능성은 다른 거래 스타일과 시장 환경에 적응 할 수 있지만 구현 중에 매개 변수 최적화 및 리스크 제어에주의를 기울여야합니다.


/*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")


관련

더 많은