Cette stratégie combine l'indicateur d'indice de force relative (RSI) avec des modèles de chandeliers pour identifier les signaux d'entrée de tendance lorsque l'indice atteint des niveaux de surachat ou de survente.
Calculer les valeurs du RSI, avec 70 comme ligne de surachat et 30 comme ligne de survente.
Considérez le passage du RSI au-dessus de 30 comme un signal de survente, et le passage du RSI au-dessous de 70 comme un signal de surachat.
Lorsque les signaux ci-dessus se produisent, vérifiez si la bougie actuelle ou précédente forme des motifs spécifiques comme le marubozu blanc/noir, le marteau/l'homme pendu, etc.
Si le signal RSI et la condition du chandelier sont satisfaits, générer des signaux d'achat/vente.
En conséquence, achetez sur RSI survendu lorsque des modèles haussiers comme le marteau se produisent, et vendez sur RSI suracheté lorsque des modèles baissiers comme l'étoile filante se produisent.
Identifier des combinaisons complexes comme une pince, des étoiles du matin et du soir pour les signaux d'entrée.
L'indice de résistance à l'inflation qui traverse la ligne médiane agit comme un signal de sortie.
La combinaison de l'indicateur et du motif filtre les faux signaux et améliore la précision d'entrée.
Le modèle de chandelier capture des points d'inversion de tendance importants.
Les signaux de surachat/survente augmentent les chances de gagner.
Les combinaisons double/triple de chandeliers captent des renversements plus forts.
L'indice de résistance à l'inflation aide à bloquer les profits.
Le décalage de l'indicateur RSI peut manquer les points d'inversion.
Certains signaux sont faibles et donnent de faux signaux.
Aucun stop loss basé sur un niveau élevé/faible récent, risque de perte incontrôlée.
Il n'y a pas d'arrêt de perte, un énorme mouvement négatif peut augmenter la perte.
Les données insuffisantes des backtests peuvent fausser l'optimisation des paramètres.
Ajoutez d'autres filtres comme MACD, Bollinger Bands.
Ajouter la ligne de tendance pour le stop loss/profit taking.
Optimiser les paramètres RSI en fonction des résultats des tests antérieurs.
Améliorer les arrêts tels que l'arrêt de trail, l'arrêt de zone, etc.
Testez des ensembles de données plus longs pour évaluer la robustesse des paramètres.
Ajuster les paramètres pour les différents produits et régimes de marché.
Cette stratégie intègre les atouts du RSI et de la reconnaissance des modèles de bougies pour entrer sur des signaux de haute qualité à des points tournants de surachat / survente pour suivre la tendance. Des modèles de combinaison forts améliorent également les cotes. Mais des risques comme le retard et les faux signaux demeurent, nécessitant une combinaison avec d'autres techniques et une optimisation supplémentaire.
/*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")