볼륨 이동 평균을 기반으로 한 적응형 피라미드 동적 손절매 및 손절매 거래 전략

HMA MACD ATR RSI OBV VMA
생성 날짜: 2024-04-12 16:19:20 마지막으로 수정됨: 2024-04-12 16:19:20
복사: 1 클릭수: 651
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

볼륨 이동 평균을 기반으로 한 적응형 피라미드 동적 손절매 및 손절매 거래 전략

개요

이 전략은 헐 이동 평균 (Hull moving average, HMA), 이동 평균 수렴 분산 지표 (MACD), 평균 실제 범위 (Average true range, ATR), 상대적으로 강한 지수 (RSI), 에너지 물결 (Energy wave, OBV) 및 거래량 이동 평균 (Trading volume moving average, TMA) 등의 여러 기술 지표를 결합하여 이러한 지표의 통합 분석을 통해 시장 추세와 잠재적인 진입 기회를 식별합니다. 이 전략은 또한 피라미드 가중점, 동적 손실 스톱 및 이동 스톱과 같은 손실 관리 수단을 채택하여 트렌드 기회를 파악하는 동시에 위험을 엄격하게 통제합니다.

전략 원칙

  1. HMA, MACD, ATR, RSI, OBV 및 거래량 이동 평균을 계산합니다.
  2. MACD 빠른 느린 선의 교차, OBV와 이동 평균의 관계, RSI 수준 및 거래량과 평균 선의 비교를 통해 공허 조건을 판단합니다.
  3. 최대 피라미드 포지션 수와 포지션 비율을 설정하고, 추세가 지속될 때 점진적으로 포지션을 추가합니다.
  4. ATR에 따라 동적으로 중지 및 중지 수준을 조정하고 이동 중지 전략을 사용하여 수익을 보호하십시오.
  5. 계정 이자, 리스크 비율 및 ATR을 기반으로 매번 포지션 개시량 계산하여 포지션 보유 포지션을 동적으로 제어합니다.
  6. 그래프에 스톱 로즈 스톱 의 수평선을 그리며, 위험 제어 상황을 직관적으로 표시합니다.

전략적 이점

  1. 다중 지표 포트폴리오 판단, 신호 신뢰도를 향상: 이 전략은 가격, 경향, 운동 및 거래량과 같은 여러 측면의 요소를 종합적으로 고려하여 여러 지표의 공동 확인을 통해 거래 신호의 신뢰도를 향상시킵니다.
  2. 적응형 포지션 관리, 동적 제어 위험: 계정 권익, 위험 비율 및 ATR과 같은 요인에 따라, 전략은 포지션 개설 때마다 포지션을 동적으로 조정할 수 있으며, 시장의 변동이 심해지면 자동으로 포지션을 줄여서 위험을 효과적으로 제어 할 수 있습니다.
  3. 피라미드 포지션, 트렌드 기회를 최대한 활용: 트렌드가 확립된 후, 전략은 단계적으로 포지션을 높여서 트렌드 상황에 최대한 참여하여 전략의 수익성을 향상시킵니다.
  4. 동적 중지 손실, 적시에 손실을 제어하고 이익을 보호: 전략은 ATR의 변화에 따라 실시간으로 중지 손실 수준을 조정하고, 트렌드 반전 시 적시에 중지하며, 이동 중지 전략으로 얻은 이익을 지속적으로 보호하여 전략의 철수를 효과적으로 감소시킵니다.
  5. 직관적인 차트는 모니터링과 의사 결정을 용이하게 합니다. 전략은 중요한 지표와 중단 중단 수평선을 차트에 그려서 거래자가 시장의 움직임과 전략의 수행을 직관적으로 모니터링 할 수 있도록합니다.

전략적 위험

  1. 매개 변수 최적화 위험: 이 전략에는 여러 개의 매개 변수가 포함되어 있으며, 매개 변수 선택이 잘못되면 전략의 성능이 좋지 않을 수 있습니다. 따라서 실제 응용에서는 매개 변수를 최적화하고 테스트하여 전략의 안정성을 보장해야합니다.
  2. 시장 환경 변화 위험: 전략은 역사적 데이터에 기반하여 재검토 및 최적화되지만 시장 환경이 변경되어 전략의 미래 성과와 역사 성과에 큰 차이가 발생할 수 있습니다. 따라서 전략의 성능을 정기적으로 평가하고 필요한 경우 조정해야합니다.
  3. 검은 천둥 사건 위험: 극단적 인 시장 상황 (예: 태풍의 폭락) 은 전략에 큰 회전을 초래할 수 있습니다. 이러한 위험에 대응하기 위해, 최대 회수 마이너스를 설정하고 마이너스가 도달하면 거래를 중단하는 것과 같은 전략에 더 많은 위험 제어 조치를 추가하는 것이 고려 될 수 있습니다.
  4. 지나친 적합성 위험: 전략의 매개 변수가 너무 복잡하면, 지나친 적합성이 발생할 수 있습니다. 즉, 전략은 역사적 데이터에서 잘 작동하지만 실제 응용에서는 잘 작동하지 않습니다. 지나친 적합성을 피하기 위해, 상호 검증과 같은 방법을 사용하여 전략을 평가 할 수 있습니다.

전략 최적화 방향

  1. 동적 변수 최적화: 기계 학습과 같은 방법을 사용하여 시장 환경의 변화에 따라 전략 변수를 실시간으로 조정하여 전략의 적응성을 향상시키는 방법을 고려하십시오.
  2. 다 시장 다 품종 적용성: 전략이 더 많은 시장과 품종으로 확장되어 분산 투자를 통해 전략의 안정성을 높인다.
  3. 기본적 분석과 결합: 기술 분석을 기반으로, 거시 경제, 산업 추세와 같은 기본적 요소를 고려하여 전략의 포괄성을 향상시킵니다.
  4. 시장 감정 분석에 추가: 공포 지수와 같은 시장 감정 지표를 도입하여 시장 감정의 극단적인 변화를 포착하여 전략에 더 많은 거래 기회를 제공합니다.
  5. 위험 제어 조치를 최적화: 위험 제어 시스템을 더 개선하여, 손해 방지 전략의 적응 조정 메커니즘을 도입하고, 전략의 위험 관리 능력을 향상시킵니다.

요약하다

이 전략은 다중 지표 조합, 자기 적응 포지션 관리, 피라미드 부가 포지션, 다이내믹 스톱 스과 같은 방법을 통해 트렌드 기회를 잡는 동시에 위험을 엄격하게 제어하고, 일정 수준의 안정성과 수익성을 갖는다. 그러나 전략에는 파라미터 최적화, 시장 환경 변화, 블랙 스윙 사건 등의 위험이 존재하며, 실제 응용에서 지속적인 최적화와 개선이 필요하다.

전략 소스 코드
/*backtest
start: 2023-04-06 00:00:00
end: 2024-04-11 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Enhanced Trading Strategy v5 with Visible SL/TP", overlay=true)

// Input settings
hma_length = input(9, title="HMA Length")
fast_length = input(12, title="MACD Fast Length")
slow_length = input(26, title="MACD Slow Length")
siglen = input(9, title="Signal Smoothing")
atr_length = input(14, title="ATR Length")
rsi_length = input(14, title="RSI Length")
obv_length = input(10, title="OBV Length")
volume_ma_length = input(10, title="Volume MA Length")

// Pyramiding inputs
max_pyramid_positions = input(3, title="Max Pyramid Positions")
pyramid_factor = input(0.5, title="Pyramid Factor")

// Risk and Reward Management Inputs
risk_per_trade = input(1.0, title="Risk per Trade (%)")
atr_multiplier_for_sl = input(1.5, title="ATR Multiplier for Stop Loss")
atr_multiplier_for_tp = input(3.0, title="ATR Multiplier for Take Profit")
trailing_atr_multiplier = input(2.0, title="ATR Multiplier for Trailing Stop")

// Position sizing functions
calc_position_size(equity, risk_pct, atr) =>
    pos_size = (equity * risk_pct / 100) / (atr_multiplier_for_sl * atr)
    pos_size

calc_pyramid_size(current_size, max_positions) =>
    pyramid_size = current_size * (max_positions - strategy.opentrades) / max_positions
    pyramid_size

// Pre-calculate lengths for HMA
half_length = ceil(hma_length / 2)
sqrt_length = round(sqrt(hma_length))

// Calculate indicators
hma = wma(2 * wma(close, half_length) - wma(close, hma_length), sqrt_length)
my_obv = cum(close > close[1] ? volume : close < close[1] ? -volume : 0)
obv_sma = sma(my_obv, obv_length)
[macd_line, signal_line, _] = macd(close, fast_length, slow_length, siglen)
atr = atr(atr_length)
rsi = rsi(close, rsi_length)
vol_ma = sma(volume, volume_ma_length)

// Conditions
long_condition = crossover(macd_line, signal_line) and my_obv > obv_sma and rsi > 50 and volume > vol_ma
short_condition = crossunder(macd_line, signal_line) and my_obv < obv_sma and rsi < 50 and volume > vol_ma

// Strategy Entry with improved risk-reward ratio
var float long_take_profit = na
var float long_stop_loss = na
var float short_take_profit = na
var float short_stop_loss = na

if (long_condition)
    size = calc_position_size(strategy.equity, risk_per_trade, atr)
    strategy.entry("Long", strategy.long, qty = size)
    long_stop_loss := close - atr_multiplier_for_sl * atr
    long_take_profit := close + atr_multiplier_for_tp * atr
    
if (short_condition)
    size = calc_position_size(strategy.equity, risk_per_trade, atr)
    strategy.entry("Short", strategy.short, qty = size)
    short_stop_loss := close + atr_multiplier_for_sl * atr
    short_take_profit := close - atr_multiplier_for_tp * atr

// Drawing the SL/TP lines
// if (not na(long_take_profit))
//     line.new(bar_index[1], long_take_profit, bar_index, long_take_profit, width = 2, color = color.green)
//     line.new(bar_index[1], long_stop_loss, bar_index, long_stop_loss, width = 2, color = color.red)

// if (not na(short_take_profit))
//     line.new(bar_index[1], short_take_profit, bar_index, short_take_profit, width = 2, color = color.green)
//     line.new(bar_index[1], short_stop_loss, bar_index, short_stop_loss, width = 2, color = color.red)

// Pyramiding logic
if (strategy.position_size > 0)
    if (close > strategy.position_avg_price * (1 + pyramid_factor))
        strategy.entry("Long Add", strategy.long, qty = calc_pyramid_size(strategy.position_size, max_pyramid_positions))

if (strategy.position_size < 0)
    if (close < strategy.position_avg_price * (1 - pyramid_factor))
        strategy.entry("Short Add", strategy.short, qty = calc_pyramid_size(-strategy.position_size, max_pyramid_positions))

// Trailing Stop
strategy.exit("Trailing Stop Long", "Long", trail_points = atr * trailing_atr_multiplier, trail_offset = atr * trailing_atr_multiplier)
strategy.exit("Trailing Stop Short", "Short", trail_points = atr * trailing_atr_multiplier, trail_offset = atr * trailing_atr_multiplier)

// Plots
plot(hma, title="HMA", color=color.blue)
plot(obv_sma, title="OBV SMA", color=color.orange)
hline(0, "Zero Line", color=color.gray, linestyle=hline.style_dotted)
plotshape(long_condition, title="Long Entry", location=location.belowbar, color=color.green, style=shape.labelup, text="Long")
plotshape(short_condition, title="Short Entry", location=location.abovebar, color=color.red, style=shape.labeldown, text="Short")