acttrader-charts 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/indicators/sourceField.ts","../src/indicators/SMA.ts","../src/indicators/EMA.ts","../src/indicators/WMA.ts","../src/indicators/HMA.ts","../src/indicators/MARibbon.ts","../src/indicators/BollingerBands.ts","../src/indicators/KeltnerChannels.ts","../src/indicators/DonchianChannels.ts","../src/indicators/ATR.ts","../src/indicators/RSI.ts","../src/indicators/Stochastic.ts","../src/indicators/StochRSI.ts","../src/indicators/MACD.ts","../src/indicators/CCI.ts","../src/indicators/WilliamsR.ts","../src/indicators/ROC.ts","../src/indicators/OBV.ts","../src/indicators/VWAP.ts","../src/indicators/AccDistribution.ts","../src/indicators/MFI.ts","../src/indicators/CMF.ts","../src/indicators/PivotPoints.ts","../src/indicators/FibRetracementIndicator.ts","../src/indicators/Supertrend.ts","../src/indicators/ParabolicSAR.ts","../src/indicators/IchimokuCloud.ts","../src/indicators/ADX.ts","../src/indicators/AwesomeOscillator.ts","../src/indicators/HeikinAshi.ts","../src/indicators/VOL.ts","../src/indicators/LinearRegression.ts"],"names":["started"],"mappings":"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","file":"chunk-X6OSI4P2.js","sourcesContent":["import type { OHLCVBar } from '../core/types.js';\n\nexport type PriceSource = 'open' | 'high' | 'low' | 'close';\n\nexport function getSource(bar: OHLCVBar, source: PriceSource): number {\n return bar[source];\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport { getSource, type PriceSource } from './sourceField.js';\n\nexport class SMA implements IIndicator {\n readonly name: string;\n readonly color: string;\n\n constructor(\n private readonly period: number,\n color = '#F5A623',\n name = 'MA',\n private readonly source: PriceSource = 'close',\n ) {\n this.name = name;\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n return data.map((_, i) => {\n if (i < this.period - 1) return { index: i, value: null };\n let sum = 0;\n for (let j = i - this.period + 1; j <= i; j++) sum += getSource(data[j], this.source);\n return { index: i, value: sum / this.period };\n });\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n chartHeight: number,\n ): void {\n const priceRange = getPriceRangeFromCtx(ctx);\n if (!priceRange) return;\n\n ctx.beginPath();\n ctx.strokeStyle = this.color;\n ctx.lineWidth = 1.5;\n ctx.lineJoin = 'round';\n\n let started = false;\n const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n\n for (const r of results) {\n if (r.value === null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.value, priceRange, chartHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n\n ctx.stroke();\n }\n}\n\n// Helper — ChartEngine injects priceRange via canvas dataset\nfunction getPriceRangeFromCtx(ctx: CanvasRenderingContext2D) {\n const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n return canvas._priceRange ?? null;\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport { getSource, type PriceSource } from './sourceField.js';\n\nexport class EMA implements IIndicator {\n readonly name: string;\n readonly color: string;\n\n constructor(\n private readonly period: number,\n color = '#9B59B6',\n name = 'EMA',\n private readonly source: PriceSource = 'close',\n ) {\n this.name = name;\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n const k = 2 / (this.period + 1);\n const results: IndicatorResult[] = [];\n let ema: number | null = null;\n\n for (let i = 0; i < data.length; i++) {\n if (i < this.period - 1) {\n results.push({ index: i, value: null });\n continue;\n }\n if (ema === null) {\n // Seed with SMA\n let sum = 0;\n for (let j = 0; j < this.period; j++) sum += getSource(data[i - j], this.source);\n ema = sum / this.period;\n } else {\n ema = getSource(data[i], this.source) * k + ema * (1 - k);\n }\n results.push({ index: i, value: ema });\n }\n\n return results;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n chartHeight: number,\n ): void {\n const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n const priceRange = canvas._priceRange;\n if (!priceRange) return;\n\n ctx.beginPath();\n ctx.strokeStyle = this.color;\n ctx.lineWidth = 1.5;\n ctx.lineJoin = 'round';\n\n let started = false;\n const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n\n for (const r of results) {\n if (r.value === null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.value, priceRange, chartHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n\n ctx.stroke();\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport { getSource, type PriceSource } from './sourceField.js';\n\nexport class WMA implements IIndicator {\n readonly name: string;\n readonly color: string;\n\n constructor(\n private readonly period = 20,\n color = '#e91e63',\n name = 'WMA',\n private readonly source: PriceSource = 'close',\n ) {\n this.name = name;\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n const denominator = (this.period * (this.period + 1)) / 2;\n const results: IndicatorResult[] = [];\n\n for (let i = 0; i < data.length; i++) {\n if (i < this.period - 1) {\n results.push({ index: i, value: null });\n continue;\n }\n let wma = 0;\n for (let j = 0; j < this.period; j++) {\n // j=0 is oldest, j=period-1 is newest; weight = j+1\n wma += getSource(data[i - (this.period - 1 - j)], this.source) * (j + 1);\n }\n results.push({ index: i, value: wma / denominator });\n }\n\n return results;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n chartHeight: number,\n ): void {\n const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n const priceRange = canvas._priceRange;\n if (!priceRange) return;\n\n const chartWidth = (canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n\n ctx.beginPath();\n ctx.strokeStyle = this.color;\n ctx.lineWidth = 1.5;\n ctx.lineJoin = 'round';\n\n let started = false;\n for (const r of results) {\n if (r.value === null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.value, priceRange, chartHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n\n ctx.stroke();\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport { getSource, type PriceSource } from './sourceField.js';\n\nfunction computeWMA(data: number[], period: number): (number | null)[] {\n const denominator = (period * (period + 1)) / 2;\n const results: (number | null)[] = [];\n\n for (let i = 0; i < data.length; i++) {\n if (i < period - 1) {\n results.push(null);\n continue;\n }\n let wma = 0;\n for (let j = 0; j < period; j++) {\n // j=0 is oldest, j=period-1 is newest; weight = j+1\n wma += data[i - (period - 1 - j)] * (j + 1);\n }\n results.push(wma / denominator);\n }\n\n return results;\n}\n\nexport class HMA implements IIndicator {\n readonly name: string;\n readonly color: string;\n\n constructor(\n private readonly period = 20,\n color = '#00bcd4',\n name = 'HMA',\n private readonly source: PriceSource = 'close',\n ) {\n this.name = name;\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n const closes = data.map((b) => getSource(b, this.source));\n const halfPeriod = Math.floor(this.period / 2);\n const sqrtPeriod = Math.floor(Math.sqrt(this.period));\n\n // Step 1: WMA(n/2) and WMA(n) on closes\n const wmaHalf = computeWMA(closes, halfPeriod);\n const wmaFull = computeWMA(closes, this.period);\n\n // Step 2: diff[i] = 2 * wmaHalf[i] - wmaFull[i]\n const diff: (number | null)[] = wmaHalf.map((half, i) => {\n const full = wmaFull[i];\n if (half === null || full === null) return null;\n return 2 * half - full;\n });\n\n // Step 3: WMA(sqrt(n)) on diff, treating nulls as 0 for computation\n // but only emit values from indices where diff was not null\n const diffForWma = diff.map((v) => (v === null ? 0 : v));\n const hmaRaw = computeWMA(diffForWma, sqrtPeriod);\n\n return data.map((_, i) => {\n // Only valid if the diff at the start of the window was not null\n const windowStart = i - sqrtPeriod + 1;\n if (windowStart < 0) return { index: i, value: null };\n // Check that all diff values in the window were valid\n const allDiffValid = diff[windowStart] !== null && diff[i] !== null;\n if (!allDiffValid || hmaRaw[i] === null) return { index: i, value: null };\n return { index: i, value: hmaRaw[i] };\n });\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n chartHeight: number,\n ): void {\n const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n const priceRange = canvas._priceRange;\n if (!priceRange) return;\n\n const chartWidth = (canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n\n ctx.beginPath();\n ctx.strokeStyle = this.color;\n ctx.lineWidth = 1.5;\n ctx.lineJoin = 'round';\n\n let started = false;\n for (const r of results) {\n if (r.value === null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.value, priceRange, chartHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n\n ctx.stroke();\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport { getSource, type PriceSource } from './sourceField.js';\n\nconst RIBBON_PERIODS = [5, 10, 20, 50, 100] as const;\nconst RIBBON_COLORS = ['#ff6b6b', '#ffd93d', '#6bcb77', '#4d96ff', '#c77dff'] as const;\n\nexport class MARibbon implements IIndicator {\n readonly name = 'MARibbon';\n readonly color: string;\n\n constructor(\n color = '#ffcc80',\n private readonly source: PriceSource = 'close',\n ) {\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n const sma = (endIndex: number, period: number): number | null => {\n if (endIndex < period - 1) return null;\n let sum = 0;\n for (let j = endIndex - period + 1; j <= endIndex; j++) sum += getSource(data[j], this.source);\n return sum / period;\n };\n\n return data.map((_, i) => ({\n index: i,\n value: sma(i, 5), // SMA5\n upper: sma(i, 10), // SMA10\n lower: sma(i, 20), // SMA20\n signal: sma(i, 50), // SMA50\n histogram: sma(i, 100), // SMA100\n }));\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n chartHeight: number,\n ): void {\n const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n const priceRange = canvas._priceRange;\n if (!priceRange) return;\n\n const chartWidth = (canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n ctx.lineWidth = 1;\n ctx.lineJoin = 'round';\n\n type ValueKey = 'value' | 'upper' | 'lower' | 'signal' | 'histogram';\n const keys: ValueKey[] = ['value', 'upper', 'lower', 'signal', 'histogram'];\n\n for (let li = 0; li < RIBBON_PERIODS.length; li++) {\n const key = keys[li];\n const lineColor = RIBBON_COLORS[li];\n\n ctx.beginPath();\n ctx.strokeStyle = lineColor;\n let started = false;\n\n for (const r of results) {\n const val = r[key];\n if (val == null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(val, priceRange, chartHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n ctx.stroke();\n }\n\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport { getSource, type PriceSource } from './sourceField.js';\n\nexport class BollingerBands implements IIndicator {\n readonly name: string;\n readonly color: string;\n\n constructor(\n private readonly period = 20,\n private readonly stdDevMultiplier = 2,\n color = '#3B82F6',\n name = 'BB',\n private readonly source: PriceSource = 'close',\n ) {\n this.name = name;\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n return data.map((_, i) => {\n if (i < this.period - 1) return { index: i, value: null, upper: null, lower: null };\n\n const slice = data.slice(i - this.period + 1, i + 1).map((b) => getSource(b, this.source));\n const mean = slice.reduce((s, v) => s + v, 0) / this.period;\n const variance = slice.reduce((s, v) => s + (v - mean) ** 2, 0) / this.period;\n const std = Math.sqrt(variance);\n\n return {\n index: i,\n value: mean,\n upper: mean + std * this.stdDevMultiplier,\n lower: mean - std * this.stdDevMultiplier,\n };\n });\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n chartHeight: number,\n ): void {\n const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n const priceRange = canvas._priceRange;\n if (!priceRange) return;\n\n const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n ctx.lineWidth = 1;\n ctx.lineJoin = 'round';\n\n const drawLine = (getValue: (r: IndicatorResult) => number | null | undefined, dash = false) => {\n if (dash) ctx.setLineDash([4, 3]);\n ctx.beginPath();\n let started = false;\n for (const r of results) {\n const val = getValue(r);\n if (val == null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(val, priceRange, chartHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n ctx.stroke();\n if (dash) ctx.setLineDash([]);\n };\n\n ctx.strokeStyle = this.color;\n drawLine((r) => r.value); // Middle band (SMA)\n\n ctx.strokeStyle = `${this.color}99`;\n drawLine((r) => r.upper, true); // Upper band\n drawLine((r) => r.lower, true); // Lower band\n\n // Fill band area\n const upperPoints: [number, number][] = [];\n const lowerPoints: [number, number][] = [];\n\n for (const r of results) {\n if (r.upper == null || r.lower == null) continue;\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n upperPoints.push([x, scale.yToPixel(r.upper, priceRange, chartHeight)]);\n lowerPoints.push([x, scale.yToPixel(r.lower, priceRange, chartHeight)]);\n }\n\n if (upperPoints.length < 2) return;\n\n ctx.beginPath();\n upperPoints.forEach(([x, y], i) => i === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y));\n lowerPoints.reverse().forEach(([x, y]) => ctx.lineTo(x, y));\n ctx.closePath();\n ctx.fillStyle = `${this.color}12`;\n ctx.fill();\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class KeltnerChannels implements IIndicator {\n readonly name: string;\n readonly color: string;\n\n constructor(\n private readonly period = 20,\n private readonly mult = 2,\n private readonly atrPeriod = 10,\n color = '#4caf50',\n name = 'KC',\n ) {\n this.name = name;\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n const results: IndicatorResult[] = [];\n const emaK = 2 / (this.period + 1);\n\n let ema: number | null = null;\n let atr: number | null = null;\n\n for (let i = 0; i < data.length; i++) {\n const bar = data[i];\n\n // EMA of close, seeded with SMA\n if (i < this.period - 1) {\n results.push({ index: i, value: null, upper: null, lower: null });\n continue;\n }\n\n if (ema === null) {\n let sum = 0;\n for (let j = 0; j < this.period; j++) sum += data[i - j].close;\n ema = sum / this.period;\n } else {\n ema = bar.close * emaK + ema * (1 - emaK);\n }\n\n // ATR using Wilder's smoothing\n const tr = i === 0\n ? bar.high - bar.low\n : Math.max(\n bar.high - bar.low,\n Math.abs(bar.high - data[i - 1].close),\n Math.abs(bar.low - data[i - 1].close),\n );\n\n if (atr === null) {\n if (i < this.atrPeriod) {\n // Accumulate until we have enough bars for initial ATR seed\n results.pop();\n results.push({ index: i, value: null, upper: null, lower: null });\n // Temporarily track a running sum via a local variable approach:\n // We'll recompute ATR seed once we reach atrPeriod\n if (i === this.atrPeriod - 1) {\n let trSum = 0;\n for (let j = 0; j < this.atrPeriod; j++) {\n const b = data[i - j];\n const prev = data[i - j - 1];\n const trj = j === i\n ? b.high - b.low\n : Math.max(\n b.high - b.low,\n Math.abs(b.high - prev.close),\n Math.abs(b.low - prev.close),\n );\n trSum += trj;\n }\n atr = trSum / this.atrPeriod;\n }\n continue;\n }\n } else {\n atr = (atr * (this.atrPeriod - 1) + tr) / this.atrPeriod;\n }\n\n if (atr === null) {\n results.push({ index: i, value: null, upper: null, lower: null });\n continue;\n }\n\n const upper = ema + this.mult * atr;\n const lower = ema - this.mult * atr;\n results.push({ index: i, value: ema, upper, lower });\n }\n\n return results;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n chartHeight: number,\n ): void {\n const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n const priceRange = canvas._priceRange;\n if (!priceRange) return;\n\n const chartWidth = (canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n ctx.lineWidth = 1;\n ctx.lineJoin = 'round';\n\n const drawLine = (getValue: (r: IndicatorResult) => number | null | undefined, dash = false) => {\n if (dash) ctx.setLineDash([4, 3]);\n ctx.beginPath();\n let started = false;\n for (const r of results) {\n const val = getValue(r);\n if (val == null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(val, priceRange, chartHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n ctx.stroke();\n if (dash) ctx.setLineDash([]);\n };\n\n // Middle line (EMA) — solid\n ctx.strokeStyle = this.color;\n drawLine((r) => r.value);\n\n // Upper and lower — dashed\n ctx.strokeStyle = `${this.color}99`;\n drawLine((r) => r.upper, true);\n drawLine((r) => r.lower, true);\n\n // Fill between upper and lower\n const upperPoints: [number, number][] = [];\n const lowerPoints: [number, number][] = [];\n\n for (const r of results) {\n if (r.upper == null || r.lower == null) continue;\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n upperPoints.push([x, scale.yToPixel(r.upper, priceRange, chartHeight)]);\n lowerPoints.push([x, scale.yToPixel(r.lower, priceRange, chartHeight)]);\n }\n\n if (upperPoints.length < 2) return;\n\n ctx.beginPath();\n upperPoints.forEach(([x, y], i) => i === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y));\n lowerPoints.reverse().forEach(([x, y]) => ctx.lineTo(x, y));\n ctx.closePath();\n ctx.fillStyle = `${this.color}12`;\n ctx.fill();\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class DonchianChannels implements IIndicator {\n readonly name = 'DC';\n readonly color: string;\n\n constructor(\n private readonly period = 20,\n color = '#26c6da',\n ) {\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n return data.map((_, i) => {\n if (i < this.period - 1) return { index: i, value: null, upper: null, lower: null };\n\n let highest = -Infinity;\n let lowest = Infinity;\n for (let j = i - this.period + 1; j <= i; j++) {\n if (data[j].high > highest) highest = data[j].high;\n if (data[j].low < lowest) lowest = data[j].low;\n }\n\n const middle = (highest + lowest) / 2;\n return { index: i, value: middle, upper: highest, lower: lowest };\n });\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n chartHeight: number,\n ): void {\n const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n const priceRange = canvas._priceRange;\n if (!priceRange) return;\n\n const chartWidth = (canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n ctx.lineWidth = 1;\n ctx.lineJoin = 'round';\n\n const drawLine = (getValue: (r: IndicatorResult) => number | null | undefined, dash = false) => {\n if (dash) ctx.setLineDash([4, 3]);\n ctx.beginPath();\n let started = false;\n for (const r of results) {\n const val = getValue(r);\n if (val == null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(val, priceRange, chartHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n ctx.stroke();\n if (dash) ctx.setLineDash([]);\n };\n\n // Middle line — dashed, full color\n ctx.strokeStyle = this.color;\n drawLine((r) => r.value, true);\n\n // Upper and lower — solid, 60% opacity\n ctx.strokeStyle = `${this.color}99`;\n drawLine((r) => r.upper);\n drawLine((r) => r.lower);\n\n // Fill between upper and lower at 8% opacity\n const upperPoints: [number, number][] = [];\n const lowerPoints: [number, number][] = [];\n\n for (const r of results) {\n if (r.upper == null || r.lower == null) continue;\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n upperPoints.push([x, scale.yToPixel(r.upper, priceRange, chartHeight)]);\n lowerPoints.push([x, scale.yToPixel(r.lower, priceRange, chartHeight)]);\n }\n\n if (upperPoints.length < 2) return;\n\n ctx.beginPath();\n upperPoints.forEach(([x, y], i) => i === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y));\n lowerPoints.slice().reverse().forEach(([x, y]) => ctx.lineTo(x, y));\n ctx.closePath();\n ctx.fillStyle = `${this.color}14`;\n ctx.fill();\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class ATR implements IIndicator {\n readonly name: string;\n readonly color: string;\n readonly pane = 'sub' as const;\n readonly paneHeight = 80;\n\n constructor(\n private readonly period: number = 14,\n color = '#ff5722',\n name = 'ATR',\n ) {\n this.name = name;\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n const results: IndicatorResult[] = [];\n\n if (data.length === 0) return results;\n\n // Compute True Range values\n const tr: number[] = [];\n for (let i = 0; i < data.length; i++) {\n if (i === 0) {\n tr.push(data[i].high - data[i].low);\n } else {\n const prevClose = data[i - 1].close;\n tr.push(Math.max(\n data[i].high - data[i].low,\n Math.abs(data[i].high - prevClose),\n Math.abs(data[i].low - prevClose),\n ));\n }\n }\n\n // Need at least `period` bars to compute first ATR\n if (data.length < this.period) {\n return data.map((_, i) => ({ index: i, value: null }));\n }\n\n // Seed with SMA of first `period` TR values\n let atr = 0;\n for (let i = 0; i < this.period; i++) {\n atr += tr[i];\n }\n atr /= this.period;\n\n // Fill nulls before first ATR value\n for (let i = 0; i < this.period - 1; i++) {\n results.push({ index: i, value: null });\n }\n\n // First ATR value at index period-1\n results.push({ index: this.period - 1, value: atr });\n\n // Wilder's smoothing for subsequent values\n for (let i = this.period; i < data.length; i++) {\n atr = (atr * (this.period - 1) + tr[i]) / this.period;\n results.push({ index: i, value: atr });\n }\n\n return results;\n }\n\n getValueRange(results: IndicatorResult[]): PriceRange {\n let maxVal = 0.0001;\n for (const r of results) {\n if (r.value != null) maxVal = Math.max(maxVal, r.value);\n }\n return { min: 0, max: maxVal * 1.2 };\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n paneHeight: number,\n rangeOverride?: PriceRange,\n ): void {\n const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth\n ?? ctx.canvas.width;\n\n // Compute range from results\n let maxVal = 0.0001;\n for (const r of results) {\n if (r.value != null) maxVal = Math.max(maxVal, r.value);\n }\n const range = rangeOverride ?? { min: 0, max: maxVal * 1.2 };\n\n // Collect path points\n const points: { x: number; y: number }[] = [];\n for (const r of results) {\n if (r.value == null) continue;\n points.push({\n x: scale.xToPixel(r.index, viewport, chartWidth),\n y: scale.yToPixel(r.value, range, paneHeight),\n });\n }\n\n if (points.length === 0) return;\n\n // Filled area under line\n const baseY = scale.yToPixel(0, range, paneHeight);\n ctx.beginPath();\n ctx.moveTo(points[0].x, baseY);\n for (const p of points) ctx.lineTo(p.x, p.y);\n ctx.lineTo(points[points.length - 1].x, baseY);\n ctx.closePath();\n ctx.fillStyle = this.color + '33';\n ctx.fill();\n\n // Line on top\n ctx.beginPath();\n ctx.strokeStyle = this.color;\n ctx.lineWidth = 1.5;\n ctx.lineJoin = 'round';\n let started = false;\n for (const r of results) {\n if (r.value == null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.value, range, paneHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n ctx.stroke();\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport { getSource, type PriceSource } from './sourceField.js';\n\nexport class RSI implements IIndicator {\n readonly name: string;\n readonly color: string;\n readonly pane = 'sub' as const;\n readonly paneHeight = 80;\n\n constructor(\n private readonly period: number = 14,\n color = '#e8b84b',\n name = 'RSI',\n private readonly source: PriceSource = 'close',\n ) {\n this.name = name;\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n const results: IndicatorResult[] = [];\n\n if (data.length < this.period + 1) {\n return data.map((_, i) => ({ index: i, value: null }));\n }\n\n // Wilder's smoothing: seed with simple average, then exponential\n let avgGain = 0;\n let avgLoss = 0;\n\n // Initial average over first `period` changes\n for (let i = 1; i <= this.period; i++) {\n const delta = getSource(data[i], this.source) - getSource(data[i - 1], this.source);\n if (delta > 0) avgGain += delta;\n else avgLoss += Math.abs(delta);\n }\n avgGain /= this.period;\n avgLoss /= this.period;\n\n // Fill nulls for bars before we have a result\n for (let i = 0; i < this.period; i++) {\n results.push({ index: i, value: null });\n }\n\n // First RSI value\n const rs0 = avgLoss === 0 ? Infinity : avgGain / avgLoss;\n results.push({ index: this.period, value: avgLoss === 0 ? 100 : 100 - 100 / (1 + rs0) });\n\n // Subsequent values via Wilder's smoothing\n for (let i = this.period + 1; i < data.length; i++) {\n const delta = getSource(data[i], this.source) - getSource(data[i - 1], this.source);\n const gain = delta > 0 ? delta : 0;\n const loss = delta < 0 ? Math.abs(delta) : 0;\n avgGain = (avgGain * (this.period - 1) + gain) / this.period;\n avgLoss = (avgLoss * (this.period - 1) + loss) / this.period;\n const rs = avgLoss === 0 ? Infinity : avgGain / avgLoss;\n results.push({ index: i, value: avgLoss === 0 ? 100 : 100 - 100 / (1 + rs) });\n }\n\n return results;\n }\n\n getValueRange(_results: IndicatorResult[]): PriceRange {\n return { min: 0, max: 100 };\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n paneHeight: number,\n rangeOverride?: PriceRange,\n ): void {\n const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth\n ?? ctx.canvas.width;\n\n const range = rangeOverride ?? { min: 0, max: 100 };\n\n // Overbought / oversold fill zones\n const y70 = scale.yToPixel(70, range, paneHeight);\n const y30 = scale.yToPixel(30, range, paneHeight);\n\n ctx.fillStyle = 'rgba(239,83,80,0.06)';\n ctx.fillRect(0, 0, chartWidth, y70);\n\n ctx.fillStyle = 'rgba(38,166,154,0.06)';\n ctx.fillRect(0, y30, chartWidth, paneHeight - y30);\n\n // Reference lines\n ctx.save();\n ctx.setLineDash([4, 4]);\n ctx.strokeStyle = 'rgba(150,150,150,0.35)';\n ctx.lineWidth = 1;\n for (const level of [70, 50, 30]) {\n const y = scale.yToPixel(level, range, paneHeight);\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(chartWidth, y);\n ctx.stroke();\n }\n ctx.setLineDash([]);\n ctx.restore();\n\n // RSI line\n ctx.beginPath();\n ctx.strokeStyle = this.color;\n ctx.lineWidth = 1.5;\n ctx.lineJoin = 'round';\n\n let started = false;\n for (const r of results) {\n if (r.value === null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.value, range, paneHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n ctx.stroke();\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class Stochastic implements IIndicator {\n readonly name = 'Stoch';\n readonly color: string;\n readonly pane = 'sub' as const;\n readonly paneHeight = 80;\n\n constructor(\n private readonly kPeriod: number = 14,\n private readonly dPeriod: number = 3,\n color = '#e040fb',\n ) {\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n const results: IndicatorResult[] = [];\n const kValues: (number | null)[] = [];\n\n for (let i = 0; i < data.length; i++) {\n if (i < this.kPeriod - 1) {\n kValues.push(null);\n results.push({ index: i, value: null, upper: null });\n continue;\n }\n\n let lowestLow = Infinity;\n let highestHigh = -Infinity;\n for (let j = i - this.kPeriod + 1; j <= i; j++) {\n if (data[j].low < lowestLow) lowestLow = data[j].low;\n if (data[j].high > highestHigh) highestHigh = data[j].high;\n }\n\n const denom = highestHigh - lowestLow;\n const k = denom === 0 ? 50 : ((data[i].close - lowestLow) / denom) * 100;\n kValues.push(k);\n results.push({ index: i, value: k, upper: null });\n }\n\n // Compute %D = SMA(dPeriod) of %K\n for (let i = 0; i < data.length; i++) {\n const kVal = kValues[i];\n if (kVal === null) continue;\n\n // Check if we have enough non-null kValues ending at i\n let count = 0;\n let sum = 0;\n for (let j = i; j >= 0 && count < this.dPeriod; j--) {\n if (kValues[j] === null) break;\n sum += kValues[j] as number;\n count++;\n }\n if (count === this.dPeriod) {\n results[i].upper = sum / this.dPeriod;\n }\n }\n\n return results;\n }\n\n getValueRange(_results: IndicatorResult[]): PriceRange {\n return { min: 0, max: 100 };\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n paneHeight: number,\n rangeOverride?: PriceRange,\n ): void {\n const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth\n ?? ctx.canvas.width;\n\n const range = rangeOverride ?? { min: 0, max: 100 };\n\n // Overbought zone (80-100) red fill\n const y80 = scale.yToPixel(80, range, paneHeight);\n const y20 = scale.yToPixel(20, range, paneHeight);\n\n ctx.fillStyle = 'rgba(239,83,80,0.06)';\n ctx.fillRect(0, 0, chartWidth, y80);\n\n ctx.fillStyle = 'rgba(38,166,154,0.06)';\n ctx.fillRect(0, y20, chartWidth, paneHeight - y20);\n\n // Reference lines at 80, 50, 20\n ctx.save();\n ctx.setLineDash([4, 4]);\n ctx.strokeStyle = 'rgba(150,150,150,0.35)';\n ctx.lineWidth = 1;\n for (const level of [80, 50, 20]) {\n const y = scale.yToPixel(level, range, paneHeight);\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(chartWidth, y);\n ctx.stroke();\n }\n ctx.setLineDash([]);\n ctx.restore();\n\n // %K line (this.color)\n ctx.beginPath();\n ctx.strokeStyle = this.color;\n ctx.lineWidth = 1.5;\n ctx.lineJoin = 'round';\n let started = false;\n for (const r of results) {\n if (r.value === null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.value, range, paneHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n ctx.stroke();\n\n // %D line (orange)\n ctx.beginPath();\n ctx.strokeStyle = '#ff9800';\n ctx.lineWidth = 1;\n ctx.lineJoin = 'round';\n started = false;\n for (const r of results) {\n if (r.upper == null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.upper, range, paneHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n ctx.stroke();\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nfunction computeSMA(values: (number | null)[], period: number): (number | null)[] {\n const result: (number | null)[] = [];\n for (let i = 0; i < values.length; i++) {\n if (i < period - 1) { result.push(null); continue; }\n let sum = 0;\n let valid = true;\n for (let j = i - period + 1; j <= i; j++) {\n if (values[j] === null) { valid = false; break; }\n sum += values[j] as number;\n }\n result.push(valid ? sum / period : null);\n }\n return result;\n}\n\nexport class StochRSI implements IIndicator {\n readonly name = 'StochRSI';\n readonly color: string;\n readonly pane = 'sub' as const;\n readonly paneHeight = 80;\n\n constructor(\n private readonly rsiPeriod: number = 14,\n private readonly stochPeriod: number = 14,\n private readonly kPeriod: number = 3,\n private readonly dPeriod: number = 3,\n color = '#00e5ff',\n ) {\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n // Step 1: Compute RSI with Wilder's smoothing\n const rsiValues: (number | null)[] = [];\n\n if (data.length < this.rsiPeriod + 1) {\n return data.map((_, i) => ({ index: i, value: null, upper: null }));\n }\n\n let avgGain = 0;\n let avgLoss = 0;\n for (let i = 1; i <= this.rsiPeriod; i++) {\n const delta = data[i].close - data[i - 1].close;\n if (delta > 0) avgGain += delta;\n else avgLoss += Math.abs(delta);\n }\n avgGain /= this.rsiPeriod;\n avgLoss /= this.rsiPeriod;\n\n for (let i = 0; i < this.rsiPeriod; i++) rsiValues.push(null);\n\n const rs0 = avgLoss === 0 ? Infinity : avgGain / avgLoss;\n rsiValues.push(avgLoss === 0 ? 100 : 100 - 100 / (1 + rs0));\n\n for (let i = this.rsiPeriod + 1; i < data.length; i++) {\n const delta = data[i].close - data[i - 1].close;\n const gain = delta > 0 ? delta : 0;\n const loss = delta < 0 ? Math.abs(delta) : 0;\n avgGain = (avgGain * (this.rsiPeriod - 1) + gain) / this.rsiPeriod;\n avgLoss = (avgLoss * (this.rsiPeriod - 1) + loss) / this.rsiPeriod;\n const rs = avgLoss === 0 ? Infinity : avgGain / avgLoss;\n rsiValues.push(avgLoss === 0 ? 100 : 100 - 100 / (1 + rs));\n }\n\n // Step 2: Apply Stochastic formula to RSI values\n const stochRsiValues: (number | null)[] = [];\n for (let i = 0; i < data.length; i++) {\n if (rsiValues[i] === null) { stochRsiValues.push(null); continue; }\n\n // Check we have stochPeriod non-null rsi values ending at i\n if (i < this.rsiPeriod + this.stochPeriod - 1) {\n stochRsiValues.push(null);\n continue;\n }\n\n let minRsi = Infinity;\n let maxRsi = -Infinity;\n let valid = true;\n for (let j = i - this.stochPeriod + 1; j <= i; j++) {\n if (rsiValues[j] === null) { valid = false; break; }\n const v = rsiValues[j] as number;\n if (v < minRsi) minRsi = v;\n if (v > maxRsi) maxRsi = v;\n }\n if (!valid) { stochRsiValues.push(null); continue; }\n\n const denom = maxRsi - minRsi;\n const stoch = denom === 0 ? 50 : ((rsiValues[i] as number) - minRsi) / denom * 100;\n stochRsiValues.push(stoch);\n }\n\n // Step 3: K = SMA(kPeriod) of stochRSI, D = SMA(dPeriod) of K\n const kLine = computeSMA(stochRsiValues, this.kPeriod);\n const dLine = computeSMA(kLine, this.dPeriod);\n\n return data.map((_, i) => ({\n index: i,\n value: kLine[i] ?? null,\n upper: dLine[i] ?? null,\n }));\n }\n\n getValueRange(_results: IndicatorResult[]): PriceRange {\n return { min: 0, max: 100 };\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n paneHeight: number,\n rangeOverride?: PriceRange,\n ): void {\n const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth\n ?? ctx.canvas.width;\n\n const range = rangeOverride ?? { min: 0, max: 100 };\n\n // Overbought/oversold zone fills\n const y80 = scale.yToPixel(80, range, paneHeight);\n const y20 = scale.yToPixel(20, range, paneHeight);\n\n ctx.fillStyle = 'rgba(239,83,80,0.06)';\n ctx.fillRect(0, 0, chartWidth, y80);\n\n ctx.fillStyle = 'rgba(38,166,154,0.06)';\n ctx.fillRect(0, y20, chartWidth, paneHeight - y20);\n\n // Reference lines at 80, 50, 20\n ctx.save();\n ctx.setLineDash([4, 4]);\n ctx.strokeStyle = 'rgba(150,150,150,0.35)';\n ctx.lineWidth = 1;\n for (const level of [80, 50, 20]) {\n const y = scale.yToPixel(level, range, paneHeight);\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(chartWidth, y);\n ctx.stroke();\n }\n ctx.setLineDash([]);\n ctx.restore();\n\n // K line (this.color)\n ctx.beginPath();\n ctx.strokeStyle = this.color;\n ctx.lineWidth = 1.5;\n ctx.lineJoin = 'round';\n let started = false;\n for (const r of results) {\n if (r.value === null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.value, range, paneHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n ctx.stroke();\n\n // D line (orange)\n ctx.beginPath();\n ctx.strokeStyle = '#ff9800';\n ctx.lineWidth = 1;\n ctx.lineJoin = 'round';\n started = false;\n for (const r of results) {\n if (r.upper == null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.upper, range, paneHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n ctx.stroke();\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport { getSource, type PriceSource } from './sourceField.js';\n\nfunction computeEMA(data: number[], period: number): (number | null)[] {\n const k = 2 / (period + 1);\n const results: (number | null)[] = [];\n let ema: number | null = null;\n\n for (let i = 0; i < data.length; i++) {\n if (i < period - 1) { results.push(null); continue; }\n if (ema === null) {\n let sum = 0;\n for (let j = 0; j < period; j++) sum += data[i - j];\n ema = sum / period;\n } else {\n ema = data[i] * k + ema * (1 - k);\n }\n results.push(ema);\n }\n return results;\n}\n\nexport class MACD implements IIndicator {\n readonly name: string;\n readonly color: string;\n readonly pane = 'sub' as const;\n readonly paneHeight = 80;\n\n constructor(\n private readonly fast: number = 12,\n private readonly slow: number = 26,\n private readonly signal: number = 9,\n color = '#2196f3',\n name = 'MACD',\n private readonly source: PriceSource = 'close',\n ) {\n this.name = name;\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n const closes = data.map(b => getSource(b, this.source));\n const fastEMA = computeEMA(closes, this.fast);\n const slowEMA = computeEMA(closes, this.slow);\n\n // MACD line = fast EMA - slow EMA (null until both exist)\n const macdLine: (number | null)[] = closes.map((_, i) => {\n if (fastEMA[i] === null || slowEMA[i] === null) return null;\n return (fastEMA[i] as number) - (slowEMA[i] as number);\n });\n\n // Signal line = EMA(signal period) of MACD line\n const macdValues = macdLine.map(v => v ?? 0); // temp: pad with 0 for EMA calc\n const rawSignal = computeEMA(macdValues, this.signal);\n\n return data.map((_, i) => {\n const macd = macdLine[i];\n if (macd === null) return { index: i, value: null, upper: null, lower: null, histogram: null };\n\n // Only emit signal/histogram once signal period has warmed up past slow period\n const signalStart = this.slow - 1 + this.signal - 1;\n const sig = i >= signalStart ? rawSignal[i] : null;\n const hist = macd !== null && sig !== null ? macd - sig : null;\n\n return {\n index: i,\n value: macd, // MACD line\n upper: sig, // Signal line\n lower: hist, // Histogram\n };\n });\n }\n\n getValueRange(results: IndicatorResult[]): PriceRange {\n let maxAbs = 0.0001;\n for (const r of results) {\n if (r.value != null) maxAbs = Math.max(maxAbs, Math.abs(r.value));\n if (r.upper != null) maxAbs = Math.max(maxAbs, Math.abs(r.upper));\n if (r.lower != null) maxAbs = Math.max(maxAbs, Math.abs(r.lower));\n }\n return { min: -maxAbs * 1.3, max: maxAbs * 1.3 };\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n paneHeight: number,\n rangeOverride?: PriceRange,\n ): void {\n const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth\n ?? ctx.canvas.width;\n\n // Dynamic range from visible values\n let maxAbs = 0.0001;\n for (const r of results) {\n if (r.value != null) maxAbs = Math.max(maxAbs, Math.abs(r.value));\n if (r.upper != null) maxAbs = Math.max(maxAbs, Math.abs(r.upper));\n if (r.lower != null) maxAbs = Math.max(maxAbs, Math.abs(r.lower));\n }\n const range = rangeOverride ?? { min: -maxAbs * 1.3, max: maxAbs * 1.3 };\n const zeroY = scale.yToPixel(0, range, paneHeight);\n\n // Zero line\n ctx.strokeStyle = 'rgba(150,150,150,0.3)';\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.moveTo(0, zeroY);\n ctx.lineTo(chartWidth, zeroY);\n ctx.stroke();\n\n // Histogram bars (lower)\n const bodyW = Math.max(scale.candleBodyWidth(viewport, chartWidth), 1);\n for (const r of results) {\n if (r.lower == null) continue;\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const barY = scale.yToPixel(r.lower, range, paneHeight);\n const h = Math.abs(barY - zeroY);\n const top = Math.min(barY, zeroY);\n ctx.fillStyle = r.lower >= 0 ? 'rgba(38,166,154,0.55)' : 'rgba(239,83,80,0.55)';\n ctx.fillRect(x - bodyW / 2, top, bodyW, h);\n }\n\n // MACD line (value)\n ctx.beginPath();\n ctx.strokeStyle = this.color;\n ctx.lineWidth = 1.5;\n ctx.lineJoin = 'round';\n let started = false;\n for (const r of results) {\n if (r.value == null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.value, range, paneHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n ctx.stroke();\n\n // Signal line (upper)\n ctx.beginPath();\n ctx.strokeStyle = '#ff6b35';\n ctx.lineWidth = 1;\n ctx.lineJoin = 'round';\n started = false;\n for (const r of results) {\n if (r.upper == null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.upper, range, paneHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n ctx.stroke();\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class CCI implements IIndicator {\n readonly name = 'CCI';\n readonly color: string;\n readonly pane = 'sub' as const;\n readonly paneHeight = 80;\n\n constructor(\n private readonly period: number = 20,\n color = '#4db6ac',\n ) {\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n return data.map((_, i) => {\n if (i < this.period - 1) return { index: i, value: null };\n\n const slice = data.slice(i - this.period + 1, i + 1);\n const tpSlice = slice.map(b => (b.high + b.low + b.close) / 3);\n const tp = tpSlice[tpSlice.length - 1];\n const sma = tpSlice.reduce((s, v) => s + v, 0) / this.period;\n const meanDev = tpSlice.reduce((s, v) => s + Math.abs(v - sma), 0) / this.period;\n\n if (meanDev === 0) return { index: i, value: 0 };\n return { index: i, value: (tp - sma) / (0.015 * meanDev) };\n });\n }\n\n getValueRange(results: IndicatorResult[]): PriceRange {\n let maxAbs = 0.0001;\n for (const r of results) {\n if (r.value != null) maxAbs = Math.max(maxAbs, Math.abs(r.value));\n }\n return { min: -maxAbs * 1.3, max: maxAbs * 1.3 };\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n paneHeight: number,\n rangeOverride?: PriceRange,\n ): void {\n const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth\n ?? ctx.canvas.width;\n\n // Dynamic range\n let maxAbs = 0.0001;\n for (const r of results) {\n if (r.value != null) maxAbs = Math.max(maxAbs, Math.abs(r.value));\n }\n const range = rangeOverride ?? { min: -maxAbs * 1.3, max: maxAbs * 1.3 };\n\n // Overbought zone (above 100) red fill\n const y100 = scale.yToPixel(100, range, paneHeight);\n const yNeg100 = scale.yToPixel(-100, range, paneHeight);\n\n ctx.fillStyle = 'rgba(239,83,80,0.10)';\n ctx.fillRect(0, 0, chartWidth, y100);\n\n ctx.fillStyle = 'rgba(38,166,154,0.10)';\n ctx.fillRect(0, yNeg100, chartWidth, paneHeight - yNeg100);\n\n // Reference lines at 0, 100, -100\n ctx.save();\n ctx.setLineDash([4, 4]);\n ctx.strokeStyle = 'rgba(150,150,150,0.35)';\n ctx.lineWidth = 1;\n for (const level of [100, 0, -100]) {\n const y = scale.yToPixel(level, range, paneHeight);\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(chartWidth, y);\n ctx.stroke();\n }\n ctx.setLineDash([]);\n ctx.restore();\n\n // CCI line\n ctx.beginPath();\n ctx.strokeStyle = this.color;\n ctx.lineWidth = 1.5;\n ctx.lineJoin = 'round';\n let started = false;\n for (const r of results) {\n if (r.value === null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.value, range, paneHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n ctx.stroke();\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class WilliamsR implements IIndicator {\n readonly name = '%R';\n readonly color: string;\n readonly pane = 'sub' as const;\n readonly paneHeight = 80;\n\n constructor(\n private readonly period: number = 14,\n color = '#ff7043',\n ) {\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n return data.map((_, i) => {\n if (i < this.period - 1) return { index: i, value: null };\n\n let highestHigh = -Infinity;\n let lowestLow = Infinity;\n for (let j = i - this.period + 1; j <= i; j++) {\n if (data[j].high > highestHigh) highestHigh = data[j].high;\n if (data[j].low < lowestLow) lowestLow = data[j].low;\n }\n\n const denom = highestHigh - lowestLow;\n const r = denom === 0 ? -50 : ((highestHigh - data[i].close) / denom) * -100;\n return { index: i, value: r };\n });\n }\n\n getValueRange(_results: IndicatorResult[]): PriceRange {\n return { min: -100, max: 0 };\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n paneHeight: number,\n rangeOverride?: PriceRange,\n ): void {\n const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth\n ?? ctx.canvas.width;\n\n const range = rangeOverride ?? { min: -100, max: 0 };\n\n // Overbought zone (-20 to 0) red fill\n const yNeg20 = scale.yToPixel(-20, range, paneHeight);\n const yNeg80 = scale.yToPixel(-80, range, paneHeight);\n\n ctx.fillStyle = 'rgba(239,83,80,0.06)';\n ctx.fillRect(0, 0, chartWidth, yNeg20);\n\n ctx.fillStyle = 'rgba(38,166,154,0.06)';\n ctx.fillRect(0, yNeg80, chartWidth, paneHeight - yNeg80);\n\n // Reference lines at -20, -50, -80\n ctx.save();\n ctx.setLineDash([4, 4]);\n ctx.strokeStyle = 'rgba(150,150,150,0.35)';\n ctx.lineWidth = 1;\n for (const level of [-20, -50, -80]) {\n const y = scale.yToPixel(level, range, paneHeight);\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(chartWidth, y);\n ctx.stroke();\n }\n ctx.setLineDash([]);\n ctx.restore();\n\n // %R line\n ctx.beginPath();\n ctx.strokeStyle = this.color;\n ctx.lineWidth = 1.5;\n ctx.lineJoin = 'round';\n let started = false;\n for (const r of results) {\n if (r.value === null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.value, range, paneHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n ctx.stroke();\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport { getSource, type PriceSource } from './sourceField.js';\n\nexport class ROC implements IIndicator {\n readonly name: string;\n readonly color: string;\n readonly pane = 'sub' as const;\n readonly paneHeight = 80;\n\n constructor(\n private readonly period: number = 12,\n color = '#80cbc4',\n private readonly source: PriceSource = 'close',\n ) {\n this.name = 'ROC';\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n return data.map((_, i) => {\n if (i < this.period) return { index: i, value: null };\n const prev = getSource(data[i - this.period], this.source);\n if (prev === 0) return { index: i, value: null };\n return { index: i, value: (getSource(data[i], this.source) - prev) / prev * 100 };\n });\n }\n\n getValueRange(results: IndicatorResult[]): PriceRange {\n let maxAbs = 0.0001;\n for (const r of results) {\n if (r.value != null) maxAbs = Math.max(maxAbs, Math.abs(r.value));\n }\n return { min: -maxAbs * 1.3, max: maxAbs * 1.3 };\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n paneHeight: number,\n rangeOverride?: PriceRange,\n ): void {\n const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth\n ?? ctx.canvas.width;\n\n // Dynamic range centered on 0\n let maxAbs = 0.0001;\n for (const r of results) {\n if (r.value != null) maxAbs = Math.max(maxAbs, Math.abs(r.value));\n }\n const range = rangeOverride ?? { min: -maxAbs * 1.3, max: maxAbs * 1.3 };\n const zeroY = scale.yToPixel(0, range, paneHeight);\n\n // Collect valid points\n const points: { x: number; y: number; value: number }[] = [];\n for (const r of results) {\n if (r.value == null) continue;\n points.push({\n x: scale.xToPixel(r.index, viewport, chartWidth),\n y: scale.yToPixel(r.value, range, paneHeight),\n value: r.value,\n });\n }\n\n // Area fill: above zero green, below zero red\n if (points.length >= 2) {\n // Above zero fill\n ctx.beginPath();\n ctx.moveTo(points[0].x, zeroY);\n for (const p of points) {\n ctx.lineTo(p.x, Math.min(p.y, zeroY));\n }\n ctx.lineTo(points[points.length - 1].x, zeroY);\n ctx.closePath();\n ctx.fillStyle = 'rgba(38,166,154,0.05)';\n ctx.fill();\n\n // Below zero fill\n ctx.beginPath();\n ctx.moveTo(points[0].x, zeroY);\n for (const p of points) {\n ctx.lineTo(p.x, Math.max(p.y, zeroY));\n }\n ctx.lineTo(points[points.length - 1].x, zeroY);\n ctx.closePath();\n ctx.fillStyle = 'rgba(239,83,80,0.05)';\n ctx.fill();\n }\n\n // Zero dashed line\n ctx.save();\n ctx.setLineDash([4, 4]);\n ctx.strokeStyle = 'rgba(150,150,150,0.35)';\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.moveTo(0, zeroY);\n ctx.lineTo(chartWidth, zeroY);\n ctx.stroke();\n ctx.setLineDash([]);\n ctx.restore();\n\n // ROC line\n ctx.beginPath();\n ctx.strokeStyle = this.color;\n ctx.lineWidth = 1.5;\n ctx.lineJoin = 'round';\n let started = false;\n for (const r of results) {\n if (r.value === null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.value, range, paneHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n ctx.stroke();\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class OBV implements IIndicator {\n readonly name = 'OBV';\n readonly color: string;\n readonly pane = 'sub' as const;\n readonly paneHeight = 80;\n\n constructor(color = '#aed581') {\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n const results: IndicatorResult[] = [];\n let obv = 0;\n\n for (let i = 0; i < data.length; i++) {\n if (i === 0) {\n obv = data[i].volume ?? 0;\n } else {\n if (data[i].close > data[i - 1].close) {\n obv += data[i].volume ?? 0;\n } else if (data[i].close < data[i - 1].close) {\n obv -= data[i].volume ?? 0;\n }\n // else unchanged\n }\n results.push({ index: i, value: obv });\n }\n\n return results;\n }\n\n getValueRange(results: IndicatorResult[]): PriceRange {\n let minVal = Infinity;\n let maxVal = -Infinity;\n for (const r of results) {\n if (r.value != null) {\n if (r.value < minVal) minVal = r.value;\n if (r.value > maxVal) maxVal = r.value;\n }\n }\n if (minVal === Infinity) return { min: 0, max: 1 };\n const padding = (maxVal - minVal) * 0.1 || 1;\n return { min: minVal - padding, max: maxVal + padding };\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n paneHeight: number,\n rangeOverride?: PriceRange,\n ): void {\n const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth\n ?? ctx.canvas.width;\n\n // Dynamic range from min/max OBV\n let minVal = Infinity;\n let maxVal = -Infinity;\n for (const r of results) {\n if (r.value != null) {\n if (r.value < minVal) minVal = r.value;\n if (r.value > maxVal) maxVal = r.value;\n }\n }\n if (minVal === Infinity) return;\n\n const padding = (maxVal - minVal) * 0.1 || 1;\n const range = rangeOverride ?? { min: minVal - padding, max: maxVal + padding };\n const zeroY = scale.yToPixel(0, range, paneHeight);\n\n // Collect valid points\n const points: { x: number; y: number; value: number }[] = [];\n for (const r of results) {\n if (r.value == null) continue;\n points.push({\n x: scale.xToPixel(r.index, viewport, chartWidth),\n y: scale.yToPixel(r.value, range, paneHeight),\n value: r.value,\n });\n }\n\n if (points.length === 0) return;\n\n // Baseline / zero line\n ctx.save();\n ctx.setLineDash([4, 4]);\n ctx.strokeStyle = 'rgba(150,150,150,0.35)';\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.moveTo(0, zeroY);\n ctx.lineTo(chartWidth, zeroY);\n ctx.stroke();\n ctx.setLineDash([]);\n ctx.restore();\n\n // Area fill under OBV line — green tint if positive, red tint if negative\n // Use a split fill based on current OBV relative to zero\n if (points.length >= 2) {\n ctx.beginPath();\n ctx.moveTo(points[0].x, zeroY);\n for (const p of points) ctx.lineTo(p.x, p.y);\n ctx.lineTo(points[points.length - 1].x, zeroY);\n ctx.closePath();\n // Use the last point's value to determine dominant fill color\n const lastVal = points[points.length - 1].value;\n ctx.fillStyle = lastVal >= 0\n ? 'rgba(38,166,154,0.12)'\n : 'rgba(239,83,80,0.12)';\n ctx.fill();\n }\n\n // OBV line\n ctx.beginPath();\n ctx.strokeStyle = this.color;\n ctx.lineWidth = 1.5;\n ctx.lineJoin = 'round';\n let started = false;\n for (const r of results) {\n if (r.value == null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.value, range, paneHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n ctx.stroke();\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class VWAP implements IIndicator {\n readonly name = 'VWAP';\n readonly color: string;\n\n constructor(color = '#9c27b0') {\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n const results: IndicatorResult[] = [];\n let cumTPV = 0; // cumulative (typicalPrice * volume)\n let cumVol = 0; // cumulative volume\n\n for (let i = 0; i < data.length; i++) {\n const bar = data[i];\n const typicalPrice = (bar.high + bar.low + bar.close) / 3;\n cumTPV += typicalPrice * (bar.volume ?? 0);\n cumVol += bar.volume ?? 0;\n\n results.push({\n index: i,\n value: cumVol === 0 ? null : cumTPV / cumVol,\n });\n }\n\n return results;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n chartHeight: number,\n ): void {\n const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n const priceRange = canvas._priceRange;\n if (!priceRange) return;\n\n const chartWidth = (canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n\n ctx.beginPath();\n ctx.strokeStyle = this.color;\n ctx.lineWidth = 1.5;\n ctx.lineJoin = 'round';\n ctx.setLineDash([4, 3]);\n\n let started = false;\n for (const r of results) {\n if (r.value === null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.value, priceRange, chartHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n\n ctx.stroke();\n ctx.setLineDash([]);\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class AccDistribution implements IIndicator {\n readonly name = 'A/D';\n readonly color: string;\n readonly pane = 'sub' as const;\n readonly paneHeight = 80;\n\n constructor(color = '#ce93d8') {\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n const results: IndicatorResult[] = [];\n let ad = 0;\n\n for (let i = 0; i < data.length; i++) {\n const { high, low, close, volume } = data[i];\n const denom = high - low;\n const mfm = denom === 0 ? 0 : ((close - low) - (high - close)) / denom;\n ad += mfm * (volume ?? 0);\n results.push({ index: i, value: ad });\n }\n\n return results;\n }\n\n getValueRange(results: IndicatorResult[]): PriceRange {\n let minVal = Infinity;\n let maxVal = -Infinity;\n for (const r of results) {\n if (r.value != null) {\n if (r.value < minVal) minVal = r.value;\n if (r.value > maxVal) maxVal = r.value;\n }\n }\n if (minVal === Infinity) return { min: 0, max: 1 };\n const padding = (maxVal - minVal) * 0.1 || 1;\n return { min: minVal - padding, max: maxVal + padding };\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n paneHeight: number,\n rangeOverride?: PriceRange,\n ): void {\n const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth\n ?? ctx.canvas.width;\n\n // Dynamic range\n let minVal = Infinity;\n let maxVal = -Infinity;\n for (const r of results) {\n if (r.value != null) {\n if (r.value < minVal) minVal = r.value;\n if (r.value > maxVal) maxVal = r.value;\n }\n }\n if (minVal === Infinity) return;\n\n const padding = (maxVal - minVal) * 0.1 || 1;\n const range = rangeOverride ?? { min: minVal - padding, max: maxVal + padding };\n\n // Collect valid points\n const points: { x: number; y: number }[] = [];\n for (const r of results) {\n if (r.value == null) continue;\n points.push({\n x: scale.xToPixel(r.index, viewport, chartWidth),\n y: scale.yToPixel(r.value, range, paneHeight),\n });\n }\n\n if (points.length === 0) return;\n\n // Area fill\n if (points.length >= 2) {\n const baseY = paneHeight;\n ctx.beginPath();\n ctx.moveTo(points[0].x, baseY);\n for (const p of points) ctx.lineTo(p.x, p.y);\n ctx.lineTo(points[points.length - 1].x, baseY);\n ctx.closePath();\n ctx.fillStyle = this.color + '20';\n ctx.fill();\n }\n\n // A/D line\n ctx.beginPath();\n ctx.strokeStyle = this.color;\n ctx.lineWidth = 1.5;\n ctx.lineJoin = 'round';\n let started = false;\n for (const r of results) {\n if (r.value == null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.value, range, paneHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n ctx.stroke();\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class MFI implements IIndicator {\n readonly name: string;\n readonly color: string;\n readonly pane = 'sub' as const;\n readonly paneHeight = 80;\n\n constructor(\n private readonly period: number = 14,\n color = '#ffab40',\n ) {\n this.name = 'MFI';\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n const results: IndicatorResult[] = [];\n\n // Compute typical price and raw money flow per bar\n const tp: number[] = data.map(b => (b.high + b.low + b.close) / 3);\n const rawMF: number[] = data.map((b, i) => tp[i] * (b.volume ?? 0));\n\n for (let i = 0; i < data.length; i++) {\n if (i < this.period) {\n results.push({ index: i, value: null });\n continue;\n }\n\n let posSum = 0;\n let negSum = 0;\n for (let j = i - this.period + 1; j <= i; j++) {\n if (tp[j] > tp[j - 1]) {\n posSum += rawMF[j];\n } else if (tp[j] < tp[j - 1]) {\n negSum += rawMF[j];\n }\n }\n\n if (negSum === 0) {\n results.push({ index: i, value: 100 });\n } else {\n const mfRatio = posSum / negSum;\n results.push({ index: i, value: 100 - 100 / (1 + mfRatio) });\n }\n }\n\n return results;\n }\n\n getValueRange(_results: IndicatorResult[]): PriceRange {\n return { min: 0, max: 100 };\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n paneHeight: number,\n rangeOverride?: PriceRange,\n ): void {\n const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth\n ?? ctx.canvas.width;\n\n const range = rangeOverride ?? { min: 0, max: 100 };\n\n // Overbought/oversold zone fills\n const y80 = scale.yToPixel(80, range, paneHeight);\n const y20 = scale.yToPixel(20, range, paneHeight);\n\n ctx.fillStyle = 'rgba(239,83,80,0.06)';\n ctx.fillRect(0, 0, chartWidth, y80);\n\n ctx.fillStyle = 'rgba(38,166,154,0.06)';\n ctx.fillRect(0, y20, chartWidth, paneHeight - y20);\n\n // Reference lines at 80, 50, 20\n ctx.save();\n ctx.setLineDash([4, 4]);\n ctx.strokeStyle = 'rgba(150,150,150,0.35)';\n ctx.lineWidth = 1;\n for (const level of [80, 50, 20]) {\n const y = scale.yToPixel(level, range, paneHeight);\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(chartWidth, y);\n ctx.stroke();\n }\n ctx.setLineDash([]);\n ctx.restore();\n\n // MFI line\n ctx.beginPath();\n ctx.strokeStyle = this.color;\n ctx.lineWidth = 1.5;\n ctx.lineJoin = 'round';\n let started = false;\n for (const r of results) {\n if (r.value === null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.value, range, paneHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n ctx.stroke();\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class CMF implements IIndicator {\n readonly name: string;\n readonly color: string;\n readonly pane = 'sub' as const;\n readonly paneHeight = 80;\n\n constructor(\n private readonly period: number = 20,\n color = '#80deea',\n ) {\n this.name = 'CMF';\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n // Precompute MFM and MFV per bar\n const mfv: number[] = data.map(b => {\n const denom = b.high - b.low;\n const mfm = denom === 0 ? 0 : ((b.close - b.low) - (b.high - b.close)) / denom;\n return mfm * (b.volume ?? 0);\n });\n\n return data.map((b, i) => {\n if (i < this.period - 1) return { index: i, value: null };\n\n let sumMFV = 0;\n let sumVol = 0;\n for (let j = i - this.period + 1; j <= i; j++) {\n sumMFV += mfv[j];\n sumVol += data[j].volume ?? 0;\n }\n\n const cmf = sumVol === 0 ? 0 : sumMFV / sumVol;\n return { index: i, value: cmf };\n });\n }\n\n getValueRange(_results: IndicatorResult[]): PriceRange {\n return { min: -1, max: 1 };\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n paneHeight: number,\n rangeOverride?: PriceRange,\n ): void {\n const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth\n ?? ctx.canvas.width;\n\n const range = rangeOverride ?? { min: -1, max: 1 };\n const zeroY = scale.yToPixel(0, range, paneHeight);\n\n // Fill zones above 0.2 (bullish) and below -0.2 (bearish)\n const y02 = scale.yToPixel(0.2, range, paneHeight);\n const yN02 = scale.yToPixel(-0.2, range, paneHeight);\n\n ctx.fillStyle = 'rgba(38,166,154,0.08)';\n ctx.fillRect(0, 0, chartWidth, y02);\n\n ctx.fillStyle = 'rgba(239,83,80,0.08)';\n ctx.fillRect(0, yN02, chartWidth, paneHeight - yN02);\n\n // Reference lines at 0.2, 0, -0.2\n ctx.save();\n ctx.setLineDash([4, 4]);\n ctx.strokeStyle = 'rgba(150,150,150,0.35)';\n ctx.lineWidth = 1;\n for (const level of [0.2, 0, -0.2]) {\n const y = scale.yToPixel(level, range, paneHeight);\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(chartWidth, y);\n ctx.stroke();\n }\n ctx.setLineDash([]);\n ctx.restore();\n\n // Histogram bars\n const bodyW = Math.max(1, chartWidth / Math.max(results.length, 1) * 0.6);\n for (const r of results) {\n if (r.value == null) continue;\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const barY = scale.yToPixel(r.value, range, paneHeight);\n const h = Math.abs(barY - zeroY);\n const top = Math.min(barY, zeroY);\n ctx.fillStyle = r.value >= 0 ? 'rgba(38,166,154,0.45)' : 'rgba(239,83,80,0.45)';\n ctx.fillRect(x - bodyW / 2, top, bodyW, h);\n }\n\n // CMF line on top\n ctx.beginPath();\n ctx.strokeStyle = this.color;\n ctx.lineWidth = 1.5;\n ctx.lineJoin = 'round';\n let started = false;\n for (const r of results) {\n if (r.value === null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.value, range, paneHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n ctx.stroke();\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class PivotPoints implements IIndicator {\n readonly name = 'Pivot';\n readonly color: string;\n\n constructor(color = '#ffd54f') {\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n return data.map((_, i) => {\n if (i === 0) return { index: i, value: null, upper: null, lower: null, signal: null, histogram: null };\n\n const prev = data[i - 1];\n const pp = (prev.high + prev.low + prev.close) / 3;\n const r1 = 2 * pp - prev.low;\n const s1 = 2 * pp - prev.high;\n const r2 = pp + (prev.high - prev.low);\n const s2 = pp - (prev.high - prev.low);\n\n return {\n index: i,\n value: pp, // PP\n upper: r1, // R1\n lower: s1, // S1\n signal: r2, // R2\n histogram: s2, // S2\n };\n });\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n chartHeight: number,\n ): void {\n const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n const priceRange = canvas._priceRange;\n if (!priceRange) return;\n\n const chartWidth = (canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n\n // Find the last non-null result\n let lastResult: IndicatorResult | null = null;\n for (let i = results.length - 1; i >= 0; i--) {\n if (results[i].value !== null) {\n lastResult = results[i];\n break;\n }\n }\n\n if (lastResult === null) return;\n\n const levels: Array<{ value: number | null | undefined; label: string; color: string }> = [\n { value: lastResult.signal, label: 'R2', color: '#b71c1c' },\n { value: lastResult.upper, label: 'R1', color: '#ef5350' },\n { value: lastResult.value, label: 'PP', color: '#ffd54f' },\n { value: lastResult.lower, label: 'S1', color: '#26a69a' },\n { value: lastResult.histogram, label: 'S2', color: '#1b5e20' },\n ];\n\n ctx.lineWidth = 1;\n ctx.font = '10px sans-serif';\n ctx.textBaseline = 'middle';\n\n for (const level of levels) {\n if (level.value == null) continue;\n const y = scale.yToPixel(level.value, priceRange, chartHeight);\n\n // Draw dashed horizontal line across full chart width\n ctx.beginPath();\n ctx.setLineDash([6, 4]);\n ctx.strokeStyle = level.color;\n ctx.moveTo(0, y);\n ctx.lineTo(chartWidth, y);\n ctx.stroke();\n ctx.setLineDash([]);\n\n // Draw label on the right side\n ctx.fillStyle = level.color;\n ctx.fillText(level.label, chartWidth - 28, y - 6);\n }\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nconst FIB_RATIOS = [0, 0.236, 0.382, 0.5, 0.618, 0.786, 1.0] as const;\nconst FIB_LABELS = ['0%', '23.6%', '38.2%', '50%', '61.8%', '78.6%', '100%'] as const;\nconst FIB_COLORS = ['#90a4ae', '#4d96ff', '#6bcb77', '#ffd93d', '#ff9800', '#ef5350', '#90a4ae'] as const;\n\nexport class FibRetracementIndicator implements IIndicator {\n readonly name = 'Fib';\n readonly color: string;\n\n constructor(\n private readonly lookback = 50,\n color = '#e1bee7',\n ) {\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n return data.map((_, i) => {\n const start = Math.max(0, i - this.lookback + 1);\n let high = -Infinity;\n let low = Infinity;\n for (let j = start; j <= i; j++) {\n if (data[j].high > high) high = data[j].high;\n if (data[j].low < low) low = data[j].low;\n }\n\n const range = high - low;\n\n return {\n index: i,\n value: high, // 100% (top of range)\n upper: low + 0.618 * range, // 61.8%\n lower: low + 0.382 * range, // 38.2%\n signal: low + 0.5 * range, // 50%\n histogram: low, // 0% (bottom of range)\n };\n });\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n chartHeight: number,\n ): void {\n const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n const priceRange = canvas._priceRange;\n if (!priceRange) return;\n\n const chartWidth = (canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n\n // Use the last result's values\n let lastResult: IndicatorResult | null = null;\n for (let i = results.length - 1; i >= 0; i--) {\n if (results[i].value !== null) {\n lastResult = results[i];\n break;\n }\n }\n\n if (lastResult === null) return;\n\n const high = lastResult.value;\n const low = lastResult.histogram;\n\n if (high == null || low == null) return;\n\n const range = high - low;\n\n // Compute all 7 fib levels\n const fibValues = FIB_RATIOS.map((ratio) => low + ratio * range);\n\n ctx.lineWidth = 1;\n ctx.font = '10px sans-serif';\n ctx.textBaseline = 'middle';\n\n for (let fi = 0; fi < FIB_RATIOS.length; fi++) {\n const price = fibValues[fi];\n const y = scale.yToPixel(price, priceRange, chartHeight);\n const color = FIB_COLORS[fi];\n\n ctx.beginPath();\n ctx.setLineDash([6, 4]);\n ctx.strokeStyle = color;\n ctx.moveTo(0, y);\n ctx.lineTo(chartWidth, y);\n ctx.stroke();\n ctx.setLineDash([]);\n\n ctx.fillStyle = color;\n ctx.fillText(FIB_LABELS[fi], chartWidth - 38, y - 6);\n }\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class Supertrend implements IIndicator {\n readonly name = 'Supertrend';\n readonly color: string;\n\n constructor(\n private readonly atrPeriod = 10,\n private readonly multiplier = 3,\n color = '#26a69a',\n ) {\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n const n = data.length;\n const results: IndicatorResult[] = [];\n\n if (n === 0) return results;\n\n // Compute True Range\n const tr: number[] = new Array(n).fill(0);\n for (let i = 0; i < n; i++) {\n const high = data[i].high;\n const low = data[i].low;\n const prevClose = i > 0 ? data[i - 1].close : data[i].close;\n tr[i] = Math.max(high - low, Math.abs(high - prevClose), Math.abs(low - prevClose));\n }\n\n // ATR using Wilder's smoothing seeded with SMA\n const atr: number[] = new Array(n).fill(0);\n if (n < this.atrPeriod) {\n for (let i = 0; i < n; i++) results.push({ index: i, value: null, upper: null });\n return results;\n }\n\n // Seed ATR with SMA of first atrPeriod TRs\n let atrSeed = 0;\n for (let i = 0; i < this.atrPeriod; i++) atrSeed += tr[i];\n atr[this.atrPeriod - 1] = atrSeed / this.atrPeriod;\n\n for (let i = this.atrPeriod; i < n; i++) {\n atr[i] = (atr[i - 1] * (this.atrPeriod - 1) + tr[i]) / this.atrPeriod;\n }\n\n // Compute Supertrend\n const finalUpperBand: number[] = new Array(n).fill(0);\n const finalLowerBand: number[] = new Array(n).fill(0);\n // direction: 1 = bullish, -1 = bearish\n const direction: number[] = new Array(n).fill(1);\n\n for (let i = 0; i < n; i++) {\n if (i < this.atrPeriod - 1) {\n results.push({ index: i, value: null, upper: null });\n continue;\n }\n\n const hl2 = (data[i].high + data[i].low) / 2;\n const basicUpper = hl2 + this.multiplier * atr[i];\n const basicLower = hl2 - this.multiplier * atr[i];\n\n if (i === this.atrPeriod - 1) {\n finalUpperBand[i] = basicUpper;\n finalLowerBand[i] = basicLower;\n direction[i] = 1;\n results.push({ index: i, value: finalLowerBand[i], upper: 1 });\n continue;\n }\n\n const prevClose = data[i - 1].close;\n\n // Final upper band\n finalUpperBand[i] =\n basicUpper < finalUpperBand[i - 1] || prevClose > finalUpperBand[i - 1]\n ? basicUpper\n : finalUpperBand[i - 1];\n\n // Final lower band\n finalLowerBand[i] =\n basicLower > finalLowerBand[i - 1] || prevClose < finalLowerBand[i - 1]\n ? basicLower\n : finalLowerBand[i - 1];\n\n // Determine direction\n if (direction[i - 1] === -1) {\n direction[i] = data[i].close > finalUpperBand[i] ? 1 : -1;\n } else {\n direction[i] = data[i].close < finalLowerBand[i] ? -1 : 1;\n }\n\n const supertrendVal = direction[i] === 1 ? finalLowerBand[i] : finalUpperBand[i];\n results.push({ index: i, value: supertrendVal, upper: direction[i] });\n }\n\n return results;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n chartHeight: number,\n ): void {\n const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n const priceRange = canvas._priceRange;\n if (!priceRange) return;\n\n const chartWidth = (canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n ctx.lineWidth = 2;\n ctx.lineJoin = 'round';\n\n const BULLISH_COLOR = '#26a69a';\n const BEARISH_COLOR = '#ef5350';\n\n let prevDirection: number | null = null;\n\n // Draw bullish segments\n ctx.beginPath();\n ctx.strokeStyle = BULLISH_COLOR;\n let startedBull = false;\n\n for (const r of results) {\n if (r.value == null || r.upper == null) { startedBull = false; continue; }\n const isBullish = r.upper >= 0;\n if (!isBullish) { startedBull = false; continue; }\n if (prevDirection !== 1) startedBull = false;\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.value, priceRange, chartHeight);\n startedBull ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (startedBull = true));\n prevDirection = 1;\n }\n ctx.stroke();\n\n // Draw bearish segments\n ctx.beginPath();\n ctx.strokeStyle = BEARISH_COLOR;\n let startedBear = false;\n prevDirection = null;\n\n for (const r of results) {\n if (r.value == null || r.upper == null) { startedBear = false; continue; }\n const isBearish = r.upper < 0;\n if (!isBearish) { startedBear = false; continue; }\n if (prevDirection !== -1) startedBear = false;\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.value, priceRange, chartHeight);\n startedBear ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (startedBear = true));\n prevDirection = -1;\n }\n ctx.stroke();\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class ParabolicSAR implements IIndicator {\n readonly name = 'PSAR';\n readonly color: string;\n\n constructor(\n private readonly step = 0.02,\n private readonly maxAF = 0.2,\n color = '#ff6b9d',\n ) {\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n const n = data.length;\n const results: IndicatorResult[] = [];\n\n if (n < 2) {\n for (let i = 0; i < n; i++) results.push({ index: i, value: null, upper: null });\n return results;\n }\n\n // Initialization: start bullish\n let bullish = true;\n let af = this.step;\n let ep = data[0].high; // Extreme point\n let sar = data[0].low; // Initial SAR below price\n\n results.push({ index: 0, value: null, upper: null });\n\n for (let i = 1; i < n; i++) {\n // Calculate new SAR\n let newSar = sar + af * (ep - sar);\n\n if (bullish) {\n // In uptrend: SAR is below price, can't be above last two lows\n const prevLow = data[i - 1].low;\n const prevPrevLow = i >= 2 ? data[i - 2].low : data[i - 1].low;\n newSar = Math.min(newSar, prevLow, prevPrevLow);\n\n // Check for reversal\n if (newSar > data[i].low) {\n // Flip to bearish\n bullish = false;\n newSar = ep; // SAR flips to EP (highest high)\n ep = data[i].low;\n af = this.step;\n } else {\n // Update EP if new high\n if (data[i].high > ep) {\n ep = data[i].high;\n af = Math.min(af + this.step, this.maxAF);\n }\n }\n } else {\n // In downtrend: SAR is above price, can't be below last two highs\n const prevHigh = data[i - 1].high;\n const prevPrevHigh = i >= 2 ? data[i - 2].high : data[i - 1].high;\n newSar = Math.max(newSar, prevHigh, prevPrevHigh);\n\n // Check for reversal\n if (newSar < data[i].high) {\n // Flip to bullish\n bullish = true;\n newSar = ep; // SAR flips to EP (lowest low)\n ep = data[i].high;\n af = this.step;\n } else {\n // Update EP if new low\n if (data[i].low < ep) {\n ep = data[i].low;\n af = Math.min(af + this.step, this.maxAF);\n }\n }\n }\n\n sar = newSar;\n // upper: 1 = bullish, -1 = bearish\n results.push({ index: i, value: sar, upper: bullish ? 1 : -1 });\n }\n\n return results;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n chartHeight: number,\n ): void {\n const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n const priceRange = canvas._priceRange;\n if (!priceRange) return;\n\n const chartWidth = (canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n const BULLISH_COLOR = '#26a69a';\n const BEARISH_COLOR = '#ef5350';\n\n for (const r of results) {\n if (r.value == null || r.upper == null) continue;\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.value, priceRange, chartHeight);\n\n ctx.beginPath();\n ctx.arc(x, y, 2, 0, Math.PI * 2);\n ctx.fillStyle = r.upper >= 0 ? BULLISH_COLOR : BEARISH_COLOR;\n ctx.fill();\n }\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nfunction periodHighLow(data: OHLCVBar[], index: number, period: number): { high: number; low: number } | null {\n if (index < period - 1) return null;\n let high = -Infinity;\n let low = Infinity;\n for (let j = index - period + 1; j <= index; j++) {\n if (data[j].high > high) high = data[j].high;\n if (data[j].low < low) low = data[j].low;\n }\n return { high, low };\n}\n\nexport class IchimokuCloud implements IIndicator {\n readonly name = 'Ichimoku';\n readonly color: string;\n\n constructor(\n private readonly tenkanPeriod = 9,\n private readonly kijunPeriod = 26,\n private readonly senkouBPeriod = 52,\n color = '#b0bec5',\n ) {\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n return data.map((bar, i) => {\n // Tenkan-sen (Conversion Line)\n const tenkanHL = periodHighLow(data, i, this.tenkanPeriod);\n const tenkan = tenkanHL !== null ? (tenkanHL.high + tenkanHL.low) / 2 : null;\n\n // Kijun-sen (Base Line)\n const kijunHL = periodHighLow(data, i, this.kijunPeriod);\n const kijun = kijunHL !== null ? (kijunHL.high + kijunHL.low) / 2 : null;\n\n // Senkou Span A = (Tenkan + Kijun) / 2 (no displacement in stored data)\n const spanA = tenkan !== null && kijun !== null ? (tenkan + kijun) / 2 : null;\n\n // Senkou Span B = (highest high + lowest low) over senkouBPeriod\n const spanBHL = periodHighLow(data, i, this.senkouBPeriod);\n const spanB = spanBHL !== null ? (spanBHL.high + spanBHL.low) / 2 : null;\n\n // Chikou Span = close plotted kijunPeriod bars back\n // Store current close in histogram; render will offset it back by kijunPeriod\n const chikou = bar.close;\n\n return {\n index: i,\n value: tenkan,\n upper: kijun,\n lower: spanA,\n signal: spanB,\n histogram: chikou,\n };\n });\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n chartHeight: number,\n ): void {\n const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n const priceRange = canvas._priceRange;\n if (!priceRange) return;\n\n const chartWidth = (canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n ctx.lineWidth = 1;\n ctx.lineJoin = 'round';\n\n const drawLine = (\n getValue: (r: IndicatorResult) => number | null | undefined,\n color: string,\n dash = false,\n ) => {\n ctx.strokeStyle = color;\n if (dash) ctx.setLineDash([4, 3]);\n ctx.beginPath();\n let started = false;\n for (const r of results) {\n const val = getValue(r);\n if (val == null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(val, priceRange, chartHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n ctx.stroke();\n if (dash) ctx.setLineDash([]);\n };\n\n // Draw cloud fill between SpanA (lower) and SpanB (signal)\n const spanAPoints: [number, number][] = [];\n const spanBPoints: [number, number][] = [];\n\n for (const r of results) {\n if (r.lower == null || r.signal == null) continue;\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n spanAPoints.push([x, scale.yToPixel(r.lower, priceRange, chartHeight)]);\n spanBPoints.push([x, scale.yToPixel(r.signal, priceRange, chartHeight)]);\n }\n\n // Per-segment cloud fill — green when SpanA > SpanB (bullish), red otherwise\n for (let i = 0; i + 1 < spanAPoints.length; i++) {\n const [x0, a0] = spanAPoints[i];\n const [x1, a1] = spanAPoints[i + 1];\n const [, b0] = spanBPoints[i];\n const [, b1] = spanBPoints[i + 1];\n\n // spanA is r.lower (SpanA price → pixel y), spanB is r.signal\n // Note: lower y pixel = higher price\n // SpanA > SpanB in price means a0 < b0 (smaller y = higher on canvas)\n const spanAAbove = a0 < b0; // bullish cloud (SpanA above SpanB)\n ctx.beginPath();\n ctx.moveTo(x0, a0);\n ctx.lineTo(x1, a1);\n ctx.lineTo(x1, b1);\n ctx.lineTo(x0, b0);\n ctx.closePath();\n ctx.fillStyle = spanAAbove\n ? 'rgba(38, 166, 154, 0.15)'\n : 'rgba(239, 83, 80, 0.15)';\n ctx.fill();\n }\n\n // SpanA line (dashed, green)\n drawLine((r) => r.lower, '#26a69a', true);\n\n // SpanB line (dashed, red)\n drawLine((r) => r.signal, '#ef5350', true);\n\n // Tenkan-sen (thin solid, red-ish)\n drawLine((r) => r.value, '#ef9a9a');\n\n // Kijun-sen (thin solid, blue-ish)\n drawLine((r) => r.upper, '#90caf9');\n\n // Chikou span: draw close shifted back kijunPeriod bars\n ctx.strokeStyle = '#b0bec5';\n ctx.beginPath();\n let started = false;\n for (const r of results) {\n if (r.histogram == null) { started = false; continue; }\n const shiftedIndex = r.index - this.kijunPeriod;\n if (shiftedIndex < 0) { started = false; continue; }\n const x = scale.xToPixel(shiftedIndex, viewport, chartWidth);\n const y = scale.yToPixel(r.histogram, priceRange, chartHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n ctx.stroke();\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class ADX implements IIndicator {\n readonly name: string;\n readonly color: string;\n readonly pane = 'sub' as const;\n readonly paneHeight = 80;\n\n constructor(\n private readonly period: number = 14,\n color = '#fff176',\n ) {\n this.name = 'ADX';\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n const n = data.length;\n if (n < this.period + 1) {\n return data.map((_, i) => ({ index: i, value: null, upper: null, lower: null }));\n }\n\n // Compute TR, +DM, -DM for all bars starting at index 1\n const tr: number[] = new Array(n).fill(0);\n const dmP: number[] = new Array(n).fill(0);\n const dmM: number[] = new Array(n).fill(0);\n\n tr[0] = data[0].high - data[0].low;\n dmP[0] = 0;\n dmM[0] = 0;\n\n for (let i = 1; i < n; i++) {\n const prevClose = data[i - 1].close;\n const prevHigh = data[i - 1].high;\n const prevLow = data[i - 1].low;\n const currHigh = data[i].high;\n const currLow = data[i].low;\n\n tr[i] = Math.max(\n currHigh - currLow,\n Math.abs(currHigh - prevClose),\n Math.abs(currLow - prevClose),\n );\n\n const upMove = currHigh - prevHigh;\n const downMove = prevLow - currLow;\n\n dmP[i] = (upMove > downMove && upMove > 0) ? upMove : 0;\n dmM[i] = (downMove > upMove && downMove > 0) ? downMove : 0;\n }\n\n // Seed Wilder's smoothed sums over first `period` bars (indices 0..period-1)\n let smoothTR = 0;\n let smoothDP = 0;\n let smoothDM = 0;\n for (let i = 0; i < this.period; i++) {\n smoothTR += tr[i];\n smoothDP += dmP[i];\n smoothDM += dmM[i];\n }\n\n const results: IndicatorResult[] = [];\n\n // Nulls for bars before first DI/ADX is available\n for (let i = 0; i < this.period; i++) {\n results.push({ index: i, value: null, upper: null, lower: null });\n }\n\n // Compute DI values starting at period-1 (index of first seeded bar)\n // We actually start emitting from index period (first smoothed bar after seed)\n // But let's do the standard approach: seed then roll from period onwards.\n\n const diPArr: number[] = new Array(n).fill(0);\n const diMArr: number[] = new Array(n).fill(0);\n const dxArr: number[] = new Array(n).fill(0);\n\n // First seeded values at index period-1\n const diP0 = smoothTR === 0 ? 0 : 100 * smoothDP / smoothTR;\n const diM0 = smoothTR === 0 ? 0 : 100 * smoothDM / smoothTR;\n const dx0 = (diP0 + diM0 === 0) ? 0 : 100 * Math.abs(diP0 - diM0) / (diP0 + diM0);\n\n diPArr[this.period - 1] = diP0;\n diMArr[this.period - 1] = diM0;\n dxArr[this.period - 1] = dx0;\n\n // Replace the last null result with actual DI (no ADX yet)\n results[this.period - 1] = {\n index: this.period - 1,\n value: null, // ADX not ready yet\n upper: diP0,\n lower: diM0,\n };\n\n // Roll Wilder's smoothing from period onwards\n for (let i = this.period; i < n; i++) {\n smoothTR = smoothTR - smoothTR / this.period + tr[i];\n smoothDP = smoothDP - smoothDP / this.period + dmP[i];\n smoothDM = smoothDM - smoothDM / this.period + dmM[i];\n\n const diP = smoothTR === 0 ? 0 : 100 * smoothDP / smoothTR;\n const diM = smoothTR === 0 ? 0 : 100 * smoothDM / smoothTR;\n const dx = (diP + diM === 0) ? 0 : 100 * Math.abs(diP - diM) / (diP + diM);\n\n diPArr[i] = diP;\n diMArr[i] = diM;\n dxArr[i] = dx;\n\n results.push({ index: i, value: null, upper: diP, lower: diM });\n }\n\n // Compute ADX using Wilder's EMA of DX, seeded at index period-1\n // ADX first available at index 2*period - 2 (need period DX values)\n const adxStart = 2 * this.period - 2;\n\n // Seed ADX with SMA of first `period` DX values (indices period-1 .. 2*period-2)\n if (adxStart >= n) return results;\n\n let adx = 0;\n for (let i = this.period - 1; i <= adxStart; i++) {\n adx += dxArr[i];\n }\n adx /= (this.period); // period values from period-1 to 2*period-2 inclusive\n\n results[adxStart].value = adx;\n\n for (let i = adxStart + 1; i < n; i++) {\n adx = (adx * (this.period - 1) + dxArr[i]) / this.period;\n results[i].value = adx;\n }\n\n return results;\n }\n\n getValueRange(_results: IndicatorResult[]): PriceRange {\n return { min: 0, max: 100 };\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n paneHeight: number,\n rangeOverride?: PriceRange,\n ): void {\n const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth\n ?? ctx.canvas.width;\n\n const range = rangeOverride ?? { min: 0, max: 100 };\n\n // Reference line at 25 (trend threshold)\n ctx.save();\n ctx.setLineDash([4, 4]);\n ctx.strokeStyle = 'rgba(150,150,150,0.35)';\n ctx.lineWidth = 1;\n const y25 = scale.yToPixel(25, range, paneHeight);\n ctx.beginPath();\n ctx.moveTo(0, y25);\n ctx.lineTo(chartWidth, y25);\n ctx.stroke();\n ctx.setLineDash([]);\n ctx.restore();\n\n // Helper to draw a line\n const drawLine = (\n getValue: (r: IndicatorResult) => number | null | undefined,\n strokeColor: string,\n lineWidth: number,\n ) => {\n ctx.beginPath();\n ctx.strokeStyle = strokeColor;\n ctx.lineWidth = lineWidth;\n ctx.lineJoin = 'round';\n let started = false;\n for (const r of results) {\n const val = getValue(r);\n if (val == null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(val, range, paneHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n ctx.stroke();\n };\n\n // +DI (green)\n drawLine(r => r.upper, '#26a69a', 1);\n // -DI (red)\n drawLine(r => r.lower, '#ef5350', 1);\n // ADX (this.color, solid, thicker)\n drawLine(r => r.value, this.color, 1.5);\n\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class AwesomeOscillator implements IIndicator {\n readonly name = 'AO';\n readonly color: string;\n readonly pane = 'sub' as const;\n readonly paneHeight = 80;\n\n constructor(\n private readonly fastPeriod = 5,\n private readonly slowPeriod = 34,\n color = '#b0bec5',\n ) {\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n // Midpoint = (high + low) / 2\n const mid: number[] = data.map(b => (b.high + b.low) / 2);\n\n // SMA helper\n const sma = (arr: number[], end: number, period: number): number | null => {\n if (end < period - 1) return null;\n let sum = 0;\n for (let j = end - period + 1; j <= end; j++) sum += arr[j];\n return sum / period;\n };\n\n return data.map((_, i) => {\n const fast = sma(mid, i, this.fastPeriod);\n const slow = sma(mid, i, this.slowPeriod);\n if (fast === null || slow === null) return { index: i, value: null };\n return { index: i, value: fast - slow };\n });\n }\n\n getValueRange(results: IndicatorResult[]): PriceRange {\n let maxAbs = 0.0001;\n for (const r of results) {\n if (r.value != null) maxAbs = Math.max(maxAbs, Math.abs(r.value));\n }\n return { min: -maxAbs * 1.2, max: maxAbs * 1.2 };\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n paneHeight: number,\n rangeOverride?: PriceRange,\n ): void {\n const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth\n ?? ctx.canvas.width;\n\n // Dynamic range ±maxAbs*1.2\n let maxAbs = 0.0001;\n for (const r of results) {\n if (r.value != null) maxAbs = Math.max(maxAbs, Math.abs(r.value));\n }\n const range = rangeOverride ?? { min: -maxAbs * 1.2, max: maxAbs * 1.2 };\n const zeroY = scale.yToPixel(0, range, paneHeight);\n\n // Zero dashed line\n ctx.save();\n ctx.setLineDash([4, 4]);\n ctx.strokeStyle = 'rgba(150,150,150,0.35)';\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.moveTo(0, zeroY);\n ctx.lineTo(chartWidth, zeroY);\n ctx.stroke();\n ctx.setLineDash([]);\n ctx.restore();\n\n // Histogram bars: green if AO[i] >= AO[i-1], red otherwise (first bar defaults green)\n const bodyW = Math.max(scale.candleBodyWidth(viewport, chartWidth), 1);\n let prevValue: number | null = null;\n\n for (const r of results) {\n if (r.value == null) { prevValue = null; continue; }\n\n const isGreen = prevValue === null ? true : r.value >= prevValue;\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const barY = scale.yToPixel(r.value, range, paneHeight);\n const h = Math.abs(barY - zeroY);\n const top = Math.min(barY, zeroY);\n\n ctx.fillStyle = isGreen ? 'rgba(38,166,154,0.70)' : 'rgba(239,83,80,0.70)';\n ctx.fillRect(x - bodyW / 2, top, bodyW, h);\n\n prevValue = r.value;\n }\n\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class HeikinAshi implements IIndicator {\n readonly name = 'HA';\n readonly color: string;\n private readonly upColor: string;\n private readonly downColor: string;\n\n constructor(color = '#90a4ae', upColor = '#26a69a', downColor = '#ef5350') {\n this.color = color;\n this.upColor = upColor;\n this.downColor = downColor;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n const results: IndicatorResult[] = [];\n let prevHAOpen = 0;\n let prevHAClose = 0;\n\n for (let i = 0; i < data.length; i++) {\n const bar = data[i];\n\n const haClose = (bar.open + bar.high + bar.low + bar.close) / 4;\n\n let haOpen: number;\n if (i === 0) {\n haOpen = (bar.open + bar.close) / 2;\n } else {\n haOpen = (prevHAOpen + prevHAClose) / 2;\n }\n\n const haHigh = Math.max(bar.high, haOpen, haClose);\n const haLow = Math.min(bar.low, haOpen, haClose);\n\n prevHAOpen = haOpen;\n prevHAClose = haClose;\n\n results.push({\n index: i,\n value: haClose, // HA-Close\n upper: haHigh, // HA-High\n lower: haLow, // HA-Low\n signal: haOpen, // HA-Open\n });\n }\n\n return results;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n chartHeight: number,\n ): void {\n const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n const priceRange = canvas._priceRange;\n if (!priceRange) return;\n\n const chartWidth = (canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n const candleWidth = scale.candleBodyWidth(viewport, chartWidth);\n const halfBody = candleWidth / 2;\n\n for (const r of results) {\n if (r.value == null || r.upper == null || r.lower == null || r.signal == null) continue;\n\n const haClose = r.value;\n const haHigh = r.upper;\n const haLow = r.lower;\n const haOpen = r.signal;\n\n const isBullish = haClose >= haOpen;\n const color = isBullish ? this.upColor : this.downColor;\n\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const yHigh = scale.yToPixel(haHigh, priceRange, chartHeight);\n const yLow = scale.yToPixel(haLow, priceRange, chartHeight);\n const yOpen = scale.yToPixel(haOpen, priceRange, chartHeight);\n const yClose = scale.yToPixel(haClose, priceRange, chartHeight);\n\n const bodyTop = Math.min(yOpen, yClose);\n const bodyBottom = Math.max(yOpen, yClose);\n const bodyHeight = Math.max(1, bodyBottom - bodyTop);\n\n // Draw wick\n ctx.beginPath();\n ctx.strokeStyle = color;\n ctx.lineWidth = 1;\n ctx.moveTo(x, yHigh);\n ctx.lineTo(x, yLow);\n ctx.stroke();\n\n // Draw body\n ctx.fillStyle = color;\n ctx.strokeStyle = color;\n ctx.lineWidth = 1;\n ctx.fillRect(x - halfBody, bodyTop, candleWidth, bodyHeight);\n ctx.strokeRect(x - halfBody, bodyTop, candleWidth, bodyHeight);\n }\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class VOL implements IIndicator {\n readonly name = 'VOL';\n readonly color: string;\n readonly pane = 'sub' as const;\n readonly paneHeight = 80;\n\n private readonly upColor: string;\n private readonly downColor: string;\n\n constructor(upColor = '#26a69a', downColor = '#ef5350') {\n this.upColor = upColor;\n this.downColor = downColor;\n this.color = upColor;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n return data.map((bar, i) => ({\n index: i,\n value: bar.volume ?? 0,\n // encode direction in signal field for render phase\n signal: bar.close >= bar.open ? 1 : 0,\n }));\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n paneHeight: number,\n ): void {\n const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth\n ?? ctx.canvas.width;\n\n // Dynamic range from 0 to max volume\n let maxVol = 0;\n for (const r of results) {\n if (r.value != null && r.value > maxVol) maxVol = r.value;\n }\n if (maxVol === 0) return;\n\n const range = { min: 0, max: maxVol * 1.1 };\n const baseY = scale.yToPixel(0, range, paneHeight);\n const bodyW = Math.max(scale.candleBodyWidth(viewport, chartWidth), 1);\n\n for (const r of results) {\n if (r.value == null || r.value === 0) continue;\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const topY = scale.yToPixel(r.value, range, paneHeight);\n const h = Math.abs(baseY - topY);\n ctx.fillStyle = r.signal === 1 ? `${this.upColor}99` : `${this.downColor}99`;\n ctx.fillRect(x - bodyW / 2, topY, bodyW, h);\n }\n\n // Label\n ctx.fillStyle = this.upColor;\n ctx.font = \"10px 'Inter', system-ui, sans-serif\";\n ctx.fillText(this.name, 4, 11);\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class LinearRegression implements IIndicator {\n readonly name: string;\n readonly color: string;\n\n constructor(\n private readonly period = 14,\n color = '#ff9800',\n ) {\n this.name = 'LinReg';\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n const n = this.period;\n const results: IndicatorResult[] = [];\n\n // Precompute constant parts of the regression that depend only on n\n // x values are 0, 1, ..., n-1\n const sumX = (n * (n - 1)) / 2;\n const sumX2 = (n * (n - 1) * (2 * n - 1)) / 6;\n const denom = n * sumX2 - sumX * sumX;\n\n for (let i = 0; i < data.length; i++) {\n if (i < n - 1) {\n results.push({ index: i, value: null });\n continue;\n }\n\n let sumY = 0;\n let sumXY = 0;\n for (let j = 0; j < n; j++) {\n const close = data[i - (n - 1 - j)].close;\n sumY += close;\n sumXY += j * close;\n }\n\n const slope = (n * sumXY - sumX * sumY) / denom;\n const intercept = (sumY - slope * sumX) / n;\n const value = intercept + slope * (n - 1);\n\n results.push({ index: i, value });\n }\n\n return results;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n chartHeight: number,\n ): void {\n const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n const priceRange = canvas._priceRange;\n if (!priceRange) return;\n\n const chartWidth = (canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n\n ctx.beginPath();\n ctx.strokeStyle = this.color;\n ctx.lineWidth = 1.5;\n ctx.lineJoin = 'round';\n\n let started = false;\n for (const r of results) {\n if (r.value === null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.value, priceRange, chartHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n\n ctx.stroke();\n }\n}\n"]}