Индикатор 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 точка перепрыгнула бы прямо на экстремальную точку за один бар — поэтому потолок обычно оставляют заметно ниже. Первая точка выводится на втором баре ряда и стартует от максимума или минимума первого.
| Параметр | Тип | По умолчанию | Диапазон |
|---|---|---|---|
| AF start | number | 0.02 | 0.001 – 0.5 |
| AF step | number | 0.02 | 0.001 – 0.5 |
| AF max | number | 0.2 | 0.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 так часто переворачивается в боковике?
- Потому что он всегда находится в одном из двух состояний, а его уровень каждый бар приближается к цене. В боковике у цены нет устойчивого направления, поэтому точка догоняет её и разворачивается снова и снова. Расчёт создан, чтобы вести уже существующий тренд, и не имеет механизма сообщить об отсутствии тренда.