Chiến lược này kết hợp chỉ số chỉ số sức mạnh tương đối (RSI) với các mô hình nến để xác định các tín hiệu nhập cảnh theo xu hướng khi RSI đạt mức mua quá mức hoặc bán quá mức.
Tính toán các giá trị RSI, với 70 là dòng mua quá mức và 30 là dòng bán quá mức.
Xem RSI vượt trên 30 là tín hiệu quá bán, và RSI vượt dưới 70 là tín hiệu quá mua.
Khi các tín hiệu trên xảy ra, kiểm tra xem nến hiện tại hoặc trước đó có hình thành các mẫu cụ thể như marubozu trắng / đen, búa / người treo vv không.
Nếu cả tín hiệu RSI và điều kiện nến đều được đáp ứng, tạo ra tín hiệu mua / bán.
Tương tự, mua trên RSI quá bán khi các mô hình tăng như búa xảy ra, và bán trên RSI quá mua khi các mô hình giảm như sao bắn xảy ra.
Xác định các mô hình kết hợp phức tạp như pincet, ngôi sao buổi sáng / buổi tối cho tín hiệu nhập cảnh.
Chỉ số RSI vượt qua đường giữa hoạt động như một tín hiệu thoát.
Kết hợp chỉ số và mô hình lọc tín hiệu giả và cải thiện độ chính xác nhập.
Mô hình nến ghi lại các điểm đảo ngược xu hướng quan trọng.
RSI tín hiệu mua quá mức / bán quá mức làm tăng cơ hội chiến thắng.
Cặp đôi / ba candlestick combos bắt đầu đảo ngược mạnh mẽ hơn.
Chỉ số RSI qua đường trung gian giúp khóa lợi nhuận.
RSI lag có thể bỏ lỡ các điểm đảo ngược.
Một số tín hiệu nến yếu và đưa ra tín hiệu sai.
Không có lệnh dừng lỗ dựa trên mức cao / thấp gần đây, rủi ro mất mát không kiểm soát.
Không có dừng lỗ, một động thái bất lợi lớn có thể làm tăng lỗ.
Dữ liệu backtest không đủ có thể làm sai lạc tối ưu hóa tham số.
Thêm các bộ lọc khác như MACD, Bollinger Bands.
Thêm đường xu hướng để dừng lỗ / lấy lợi nhuận.
Tối ưu hóa các thông số RSI dựa trên kết quả backtest.
Tăng cường dừng như dừng lại, dừng lại khu vực vv
Kiểm tra các bộ dữ liệu dài hơn để đánh giá độ bền của tham số.
Điều chỉnh các thông số cho các sản phẩm và chế độ thị trường khác nhau.
Chiến lược này tích hợp các điểm mạnh của chỉ số RSI và nhận dạng mô hình nến để tham gia vào các tín hiệu chất lượng cao tại các điểm chuyển đổi quá mua / quá bán để theo dõi xu hướng. Các mô hình combo mạnh cũng cải thiện tỷ lệ cược. Nhưng rủi ro như chậm trễ và tín hiệu sai vẫn còn, đòi hỏi sự kết hợp với các kỹ thuật khác và tối ưu hóa hơn nữ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")