Chiến lược này kết hợp các chỉ số tương đối mạnh và yếu (RSI) và mô hình đường K để xác định các đường K cụ thể như tín hiệu đầu vào và theo dõi xu hướng khi RSI đạt đến vùng quá mua quá bán.
Tính giá trị của chỉ số RSI bằng 30 là đường bán quá mức và 70 là đường mua quá mức.
Nếu RSI vượt quá 30, đó là tín hiệu bán tháo. Nếu RSI vượt quá 70, đó là tín hiệu mua tháo.
Khi các tín hiệu trên xuất hiện, hãy đánh giá xem liệu dòng K hiện tại hoặc một dòng K trước đó có tạo thành hình dạng cụ thể như thực thể trắng / đen, dây thừng / dây thừng hay không.
Một tín hiệu mua / bán được tạo ra nếu các điều kiện hình dạng của tín hiệu RSI và đường K được đáp ứng cùng một lúc.
Tương tự như vậy, nếu hình thành hình dạng đa đầu như đường cong, mua khi RSI vượt quá; Nếu hình thành hình dạng đầu trống như sao bắn, bán khi RSI vượt quá.
Xác định các mô hình nến kết hợp phức tạp hơn như hình dạng hai đường, hình dạng ba đường, và các mô hình khác nhau, như tín hiệu vào cửa.
RSI quay trở lại đường trung tâm cũng là một tín hiệu đồng bằng.
Kết hợp các chỉ số và hình dạng, lọc các tín hiệu giả, tăng độ chính xác của nhập cảnh.
Xác định hình dạng đường K, có thể bắt được các điểm chuyển hướng rõ ràng hơn.
Sử dụng RSI để phát tín hiệu mua và bán trong khu vực quá mức để tăng cơ hội kiếm tiền.
Nhận ra các kết hợp hình dạng hai hoặc ba đường, và nắm bắt các điểm biến đổi trong xu hướng mạnh mẽ.
RSI quay trở lại đường trung tâm như một tín hiệu dừng / dừng, thuận lợi để khóa lợi nhuận.
Chỉ số RSI bị tụt hậu và có thể đã bỏ lỡ một bước ngoặt.
Một số tín hiệu hình dạng K-line yếu hơn, có thể có tín hiệu giả.
Không xem xét các điểm cao trước khi phá vỡ, các điểm thấp trước khi đánh giá lại như là tín hiệu dừng lỗ, có nguy cơ mất mát.
Nếu không có lệnh dừng di chuyển, một sự đảo ngược lớn có thể dẫn đến sự gia tăng lỗ.
Dữ liệu phản hồi không đầy đủ, có thể gây sai lệch cho kết quả tối ưu hóa tham số.
Kết hợp với các chỉ số khác để lọc tín hiệu nhập cảnh, chẳng hạn như MACD, Blink và các.
Thêm một đường xu hướng như là một điểm dừng lỗ.
Tối ưu hóa các tham số RSI dựa trên kết quả phản hồi, tìm kiếm sự kết hợp tham số tốt nhất.
Tối ưu hóa các chiến lược dừng lỗ như theo dõi dừng lỗ, dừng lỗ trong khoảng thời gian.
Kiểm tra dữ liệu trong chu kỳ thời gian dài hơn, đánh giá tính ổn định của tham số.
Điều chỉnh các tham số theo các giống khác nhau và tình hình thị trường.
Chiến lược này tích hợp lợi thế của chỉ số RSI và nhận dạng hình dạng đường K, chọn tín hiệu chất lượng cao để tham gia và đạt được hiệu quả theo dõi xu hướng. Đồng thời nhận ra một số tín hiệu hình dạng kết hợp mạnh hơn, có thể nâng cao xác suất lợi nhuận. Tuy nhiên, có một số rủi ro về tín hiệu chậm trễ, giả, cần được sử dụng cùng với các phương tiện khác và tiếp tục tối ưu hóa.
/*backtest
start: 2022-09-15 00:00:00
end: 2023-09-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
/////////////////////////////////////
//@version=2
//@author=sb
strategy("RSI-candlestick Strategy", overlay=true)
src = hlc3, len = input(14, minval=1, title="Length")
up = rma(max(change(src), 0), len)
down = rma(-min(change(src), 0), len)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
//plot(rsi, color=purple)
//band1 = hline(70)
//band0 = hline(30)
//band2 = hline(50,linestyle=dotted,color=silver)
//fill(band1, band0, color=#cc99ff, transp=70)
//end premade RSI
oversold = rsi < 30
overbought = rsi > 70
barcolor(oversold? #7fff00 : overbought? red : na )
//
//
level_70 = 70
level_70rsi = rsi > level_70 ? rsi : level_70
level_30 = 30
level_30rsi = rsi < 30 ? rsi : level_30
level_50 = 50
//
//p1 = plot(series=level_70, color=red, linewidth=1, transp=100)
//p2 = plot(series=level_70rsi, color=red, linewidth=1, transp=100)
//p3 = plot(series=level_30, color=green, linewidth=1, transp=100)
//p4 = plot(series=level_30rsi, color=green, linewidth=1, transp=100)
//fill(p1, p2, color=red, transp=50)
//fill(p3, p4, color=#7fff00, transp=50)
/////////////////////////////////////
bullishcriteria = input(title="RSI Bullish Criteria", defval=55, minval=50, maxval=100)
bearishcriteria = input(title="RSI Bearish Criteria", defval=45, minval=0, maxval=50)
range = high - low
body = abs(close - open)
oc2 = min(close, open) + body/2
upperwick = high - max(open, close)
lowerwick = min(open, close) - low
isUp = close > open
isTrendUp = rsi(close, 14) >= bullishcriteria
isTrendDown = rsi(close, 14) <= bearishcriteria
isDoji = abs(close-open)/(high-low) < 0.05
// Single Candlestick Pattern
// white marubozu
wm = (isUp) and (upperwick <= 0.05*body) and (lowerwick <= 0.05*body) and isTrendDown
plotshape(wm, color=green, style=shape.triangleup, location=location.belowbar, title='white marubozu',text='wm')
if (not na(rsi))
if (crossover(rsi, level_30) and (wm or wm[1]))
strategy.entry("RsiLE", strategy.long, comment="RsiLE")
// black marubozu
bm = (not isUp) and (upperwick <= 0.05*body) and (lowerwick <= 0.05*body) and isTrendUp
plotshape(bm, color=red, style=shape.triangledown, location=location.abovebar, title='black marubozu',text='bm')
if (not na(rsi))
if (crossunder(rsi, level_70)and (bm or bm[1]))
strategy.entry("RsiSE", strategy.short, comment="RsiSE")
// hammer
h = (isUp) and (lowerwick >= 2*body) and (upperwick <= 0.1*body) and isTrendDown
plotshape(h, color=green, style=shape.triangleup, location=location.belowbar, title='hammer',text='h')
if (not na(rsi))
if (crossover(rsi, level_30) and (h or h[1]))
strategy.entry("RsiLE", strategy.long, comment="RsiLE")
// hanging man
hm = (not isUp) and (lowerwick >= 2*body) and (upperwick <= 0.1*body) and isTrendUp
plotshape(hm, color=red, style=shape.triangledown, location=location.abovebar, title='hanging man',text='hm')
if (not na(rsi))
if (crossunder(rsi, level_70)and (hm or hm[1]))
strategy.entry("RsiSE", strategy.short, comment="RsiSE")
// inverted hammer
ih = (isUp) and (upperwick >= 2*body) and (lowerwick <= 0.1*body) and isTrendDown
plotshape(ih, color=green, style=shape.triangleup, location=location.belowbar, title='inverted hammer',text='ih')
//if (not na(rsi))
// if (crossover(rsi, level_30) and (ih or ih[1]))
// strategy.entry("RsiLE", strategy.long, comment="RsiLE")
// shooting star
ss = (not isUp) and (upperwick >= 2*body) and (lowerwick <= 0.1*body) and isTrendUp
plotshape(ss, color=red, style=shape.triangledown, location=location.abovebar, title='shooting star',text='ss')
if (not na(rsi))
if (crossunder(rsi, level_70)and (ss or ss[1]))
strategy.entry("RsiSE", strategy.short, comment="RsiSE")
// Double Candlestick Pattern
// bullish engulfing
bulle = not isDoji[1] and (not isUp[1] and isUp) and (close > open[1] and open < close[1]) and isTrendDown
plotshape(bulle, color=green, style=shape.triangleup, location=location.belowbar, title='bullish engulfing', text='e')
// bearish engulfing
beare = not isDoji[1] and (isUp[1] and not isUp) and (open > close[1] and close < open[1]) and isTrendUp
plotshape(beare, color=red, style=shape.triangledown, location=location.abovebar, title='bearish engulfing',text='e')
// tweezer bottom
twb = (not isUp[1] and isUp) and (min(lowerwick,lowerwick[1])/max(lowerwick,lowerwick[1]) >= 0.99) and (min(low,low[1])/max(low,low[1]) >= 0.99) and isTrendDown
plotshape(twb, color=green, style=shape.triangleup, location=location.belowbar, title='tweezer bottom', text='tb')
if (not na(rsi))
if (crossover(rsi, level_30) and (twb or twb[1]))
strategy.entry("RsiLE", strategy.long, comment="RsiLE")
// tweezer top
twt = (isUp[1] and not isUp) and (min(upperwick,upperwick[1])/max(upperwick,upperwick[1]) >= 0.99) and (min(high,high[1])/max(high,high[1]) >= 0.99) and isTrendUp
plotshape(twt, color=red, style=shape.triangledown, location=location.abovebar, title='tweezer top',text='tt')
if (not na(rsi))
if (crossunder(rsi, level_70)and (twt or twt[1]))
strategy.entry("RsiSE", strategy.short, comment="RsiSE")
// Trible Candlestick Pattern
// three white soldier
tws = (not isUp[3] and isUp[2] and isUp[1] and isUp) and (body[1]>body[2]) and (upperwick<0.1*body and lowerwick<0.1*body) and isTrendDown
plotshape(tws, color=green, style=shape.triangleup, location=location.belowbar, title='three white soldiers',text='tws')
if (not na(rsi))
if (crossover(rsi, level_30) and (tws or tws[1]))
strategy.entry("RsiLE", strategy.long, comment="RsiLE")
// three black crows
tbc = (isUp[3] and not isUp[2] and not isUp[1] and not isUp) and (body[1]>body[2]) and (upperwick<0.1*body and lowerwick<0.1*body) and isTrendUp
plotshape(tbc, color=red, style=shape.triangledown, location=location.abovebar, title='three black crows',text='tbc')
if (not na(rsi))
if (crossunder(rsi, level_70)and (tbc or tbc[1]))
strategy.entry("RsiSE", strategy.short, comment="RsiSE")
// morning star
ms = (not isUp[1]) and (abs(close[1]-open[1])/(high[1]-low[1]) < 0.1) and (close > oc2[2] and close < open[2]) and isTrendDown
plotshape(ms, color=green, style=shape.triangleup, location=location.belowbar, title='morning star',text='ms')
if (not na(rsi))
if (crossover(rsi, level_30) and (ms or ms[1]))
strategy.entry("RsiLE", strategy.long, comment="RsiLE")
// evening star
es = (isUp[1]) and (abs(close[1]-open[1])/(high[1]-low[1]) < 0.1) and (close < oc2[2] and close > open[2]) and isTrendUp
plotshape(es, color=red, style=shape.triangledown, location=location.abovebar, title='evening star',text='es')
//if (not na(rsi))
// if (crossunder(rsi, level_70)and (es or es[1]))
// strategy.entry("RsiSE", strategy.short, comment="RsiSE")
// three inside up
tiu = (not isUp[2]) and (close[1] > oc2[2] and close[1] < open[2]) and (close > high[2]) and isTrendDown
plotshape(tiu, color=green, style=shape.triangleup, location=location.belowbar, title='three inside up',text='tiu')
if (not na(rsi))
if (crossover(rsi, level_30) and (tiu or tiu[1]))
strategy.entry("RsiLE", strategy.long, comment="RsiLE")
// three inside down
tid = (isUp[2]) and (close[1] < oc2[2] and close[1] > open[2]) and (close < low[2]) and isTrendUp
plotshape(tid, color=red, style=shape.triangledown, location=location.abovebar, title='three inside down',text='tid')
if (not na(rsi))
if (crossunder(rsi, level_70)and (tid or tid[1]))
strategy.entry("RsiSE", strategy.short, comment="RsiSE")
if (not na(rsi))
if (crossover(rsi, level_70))
//strategy.exit("RsiSE")
//if(chk[1]==0 or chk[2]==0 or chk[3]==0 or chk[4]==0 or chk[5]==0 or chk[6]==0 or chk[7]==0 or chk[8]==0 or chk[9]==0 or chk[10]==0)
//if(crossover(col[1],zero) or crossover(col[2],zero) or crossover(col[3],zero) or crossover(col[4],zero) or crossover(col[5],zero) or crossover(col[6],zero) or crossover(col[7],zero) or crossover(col[8],zero))
//strategy.entry("RsiLE", strategy.long,0, comment="RsiLE")
strategy.entry("RsiSE", strategy.short,0, comment="RsiSE")
if (crossunder(rsi, level_30))
//strategy.entry("RsiSE", strategy.short,0, comment="RsiSE")
strategy.entry("RsiLE", strategy.long,0, comment="RsiLE")
//if (not na(rsi))
// if (crossover(rsi, level_50))
//strategy.exit("RsiSE")
//if(chk[1]==0 or chk[2]==0 or chk[3]==0 or chk[4]==0 or chk[5]==0 or chk[6]==0 or chk[7]==0 or chk[8]==0 or chk[9]==0 or chk[10]==0)
//if(crossover(col[1],zero) or crossover(col[2],zero) or crossover(col[3],zero) or crossover(col[4],zero) or crossover(col[5],zero) or crossover(col[6],zero) or crossover(col[7],zero) or crossover(col[8],zero))
// strategy.entry("RsiSE", strategy.short,0, comment="RsiSE")
// else
// strategy.exit("RsiSE")
// if (crossunder(rsi, level_50))
// strategy.entry("RsiLE", strategy.long,0, comment="RsiLE")
// else
// strategy.exit("RsiLE")