동적 회전 대역에 기반한 트렌드 추적 전략

저자:차오장, 날짜: 2023-12-26 11:57:20
태그:

img

전반적인 설명

이 전략은 동적 중간선을 형성하기 위해 특정 기간 동안의 최근 최고 및 최저 가격을 계산하고, 현재 가격과 결합하여 동적 중간선을 형성합니다. 빨간 하향 채널과 녹색 상승 채널은 최근 변동성에 따라 생성됩니다. 세 개의 채널 라인은 거래 가능한 범위를 형성합니다. 가격이 채널 경계에 접근하면 중간선으로 수익을 다시 목표로하는 역작업이 수행됩니다. 한편, 트렌드에 대한 거래를 필터링하고 주요 트렌드에 의해 파괴되는 것을 피하기 위해 전략 내부에는 트렌드 계산이 있습니다.

전략 논리

  1. 최근 최고 가격, 최저 가격 및 현재 폐쇄 가격과 동적 중간 라인을 계산
  2. ATR 및 멀티플리커에 기반한 동적 대역을 생성하고 시장 변동성과 함께 폭 변경
  3. 가격이 하위 지대에서 반등될 때 길게, 상위 지대에서 반등될 때 짧게
  4. 중간선을 겨냥하는 수익을 취하고 손실을 멈추는 논리가 있습니다
  5. 한편 트렌드 인덱스를 계산하여 트렌드에 대한 거래를 필터합니다.

이점 분석

  1. 동적 대역은 실시간 시장 변동에 적응합니다.
  2. 트렌드를 따라 거래될 확률이 높습니다.
  3. 스톱 손실 제어 단수 손실

위험 분석

  1. 부적절한 매개 변수 최적화는 과잉 거래로 이어질 수 있습니다.
  2. 주요 트렌드 하에서 역동적인 거래를 완전히 제거 할 수 없습니다.
  3. 일방적인 탈출은 계속 될 수 있습니다.

최적화 방향

  1. 다른 제품에 맞게 대역의 매개 변수를 조정
  2. 트렌드 트레이딩 확률을 향상시키기 위해 트렌드 인덱스 매개 변수를 세밀하게 조정
  3. 동적 매개 변수 최적화를 위한 기계 학습 요소를 도입

요약

이 전략은 주로 수익을 창출하기 위해 시장의 변동에 의존한다. 트렌드 필터링과 결합하여 밴드와 함께 가격 반전 지점을 동적으로 캡처함으로써 위험을 제어하면서 평균 반전에서 효과적으로 이익을 얻을 수 있다. 핵심은 밴드를 반응적이면서도 과민하지 않도록 매개 변수 조정에 있다. 트렌드 인덱스는 또한 역할을 수행하기 위해 적절한 기간을 필요로 한다. 이론적으로 유리한 트렌드와 정지와 함께 이 전략은 최적화를 통해 괜찮은 수익을 얻을 수 있다.


/*backtest
start: 2023-11-25 00:00:00
end: 2023-12-25 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="Strategy - Bobo PAPATR", overlay=true, default_qty_type = strategy.fixed, default_qty_value = 1, initial_capital = 10000)

// === STRATEGY RELATED INPUTS AND LOGIC ===
len = input(24, minval=1, title="Pivot Length, defines lookback for highs and lows to make pivots")
length = input(title="ATR lookback (Lower = bands more responsive to recent price action)", type=input.integer, defval=22)
myatr = atr(length)
dailyatr = myatr[1]
atrmult = input(title="ATR multiplier (Lower = wider bands)", type=input.float, defval=3)
pivot0 = (high[1] + low[1]  + close[1]) / 3

// PIVOT CALC
h = highest(len)
h1 = dev(h, len) ? na : h
hpivot = fixnan(h1)
l = lowest(len)
l1 = dev(l, len) ? na : l
lpivot = fixnan(l1)
pivot = (lpivot + hpivot + pivot0) / 3
upperband1 = (dailyatr * atrmult) + pivot
lowerband1 = pivot - (dailyatr * atrmult)
middleband = pivot

// == TREND CALC ===
i1=input(2, "Momentum Period", minval=1) //Keep at 2 usually
i2=input(20, "Slow Period", minval=1)
i3=input(5, "Fast Period", minval=1)
i4=input(3, "Smoothing Period", minval=1)
i5=input(4, "Signal Period", minval=1)
i6=input(50, "Extreme Value", minval=1)
hiDif = high - high[1]
loDif = low[1] - low
uDM = hiDif > loDif and hiDif > 0 ? hiDif : 0
dDM =  loDif > hiDif and loDif > 0 ? loDif : 0
ATR = rma(tr(true), i1)
DIu = 100 * rma(uDM, i1) / ATR
DId = 100 * rma(dDM, i1) / ATR
HLM2 =  DIu - DId
DTI = (100 * ema(ema(ema(HLM2, i2), i3), i4)) /  ema(ema(ema(abs(HLM2), i2), i3), i4)
signal = ema(DTI, i5)


// === RISK MANAGEMENT INPUTS ===
inpTakeProfit   = input(defval = 0, title = "Take Profit (In Market MinTick Value)", minval = 0)
inpStopLoss     = input(defval = 100, title = "Stop Loss (In Market MinTick Value)", minval = 0)

// === RISK MANAGEMENT VALUE PREP ===
// if an input is less than 1, assuming not wanted so we assign 'na' value to disable it.
useTakeProfit   = inpTakeProfit  >= 1 ? inpTakeProfit  : na
useStopLoss     = inpStopLoss    >= 1 ? inpStopLoss    : na

// === STRATEGY - LONG POSITION EXECUTION ===
enterLong = (((low<=lowerband1) and (close >lowerband1)) or ((open <= lowerband1) and (close > lowerband1))) and (strategy.opentrades <1) and (atr(3) > atr(50)) and (signal>signal[3])
exitLong = (high > middleband)
strategy.entry(id = "Long", long = true, when = enterLong) 
strategy.close(id = "Long", when = exitLong)

// === STRATEGY - SHORT POSITION EXECUTION ===
enterShort = (((high>=upperband1) and (close < upperband1)) or ((open >= upperband1) and (close < upperband1))) and (strategy.opentrades <1) and (atr(3) > atr(50)) and (signal<signal[3])
exitShort = (low < middleband)
strategy.entry(id = "Short", long = false, when = enterShort)
strategy.close(id = "Short", when = exitShort)

// === STRATEGY RISK MANAGEMENT EXECUTION ===
strategy.exit("Exit Long", from_entry = "Long", profit = useTakeProfit, loss = useStopLoss)
strategy.exit("Exit Short", from_entry = "Short", profit = useTakeProfit, loss = useStopLoss)

// === CHART OVERLAY ===
plot(upperband1, color=#C10C00, linewidth=3)
plot(lowerband1, color=#23E019, linewidth=3)
plot(middleband, color=#00E2E2, linewidth=3)
//plot(strategy.equity, title="equity", color=red, linewidth=2, style=areabr)

더 많은