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

Awesome Oscillator هو مدرج الزخم التكراري لـ Bill Williams: المتوسط المتحرك البسيط لـ 5 فترات للسعر الوسيط للشمعة ناقص متوسط 34 فترة. يُرسم في لوحة منفصلة، ويكون موجبًا حين يقع مركز النطاق على الأفق القصير فوق مركزه على الأفق الطويل.

Senzoukria · المؤشرات · Updated September 2026


Awesome Oscillator الزخم, في لوحة مستقلة أسفل الرسم.

ما الذي يقيسه Awesome Oscillator

المُدخل هو السعر الوسيط، (القمة + القاع) / 2، لا الإغلاق: أراد Williams حركة مركز المزاد عبر أفقين، والإغلاق لقطة واحدة في نهاية الشمعة كثيرة الضجيج على العقود الآجلة خلال اليوم. الحدّان كلاهما متوسطان متحركان بسيطان — لا تنعيم أسي ولا تنعيم Wilder في التعريف الأصلي، ولا هنا. القيمتان الافتراضيتان 5/34 مأخوذتان من عمل Williams على الشموع اليومية، أي أسبوع تقريبًا مقابل شهر، وتبقيان دون تغيير للتطابق مع المنصات الأخرى. ولا تُرسم أي نقطة في المدرج قبل اكتمال المتوسط البطيء، فتكون الشموع الأولى فارغة لا تقريبية.

الصيغة كما هي منفَّذة في الكود

هذا ليس التعريف الشائع في مصادر أخرى، بل ما يحسبه الكود المنشور فعليًا، موثَّقًا بجانب التنفيذ:

Période entière ≥ `min` depuis les params (garde-fou UI, même helper que momentum.ts / stats.ts). */ function intParam( params: Record<string, unknown>, key: string, fallback: number, min = 1, ): number { return Math.max(min, Math.floor(numParam(params, key, fallback))); } function clamp(v: number, lo: number, hi: number): number { return Math.min(hi, Math.max(lo, v)); } function toPoints( bars: readonly FootprintBar[], values: ReadonlyArray<number | null>, ): SeriesPoint[] { return bars.map((b, i) => ({ time: b.bucketTsNs, value: values[i] ?? null })); } /** Histogramme : une barre sans valeur n'émet PAS de point (contrat `HistogramPoint`, pas de trou représentable). */ function histPoints( bars: readonly FootprintBar[], values: ReadonlyArray<number | null>, ): HistogramPoint[] { const out: HistogramPoint[] = []; for (let i = 0; i < bars.length; i++) { const v = values[i]; if (v !== null && v !== undefined) { out.push({ time: bars[i].bucketTsNs, value: v }); } } return out; } /** 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; } /** WMA N (poids linéaires 1..N, le plus récent pèse N) tolérante aux trous : null dès qu'une valeur manque dans la fenêtre. Même formule que `helpers.wmaSeries`, qui n'accepte que des `number[]`. */ function wmaNullable( values: ReadonlyArray<number | null>, period: number, ): Array<number | null> { const n = Math.max(1, Math.floor(period)); const denom = (n * (n + 1)) / 2; const out: Array<number | null> = new Array<number | null>(values.length).fill(null); for (let i = n - 1; i < values.length; i++) { let acc = 0; let ok = true; for (let j = 0; j < n; j++) { const v = values[i - n + 1 + j]; if (v === null) { ok = false; break; } acc += v * (j + 1); } if (ok) out[i] = acc / denom; } return out; } /** EMA N (graine SMA) sur une série dont les valeurs définies forment un SUFFIXE contigu — sortie d'un lissage précédent. Le préfixe reste null ; série toute-null ou trou interne → tout-null (dégradation propre, on ne devine pas). Copie locale de la primitive de momentum.ts (non exportée). */ 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; defined.push(v); } const ema = emaSeries(defined, period); for (let j = 0; j < ema.length; j++) out[start + j] = ema[j]; return out; } /** ROC en POURCENT : 100·(x[i] − x[i−N])/x[i−N]. Référence NULLE → null (pas de division par zéro déguisée) — même règle que `roc` (momentum.ts). */ function rocPercentSeries( 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); for (let i = n; i < values.length; i++) { const ref = values[i - n]; if (ref !== 0) out[i] = (100 * (values[i] - ref)) / ref; } return out; } /** Prix médian de la barre — l'entrée de Bill Williams et d'Ehlers. */ function hl2(b: FootprintBar): number { return (b.high + b.low) / 2; } /** Égalités RSI, STRICTEMENT celles de `rsi` (momentum.ts) : marché PLAT (les deux moyennes nulles) → null (pas d'information directionnelle) ; 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 quelconque (closes, ou série de streaks pour Connors). Graine = moyenne SIMPLE des N premières variations, puis lissage Wilder avg = (avg·(N−1) + x)/N ; premier point à l'indice N. Copie locale de la primitive de momentum.ts (non exportée) — même formule, mêmes égalités, donc `connors-rsi` et `rsi` restent cohérents à l'écran. */ 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; } /** AO de Bill Williams — factorisé parce que l'Accelerator le consomme : SMA_fast(hl2) − SMA_slow(hl2), null tant que la LENTE n'est pas amorcée. */ function awesomeSeries( bars: readonly FootprintBar[], fast: number, slow: number, ): Array<number | null> { const mid = bars.map(hl2); const f = smaSeries(mid, fast); const s = smaSeries(mid, slow); return mid.map((_, i) => { const a = f[i]; const b = s[i]; return a !== null && b !== null ? a - b : null; }); } /** Étage « stochastique + lissage exponentiel à facteur fixe » de Schaff — factorisé parce que STC l'applique DEUX FOIS (cf. sa déf) : %K = 100·(x − min(x, cycle))/(max(x, cycle) − min(x, cycle)) état ← (premier %K défini) puis état + f·(%K − état) Fenêtre PLATE (max == min) ou incomplète → sortie null ET ÉTAT FIGÉ : on ne nourrit pas la récurrence avec un %K inventé, et on ne reconduit pas la dernière valeur (le `nz(f1[1])` des portages Pine peindrait un plateau faux). Un trou ainsi créé se propage aux fenêtres suivantes qui le contiennent — c'est le comportement voulu. / function schaffStage( src: ReadonlyArray<number | null>, cycle: number, factor: number, ): Array<number | null> { const n = Math.max(2, Math.floor(cycle)); const out: Array<number | null> = new Array<number | null>(src.length).fill(null); let state: number | null = null; for (let i = n - 1; i < src.length; i++) { let lo = Number.POSITIVE_INFINITY; let hi = Number.NEGATIVE_INFINITY; let ok = true; for (let j = i - n + 1; j <= i; j++) { const v = src[j]; if (v === null) { ok = false; break; } if (v < lo) lo = v; if (v > hi) hi = v; } const cur = src[i]; if (!ok || cur === null) continue; // trou → état figé, sortie null const range = hi - lo; if (!(range > 0)) continue; // fenêtre plate → null, jamais 0 const k = (100 * (cur - lo)) / range; state = state === null ? k : state + factor * (k - state); out[i] = state; } return out; } // ── Défs — Bill Williams ──────────────────────────────────────────────────── /** Awesome Oscillator (Bill Williams) — lissage SMA SIMPLE (pas d'EMA, pas de Wilder ; c'est la définition originale) sur le PRIX MÉDIAN : hl2 = (high + low)/2 AO = SMA_fast(hl2) − SMA_slow(hl2) POURQUOI hl2 et pas le close : Williams mesure le déplacement du CENTRE de l'enchère sur deux horizons ; le close n'est qu'un instantané de fin de barre, très bruité en intraday futures. Défauts 5/34 (Williams) — la paire « une semaine / un mois » de son analyse quotidienne, gardée telle quelle pour la parité avec ATAS/TradingView. HISTOGRAMME : warm-up (< slow barres) → AUCUN point. Le renderer colore par SIGNE (contrat `SeriesOutput.histogram`) ; Bill Williams colore par SENS DE VARIATION barre à barre — écart assumé et documenté, le shape du moteur ne transporte pas de couleur par point.

كيف تقرأه

  • فوق الصفر يكون مركز النطاق على الأفق القصير أعلى منه على الأفق الطويل؛ وتحت الصفر العكس. خط الصفر هو المستوى الوحيد الذي تعرّفه الصيغة.
  • البعد عن الصفر يقيس مدى تباعد الأفقين: هذا مقدار الزخم، لا قوة القناعة.
  • تقلص الأعمدة بينما يواصل السعر التقدم تدل على أن المتوسطين يتقاربان وأن الحركة تتباطأ.
  • قمة سعرية أعلى مقابل قمة أدنى لـ AO تباعدٌ في الزخم — وصفٌ لما حدث بالفعل، لا توقع.
  • في سوق متوازن تتذبذب الأعمدة بإحكام حول الصفر، وتبدّل القيمة بين الموجب والسالب قليل الدلالة.

المعاملات والقيم الافتراضية

السريع (5) والبطيء (34) يحددان أفقي المتوسط؛ والفجوة بينهما، أكثر من حجمهما المطلق، هي ما يحدد السعة. تقريبهما يعطي مدرجًا أهدأ يتبدّل كثيرًا بين الموجب والسالب، وإبعادهما يعطي تأرجحات أكبر وأبطأ وإحماءً أطول. اللونان يؤثران في العرض فقط.

Awesome Oscillator — المعاملات المتاحة في التطبيق مع قيمها الافتراضية.
المعاملالنوعالقيمة الافتراضيةالمدى
Fast SMAnumber51 – 200
Slow SMAnumber342 – 500

ما لا يُظهره

Awesome Oscillator مبني على السعر وحده: لا يصل إليه أي حجم أو دلتا أو معلومة من الدفتر، فلا يستطيع التمييز بين صعود قابله بيع عدواني وصعود لم يقابله شيء على الإطلاق. وهو متأخر بحكم بنائه، لأن الحدّين كليهما متوسطان متأخران. والسعر الوسيط يتجاهل أيضًا موضع إغلاق الشمعة، فشمعة انعكست بقوة حتى إغلاقها تُقرأ كشمعة حافظت على قممها. ملاحظة عرض: تُلوَّن الأعمدة هنا بحسب إشارة القيمة، بينما لوّن Williams كل عمود بحسب تغيره عن العمود السابق، فقد تبدو البيانات نفسها مختلفة من منصة إلى أخرى.

تصفح جميع المؤشرات

هذه الصفحة بلغات أخرى

Frequently asked questions

لماذا يستخدم Awesome Oscillator السعر الوسيط بدل الإغلاق؟
صممه Williams لتتبع مركز المزاد عبر أفقين، والسعر الوسيط، (القمة + القاع) / 2، يلخص أين جرى تداول الشمعة لا أين صادف أن توقفت. الإغلاق لحظة واحدة في نهاية الشمعة وكثير الضجيج على الشموع القصيرة خلال اليوم. ونتيجة لذلك يتجاهل المذبذب إغلاقًا قويًا داخل نطاق لم يتغير في ما عدا ذلك.
ماذا يعني عبور Awesome Oscillator لخط الصفر؟
يعني أن متوسط 5 فترات للسعر الوسيط عبر متوسط 34 فترة، فانتقل الأفق القصير من جهة الأفق الطويل إلى الجهة الأخرى. إنه وصف لمتوسطين متأخرين، وكلاهما تحرك بالفعل قبل ظهور العبور. وفي ظروف النطاق العرضي يتقارب المتوسطان فتحدث العبورات على فروق صغيرة جدًا.
هل يجب أن تبقى الفترتان 5 و34 على قيمتيهما الافتراضيتين؟
لا — كلتاهما قابلة للتعديل، من 1 إلى 200 للمتوسط السريع ومن 2 إلى 500 للبطيء. القيمتان الافتراضيتان هما قيمتا Williams نفسه، وتُبقى عليهما لتتطابق القراءات مع المنصات الأخرى التي تستخدم الزوج نفسه. تغييرهما يغيّر السعة والإحماء، فلا تعود المقارنة بالرسوم ذات الإعدادات الافتراضية صالحة.

Keep reading