Индикатор Parabolic SAR: формула, настройки и чтение

Parabolic SAR (Уэллс Уайлдер, 1978) ставит на каждом баре одну точку на уровне stop and reverse, который движется к цене с нарастающим ускорением. Senzoukria использует исходные коэффициенты Уайлдера: стартовое ускорение 0,02, шаг 0,02 и потолок 0,2.

Senzoukria · Индикаторы · Updated September 2026


Parabolic SAR Скользящие средние и волатильность, на ценовом графике.

Что измеряет Parabolic SAR

На каждом баре точка сдвигается от своего прежнего положения на коэффициент ускорения, умноженный на расстояние до экстремальной точки — наибольшего максимума текущего восходящего тренда или наименьшего минимума текущего нисходящего. Точное поведение реализации задают два правила. Точка ограничена так, что никогда не может оказаться внутри диапазона двух предыдущих баров, — это предотвращает разворот, вызванный самим расположением индикатора. И коэффициент ускорения растёт только тогда, когда сделана новая экстремальная точка: бар, который не продолжил тренд, оставляет коэффициент на месте — деталь, которую часто реализуют неверно. На перевороте прежняя экстремальная точка становится новой точкой, экстремум сбрасывается на минимум или максимум текущего бара, а коэффициент возвращается к стартовому значению.

Формула — так, как она реализована

Это не привычное определение из других источников, а то, что вычисляет поставляемый код, задокументированное рядом с реализацией:

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.

Как его читать

  • Точка под барами означает, что текущее состояние восходящее и эта точка — уровень, который его развернёт; точка над барами означает обратное.
  • Точки, которые от бара к бару приближаются к цене всё быстрее, показывают, что коэффициент ускорения повышался многократно, а это происходит только пока тренд продолжает делать новые экстремумы.
  • Равномерно расставленные точки, переставшие сближаться с ценой, говорят, что тренд перестал продолжаться, хотя состояние ещё не сменилось.
  • Бар, на котором состояние переворачивается, уже несёт цвет нового состояния, поэтому смену цвета читают как сам переворот, а не как предупреждение перед ним.

Параметры и значения по умолчанию

Старт AF и шаг AF по умолчанию равны 0,02, оба настраиваются в диапазоне от 0,001 до 0,5, а максимум AF по умолчанию равен 0,2 в диапазоне от 0,01 до 1; это опубликованные значения Уайлдера. Увеличение старта или шага заставляет точки приближаться к цене раньше и сокращает среднее время до переворота, а повышение потолка позволяет ускорению расти дольше в длинном тренде. При коэффициенте 1 точка перепрыгнула бы прямо на экстремальную точку за один бар — поэтому потолок обычно оставляют заметно ниже. Первая точка выводится на втором баре ряда и стартует от максимума или минимума первого.

Parabolic SAR — параметры, доступные в приложении, со значениями по умолчанию.
ПараметрТипПо умолчаниюДиапазон
AF startnumber0.020.001 – 0.5
AF stepnumber0.020.001 – 0.5
AF maxnumber0.20.01 – 1

Чего он не показывает

Parabolic SAR всегда находится в каком-то состоянии, то есть он никогда не нейтрален: в боковике он переворачивается туда и обратно, выдавая череду разворотов, которым не соответствует никакой тренд. У него нет члена волатильности сверх недавних максимумов и минимумов, используемых для ограничения, поэтому он не подстраивается под смену режима так, как это делает стоп по ATR. Начальное состояние определяется сравнением первых двух закрытий, а равенство трактуется как бычье, поэтому график, загруженный с другого стартового бара, может начаться в другом состоянии. И весь расчёт — это геометрия цены: всё решают максимумы, минимумы и закрытия, без какого-либо члена по объёму.

  • SMA Скользящие средние и волатильность
  • EMA Скользящие средние и волатильность
  • WMA Скользящие средние и волатильность
  • Hull MA Скользящие средние и волатильность
  • ATR (Wilder) Скользящие средние и волатильность
  • Bollinger Скользящие средние и волатильность

Все индикаторы

Эта страница на других языках

Frequently asked questions

Что означает точка Parabolic SAR?
Это уровень stop and reverse для данного бара. Пока состояние тренда восходящее, точка стоит под ценой и поднимается к ней, а если минимум бара уйдёт под точку, состояние развернётся и точка перейдёт над ценой. Точка — это уровень, посчитанный по прошлым барам, а не прогноз, куда пойдёт цена.
Когда растёт коэффициент ускорения?
Только когда тренд фиксирует новую экстремальную точку, то есть более высокий максимум в восходящем тренде или более низкий минимум в нисходящем. В этом случае коэффициент растёт на шаг, по умолчанию 0,02, вплоть до потолка 0,2. Бар, не продливший тренд, оставляет коэффициент прежним, и точки перестают сближаться с ценой.
Почему Parabolic SAR так часто переворачивается в боковике?
Потому что он всегда находится в одном из двух состояний, а его уровень каждый бар приближается к цене. В боковике у цены нет устойчивого направления, поэтому точка догоняет её и разворачивается снова и снова. Расчёт создан, чтобы вести уже существующий тренд, и не имеет механизма сообщить об отсутствии тренда.

Keep reading