Indicatore RSI: formula, impostazioni e lettura
L'RSI (Relative Strength Index) confronta l'ampiezza media delle chiusure in rialzo con quella delle chiusure in ribasso su una finestra di osservazione ed esprime il rapporto su una scala da 0 a 100. Senzoukria lo calcola con la smussatura originale di Wilder sulle chiusure delle barre, con un periodo predefinito di 14.
Senzoukria · Indicatori · Updated September 2026
RSI — Momentum, in un pannello separato sotto il grafico.
Che cosa misura RSI
Il valore esprime la proporzione tra guadagno medio e perdita media all'interno della finestra smussata, non la distanza percorsa dal prezzo. La serie viene inizializzata con la media semplice delle prime quattordici variazioni da chiusura a chiusura, quindi non compare nulla finché queste quattordici variazioni non sono state elaborate; da lì in poi ogni barra aggiorna entrambe le medie con la ricorsione di Wilder, che conserva in memoria ogni variazione precedente con un peso decrescente. Tre casi limite sono definiti esplicitamente: una finestra di soli guadagni restituisce 100, una finestra di sole perdite restituisce 0 e una finestra del tutto piatta, in cui entrambe le medie sono zero, non restituisce alcun valore invece di 100, perché un mercato che non si è mosso non contiene alcuna informazione direzionale. Il calcolo è continuo e non viene mai azzerato al cambio di sessione.
La formula, così come è implementata
Non è la definizione consueta altrove: è ciò che calcola il codice distribuito, documentato accanto alla sua implementazione:
Période entière ≥ `min` depuis les params (garde-fou UI). */ function intParam( params: Record<string, unknown>, key: string, fallback: number, min = 1, ): number { return Math.max(min, Math.floor(numParam(params, key, fallback))); } function toPoints( bars: readonly FootprintBar[], values: ReadonlyArray<number | null>, ): SeriesPoint[] { return bars.map((b, i) => ({ time: b.bucketTsNs, value: values[i] ?? null })); } /** SMA N sur série à trous : null dès qu'UNE valeur de la fenêtre est null — moyenner autour d'un trou mentirait sur la période effective. */ function smaNullable( values: ReadonlyArray<number | null>, period: number, ): Array<number | null> { const n = Math.max(1, Math.floor(period)); const out: Array<number | null> = new Array<number | null>(values.length).fill(null); for (let i = n - 1; i < values.length; i++) { let sum = 0; let ok = true; for (let j = i - n + 1; j <= i; j++) { const v = values[j]; if (v === null) { ok = false; break; } sum += v; } if (ok) out[i] = sum / n; } return out; } /** EMA N sur une série dont les valeurs définies forment un SUFFIXE contigu (sortie d'un lissage précédent) : l'EMA tourne sur le suffixe, le préfixe reste null. Série toute-null (ou trou interne — impossible dans nos usages) → tout-null, on ne devine pas. */ function suffixEma( values: ReadonlyArray<number | null>, period: number, ): Array<number | null> { const out: Array<number | null> = new Array<number | null>(values.length).fill(null); const start = values.findIndex((v) => v !== null); if (start < 0) return out; const defined: number[] = []; for (let i = start; i < values.length; i++) { const v = values[i]; if (v === null) return out; // pas un suffixe contigu → dégradation propre defined.push(v); } const ema = emaSeries(defined, period); for (let j = 0; j < ema.length; j++) out[start + j] = ema[j]; return out; } /** Égalités RSI (documentées) : marché PLAT (les deux moyennes nulles) → null — pas d'information directionnelle (déviation assumée du Pine `down==0 → 100`, qui afficherait 100 sur du plat) ; que des gains → 100 ; que des pertes → 0. */ function rsiValue(avgGain: number, avgLoss: number): number | null { if (avgLoss === 0 && avgGain === 0) return null; if (avgLoss === 0) return 100; if (avgGain === 0) return 0; return 100 - 100 / (1 + avgGain / avgLoss); } /** RSI de Wilder sur une série de valeurs (closes ici, série RSI pour le StochRSI). Graine = moyenne SIMPLE des N premières variations, puis lissage Wilder ; premier point à l'indice N (N variations consommées). */ function wilderRsiSeries( values: readonly number[], period: number, ): Array<number | null> { const n = Math.max(1, Math.floor(period)); const out: Array<number | null> = new Array<number | null>(values.length).fill(null); if (values.length < n + 1) return out; let avgGain = 0; let avgLoss = 0; for (let i = 1; i <= n; i++) { const ch = values[i] - values[i - 1]; if (ch > 0) avgGain += ch; else avgLoss -= ch; } avgGain /= n; avgLoss /= n; out[n] = rsiValue(avgGain, avgLoss); for (let i = n + 1; i < values.length; i++) { const ch = values[i] - values[i - 1]; avgGain = (avgGain * (n - 1) + Math.max(0, ch)) / n; avgLoss = (avgLoss * (n - 1) + Math.max(0, -ch)) / n; out[i] = rsiValue(avgGain, avgLoss); } return out; } /** %K brut : 100·(close − LL_N)/(HH_N − LL_N) sur high/low des barres. Fenêtre PLATE (HH == LL) → null : 0/0 = pas d'information (même règle que delta-percent). */ function rawStochK( bars: readonly FootprintBar[], period: number, ): Array<number | null> { const n = Math.max(1, Math.floor(period)); const out: Array<number | null> = new Array<number | null>(bars.length).fill(null); for (let i = n - 1; i < bars.length; i++) { let hh = Number.NEGATIVE_INFINITY; let ll = Number.POSITIVE_INFINITY; for (let j = i - n + 1; j <= i; j++) { if (bars[j].high > hh) hh = bars[j].high; if (bars[j].low < ll) ll = bars[j].low; } const range = hh - ll; out[i] = range > 0 ? (100 * (bars[i].close - ll)) / range : null; } return out; } function typicalPrice(b: FootprintBar): number { return (b.high + b.low + b.close) / 3; } /** True range de la barre i — TR[0] = high − low (pas de close précédent), même définition que `atrSeries` (averages.ts). */ function trueRangeAt(bars: readonly FootprintBar[], i: number): number { const b = bars[i]; if (i === 0) return b.high - b.low; const pc = bars[i - 1].close; return Math.max(b.high - b.low, Math.abs(b.high - pc), Math.abs(b.low - pc)); } // ── Defs ──────────────────────────────────────────────────────────────────── /** RSI (Wilder, 1978) — lissage WILDER : gain = max(0, close − closeₚ) ; loss = max(0, closeₚ − close) graine = moyenne simple des N premiers gains/losses (à l'indice N) ; puis avg = (avg·(N−1) + x)/N ; RSI = 100 − 100/(1 + avgGain/avgLoss) Égalités : cf. `rsiValue` (plat → null, tout-gain → 100, tout-perte → 0). CONTINU — pas de reset session. Défaut N=14 (Wilder).
Come leggerlo
- Una lettura sopra 70 significa che le chiusure in rialzo hanno dominato la finestra smussata. In un trend prolungato l'RSI può restare in quella zona a lungo: va letto come la descrizione di ciò che è già accaduto, non come un segnale di inversione.
- Una lettura sotto 30 descrive il caso speculare: sono le chiusure in ribasso ad aver dominato la finestra.
- La linea dei 50 separa le finestre in cui il guadagno medio supera la perdita media da quelle in cui accade il contrario. Un attraversamento modifica questo equilibrio; da solo non stabilisce un trend.
- Una divergenza, con il prezzo che segna un massimo più alto mentre l'RSI segna un massimo più basso, indica che la seconda gamba è stata costruita con chiusure in rialzo più piccole della prima. Verificala sul footprint delle due gambe prima di trarre conclusioni.
- Un'interruzione della linea significa che la finestra era piatta e non è stato definito alcun valore. Un vuoto non equivale a un valore zero.
Parametri e valori predefiniti
Il periodo è 14 per impostazione predefinita, la scelta dello stesso Wilder, e accetta valori da 2 a 200. Un periodo più breve reagisce con più forza a ogni nuova chiusura e raggiunge le zone di 30 e 70 molto più spesso; uno più lungo appiattisce la curva e rende rari gli estremi. L'impostazione del colore cambia soltanto il modo in cui la linea viene disegnata nel suo pannello.
| Parametro | Tipo | Predefinito | Intervallo |
|---|---|---|---|
| Period | number | 14 | 2 – 200 |
Ciò che non mostra
L'RSI legge le chiusure e nient'altro. Se una gamba sia stata costruita da compratori che prendono l'offerta o da venditori che si ritirano è una distinzione che si trova nelle colonne bid × ask di una barra footprint, e nessuna lettura di questa linea la recupera. Poiché la serie è continua tra una sessione e l'altra, un gap notturno entra nel calcolo come un'unica grande variazione da chiusura a chiusura e continua poi a influenzare le medie per molte barre. La smussatura di Wilder ha per costruzione una memoria lunga, quindi una singola barra fuori scala resta visibile nel valore ben dopo essere stata stampata. I tratti piatti producono veri vuoti nella linea invece di una lettura predefinita.
Indicatori correlati
- Stochastic — Momentum
- Stoch RSI — Momentum
- CCI — Momentum
- ROC — Momentum
- Williams %R — Momentum
- Momentum — Momentum
Questa pagina in altre lingue
Frequently asked questions
- Che cosa significa un RSI a 70?
- Un RSI a 70 significa che, sulla finestra di osservazione, la chiusura media in rialzo è stata circa 2,33 volte la chiusura media in ribasso. Descrive un periodo in cui hanno dominato le chiusure in rialzo; non misura quanta strada il prezzo possa ancora fare e, in un mercato in trend, il valore può restare sopra 70 per molte barre consecutive.
- Questo RSI è lo stesso delle altre piattaforme grafiche?
- La smussatura è la ricorsione standard di Wilder, inizializzata con la media semplice delle prime N variazioni, come nelle implementazioni abituali. Un caso differisce di proposito: quando il guadagno medio e la perdita media sono entrambi zero, cioè il mercato è rimasto perfettamente piatto, Senzoukria non restituisce alcun valore, mentre alcune versioni derivate da Pine restituiscono 100 in questa situazione.
- L'RSI si azzera all'inizio di ogni sessione di trading?
- No. Qui la serie dell'RSI è continua: le medie smussate passano da una sessione alla successiva. La prima variazione di una nuova sessione è quindi il gap tra la chiusura precedente e quella nuova, che può essere ampio sui contratti futures negoziati in sessioni separate.