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

동적 RSI 가격 격차 탐지 및 적응형 거래 전략 시스템

저자:차오장, 날짜: 2025-01-10 16:20:25
태그:RSITPSL

 Dynamic RSI-Price Divergence Detection and Adaptive Trading Strategy System

전반적인 설명

이 전략은 RSI와 가격의 오차를 기반으로 하는 지능형 거래 시스템으로, RSI 지표와 가격 트렌드 사이의 오차 관계를 동적으로 모니터링함으로써 시장 반전 신호를 캡처합니다. 이 전략은 부대 확인으로 프랙탈 이론을 통합하고 적응적 인 스톱 로스 및 영리 메커니즘을 갖추고 있으며, 완전히 자동화 된 거래 실행을 달성합니다. 시스템은 강력한 유연성과 실용성을 갖춘 멀티 인스트루먼트, 멀티 타임프레임 응용 프로그램을 지원합니다.

전략 원칙

이 전략의 핵심 논리는 다음의 핵심 요소에 기초합니다. 1. RSI 분산 탐지: RSI 지표 및 가격 트렌드의 최고와 최저를 비교하여 잠재적 분산 패턴을 식별합니다. 가격이 RSI가 아닌 새로운 최고치를 만들 때 하향 분산 판매 신호가 형성됩니다. RSI가 아닌 가격이 새로운 최저치를 만들 때 상승 분산 구매 신호가 형성됩니다. 2. 프랙탈 확인: 프랙탈 이론을 사용하여 가격 구조를 분석하고, 신호 신뢰성을 향상시키기 위해 지역 최고와 최하위를 감지하여 분리의 유효성을 확인합니다. 3. 매개 변수 적응: 다양한 시장 환경에 적응을 달성하여 프랙탈 판단 간격을 동적으로 조정하기 위해 감수성 매개 변수를 도입합니다. 4. 리스크 제어: 각 거래에 대한 통제 가능한 위험을 보장하기 위해 비율 기반의 스톱 로스 및 영리 메커니즘을 통합합니다.

전략적 장점

  1. 높은 신호 신뢰성: RSI 분리와 프랙탈 이론의 이중 확인 메커니즘은 거래 신호의 정확성을 크게 향상시킵니다.
  2. 강한 적응력: 전략은 다양한 시장 조건에 따라 매개 변수를 유연하게 조정할 수 있으며, 좋은 환경 적응력을 보여줍니다.
  3. 포괄적 리스크 관리: 통합적인 동적 스톱 로스 및 리프터 메커니즘은 각 거래에 대한 리스크 노출을 효과적으로 제어합니다.
  4. 높은 자동화 수준: 신호 식별에서 거래 실행에 대한 완전한 자동화는 인간의 개입으로 인한 감정적 영향을 줄입니다.
  5. 좋은 확장성: 전략 프레임 워크는 포트폴리오 투자를 촉진하는 다중 도구, 다중 시간 프레임 애플리케이션을 지원합니다.

전략 위험

  1. 시장 환경 의존성: 트렌드 시장에서 디버전스 신호 신뢰성이 감소할 수 있으므로 추가 트렌드 필터링 메커니즘이 필요합니다.
  2. 매개 변수 민감성: RSI 임계 및 프랙탈 판단 간격과 같은 주요 매개 변수는 신중한 조정이 필요합니다. 부적절한 매개 변수 설정은 전략 성능에 영향을 줄 수 있습니다.
  3. 신호 지연: 신호를 확인하기 전에 완전한 분산 패턴 형성을 기다리는 것은 입력 시기가 지연 될 수 있습니다.
  4. 시장 소음 간섭: 변동성 있는 시장에서 잘못된 오차 신호가 발생할 수 있어 추가적인 필터링 조건이 필요합니다.

전략 최적화 방향

  1. 트렌드 필터링을 추가합니다. 강한 트렌드 시장에서 트렌드 판단 지표를 필터링하여 다른 시장 환경에서 전략 적응력을 향상시킵니다.
  2. 매개 변수 적응을 최적화: 시장 변동성에 기반한 동적 매개 변수 조정 메커니즘을 개발하여 시장 변화에 대한 전략 대응을 강화합니다.
  3. 리스크 통제 개선: 시장 변동성에 따라 자동으로 스톱 로스 포지션을 조정하는 동적 스톱 로스 메커니즘을 도입하여 자금 관리 효과를 최적화합니다.
  4. 신호 확인을 강화: 부피, 변동성 및 기타 시장 미세 구조 지표를 결합하여 보다 포괄적인 신호 확인 시스템을 구축합니다.

요약

이 전략은 RSI 분화와 프랙탈 이론의 혁신적인 조합을 통해 견고한 거래 시스템을 구축합니다. 이 전략의 장점은 높은 신호 신뢰성, 강력한 적응력 및 포괄적 인 위험 관리 메커니즘에 있습니다. 지속적인 최적화 및 개선으로 전략은 다양한 시장 환경에서 안정적인 성능을 유지할 것으로 예상됩니다. 라이브 거래를 적용 할 때 시장 특성에 따라 매개 변수를 철저히 테스트하고 최적화하고 위험 관리 조치를 엄격히 시행하는 것이 좋습니다.


/*backtest
start: 2025-01-02 00:00:00
end: 2025-01-09 00:00:00
period: 5m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":49999}]
*/

//FRACTALS
//@version=5

//last : 30m 70 68 22 25 0 0 4.7 11.5

//init
capital=1000
percent=100
fees=0//in percent for each entry and exit

//Inputs
start = input(timestamp("1 Feb 2002"), "Start Time", group = "Date")
end = input(timestamp("1 Feb 2052"), "End Time", group = "Date")

//Strategy
strategy("Divergence Finder (RSI/Price) Strategy with Options", overlay = true, initial_capital=capital, default_qty_value=percent, default_qty_type=strategy.percent_of_equity, commission_type=strategy.commission.percent, calc_on_order_fills=false,process_orders_on_close=true , commission_value=fees, currency=currency.EUR, calc_on_every_tick=true, use_bar_magnifier=false)
//indicator("Divergence Finder (RSI/Price) with Options", overlay=true, max_boxes_count=200, max_bars_back=500,max_labels_count=500)


srcUp=input.source(close, "Source for Price Buy Div", group="sources")
srcDn=input.source(close, "Source for Price Sell Div", group="sources")
srcRsi=input.source(close, "Source for RSI Div", group="sources")


HighRSILimit=input.int(70, "Min RSI for Sell divergence (p1:pre last)", group="signals", inline="1", step=1)
HighRSILimit2=input.int(68, "Min RSI for Sell divergence (p2):last", group="signals", inline="1", step=1)
LowRSILimit=input.int(22, "Min RSI for Buy divergence (p1:pre last)", group="signals", inline="2", step=1)
LowRSILimit2=input.int(25, "Min RSI for Buy divergence (p2:last)", group="signals", inline="2", step=1)


minMarginP=input.float(0, "Min margin between price for displaying divergence (%)", group="signals", step=0.01)
minMarginR=input.float(0, "Min margin between RSI for displaying divergence (%)", group="signals", step=1)

nb=input.int(2, "Sensivity: Determine how many candle will be used to determine last top or bot (too high cause lag, too low cause repaint)", group="Sensivity", inline="3", step=1)


stopPer= input.float(4.7, title='Stop %', group = "Per", inline="3", step=0.01)
tpPer = input.float(11.5, title='TP %', group = "Per", inline="4", step=0.01)

//nb=2
leftBars = nb
rightBars=nb


labels=input.bool(true, "Display Divergence labels", group="Display")
draw=input.bool(true, "Display tops/bottoms")



dnFractal = (close[nb-2] < close[nb]) and (close[nb-1] < close[nb]) and (close[nb+1] < close[nb]) and (close[nb+2] < close[nb])
upFractal = (close[nb-2] > close[nb]) and (close[nb-1] > close[nb]) and (close[nb+1] > close[nb]) and (close[nb+2] > close[nb])
ph=dnFractal
pl=upFractal

plot(dnFractal and draw ? close[nb] : na, style=plot.style_line,offset=-2, color=color.lime, title="tops")
plot(upFractal and draw ? close[nb] : na,  style=plot.style_line, offset=-2, color=color.red, title="botts")

plotchar(dnFractal ? high[nb] : na, char='⮝',location=location.absolute,offset=-2, color=color.rgb(236, 255, 63), title="Down Fractal")
plotchar(upFractal ? low[nb] : na, char='⮟', location=location.absolute, offset=-2, color=color.rgb(67, 227, 255), title="Up Fractal")


float myRSI=ta.rsi(srcRsi, 14)

bool divUp=false
bool divDn=false

//compare lasts bots
p2=ta.valuewhen( ph,srcDn[nb], 0 ) //last price
p1=ta.valuewhen( ph,srcDn[nb], 1 ) //pre last price

r2=ta.valuewhen( ph,myRSI[nb], 0 )  //last rsi
r1=ta.valuewhen( ph,myRSI[nb], 1 )  //pre last rsi


if ph
    if p1 < p2// - (p2 * minMarginP)/100
        if r1 > HighRSILimit and r2 > HighRSILimit2
            if r1 > r2 + (r2 * minMarginR)/100
                divDn:=true

plot(divDn ? close:na, style=plot.style_cross, linewidth=3, color= color.red, offset=-rightBars, title="Sell Div")
if labels and divDn and strategy.position_size >= 0
    label.new(bar_index-nb,high, "Sell Divergence "+str.tostring(p1)+"   "+str.tostring(math.round(r1, 2))+"  "+str.tostring(p2)+"   "+str.tostring(math.round(r2, 2)),xloc=xloc.bar_index,yloc=yloc.abovebar, color = color.red, style = label.style_label_down)
else if divDn and strategy.position_size >= 0
    label.new(bar_index-nb,high, "Sell Divergence",xloc=xloc.bar_index,yloc=yloc.abovebar, color = color.red, style = label.style_label_down)



p2:=ta.valuewhen( pl,srcUp[nb], 0 )
p1:=ta.valuewhen( pl,srcUp[nb], 1 )

r2:=ta.valuewhen( pl,myRSI[nb], 0 )
r1:=ta.valuewhen( pl,myRSI[nb], 1 )


if pl
    if p1 > p2 + (p2 * minMarginP)/100
        if r1 < LowRSILimit and r2 < LowRSILimit2
            if r1 < r2 - (r2 * minMarginR)/100
                divUp:=true
               
plot(divUp ? close:na, style=plot.style_cross, linewidth=3, color= color.green, offset=-rightBars, title="Buy Div")
if labels and divUp and strategy.position_size <= 0
    label.new(bar_index-nb,high, "Buy Divergence "+str.tostring(p1)+"   "+str.tostring(math.round(r1, 2))+"  "+str.tostring(p2)+"   "+str.tostring(math.round(r2, 2)),xloc=xloc.bar_index,yloc=yloc.belowbar, color = color.green, style = label.style_label_up)
else if divUp and strategy.position_size <= 0
    label.new(bar_index-nb,high, "Buy Divergence",xloc=xloc.bar_index,yloc=yloc.belowbar, color = color.green, style = label.style_label_up)


//strat LONG
longEntry = divUp//  and strategy.position_size == 0
longExit = divDn//  and strategy.position_size == 0

//strat SHORT
shortEntry = divDn
shortExit = divUp

LongActive=input(true, title='Activate Long', group = "Directions", inline="2")
ShortActive=input(true, title='Activate Short', group = "Directions", inline="2")
//StopActive=input(false, title='Activate Stop', group = "Directions", inline="2")


//tpActive =  input(false, title='Activate Take Profit', group = "TP", inline="4")
//RR=input(0.5, title='Risk Reward Multiplier', group = "TP")
//QuantityTP = input(100.0, title='Trade Ammount %', group = "TP")


//calc stop
//longStop = strategy.position_avg_price * (1 - stopPer)
//shortStop = strategy.position_avg_price * (1 + stopPer)

longStop = strategy.position_avg_price - (strategy.position_avg_price * stopPer/100)
shortStop = strategy.position_avg_price + (strategy.position_avg_price * stopPer/100)

longTP = strategy.position_avg_price + (strategy.position_avg_price * tpPer/100)
shortTP = strategy.position_avg_price - (strategy.position_avg_price * tpPer/100)

//Calc TP
//longTP = ((strategy.position_avg_price-longStop)*RR+strategy.position_avg_price)
//shortTP = (strategy.position_avg_price-((shortStop-strategy.position_avg_price)*RR))


//display stops
plot(strategy.position_size > 0 ? longStop : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Fixed SL")
plot(strategy.position_size < 0 ? shortStop : na, style=plot.style_linebr, color=color.purple, linewidth=1, title="Short Fixed SL")


//display TP
plot(strategy.position_size > 0 ? longTP : na, style=plot.style_linebr, color=color.green, linewidth=1, title="Long Fixed TP")
plot(strategy.position_size < 0 ? shortTP : na, style=plot.style_linebr, color=color.green, linewidth=1, title="Short Fixed TP")

//do
if true
    //check money available
    if strategy.equity > 0
        //if tpActive //Need to put TP before Other exit
        strategy.exit("Close Long", from_entry="Long", limit=longTP,stop=longStop, comment="Close Long with : "+ str.tostring(math.round(strategy.equity)) +" $ ", qty_percent=100)
        strategy.exit("Close Short", from_entry="Short", limit=shortTP,stop=shortStop, comment="Close Short with : "+ str.tostring(math.round(strategy.equity)) +" $ ", qty_percent=100)
        //Set Stops
        //if StopActive
        //    strategy.exit("Stop Long", from_entry="Long", stop=longStop, comment="Stop Long with : "+ str.tostring(math.round(strategy.equity)) +" $ ")
        //    strategy.exit("Stop Short", from_entry="Short", stop=shortStop, comment="Stop Short with : "+ str.tostring(math.round(strategy.equity)) +" $ ")
        if longEntry
            if ShortActive
                strategy.close("Short",comment="Close Short with : "+ str.tostring(math.round(strategy.equity)) +" $ ")
                alert("Close Short")
            if LongActive
                strategy.entry("Long", strategy.long, comment="Open Long with : "+ str.tostring(math.round(strategy.equity)) +" $ ")
                alert("Open Long")
        if longExit
            if LongActive
                strategy.close("Long",comment="Close Long with : "+ str.tostring(math.round(strategy.equity)) +" $ ")
                alert("Close Long")
            if ShortActive
                strategy.entry("Short", strategy.short, comment="Open Short with : "+ str.tostring(math.round(strategy.equity)) +" $ ")
                alert("Open Short")


//alertcondition(longEntry and LongActive, title="Buy Divergence Open", message="Buy Divergence Long Opened!")
//alertcondition(longExit and ShortActive, title="Sell Divergence Open", message="Buy Divergence Short Opened!")

//alertcondition(longExit and LongActive, title="Buy Divergence Closed", message="Buy Divergence Long Closed!")
//alertcondition(longEntry and ShortActive, title="Sell Divergence Closed", message="Buy Divergence Short Closed!")


관련

더 많은