Cette stratégie combine l’indicateur de force relative (RSI) et la forme de la ligne K. Elle identifie une forme de la ligne K spécifique comme un signal d’entrée pour permettre le suivi de la tendance lorsque le RSI atteint une zone de survente.
Calculez la valeur de l’indicateur RSI avec 30 comme ligne de survente et 70 comme ligne de survente.
Le RSI est considéré comme un signal de survente lorsqu’il atteint 30 et un signal de survente lorsqu’il atteint 70
Lorsque les signaux ci-dessus apparaissent, déterminez si la ligne K actuelle ou la ligne K précédente forme une forme particulière telle qu’une entité blanche / noire, une ligne de tête / pendule.
Un signal d’achat/vente est généré si le signal RSI et la forme de la ligne K sont satisfaits simultanément.
Par contre, si elle forme une forme à plusieurs têtes comme une ligne de tête, elle achète lorsque le RSI est en survente; si elle forme une forme à tête vide comme une étoile filante, elle vend lorsque le RSI est en survente.
Identifier les modèles de chandeliers combinés plus complexes, tels que les formes bi-linéaires et tri-linéaires, comme signaux d’entrée.
Le RSI traverse la ligne médiane comme un signal de plage.
La combinaison des indicateurs et des formes permet de filtrer les faux signaux et d’améliorer la précision des entrées.
Identifier la forme de la ligne K pour capturer les points de retournement de tendance les plus évidents.
Le RSI utilise les zones de surachat et de survente pour envoyer des signaux et augmenter les opportunités de profit.
Il est possible d’identifier des combinaisons de formes bi-triangulaires qui permettent de saisir les points de basculement de tendances plus fortes.
Le RSI traverse la ligne médiane comme un signal de stop/stop, ce qui est favorable pour la localisation des gains.
L’indicateur RSI est en retard et risque de manquer le point de basculement.
Certains signaux en forme de ligne K sont plus faibles et peuvent contenir un faux signal.
Il existe un risque de perte en ne prenant pas en compte les hauts avant la rupture et les bas avant la réévaluation comme signaux d’arrêt de perte.
Si le stop-loss mobile n’est pas défini, un revirement majeur peut entraîner une augmentation des pertes.
Les données de détection sont insuffisantes, ce qui peut entraîner des écarts dans les résultats de l’optimisation des paramètres.
Il est possible de filtrer les signaux d’entrée de jeu en combinant d’autres indicateurs, tels que MACD, les bandes de Brin, etc.
Ajout d’une ligne de tendance comme arrêt de perte.
Optimiser les paramètres RSI en fonction des résultats du test de retour pour trouver la meilleure combinaison de paramètres.
Optimiser les stratégies de stop-loss, comme le suivi des stops, le stop-space, etc.
Test des données sur des périodes plus longues pour évaluer la stabilité des paramètres.
Adaptez les paramètres en fonction des variétés et des conditions du marché.
Cette stratégie intègre les avantages de l’indicateur RSI et de la reconnaissance de la forme de la ligne K. Elle permet de sélectionner des signaux de haute qualité pour l’entrée sur les points de survente et de survente, ce qui permet de suivre la tendance. En même temps, l’identification de certains signaux de forme combinée plus puissants peut améliorer la probabilité de gagner.
/*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")