Indicateur de Chandeliers Japonais et RSI

Introduction :
Cet indicateur combine la puissance des chandeliers japonais avec le RSI (Relative Strength Index) pour vous fournir des points potentiels de retournement de tendance. En se concentrant sur les zones de surachat et de survente du RSI, et en les couplant avec les formations de chandeliers japonais clés sur les supports et résistances, cet indicateur vise à offrir des signaux de trading de haute qualité.

Fonctionnalités :

Identification des zones de surachat (>70) et survente (<30) du RSI.
Marquage des formations clés de chandeliers japonais qui se produisent à proximité des niveaux de support et de résistance.
Backtesting inclus pour évaluer la performance historique de l'indicateur.
Comment l'utiliser :
Lorsque le RSI est en zone de surachat ou de survente, et qu'un chandelier japonais clé se forme près d'un niveau de support ou de résistance, cela pourrait indiquer un potentiel retournement de tendance. Utilisez ces signaux comme point de départ pour des recherches supplémentaires et en combinaison avec d'autres indicateurs et techniques d'analyse pour renforcer la validité du signal.

Avertissement :
Ce script est fourni à des fins éducatives uniquement. Trader's Journal et ses affiliés ne sont pas responsables des décisions de trading prises à partir de cet indicateur. Il est essentiel de toujours effectuer votre propre analyse et de consulter un professionnel avant de prendre des décisions de trading.

______________________________________________________________________________________________________________________________________________________________________

code à copier 

// This work is licensed under a Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0) https://creativecommons.org/licenses/by-nc-sa/4.0/// © tradersjournal
//@version=5indicator("Chandeliers japonais & support& resistance[Chandeliers japonais & support& resistance traders journal]", " [traders journal]"  , overlay = true  , max_labels_count = 500  , max_lines_count = 500  , max_boxes_count = 500  , max_bars_back = 500)

rsi_length = 14rsi_upper = 70rsi_lower = 30rsi_val = ta.rsi(close, rsi_length)
// Fonctions pour détecter les motifs des chandeliersis_bullish_engulfing() =>    close[1] < open[1] and open < close and close > open[1] and open < close[1]
is_bearish_engulfing() =>    close[1] > open[1] and open > close and close < open[1] and open > close[1]
is_morning_star() =>    close[2] < open[2] and close[1] < close[2] and close > open
is_evening_star() =>    close[2] > open[2] and close[1] > close[2] and close < open
is_bullish_harami() =>    close[1] < open[1] and close > open and open > close[1] and close < open[1]
is_bearish_harami() =>    close[1] > open[1] and close < open and open < close[1] and close > open[1]
is_hammer_or_hanging_man() =>    (high - (open > close ? open : close)) <= 0.25 * (high - low) and open - low >= 0.66 * (high - low)
is_shooting_star_or_inverted_hammer() =>    open - high <= 0.25 * (high - low) and high - close >= 0.66 * (high - low)
is_doji() =>    math.abs(close - open) < 0.01 * (high - low)
is_bullish_piercing() =>    close[1] < open[1] and open < close[1] and close > (open[1] + close[1]) / 2 and close < open[1]
is_dark_cloud_cover() =>    close[1] > open[1] and open > close[1] and close < (open[1] + close[1]) / 2 and close > open[1]
// Affichage des motifs sur le graphique en fonction du RSIplotshape(series=rsi_val > rsi_upper and is_bearish_engulfing() ? high : na, color=color.red, style=shape.triangledown, title="Avalement baissier", text="Avalement baissier", location=location.abovebar)plotshape(series=rsi_val < rsi_lower and is_bullish_engulfing() ? low : na, color=color.blue, style=shape.triangleup, title="Avalement haussier", text="Avalement haussier", location=location.belowbar)plotshape(series=rsi_val > rsi_upper and is_evening_star() ? high : na, color=color.red, style=shape.triangledown, title="Etoile du soir", text="Etoile du soir", location=location.abovebar)plotshape(series=rsi_val < rsi_lower and is_morning_star() ? low : na, color=color.blue, style=shape.triangleup, title="Etoile du matin", text="Etoile du matin", location=location.belowbar)plotshape(series=rsi_val > rsi_upper and is_bearish_harami() ? high : na, color=color.red, style=shape.triangledown, title="Harami baissier", text="Harami baissier", location=location.abovebar)plotshape(series=rsi_val < rsi_lower and is_bullish_harami() ? low : na, color=color.blue, style=shape.triangleup, title="Harami haussier", text="Harami haussier", location=location.belowbar)plotshape(series=rsi_val > rsi_upper and is_hammer_or_hanging_man() ? high : na, color=color.red, style=shape.triangledown, title="Pendu/Marteau", text="Pendu/Marteau", location=location.abovebar)plotshape(series=rsi_val < rsi_lower and is_shooting_star_or_inverted_hammer() ? low : na, color=color.blue, style=shape.triangleup, title="Etoile filante/Marteau inversé", text="Etoile filante/Marteau inversé", location=location.belowbar)plotshape(series=rsi_val > rsi_upper and is_doji() ? high : na, color=color.red, style=shape.triangledown, title="Doji", text="Doji", location=location.abovebar)plotshape(series=rsi_val < rsi_lower and is_bullish_piercing() ? low : na, color=color.blue, style=shape.triangleup, title="Pénétrante haussière", text="Pénétrante haussière", location=location.belowbar)plotshape(series=rsi_val > rsi_upper and is_dark_cloud_cover() ? high : na, color=color.red, style=shape.triangledown, title="Couverture nuage noir", text="Couverture nuage noir", location=location.abovebar)
///////////////////////////////////////////////////////////////////////////////////////////SUPPORT ET RESISTANCE//////////////////////////////////////////////////////////////
prd = input.int(defval=10, title='Pivot Period', minval=4, maxval=30, group='Settings 🔨', tooltip='Used while calculating Pivot Points, checks left&right bars')ppsrc = input.string(defval='High/Low', title='Source', options=['High/Low', 'Close/Open'], group='Settings 🔨', tooltip='Source for Pivot Points')ChannelW = input.int(defval=5, title='Maximum Channel Width %', minval=1, maxval=8, group='Settings 🔨', tooltip='Calculated using Highest/Lowest levels in 300 bars')minstrength = input.int(defval=1, title='Minimum Strength', minval=1, group='Settings 🔨', tooltip='Channel must contain at least 2 Pivot Points')maxnumsr = input.int(defval=6, title='Maximum Number of S/R', minval=1, maxval=10, group='Settings 🔨', tooltip='Maximum number of Support/Resistance Channels to Show') - 1loopback = input.int(defval=290, title='Loopback Period', minval=100, maxval=400, group='Settings 🔨', tooltip='While calculating S/R levels it checks Pivots in Loopback Period')res_col = input.color(defval=color.new(color.red, 75), title='Resistance Color', group='Colors 🟡🟢🟣')sup_col = input.color(defval=color.new(color.lime, 75), title='Support Color', group='Colors 🟡🟢🟣')inch_col = input.color(defval=color.new(color.gray, 75), title='Color When Price in Channel', group='Colors 🟡🟢🟣')showpp = input.bool(defval=false, title='Show Pivot Points', group='Extras ⏶⏷')showsrbroken = input.bool(defval=false, title='Show Broken Support/Resistance', group='Extras ⏶⏷')showthema1en = input.bool(defval=false, title='MA 1', inline='ma1')showthema1len = input.int(defval=50, title='', inline='ma1')showthema1type = input.string(defval='SMA', title='', options=['SMA', 'EMA'], inline='ma1')showthema2en = input.bool(defval=false, title='MA 2', inline='ma2')showthema2len = input.int(defval=200, title='', inline='ma2')showthema2type = input.string(defval='SMA', title='', options=['SMA', 'EMA'], inline='ma2')
ma1 = showthema1en ? showthema1type == 'SMA' ? ta.sma(close, showthema1len) : ta.ema(close, showthema1len) : nama2 = showthema2en ? showthema2type == 'SMA' ? ta.sma(close, showthema2len) : ta.ema(close, showthema2len) : na
plot(ma1, color=not na(ma1) ? color.blue : na)plot(ma2, color=not na(ma2) ? color.red : na)
// get Pivot High/lowfloat src1 = ppsrc == 'High/Low' ? high : math.max(close, open)float src2 = ppsrc == 'High/Low' ? low : math.min(close, open)float ph = ta.pivothigh(src1, prd, prd)float pl = ta.pivotlow(src2, prd, prd)
// draw Pivot pointsplotshape(ph and showpp, text='H', style=shape.labeldown, color=na, textcolor=color.new(color.red, 0), location=location.abovebar, offset=-prd)plotshape(pl and showpp, text='L', style=shape.labelup, color=na, textcolor=color.new(#1700e6, 0), location=location.belowbar, offset=-prd)
//calculate maximum S/R channel widthprdhighest = ta.highest(300)prdlowest = ta.lowest(300)cwidth = (prdhighest - prdlowest) * ChannelW / 100
// get/keep Pivot levelsvar pivotvals = array.new_float(0)var pivotlocs = array.new_float(0)if ph or pl    array.unshift(pivotvals, ph ? ph : pl)    array.unshift(pivotlocs, bar_index)    for x = array.size(pivotvals) - 1 to 0 by 1        if bar_index - array.get(pivotlocs, x) > loopback  // remove old pivot points            array.pop(pivotvals)            array.pop(pivotlocs)            continue        break
//find/create SR channel of a pivot pointget_sr_vals(ind) =>    float lo = array.get(pivotvals, ind)    float hi = lo    int numpp = 0    for y = 0 to array.size(pivotvals) - 1 by 1        float cpp = array.get(pivotvals, y)        float wdth = cpp <= hi ? hi - cpp : cpp - lo        if wdth <= cwidth  // fits the max channel width?            if cpp <= hi                lo := math.min(lo, cpp)                lo            else                hi := math.max(hi, cpp)                hi
            numpp += 20  // each pivot point added as 20            numpp    [hi, lo, numpp]
// keep old SR channels and calculate/sort new channels if we met new pivot pointvar suportresistance = array.new_float(20, 0)  // min/max levelschangeit(x, y) =>    tmp = array.get(suportresistance, y * 2)    array.set(suportresistance, y * 2, array.get(suportresistance, x * 2))    array.set(suportresistance, x * 2, tmp)    tmp := array.get(suportresistance, y * 2 + 1)    array.set(suportresistance, y * 2 + 1, array.get(suportresistance, x * 2 + 1))    array.set(suportresistance, x * 2 + 1, tmp)
if ph or pl    supres = array.new_float(0)  // number of pivot, strength, min/max levels    stren = array.new_float(10, 0)    // get levels and strengs    for x = 0 to array.size(pivotvals) - 1 by 1        [hi, lo, strength] = get_sr_vals(x)        array.push(supres, strength)        array.push(supres, hi)        array.push(supres, lo)
    // add each HL to strengh    for x = 0 to array.size(pivotvals) - 1 by 1        h = array.get(supres, x * 3 + 1)        l = array.get(supres, x * 3 + 2)        s = 0        for y = 0 to loopback by 1            if high[y] <= h and high[y] >= l or low[y] <= h and low[y] >= l                s += 1                s        array.set(supres, x * 3, array.get(supres, x * 3) + s)
    //reset SR levels    array.fill(suportresistance, 0)    // get strongest SRs    src = 0    for x = 0 to array.size(pivotvals) - 1 by 1        stv = -1.  // value        stl = -1  // location        for y = 0 to array.size(pivotvals) - 1 by 1            if array.get(supres, y * 3) > stv and array.get(supres, y * 3) >= minstrength * 20                stv := array.get(supres, y * 3)                stl := y                stl        if stl >= 0            //get sr level            hh = array.get(supres, stl * 3 + 1)            ll = array.get(supres, stl * 3 + 2)            array.set(suportresistance, src * 2, hh)            array.set(suportresistance, src * 2 + 1, ll)            array.set(stren, src, array.get(supres, stl * 3))
            // make included pivot points' strength zero             for y = 0 to array.size(pivotvals) - 1 by 1                if array.get(supres, y * 3 + 1) <= hh and array.get(supres, y * 3 + 1) >= ll or array.get(supres, y * 3 + 2) <= hh and array.get(supres, y * 3 + 2) >= ll                    array.set(supres, y * 3, -1)
            src += 1            if src >= 10                break
    for x = 0 to 8 by 1        for y = x + 1 to 9 by 1            if array.get(stren, y) > array.get(stren, x)                tmp = array.get(stren, y)                array.set(stren, y, array.get(stren, x))                changeit(x, y)

get_level(ind) =>    float ret = na    if ind < array.size(suportresistance)        if array.get(suportresistance, ind) != 0            ret := array.get(suportresistance, ind)            ret    ret
get_color(ind) =>    color ret = na    if ind < array.size(suportresistance)        if array.get(suportresistance, ind) != 0            ret := array.get(suportresistance, ind) > close and array.get(suportresistance, ind + 1) > close ? res_col : array.get(suportresistance, ind) < close and array.get(suportresistance, ind + 1) < close ? sup_col : inch_col            ret    ret
var srchannels = array.new_box(10)for x = 0 to math.min(9, maxnumsr) by 1    box.delete(array.get(srchannels, x))    srcol = get_color(x * 2)    if not na(srcol)        array.set(srchannels, x, box.new(left=bar_index, top=get_level(x * 2), right=bar_index + 1, bottom=get_level(x * 2 + 1), border_color=srcol, border_width=1, extend=extend.both, bgcolor=srcol))
resistancebroken = falsesupportbroken = false
// check if it's not in a channelnot_in_a_channel = truefor x = 0 to math.min(9, maxnumsr) by 1    if close <= array.get(suportresistance, x * 2) and close >= array.get(suportresistance, x * 2 + 1)        not_in_a_channel := false        not_in_a_channel
// if price is not in a channel then check broken onesif not_in_a_channel    for x = 0 to math.min(9, maxnumsr) by 1        if close[1] <= array.get(suportresistance, x * 2) and close > array.get(suportresistance, x * 2)            resistancebroken := true            resistancebroken        if close[1] >= array.get(suportresistance, x * 2 + 1) and close < array.get(suportresistance, x * 2 + 1)            supportbroken := true            supportbroken
alertcondition(resistancebroken, title='Resistance Broken', message='Resistance Broken')alertcondition(supportbroken, title='Support Broken', message='Support Broken')plotshape(showsrbroken and resistancebroken, style=shape.triangleup, location=location.belowbar, color=color.new(#0400e6, 0), size=size.tiny)plotshape(showsrbroken and supportbroken, style=shape.triangledown, location=location.abovebar, color=color.new(color.red, 0), size=size.tiny)