{"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/BollingerBands.ts","../../src/indicators/KeltnerChannels.ts","../../src/indicators/ATR.ts","../../src/indicators/RSI.ts","../../src/indicators/VWAP.ts","../../src/indicators/MACD.ts","../../src/indicators/Stochastic.ts","../../src/indicators/StochRSI.ts","../../src/indicators/CCI.ts","../../src/indicators/WilliamsR.ts","../../src/indicators/ROC.ts","../../src/indicators/OBV.ts","../../src/indicators/AccDistribution.ts","../../src/indicators/MFI.ts","../../src/indicators/CMF.ts","../../src/indicators/ADX.ts","../../src/indicators/AwesomeOscillator.ts","../../src/indicators/MARibbon.ts","../../src/indicators/DonchianChannels.ts","../../src/indicators/Supertrend.ts","../../src/indicators/ParabolicSAR.ts","../../src/indicators/IchimokuCloud.ts","../../src/indicators/PivotPoints.ts","../../src/indicators/FibRetracementIndicator.ts","../../src/indicators/HeikinAshi.ts","../../src/indicators/VOL.ts","../../src/indicators/LinearRegression.ts"],"names":["started"],"mappings":"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","file":"index.cjs","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\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      if (i < this.period - 1) {\n        results.push({ index: i, value: null, upper: null, lower: null });\n        continue;\n      }\n\n      // Seed or update EMA\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      // True range for current bar\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      // Seed ATR on first valid bar (i >= period-1 >= atrPeriod-1), then Wilder-smooth\n      if (atr === null) {\n        let trSum = 0;\n        for (let j = 0; j < this.atrPeriod; j++) {\n          const b = data[i - j];\n          const prev = i - j > 0 ? data[i - j - 1] : null;\n          const trj = prev == null\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      } else {\n        atr = (atr * (this.atrPeriod - 1) + tr) / this.atrPeriod;\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, 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 } 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';\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 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';\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, 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, 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';\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';\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 } 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 } 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 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"]}