مؤشر Parabolic SAR: الصيغة والإعدادات وطريقة القراءة

مؤشر Parabolic SAR (ويلز وايلدر، 1978) يطبع نقطة واحدة لكل شمعة عند مستوى توقف وانعكاس يقترب من السعر بمعدل متسارع. يستخدم 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 start وAF step هما 0.02، وكلاهما قابل للضبط من 0.001 إلى 0.5، والقيمة الافتراضية لـ AF max هي 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؟
هي مستوى التوقف والانعكاس لتلك الشمعة. ما دامت حالة الاتجاه صاعدة تقع النقطة تحت السعر وترتفع نحوه، وإذا تداول قاع شمعة تحت النقطة تنعكس الحالة وتنتقل النقطة فوق السعر. النقطة مستوى محسوب من شموع سابقة، لا توقع لوجهة السعر.
متى يرتفع معامل التسارع؟
فقط حين يسجل الاتجاه نقطة قصوى جديدة، أي قمة أعلى في الاتجاه الصاعد أو قاعًا أدنى في الاتجاه الهابط. في هذه الحالة يرتفع المعامل بمقدار الخطوة، 0.02 افتراضيًا، حتى السقف 0.2. والشمعة التي لا تمدّ الاتجاه تترك المعامل دون تغيير، وتكفّ النقاط عن الاقتراب.
لماذا ينقلب Parabolic SAR كثيرًا في النطاق العرضي؟
لأنه دائمًا في إحدى الحالتين ومستواه يواصل الاقتراب من السعر في كل شمعة. وفي النطاق العرضي لا يملك السعر اتجاهًا مستمرًا، فتلحق به النقطة وتنعكس مرارًا. الحساب مبني لملاحقة اتجاه قائم، ولا آلية فيه للإبلاغ عن غيابه.

Keep reading