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

RSI 및 T3 지표에 기초한 PMax 브레이크아웃 전략

저자:차오장, 날짜: 2023-11-22 15:03:08
태그:

img

전반적인 설명

이것은 트렌드를 결정하기 위해 RSI와 T3 지표를 활용하고 적응 PMax 브레이크오웃을 구현하기 위해 ATR 지표를 기반으로 스톱 로스 라인을 설정하는 양적 거래 전략입니다. 주요 아이디어는 수익성을 향상시키는 동시에 위험을 제어하기 위해 트렌드 결정 및 스톱 로스 설정을 최적화하는 것입니다.

전략 논리

  1. RSI 및 T3 지표를 사용하여 경향을 결정합니다.

    • 주식 과잉 구매/ 과잉 판매를 판단하기 위해 RSI 지표를 사용
    • 트렌드를 결정하기 위해 RSI를 기반으로 T3 지표를 계산합니다.
  2. ATR 지표에 기초한 적응형 PMax 스톱 로스 라인을 설정

    • ATR을 변동성을 나타내는 것으로 사용
    • ATR의 곱하기 너비로 T3 지표 위와 아래로 스톱 로스 라인을 설정합니다.
    • 스톱 로스 라인의 적응 조정
  3. 크로스오버에서 구매하고 스톱 로스에서 종료

    • T3 이상의 가격 크로스오버를 구매 신호로 간주하십시오.
    • 가격이 스톱 로스 라인 아래로 넘어가면 출구 위치

장점

이 전략의 주요 장점:

  1. RSI + T3 조합은 트렌드 결정을 향상시킵니다.
  2. PMax 적응식 스톱 로스 제어 위험
  3. 변동성 지수로서의 ATR은 스톱 로스 폭을 합리화합니다.
  4. 사용량과 수익성 사이의 균형

위험성

주요 위험은:

  1. 회전 위험

    단기 반전은 스톱 로스를 유발하고 손실을 유발할 수 있습니다. 영향을 줄이기 위해 스톱 로스를 느슨하게 할 수 있습니다.

  2. 트렌드 결정 실패 위험

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


더 많은