렌코와 상대적 활력 지수를 기반으로 한 추세 추종 전략


생성 날짜: 2024-02-04 15:49:19 마지막으로 수정됨: 2024-02-04 15:49:19
복사: 1 클릭수: 686
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

렌코와 상대적 활력 지수를 기반으로 한 추세 추종 전략

개요

이 전략은 렌코 그래프와 상대적 활력 지수 ((RVI) 두 지표를 결합하여 시장의 주요 추세의 대부분을 포착하는 것을 목표로 한다. 비트코인,恒指 등 주요 품종에 적용된다.

전략 원칙

전략은 9기 ATR을 사용하여 렌코 을 구성하고, 종결 가격이 이전 렌코 의 고점을 초과했을 때 새로운 을 구성하고, 녹색으로 색칠하고, 종결 가격이 이전 렌코 의 저점을 초과했을 때 새로운 을 구성하고, 빨간색으로 색칠한다. RVI 지표와 결합하여 트렌드 방향을 결정한다.

RVI 지표는 다중 머리 힘과 공중 머리 힘의 상대적 강도를 판단하는 데 사용됩니다. RVI 값은 0 ~ 1 사이로 변동하며, 0.5 이상은 다중 머리 힘이 공중 머리보다 강하다는 것을 나타냅니다. 0.5 이하는 공중 머리 힘이 공중 머리보다 강하다는 것을 나타냅니다. RVI 위를 가로지르면 공중 머리 힘이 약해지고 다중 머리 힘이 증가하여 더 많은 신호를 제공합니다.

통합 렌코 방향과 RVI 지표의 다중 코카이 신호, 해당 다중 머리 또는 빈 머리 포지션에 들어갑니다.

전략적 이점

  1. 렌코는 시장의 정상적인 변동성을 격리하고, 더 큰 가격 변동에만 집중하고, 피하는 것을 피한다.
  2. RVI 지표는 트렌드 반전의 시점을 판단하여 거래 신호를 더 잠금합니다.
  3. 두 가지 지표가 결합되어 필터링을 수행하면 시장의 주요 추세를 효과적으로 파악하고 일부 소음을 필터링 할 수 있습니다.

위험 분석

  1. 렌코의 크기는 거래 빈도에 영향을 미치며, 너무 작으면 거래 빈도와 수수료가 증가합니다.
  2. RVI 지표 파라미터를 잘못 설정하면 놓친 신호 또는 확대된 가짜 신호가 발생할 수 있다.
  3. 이중 지수 필터링은 특정 신호를 놓치고 전체 상황을 파악할 수 없습니다.

최적화 방향

  1. 동적으로 최적화된 렌코의 크기가 시장의 변동에 적응할 수 있게 해줍니다.
  2. RVI 지표 파라미터를 최적화하여 최적의 균형점을 찾습니다.
  3. 다양한 품종과 주기적 변수 조합을 시도해 안정성을 평가한다.

요약하다

이 전략은 두 가지 다른 유형의 지표의 장점을 통합하여 시장의 주류 트렌드를 파악하는 것을 목표로합니다. 렌코와 RVI 파라미터를 최적화함으로써 더 높은 안정성을 얻을 수 있습니다. 그러나 어떤 모델도 완벽하지 않으며, 특정 신호를 놓치는 것은 불가피하며, 주요 방향을 파악하는 것이 중요합니다. 사용자는 자신의 위험 선호도를 명확하게 평가하고 자신의 품종과 파라미터에 적합한 선택을해야합니다.

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

//@version=3
strategy("Lancelot RR Strategy", overlay=false)
p=9
CO=close-open
HL=high-low
value1 = (CO + 2*CO[1] + 2*CO[2] + CO[3])/6
value2 = (HL + 2*HL[1] + 2*HL[2] + HL[3])/6
num=sum(value1,p)
denom=sum(value2,p)
RVI=denom!=0?num/denom:0
RVIsig=(RVI+ 2*RVI[1] + 2*RVI[2] + RVI[3])/6

rvicloselongcondition = crossunder(RVI, RVIsig)
rvicloseshortcondition = crossover(RVI, RVIsig)

plot(RVI,color=green,style=line,linewidth=1)
plot(RVIsig,color=red,style=line,linewidth=1)
bgcolor(rvicloseshortcondition ? green : na, transp = 75)
bgcolor(rvicloselongcondition ? red : na, transp = 75)

///Renko///
TF = input(title='TimeFrame', defval="D")
ATRlength = input(title="ATR length",  defval=9, minval=2, maxval=100)
SMAlength = input(title="SMA length",  defval=5, minval=2, maxval=100)
SMACurTFlength = input(title="SMA CurTF length",  defval=20, minval=2, maxval=100)

HIGH = request.security(syminfo.tickerid, TF, high)
LOW = request.security(syminfo.tickerid, TF, low)
CLOSE = request.security(syminfo.tickerid, TF, close)
ATR = request.security(syminfo.tickerid, TF, atr(ATRlength))
SMA = request.security(syminfo.tickerid, TF, sma(close, SMAlength))
SMACurTF = sma(close, SMACurTFlength)

RENKOUP = na
RENKODN = na
H = na
COLOR = na
BUY = na
SELL = na
UP = na
DN = na
CHANGE = na

RENKOUP := na(RENKOUP[1]) ? ((HIGH+LOW)/2)+(ATR/2) : RENKOUP[1]
RENKODN := na(RENKOUP[1]) ? ((HIGH+LOW)/2)-(ATR/2) : RENKODN[1]
H := na(RENKOUP[1]) or na(RENKODN[1]) ? RENKOUP-RENKODN : RENKOUP[1]-RENKODN[1]
COLOR := na(COLOR[1]) ? white : COLOR[1]
BUY := na(BUY[1]) ? 0 : BUY[1]
SELL := na(SELL[1]) ? 0 : SELL[1]
UP := false
DN := false
CHANGE := false

if(not CHANGE and close >= RENKOUP[1]+H*3)
    CHANGE := true
    UP := true
    RENKOUP := RENKOUP[1]+ATR*3
    RENKODN := RENKOUP[1]+ATR*2
    COLOR := lime
    SELL := 0
    BUY := BUY+3

if(not CHANGE and close >= RENKOUP[1]+H*2)
    CHANGE := true
    UP := true
    RENKOUP := RENKOUP[1]+ATR*2
    RENKODN := RENKOUP[1]+ATR
    COLOR := lime
    SELL := 0
    BUY := BUY+2

if(not CHANGE and close >= RENKOUP[1]+H)
    CHANGE := true
    UP := true
    RENKOUP := RENKOUP[1]+ATR
    RENKODN := RENKOUP[1]
    COLOR := lime
    SELL := 0
    BUY := BUY+1

if(not CHANGE and close <= RENKODN[1]-H*3)
    CHANGE := true
    DN := true
    RENKODN := RENKODN[1]-ATR*3
    RENKOUP := RENKODN[1]-ATR*2
    COLOR := red
    BUY := 0
    SELL := SELL+3

if(not CHANGE and close <= RENKODN[1]-H*2)
    CHANGE := true
    DN := true
    RENKODN := RENKODN[1]-ATR*2
    RENKOUP := RENKODN[1]-ATR
    COLOR := red
    BUY := 0
    SELL := SELL+2

if(not CHANGE and close <= RENKODN[1]-H)
    CHANGE := true
    DN := true
    RENKODN := RENKODN[1]-ATR
    RENKOUP := RENKODN[1]
    COLOR := red
    BUY := 0
    SELL := SELL+1
    
plotshape(UP, style=shape.arrowup, location=location.bottom, size=size.normal)

renkolongcondition = UP
renkoshortcondition = DN

///Long Entry///
longcondition = UP
if (longcondition)
    strategy.entry("Long", strategy.long)
    
///Long exit///
closeconditionlong = rvicloselongcondition
if (closeconditionlong)
    strategy.close("Long")