Chiến lược phá vỡ mô hình RSI W

Tác giả:ChaoZhang, Ngày: 2023-09-17 18:24:17
Tags:

Tổng quan

Chiến lược này xác định các mô hình W trên chỉ số RSI kết hợp với các điều kiện xu hướng để thực hiện các hoạt động phá vỡ mua thấp-bán cao.

Chiến lược logic

  1. Xác định các mô hình W bằng cách sử dụng chỉ số RSI (5) để xác định cơ hội mua tiềm năng.

  2. EMA20 vượt trên EMA50 xác định xu hướng tăng, cung cấp thiên hướng hướng.

  3. Khi mô hình W được xác định và xu hướng tăng, các lệnh dài được kích hoạt.

  4. Nếu đã có vị trí, mua thêm được phép nếu RSI vượt dưới 20 một lần nữa.

  5. Khi chỉ số RSI vượt trên 75, nó chỉ ra các điều kiện mua quá mức, lấy lợi nhuận sẽ được kích hoạt.

  6. Một mức dừng lỗ 8% được thiết lập. Nếu lỗ vượt quá điểm này, một bước thoát dừng lỗ được kích hoạt.

Phân tích lợi thế

  1. Xác định mô hình W làm tăng độ chắc chắn nhập cảnh.

  2. Kết hợp với bộ lọc xu hướng tránh các tín hiệu sai và bỏ lỡ cơ hội đảo ngược.

  3. RSI))) có thể nắm bắt kịp thời các cơ hội ngắn hạn.

  4. Lợi nhuận và điểm dừng lỗ giúp kiểm soát rủi ro.

Phân tích rủi ro

  1. Nhận dạng mô hình W phụ thuộc vào điều chỉnh tham số, có nguy cơ mất tích hoặc xác định sai các cấu trúc.

  2. Là tín hiệu đảo ngược, có nguy cơ bị mắc kẹt.

  3. RSI có xu hướng phát triển sai, cần lọc tín hiệu đúng cách.

  4. Nếu điểm dừng lỗ quá rộng, dừng sớm có thể xảy ra.

Hướng dẫn tối ưu hóa

  1. Kiểm tra các giai đoạn RSI khác nhau để tìm các thông số tối ưu.

  2. Thêm thêm các tiêu chí để tăng độ chính xác nhận dạng mẫu.

  3. Kết hợp với các chỉ số khác để lọc tín hiệu và giảm các giao dịch không chính xác.

  4. Điều chỉnh động mức dừng lỗ để tối ưu hóa chiến lược dừng lỗ.

  5. Tối ưu hóa chiến lược thu lợi nhuận để kéo dài thời gian nắm giữ trong khi đảm bảo lợi nhuận.

Tóm lại

Chiến lược này sử dụng các mô hình RSI W để giao dịch đột phá đảo ngược hiệu quả. Nhưng tối ưu hóa tham số hơn nữa và thêm các chỉ số kỹ thuật khác để lọc tín hiệu có thể cải thiện tính ổn định và lợi nhuận của chiến lược.


/*backtest
start: 2023-08-17 00:00:00
end: 2023-09-16 00:00:00
period: 3h
basePeriod: 15m
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/
// © mohanee

//@version=4
strategy(title="RSI W Pattern strategy", pyramiding=2, shorttitle="RSI W Pattern", overlay = false)

//Strategy Rules
//ema20 is above ema50
//RSI5 making W pattern in oversold area  or just below 70 level  , you can define the value for parameter buyRsiEntry --- dont go beyond 70
//Exit when RSI reaches 75 

len = input(title="RSI Period", minval=1, defval=5)
buyRsiEntry = input(title="look for W pattern bottom edges well below RSI level (BUY) ", minval=10, defval=65, maxval=70)
//numberOfBars = input(title="Number of Bars in W pattern ", minval=4, defval=4, maxval=6)

emaL = input(title="Long Term EMA", minval=1, defval=50, maxval=200)
emaS = input(title="Short Term EMA", minval=1, defval=20, maxval=200)

stopLoss = input(title="Stop Loss %", minval=1, defval=8, maxval=10)

//rsiWp1=false

myRsi = rsi(close,len)

//longEmaVal=ema(close,emaL)
//shortEmaVal=ema(close,emaS)

entryEma=ema(close,5)  // This is used as filetr for BUY


isEma20AboveEma50=ema(close,emaS)>ema(close,emaL) ? true : false 

//W Pattern
//rsiWp1 =  myRsi>myRsi[1] and myRsi>=30 and myRsi[1]<myRsi[2] and myRsi[2]>myRsi[3]  and myRsi[3]<myRsi[4] //This is published one
rsiWp1 =    myRsi>myRsi[1] and myRsi>=30 and myRsi[1]<myRsi[2] and myRsi[2]>myRsi[3]  and myRsi[3]<myRsi[4] and (low[1]<=low[4] or low[3]<=low[4] ) // looking for recent low

//rsiWp1 =  myRsi>myRsi[1] and myRsi>=30 and myRsi[1]<myRsi[2] and myRsi[2]>myRsi[3]  and myRsi[3]<myRsi[4]  //Ths one has 92% win rate and 4.593 prfit factor

//long condition filters
//1. ema20 > ema50
//2. Rsi5 has W pattern
//3. current RSI <= 65 (parameter buyRsiEntry)  (dont go beyond 70 , becuase that is already overbought area)
//4. current price low/close is below 5 ema --- looking for pullback  -- Optional
longCondition =  isEma20AboveEma50 and rsiWp1   and (myRsi<=buyRsiEntry  and myRsi>=30)  
//and (low<entryEma or close<entryEma)  --- if this optional required , add it to above condition

patternText=" W "

barcolor(longCondition?color.yellow:na)

//initial entry
strategy.entry("RSI_W_LE", comment="Buy" , long=true, when=longCondition  )

//legging in to existing 
strategy.entry("RSI_W_LE",comment="Add", long=true, when=strategy.position_size>0 and crossover(myRsi,10 ))

//calculate stoploss value
stopLossValue=strategy.position_avg_price -  (strategy.position_avg_price*stopLoss/100) 


rsiPlotColor=longCondition ?color.yellow:color.purple


plot(myRsi, title="RSI", linewidth=2, color=color.purple)
//    plot(myRsi, title="RSI", linewidth=2, color=rsiWp1?color.yellow:color.purple)
    //plot(myRsi[1], title="RSI", linewidth=2, color=rsiWp1==true?color.yellow:color.purple)
    //plot(myRsi[2], title="RSI", linewidth=2, color=rsiWp1?color.yellow:color.purple)
    //plot(myRsi[3], title="RSI", linewidth=2, color=rsiWp1?color.yellow:color.purple)
    //plot(myRsi[4], title="RSI", linewidth=2, color=rsiWp1?color.yellow:color.purple)
    


hline(40, title="Middle Line", color=color.blue, linestyle=hline.style_dashed)
obLevel = hline(75, title="Overbought", color=color.red, linestyle=hline.style_dashed)
osLevel = hline(30, title="Oversold", color=color.purple, linestyle=hline.style_dashed)
fill(obLevel, osLevel, title="Background", color=#9915FF, transp=90)


plotshape(
	 longCondition ? myRsi[1] : na,
	 offset=-1,
	 title="W Pattern",
	 text=patternText,
	 style=shape.labelup,
	 location=location.absolute,
	 color=color.purple,
	 textcolor=color.yellow,
	 transp=0
	 )	 
	 
bgcolor(strategy.position_size>0?color.green:na, transp=40, title='In Long Position')

//take profit or close when RSI reaches 75    
takeProfit=crossover(myRsi,75)

//close when RSi reaches profit level 
strategy.close("RSI_W_LE", comment="TP Exit", qty=strategy.position_size,when=crossover(myRsi,75) and close>strategy.position_avg_price )


//close everything when stoploss hit  
longCloseCondition=close<(strategy.position_avg_price - (strategy.position_avg_price*stopLoss/100)  ) //or crossunder(myRsi,30)
strategy.close("RSI_W_LE", comment="SL Exit", qty=strategy.position_size,when=longCloseCondition )



Thêm nữa