RSI 및 T3 지표를 기반으로 한 PMax 적응형 브레이크아웃 전략


생성 날짜: 2023-11-22 15:03:08 마지막으로 수정됨: 2023-11-22 15:03:08
복사: 0 클릭수: 787
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

RSI 및 T3 지표를 기반으로 한 PMax 적응형 브레이크아웃 전략

개요

이 전략은 RSI와 T3 지표를 사용하여 트렌드를 판단하고, ATR 지표와 결합하여 스톱 로드를 설정하여, PMax을 깨지기 위해 적응하는 양적 거래 전략이다. 주요 아이디어는 트렌드 판단과 스톱 로드 설정을 최적화하여 위험을 제어하면서 수익성을 향상시키는 것이다.

전략 원칙

  1. RSI와 T3 지표의 계산으로 트렌드를 결정합니다.

    • RSI를 통해 주식 과매매를 판단하는 방법
    • RSI를 기반으로 T3을 계산하여 트렌드를 판단합니다.
  2. ATR 지표에 따라 PMax 적응 스톱 라인을 설정

    • ATR을 변동성의 대표자로 계산합니다.
    • T3 지표 위에 아래로 스톱 라인을 설정하고, ATR 지표의 일정한 배수로 라인 폭을 설정합니다.
    • 스톱 라인의 적응 조정
  3. 브레이크 바이와 스톱 아웃

    • T3 지표를 넘어서면 구매 신호로 간주됩니다.
    • 가격이 스톱 라인을 넘으면 현재 포지션을 종료합니다.

전략적 이점

이 전략은 다음과 같은 장점을 가지고 있습니다.

  1. RSI와 T3 지표의 조합은 추세를 판단하고 정확도가 높습니다.
  2. PMax는 자율적으로 HMRC의 위험을 조절합니다.
  3. ATR 지표는 변동도를 대신하여 너무 급진적이지 않도록 스톱 라인 폭을 설정합니다.
  4. 철수와 수익성

전략적 위험

이 전략에는 다음과 같은 위험들이 있습니다.

  1. 역전 위험

단기간에 가격 반전이 발생하면, 스톱더가 트리플되어 손실이 발생할 수 있다. 스톱더 라인을 적절히 느슨하게 하여 반전의 영향을 줄일 수 있다.

  1. 트렌드 판단 실패의 위험

RSI 및 T3 지표의 추세를 판단하는 효과는 100% 신뢰할 수 없습니다. 판단이 잘못되면 손실이 발생할 수 있습니다. 적절한 변수를 조정하거나 다른 지표를 추가하여 최적화 할 수 있습니다.

전략 최적화 방향

이 전략은 다음의 몇 가지 측면에서 더 개선될 수 있습니다.

  1. 이동 평균과 같은 다른 지표들을 추가하여 추세에 대한 판단을 돕습니다.
  2. RSI와 T3 지표의 길이를 최적화합니다.
  3. 다른 ATR 배수를 스톱 라인 너비로 테스트합니다.
  4. 시장에 따라 조정된 스톱 라인의 용이함

요약하다

이 전략은 RSI, T3 및 ATR의 세 가지 지표의 장점을 통합하여 트렌드 판단과 위험 제어의 유기적 결합을 구현합니다. 단일 지표에 비해 판단 정확도가 높고 회수 제어가 좋은 것이 특징이며 신뢰할 수있는 트렌드 추적 전략입니다. 매개 변수 및 위험 제어 측면에서 최적화 할 여지가 있으며 전반적으로 권장되는 양적 거래 전략입니다.

전략 소스 코드
/*backtest
start: 2023-11-14 00:00:00
end: 2023-11-21 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © KivancOzbilgic
//developer: @KivancOzbilgic
//author: @KivancOzbilgic

strategy("PMax on Rsi w T3 Strategy","PmR3St.", overlay=false, precision=2)
src = input(hl2, title="Source")
Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3)
length =input(8, "Tillson T3 Length", minval=1)
T3a1 = input(0.7, "TILLSON T3 Volume Factor", step=0.1)
Periods = input(10,title="ATR Length", type=input.integer)
rsilength = input(14, minval=1, title="RSI Length")
showrsi = input(title="Show RSI?", type=input.bool, defval=true)
showsupport = input(title="Show Moving Average?", type=input.bool, defval=true)
showsignalsk = input(title="Show Crossing Signals?", type=input.bool, defval=true)
highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true)
i = close>=close[1] ? close-close[1] : 0
i2 = close<close[1] ? close[1]-close : 0
Wwma_Func(src,rsilength)=>
    wwalpha = 1/ rsilength
    WWMA = 0.0
    WWMA := wwalpha*src + (1-wwalpha)*nz(WWMA[1])
WWMA=Wwma_Func(src,rsilength)
AvUp = Wwma_Func(i,rsilength)
AvDown = Wwma_Func(i2,rsilength)
AvgUp = sma(i,rsilength)
AvgDown =sma(i2,rsilength)
k1 = high>close[1] ? high-close[1] : 0
k2 = high<close[1] ? close[1]-high : 0
k3 = low>close[1] ? low-close[1] : 0
k4 = low<close[1] ? close[1]-low : 0
AvgUpH=(AvgUp*(rsilength-1)+ k1)/rsilength
AvgDownH=(AvgDown*(rsilength-1)+ k2)/rsilength
AvgUpL=(AvgUp*(rsilength-1)+ k3)/rsilength
AvgDownL=(AvgDown*(rsilength-1)+ k4)/rsilength
rs = AvUp/AvDown
rsi= rs==-1 ? 0 : (100-(100/(1+rs)))
rsh=AvgUpH/AvgDownH
rsih= rsh==-1 ? 0 : (100-(100/(1+rsh)))
rsl=AvgUpL/AvgDownL
rsil= rsl==-1 ? 0 : (100-(100/(1+rsl)))
TR=max(rsih-rsil,abs(rsih-rsi[1]),abs(rsil-rsi[1]))
atr=sma(TR,Periods)
plot(showrsi ? rsi : na, "RSI", color=#8E1599)
band1 = hline(70, "Upper Band", color=#C0C0C0)
band0 = hline(30, "Lower Band", color=#C0C0C0)
fill(band1, band0, color=#9915FF, transp=90, title="Background")
T3e1=ema(rsi, length)
T3e2=ema(T3e1,length)
T3e3=ema(T3e2,length)
T3e4=ema(T3e3,length)
T3e5=ema(T3e4,length)
T3e6=ema(T3e5,length)
T3c1=-T3a1*T3a1*T3a1
T3c2=3*T3a1*T3a1+3*T3a1*T3a1*T3a1
T3c3=-6*T3a1*T3a1-3*T3a1-3*T3a1*T3a1*T3a1
T3c4=1+3*T3a1+T3a1*T3a1*T3a1+3*T3a1*T3a1
T3=T3c1*T3e6+T3c2*T3e5+T3c3*T3e4+T3c4*T3e3
MAvg=T3
Pmax_Func(rsi,length)=>
    longStop = MAvg - Multiplier*atr
    longStopPrev = nz(longStop[1], longStop)
    longStop := MAvg > longStopPrev ? max(longStop, longStopPrev) : longStop
    shortStop = MAvg + Multiplier*atr
    shortStopPrev = nz(shortStop[1], shortStop)
    shortStop := MAvg < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop
    dir = 1
    dir := nz(dir[1], dir)
    dir := dir == -1 and MAvg > shortStopPrev ? 1 : dir == 1 and MAvg < longStopPrev ? -1 : dir
    PMax = dir==1 ? longStop: shortStop
PMax=Pmax_Func(rsi,length)
plot(showsupport ? MAvg : na, color=color.black, linewidth=2, title="T3")
pALL=plot(PMax, color=color.red, linewidth=2, title="PMax", transp=0)
alertcondition(cross(MAvg, PMax), title="Cross Alert", message="PMax - Moving Avg Crossing!")
alertcondition(crossover(MAvg, PMax), title="Crossover Alarm", message="Moving Avg BUY SIGNAL!")
alertcondition(crossunder(MAvg, PMax), title="Crossunder Alarm", message="Moving Avg SELL SIGNAL!")
alertcondition(cross(src, PMax), title="Price Cross Alert", message="PMax - Price Crossing!")
alertcondition(crossover(src, PMax), title="Price Crossover Alarm", message="PRICE OVER PMax - BUY SIGNAL!")
alertcondition(crossunder(src, PMax), title="Price Crossunder Alarm", message="PRICE UNDER PMax - SELL SIGNAL!")
buySignalk = crossover(MAvg, PMax)
plotshape(buySignalk and showsignalsk ? PMax*0.995 : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0)
sellSignallk = crossunder(MAvg, PMax)
plotshape(sellSignallk and showsignalsk ? PMax*1.005 : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0)
mPlot = plot(rsi, title="", style=plot.style_circles, linewidth=0,display=display.none)
longFillColor = highlighting ? (MAvg>PMax ? color.green : na) : na
shortFillColor = highlighting ? (MAvg<PMax ? color.red : na) : na
fill(mPlot, pALL, title="UpTrend Highligter", color=longFillColor)
fill(mPlot, pALL, title="DownTrend Highligter", color=shortFillColor)

dummy0 = input(true, title = "=Backtest Inputs=")
FromDay    = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromMonth  = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromYear   = input(defval = 2005, title = "From Year", minval = 2005)
ToDay      = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToMonth    = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToYear     = input(defval = 9999, title = "To Year", minval = 2006)
Start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)
Finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)
Timerange() =>
    time >= Start and time <= Finish ? true : false
if buySignalk
    strategy.entry("Long", strategy.long,when=Timerange())
if sellSignallk
    strategy.entry("Short", strategy.short,when=Timerange())