이것은 트렌드를 결정하기 위해 RSI와 T3 지표를 활용하고 적응 PMax 브레이크오웃을 구현하기 위해 ATR 지표를 기반으로 스톱 로스 라인을 설정하는 양적 거래 전략입니다. 주요 아이디어는 수익성을 향상시키는 동시에 위험을 제어하기 위해 트렌드 결정 및 스톱 로스 설정을 최적화하는 것입니다.
RSI 및 T3 지표를 사용하여 경향을 결정합니다.
ATR 지표에 기초한 적응형 PMax 스톱 로스 라인을 설정
크로스오버에서 구매하고 스톱 로스에서 종료
이 전략의 주요 장점:
주요 위험은:
회전 위험
단기 반전은 스톱 로스를 유발하고 손실을 유발할 수 있습니다. 영향을 줄이기 위해 스톱 로스를 느슨하게 할 수 있습니다.
트렌드 결정 실패 위험
RSI+T3
더 많은 최적화를 위한 몇 가지 방향:
이 전략은 트렌드 결정 및 위험 통제의 조합을 달성하여 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())