Indicatore Parabolic SAR: formula, impostazioni e lettura

Il Parabolic SAR (Welles Wilder, 1978) stampa un punto per barra a un livello di stop-and-reverse che si avvicina al prezzo a velocità crescente. Senzoukria usa i fattori originali di Wilder: un'accelerazione che parte da 0,02, un passo di 0,02 e un tetto di 0,2.

Senzoukria · Indicatori · Updated September 2026


Parabolic SAR Medie e volatilità, sul grafico dei prezzi.

Che cosa misura Parabolic SAR

A ogni barra il punto avanza dalla posizione precedente del fattore di accelerazione moltiplicato per la distanza dal punto estremo, il massimo più alto della tendenza rialzista in corso o il minimo più basso di quella ribassista. Due regole danno all'implementazione il suo comportamento esatto. Il punto viene limitato in modo da non poter mai stare all'interno del range delle due barre precedenti, il che impedisce un'inversione provocata dalla collocazione stessa dell'indicatore. E il fattore di accelerazione aumenta solo quando si forma un nuovo punto estremo: una barra che non estende la tendenza lascia il fattore dov'è, un dettaglio implementato spesso in modo errato. A un'inversione il vecchio punto estremo diventa il nuovo punto, l'estremo viene reimpostato al minimo o al massimo della barra corrente e il fattore torna al valore di partenza.

La formula, così come è implementata

Non è la definizione consueta altrove: è ciò che calcola il codice distribuito, documentato accanto alla sua implementazione:

Sortie `bands` avec TROU SYNCHRONISÉ : une seule des trois lignes indéfinie ⇒ les trois valent null à cette barre. Une bande à moitié définie (basis sans bord, bord sans basis) n'a aucun sens à l'écran et laisserait le renderer inventer un remplissage. */ function bandsOut( bars: readonly FootprintBar[], upperVals: ReadonlyArray<number | null>, basisVals: ReadonlyArray<number | null>, lowerVals: ReadonlyArray<number | null>, color: string, fillAlpha: number, ): SeriesOutput { const upper: SeriesPoint[] = []; const basis: SeriesPoint[] = []; const lower: SeriesPoint[] = []; for (let i = 0; i < bars.length; i++) { const t = bars[i].bucketTsNs; const u = upperVals[i] ?? null; const m = basisVals[i] ?? null; const l = lowerVals[i] ?? null; const ok = u !== null && m !== null && l !== null; upper.push({ time: t, value: ok ? u : null }); basis.push({ time: t, value: ok ? m : null }); lower.push({ time: t, value: ok ? l : null }); } return { shape: "bands", upper, basis, lower, fillAlpha, style: { color, width: 1 }, }; } /** Milieu (max high + min low)/2 de la fenêtre de N barres se terminant en i — la « ligne médiane » d'Ichimoku (Tenkan/Kijun/Senkou B en dérivent toutes). Warm-up (< N barres) → null. */ function donchianMidSeries( bars: readonly FootprintBar[], period: number, ): Array<number | null> { const n = Math.max(1, Math.floor(period)); const out: Array<number | null> = new Array(bars.length).fill(null); for (let i = n - 1; i < bars.length; i++) { let hi = Number.NEGATIVE_INFINITY; let lo = Number.POSITIVE_INFINITY; for (let j = i - n + 1; j <= i; j++) { if (bars[j].high > hi) hi = bars[j].high; if (bars[j].low < lo) lo = bars[j].low; } out[i] = (hi + lo) / 2; } return out; } /** Moindres carrés y = a + b·t sur la fenêtre de n valeurs se terminant en i (t = 0 pour la plus ancienne, t = n−1 pour la courante). Sommes fermées : Σt = n(n−1)/2, Σt² = n(n−1)(2n−1)/6. Même fit que le LSMA d'averages2.ts — recopié pour que la famille reste autonome (fonction privée là-bas). */ function linFit( values: readonly number[], i: number, n: number, ): { a: number; b: number } { const sumT = (n * (n - 1)) / 2; const sumT2 = (n * (n - 1) * (2 * n - 1)) / 6; let sumY = 0; let sumTY = 0; for (let t = 0; t < n; t++) { const y = values[i - n + 1 + t]; sumY += y; sumTY += t * y; } const denom = n * sumT2 - sumT * sumT; // > 0 dès n ≥ 2 const b = denom > 0 ? (n * sumTY - sumT * sumY) / denom : 0; const a = (sumY - b * sumT) / n; return { a, b }; } /** SMA_P appliquée au SUFFIXE défini d'une série à préfixe null (sortie d'un étage précédent — suffixe contigu par construction). P ≤ 1 → identité. Défensif : un null APRÈS le début du suffixe → tout null (on ne recolle pas deux morceaux séparés par un trou). */ function smoothSuffix( values: ReadonlyArray<number | null>, period: number, ): Array<number | null> { const p = Math.max(1, Math.floor(period)); if (p === 1) return values.slice(); const out: Array<number | null> = new Array(values.length).fill(null); let start = 0; while (start < values.length && values[start] === null) start++; if (start >= values.length) return out; const defined: number[] = []; for (let i = start; i < values.length; i++) { const v = values[i]; if (v === null) return out; defined.push(v); } const s = smaSeries(defined, p); for (let j = 0; j < s.length; j++) out[start + j] = s[j]; return out; } // ── Sessions ──────────────────────────────────────────────────────────────── type SessionOHLC = { o: number; h: number; l: number; c: number }; /** O/H/L/C d'une session complète : open de la PREMIÈRE barre, close de la DERNIÈRE, extrêmes sur toutes les barres. Les tranches de `splitSessions` sont non vides par construction → extrêmes finis. */ function sessionOHLC( bars: readonly FootprintBar[], ses: SessionSlice, ): SessionOHLC { let h = Number.NEGATIVE_INFINITY; let l = Number.POSITIVE_INFINITY; for (let i = ses.start; i <= ses.end; i++) { if (bars[i].high > h) h = bars[i].high; if (bars[i].low < l) l = bars[i].low; } return { o: bars[ses.start].open, h, l, c: bars[ses.end].close }; } /** Projection « session N−1 → session N » commune aux trois familles de pivots : chaque session passée calcule ses niveaux et les trace sur la SUIVANTE (bord droit du chart pour la session courante). La première session chargée n'a pas de précédente → rien n'est inventé. */ function projectedPivots( bars: readonly FootprintBar[], color: string, levelsOf: (prev: SessionOHLC) => Array<[number, string]>, ctx: SeriesContext, ): SeriesOutput[] { const sessions = splitSessions(bars, ctx); const levels: SeriesLevel[] = []; for (let s = 1; s < sessions.length; s++) { const prev = sessionOHLC(bars, sessions[s - 1]); const cur = sessions[s]; const from = bars[cur.start].bucketTsNs; const to = s === sessions.length - 1 ? null : bars[cur.end].bucketTsNs; for (const [price, label] of levelsOf(prev)) { levels.push({ price, from, to, color, label }); } } return [{ shape: "levels", levels }]; } // ── Swing (Fibonacci) ─────────────────────────────────────────────────────── /** Jambe de swing des N dernières barres : plus haut, plus bas, et SENS. Sens = ordre d'apparition des deux extrêmes : le plus haut arrivé APRÈS le plus bas ⇒ jambe HAUSSIÈRE (on retrace vers le bas depuis le sommet) ; sinon jambe BAISSIÈRE. Égalité d'extrêmes (plusieurs barres au même prix) : on garde la DERNIÈRE occurrence (`>=` / `<=`) — c'est le retest le plus récent qui définit la jambe active, pas le premier contact. `null` si moins de N barres (une fenêtre partielle mentirait sur son lookback — règle du catalogue) ou si le range est nul (high = low : il n'y a aucune jambe à retracer, 7 niveaux confondus seraient du bruit). */ type SwingLeg = { hi: number; lo: number; up: boolean; from: number }; function lastSwingLeg( bars: readonly FootprintBar[], lookback: number, ): SwingLeg | null { const n = Math.max(1, Math.floor(lookback)); if (bars.length < n) return null; const start = bars.length - n; let hi = Number.NEGATIVE_INFINITY; let lo = Number.POSITIVE_INFINITY; let hiIdx = start; let loIdx = start; for (let i = start; i < bars.length; i++) { if (bars[i].high >= hi) { hi = bars[i].high; hiIdx = i; } if (bars[i].low <= lo) { lo = bars[i].low; loIdx = i; } } if (!(hi > lo)) return null; return { hi, lo, up: hiIdx >= loIdx, from: bars[start].bucketTsNs }; } // ── Défs ──────────────────────────────────────────────────────────────────── /** Parabolic SAR (Wilder, 1978) — points de stop-and-reverse. AMORÇAGE (barre 1 ; la barre 0 n'émet rien, elle sert de référence) : tendance = HAUSSIÈRE si close[1] ≥ close[0], baissière sinon (l'égalité part haussière — choix arbitraire mais DÉTERMINISTE, documenté) ; SAR[1] = low[0] en hausse / high[0] en baisse ; EP = high[1] en hausse / low[1] en baisse ; AF = afStart. PAS COURANT (i ≥ 2), dans cet ordre EXACT : 1. SAR[i] = SAR[i−1] + AF·(EP − SAR[i−1]) — l'accélération travaille sur la distance au point extrême, pas sur le prix ; 2. BRIDAGE sur les DEUX barres précédentes : en hausse SAR[i] ≤ min(low[i−1], low[i−2]) ; en baisse SAR[i] ≥ max(high[i−1], high[i−2]). Sans cette borne le SAR pourrait se placer à l'intérieur du range récent et déclencher un flip fantôme ; 3. BASCULE : en hausse, low[i] < SAR[i] ⇒ tendance BAISSIÈRE et SAR[i] = EP (l'ancien point extrême devient le stop), EP = low[i], AF remis à afStart. Symétriquement en baisse avec high[i] > SAR[i] ; 4. SANS bascule, MISE À JOUR DE L'AF : uniquement si un NOUVEAU point extrême est fait (high[i] > EP en hausse, low[i] < EP en baisse) → EP = ce nouvel extrême et AF = min(AF + afStep, afMax). Une barre qui n'étend pas la tendance ne fait PAS accélérer l'AF (erreur classique). Défauts de Wilder : afStart 0.02, afStep 0.02, afMax 0.2. Sortie : un dot par barre (à partir de la barre 1) au niveau du SAR, coloré par la tendance COURANTE — la barre de flip porte déjà la couleur de la nouvelle tendance.

Come leggerlo

  • Un punto sotto le barre significa che lo stato attuale è rialzista e che il punto è il livello che lo invertirebbe; un punto sopra significa il contrario.
  • Punti che si avvicinano al prezzo sempre più rapidamente da una barra all'altra mostrano che il fattore di accelerazione è stato aumentato più volte, cosa che accade solo finché la tendenza continua a segnare nuovi estremi.
  • Punti equidistanti che smettono di convergere ti dicono che la tendenza ha smesso di estendersi, anche se lo stato non è ancora cambiato.
  • La barra su cui lo stato si inverte porta già il colore del nuovo stato: leggi il cambio di colore come l'inversione stessa, non come un avvertimento che la precede.

Parametri e valori predefiniti

AF iniziale e passo AF sono 0,02 di default, entrambi regolabili da 0,001 a 0,5, e AF massimo è 0,2 di default in un intervallo da 0,01 a 1; questi valori predefiniti sono quelli pubblicati da Wilder. Aumentare il valore iniziale o il passo fa avvicinare i punti al prezzo prima e accorcia il tempo medio prima di un'inversione, mentre alzare il tetto lascia crescere l'accelerazione in una tendenza lunga. Con un fattore pari a 1 il punto salterebbe direttamente sul punto estremo in una sola barra, ed è per questo che il tetto si lascia di norma ben al di sotto. Il primo punto viene emesso sulla seconda barra della serie, inizializzato dal massimo o dal minimo della prima barra.

Parabolic SAR — parametri disponibili nell’applicazione, con i valori predefiniti.
ParametroTipoPredefinitoIntervallo
AF startnumber0.020.001 – 0.5
AF stepnumber0.020.001 – 0.5
AF maxnumber0.20.01 – 1

Ciò che non mostra

Il Parabolic SAR ha sempre uno stato, quindi non è mai neutrale: in un mercato laterale si inverte avanti e indietro, producendo una sequenza di inversioni che non corrispondono ad alcuna tendenza. Non ha alcun termine di volatilità oltre ai massimi e minimi recenti usati per il limite, quindi non si adatta a un cambio di regime come fa uno stop basato sull'ATR. Lo stato iniziale si decide confrontando le prime due chiusure, con la parità risolta come rialzista, quindi un grafico caricato da una barra di partenza diversa può cominciare nello stato opposto. E tutto il calcolo è geometria del prezzo: massimi, minimi e chiusure decidono tutto, senza alcun termine di volume.

Vedi tutti gli indicatori

Questa pagina in altre lingue

Frequently asked questions

Che cosa rappresenta un punto del Parabolic SAR?
È il livello di stop-and-reverse per quella barra. Finché lo stato della tendenza è rialzista il punto sta sotto il prezzo e sale verso di esso, e se il minimo di una barra scambia sotto il punto lo stato si inverte e il punto passa sopra il prezzo. Il punto è un livello calcolato dalle barre passate, non una previsione di dove andrà il prezzo.
Quando aumenta il fattore di accelerazione?
Solo quando la tendenza registra un nuovo punto estremo, cioè un massimo più alto in tendenza rialzista o un minimo più basso in tendenza ribassista. In quel caso il fattore aumenta del passo, 0,02 di default, fino al tetto di 0,2. Una barra che non estende la tendenza lascia il fattore invariato, e i punti smettono di convergere.
Perché il Parabolic SAR si inverte così spesso in un range?
Perché è sempre in uno stato o nell'altro e il suo livello continua ad avvicinarsi al prezzo a ogni barra. In un range il prezzo non ha una direzione sostenuta, quindi il punto lo raggiunge e si inverte ripetutamente. Il calcolo è costruito per seguire una tendenza esistente e non ha alcun meccanismo per segnalarne l'assenza.

Keep reading