부피 MA 기반의 적응형 피라미딩 동적 스톱 로스 및 취득 거래 전략

저자:차오장, 날짜: 2024-04-12 16:19:20
태그:HMAMACDATRRSIOBVVMA

img

전반적인 설명

이 전략은 헐 이동 평균 (HMA), 이동 평균 컨버전스 디버전스 (MACD), 평균 진실 범위 (ATR), 상대 강도 지수 (RSI), 균형 부피 (OBV), 및 부피 이동 평균) 를 포함한 여러 기술적 지표를 결합합니다. 이러한 지표를 포괄적으로 분석함으로써 전략은 시장 트렌드와 잠재적 진입 기회를 식별하는 것을 목표로합니다. 또한 전략은 피라미딩, 동적 스톱 손실 및 수익 취득 및 트레일 스톱 손실과 같은 위험 관리 기술을 사용하여 위험을 엄격하게 제어하면서 트렌드 기회를 포착합니다.

전략 원칙

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


관련

더 많은