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

포지션 스케일링과 함께 멀티-RSI-EMA 모멘텀 헤딩 전략

저자:차오장, 날짜: 2024-12-04 15:41:10
태그:RSIEMATPSL

img

전반적인 설명

이 전략은 RSI 지표와 EMA 이동 평균을 기반으로 한 모멘텀 헤지 트레이딩 전략이다. 이 전략은 시장 트렌드 역전 기회를 포착하기 위해 트리플 EMA 라인 (50, 100, 200) 과 결합한 이중 RSI 기간 (RSI-14 및 RSI-2) 을 활용하여 동적 위치 관리를 통해 헤지를 구현합니다. 전략의 핵심 특징은 입시 조건이 충족되면 점수를 점차 증가시키고, RSI 과잉 구매 / 과잉 판매 수준에 기반한 수익 취득 조건을 제공합니다.

전략 원칙

이 전략은 거래 신호를 결정하기 위해 EMA-50, EMA-100 및 EMA-200와 함께 서로 다른 기간으로 RSI-14 및 RSI-2를 사용합니다. 긴 조건은 31 이하의 RSI-14와 10 이상의 RSI-2를 넘어야하며, EMA는 하향 정렬에 있어야합니다 (EMA-50 < EMA-100 < EMA-200). 짧은 조건은 반대이며, RSI-14가 69 이상과 RSI-2가 90 이하의 EMA를 필요로하며, EMA는 상승 정렬 (EMA-50 > EMA-100 > EMA-200) 에 있습니다. 전략은 20x 레버리지를 사용하고 현재 자본에 기반하여 거래량을 동적으로 계산합니다. 현재 위치 크기의 두 배로 새로운 포지션이 열립니다. 수익 조건은 RSI 지표 역변 브레이크에 따라 설정됩니다.

전략적 장점

  1. 여러 기술 지표의 교차 검증은 신호 신뢰성을 향상시킵니다.
  2. 역동적인 위치 관리로 유연한 포트폴리오 조정이 가능합니다.
  3. 양방향 거래 메커니즘은 양방향에서 수익을 창출 할 수 있습니다.
  4. 적응적인 수익 조건은 조기 퇴출을 방지합니다.
  5. 거래 신호와 시장 조건을 보여주는 명확한 그래픽 인터페이스
  6. 피보험 메커니즘은 방향적인 위험 노출을 줄여줍니다.
  7. 더 나은 위험 통제를 위해 주식 기반의 동적 지위 계산

전략 위험

  1. 높은 레버리지 (20배) 는 상당한 청산 위험을 초래할 수 있습니다.
  2. 시장의 변동성 중 급격한 손실을 초래할 수 있습니다.
  3. 스톱 로스 조건이 없는 경우 지속적인 마취 위험이 발생할 수 있습니다.
  4. RSI 지표는 다양한 시장에서 잘못된 신호를 생성 할 수 있습니다.
  5. 여러 가지 기술 지표 조합은 거래 기회를 줄일 수 있습니다.
  6. 포지션 관리 방법은 연속 거래에서 과도한 위험을 축적할 수 있습니다.

전략 최적화 방향

  1. ATR 또는 변동성에 기반한 적응식 스톱 로스 메커니즘을 도입
  2. 시장 변동성에 기초한 동적 조정으로 레버리지 곱셈을 최적화합니다.
  3. 낮은 변동성 기간 동안 거래를 피하기 위해 시간 필터를 추가합니다.
  4. 신호 신뢰성을 향상시키기 위해 볼륨 표시기를 통합하십시오.
  5. 최대 포지션 제한과 함께 위치 인크리멘트 인플리셔를 최적화
  6. 약한 트렌드에서 거래를 피하기 위해 트렌드 강도 필터를 추가합니다.
  7. 매일 최대 손실 제한으로 위험 관리 개선

요약

이 포괄적인 전략은 트레이딩 정확성을 향상시키기 위해 여러 기술적 지표를 사용하여 모멘텀과 트렌드를 결합합니다. 전략은 역동적인 포지션 관리 및 헤지 메커니즘을 통해 혁신하지만 상당한 위험을 안고 있습니다. 리스크 제어 메커니즘의 최적화 및 추가 필터의 도입을 통해이 전략은 라이브 트레이딩에서 더 나은 성능을 발휘할 가능성이 있습니다. 라이브 구현 전에 철저한 백테스팅과 매개 변수 최적화가 권장됩니다.


/*backtest
start: 2024-11-26 00:00:00
end: 2024-12-03 00:00:00
period: 10m
basePeriod: 10m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Custom RSI EMA Strategy Hedge", overlay=true, default_qty_type=strategy.fixed, default_qty_value=1)

// Definování vstupních podmínek
rsi_14 = ta.rsi(close, 14)
rsi_2 = ta.rsi(close, 2)
ema_50 = ta.ema(close, 50)
ema_100 = ta.ema(close, 100)
ema_200 = ta.ema(close, 200)

// Pákový efekt
leverage = 20

// Podmínky pro long pozici
longCondition = (rsi_14[1] < 31) and ta.crossover(rsi_2, 10) and (ema_50 < ema_100) and (ema_100 < ema_200)

// Podmínky pro short pozici
shortCondition = (rsi_14[1] > 69) and ta.crossunder(rsi_2, 90) and (ema_50 > ema_100) and (ema_100 > ema_200)

// Identifikátory pozic
long_id = "Long"
short_id = "Short"

// Definování průměrné ceny pozice pro long a short
var float long_avg_price = na
var float short_avg_price = na

// Sledujeme, zda se velikost pozice změnila
var float last_long_position_size = na
var float last_short_position_size = na

// Přerušení průměrné ceny pozice při změně pozice
if (last_long_position_size != strategy.position_size and strategy.position_size > 0)
    long_avg_price := na
if (last_short_position_size != strategy.position_size and strategy.position_size < 0)
    short_avg_price := na

// Aktualizace průměrné ceny pozice
if (strategy.position_size > 0)
    long_avg_price := strategy.position_avg_price
else
    long_avg_price := na

if (strategy.position_size < 0)
    short_avg_price := strategy.position_avg_price
else
    short_avg_price := na

// Uložení aktuální velikosti pozice pro příští bar
if (strategy.position_size > 0)
    last_long_position_size := strategy.position_size
else if (strategy.position_size < 0)
    last_short_position_size := strategy.position_size

// Podmínky pro take profit
takeProfitLongCondition = (rsi_14 > 69) and (rsi_2 > 90) and (long_avg_price < close)
takeProfitShortCondition = (rsi_14 < 31) and (rsi_2 < 10) and (short_avg_price > close)

// Velikost pozice
new_long_position_size = strategy.position_size == 0 ? na : math.abs(strategy.position_size) * 2
new_short_position_size = strategy.position_size == 0 ? na : math.abs(strategy.position_size) * 2

// Úprava velikosti pozice s ohledem na pákový efekt
position_value = strategy.equity * leverage
trade_qty_long = position_value / close
trade_qty_short = position_value / close

// Vstup do long pozice s dvojnásobkem aktuální pozice nebo standardní velikostí při první pozici
if (longCondition)
    strategy.entry(long_id, strategy.long, qty=new_long_position_size == na ? trade_qty_long : new_long_position_size)

// Vstup do short pozice s dvojnásobkem aktuální pozice nebo standardní velikostí při první pozici
if (shortCondition)
    strategy.entry(short_id, strategy.short, qty=new_short_position_size == na ? trade_qty_short : new_short_position_size)

// Výstup z long pozice při splnění podmínek pro take profit
if (takeProfitLongCondition)
    strategy.close(long_id)

// Výstup z short pozice při splnění podmínek pro take profit
if (takeProfitShortCondition)
    strategy.close(short_id)

// Zvýraznění části grafu, kde platí podmínky pro long
highlightLongCondition = (ema_50 < ema_100) and (ema_100 < ema_200)
bgcolor(highlightLongCondition ? color.new(color.green, 90) : na)

// Zvýraznění části grafu, kde platí podmínky pro short
highlightShortCondition = (ema_50 > ema_100) and (ema_100 > ema_200)
bgcolor(highlightShortCondition ? color.new(color.red, 90) : na)

// Přidání bodů pozic do grafu
plotshape(series=longCondition, location=location.belowbar, color=color.green, style=shape.labelup, text="L")
plotshape(series=shortCondition, location=location.abovebar, color=color.red, style=shape.labeldown, text="S")

// Vykreslení průměrné ceny pozice pro long a short pouze pokud pozice existuje
plot(strategy.position_size > 0 ? long_avg_price : na, title="Long Avg Price", color=color.blue, linewidth=2)
plot(strategy.position_size < 0 ? short_avg_price : na, title="Short Avg Price", color=color.orange, linewidth=2)

// Zvýraznění čtverců pro RSI14 > 70 (červeně) a RSI14 < 30 (zeleně)
var int rsi_above_70_start = na
var int rsi_below_30_start = na

var float top_value_above_70 = na
var float bottom_value_above_70 = na

var float top_value_below_30 = na
var float bottom_value_below_30 = na

// Identifikace začátku a konce období pro RSI14 > 70
if (rsi_14[1] > 70 and rsi_14[2] > 70)
    if na(rsi_above_70_start)
        rsi_above_70_start := bar_index
        top_value_above_70 := high
        bottom_value_above_70 := low
    else
        top_value_above_70 := math.max(top_value_above_70, high)
        bottom_value_above_70 := math.min(bottom_value_above_70, low)
else
    if not na(rsi_above_70_start)
        // box.new(left = rsi_above_70_start, right = bar_index - 1, top = top_value_above_70, bottom = bottom_value_above_70, border_color = color.red, border_width = 2, bgcolor=color.new(color.red, 90))
        rsi_above_70_start := na
        top_value_above_70 := na
        bottom_value_above_70 := na

// Identifikace začátku a konce období pro RSI14 < 30
if (rsi_14[1] < 30 and rsi_14[2] < 30)
    if na(rsi_below_30_start)
        rsi_below_30_start := bar_index
        top_value_below_30 := high
        bottom_value_below_30 := low
    else
        top_value_below_30 := math.max(top_value_below_30, high)
        bottom_value_below_30 := math.min(bottom_value_below_30, low)
else
    if not na(rsi_below_30_start)
        // box.new(left = rsi_below_30_start, right = bar_index - 1, top = top_value_below_30, bottom = bottom_value_below_30, border_color = color.green, border_width = 2, bgcolor=color.new(color.green, 90))
        rsi_below_30_start := na
        top_value_below_30 := na
        bottom_value_below_30 := na


관련

더 많은