RSI SMA 기반 버스트 매수 및 매도 전략


생성 날짜: 2023-12-20 17:33:04 마지막으로 수정됨: 2023-12-20 17:33:04
복사: 3 클릭수: 655
avatar of ChaoZhang ChaoZhang
1
집중하다
1623
수행원

RSI SMA 기반 버스트 매수 및 매도 전략

개요

이 전략은 RSI의 평균값과 가격의 급격한 변화를 사용하여 시장의 추세와 반전점을 식별합니다. 핵심 아이디어는 RSI가 과매매되는 경우에 포지션을 고려하고 급격한 가격 변화가 발생할 때 반전 기회를 찾습니다. 또한 EMA를 사용하여 필터링 신호를 보조합니다.

전략 원칙

  1. RSI의 평균값인 SMA를 계산한다. RSI의 SMA가 60을 넘거나 40을 넘으면, 과매매 현상으로 간주하고, 역으로 포지션을 개시한다.

  2. RSI의 변화가 어떤 수치를 초과할 때, 급격한 변화가 발생한다고 간주한다. 실제 폐쇄 가격 검증과 함께 반전 포지션을 설정하는 신호로.

  3. EMA를 다그림으로 필터링하면, 가격이 상단에서 짧은 주기를 거치는 EMA가 있을 때만, 멀티 헤드를 구축하는 것을 고려한다; 가격이 하단에서 짧은 주기를 거치는 EMA가 있을 때만, 빈 헤드를 구축하는 것을 고려한다.

  4. RSI의 평균, 급격한 변화, 그리고 EMA의 필터링을 조합하여 우수한 포지션 위치를 찾습니다.

우위 분석

  1. RSI의 평균값을 사용하면 과매매 현상을 더 정확하게 판단할 수 있으며, 역전 기회를 잡는 데 도움이 된다.

  2. 급격한 변화는 가격의 추세와 방향의 변화를 예고하는 경우가 많으며, 이 신호를 사용하면 입점의 시간성을 향상시킬 수 있다.

  3. EMA의 다단계 필터링은 잘못된 신호를 추가로 방지하여 불필요한 손실을 줄일 수 있습니다.

  4. 다양한 요소를 종합하여 판단 기준으로 삼으면 전략의 안정성과 신뢰성을 높일 수 있다.

위험과 대책

  1. RSI는 불안정하고 SMA 값의 타율이 높지 않습니다. RSI의 매개 변수를 적절히 최적화하거나 다른 지표를 사용하여 대체 할 수 있습니다.

  2. 급격한 변화는 단기적인 흔들림일 수 있고, 실제 반전 (反轉) 이 아니다. 감성주기의 길이를 늘려 판단의 정확도를 높일 수 있다.

  3. EMA 방향 필터링에는 지연성이 있다. 더 짧은 주기 EMA를 테스트할 수 있어 민감성이 높아진다.

  4. 전체적으로, 이 전략은 변수 조정에 매우 민감하며, 최적의 변수 조합을 찾기 위해 신중한 테스트를 필요로 한다. 또한 위험을 통제하기 위해 스톱을 지원한다.

최적화 제안

  1. ADX, MACD 등 다른 지표와 RSI를 결합하여 테스트하여 더 나은 입문 지점을 찾으십시오.

  2. 모형 훈련을 통해 갑작스러운 구매 및 판매 신호의 진실성과 안정성을 판단하는 기계 학습 알고리즘을 추가하십시오.

  3. EMA 방향 필터링의 효과를 더욱 강화하여 다양한 주기 EMA에 대한 통합 판단을 개선합니다.

  4. 적응형 중지 전략을 추가하여 시장의 변동에 따라 중지량을 동적으로 조정할 수 있습니다.

  5. 최적화 평가 기준은 샤프 비율 등을 고려할 수 있다.

요약하다

이 전략은 우선 RSI의 평균값을 사용하여 과매매 상황을 판단한다. 그리고 갑작스러운 변화 시 역위 위치를 구축한다. 동시에 EMA를 사용하여 보조 필터링한다. 합리적인 매개 변수를 설정하여 시장의 추세 전환점을 효과적으로 판단 할 수 있다.

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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © samwillington

//@version=5


strategy("sma RSI & sudden buy and sell Strategy v1", overlay=true)
price = close
length = input( 14 )
inst_length = input( 10 )
var rbc = 0
var float rsiBP = 0.0
var rsc = 0
var float rsiSP = 0.0
bars = input(10)

lookbackno2 = input.int(20)
rsi_buy = 0
rsi_sell = 0



//EMA inputs

input_ema20 = input.int(20)
ema20 = ta.ema(price, input_ema20)
input_ema50 = input.int(50)
ema50 = ta.ema(price, input_ema50)
input_ema100 = input.int(100)
ema100 = ta.ema(price, input_ema100)
input_ema200 = input.int(200)
ema200 = ta.ema(price, input_ema200)
input_ema400 = input.int(400)
ema400 = ta.ema(price, input_ema400)
input_ema800 = input.int(800)
ema800 = ta.ema(price, input_ema800)


vrsi = ta.rsi(price, length)


hi2 = ta.highest(price, lookbackno2)
lo2 = ta.lowest(price, lookbackno2)

buy_diff_rsi = vrsi - ta.rsi(close[1], length)
sell_diff_rsi = ta.rsi(close[1],length) - vrsi


//RSI high low

var int sudS = 0
var int sudB = 0
var float sudSO = 0.0
var float sudSC = 0.0
var float sudBO = 0.0
var float sudBC = 0.0
var sudBuy = 0
var sudSell = 0 
var countB = 0
var countS = 0



var co_800 = false
var co_400 = false
var co_200 = false
var co_100 = false
var co_50 = false
var co_20 = false

co_800 := ta.crossover(price , ema800)
co_400 := ta.crossover(price , ema400)
co_200 := ta.crossover(price , ema200)
co_100 := ta.crossover(price , ema100)
co_50 := ta.crossover(price , ema50)
co_20 := ta.crossover(price , ema20)

if(ta.crossunder(price , ema20))
    co_20 := false
if(ta.crossunder(price , ema50))
    co_50 := false
if(ta.crossunder(price , ema100))
    co_100 := false
if(ta.crossunder(price , ema200))
    co_200 := false
if(ta.crossunder(price , ema400))
    co_400 := false
if(ta.crossunder(price , ema800))
    co_800 := false
    
if((price> ema800) and (price > ema400))
    if(co_20)
        if(co_50)
            if(co_100)
                if(co_200)
                    strategy.close("Sell")
                    strategy.entry("Buy", strategy.long, comment="spl Buy")
                    co_20 := false
                    co_50 := false
                    co_100 := false
                    co_200 := false



// too much rsi

if(vrsi > 90)
    strategy.close("Buy")
    strategy.entry("Sell", strategy.short, comment="RSI too overbuy")
if(vrsi < 10)
    strategy.close("Sell")
    strategy.entry("Buy", strategy.long, comment="RSI too oversold")


var sudbcount = 0  // counting no. of bars till sudden rise
var sudscount = 0  // counting no. of bars till sudden decrease



if(sudB == 1)
    sudbcount := sudbcount + 1
if(sudS == 1)
    sudscount := sudscount + 1


if((buy_diff_rsi > inst_length) and (hi2 > price))
    sudB := 1
    sudBO := open
    sudBC := close
if((sell_diff_rsi > inst_length) )
    sudS := 1
    sudSO := open
    sudSC := close   

if(sudbcount == bars)
    if(sudBC < price)
        strategy.close("Sell")
        strategy.entry("Buy", strategy.long, comment="sudd buy")
        sudbcount := 0
        sudB := 0
    sudbcount := 0
    sudB := 0
if(sudscount == bars) 
    if(sudSC > price)
        strategy.close("Buy")
        strategy.entry("Sell", strategy.short, comment="sudd sell")
        sudscount := 0
        sudS := 0
    sudscount := 0
    sudS := 0


over40 = input( 40 )
over60 = input( 60 )
sma =ta.sma(vrsi, length)
coo = ta.crossover(sma, over60)
cuu = ta.crossunder(sma, over40)

if (coo)
    strategy.close("Sell")
	strategy.entry("Buy", strategy.long, comment="modified buy")
if (cuu)
    strategy.close("Buy")
	strategy.entry("Sell", strategy.short, comment="modefied sell")
//plot(strategy.equity, title="equity", color=color.red, linewidth=2, style=plot.style_areabr)