@adrienhobbs/candlekit 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/indicators/core/registry.ts","../src/indicators/core/calculator.ts","../src/indicators/primitives/BandsPrimitive.ts","../src/components/trade-markers.ts","../src/components/ChartComponent.tsx","../src/indicators/core/types.ts","../src/components/IndicatorBrowser.tsx","../src/components/IndicatorSettingsForm.tsx","../src/components/SettingsDialog.tsx","../src/hooks/useChartAPI.ts","../src/utils/barUtils.ts","../src/hooks/useBarsData.ts","../src/hooks/useRealtimeUpdates.ts","../src/indicators/core/persistence.ts","../src/indicators/utils/calculations.ts","../src/indicators/registry/sma.ts","../src/indicators/registry/ema.ts","../src/indicators/registry/rsi.ts","../src/indicators/registry/bollinger.ts","../src/indicators/registry/vwap.ts","../src/indicators/registry/stochastic.ts","../src/indicators/registry/obv.ts","../src/indicators/registry/mfi.ts","../src/indicators/registry/forceindex.ts","../src/indicators/registry/atr.ts","../src/indicators/registry/adx.ts","../src/indicators/registry/macd.ts","../src/indicators/registry/psar.ts","../src/indicators/registry/cci.ts","../src/indicators/registry/williamsr.ts","../src/indicators/registry/keltner.ts","../src/indicators/registry/supertrend.ts","../src/indicators/registry/ichimoku.ts","../src/indicators/registry/donchian.ts","../src/indicators/registry/roc.ts","../src/indicators/registry/stochrsi.ts","../src/indicators/registry/wma.ts","../src/indicators/registry/index.ts","../src/adapters/alpaca.ts","../src/adapters/mock.ts"],"names":["timeScale","IndicatorCategory","ChartSeriesType","useState","jsx","jsxs","useEffect","X","options","useRef","useCallback","appendBar","updateCurrentBar","prependBars","error","lastBar"],"mappings":"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","file":"index.js","sourcesContent":["import {\n IndicatorDefinition,\n IndicatorInstance,\n IndicatorCategory,\n IndicatorMetadata,\n} from './types';\n\nclass IndicatorRegistry {\n private indicators: Map<string, IndicatorDefinition> = new Map();\n private instanceCounters: Map<string, number> = new Map();\n\n register(definition: IndicatorDefinition): void {\n if (this.indicators.has(definition.metadata.id)) {\n console.warn(\n `Indicator with id \"${definition.metadata.id}\" is already registered. Overwriting.`\n );\n }\n this.indicators.set(definition.metadata.id, definition);\n }\n\n unregister(id: string): boolean {\n return this.indicators.delete(id);\n }\n\n get(id: string): IndicatorDefinition | undefined {\n return this.indicators.get(id);\n }\n\n getAll(): IndicatorDefinition[] {\n return Array.from(this.indicators.values());\n }\n\n getByCategory(category: IndicatorCategory): IndicatorDefinition[] {\n return this.getAll().filter(\n (indicator) => indicator.metadata.category === category\n );\n }\n\n search(query: string): IndicatorDefinition[] {\n const lowerQuery = query.toLowerCase();\n return this.getAll().filter(\n (indicator) =>\n indicator.metadata.name.toLowerCase().includes(lowerQuery) ||\n indicator.metadata.description.toLowerCase().includes(lowerQuery)\n );\n }\n\n createInstance(definitionId: string, customSettings?: Record<string, any>): IndicatorInstance {\n const definition = this.get(definitionId);\n if (!definition) {\n throw new Error(`Indicator definition \"${definitionId}\" not found`);\n }\n\n const currentCount = this.instanceCounters.get(definitionId) || 0;\n const newCount = currentCount + 1;\n this.instanceCounters.set(definitionId, newCount);\n\n const instanceId = `${definitionId}-${newCount}`;\n\n const defaultSettings: Record<string, any> = {};\n Object.entries(definition.settings).forEach(([key, field]) => {\n defaultSettings[key] = field.defaultValue;\n });\n\n const settings = { ...defaultSettings, ...customSettings };\n\n return {\n id: instanceId,\n definitionId,\n name: `${definition.metadata.name}(${newCount})`,\n settings,\n };\n }\n\n validateSettings(definitionId: string, settings: Record<string, any>): boolean {\n const definition = this.get(definitionId);\n if (!definition) {\n return false;\n }\n\n for (const [key, field] of Object.entries(definition.settings)) {\n const value = settings[key];\n\n if (value === undefined) {\n return false;\n }\n\n if (field.type === 'number') {\n if (typeof value !== 'number') return false;\n if (field.min !== undefined && value < field.min) return false;\n if (field.max !== undefined && value > field.max) return false;\n } else if (field.type === 'boolean') {\n if (typeof value !== 'boolean') return false;\n } else if (field.type === 'color' || field.type === 'lineStyle') {\n if (typeof value !== 'string') return false;\n } else if (field.type === 'select') {\n if (typeof value !== 'string') return false;\n if (field.options && !field.options.some(opt => opt.value === value)) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n getMetadataList(): IndicatorMetadata[] {\n return this.getAll().map((indicator) => indicator.metadata);\n }\n\n clear(): void {\n this.indicators.clear();\n this.instanceCounters.clear();\n }\n}\n\nexport const indicatorRegistry = new IndicatorRegistry();\n","import { OHLCVBar } from '../../types/chart';\nimport { IndicatorInstance, IndicatorOutput } from './types';\nimport { indicatorRegistry } from './registry';\n\ninterface CacheEntry {\n data: IndicatorOutput[];\n settingsHash: string;\n dataLength: number;\n}\n\nclass IndicatorCalculator {\n private cache: Map<string, CacheEntry> = new Map();\n\n private hashSettings(settings: Record<string, any>): string {\n return JSON.stringify(settings);\n }\n\n calculate(\n instance: IndicatorInstance,\n bars: OHLCVBar[]\n ): IndicatorOutput[] {\n const definition = indicatorRegistry.get(instance.definitionId);\n if (!definition) {\n console.error(\n `Indicator definition \"${instance.definitionId}\" not found`\n );\n return [];\n }\n\n const settingsHash = this.hashSettings(instance.settings);\n const cacheKey = instance.id;\n const cached = this.cache.get(cacheKey);\n\n if (\n cached &&\n cached.settingsHash === settingsHash &&\n cached.dataLength === bars.length\n ) {\n return cached.data;\n }\n\n try {\n const data = definition.calculate(bars, instance.settings);\n\n this.cache.set(cacheKey, {\n data,\n settingsHash,\n dataLength: bars.length,\n });\n\n return data;\n } catch (error) {\n console.error(\n `Error calculating indicator \"${instance.definitionId}\":`,\n error\n );\n return [];\n }\n }\n\n invalidateCache(instanceId?: string): void {\n if (instanceId) {\n this.cache.delete(instanceId);\n } else {\n this.cache.clear();\n }\n }\n\n getCacheSize(): number {\n return this.cache.size;\n }\n}\n\nexport const indicatorCalculator = new IndicatorCalculator();\n","import {\n ISeriesApi,\n ISeriesPrimitive,\n SeriesAttachedParameter,\n Time,\n IChartApi,\n} from 'lightweight-charts';\n\nexport interface BandsPrimitiveOptions {\n upperSeries: ISeriesApi<'Line'>;\n lowerSeries: ISeriesApi<'Line'>;\n fillColor: string;\n}\n\ninterface BandPoint {\n x: number;\n y1: number;\n y2: number;\n}\n\ninterface BandData {\n points: BandPoint[];\n color: string;\n}\n\nclass AreaBetweenLinesPaneView {\n private _source: BandsPrimitive;\n private _data: BandData | null = null;\n\n constructor(source: BandsPrimitive) {\n this._source = source;\n }\n\n update() {\n const series1 = this._source._upperSeries;\n const series2 = this._source._lowerSeries;\n const chart = this._source._chart;\n\n if (!series1 || !series2 || !chart) return;\n\n const timeScale = chart.timeScale();\n\n const data1 = series1.data() as any[];\n const data2 = series2.data() as any[];\n\n const points: BandPoint[] = [];\n\n let i = 0;\n let j = 0;\n\n while (i < data1.length && j < data2.length) {\n const d1 = data1[i];\n const d2 = data2[j];\n\n if (d1.time < d2.time) {\n i++;\n } else if (d1.time > d2.time) {\n j++;\n } else {\n const x = timeScale.timeToCoordinate(d1.time);\n const y1 = series1.priceToCoordinate(d1.value);\n const y2 = series2.priceToCoordinate(d2.value);\n\n if (x !== null && y1 !== null && y2 !== null) {\n points.push({ x, y1, y2 });\n }\n i++;\n j++;\n }\n }\n\n this._data = {\n points,\n color: this._source._options.fillColor || 'rgba(59, 130, 246, 0.1)',\n };\n }\n\n renderer() {\n return new AreaBetweenLinesRenderer(this._data);\n }\n}\n\nclass AreaBetweenLinesRenderer {\n private _data: BandData | null;\n\n constructor(data: BandData | null) {\n this._data = data;\n }\n\n draw(target: any) {\n target.useBitmapCoordinateSpace((scope: any) => {\n if (!this._data || this._data.points.length === 0) return;\n\n const ctx = scope.context;\n ctx.save();\n ctx.scale(scope.horizontalPixelRatio, scope.verticalPixelRatio);\n\n const points = this._data.points;\n\n ctx.beginPath();\n\n ctx.moveTo(points[0].x, points[0].y1);\n\n for (let i = 1; i < points.length; i++) {\n ctx.lineTo(points[i].x, points[i].y1);\n }\n\n for (let i = points.length - 1; i >= 0; i--) {\n ctx.lineTo(points[i].x, points[i].y2);\n }\n\n ctx.closePath();\n\n ctx.fillStyle = this._data.color;\n ctx.fill();\n\n ctx.restore();\n });\n }\n\n drawBackground(target: any) {\n this.draw(target);\n }\n}\n\nexport class BandsPrimitive implements ISeriesPrimitive<Time> {\n _options: BandsPrimitiveOptions;\n _upperSeries: ISeriesApi<'Line'>;\n _lowerSeries: ISeriesApi<'Line'>;\n _chart: IChartApi | null = null;\n _series: ISeriesApi<'Line'> | null = null;\n private _paneViews: AreaBetweenLinesPaneView[];\n\n constructor(options: BandsPrimitiveOptions) {\n this._options = options;\n this._upperSeries = options.upperSeries;\n this._lowerSeries = options.lowerSeries;\n this._paneViews = [new AreaBetweenLinesPaneView(this)];\n }\n\n attached(param: SeriesAttachedParameter<Time>): void {\n this._chart = param.chart;\n this._series = param.series as ISeriesApi<'Line'>;\n }\n\n detached(): void {\n this._chart = null;\n this._series = null;\n }\n\n paneViews() {\n return this._paneViews;\n }\n\n updateAllViews(): void {\n this._paneViews.forEach((pw) => pw.update());\n }\n}\n","import type { SeriesMarker, Time } from 'lightweight-charts';\nimport type { ChartTrade } from '../types/chart';\n\nconst WIN = '#10b981';\nconst LOSS = '#ef4444';\nconst SEL = '#3b82f6'; // selected emphasis\n\n/** Pure: build the entry+exit markers for all trades, sorted ascending by time\n * (lightweight-charts requires sorted markers). The selected trade's markers are\n * emphasized (selection color + a text label). */\nexport function buildTradeMarkers(trades: ChartTrade[], selectedTradeId: string | null): SeriesMarker<Time>[] {\n const markers: SeriesMarker<Time>[] = [];\n for (const t of trades) {\n const selected = t.id === selectedTradeId;\n const base = t.outcome === 'win' ? WIN : LOSS;\n const color = selected ? SEL : base;\n markers.push({\n time: (t.entryTime / 1000) as Time,\n position: 'belowBar', shape: 'arrowUp', color,\n text: selected ? `${t.outcome === 'win' ? '+' : ''}entry` : '',\n });\n markers.push({\n time: (t.exitTime / 1000) as Time,\n position: 'aboveBar', shape: 'arrowDown', color,\n text: selected ? 'exit' : '',\n });\n }\n markers.sort((a, b) => (a.time as number) - (b.time as number));\n return markers;\n}\n","import { useEffect, useRef, useState, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport {\n createChart,\n createSeriesMarkers,\n IChartApi,\n ISeriesApi,\n CandlestickData,\n Time,\n LineData,\n HistogramData,\n IPriceLine,\n LineStyle,\n LineWidth,\n ColorType,\n CandlestickSeries,\n HistogramSeries,\n LineSeries,\n AreaSeries,\n SeriesMarker,\n} from 'lightweight-charts';\nimport { OHLCVBar, ChartLine, ChartTrade } from '../types/chart';\nimport { IndicatorInstance } from '../indicators/core/types';\nimport { indicatorRegistry } from '../indicators/core/registry';\nimport { indicatorCalculator } from '../indicators/core/calculator';\nimport { BandsPrimitive } from '../indicators/primitives/BandsPrimitive';\nimport { buildTradeMarkers } from './trade-markers';\n\ninterface ChartComponentProps {\n bars: OHLCVBar[];\n onLoadMoreData?: (oldestTimestamp: number) => void;\n indicators?: IndicatorInstance[];\n lines?: ChartLine[];\n onBarUpdate?: (updatedBar: OHLCVBar) => void;\n onNewBar?: (newBar: OHLCVBar) => void;\n onDeleteLine?: (lineId: string) => void;\n onAddLine?: (type: 'entry' | 'stopLoss' | 'takeProfit' | 'support' | 'resistance', price: number) => void;\n onClearAllLines?: () => void;\n enableBarSelection?: boolean;\n onBarClick?: (bar: OHLCVBar | null) => void;\n trades?: ChartTrade[];\n selectedTradeId?: string | null;\n renderTradePopup?: (trade: ChartTrade) => ReactNode;\n /**\n * Fixed chart height in px. When omitted, the chart fills its container's\n * height (observed via ResizeObserver) instead of a fixed default — so a\n * flex/percent-sized parent gets a full-height chart.\n */\n height?: number;\n /**\n * When set, recenter the time scale on this trade (by id) so it scrolls into\n * view. Pairs with `selectedTradeId` to drive both selection and focus.\n */\n focusTradeId?: string | null;\n}\n\nexport default function ChartComponent({\n bars,\n onLoadMoreData,\n indicators = [],\n lines = [],\n onBarUpdate,\n onNewBar,\n onDeleteLine,\n onAddLine,\n onClearAllLines,\n enableBarSelection = true,\n onBarClick,\n trades = [],\n selectedTradeId = null,\n renderTradePopup,\n height,\n focusTradeId = null,\n}: ChartComponentProps) {\n const chartContainerRef = useRef<HTMLDivElement>(null);\n const chartRef = useRef<IChartApi | null>(null);\n const candlestickSeriesRef = useRef<ISeriesApi<'Candlestick'> | null>(null);\n const volumeSeriesRef = useRef<ISeriesApi<'Histogram'> | null>(null);\n const indicatorSeriesRef = useRef<Map<string, ISeriesApi<any>>>(new Map());\n const indicatorPaneIndexRef = useRef<Map<string, number>>(new Map());\n const nextPaneIndexRef = useRef<number>(2);\n const priceLineRefs = useRef<Map<string, IPriceLine>>(new Map());\n const seriesMarkersRef = useRef<any>(null);\n const [isLoadingMore, setIsLoadingMore] = useState(false);\n const [contextMenu, setContextMenu] = useState<{ x: number; y: number; price: number } | null>(null);\n const [linePositions, setLinePositions] = useState<Map<string, { top: number; right: number }>>(new Map());\n const [selectedBar, setSelectedBar] = useState<OHLCVBar | null>(null);\n const selectedBarRef = useRef<OHLCVBar | null>(null);\n const [spotlightPosition, setSpotlightPosition] = useState<{ x: number; width: number } | null>(null);\n const [tradePopupPos, setTradePopupPos] = useState<{ x: number } | null>(null);\n const previousBarsRef = useRef<OHLCVBar[]>([]);\n const previousBarsLengthRef = useRef<number>(0);\n const isLoadingRef = useRef(false);\n const barsRef = useRef<OHLCVBar[]>(bars);\n const isDraggingRef = useRef(false);\n const mouseDownPosRef = useRef<{ x: number; y: number } | null>(null);\n // Latest explicit height (px) or undefined for auto-fill; read inside the\n // create-once effect's resize closure without going stale.\n const heightRef = useRef<number | undefined>(height);\n heightRef.current = height;\n\n\n useEffect(() => {\n if (!chartContainerRef.current) return;\n\n chartContainerRef.current.style.position = 'relative';\n\n const chart = createChart(chartContainerRef.current, {\n layout: {\n background: { type: ColorType.Solid, color: '#0f172a' },\n textColor: '#94a3b8',\n panes: {\n enableResize: true,\n separatorColor: '#1e293b',\n separatorHoverColor: 'rgba(148,163,184,0.5)',\n },\n },\n grid: {\n vertLines: { color: '#1e293b' },\n horzLines: { color: '#1e293b' },\n },\n width: chartContainerRef.current.clientWidth,\n // Auto-fill the container's height unless an explicit `height` is given.\n // Fall back to 600 only when the container hasn't been laid out yet (a\n // ResizeObserver below corrects it on first measure).\n height: height ?? (chartContainerRef.current.clientHeight || 600),\n timeScale: {\n timeVisible: true,\n secondsVisible: true,\n borderColor: '#334155',\n },\n rightPriceScale: {\n borderColor: '#334155',\n },\n crosshair: {\n mode: 0,\n vertLine: {\n width: 1,\n color: '#475569',\n style: 3,\n },\n horzLine: {\n width: 1,\n color: '#475569',\n style: 3,\n },\n },\n });\n\n const candlestickSeries = chart.addSeries(CandlestickSeries, {\n upColor: '#10b981',\n downColor: '#ef4444',\n borderVisible: false,\n wickUpColor: '#10b981',\n wickDownColor: '#ef4444',\n }, 0);\n\n const volumeSeries = chart.addSeries(HistogramSeries, {\n color: '#64748b',\n priceFormat: {\n type: 'volume',\n },\n priceScaleId: '',\n }, 1);\n\n chartRef.current = chart;\n candlestickSeriesRef.current = candlestickSeries;\n volumeSeriesRef.current = volumeSeries;\n\n seriesMarkersRef.current = createSeriesMarkers(candlestickSeries, []);\n\n chart.timeScale().subscribeVisibleLogicalRangeChange((logicalRange) => {\n if (logicalRange && logicalRange.from < 5 && !isLoadingRef.current && onLoadMoreData) {\n isLoadingRef.current = true;\n setIsLoadingMore(true);\n previousBarsLengthRef.current = barsRef.current.length;\n const sortedBars = [...barsRef.current].sort((a, b) => a.timestamp - b.timestamp);\n const oldestTimestamp = sortedBars[0]?.timestamp;\n if (oldestTimestamp) {\n onLoadMoreData(oldestTimestamp);\n }\n }\n });\n\n const handleResize = () => {\n if (chartContainerRef.current && chart) {\n const nextHeight = heightRef.current ?? chartContainerRef.current.clientHeight;\n chart.applyOptions({\n width: chartContainerRef.current.clientWidth,\n // Only drive height when auto-filling and the container has a real\n // measured height; otherwise leave the current height untouched.\n ...(heightRef.current === undefined && nextHeight > 0 ? { height: nextHeight } : {}),\n ...(heightRef.current !== undefined ? { height: heightRef.current } : {}),\n });\n }\n };\n\n // A flex/percent-sized parent changes the container without firing window\n // 'resize'; observe the container directly so the chart tracks it.\n const resizeObserver = new ResizeObserver(handleResize);\n resizeObserver.observe(chartContainerRef.current);\n\n const handleContextMenu = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (!candlestickSeriesRef.current) {\n return;\n }\n\n const rect = chartContainerRef.current!.getBoundingClientRect();\n const y = e.clientY - rect.top;\n\n const price = candlestickSeriesRef.current.coordinateToPrice(y);\n\n if (price !== null) {\n setContextMenu({\n x: e.clientX - rect.left,\n y: y,\n price: price as number,\n });\n }\n };\n\n const handleMouseDown = (e: MouseEvent) => {\n mouseDownPosRef.current = { x: e.clientX, y: e.clientY };\n isDraggingRef.current = false;\n };\n\n const handleMouseMove = (e: MouseEvent) => {\n if (mouseDownPosRef.current) {\n const dx = Math.abs(e.clientX - mouseDownPosRef.current.x);\n const dy = Math.abs(e.clientY - mouseDownPosRef.current.y);\n if (dx > 5 || dy > 5) {\n isDraggingRef.current = true;\n }\n }\n };\n\n const handleMouseUp = () => {\n mouseDownPosRef.current = null;\n };\n\n const handleClick = (e: MouseEvent) => {\n setContextMenu(null);\n\n if (isDraggingRef.current) {\n isDraggingRef.current = false;\n return;\n }\n\n\n if (!enableBarSelection) {\n return;\n }\n\n if (!chartRef.current) {\n return;\n }\n\n if (!candlestickSeriesRef.current) {\n return;\n }\n\n\n const rect = chartContainerRef.current!.getBoundingClientRect();\n const x = e.clientX - rect.left;\n\n const timeScale = chartRef.current.timeScale();\n const coordinate = timeScale.coordinateToTime(x);\n\n if (!coordinate) {\n return;\n }\n\n const clickedTime = coordinate as number;\n\n const clickedBar = barsRef.current.find(bar => {\n const diff = Math.abs((bar.timestamp / 1000) - clickedTime);\n return diff < 300;\n });\n\n if (clickedBar) {\n\n if (selectedBarRef.current && selectedBarRef.current.timestamp === clickedBar.timestamp) {\n selectedBarRef.current = null;\n setSelectedBar(null);\n setSpotlightPosition(null);\n if (onBarClick) {\n onBarClick(null);\n }\n } else {\n selectedBarRef.current = clickedBar;\n setSelectedBar(clickedBar);\n const barX = timeScale.timeToCoordinate((clickedBar.timestamp / 1000) as Time);\n if (barX !== null) {\n const barWidth = Math.max(8, rect.width / barsRef.current.length);\n setSpotlightPosition({ x: barX - barWidth / 2, width: barWidth });\n }\n if (onBarClick) {\n onBarClick(clickedBar);\n }\n }\n } else {\n }\n };\n\n window.addEventListener('resize', handleResize);\n chartContainerRef.current.addEventListener('contextmenu', handleContextMenu, true);\n chartContainerRef.current.addEventListener('mousedown', handleMouseDown, true);\n chartContainerRef.current.addEventListener('mousemove', handleMouseMove, true);\n chartContainerRef.current.addEventListener('mouseup', handleMouseUp, true);\n chartContainerRef.current.addEventListener('click', handleClick, true);\n\n const container = chartContainerRef.current;\n\n return () => {\n window.removeEventListener('resize', handleResize);\n resizeObserver.disconnect();\n container.removeEventListener('contextmenu', handleContextMenu, true);\n container.removeEventListener('mousedown', handleMouseDown, true);\n container.removeEventListener('mousemove', handleMouseMove, true);\n container.removeEventListener('mouseup', handleMouseUp, true);\n container.removeEventListener('click', handleClick, true);\n chart.remove();\n };\n }, []);\n\n useEffect(() => {\n barsRef.current = bars;\n }, [bars]);\n\n // Apply an explicit `height` prop change (the create-once effect can't).\n useEffect(() => {\n if (chartRef.current && height !== undefined) {\n chartRef.current.applyOptions({ height });\n }\n }, [height]);\n\n // Recenter the time scale on `focusTradeId` so the trade scrolls into view.\n // Re-runs when the focus target or the loaded bars change (the bars covering\n // the trade may arrive after selection), then frames [entry, exit] with pad.\n // The range is applied on the next animation frame so it lands AFTER the\n // sibling bars→setData effect (which would otherwise snap the view back).\n useEffect(() => {\n if (!chartRef.current || !focusTradeId) return;\n const trade = trades.find((t) => t.id === focusTradeId);\n if (!trade) return;\n const entrySec = trade.entryTime / 1000;\n const exitSec = trade.exitTime / 1000;\n // Estimate bar spacing from loaded bars to pad the window by ~12 bars.\n const sorted = [...bars].sort((a, b) => a.timestamp - b.timestamp);\n const stepSec =\n sorted.length > 1\n ? (sorted[sorted.length - 1].timestamp - sorted[0].timestamp) /\n 1000 /\n (sorted.length - 1)\n : 300;\n const pad = Math.max(exitSec - entrySec, stepSec * 12);\n const raf = requestAnimationFrame(() => {\n try {\n chartRef.current?.timeScale().setVisibleRange({\n from: (entrySec - pad) as Time,\n to: (exitSec + pad) as Time,\n });\n } catch {\n /* range outside loaded data — bars not yet present; a later bars update re-runs this */\n }\n });\n return () => cancelAnimationFrame(raf);\n }, [focusTradeId, trades, bars]);\n\n useEffect(() => {\n if (!candlestickSeriesRef.current || !volumeSeriesRef.current) return;\n\n const sortedBars = [...bars].sort((a, b) => a.timestamp - b.timestamp);\n\n const uniqueBars = sortedBars.reduce((acc, bar) => {\n const exists = acc.find(b => b.timestamp === bar.timestamp);\n if (!exists) {\n acc.push(bar);\n }\n return acc;\n }, [] as OHLCVBar[]);\n\n\n const previousBars = previousBarsRef.current;\n const isInitialLoad = previousBars.length === 0;\n const hasNewBars = uniqueBars.length > previousBars.length;\n const lastBarChanged = uniqueBars.length > 0 && previousBars.length > 0 &&\n (uniqueBars[uniqueBars.length - 1].timestamp === previousBars[previousBars.length - 1].timestamp);\n\n\n if (isLoadingRef.current && uniqueBars.length > previousBarsLengthRef.current) {\n isLoadingRef.current = false;\n setIsLoadingMore(false);\n }\n\n if (isInitialLoad || hasNewBars) {\n const candleData: CandlestickData[] = uniqueBars.map((bar) => ({\n time: (bar.timestamp / 1000) as Time,\n open: bar.open,\n high: bar.high,\n low: bar.low,\n close: bar.close,\n }));\n\n const volumeData: HistogramData[] = uniqueBars.map((bar) => ({\n time: (bar.timestamp / 1000) as Time,\n value: bar.volume,\n color: bar.close >= bar.open ? '#10b98180' : '#ef444480',\n }));\n\n candlestickSeriesRef.current.setData(candleData);\n volumeSeriesRef.current.setData(volumeData);\n } else if (lastBarChanged && uniqueBars.length > 0 && !hasNewBars) {\n const lastBar = uniqueBars[uniqueBars.length - 1];\n const candleUpdate: CandlestickData = {\n time: (lastBar.timestamp / 1000) as Time,\n open: lastBar.open,\n high: lastBar.high,\n low: lastBar.low,\n close: lastBar.close,\n };\n\n const volumeUpdate: HistogramData = {\n time: (lastBar.timestamp / 1000) as Time,\n value: lastBar.volume,\n color: lastBar.close >= lastBar.open ? '#10b98180' : '#ef444480',\n };\n\n candlestickSeriesRef.current.update(candleUpdate);\n volumeSeriesRef.current.update(volumeUpdate);\n }\n\n previousBarsRef.current = uniqueBars;\n }, [bars]);\n\n useEffect(() => {\n if (!chartRef.current || !candlestickSeriesRef.current) return;\n\n priceLineRefs.current.forEach((priceLine) => {\n candlestickSeriesRef.current?.removePriceLine(priceLine);\n });\n priceLineRefs.current.clear();\n\n lines.forEach((line) => {\n const priceLine = candlestickSeriesRef.current?.createPriceLine({\n price: line.price,\n color: line.color,\n lineWidth: (line.lineWidth || 2) as LineWidth,\n lineStyle: getLineStyle(line.lineStyle),\n axisLabelVisible: true,\n title: line.title || '',\n });\n\n if (priceLine) {\n priceLineRefs.current.set(line.id, priceLine);\n }\n });\n\n requestAnimationFrame(() => {\n if (!candlestickSeriesRef.current || !chartContainerRef.current) return;\n const rect = chartContainerRef.current.getBoundingClientRect();\n const newPositions = new Map<string, { top: number; right: number }>();\n lines.forEach((line) => {\n const y = candlestickSeriesRef.current?.priceToCoordinate(line.price);\n if (y !== null && y !== undefined) {\n newPositions.set(line.id, {\n top: rect.top + y,\n right: window.innerWidth - rect.right + 68 + estimateLabelTitleWidth(line.title),\n });\n }\n });\n setLinePositions(newPositions);\n });\n }, [lines]);\n\n useEffect(() => {\n if (!chartRef.current || !candlestickSeriesRef.current) return;\n\n const updatePositions = () => {\n if (!candlestickSeriesRef.current || !chartContainerRef.current) return;\n const rect = chartContainerRef.current.getBoundingClientRect();\n const newPositions = new Map<string, { top: number; right: number }>();\n lines.forEach((line) => {\n const y = candlestickSeriesRef.current?.priceToCoordinate(line.price);\n if (y !== null && y !== undefined) {\n newPositions.set(line.id, {\n top: rect.top + y,\n right: window.innerWidth - rect.right + 68 + estimateLabelTitleWidth(line.title),\n });\n }\n });\n setLinePositions(newPositions);\n };\n\n chartRef.current.timeScale().subscribeVisibleLogicalRangeChange(updatePositions);\n window.addEventListener('scroll', updatePositions, { passive: true });\n window.addEventListener('resize', updatePositions);\n\n return () => {\n chartRef.current?.timeScale().unsubscribeVisibleLogicalRangeChange(updatePositions);\n window.removeEventListener('scroll', updatePositions);\n window.removeEventListener('resize', updatePositions);\n };\n }, [lines]);\n\n useEffect(() => {\n if (!chartRef.current) return;\n\n indicatorSeriesRef.current.forEach((series) => {\n chartRef.current?.removeSeries(series);\n });\n indicatorSeriesRef.current.clear();\n indicatorPaneIndexRef.current.clear();\n nextPaneIndexRef.current = 2;\n\n indicators.forEach((indicator) => {\n const definition = indicatorRegistry.get(indicator.definitionId);\n if (!definition) return;\n\n const data = indicatorCalculator.calculate(indicator, barsRef.current);\n if (!data || data.length === 0) return;\n\n const seriesType = definition.renderConfig.seriesType;\n const isOverlay = definition.renderConfig.overlay !== false;\n const paneIndex = isOverlay ? 0 : nextPaneIndexRef.current;\n\n if (!isOverlay) {\n indicatorPaneIndexRef.current.set(indicator.id, paneIndex);\n nextPaneIndexRef.current++;\n }\n\n if (seriesType === 'line') {\n if (definition.renderConfig.outputCount === 1) {\n const series = chartRef.current!.addSeries(LineSeries, {\n color: indicator.settings.color || '#3b82f6',\n lineWidth: indicator.settings.lineWidth || 2,\n title: indicator.name,\n }, paneIndex);\n const lineData = data.map(d => ({ time: d.time as Time, value: d.value }));\n series.setData(lineData as LineData[]);\n indicatorSeriesRef.current.set(indicator.id, series);\n } else if (definition.renderConfig.hasBandFill && definition.renderConfig.fillBands) {\n const { upper: upperField, lower: lowerField } = definition.renderConfig.fillBands;\n\n const upperSeries = chartRef.current!.addSeries(LineSeries, {\n color: indicator.settings.upperColor || '#ef4444',\n lineWidth: indicator.settings.lineWidth || 2,\n title: `${indicator.name} Upper`,\n }, paneIndex);\n const middleSeries = chartRef.current!.addSeries(LineSeries, {\n color: indicator.settings.middleColor || indicator.settings.vwapColor || '#3b82f6',\n lineWidth: indicator.settings.lineWidth || 2,\n title: `${indicator.name} Middle`,\n }, paneIndex);\n const lowerSeries = chartRef.current!.addSeries(LineSeries, {\n color: indicator.settings.lowerColor || '#10b981',\n lineWidth: indicator.settings.lineWidth || 2,\n title: `${indicator.name} Lower`,\n }, paneIndex);\n\n const upperData = data.map(d => ({ time: d.time as Time, value: d[upperField] })).filter(d => !isNaN(d.value));\n const middleData = data.map(d => ({ time: d.time as Time, value: d.value })).filter(d => !isNaN(d.value));\n const lowerData = data.map(d => ({ time: d.time as Time, value: d[lowerField] })).filter(d => !isNaN(d.value));\n\n upperSeries.setData(upperData as LineData[]);\n middleSeries.setData(middleData as LineData[]);\n lowerSeries.setData(lowerData as LineData[]);\n\n if (indicator.settings.showFill !== false) {\n const bandsPrimitive = new BandsPrimitive({\n upperSeries: upperSeries,\n lowerSeries: lowerSeries,\n fillColor: indicator.settings.fillColor || 'rgba(59, 130, 246, 0.1)',\n });\n upperSeries.attachPrimitive(bandsPrimitive);\n }\n\n indicatorSeriesRef.current.set(`${indicator.id}-upper`, upperSeries);\n indicatorSeriesRef.current.set(`${indicator.id}-middle`, middleSeries);\n indicatorSeriesRef.current.set(`${indicator.id}-lower`, lowerSeries);\n }\n } else if (seriesType === 'histogram') {\n const series = chartRef.current!.addSeries(HistogramSeries, {\n color: indicator.settings.color || '#8b5cf6',\n title: indicator.name,\n }, paneIndex);\n const histData = data.map(d => ({ time: d.time as Time, value: d.value }));\n series.setData(histData as HistogramData[]);\n indicatorSeriesRef.current.set(indicator.id, series);\n } else if (seriesType === 'area') {\n const series = chartRef.current!.addSeries(AreaSeries, {\n topColor: indicator.settings.topColor || '#3b82f680',\n bottomColor: indicator.settings.bottomColor || '#3b82f600',\n lineColor: indicator.settings.lineColor || '#3b82f6',\n lineWidth: indicator.settings.lineWidth || 2,\n title: indicator.name,\n }, paneIndex);\n const areaData = data.map(d => ({ time: d.time as Time, value: d.value }));\n series.setData(areaData as LineData[]);\n indicatorSeriesRef.current.set(indicator.id, series);\n }\n });\n }, [indicators]);\n\n useEffect(() => {\n if (!chartRef.current || indicators.length === 0) return;\n\n indicators.forEach((indicator) => {\n const definition = indicatorRegistry.get(indicator.definitionId);\n if (!definition) return;\n\n const data = indicatorCalculator.calculate(indicator, barsRef.current);\n if (!data || data.length === 0) return;\n\n if (definition.renderConfig.outputCount === 1) {\n const series = indicatorSeriesRef.current.get(indicator.id);\n if (series) {\n const lineData = data.map(d => ({ time: d.time as Time, value: d.value }));\n series.setData(lineData as any);\n }\n } else if (definition.renderConfig.hasBandFill && definition.renderConfig.fillBands) {\n const { upper: upperField, lower: lowerField } = definition.renderConfig.fillBands;\n\n const upperSeries = indicatorSeriesRef.current.get(`${indicator.id}-upper`);\n const middleSeries = indicatorSeriesRef.current.get(`${indicator.id}-middle`);\n const lowerSeries = indicatorSeriesRef.current.get(`${indicator.id}-lower`);\n\n if (upperSeries && middleSeries && lowerSeries) {\n const upperData = data.map(d => ({ time: d.time as Time, value: d[upperField] })).filter(d => !isNaN(d.value));\n const middleData = data.map(d => ({ time: d.time as Time, value: d.value })).filter(d => !isNaN(d.value));\n const lowerData = data.map(d => ({ time: d.time as Time, value: d[lowerField] })).filter(d => !isNaN(d.value));\n\n upperSeries.setData(upperData as any);\n middleSeries.setData(middleData as any);\n lowerSeries.setData(lowerData as any);\n }\n }\n });\n }, [bars, indicators]);\n\n useEffect(() => {\n if (!seriesMarkersRef.current) return;\n const tradeMarkers = buildTradeMarkers(trades, selectedTradeId);\n const selectionMarker: SeriesMarker<Time>[] =\n enableBarSelection && selectedBar\n ? [\n {\n time: (selectedBar.timestamp / 1000) as Time,\n position: 'aboveBar' as const,\n color: '#3b82f6',\n shape: 'circle' as const,\n text: '',\n },\n ]\n : [];\n const all = [...tradeMarkers, ...selectionMarker].sort(\n (a, b) => (a.time as number) - (b.time as number),\n );\n seriesMarkersRef.current.setMarkers(all);\n }, [trades, selectedTradeId, selectedBar, enableBarSelection]);\n\n useEffect(() => {\n if (!chartRef.current || !selectedBar || !enableBarSelection) {\n setSpotlightPosition(null);\n return;\n }\n\n const updateSpotlightPosition = () => {\n if (!chartRef.current || !selectedBar || !chartContainerRef.current) return;\n\n const timeScale = chartRef.current.timeScale();\n const barX = timeScale.timeToCoordinate((selectedBar.timestamp / 1000) as Time);\n\n if (barX !== null) {\n const rect = chartContainerRef.current.getBoundingClientRect();\n const barWidth = Math.max(8, rect.width / bars.length);\n setSpotlightPosition({ x: barX - barWidth / 2, width: barWidth });\n }\n };\n\n updateSpotlightPosition();\n\n const timeScale = chartRef.current.timeScale();\n timeScale.subscribeVisibleLogicalRangeChange(updateSpotlightPosition);\n\n return () => {\n if (chartRef.current) {\n chartRef.current.timeScale().unsubscribeVisibleLogicalRangeChange(updateSpotlightPosition);\n }\n };\n }, [selectedBar, enableBarSelection, bars.length]);\n\n const selectedTrade = trades.find((t) => t.id === selectedTradeId) ?? null;\n\n useEffect(() => {\n if (!chartRef.current || !selectedTrade) {\n setTradePopupPos(null);\n return;\n }\n\n const updateTradePopupPos = () => {\n if (!chartRef.current || !selectedTrade || !chartContainerRef.current) return;\n const timeScale = chartRef.current.timeScale();\n const x = timeScale.timeToCoordinate((selectedTrade.entryTime / 1000) as Time);\n // Hide when the bar is off-screen: timeToCoordinate returns null once it leaves the\n // logical range, but a bar just past the edge returns an out-of-bounds coordinate —\n // bound to [0, width] so the popup never peeks regardless of container overflow.\n const width = chartContainerRef.current.getBoundingClientRect().width;\n setTradePopupPos(x !== null && x >= 0 && x <= width ? { x } : null);\n };\n\n updateTradePopupPos();\n const timeScale = chartRef.current.timeScale();\n timeScale.subscribeVisibleLogicalRangeChange(updateTradePopupPos);\n return () => {\n if (chartRef.current) {\n chartRef.current.timeScale().unsubscribeVisibleLogicalRangeChange(updateTradePopupPos);\n }\n };\n }, [selectedTrade, selectedTrade?.entryTime]);\n\n const handleDeleteLine = (lineId: string) => {\n if (onDeleteLine) {\n onDeleteLine(lineId);\n }\n };\n\n const handleAddLineFromContext = (type: 'entry' | 'stopLoss' | 'takeProfit' | 'support' | 'resistance') => {\n if (onAddLine && contextMenu) {\n onAddLine(type, contextMenu.price);\n setContextMenu(null);\n }\n };\n\n const handleClearAllLines = () => {\n if (onClearAllLines) {\n onClearAllLines();\n setContextMenu(null);\n }\n };\n\n return (\n <div className=\"relative space-y-4\">\n {isLoadingMore && (\n <div className=\"absolute top-4 left-1/2 transform -translate-x-1/2 bg-slate-800 text-slate-200 px-4 py-2 rounded-lg shadow-lg z-10\">\n Loading more data...\n </div>\n )}\n <div className=\"relative\">\n <div ref={chartContainerRef} className=\"w-full\" />\n\n {enableBarSelection && spotlightPosition && (\n <div\n className=\"absolute top-0 bottom-0 pointer-events-none z-5\"\n style={{\n left: `${spotlightPosition.x}px`,\n width: `${spotlightPosition.width}px`,\n background: 'rgba(59, 130, 246, 0.15)',\n borderLeft: '1px solid rgba(59, 130, 246, 0.4)',\n borderRight: '1px solid rgba(59, 130, 246, 0.4)',\n }}\n />\n )}\n\n {selectedTrade && tradePopupPos && renderTradePopup && (\n <div\n className=\"absolute z-20 pointer-events-auto\"\n style={{ left: `${tradePopupPos.x}px`, top: 8, transform: 'translateX(-50%)' }}\n >\n {renderTradePopup(selectedTrade)}\n </div>\n )}\n </div>\n\n {chartContainerRef.current && lines.map((line) => {\n const pos = linePositions.get(line.id);\n if (!pos) return null;\n\n return createPortal(\n <button\n key={line.id}\n onClick={() => handleDeleteLine(line.id)}\n className=\"bg-red-500/70 hover:bg-red-500 text-white rounded-full w-4 h-4 flex items-center justify-center text-xs font-bold transition-colors shadow-md\"\n style={{\n position: 'fixed',\n top: `${pos.top - 8}px`,\n right: `${pos.right}px`,\n zIndex: 9999,\n }}\n title=\"Delete line\"\n >\n ×\n </button>,\n document.body\n );\n })}\n\n {contextMenu && (\n <div\n className=\"absolute bg-slate-800 border border-slate-600 rounded-lg shadow-xl z-30 py-1 min-w-[180px]\"\n style={{\n left: `${contextMenu.x}px`,\n top: `${contextMenu.y}px`,\n }}\n >\n <div className=\"px-3 py-1 text-xs text-slate-400 border-b border-slate-600\">\n Price: {contextMenu.price.toFixed(3)}\n </div>\n <button\n onClick={() => handleAddLineFromContext('entry')}\n className=\"w-full px-3 py-2 text-left text-sm text-slate-200 hover:bg-slate-700 transition-colors\"\n >\n Add Entry Line\n </button>\n <button\n onClick={() => handleAddLineFromContext('stopLoss')}\n className=\"w-full px-3 py-2 text-left text-sm text-slate-200 hover:bg-slate-700 transition-colors\"\n >\n Add Stop Loss\n </button>\n <button\n onClick={() => handleAddLineFromContext('takeProfit')}\n className=\"w-full px-3 py-2 text-left text-sm text-slate-200 hover:bg-slate-700 transition-colors\"\n >\n Add Take Profit\n </button>\n <div className=\"border-t border-slate-600 my-1\"></div>\n <button\n onClick={() => handleAddLineFromContext('support')}\n className=\"w-full px-3 py-2 text-left text-sm text-slate-200 hover:bg-slate-700 transition-colors\"\n >\n Add Support Line\n </button>\n <button\n onClick={() => handleAddLineFromContext('resistance')}\n className=\"w-full px-3 py-2 text-left text-sm text-slate-200 hover:bg-slate-700 transition-colors\"\n >\n Add Resistance Line\n </button>\n <div className=\"border-t border-slate-600 my-1\"></div>\n <button\n onClick={handleClearAllLines}\n className=\"w-full px-3 py-2 text-left text-sm text-red-400 hover:bg-slate-700 transition-colors\"\n >\n Clear All Lines\n </button>\n </div>\n )}\n </div>\n );\n}\n\n// A price line with a `title` renders a title box to the LEFT of its on-axis\n// price value, overhanging into the plot. The floating delete button is placed\n// just left of the value box, so without this allowance it lands on top of the\n// title text. Reserve an approximate title-box width (canvas labels can't be\n// measured) so the button clears the label.\nfunction estimateLabelTitleWidth(title?: string): number {\n if (!title) return 0;\n return title.length * 7 + 18;\n}\n\nfunction getLineStyle(style?: 'solid' | 'dashed' | 'dotted'): LineStyle {\n switch (style) {\n case 'dashed':\n return LineStyle.Dashed;\n case 'dotted':\n return LineStyle.Dotted;\n default:\n return LineStyle.Solid;\n }\n}\n","import { z } from 'zod';\nimport { OHLCVBar } from '../../types/chart';\n\nexport enum IndicatorCategory {\n TREND = 'Trend',\n MOMENTUM = 'Momentum',\n VOLATILITY = 'Volatility',\n VOLUME = 'Volume',\n OSCILLATORS = 'Oscillators',\n}\n\nexport enum ChartSeriesType {\n LINE = 'line',\n HISTOGRAM = 'histogram',\n AREA = 'area',\n}\n\nexport const SettingFieldTypeSchema = z.enum([\n 'number',\n 'color',\n 'boolean',\n 'select',\n 'lineStyle',\n]);\n\nexport const LineStyleSchema = z.enum(['solid', 'dashed', 'dotted']);\n\nexport const SettingFieldSchema = z.object({\n type: SettingFieldTypeSchema,\n label: z.string(),\n defaultValue: z.union([z.string(), z.number(), z.boolean()]),\n description: z.string().optional(),\n min: z.number().optional(),\n max: z.number().optional(),\n step: z.number().optional(),\n options: z.array(z.object({ label: z.string(), value: z.string() })).optional(),\n});\n\nexport const IndicatorSettingsSchema = z.record(z.string(), SettingFieldSchema);\n\nexport const IndicatorMetadataSchema = z.object({\n id: z.string(),\n name: z.string(),\n description: z.string(),\n category: z.nativeEnum(IndicatorCategory),\n version: z.string().default('1.0.0'),\n});\n\nexport const RenderConfigSchema = z.object({\n seriesType: z.nativeEnum(ChartSeriesType),\n outputCount: z.number().default(1),\n overlay: z.boolean().default(true),\n hasBandFill: z.boolean().optional(),\n fillBands: z.object({\n upper: z.string(),\n lower: z.string(),\n }).optional(),\n});\n\nexport type SettingFieldType = z.infer<typeof SettingFieldTypeSchema>;\nexport type LineStyle = z.infer<typeof LineStyleSchema>;\nexport type SettingField = z.infer<typeof SettingFieldSchema>;\nexport type IndicatorSettings = z.infer<typeof IndicatorSettingsSchema>;\nexport type IndicatorMetadata = z.infer<typeof IndicatorMetadataSchema>;\nexport type RenderConfig = z.infer<typeof RenderConfigSchema>;\n\nexport interface IndicatorOutput {\n time: number;\n value: number;\n [key: string]: number;\n}\n\nexport type IndicatorCalculation = (\n bars: OHLCVBar[],\n settings: Record<string, any>\n) => IndicatorOutput[];\n\nexport interface IndicatorDefinition {\n metadata: IndicatorMetadata;\n settings: IndicatorSettings;\n renderConfig: RenderConfig;\n calculate: IndicatorCalculation;\n}\n\nexport interface IndicatorInstance {\n id: string;\n definitionId: string;\n name: string;\n settings: Record<string, any>;\n data?: IndicatorOutput[];\n}\n\nexport const IndicatorInstanceSchema = z.object({\n id: z.string(),\n definitionId: z.string(),\n name: z.string(),\n settings: z.record(z.string(), z.any()),\n});\n","import { useState, useMemo } from 'react';\nimport { Search, X, Plus } from 'lucide-react';\nimport { indicatorRegistry } from '../indicators/core/registry';\nimport { IndicatorCategory, IndicatorDefinition } from '../indicators/core/types';\n\ninterface IndicatorBrowserProps {\n isOpen: boolean;\n onClose: () => void;\n onAddIndicator: (definitionId: string) => void;\n}\n\nexport default function IndicatorBrowser({\n isOpen,\n onClose,\n onAddIndicator,\n}: IndicatorBrowserProps) {\n const [searchQuery, setSearchQuery] = useState('');\n const [selectedCategory, setSelectedCategory] = useState<IndicatorCategory | 'All'>('All');\n\n const categories = useMemo(() => {\n return ['All', ...Object.values(IndicatorCategory)];\n }, []);\n\n const filteredIndicators = useMemo(() => {\n let indicators = indicatorRegistry.getAll();\n\n if (selectedCategory !== 'All') {\n indicators = indicators.filter(\n (ind) => ind.metadata.category === selectedCategory\n );\n }\n\n if (searchQuery.trim()) {\n indicators = indicatorRegistry.search(searchQuery);\n if (selectedCategory !== 'All') {\n indicators = indicators.filter(\n (ind) => ind.metadata.category === selectedCategory\n );\n }\n }\n\n return indicators;\n }, [searchQuery, selectedCategory]);\n\n if (!isOpen) return null;\n\n const handleAddIndicator = (definitionId: string) => {\n onAddIndicator(definitionId);\n onClose();\n };\n\n return (\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50\">\n <div className=\"bg-slate-800 rounded-lg shadow-xl w-full max-w-3xl max-h-[80vh] flex flex-col\">\n <div className=\"flex items-center justify-between p-4 border-b border-slate-700\">\n <h2 className=\"text-lg font-semibold text-slate-100\">Add Indicator</h2>\n <button\n onClick={onClose}\n className=\"text-slate-400 hover:text-slate-200 transition\"\n >\n <X size={20} />\n </button>\n </div>\n\n <div className=\"p-4 border-b border-slate-700\">\n <div className=\"relative\">\n <Search\n className=\"absolute left-3 top-1/2 -translate-y-1/2 text-slate-400\"\n size={20}\n />\n <input\n type=\"text\"\n placeholder=\"Search indicators...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"w-full pl-10 pr-4 py-2 bg-slate-700 border border-slate-600 rounded-lg text-slate-100 placeholder-slate-400 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n />\n </div>\n\n <div className=\"flex gap-2 mt-3 overflow-x-auto pb-2\">\n {categories.map((category) => (\n <button\n key={category}\n onClick={() => setSelectedCategory(category as IndicatorCategory | 'All')}\n className={`px-3 py-1.5 rounded-lg text-sm font-medium whitespace-nowrap transition ${\n selectedCategory === category\n ? 'bg-blue-600 text-white'\n : 'bg-slate-700 text-slate-300 hover:bg-slate-600'\n }`}\n >\n {category}\n </button>\n ))}\n </div>\n </div>\n\n <div className=\"flex-1 overflow-y-auto p-4\">\n {filteredIndicators.length === 0 ? (\n <div className=\"text-center py-12 text-slate-400\">\n <p>No indicators found</p>\n {searchQuery && (\n <p className=\"text-sm mt-2\">\n Try adjusting your search or category filter\n </p>\n )}\n </div>\n ) : (\n <div className=\"grid gap-3\">\n {filteredIndicators.map((indicator) => (\n <IndicatorCard\n key={indicator.metadata.id}\n indicator={indicator}\n onAdd={() => handleAddIndicator(indicator.metadata.id)}\n />\n ))}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n\ninterface IndicatorCardProps {\n indicator: IndicatorDefinition;\n onAdd: () => void;\n}\n\nfunction IndicatorCard({ indicator, onAdd }: IndicatorCardProps) {\n const getCategoryColor = (category: IndicatorCategory) => {\n switch (category) {\n case IndicatorCategory.TREND:\n return 'bg-blue-500/20 text-blue-400';\n case IndicatorCategory.MOMENTUM:\n return 'bg-purple-500/20 text-purple-400';\n case IndicatorCategory.VOLATILITY:\n return 'bg-orange-500/20 text-orange-400';\n case IndicatorCategory.VOLUME:\n return 'bg-green-500/20 text-green-400';\n case IndicatorCategory.OSCILLATORS:\n return 'bg-pink-500/20 text-pink-400';\n default:\n return 'bg-slate-500/20 text-slate-400';\n }\n };\n\n return (\n <div className=\"bg-slate-700/50 rounded-lg p-4 hover:bg-slate-700 transition group\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex-1\">\n <div className=\"flex items-center gap-2 mb-2\">\n <h3 className=\"text-slate-100 font-medium\">{indicator.metadata.name}</h3>\n <span\n className={`px-2 py-0.5 rounded text-xs font-medium ${getCategoryColor(\n indicator.metadata.category\n )}`}\n >\n {indicator.metadata.category}\n </span>\n </div>\n <p className=\"text-sm text-slate-400\">{indicator.metadata.description}</p>\n </div>\n <button\n onClick={onAdd}\n className=\"flex items-center gap-1.5 px-3 py-1.5 bg-blue-600 hover:bg-blue-700 text-white rounded-lg transition text-sm font-medium opacity-0 group-hover:opacity-100\"\n >\n <Plus size={16} />\n Add\n </button>\n </div>\n </div>\n );\n}\n","import { useState } from 'react';\nimport { IndicatorSettings, SettingField } from '../indicators/core/types';\n\ninterface IndicatorSettingsFormProps {\n settings: IndicatorSettings;\n currentValues: Record<string, any>;\n onChange: (key: string, value: any) => void;\n}\n\nexport default function IndicatorSettingsForm({\n settings,\n currentValues,\n onChange,\n}: IndicatorSettingsFormProps) {\n return (\n <div className=\"space-y-4\">\n {Object.entries(settings).map(([key, field]) => (\n <div key={key}>\n <label className=\"block text-sm font-medium text-slate-300 mb-1\">\n {field.label}\n </label>\n {field.description && (\n <p className=\"text-xs text-slate-400 mb-2\">{field.description}</p>\n )}\n {renderField(key, field, currentValues[key], onChange)}\n </div>\n ))}\n </div>\n );\n}\n\nfunction parseColor(colorValue: string): { hex: string; opacity: number } {\n const rgbaMatch = colorValue.match(/^rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*([\\d.]+))?\\)$/);\n\n if (rgbaMatch) {\n const r = parseInt(rgbaMatch[1]);\n const g = parseInt(rgbaMatch[2]);\n const b = parseInt(rgbaMatch[3]);\n const a = rgbaMatch[4] ? parseFloat(rgbaMatch[4]) : 1;\n\n const hex = `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;\n return { hex, opacity: Math.round(a * 100) };\n }\n\n return { hex: colorValue, opacity: 100 };\n}\n\nfunction hexToRgba(hex: string, opacity: number): string {\n const r = parseInt(hex.slice(1, 3), 16);\n const g = parseInt(hex.slice(3, 5), 16);\n const b = parseInt(hex.slice(5, 7), 16);\n const a = opacity / 100;\n\n return `rgba(${r}, ${g}, ${b}, ${a})`;\n}\n\nfunction ColorPicker({ value, defaultValue, onChange }: { value: any; defaultValue: string; onChange: (value: string) => void }) {\n const colorValue = value ?? defaultValue;\n const { hex, opacity } = parseColor(colorValue);\n\n const [localHex, setLocalHex] = useState(hex);\n const [localOpacity, setLocalOpacity] = useState(opacity);\n\n const handleColorChange = (newHex: string) => {\n setLocalHex(newHex);\n onChange(hexToRgba(newHex, localOpacity));\n };\n\n const handleOpacityChange = (newOpacity: number) => {\n setLocalOpacity(newOpacity);\n onChange(hexToRgba(localHex, newOpacity));\n };\n\n const handleTextChange = (newValue: string) => {\n const parsed = parseColor(newValue);\n setLocalHex(parsed.hex);\n setLocalOpacity(parsed.opacity);\n onChange(newValue);\n };\n\n return (\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-2\">\n <input\n type=\"color\"\n value={localHex}\n onChange={(e) => handleColorChange(e.target.value)}\n className=\"w-12 h-10 rounded cursor-pointer\"\n />\n <input\n type=\"text\"\n value={colorValue}\n onChange={(e) => handleTextChange(e.target.value)}\n className=\"flex-1 px-3 py-2 bg-slate-700 border border-slate-600 rounded-lg text-slate-100 focus:outline-none focus:ring-2 focus:ring-blue-500 font-mono text-sm\"\n />\n </div>\n <div className=\"flex items-center gap-2\">\n <input\n type=\"range\"\n min=\"0\"\n max=\"100\"\n value={localOpacity}\n onChange={(e) => handleOpacityChange(parseInt(e.target.value))}\n className=\"flex-1 h-2 bg-slate-600 rounded-lg appearance-none cursor-pointer\"\n />\n <span className=\"text-sm text-slate-400 w-12 text-right\">{localOpacity}%</span>\n </div>\n </div>\n );\n}\n\nfunction renderField(\n key: string,\n field: SettingField,\n value: any,\n onChange: (key: string, value: any) => void\n) {\n switch (field.type) {\n case 'number':\n return (\n <input\n type=\"number\"\n value={value ?? field.defaultValue}\n onChange={(e) => onChange(key, parseFloat(e.target.value))}\n min={field.min}\n max={field.max}\n step={field.step}\n className=\"w-full px-3 py-2 bg-slate-700 border border-slate-600 rounded-lg text-slate-100 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n />\n );\n\n case 'color':\n return (\n <ColorPicker\n value={value}\n defaultValue={field.defaultValue as string}\n onChange={(newValue) => onChange(key, newValue)}\n />\n );\n\n case 'boolean':\n return (\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={value ?? field.defaultValue}\n onChange={(e) => onChange(key, e.target.checked)}\n className=\"w-4 h-4 text-blue-600 bg-slate-700 border-slate-600 rounded focus:ring-blue-500\"\n />\n <span className=\"text-sm text-slate-300\">\n {value ?? field.defaultValue ? 'Enabled' : 'Disabled'}\n </span>\n </label>\n );\n\n case 'select':\n return (\n <select\n value={value ?? field.defaultValue}\n onChange={(e) => onChange(key, e.target.value)}\n className=\"w-full px-3 py-2 bg-slate-700 border border-slate-600 rounded-lg text-slate-100 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n {field.options?.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n );\n\n case 'lineStyle':\n return (\n <select\n value={value ?? field.defaultValue}\n onChange={(e) => onChange(key, e.target.value)}\n className=\"w-full px-3 py-2 bg-slate-700 border border-slate-600 rounded-lg text-slate-100 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n <option value=\"solid\">Solid</option>\n <option value=\"dashed\">Dashed</option>\n <option value=\"dotted\">Dotted</option>\n </select>\n );\n\n default:\n return (\n <input\n type=\"text\"\n value={value ?? field.defaultValue}\n onChange={(e) => onChange(key, e.target.value)}\n className=\"w-full px-3 py-2 bg-slate-700 border border-slate-600 rounded-lg text-slate-100 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n />\n );\n }\n}\n","import { useState, useEffect } from 'react';\nimport { X } from 'lucide-react';\nimport { IndicatorInstance } from '../indicators/core/types';\nimport { indicatorRegistry } from '../indicators/core/registry';\nimport IndicatorSettingsForm from './IndicatorSettingsForm';\n\ninterface SettingsDialogProps {\n isOpen: boolean;\n onClose: () => void;\n indicator: IndicatorInstance | null;\n onSave: (indicatorId: string, settings: Record<string, any>) => void;\n}\n\nexport default function SettingsDialog({\n isOpen,\n onClose,\n indicator,\n onSave,\n}: SettingsDialogProps) {\n const [settings, setSettings] = useState<Record<string, any>>({});\n\n useEffect(() => {\n if (indicator) {\n setSettings({ ...indicator.settings });\n }\n }, [indicator]);\n\n if (!isOpen || !indicator) return null;\n\n const definition = indicatorRegistry.get(indicator.definitionId);\n if (!definition) return null;\n\n const handleSave = () => {\n onSave(indicator.id, settings);\n onClose();\n };\n\n const handleChange = (key: string, value: any) => {\n setSettings((prev) => ({\n ...prev,\n [key]: value,\n }));\n };\n\n return (\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50\">\n <div className=\"bg-slate-800 rounded-lg shadow-xl w-full max-w-md\">\n <div className=\"flex items-center justify-between p-4 border-b border-slate-700\">\n <h2 className=\"text-lg font-semibold text-slate-100\">\n {indicator.name} Settings\n </h2>\n <button\n onClick={onClose}\n className=\"text-slate-400 hover:text-slate-200 transition\"\n >\n <X size={20} />\n </button>\n </div>\n\n <div className=\"p-4\">\n <IndicatorSettingsForm\n settings={definition.settings}\n currentValues={settings}\n onChange={handleChange}\n />\n </div>\n\n <div className=\"flex items-center justify-end gap-2 p-4 border-t border-slate-700\">\n <button\n onClick={onClose}\n className=\"px-4 py-2 text-slate-300 hover:text-slate-100 transition\"\n >\n Cancel\n </button>\n <button\n onClick={handleSave}\n className=\"px-4 py-2 bg-blue-600 hover:bg-blue-700 text-white rounded-lg transition\"\n >\n Save Changes\n </button>\n </div>\n </div>\n </div>\n );\n}\n","import { useState, useCallback, useEffect } from 'react';\nimport { ChartLine } from '../types/chart';\nimport { IndicatorInstance } from '../indicators/core/types';\nimport { indicatorRegistry } from '../indicators/core/registry';\nimport { indicatorCalculator } from '../indicators/core/calculator';\nimport { PersistenceAdapter } from '../indicators/core/persistence';\n\ninterface UseChartAPIOptions {\n persistenceAdapter?: PersistenceAdapter;\n}\n\nexport function useChartAPI(options?: UseChartAPIOptions) {\n const [lines, setLines] = useState<ChartLine[]>([]);\n const [indicators, setIndicators] = useState<IndicatorInstance[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n if (options?.persistenceAdapter) {\n options.persistenceAdapter.loadIndicators().then((loaded) => {\n setIndicators(loaded);\n setIsLoading(false);\n });\n } else {\n setIsLoading(false);\n }\n }, [options?.persistenceAdapter]);\n\n useEffect(() => {\n if (!isLoading && options?.persistenceAdapter) {\n options.persistenceAdapter.saveIndicators(indicators);\n }\n }, [indicators, isLoading, options?.persistenceAdapter]);\n\n const addLine = useCallback(\n (\n id: string,\n price: number,\n options?: {\n color?: string;\n lineWidth?: number;\n lineStyle?: 'solid' | 'dashed' | 'dotted';\n title?: string;\n }\n ) => {\n const newLine: ChartLine = {\n id,\n price,\n color: options?.color || '#3b82f6',\n lineWidth: options?.lineWidth || 2,\n lineStyle: options?.lineStyle || 'solid',\n title: options?.title,\n };\n setLines((prev) => [...prev, newLine]);\n },\n []\n );\n\n const removeLine = useCallback((id: string) => {\n setLines((prev) => prev.filter((line) => line.id !== id));\n }, []);\n\n const updateLine = useCallback((id: string, price: number) => {\n setLines((prev) =>\n prev.map((line) => (line.id === id ? { ...line, price } : line))\n );\n }, []);\n\n const addEntryLine = useCallback(\n (price: number) => {\n const id = `entry-${Date.now()}`;\n addLine(id, price, {\n color: '#3b82f6',\n title: 'Entry',\n lineStyle: 'solid',\n });\n },\n [addLine]\n );\n\n const addStopLoss = useCallback(\n (price: number) => {\n const id = `stop-loss-${Date.now()}`;\n addLine(id, price, {\n color: '#ef4444',\n title: 'Stop Loss',\n lineStyle: 'dashed',\n });\n },\n [addLine]\n );\n\n const addTakeProfit = useCallback(\n (price: number) => {\n const id = `take-profit-${Date.now()}`;\n addLine(id, price, {\n color: '#10b981',\n title: 'Take Profit',\n lineStyle: 'dashed',\n });\n },\n [addLine]\n );\n\n const addSupportLine = useCallback(\n (price: number) => {\n const id = `support-${Date.now()}`;\n addLine(id, price, {\n color: '#10b981',\n title: 'Support',\n lineStyle: 'dotted',\n });\n },\n [addLine]\n );\n\n const addResistanceLine = useCallback(\n (price: number) => {\n const id = `resistance-${Date.now()}`;\n addLine(id, price, {\n color: '#f97316',\n title: 'Resistance',\n lineStyle: 'dotted',\n });\n },\n [addLine]\n );\n\n const clearAllLines = useCallback(() => {\n setLines([]);\n }, []);\n\n const addLineByType = useCallback(\n (type: 'entry' | 'stopLoss' | 'takeProfit' | 'support' | 'resistance', price: number) => {\n if (type === 'entry') {\n addEntryLine(price);\n } else if (type === 'stopLoss') {\n addStopLoss(price);\n } else if (type === 'takeProfit') {\n addTakeProfit(price);\n } else if (type === 'support') {\n addSupportLine(price);\n } else if (type === 'resistance') {\n addResistanceLine(price);\n }\n },\n [addEntryLine, addStopLoss, addTakeProfit, addSupportLine, addResistanceLine]\n );\n\n const addIndicator = useCallback((definitionId: string, customSettings?: Record<string, any>) => {\n const instance = indicatorRegistry.createInstance(definitionId, customSettings);\n setIndicators((prev) => [...prev, instance]);\n return instance;\n }, []);\n\n const removeIndicator = useCallback((id: string) => {\n setIndicators((prev) => prev.filter((indicator) => indicator.id !== id));\n indicatorCalculator.invalidateCache(id);\n }, []);\n\n const updateIndicatorSettings = useCallback(\n (id: string, settings: Record<string, any>) => {\n setIndicators((prev) =>\n prev.map((indicator) =>\n indicator.id === id ? { ...indicator, settings } : indicator\n )\n );\n indicatorCalculator.invalidateCache(id);\n },\n []\n );\n\n return {\n lines,\n indicators,\n isLoadingIndicators: isLoading,\n addLine,\n removeLine,\n updateLine,\n addEntryLine,\n addStopLoss,\n addTakeProfit,\n addSupportLine,\n addResistanceLine,\n clearAllLines,\n addLineByType,\n addIndicator,\n removeIndicator,\n updateIndicatorSettings,\n };\n}\n","import { OHLCVBar } from '../types/chart';\n\nexport function validateBar(bar: any): bar is OHLCVBar {\n if (!bar || typeof bar !== 'object') return false;\n\n const required = ['timestamp', 'open', 'high', 'low', 'close', 'volume'];\n for (const field of required) {\n if (!(field in bar)) return false;\n if (typeof bar[field] !== 'number') return false;\n }\n\n if (bar.timestamp <= 0) return false;\n if (bar.open <= 0 || bar.high <= 0 || bar.low <= 0 || bar.close <= 0) return false;\n if (bar.volume < 0) return false;\n if (bar.high < bar.low) return false;\n if (bar.high < bar.open || bar.high < bar.close) return false;\n if (bar.low > bar.open || bar.low > bar.close) return false;\n\n return true;\n}\n\nexport function isValidBar(bar: any): bar is OHLCVBar {\n return validateBar(bar);\n}\n\nexport function normalizeTimestamp(timestamp: number): number {\n if (timestamp < 10000000000) {\n return timestamp * 1000;\n }\n return timestamp;\n}\n\nexport function sortBars(bars: OHLCVBar[]): OHLCVBar[] {\n return [...bars].sort((a, b) => a.timestamp - b.timestamp);\n}\n\nexport function deduplicateBars(bars: OHLCVBar[]): OHLCVBar[] {\n const seen = new Map<number, OHLCVBar>();\n\n for (const bar of bars) {\n const existing = seen.get(bar.timestamp);\n if (!existing) {\n seen.set(bar.timestamp, bar);\n }\n }\n\n return Array.from(seen.values()).sort((a, b) => a.timestamp - b.timestamp);\n}\n\nexport function mergeBars(existingBars: OHLCVBar[], newBars: OHLCVBar[]): OHLCVBar[] {\n const allBars = [...existingBars, ...newBars];\n return deduplicateBars(allBars);\n}\n\nexport function validateAndNormalizeBars(bars: any[]): OHLCVBar[] {\n console.log(`validateAndNormalizeBars: received ${bars.length} bars`);\n const validated = bars\n .filter(bar => {\n if (!validateBar(bar)) {\n console.warn('Invalid bar data:', bar);\n return false;\n }\n return true;\n })\n .map(bar => ({\n ...bar,\n timestamp: normalizeTimestamp(bar.timestamp),\n }));\n console.log(`validateAndNormalizeBars: returning ${validated.length} valid bars`);\n return validated;\n}\n\nexport function updateBarInArray(bars: OHLCVBar[], updatedBar: OHLCVBar): OHLCVBar[] {\n const index = bars.findIndex(b => b.timestamp === updatedBar.timestamp);\n\n if (index === -1) {\n return [...bars, updatedBar].sort((a, b) => a.timestamp - b.timestamp);\n }\n\n const updated = [...bars];\n updated[index] = updatedBar;\n return updated;\n}\n\nexport function appendBar(bars: OHLCVBar[], newBar: OHLCVBar): OHLCVBar[] {\n const exists = bars.find(b => b.timestamp === newBar.timestamp);\n if (exists) {\n return bars;\n }\n\n return [...bars, newBar];\n}\n\nexport function prependBars(bars: OHLCVBar[], newBars: OHLCVBar[]): OHLCVBar[] {\n const existingTimestamps = new Set(bars.map(b => b.timestamp));\n const uniqueNewBars = newBars.filter(b => !existingTimestamps.has(b.timestamp));\n\n return [...uniqueNewBars, ...bars];\n}\n\nexport function getOldestBar(bars: OHLCVBar[]): OHLCVBar | null {\n if (bars.length === 0) return null;\n return bars[0];\n}\n\nexport function getNewestBar(bars: OHLCVBar[]): OHLCVBar | null {\n if (bars.length === 0) return null;\n return bars[bars.length - 1];\n}\n\nexport function updateCurrentBar(\n bars: OHLCVBar[],\n tradePrice: number,\n tradeVolume: number\n): OHLCVBar[] {\n if (bars.length === 0) return bars;\n\n const updated = [...bars];\n const lastBar = { ...updated[updated.length - 1] };\n\n lastBar.close = tradePrice;\n lastBar.high = Math.max(lastBar.high, tradePrice);\n lastBar.low = Math.min(lastBar.low, tradePrice);\n lastBar.volume += tradeVolume;\n\n updated[updated.length - 1] = lastBar;\n return updated;\n}\n","import { useState, useCallback, useRef, useEffect } from 'react';\nimport { OHLCVBar } from '../types/chart';\nimport {\n appendBar as appendBarUtil,\n prependBars as prependBarsUtil,\n updateBarInArray,\n deduplicateBars,\n sortBars,\n validateAndNormalizeBars,\n updateCurrentBar as updateCurrentBarUtil,\n} from '../utils/barUtils';\nimport { BarDataAdapter, HistoricalDataParams, RealtimeSubscription } from '../adapters/types';\n\nexport interface UseBarsDataOptions {\n adapter?: BarDataAdapter;\n symbol?: string;\n timeframe?: string;\n autoFetch?: boolean;\n autoSubscribe?: boolean;\n limit?: number;\n}\n\nexport interface UseBarsDataReturn {\n bars: OHLCVBar[];\n loading: boolean;\n error: Error | null;\n connected: boolean;\n\n setBars: (bars: OHLCVBar[]) => void;\n appendBar: (bar: OHLCVBar) => void;\n updateLastBar: (bar: OHLCVBar) => void;\n updateCurrentBar: (tradePrice: number, tradeVolume: number) => void;\n prependBars: (bars: OHLCVBar[]) => void;\n clearBars: () => void;\n\n fetchHistorical: (params?: Partial<HistoricalDataParams>) => Promise<void>;\n subscribe: () => void;\n unsubscribe: () => void;\n\n refetch: () => Promise<void>;\n}\n\nexport function useBarsData(options: UseBarsDataOptions = {}): UseBarsDataReturn {\n const {\n adapter,\n symbol = 'AAPL',\n timeframe = '5Min',\n autoFetch = false,\n autoSubscribe = false,\n limit = 500,\n } = options;\n\n const [bars, setBarsState] = useState<OHLCVBar[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [connected, setConnected] = useState(false);\n\n const subscriptionRef = useRef<RealtimeSubscription | null>(null);\n const isMountedRef = useRef(true);\n const hasInitialFetchRef = useRef(false);\n const isFetchingRef = useRef(false);\n\n const setBars = useCallback((newBars: OHLCVBar[]) => {\n const validated = validateAndNormalizeBars(newBars);\n const sorted = sortBars(validated);\n setBarsState(sorted);\n }, []);\n\n const appendBar = useCallback((bar: OHLCVBar) => {\n setBarsState(prev => appendBarUtil(prev, bar));\n }, []);\n\n const updateLastBar = useCallback((bar: OHLCVBar) => {\n setBarsState(prev => {\n if (prev.length === 0) return [bar];\n const updated = [...prev];\n updated[updated.length - 1] = bar;\n return updated;\n });\n }, []);\n\n const updateCurrentBar = useCallback((tradePrice: number, tradeVolume: number) => {\n setBarsState(prev => updateCurrentBarUtil(prev, tradePrice, tradeVolume));\n }, []);\n\n const prependBars = useCallback((newBars: OHLCVBar[]) => {\n const validated = validateAndNormalizeBars(newBars);\n setBarsState(prev => prependBarsUtil(prev, validated));\n }, []);\n\n const clearBars = useCallback(() => {\n setBarsState([]);\n }, []);\n\n const fetchHistorical = useCallback(\n async (params: Partial<HistoricalDataParams> = {}) => {\n if (!adapter) {\n setError(new Error('No adapter provided'));\n return;\n }\n\n if (isFetchingRef.current) {\n console.log('fetchHistorical: already fetching, skipping');\n return;\n }\n\n console.log('fetchHistorical called, params:', params);\n console.log('isMountedRef.current:', isMountedRef.current);\n isFetchingRef.current = true;\n setLoading(true);\n setError(null);\n\n try {\n const fetchParams: HistoricalDataParams = {\n symbol: params.symbol || symbol,\n timeframe: params.timeframe || timeframe,\n limit: params.limit || limit,\n before: params.before,\n after: params.after,\n };\n\n console.log('Calling adapter.fetchHistoricalBars with:', fetchParams);\n const data = await adapter.fetchHistoricalBars(fetchParams);\n console.log('adapter.fetchHistoricalBars returned, data.length:', data.length);\n\n if (isMountedRef.current) {\n console.log('Component still mounted, processing data');\n const validated = validateAndNormalizeBars(data);\n\n if (params.before) {\n console.log('Prepending bars (before param present)');\n setBarsState(prev => prependBarsUtil(prev, validated));\n } else {\n console.log('Setting initial bars (no before param)');\n const sorted = sortBars(validated);\n setBarsState(sorted);\n }\n } else {\n console.log('Component unmounted, skipping data update');\n }\n } catch (err) {\n console.log('Error caught:', err);\n if (isMountedRef.current) {\n const error = err instanceof Error ? err : new Error('Failed to fetch historical data');\n setError(error);\n console.error('Failed to fetch historical data:', error);\n }\n } finally {\n console.log('Finally block executing, isMountedRef.current:', isMountedRef.current);\n isFetchingRef.current = false;\n if (isMountedRef.current) {\n console.log('Setting loading to false');\n setLoading(false);\n } else {\n console.log('Skipping setLoading(false) - component unmounted');\n }\n }\n },\n [adapter, symbol, timeframe, limit]\n );\n\n const subscribe = useCallback(() => {\n if (!adapter?.subscribeRealtime) {\n console.warn('Adapter does not support real-time subscriptions');\n return;\n }\n\n if (subscriptionRef.current) {\n console.warn('Already subscribed');\n return;\n }\n\n subscriptionRef.current = adapter.subscribeRealtime(symbol, {\n onBar: (bar) => {\n if (isMountedRef.current) {\n appendBar(bar);\n }\n },\n onTrade: (price, volume) => {\n if (isMountedRef.current) {\n updateCurrentBar(price, volume);\n }\n },\n onError: (err) => {\n if (isMountedRef.current) {\n setError(err);\n setConnected(false);\n }\n },\n onConnect: () => {\n if (isMountedRef.current) {\n setConnected(true);\n }\n },\n onDisconnect: () => {\n if (isMountedRef.current) {\n setConnected(false);\n }\n },\n });\n }, [adapter, symbol, appendBar, updateCurrentBar]);\n\n const unsubscribe = useCallback(() => {\n if (subscriptionRef.current) {\n subscriptionRef.current.unsubscribe();\n subscriptionRef.current = null;\n setConnected(false);\n }\n }, []);\n\n const refetch = useCallback(async () => {\n await fetchHistorical();\n }, [fetchHistorical]);\n\n useEffect(() => {\n console.log('useEffect[autoFetch] running, autoFetch:', autoFetch, 'adapter:', !!adapter, 'hasInitialFetch:', hasInitialFetchRef.current);\n if (autoFetch && adapter && !hasInitialFetchRef.current) {\n console.log('Calling fetchHistorical from useEffect (initial fetch)');\n hasInitialFetchRef.current = true;\n fetchHistorical();\n }\n }, [autoFetch, adapter, fetchHistorical]);\n\n useEffect(() => {\n if (autoSubscribe && adapter?.subscribeRealtime) {\n subscribe();\n }\n\n return () => {\n unsubscribe();\n };\n }, [autoSubscribe, adapter, subscribe, unsubscribe]);\n\n useEffect(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n if (subscriptionRef.current) {\n subscriptionRef.current.unsubscribe();\n subscriptionRef.current = null;\n }\n };\n }, []);\n\n return {\n bars,\n loading,\n error,\n connected,\n setBars,\n appendBar,\n updateLastBar,\n updateCurrentBar,\n prependBars,\n clearBars,\n fetchHistorical,\n subscribe,\n unsubscribe,\n refetch,\n };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { OHLCVBar } from '../types/chart';\n\ninterface RealtimeUpdateConfig {\n enabled: boolean;\n updateIntervalMs: number;\n newBarIntervalMs: number;\n}\n\nexport function useRealtimeUpdates(\n initialBars: OHLCVBar[],\n config: RealtimeUpdateConfig\n) {\n const [bars, setBars] = useState<OHLCVBar[]>([]);\n const updateIntervalRef = useRef<number>();\n const newBarIntervalRef = useRef<number>();\n const lastBarTimeRef = useRef<number>(0);\n const initializedRef = useRef(false);\n\n const updateCurrentBar = useCallback((tradePrice: number, tradeVolume: number) => {\n setBars((prev) => {\n if (prev.length === 0) return prev;\n\n const updated = [...prev];\n const lastBar = { ...updated[updated.length - 1] };\n\n lastBar.close = tradePrice;\n lastBar.high = Math.max(lastBar.high, tradePrice);\n lastBar.low = Math.min(lastBar.low, tradePrice);\n lastBar.volume += tradeVolume;\n\n updated[updated.length - 1] = lastBar;\n return updated;\n });\n }, []);\n\n const addNewBar = useCallback((newBar: OHLCVBar) => {\n setBars((prev) => {\n const exists = prev.find(b => b.timestamp === newBar.timestamp);\n if (exists) return prev;\n return [...prev, newBar];\n });\n }, []);\n\n const prependBars = useCallback((newBars: OHLCVBar[]) => {\n setBars((prev) => {\n const existingTimestamps = new Set(prev.map(b => b.timestamp));\n const uniqueNewBars = newBars.filter(b => !existingTimestamps.has(b.timestamp));\n return [...uniqueNewBars, ...prev];\n });\n }, []);\n\n const generateRealisticPriceMove = useCallback((currentPrice: number): number => {\n const volatility = 0.0005;\n const drift = 0;\n const change = currentPrice * (drift + volatility * (Math.random() * 2 - 1));\n return currentPrice + change;\n }, []);\n\n useEffect(() => {\n if (!initializedRef.current && initialBars.length > 0) {\n setBars(initialBars);\n initializedRef.current = true;\n }\n }, [initialBars]);\n\n useEffect(() => {\n if (!config.enabled || bars.length === 0) return;\n\n const lastBar = bars[bars.length - 1];\n lastBarTimeRef.current = lastBar.timestamp;\n\n updateIntervalRef.current = window.setInterval(() => {\n setBars((prev) => {\n if (prev.length === 0) return prev;\n\n const updated = [...prev];\n const currentBar = { ...updated[updated.length - 1] };\n\n const newPrice = currentBar.close * (1 + (Math.random() - 0.5) * 0.001);\n const newVolume = Math.floor(Math.random() * 100) + 10;\n\n currentBar.close = newPrice;\n currentBar.high = Math.max(currentBar.high, newPrice);\n currentBar.low = Math.min(currentBar.low, newPrice);\n currentBar.volume += newVolume;\n\n updated[updated.length - 1] = currentBar;\n return updated;\n });\n }, config.updateIntervalMs);\n\n newBarIntervalRef.current = window.setInterval(() => {\n setBars((prev) => {\n if (prev.length === 0) return prev;\n\n const lastBar = prev[prev.length - 1];\n const newTimestamp = lastBar.timestamp + config.newBarIntervalMs;\n\n const newPrice = lastBar.close * (1 + (Math.random() - 0.5) * 0.002);\n\n const newBar: OHLCVBar = {\n timestamp: newTimestamp,\n open: lastBar.close,\n high: newPrice,\n low: Math.min(lastBar.close, newPrice),\n close: newPrice,\n volume: Math.floor(Math.random() * 1000) + 100,\n };\n\n lastBarTimeRef.current = newTimestamp;\n return [...prev, newBar];\n });\n }, config.newBarIntervalMs);\n\n return () => {\n if (updateIntervalRef.current) {\n clearInterval(updateIntervalRef.current);\n }\n if (newBarIntervalRef.current) {\n clearInterval(newBarIntervalRef.current);\n }\n };\n }, [config.enabled, config.updateIntervalMs, config.newBarIntervalMs, bars.length]);\n\n return {\n bars,\n updateCurrentBar,\n addNewBar,\n prependBars,\n };\n}\n","import { IndicatorInstance } from './types';\n\nexport interface PersistenceAdapter {\n saveIndicators(indicators: IndicatorInstance[]): Promise<void>;\n loadIndicators(): Promise<IndicatorInstance[]>;\n deleteIndicator(id: string): Promise<void>;\n}\n\nexport class LocalStoragePersistenceAdapter implements PersistenceAdapter {\n private storageKey = 'chart_indicators';\n\n async saveIndicators(indicators: IndicatorInstance[]): Promise<void> {\n try {\n const serialized = JSON.stringify(indicators);\n localStorage.setItem(this.storageKey, serialized);\n } catch (error) {\n console.error('Error saving indicators to localStorage:', error);\n }\n }\n\n async loadIndicators(): Promise<IndicatorInstance[]> {\n try {\n const serialized = localStorage.getItem(this.storageKey);\n if (!serialized) {\n return [];\n }\n\n const parsed = JSON.parse(serialized);\n return Array.isArray(parsed) ? parsed : [];\n } catch (error) {\n console.error('Error loading indicators from localStorage:', error);\n return [];\n }\n }\n\n async deleteIndicator(id: string): Promise<void> {\n try {\n const indicators = await this.loadIndicators();\n const filtered = indicators.filter((ind) => ind.id !== id);\n await this.saveIndicators(filtered);\n } catch (error) {\n console.error('Error deleting indicator from localStorage:', error);\n }\n }\n}\n\nexport class NoOpPersistenceAdapter implements PersistenceAdapter {\n async saveIndicators(indicators: IndicatorInstance[]): Promise<void> {\n }\n\n async loadIndicators(): Promise<IndicatorInstance[]> {\n return [];\n }\n\n async deleteIndicator(id: string): Promise<void> {\n }\n}\n\nexport function createPersistenceAdapter(\n kind: 'noop' | 'localStorage'\n): PersistenceAdapter {\n switch (kind) {\n case 'localStorage':\n return new LocalStoragePersistenceAdapter();\n case 'noop':\n return new NoOpPersistenceAdapter();\n default:\n throw new Error('Unknown persistence kind: ' + kind);\n }\n}\n","import { OHLCVBar } from '../../types/chart';\n\nexport function padIndicatorArray(result: number[], barsLength: number): number[] {\n const missing = barsLength - result.length;\n if (missing <= 0) return result;\n return [...Array(missing).fill(NaN), ...result];\n}\n\nexport function displaceArray(arr: number[], offset: number): number[] {\n if (offset <= 0) return arr;\n return [...arr.slice(offset), ...Array(offset).fill(NaN)];\n}\n\nexport function calculateSMA(bars: OHLCVBar[], period: number): number[] {\n const result: number[] = [];\n\n for (let i = 0; i < bars.length; i++) {\n if (i < period - 1) {\n result.push(NaN);\n } else {\n let sum = 0;\n for (let j = 0; j < period; j++) {\n sum += bars[i - j].close;\n }\n result.push(sum / period);\n }\n }\n\n return result;\n}\n\nexport function calculateEMA(bars: OHLCVBar[], period: number): number[] {\n const result: number[] = [];\n const multiplier = 2 / (period + 1);\n\n let ema = 0;\n let hasStarted = false;\n\n for (let i = 0; i < bars.length; i++) {\n if (i < period - 1) {\n result.push(NaN);\n } else if (i === period - 1) {\n let sum = 0;\n for (let j = 0; j < period; j++) {\n sum += bars[i - j].close;\n }\n ema = sum / period;\n result.push(ema);\n hasStarted = true;\n } else {\n ema = (bars[i].close - ema) * multiplier + ema;\n result.push(ema);\n }\n }\n\n return result;\n}\n\nexport function calculateRSI(bars: OHLCVBar[], period: number): number[] {\n const result: number[] = [];\n const changes: number[] = [];\n\n for (let i = 1; i < bars.length; i++) {\n changes.push(bars[i].close - bars[i - 1].close);\n }\n\n for (let i = 0; i < bars.length; i++) {\n if (i < period) {\n result.push(NaN);\n } else {\n let gains = 0;\n let losses = 0;\n\n for (let j = i - period; j < i; j++) {\n const change = changes[j - 1];\n if (change > 0) {\n gains += change;\n } else {\n losses += Math.abs(change);\n }\n }\n\n const avgGain = gains / period;\n const avgLoss = losses / period;\n\n if (avgLoss === 0) {\n result.push(100);\n } else {\n const rs = avgGain / avgLoss;\n const rsi = 100 - 100 / (1 + rs);\n result.push(rsi);\n }\n }\n }\n\n return result;\n}\n\nexport function calculateStandardDeviation(values: number[], period: number): number[] {\n const result: number[] = [];\n\n for (let i = 0; i < values.length; i++) {\n if (i < period - 1 || isNaN(values[i])) {\n result.push(NaN);\n } else {\n let sum = 0;\n let count = 0;\n\n for (let j = 0; j < period; j++) {\n const val = values[i - j];\n if (!isNaN(val)) {\n sum += val;\n count++;\n }\n }\n\n const mean = sum / count;\n let squaredDiffSum = 0;\n\n for (let j = 0; j < period; j++) {\n const val = values[i - j];\n if (!isNaN(val)) {\n squaredDiffSum += Math.pow(val - mean, 2);\n }\n }\n\n const variance = squaredDiffSum / count;\n result.push(Math.sqrt(variance));\n }\n }\n\n return result;\n}\n\nexport function calculateBollingerBands(\n bars: OHLCVBar[],\n period: number,\n stdDev: number\n): { upper: number[]; middle: number[]; lower: number[] } {\n const middle = calculateSMA(bars, period);\n const closes = bars.map((b) => b.close);\n const std = calculateStandardDeviation(closes, period);\n\n const upper: number[] = [];\n const lower: number[] = [];\n\n for (let i = 0; i < middle.length; i++) {\n if (isNaN(middle[i]) || isNaN(std[i])) {\n upper.push(NaN);\n lower.push(NaN);\n } else {\n upper.push(middle[i] + std[i] * stdDev);\n lower.push(middle[i] - std[i] * stdDev);\n }\n }\n\n return { upper, middle, lower };\n}\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { calculateSMA } from '../utils/calculations';\n\nexport const SMAIndicator: IndicatorDefinition = {\n metadata: {\n id: 'sma',\n name: 'SMA',\n description: 'Simple Moving Average - smooths price data by averaging over a period',\n category: IndicatorCategory.TREND,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 20,\n description: 'Number of bars to average',\n min: 1,\n max: 500,\n step: 1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#3b82f6',\n description: 'Color of the SMA line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the SMA line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: true,\n },\n calculate: (bars, settings) => {\n const smaValues = calculateSMA(bars, settings.period);\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: smaValues[i],\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { calculateEMA } from '../utils/calculations';\n\nexport const EMAIndicator: IndicatorDefinition = {\n metadata: {\n id: 'ema',\n name: 'EMA',\n description: 'Exponential Moving Average - gives more weight to recent prices',\n category: IndicatorCategory.TREND,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 12,\n description: 'Number of bars for EMA calculation',\n min: 1,\n max: 500,\n step: 1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#10b981',\n description: 'Color of the EMA line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the EMA line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: true,\n },\n calculate: (bars, settings) => {\n const emaValues = calculateEMA(bars, settings.period);\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: emaValues[i],\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { calculateRSI } from '../utils/calculations';\n\nexport const RSIIndicator: IndicatorDefinition = {\n metadata: {\n id: 'rsi',\n name: 'RSI',\n description: 'Relative Strength Index - momentum oscillator measuring speed and magnitude of price changes',\n category: IndicatorCategory.MOMENTUM,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 14,\n description: 'Number of bars for RSI calculation',\n min: 2,\n max: 100,\n step: 1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#8b5cf6',\n description: 'Color of the RSI line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the RSI line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: false,\n },\n calculate: (bars, settings) => {\n const rsiValues = calculateRSI(bars, settings.period);\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: rsiValues[i],\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { calculateBollingerBands } from '../utils/calculations';\n\nexport const BollingerBandsIndicator: IndicatorDefinition = {\n metadata: {\n id: 'bollinger',\n name: 'Bollinger Bands',\n description: 'Bollinger Bands - volatility bands placed above and below a moving average',\n category: IndicatorCategory.VOLATILITY,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 20,\n description: 'Number of bars for moving average',\n min: 2,\n max: 200,\n step: 1,\n },\n stdDev: {\n type: 'number',\n label: 'Standard Deviation',\n defaultValue: 2,\n description: 'Number of standard deviations for bands',\n min: 0.5,\n max: 5,\n step: 0.1,\n },\n upperColor: {\n type: 'color',\n label: 'Upper Band Color',\n defaultValue: '#ef4444',\n description: 'Color of the upper band',\n },\n middleColor: {\n type: 'color',\n label: 'Middle Band Color',\n defaultValue: '#3b82f6',\n description: 'Color of the middle band',\n },\n lowerColor: {\n type: 'color',\n label: 'Lower Band Color',\n defaultValue: '#10b981',\n description: 'Color of the lower band',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the band lines',\n min: 1,\n max: 5,\n step: 1,\n },\n showFill: {\n type: 'boolean',\n label: 'Show Fill',\n defaultValue: true,\n description: 'Show shaded area between bands',\n },\n fillColor: {\n type: 'color',\n label: 'Fill Color',\n defaultValue: 'rgba(59, 130, 246, 0.1)',\n description: 'Color of the shaded area between bands',\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 3,\n overlay: true,\n hasBandFill: true,\n fillBands: {\n upper: 'upper',\n lower: 'lower',\n },\n },\n calculate: (bars, settings) => {\n const { upper, middle, lower } = calculateBollingerBands(\n bars,\n settings.period,\n settings.stdDev\n );\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: middle[i],\n upper: upper[i],\n lower: lower[i],\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { OHLCVBar } from '../../types/chart';\n\ntype ResetPeriod = 'none' | 'daily' | 'weekly' | 'monthly';\n\nfunction calculateVWAPWithBands(\n bars: OHLCVBar[],\n {\n reset = 'none' as ResetPeriod,\n bandMultiplier = 1,\n includeBands = true,\n }: {\n reset?: ResetPeriod;\n bandMultiplier?: number;\n includeBands?: boolean;\n }\n) {\n if (!bars.length) return { vwap: [], upper: [], lower: [] };\n\n let cumulativeVolume = 0;\n let cumulativeTPV = 0;\n let sessionPrices: number[] = [];\n\n const vwap: number[] = [];\n const upper: number[] = [];\n const lower: number[] = [];\n\n const getWeek = (d: Date) => {\n const day = new Date(Date.UTC(d.getFullYear(), d.getMonth(), d.getDate()));\n const dayNum = day.getUTCDay() || 7;\n day.setUTCDate(day.getUTCDate() + 4 - dayNum);\n const yearStart = new Date(Date.UTC(day.getUTCFullYear(), 0, 1));\n return Math.ceil(\n ((day.getTime() - yearStart.getTime()) / 86400000 + 1) / 7,\n );\n };\n\n const std = (arr: number[]) => {\n const mean = arr.reduce((a, b) => a + b, 0) / arr.length;\n return Math.sqrt(arr.reduce((a, b) => a + (b - mean) ** 2, 0) / arr.length);\n };\n\n for (let i = 0; i < bars.length; i++) {\n const bar = bars[i];\n const typical = (bar.high + bar.low + bar.close) / 3;\n\n if (i > 0 && reset !== 'none') {\n const prev = new Date(bars[i - 1].timestamp);\n const curr = new Date(bar.timestamp);\n let resetFlag = false;\n\n if (reset === 'daily') {\n resetFlag =\n curr.getDate() !== prev.getDate() ||\n curr.getMonth() !== prev.getMonth() ||\n curr.getFullYear() !== prev.getFullYear();\n } else if (reset === 'weekly') {\n resetFlag =\n getWeek(curr) !== getWeek(prev) ||\n curr.getFullYear() !== prev.getFullYear();\n } else if (reset === 'monthly') {\n resetFlag =\n curr.getMonth() !== prev.getMonth() ||\n curr.getFullYear() !== prev.getFullYear();\n }\n\n if (resetFlag) {\n cumulativeVolume = 0;\n cumulativeTPV = 0;\n sessionPrices = [];\n }\n }\n\n cumulativeTPV += typical * bar.volume;\n cumulativeVolume += bar.volume;\n sessionPrices.push(typical);\n\n const vwapValue = cumulativeTPV / cumulativeVolume;\n vwap.push(vwapValue);\n\n if (includeBands && sessionPrices.length > 1) {\n const sigma = std(sessionPrices);\n upper.push(vwapValue + sigma * bandMultiplier);\n lower.push(vwapValue - sigma * bandMultiplier);\n } else {\n upper.push(NaN);\n lower.push(NaN);\n }\n }\n\n return { vwap, upper, lower };\n}\n\nexport const VWAPIndicator: IndicatorDefinition = {\n metadata: {\n id: 'vwap',\n name: 'VWAP',\n description: 'Volume Weighted Average Price with standard deviation bands',\n category: IndicatorCategory.VOLUME,\n version: '1.0.0',\n },\n settings: {\n reset: {\n type: 'select',\n label: 'Reset Period',\n defaultValue: 'daily',\n description: 'When to reset VWAP calculation',\n options: [\n { label: 'None', value: 'none' },\n { label: 'Daily', value: 'daily' },\n { label: 'Weekly', value: 'weekly' },\n { label: 'Monthly', value: 'monthly' },\n ],\n },\n bandMultiplier: {\n type: 'number',\n label: 'Band Multiplier',\n defaultValue: 1,\n description: 'Standard deviation multiplier for bands',\n min: 0.5,\n max: 5,\n step: 0.1,\n },\n showBands: {\n type: 'boolean',\n label: 'Show Bands',\n defaultValue: true,\n description: 'Show standard deviation bands',\n },\n vwapColor: {\n type: 'color',\n label: 'VWAP Color',\n defaultValue: '#f59e0b',\n description: 'Color of the VWAP line',\n },\n upperColor: {\n type: 'color',\n label: 'Upper Band Color',\n defaultValue: '#ef4444',\n description: 'Color of the upper band',\n },\n lowerColor: {\n type: 'color',\n label: 'Lower Band Color',\n defaultValue: '#10b981',\n description: 'Color of the lower band',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the lines',\n min: 1,\n max: 5,\n step: 1,\n },\n showFill: {\n type: 'boolean',\n label: 'Show Fill',\n defaultValue: true,\n description: 'Show shaded area between bands',\n },\n fillColor: {\n type: 'color',\n label: 'Fill Color',\n defaultValue: 'rgba(245, 158, 11, 0.1)',\n description: 'Color of the shaded area between bands',\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 3,\n overlay: true,\n hasBandFill: true,\n fillBands: {\n upper: 'upper',\n lower: 'lower',\n },\n },\n calculate: (bars, settings) => {\n const { vwap, upper, lower } = calculateVWAPWithBands(bars, {\n reset: settings.reset as ResetPeriod,\n bandMultiplier: settings.bandMultiplier,\n includeBands: settings.showBands,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: vwap[i],\n upper: upper[i],\n lower: lower[i],\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { stochastic } from 'fast-technical-indicators';\n\nexport const StochasticIndicator: IndicatorDefinition = {\n metadata: {\n id: 'stochastic',\n name: 'Stochastic Oscillator',\n description: 'Compares closing price to price range over time - momentum indicator',\n category: IndicatorCategory.MOMENTUM,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period (K)',\n defaultValue: 14,\n description: 'Number of bars for %K calculation',\n min: 2,\n max: 100,\n step: 1,\n },\n signalPeriod: {\n type: 'number',\n label: 'Signal Period (D)',\n defaultValue: 3,\n description: 'Number of bars for %D signal line',\n min: 1,\n max: 50,\n step: 1,\n },\n kColor: {\n type: 'color',\n label: '%K Line Color',\n defaultValue: '#3b82f6',\n description: 'Color of the %K line',\n },\n dColor: {\n type: 'color',\n label: '%D Line Color',\n defaultValue: '#ef4444',\n description: 'Color of the %D signal line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the indicator lines',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 2,\n overlay: false,\n },\n calculate: (bars, settings) => {\n const high = bars.map(bar => bar.high);\n const low = bars.map(bar => bar.low);\n const close = bars.map(bar => bar.close);\n\n const stochValues = stochastic({\n high,\n low,\n close,\n period: settings.period,\n signalPeriod: settings.signalPeriod,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: stochValues[i]?.k ?? NaN,\n signal: stochValues[i]?.d ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { obv } from 'fast-technical-indicators';\n\nexport const OBVIndicator: IndicatorDefinition = {\n metadata: {\n id: 'obv',\n name: 'OBV',\n description: 'On-Balance Volume - cumulative volume indicator showing buying/selling pressure',\n category: IndicatorCategory.VOLUME,\n version: '1.0.0',\n },\n settings: {\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#10b981',\n description: 'Color of the OBV line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the OBV line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: false,\n },\n calculate: (bars) => {\n const close = bars.map(bar => bar.close);\n const volume = bars.map(bar => bar.volume || 0);\n\n const obvValues = obv({ close, volume });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: obvValues[i] ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { mfi } from 'fast-technical-indicators';\n\nexport const MFIIndicator: IndicatorDefinition = {\n metadata: {\n id: 'mfi',\n name: 'MFI',\n description: 'Money Flow Index - volume-weighted momentum indicator (RSI with volume)',\n category: IndicatorCategory.VOLUME,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 14,\n description: 'Number of bars for MFI calculation',\n min: 2,\n max: 100,\n step: 1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#f59e0b',\n description: 'Color of the MFI line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the MFI line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: false,\n },\n calculate: (bars, settings) => {\n const high = bars.map(bar => bar.high);\n const low = bars.map(bar => bar.low);\n const close = bars.map(bar => bar.close);\n const volume = bars.map(bar => bar.volume || 0);\n\n const mfiValues = mfi({\n high,\n low,\n close,\n volume,\n period: settings.period,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: mfiValues[i] ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { forceindex } from 'fast-technical-indicators';\n\nexport const ForceIndexIndicator: IndicatorDefinition = {\n metadata: {\n id: 'forceindex',\n name: 'Force Index',\n description: 'Measures buying/selling pressure using price and volume',\n category: IndicatorCategory.VOLUME,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 13,\n description: 'Smoothing period for force index',\n min: 1,\n max: 100,\n step: 1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#8b5cf6',\n description: 'Color of the Force Index line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the Force Index line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: false,\n },\n calculate: (bars, settings) => {\n const close = bars.map(bar => bar.close);\n const volume = bars.map(bar => bar.volume || 0);\n\n const forceValues = forceindex({\n close,\n volume,\n period: settings.period,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: forceValues[i] ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { atr } from 'fast-technical-indicators';\n\nexport const ATRIndicator: IndicatorDefinition = {\n metadata: {\n id: 'atr',\n name: 'ATR',\n description: 'Average True Range - measures market volatility',\n category: IndicatorCategory.VOLATILITY,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 14,\n description: 'Number of bars for ATR calculation',\n min: 1,\n max: 100,\n step: 1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#14b8a6',\n description: 'Color of the ATR line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the ATR line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: false,\n },\n calculate: (bars, settings) => {\n const high = bars.map(bar => bar.high);\n const low = bars.map(bar => bar.low);\n const close = bars.map(bar => bar.close);\n\n const atrValues = atr({\n high,\n low,\n close,\n period: settings.period,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: atrValues[i] ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { adx } from 'fast-technical-indicators';\n\nexport const ADXIndicator: IndicatorDefinition = {\n metadata: {\n id: 'adx',\n name: 'ADX',\n description: 'Average Directional Index - measures trend strength (not direction)',\n category: IndicatorCategory.TREND,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 14,\n description: 'Number of bars for ADX calculation',\n min: 2,\n max: 100,\n step: 1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#06b6d4',\n description: 'Color of the ADX line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the ADX line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: false,\n },\n calculate: (bars, settings) => {\n const high = bars.map(bar => bar.high);\n const low = bars.map(bar => bar.low);\n const close = bars.map(bar => bar.close);\n\n const adxValues = adx({\n high,\n low,\n close,\n period: settings.period,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: adxValues[i]?.adx ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { macd } from 'fast-technical-indicators';\n\nexport const MACDIndicator: IndicatorDefinition = {\n metadata: {\n id: 'macd',\n name: 'MACD',\n description: 'Moving Average Convergence Divergence - trend-following momentum indicator',\n category: IndicatorCategory.MOMENTUM,\n version: '1.0.0',\n },\n settings: {\n fastPeriod: {\n type: 'number',\n label: 'Fast Period',\n defaultValue: 12,\n description: 'Period for fast EMA',\n min: 2,\n max: 100,\n step: 1,\n },\n slowPeriod: {\n type: 'number',\n label: 'Slow Period',\n defaultValue: 26,\n description: 'Period for slow EMA',\n min: 2,\n max: 100,\n step: 1,\n },\n signalPeriod: {\n type: 'number',\n label: 'Signal Period',\n defaultValue: 9,\n description: 'Period for signal line',\n min: 1,\n max: 50,\n step: 1,\n },\n macdColor: {\n type: 'color',\n label: 'MACD Line Color',\n defaultValue: '#3b82f6',\n description: 'Color of the MACD line',\n },\n signalColor: {\n type: 'color',\n label: 'Signal Line Color',\n defaultValue: '#ef4444',\n description: 'Color of the signal line',\n },\n histogramColor: {\n type: 'color',\n label: 'Histogram Color',\n defaultValue: '#10b981',\n description: 'Color of the histogram',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the MACD and signal lines',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 3,\n overlay: false,\n },\n calculate: (bars, settings) => {\n const values = bars.map(bar => bar.close);\n\n const macdValues = macd({\n values,\n fastPeriod: settings.fastPeriod,\n slowPeriod: settings.slowPeriod,\n signalPeriod: settings.signalPeriod,\n SimpleMAOscillator: false,\n SimpleMASignal: false,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: macdValues[i]?.MACD ?? NaN,\n signal: macdValues[i]?.signal ?? NaN,\n histogram: macdValues[i]?.histogram ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { psar } from 'fast-technical-indicators';\n\nexport const PSARIndicator: IndicatorDefinition = {\n metadata: {\n id: 'psar',\n name: 'Parabolic SAR',\n description: 'Parabolic Stop and Reverse - shows potential reversal points as dots',\n category: IndicatorCategory.TREND,\n version: '1.0.0',\n },\n settings: {\n step: {\n type: 'number',\n label: 'Step (AF)',\n defaultValue: 0.02,\n description: 'Acceleration Factor step',\n min: 0.001,\n max: 1,\n step: 0.001,\n },\n max: {\n type: 'number',\n label: 'Max AF',\n defaultValue: 0.2,\n description: 'Maximum Acceleration Factor',\n min: 0.01,\n max: 1,\n step: 0.01,\n },\n color: {\n type: 'color',\n label: 'Color',\n defaultValue: '#f59e0b',\n description: 'Color of the SAR dots',\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: true,\n },\n calculate: (bars, settings) => {\n const high = bars.map(bar => bar.high);\n const low = bars.map(bar => bar.low);\n\n const psarValues = psar({\n high,\n low,\n step: settings.step,\n max: settings.max,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: psarValues[i] ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { cci } from 'fast-technical-indicators';\n\nexport const CCIIndicator: IndicatorDefinition = {\n metadata: {\n id: 'cci',\n name: 'CCI',\n description: 'Commodity Channel Index - identifies cyclical trends and overbought/oversold levels',\n category: IndicatorCategory.OSCILLATORS,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 20,\n description: 'Number of bars for CCI calculation',\n min: 2,\n max: 100,\n step: 1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#ec4899',\n description: 'Color of the CCI line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the CCI line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: false,\n },\n calculate: (bars, settings) => {\n const high = bars.map(bar => bar.high);\n const low = bars.map(bar => bar.low);\n const close = bars.map(bar => bar.close);\n\n const cciValues = cci({\n high,\n low,\n close,\n period: settings.period,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: cciValues[i] ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { williamsr } from 'fast-technical-indicators';\n\nexport const WilliamsRIndicator: IndicatorDefinition = {\n metadata: {\n id: 'williamsr',\n name: 'Williams %R',\n description: 'Williams Percent Range - momentum indicator showing overbought/oversold levels',\n category: IndicatorCategory.MOMENTUM,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 14,\n description: 'Number of bars for Williams %R calculation',\n min: 2,\n max: 100,\n step: 1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#a855f7',\n description: 'Color of the Williams %R line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the Williams %R line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: false,\n },\n calculate: (bars, settings) => {\n const high = bars.map(bar => bar.high);\n const low = bars.map(bar => bar.low);\n const close = bars.map(bar => bar.close);\n\n const williamsValues = williamsr({\n high,\n low,\n close,\n period: settings.period,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: williamsValues[i] ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { keltnerchannel } from 'fast-technical-indicators';\n\nexport const KeltnerChannelsIndicator: IndicatorDefinition = {\n metadata: {\n id: 'keltner',\n name: 'Keltner Channels',\n description: 'Volatility-based channels using ATR - similar to Bollinger Bands',\n category: IndicatorCategory.VOLATILITY,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 20,\n description: 'Period for middle line (EMA)',\n min: 2,\n max: 200,\n step: 1,\n },\n atrPeriod: {\n type: 'number',\n label: 'ATR Period',\n defaultValue: 10,\n description: 'Period for ATR calculation',\n min: 1,\n max: 100,\n step: 1,\n },\n atrMultiplier: {\n type: 'number',\n label: 'ATR Multiplier',\n defaultValue: 2,\n description: 'Multiplier for channel width',\n min: 0.1,\n max: 10,\n step: 0.1,\n },\n upperColor: {\n type: 'color',\n label: 'Upper Band Color',\n defaultValue: '#ef4444',\n description: 'Color of the upper band',\n },\n middleColor: {\n type: 'color',\n label: 'Middle Line Color',\n defaultValue: '#3b82f6',\n description: 'Color of the middle line',\n },\n lowerColor: {\n type: 'color',\n label: 'Lower Band Color',\n defaultValue: '#10b981',\n description: 'Color of the lower band',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the channel lines',\n min: 1,\n max: 5,\n step: 1,\n },\n showFill: {\n type: 'boolean',\n label: 'Show Fill',\n defaultValue: true,\n description: 'Fill area between bands',\n },\n fillColor: {\n type: 'color',\n label: 'Fill Color',\n defaultValue: 'rgba(59, 130, 246, 0.1)',\n description: 'Color of the channel fill',\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 3,\n overlay: true,\n hasBandFill: true,\n },\n calculate: (bars, settings) => {\n const high = bars.map(bar => bar.high);\n const low = bars.map(bar => bar.low);\n const close = bars.map(bar => bar.close);\n\n const keltnerValues = keltnerchannel({\n high,\n low,\n close,\n period: settings.period,\n atrPeriod: settings.atrPeriod,\n multiplier: settings.atrMultiplier,\n } as any);\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: keltnerValues[i]?.middle ?? NaN,\n upper: keltnerValues[i]?.upper ?? NaN,\n lower: keltnerValues[i]?.lower ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { supertrend } from 'fast-technical-indicators';\n\nexport const SuperTrendIndicator: IndicatorDefinition = {\n metadata: {\n id: 'supertrend',\n name: 'SuperTrend',\n description: 'Modern trend-following indicator with clear buy/sell signals',\n category: IndicatorCategory.TREND,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 10,\n description: 'Period for ATR calculation',\n min: 1,\n max: 100,\n step: 1,\n },\n multiplier: {\n type: 'number',\n label: 'Multiplier',\n defaultValue: 3,\n description: 'ATR multiplier for bands',\n min: 0.1,\n max: 10,\n step: 0.1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#06b6d4',\n description: 'Color of the SuperTrend line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the SuperTrend line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: true,\n },\n calculate: (bars, settings) => {\n const high = bars.map(bar => bar.high);\n const low = bars.map(bar => bar.low);\n const close = bars.map(bar => bar.close);\n\n const supertrendValues = supertrend({\n high,\n low,\n close,\n period: settings.period,\n multiplier: settings.multiplier,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: supertrendValues[i]?.supertrend ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { ichimokucloud } from 'fast-technical-indicators';\nimport { displaceArray } from '../utils/calculations';\n\nexport const IchimokuIndicator: IndicatorDefinition = {\n metadata: {\n id: 'ichimoku',\n name: 'Ichimoku Cloud',\n description: 'Comprehensive trend system with conversion, base, and span lines forming a cloud',\n category: IndicatorCategory.TREND,\n version: '1.0.0',\n },\n settings: {\n conversionPeriod: {\n type: 'number',\n label: 'Conversion Period (Tenkan)',\n defaultValue: 9,\n description: 'Period for conversion line',\n min: 1,\n max: 100,\n step: 1,\n },\n basePeriod: {\n type: 'number',\n label: 'Base Period (Kijun)',\n defaultValue: 26,\n description: 'Period for base line',\n min: 1,\n max: 100,\n step: 1,\n },\n spanPeriod: {\n type: 'number',\n label: 'Span Period (Senkou)',\n defaultValue: 52,\n description: 'Period for span B',\n min: 1,\n max: 200,\n step: 1,\n },\n displacement: {\n type: 'number',\n label: 'Displacement',\n defaultValue: 26,\n description: 'Forward displacement for span lines',\n min: 0,\n max: 100,\n step: 1,\n },\n conversionColor: {\n type: 'color',\n label: 'Conversion Line Color',\n defaultValue: '#3b82f6',\n description: 'Color of the conversion line',\n },\n baseColor: {\n type: 'color',\n label: 'Base Line Color',\n defaultValue: '#ef4444',\n description: 'Color of the base line',\n },\n spanAColor: {\n type: 'color',\n label: 'Span A Color',\n defaultValue: '#10b981',\n description: 'Color of span A (cloud edge)',\n },\n spanBColor: {\n type: 'color',\n label: 'Span B Color',\n defaultValue: '#f59e0b',\n description: 'Color of span B (cloud edge)',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the indicator lines',\n min: 1,\n max: 5,\n step: 1,\n },\n showCloud: {\n type: 'boolean',\n label: 'Show Cloud',\n defaultValue: true,\n description: 'Fill area between span A and span B',\n },\n cloudColor: {\n type: 'color',\n label: 'Cloud Color',\n defaultValue: 'rgba(59, 130, 246, 0.1)',\n description: 'Color of the cloud fill',\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 5,\n overlay: true,\n hasBandFill: true,\n fillBands: {\n upper: 'spanA',\n lower: 'spanB',\n },\n },\n calculate: (bars, settings) => {\n const high = bars.map(bar => bar.high);\n const low = bars.map(bar => bar.low);\n\n const ichimokuValues = ichimokucloud({\n high,\n low,\n conversionPeriod: settings.conversionPeriod,\n basePeriod: settings.basePeriod,\n spanPeriod: settings.spanPeriod,\n displacement: 0,\n });\n\n const conversion = bars.map((_, i) => ichimokuValues[i]?.conversion ?? NaN);\n const base = bars.map((_, i) => ichimokuValues[i]?.base ?? NaN);\n const spanA = bars.map((_, i) => ichimokuValues[i]?.spanA ?? NaN);\n const spanB = bars.map((_, i) => ichimokuValues[i]?.spanB ?? NaN);\n\n const displacedSpanA = displaceArray(spanA, settings.displacement);\n const displacedSpanB = displaceArray(spanB, settings.displacement);\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: conversion[i],\n base: base[i],\n spanA: displacedSpanA[i],\n spanB: displacedSpanB[i],\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { donchianchannels } from 'fast-technical-indicators';\n\nexport const DonchianChannelsIndicator: IndicatorDefinition = {\n metadata: {\n id: 'donchian',\n name: 'Donchian Channels',\n description: 'Highest high and lowest low over a period - classic breakout indicator',\n category: IndicatorCategory.VOLATILITY,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 20,\n description: 'Number of bars to look back',\n min: 2,\n max: 200,\n step: 1,\n },\n upperColor: {\n type: 'color',\n label: 'Upper Band Color',\n defaultValue: '#ef4444',\n description: 'Color of the upper band',\n },\n middleColor: {\n type: 'color',\n label: 'Middle Line Color',\n defaultValue: '#3b82f6',\n description: 'Color of the middle line',\n },\n lowerColor: {\n type: 'color',\n label: 'Lower Band Color',\n defaultValue: '#10b981',\n description: 'Color of the lower band',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the channel lines',\n min: 1,\n max: 5,\n step: 1,\n },\n showFill: {\n type: 'boolean',\n label: 'Show Fill',\n defaultValue: true,\n description: 'Fill area between bands',\n },\n fillColor: {\n type: 'color',\n label: 'Fill Color',\n defaultValue: 'rgba(59, 130, 246, 0.1)',\n description: 'Color of the channel fill',\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 3,\n overlay: true,\n hasBandFill: true,\n fillBands: {\n upper: 'upper',\n lower: 'lower',\n },\n },\n calculate: (bars, settings) => {\n const high = bars.map(bar => bar.high);\n const low = bars.map(bar => bar.low);\n\n const donchianValues = donchianchannels({\n high,\n low,\n period: settings.period,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: donchianValues[i]?.middle ?? NaN,\n upper: donchianValues[i]?.upper ?? NaN,\n lower: donchianValues[i]?.lower ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { roc } from 'fast-technical-indicators';\n\nexport const ROCIndicator: IndicatorDefinition = {\n metadata: {\n id: 'roc',\n name: 'ROC',\n description: 'Rate of Change - measures percentage change in price over a period',\n category: IndicatorCategory.MOMENTUM,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 12,\n description: 'Number of bars for ROC calculation',\n min: 1,\n max: 100,\n step: 1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#06b6d4',\n description: 'Color of the ROC line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the ROC line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: false,\n },\n calculate: (bars, settings) => {\n const values = bars.map(bar => bar.close);\n\n const rocValues = roc({\n values,\n period: settings.period,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: rocValues[i] ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { stochasticrsi } from 'fast-technical-indicators';\n\nexport const StochRSIIndicator: IndicatorDefinition = {\n metadata: {\n id: 'stochrsi',\n name: 'Stochastic RSI',\n description: 'Stochastic RSI - applies Stochastic oscillator to RSI values',\n category: IndicatorCategory.MOMENTUM,\n version: '1.0.0',\n },\n settings: {\n rsiPeriod: {\n type: 'number',\n label: 'RSI Period',\n defaultValue: 14,\n description: 'Period for RSI calculation',\n min: 2,\n max: 100,\n step: 1,\n },\n stochPeriod: {\n type: 'number',\n label: 'Stochastic Period',\n defaultValue: 14,\n description: 'Period for Stochastic calculation',\n min: 2,\n max: 100,\n step: 1,\n },\n kPeriod: {\n type: 'number',\n label: '%K Period',\n defaultValue: 3,\n description: 'Smoothing period for %K',\n min: 1,\n max: 50,\n step: 1,\n },\n dPeriod: {\n type: 'number',\n label: '%D Period',\n defaultValue: 3,\n description: 'Smoothing period for %D signal line',\n min: 1,\n max: 50,\n step: 1,\n },\n kColor: {\n type: 'color',\n label: '%K Line Color',\n defaultValue: '#3b82f6',\n description: 'Color of the %K line',\n },\n dColor: {\n type: 'color',\n label: '%D Line Color',\n defaultValue: '#ef4444',\n description: 'Color of the %D signal line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the indicator lines',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 2,\n overlay: false,\n },\n calculate: (bars, settings) => {\n const values = bars.map(bar => bar.close);\n\n const stochRSIValues = stochasticrsi({\n values,\n rsiPeriod: settings.rsiPeriod,\n stochasticPeriod: settings.stochPeriod,\n kPeriod: settings.kPeriod,\n dPeriod: settings.dPeriod,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: stochRSIValues[i]?.k ?? NaN,\n signal: stochRSIValues[i]?.d ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { wma } from 'fast-technical-indicators';\n\nexport const WMAIndicator: IndicatorDefinition = {\n metadata: {\n id: 'wma',\n name: 'WMA',\n description: 'Weighted Moving Average - gives more weight to recent prices',\n category: IndicatorCategory.TREND,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 20,\n description: 'Number of bars to average',\n min: 1,\n max: 500,\n step: 1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#f59e0b',\n description: 'Color of the WMA line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the WMA line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: true,\n },\n calculate: (bars, settings) => {\n const values = bars.map(bar => bar.close);\n\n const wmaValues = wma({\n values,\n period: settings.period,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: wmaValues[i] ?? NaN,\n }));\n },\n};\n","import { indicatorRegistry } from '../core/registry';\nimport { SMAIndicator } from './sma';\nimport { EMAIndicator } from './ema';\nimport { RSIIndicator } from './rsi';\nimport { BollingerBandsIndicator } from './bollinger';\nimport { VWAPIndicator } from './vwap';\nimport { StochasticIndicator } from './stochastic';\nimport { OBVIndicator } from './obv';\nimport { MFIIndicator } from './mfi';\nimport { ForceIndexIndicator } from './forceindex';\nimport { ATRIndicator } from './atr';\nimport { ADXIndicator } from './adx';\nimport { MACDIndicator } from './macd';\nimport { PSARIndicator } from './psar';\nimport { CCIIndicator } from './cci';\nimport { WilliamsRIndicator } from './williamsr';\nimport { KeltnerChannelsIndicator } from './keltner';\nimport { SuperTrendIndicator } from './supertrend';\nimport { IchimokuIndicator } from './ichimoku';\nimport { DonchianChannelsIndicator } from './donchian';\nimport { ROCIndicator } from './roc';\nimport { StochRSIIndicator } from './stochrsi';\nimport { WMAIndicator } from './wma';\n\nexport function registerBuiltInIndicators(): void {\n indicatorRegistry.register(SMAIndicator);\n indicatorRegistry.register(EMAIndicator);\n indicatorRegistry.register(RSIIndicator);\n indicatorRegistry.register(BollingerBandsIndicator);\n indicatorRegistry.register(VWAPIndicator);\n indicatorRegistry.register(StochasticIndicator);\n indicatorRegistry.register(OBVIndicator);\n indicatorRegistry.register(MFIIndicator);\n indicatorRegistry.register(ForceIndexIndicator);\n indicatorRegistry.register(ATRIndicator);\n indicatorRegistry.register(ADXIndicator);\n indicatorRegistry.register(MACDIndicator);\n indicatorRegistry.register(PSARIndicator);\n indicatorRegistry.register(CCIIndicator);\n indicatorRegistry.register(WilliamsRIndicator);\n indicatorRegistry.register(KeltnerChannelsIndicator);\n indicatorRegistry.register(SuperTrendIndicator);\n indicatorRegistry.register(IchimokuIndicator);\n indicatorRegistry.register(DonchianChannelsIndicator);\n indicatorRegistry.register(ROCIndicator);\n indicatorRegistry.register(StochRSIIndicator);\n indicatorRegistry.register(WMAIndicator);\n}\n\nexport {\n SMAIndicator,\n EMAIndicator,\n RSIIndicator,\n BollingerBandsIndicator,\n VWAPIndicator,\n StochasticIndicator,\n OBVIndicator,\n MFIIndicator,\n ForceIndexIndicator,\n ATRIndicator,\n ADXIndicator,\n MACDIndicator,\n PSARIndicator,\n CCIIndicator,\n WilliamsRIndicator,\n KeltnerChannelsIndicator,\n SuperTrendIndicator,\n IchimokuIndicator,\n DonchianChannelsIndicator,\n ROCIndicator,\n StochRSIIndicator,\n WMAIndicator,\n};\n","import { OHLCVBar } from '../types/chart';\nimport {\n BarDataAdapter,\n BarDataAdapterOptions,\n HistoricalDataParams,\n RealtimeHandlers,\n RealtimeSubscription,\n} from './types';\nimport { normalizeTimestamp, validateAndNormalizeBars } from '../utils/barUtils';\n\ninterface AlpacaBar {\n t: string;\n o: number;\n h: number;\n l: number;\n c: number;\n v: number;\n n?: number;\n vw?: number;\n}\n\ninterface AlpacaBarsResponse {\n bars: {\n [symbol: string]: AlpacaBar[];\n };\n next_page_token?: string;\n}\n\ninterface AlpacaTrade {\n T: string;\n S: string;\n p: number;\n s: number;\n t: string;\n}\n\ninterface AlpacaBar_WS {\n T: string;\n S: string;\n o: number;\n h: number;\n l: number;\n c: number;\n v: number;\n t: string;\n n?: number;\n vw?: number;\n}\n\nexport class AlpacaBarAdapter implements BarDataAdapter {\n private apiKey: string;\n private secretKey: string;\n private baseUrl: string;\n private wsUrl: string;\n private ws: WebSocket | null = null;\n private reconnectAttempts = 0;\n private maxReconnectAttempts = 5;\n private reconnectDelay = 1000;\n private currentHandlers: RealtimeHandlers | null = null;\n private currentSymbol: string | null = null;\n private authenticated = false;\n\n constructor(options: BarDataAdapterOptions) {\n if (!options.apiKey || !options.secretKey) {\n throw new Error('Alpaca API key and secret key are required');\n }\n\n this.apiKey = options.apiKey;\n this.secretKey = options.secretKey;\n this.baseUrl = options.baseUrl || 'https://data.alpaca.markets';\n this.wsUrl = options.wsUrl || 'wss://stream.data.alpaca.markets/v2/iex';\n }\n\n async fetchHistoricalBars(params: HistoricalDataParams): Promise<OHLCVBar[]> {\n const { symbol, timeframe, before, after, limit = 500 } = params;\n\n const url = new URL(`${this.baseUrl}/v2/stocks/${symbol}/bars`);\n url.searchParams.set('timeframe', timeframe);\n url.searchParams.set('limit', limit.toString());\n\n if (before) {\n const beforeDate = new Date(before).toISOString();\n url.searchParams.set('end', beforeDate);\n }\n\n if (after) {\n const afterDate = new Date(after).toISOString();\n url.searchParams.set('start', afterDate);\n }\n\n url.searchParams.set('feed', 'iex');\n\n const headers = {\n 'APCA-API-KEY-ID': this.apiKey,\n 'APCA-API-SECRET-KEY': this.secretKey,\n };\n\n try {\n const response = await fetch(url.toString(), { headers });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Alpaca API error: ${response.status} ${errorText}`);\n }\n\n const data: AlpacaBarsResponse = await response.json();\n const bars = data.bars[symbol] || [];\n\n return this.convertAlpacaBars(bars);\n } catch (error) {\n console.error('Failed to fetch Alpaca bars:', error);\n throw error;\n }\n }\n\n subscribeRealtime(symbol: string, handlers: RealtimeHandlers): RealtimeSubscription {\n this.currentSymbol = symbol;\n this.currentHandlers = handlers;\n\n this.connectWebSocket();\n\n return {\n unsubscribe: () => this.disconnect(),\n };\n }\n\n unsubscribeAll(): void {\n this.disconnect();\n }\n\n private connectWebSocket(): void {\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n console.log('WebSocket already connected');\n return;\n }\n\n try {\n this.ws = new WebSocket(this.wsUrl);\n\n this.ws.onopen = () => {\n console.log('Alpaca WebSocket connected');\n this.authenticated = false;\n this.authenticate();\n };\n\n this.ws.onmessage = (event) => {\n this.handleMessage(event.data);\n };\n\n this.ws.onerror = (event) => {\n console.error('Alpaca WebSocket error:', event);\n this.currentHandlers?.onError?.(new Error('WebSocket error'));\n };\n\n this.ws.onclose = () => {\n console.log('Alpaca WebSocket closed');\n this.authenticated = false;\n this.currentHandlers?.onDisconnect?.();\n this.attemptReconnect();\n };\n } catch (error) {\n console.error('Failed to create WebSocket:', error);\n this.currentHandlers?.onError?.(\n error instanceof Error ? error : new Error('Failed to create WebSocket')\n );\n }\n }\n\n private authenticate(): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) return;\n\n const authMessage = {\n action: 'auth',\n key: this.apiKey,\n secret: this.secretKey,\n };\n\n this.ws.send(JSON.stringify(authMessage));\n }\n\n private subscribe(): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN || !this.currentSymbol) return;\n\n const subscribeMessage = {\n action: 'subscribe',\n trades: [this.currentSymbol],\n bars: [this.currentSymbol],\n };\n\n this.ws.send(JSON.stringify(subscribeMessage));\n console.log(`Subscribed to ${this.currentSymbol}`);\n }\n\n private handleMessage(data: string): void {\n try {\n const messages = JSON.parse(data);\n\n if (!Array.isArray(messages)) {\n console.warn('Unexpected message format:', messages);\n return;\n }\n\n for (const message of messages) {\n if (message.T === 'success' && message.msg === 'authenticated') {\n console.log('Alpaca WebSocket authenticated');\n this.authenticated = true;\n this.reconnectAttempts = 0;\n this.currentHandlers?.onConnect?.();\n this.subscribe();\n } else if (message.T === 'error') {\n console.error('Alpaca error:', message.msg);\n this.currentHandlers?.onError?.(new Error(message.msg));\n } else if (message.T === 't') {\n this.handleTrade(message as AlpacaTrade);\n } else if (message.T === 'b') {\n this.handleBar(message as AlpacaBar_WS);\n } else if (message.T === 'subscription') {\n console.log('Subscription confirmed:', message);\n }\n }\n } catch (error) {\n console.error('Failed to parse WebSocket message:', error);\n }\n }\n\n private handleTrade(trade: AlpacaTrade): void {\n if (trade.S !== this.currentSymbol) return;\n\n this.currentHandlers?.onTrade?.(trade.p, trade.s);\n }\n\n private handleBar(bar: AlpacaBar_WS): void {\n if (bar.S !== this.currentSymbol) return;\n\n const ohlcvBar: OHLCVBar = {\n timestamp: new Date(bar.t).getTime(),\n open: bar.o,\n high: bar.h,\n low: bar.l,\n close: bar.c,\n volume: bar.v,\n trade_count: bar.n,\n vwap: bar.vw,\n };\n\n this.currentHandlers?.onBar?.(ohlcvBar);\n }\n\n private attemptReconnect(): void {\n if (this.reconnectAttempts >= this.maxReconnectAttempts) {\n console.error('Max reconnection attempts reached');\n this.currentHandlers?.onError?.(new Error('Max reconnection attempts reached'));\n return;\n }\n\n this.reconnectAttempts++;\n const delay = this.reconnectDelay * Math.pow(2, this.reconnectAttempts - 1);\n\n console.log(`Attempting to reconnect in ${delay}ms (attempt ${this.reconnectAttempts})`);\n\n setTimeout(() => {\n if (this.currentSymbol && this.currentHandlers) {\n this.connectWebSocket();\n }\n }, delay);\n }\n\n private disconnect(): void {\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n this.authenticated = false;\n this.currentSymbol = null;\n this.currentHandlers = null;\n this.reconnectAttempts = 0;\n }\n\n private convertAlpacaBars(bars: AlpacaBar[]): OHLCVBar[] {\n return bars.map(bar => ({\n timestamp: new Date(bar.t).getTime(),\n open: bar.o,\n high: bar.h,\n low: bar.l,\n close: bar.c,\n volume: bar.v,\n trade_count: bar.n,\n vwap: bar.vw,\n }));\n }\n}\n","import { OHLCVBar } from '../types/chart';\nimport {\n BarDataAdapter,\n HistoricalDataParams,\n RealtimeHandlers,\n RealtimeSubscription,\n} from './types';\n\nexport class MockAdapter implements BarDataAdapter {\n private intervalId: number | null = null;\n\n async fetchHistoricalBars(params: HistoricalDataParams): Promise<OHLCVBar[]> {\n const { limit = 100, before } = params;\n\n await new Promise(resolve => setTimeout(resolve, 800));\n\n const bars: OHLCVBar[] = [];\n const now = before || Date.now();\n let price = 100;\n\n for (let i = limit - 1; i >= 0; i--) {\n const timestamp = now - i * 300000;\n const change = (Math.random() - 0.5) * 2;\n price = Math.max(price + change, 1);\n\n const open = price;\n const close = price + (Math.random() - 0.5) * 1.5;\n const high = Math.max(open, close) + Math.random() * 0.5;\n const low = Math.min(open, close) - Math.random() * 0.5;\n\n bars.push({\n timestamp,\n open: Math.max(open, 0.01),\n high: Math.max(high, 0.01),\n low: Math.max(low, 0.01),\n close: Math.max(close, 0.01),\n volume: Math.floor(Math.random() * 10000) + 1000,\n });\n\n price = Math.max(close, 1);\n }\n\n console.log(`MockAdapter: Generated ${bars.length} bars (before: ${before})`);\n console.log('First bar:', bars[0]);\n console.log('Last bar:', bars[bars.length - 1]);\n\n return bars;\n }\n\n subscribeRealtime(symbol: string, handlers: RealtimeHandlers): RealtimeSubscription {\n handlers.onConnect?.();\n\n let lastPrice = 100;\n\n this.intervalId = window.setInterval(() => {\n const now = Date.now();\n const timestamp = Math.floor(now / 300000) * 300000;\n\n const change = (Math.random() - 0.5) * 2;\n lastPrice = Math.max(lastPrice + change, 1);\n\n const open = lastPrice;\n const close = lastPrice + (Math.random() - 0.5) * 1.5;\n const high = Math.max(open, close) + Math.random() * 0.5;\n const low = Math.min(open, close) - Math.random() * 0.5;\n\n const bar: OHLCVBar = {\n timestamp,\n open,\n high,\n low,\n close,\n volume: Math.floor(Math.random() * 10000) + 1000,\n };\n\n handlers.onBar?.(bar);\n lastPrice = close;\n }, 5000);\n\n return {\n unsubscribe: () => this.unsubscribeAll(),\n };\n }\n\n unsubscribeAll(): void {\n if (this.intervalId !== null) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/indicators/core/registry.ts","../src/indicators/core/calculator.ts","../src/indicators/primitives/BandsPrimitive.ts","../src/components/trade-markers.ts","../src/components/ChartComponent.tsx","../src/indicators/core/types.ts","../src/components/IndicatorBrowser.tsx","../src/components/IndicatorSettingsForm.tsx","../src/components/SettingsDialog.tsx","../src/hooks/useChartAPI.ts","../src/utils/barUtils.ts","../src/hooks/useBarsData.ts","../src/hooks/useRealtimeUpdates.ts","../src/indicators/core/persistence.ts","../src/indicators/utils/calculations.ts","../src/indicators/registry/sma.ts","../src/indicators/registry/ema.ts","../src/indicators/registry/rsi.ts","../src/indicators/registry/bollinger.ts","../src/indicators/registry/vwap.ts","../src/indicators/registry/stochastic.ts","../src/indicators/registry/obv.ts","../src/indicators/registry/mfi.ts","../src/indicators/registry/forceindex.ts","../src/indicators/registry/atr.ts","../src/indicators/registry/adx.ts","../src/indicators/registry/macd.ts","../src/indicators/registry/psar.ts","../src/indicators/registry/cci.ts","../src/indicators/registry/williamsr.ts","../src/indicators/registry/keltner.ts","../src/indicators/registry/supertrend.ts","../src/indicators/registry/ichimoku.ts","../src/indicators/registry/donchian.ts","../src/indicators/registry/roc.ts","../src/indicators/registry/stochrsi.ts","../src/indicators/registry/wma.ts","../src/indicators/registry/index.ts","../src/adapters/alpaca.ts","../src/adapters/mock.ts"],"names":["b","timeScale","IndicatorCategory","ChartSeriesType","useState","jsx","jsxs","useEffect","X","options","useRef","useCallback","appendBar","updateCurrentBar","prependBars","error","lastBar"],"mappings":"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","file":"index.js","sourcesContent":["import {\n IndicatorDefinition,\n IndicatorInstance,\n IndicatorCategory,\n IndicatorMetadata,\n} from './types';\n\nclass IndicatorRegistry {\n private indicators: Map<string, IndicatorDefinition> = new Map();\n private instanceCounters: Map<string, number> = new Map();\n\n register(definition: IndicatorDefinition): void {\n if (this.indicators.has(definition.metadata.id)) {\n console.warn(\n `Indicator with id \"${definition.metadata.id}\" is already registered. Overwriting.`\n );\n }\n this.indicators.set(definition.metadata.id, definition);\n }\n\n unregister(id: string): boolean {\n return this.indicators.delete(id);\n }\n\n get(id: string): IndicatorDefinition | undefined {\n return this.indicators.get(id);\n }\n\n getAll(): IndicatorDefinition[] {\n return Array.from(this.indicators.values());\n }\n\n getByCategory(category: IndicatorCategory): IndicatorDefinition[] {\n return this.getAll().filter(\n (indicator) => indicator.metadata.category === category\n );\n }\n\n search(query: string): IndicatorDefinition[] {\n const lowerQuery = query.toLowerCase();\n return this.getAll().filter(\n (indicator) =>\n indicator.metadata.name.toLowerCase().includes(lowerQuery) ||\n indicator.metadata.description.toLowerCase().includes(lowerQuery)\n );\n }\n\n createInstance(definitionId: string, customSettings?: Record<string, any>): IndicatorInstance {\n const definition = this.get(definitionId);\n if (!definition) {\n throw new Error(`Indicator definition \"${definitionId}\" not found`);\n }\n\n const currentCount = this.instanceCounters.get(definitionId) || 0;\n const newCount = currentCount + 1;\n this.instanceCounters.set(definitionId, newCount);\n\n const instanceId = `${definitionId}-${newCount}`;\n\n const defaultSettings: Record<string, any> = {};\n Object.entries(definition.settings).forEach(([key, field]) => {\n defaultSettings[key] = field.defaultValue;\n });\n\n const settings = { ...defaultSettings, ...customSettings };\n\n return {\n id: instanceId,\n definitionId,\n name: `${definition.metadata.name}(${newCount})`,\n settings,\n };\n }\n\n validateSettings(definitionId: string, settings: Record<string, any>): boolean {\n const definition = this.get(definitionId);\n if (!definition) {\n return false;\n }\n\n for (const [key, field] of Object.entries(definition.settings)) {\n const value = settings[key];\n\n if (value === undefined) {\n return false;\n }\n\n if (field.type === 'number') {\n if (typeof value !== 'number') return false;\n if (field.min !== undefined && value < field.min) return false;\n if (field.max !== undefined && value > field.max) return false;\n } else if (field.type === 'boolean') {\n if (typeof value !== 'boolean') return false;\n } else if (field.type === 'color' || field.type === 'lineStyle') {\n if (typeof value !== 'string') return false;\n } else if (field.type === 'select') {\n if (typeof value !== 'string') return false;\n if (field.options && !field.options.some(opt => opt.value === value)) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n getMetadataList(): IndicatorMetadata[] {\n return this.getAll().map((indicator) => indicator.metadata);\n }\n\n clear(): void {\n this.indicators.clear();\n this.instanceCounters.clear();\n }\n}\n\nexport const indicatorRegistry = new IndicatorRegistry();\n","import { OHLCVBar } from '../../types/chart';\nimport { IndicatorInstance, IndicatorOutput } from './types';\nimport { indicatorRegistry } from './registry';\n\ninterface CacheEntry {\n data: IndicatorOutput[];\n settingsHash: string;\n dataLength: number;\n}\n\nclass IndicatorCalculator {\n private cache: Map<string, CacheEntry> = new Map();\n\n private hashSettings(settings: Record<string, any>): string {\n return JSON.stringify(settings);\n }\n\n calculate(\n instance: IndicatorInstance,\n bars: OHLCVBar[]\n ): IndicatorOutput[] {\n const definition = indicatorRegistry.get(instance.definitionId);\n if (!definition) {\n console.error(\n `Indicator definition \"${instance.definitionId}\" not found`\n );\n return [];\n }\n\n const settingsHash = this.hashSettings(instance.settings);\n const cacheKey = instance.id;\n const cached = this.cache.get(cacheKey);\n\n if (\n cached &&\n cached.settingsHash === settingsHash &&\n cached.dataLength === bars.length\n ) {\n return cached.data;\n }\n\n try {\n const data = definition.calculate(bars, instance.settings);\n\n this.cache.set(cacheKey, {\n data,\n settingsHash,\n dataLength: bars.length,\n });\n\n return data;\n } catch (error) {\n console.error(\n `Error calculating indicator \"${instance.definitionId}\":`,\n error\n );\n return [];\n }\n }\n\n invalidateCache(instanceId?: string): void {\n if (instanceId) {\n this.cache.delete(instanceId);\n } else {\n this.cache.clear();\n }\n }\n\n getCacheSize(): number {\n return this.cache.size;\n }\n}\n\nexport const indicatorCalculator = new IndicatorCalculator();\n","import {\n ISeriesApi,\n ISeriesPrimitive,\n SeriesAttachedParameter,\n Time,\n IChartApi,\n} from 'lightweight-charts';\n\nexport interface BandsPrimitiveOptions {\n upperSeries: ISeriesApi<'Line'>;\n lowerSeries: ISeriesApi<'Line'>;\n fillColor: string;\n}\n\ninterface BandPoint {\n x: number;\n y1: number;\n y2: number;\n}\n\ninterface BandData {\n points: BandPoint[];\n color: string;\n}\n\nclass AreaBetweenLinesPaneView {\n private _source: BandsPrimitive;\n private _data: BandData | null = null;\n\n constructor(source: BandsPrimitive) {\n this._source = source;\n }\n\n update() {\n const series1 = this._source._upperSeries;\n const series2 = this._source._lowerSeries;\n const chart = this._source._chart;\n\n if (!series1 || !series2 || !chart) return;\n\n const timeScale = chart.timeScale();\n\n const data1 = series1.data() as any[];\n const data2 = series2.data() as any[];\n\n const points: BandPoint[] = [];\n\n let i = 0;\n let j = 0;\n\n while (i < data1.length && j < data2.length) {\n const d1 = data1[i];\n const d2 = data2[j];\n\n if (d1.time < d2.time) {\n i++;\n } else if (d1.time > d2.time) {\n j++;\n } else {\n const x = timeScale.timeToCoordinate(d1.time);\n const y1 = series1.priceToCoordinate(d1.value);\n const y2 = series2.priceToCoordinate(d2.value);\n\n if (x !== null && y1 !== null && y2 !== null) {\n points.push({ x, y1, y2 });\n }\n i++;\n j++;\n }\n }\n\n this._data = {\n points,\n color: this._source._options.fillColor || 'rgba(59, 130, 246, 0.1)',\n };\n }\n\n renderer() {\n return new AreaBetweenLinesRenderer(this._data);\n }\n}\n\nclass AreaBetweenLinesRenderer {\n private _data: BandData | null;\n\n constructor(data: BandData | null) {\n this._data = data;\n }\n\n draw(target: any) {\n target.useBitmapCoordinateSpace((scope: any) => {\n if (!this._data || this._data.points.length === 0) return;\n\n const ctx = scope.context;\n ctx.save();\n ctx.scale(scope.horizontalPixelRatio, scope.verticalPixelRatio);\n\n const points = this._data.points;\n\n ctx.beginPath();\n\n ctx.moveTo(points[0].x, points[0].y1);\n\n for (let i = 1; i < points.length; i++) {\n ctx.lineTo(points[i].x, points[i].y1);\n }\n\n for (let i = points.length - 1; i >= 0; i--) {\n ctx.lineTo(points[i].x, points[i].y2);\n }\n\n ctx.closePath();\n\n ctx.fillStyle = this._data.color;\n ctx.fill();\n\n ctx.restore();\n });\n }\n\n drawBackground(target: any) {\n this.draw(target);\n }\n}\n\nexport class BandsPrimitive implements ISeriesPrimitive<Time> {\n _options: BandsPrimitiveOptions;\n _upperSeries: ISeriesApi<'Line'>;\n _lowerSeries: ISeriesApi<'Line'>;\n _chart: IChartApi | null = null;\n _series: ISeriesApi<'Line'> | null = null;\n private _paneViews: AreaBetweenLinesPaneView[];\n\n constructor(options: BandsPrimitiveOptions) {\n this._options = options;\n this._upperSeries = options.upperSeries;\n this._lowerSeries = options.lowerSeries;\n this._paneViews = [new AreaBetweenLinesPaneView(this)];\n }\n\n attached(param: SeriesAttachedParameter<Time>): void {\n this._chart = param.chart;\n this._series = param.series as ISeriesApi<'Line'>;\n }\n\n detached(): void {\n this._chart = null;\n this._series = null;\n }\n\n paneViews() {\n return this._paneViews;\n }\n\n updateAllViews(): void {\n this._paneViews.forEach((pw) => pw.update());\n }\n}\n","import type { SeriesMarker, Time } from 'lightweight-charts';\nimport type { ChartTrade } from '../types/chart';\n\nconst WIN = '#10b981';\nconst LOSS = '#ef4444';\nconst SEL = '#3b82f6'; // selected emphasis\n\n/** Pure: build the entry+exit markers for all trades, sorted ascending by time\n * (lightweight-charts requires sorted markers). The selected trade's markers are\n * emphasized (selection color + a text label). */\nexport function buildTradeMarkers(trades: ChartTrade[], selectedTradeId: string | null): SeriesMarker<Time>[] {\n const markers: SeriesMarker<Time>[] = [];\n for (const t of trades) {\n const selected = t.id === selectedTradeId;\n const base = t.outcome === 'win' ? WIN : LOSS;\n const color = selected ? SEL : base;\n markers.push({\n time: (t.entryTime / 1000) as Time,\n position: 'belowBar', shape: 'arrowUp', color,\n text: selected ? `${t.outcome === 'win' ? '+' : ''}entry` : '',\n });\n markers.push({\n time: (t.exitTime / 1000) as Time,\n position: 'aboveBar', shape: 'arrowDown', color,\n text: selected ? 'exit' : '',\n });\n }\n markers.sort((a, b) => (a.time as number) - (b.time as number));\n return markers;\n}\n","import { useEffect, useRef, useState, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport {\n createChart,\n createSeriesMarkers,\n IChartApi,\n ISeriesApi,\n CandlestickData,\n Time,\n LineData,\n HistogramData,\n IPriceLine,\n LineStyle,\n LineWidth,\n ColorType,\n CandlestickSeries,\n HistogramSeries,\n LineSeries,\n AreaSeries,\n SeriesMarker,\n} from 'lightweight-charts';\nimport { OHLCVBar, ChartLine, ChartTrade } from '../types/chart';\nimport { IndicatorInstance } from '../indicators/core/types';\nimport { indicatorRegistry } from '../indicators/core/registry';\nimport { indicatorCalculator } from '../indicators/core/calculator';\nimport { BandsPrimitive } from '../indicators/primitives/BandsPrimitive';\nimport { buildTradeMarkers } from './trade-markers';\n\ninterface ChartComponentProps {\n bars: OHLCVBar[];\n onLoadMoreData?: (oldestTimestamp: number) => void;\n indicators?: IndicatorInstance[];\n lines?: ChartLine[];\n onBarUpdate?: (updatedBar: OHLCVBar) => void;\n onNewBar?: (newBar: OHLCVBar) => void;\n onDeleteLine?: (lineId: string) => void;\n onAddLine?: (type: 'entry' | 'stopLoss' | 'takeProfit' | 'support' | 'resistance', price: number) => void;\n onClearAllLines?: () => void;\n enableBarSelection?: boolean;\n onBarClick?: (bar: OHLCVBar | null) => void;\n trades?: ChartTrade[];\n selectedTradeId?: string | null;\n renderTradePopup?: (trade: ChartTrade) => ReactNode;\n /**\n * Fixed chart height in px. When omitted, the chart fills its container's\n * height (observed via ResizeObserver) instead of a fixed default — so a\n * flex/percent-sized parent gets a full-height chart.\n */\n height?: number;\n /**\n * When set, recenter the time scale on this trade (by id) so it scrolls into\n * view. Pairs with `selectedTradeId` to drive both selection and focus.\n */\n focusTradeId?: string | null;\n}\n\nexport default function ChartComponent({\n bars,\n onLoadMoreData,\n indicators = [],\n lines = [],\n onBarUpdate,\n onNewBar,\n onDeleteLine,\n onAddLine,\n onClearAllLines,\n enableBarSelection = true,\n onBarClick,\n trades = [],\n selectedTradeId = null,\n renderTradePopup,\n height,\n focusTradeId = null,\n}: ChartComponentProps) {\n const chartContainerRef = useRef<HTMLDivElement>(null);\n const chartRef = useRef<IChartApi | null>(null);\n const candlestickSeriesRef = useRef<ISeriesApi<'Candlestick'> | null>(null);\n const volumeSeriesRef = useRef<ISeriesApi<'Histogram'> | null>(null);\n const indicatorSeriesRef = useRef<Map<string, ISeriesApi<any>>>(new Map());\n const indicatorPaneIndexRef = useRef<Map<string, number>>(new Map());\n const nextPaneIndexRef = useRef<number>(2);\n const priceLineRefs = useRef<Map<string, IPriceLine>>(new Map());\n const seriesMarkersRef = useRef<any>(null);\n const [isLoadingMore, setIsLoadingMore] = useState(false);\n const [contextMenu, setContextMenu] = useState<{ x: number; y: number; price: number } | null>(null);\n const [linePositions, setLinePositions] = useState<Map<string, { top: number; right: number }>>(new Map());\n const [selectedBar, setSelectedBar] = useState<OHLCVBar | null>(null);\n const selectedBarRef = useRef<OHLCVBar | null>(null);\n const [spotlightPosition, setSpotlightPosition] = useState<{ x: number; width: number } | null>(null);\n const [tradePopupPos, setTradePopupPos] = useState<{ x: number } | null>(null);\n const previousBarsRef = useRef<OHLCVBar[]>([]);\n const previousBarsLengthRef = useRef<number>(0);\n const isLoadingRef = useRef(false);\n const barsRef = useRef<OHLCVBar[]>(bars);\n const isDraggingRef = useRef(false);\n const mouseDownPosRef = useRef<{ x: number; y: number } | null>(null);\n // Latest explicit height (px) or undefined for auto-fill; read inside the\n // create-once effect's resize closure without going stale.\n const heightRef = useRef<number | undefined>(height);\n heightRef.current = height;\n // Line-editing is opt-in: the right-click \"add line\" menu only opens when a\n // consumer wires the add/clear handlers. Read via ref from the create-once\n // contextmenu closure without going stale. (Delete buttons gate on\n // `onDeleteLine` directly at render.)\n const lineEditEnabledRef = useRef(false);\n lineEditEnabledRef.current = Boolean(onAddLine || onClearAllLines);\n\n\n useEffect(() => {\n if (!chartContainerRef.current) return;\n\n chartContainerRef.current.style.position = 'relative';\n\n const chart = createChart(chartContainerRef.current, {\n layout: {\n background: { type: ColorType.Solid, color: '#0f172a' },\n textColor: '#94a3b8',\n panes: {\n enableResize: true,\n separatorColor: '#1e293b',\n separatorHoverColor: 'rgba(148,163,184,0.5)',\n },\n },\n grid: {\n vertLines: { color: '#1e293b' },\n horzLines: { color: '#1e293b' },\n },\n width: chartContainerRef.current.clientWidth,\n // Auto-fill the container's height unless an explicit `height` is given.\n // Fall back to 600 only when the container hasn't been laid out yet (a\n // ResizeObserver below corrects it on first measure).\n height: height ?? (chartContainerRef.current.clientHeight || 600),\n timeScale: {\n timeVisible: true,\n secondsVisible: true,\n borderColor: '#334155',\n },\n rightPriceScale: {\n borderColor: '#334155',\n },\n crosshair: {\n mode: 0,\n vertLine: {\n width: 1,\n color: '#475569',\n style: 3,\n },\n horzLine: {\n width: 1,\n color: '#475569',\n style: 3,\n },\n },\n });\n\n const candlestickSeries = chart.addSeries(CandlestickSeries, {\n upColor: '#10b981',\n downColor: '#ef4444',\n borderVisible: false,\n wickUpColor: '#10b981',\n wickDownColor: '#ef4444',\n }, 0);\n\n const volumeSeries = chart.addSeries(HistogramSeries, {\n color: '#64748b',\n priceFormat: {\n type: 'volume',\n },\n priceScaleId: '',\n }, 1);\n\n chartRef.current = chart;\n candlestickSeriesRef.current = candlestickSeries;\n volumeSeriesRef.current = volumeSeries;\n\n seriesMarkersRef.current = createSeriesMarkers(candlestickSeries, []);\n\n chart.timeScale().subscribeVisibleLogicalRangeChange((logicalRange) => {\n if (logicalRange && logicalRange.from < 5 && !isLoadingRef.current && onLoadMoreData) {\n isLoadingRef.current = true;\n setIsLoadingMore(true);\n previousBarsLengthRef.current = barsRef.current.length;\n const sortedBars = [...barsRef.current].sort((a, b) => a.timestamp - b.timestamp);\n const oldestTimestamp = sortedBars[0]?.timestamp;\n if (oldestTimestamp) {\n onLoadMoreData(oldestTimestamp);\n }\n }\n });\n\n const handleResize = () => {\n if (chartContainerRef.current && chart) {\n const nextHeight = heightRef.current ?? chartContainerRef.current.clientHeight;\n chart.applyOptions({\n width: chartContainerRef.current.clientWidth,\n // Only drive height when auto-filling and the container has a real\n // measured height; otherwise leave the current height untouched.\n ...(heightRef.current === undefined && nextHeight > 0 ? { height: nextHeight } : {}),\n ...(heightRef.current !== undefined ? { height: heightRef.current } : {}),\n });\n }\n };\n\n // A flex/percent-sized parent changes the container without firing window\n // 'resize'; observe the container directly so the chart tracks it.\n const resizeObserver = new ResizeObserver(handleResize);\n resizeObserver.observe(chartContainerRef.current);\n\n const handleContextMenu = (e: MouseEvent) => {\n // No line-editing handlers wired → no custom menu; leave the native\n // context menu alone (read-only charts, e.g. the trades overlay).\n if (!lineEditEnabledRef.current) return;\n e.preventDefault();\n e.stopPropagation();\n\n if (!candlestickSeriesRef.current) {\n return;\n }\n\n const rect = chartContainerRef.current!.getBoundingClientRect();\n const y = e.clientY - rect.top;\n\n const price = candlestickSeriesRef.current.coordinateToPrice(y);\n\n if (price !== null) {\n setContextMenu({\n x: e.clientX - rect.left,\n y: y,\n price: price as number,\n });\n }\n };\n\n const handleMouseDown = (e: MouseEvent) => {\n mouseDownPosRef.current = { x: e.clientX, y: e.clientY };\n isDraggingRef.current = false;\n };\n\n const handleMouseMove = (e: MouseEvent) => {\n if (mouseDownPosRef.current) {\n const dx = Math.abs(e.clientX - mouseDownPosRef.current.x);\n const dy = Math.abs(e.clientY - mouseDownPosRef.current.y);\n if (dx > 5 || dy > 5) {\n isDraggingRef.current = true;\n }\n }\n };\n\n const handleMouseUp = () => {\n mouseDownPosRef.current = null;\n };\n\n const handleClick = (e: MouseEvent) => {\n setContextMenu(null);\n\n if (isDraggingRef.current) {\n isDraggingRef.current = false;\n return;\n }\n\n\n if (!enableBarSelection) {\n return;\n }\n\n if (!chartRef.current) {\n return;\n }\n\n if (!candlestickSeriesRef.current) {\n return;\n }\n\n\n const rect = chartContainerRef.current!.getBoundingClientRect();\n const x = e.clientX - rect.left;\n\n const timeScale = chartRef.current.timeScale();\n const coordinate = timeScale.coordinateToTime(x);\n\n if (!coordinate) {\n return;\n }\n\n const clickedTime = coordinate as number;\n\n const clickedBar = barsRef.current.find(bar => {\n const diff = Math.abs((bar.timestamp / 1000) - clickedTime);\n return diff < 300;\n });\n\n if (clickedBar) {\n\n if (selectedBarRef.current && selectedBarRef.current.timestamp === clickedBar.timestamp) {\n selectedBarRef.current = null;\n setSelectedBar(null);\n setSpotlightPosition(null);\n if (onBarClick) {\n onBarClick(null);\n }\n } else {\n selectedBarRef.current = clickedBar;\n setSelectedBar(clickedBar);\n const barX = timeScale.timeToCoordinate((clickedBar.timestamp / 1000) as Time);\n if (barX !== null) {\n const barWidth = Math.max(8, rect.width / barsRef.current.length);\n setSpotlightPosition({ x: barX - barWidth / 2, width: barWidth });\n }\n if (onBarClick) {\n onBarClick(clickedBar);\n }\n }\n } else {\n }\n };\n\n window.addEventListener('resize', handleResize);\n chartContainerRef.current.addEventListener('contextmenu', handleContextMenu, true);\n chartContainerRef.current.addEventListener('mousedown', handleMouseDown, true);\n chartContainerRef.current.addEventListener('mousemove', handleMouseMove, true);\n chartContainerRef.current.addEventListener('mouseup', handleMouseUp, true);\n chartContainerRef.current.addEventListener('click', handleClick, true);\n\n const container = chartContainerRef.current;\n\n return () => {\n window.removeEventListener('resize', handleResize);\n resizeObserver.disconnect();\n container.removeEventListener('contextmenu', handleContextMenu, true);\n container.removeEventListener('mousedown', handleMouseDown, true);\n container.removeEventListener('mousemove', handleMouseMove, true);\n container.removeEventListener('mouseup', handleMouseUp, true);\n container.removeEventListener('click', handleClick, true);\n chart.remove();\n };\n }, []);\n\n useEffect(() => {\n barsRef.current = bars;\n }, [bars]);\n\n // Apply an explicit `height` prop change (the create-once effect can't).\n useEffect(() => {\n if (chartRef.current && height !== undefined) {\n chartRef.current.applyOptions({ height });\n }\n }, [height]);\n\n // Recenter the time scale on `focusTradeId` so the trade scrolls into view.\n // Re-runs when the focus target or the loaded bars change (the bars covering\n // the trade may arrive after selection), then frames [entry, exit] with pad.\n // The range is applied on the next animation frame so it lands AFTER the\n // sibling bars→setData effect (which would otherwise snap the view back).\n useEffect(() => {\n if (!chartRef.current || !focusTradeId) return;\n const trade = trades.find((t) => t.id === focusTradeId);\n if (!trade) return;\n // Frame by LOGICAL (bar-index) range, not time: lazy-loading a far-off trade\n // leaves a big gap between bar clusters, and a time-based setVisibleRange\n // won't reliably land on the far cluster. Build the same ascending, deduped\n // order candlekit feeds to setData so indices line up, then frame the trade.\n const seen = new Set<number>();\n const series: number[] = [];\n for (const b of [...bars].sort((a, b) => a.timestamp - b.timestamp)) {\n if (seen.has(b.timestamp)) continue;\n seen.add(b.timestamp);\n series.push(b.timestamp);\n }\n if (series.length === 0) return;\n // First bar index at/after a target ms (binary search; series is ascending).\n const nearestIdx = (ms: number) => {\n let lo = 0;\n let hi = series.length - 1;\n let idx = series.length - 1;\n while (lo <= hi) {\n const mid = (lo + hi) >> 1;\n if (series[mid] >= ms) {\n idx = mid;\n hi = mid - 1;\n } else {\n lo = mid + 1;\n }\n }\n return idx;\n };\n const entryIdx = nearestIdx(trade.entryTime);\n const exitIdx = Math.max(entryIdx, nearestIdx(trade.exitTime));\n const PAD = 15;\n const raf = requestAnimationFrame(() => {\n try {\n chartRef.current?.timeScale().setVisibleLogicalRange({\n from: entryIdx - PAD,\n to: exitIdx + PAD,\n });\n } catch {\n /* bars not yet present; a later bars update re-runs this */\n }\n });\n return () => cancelAnimationFrame(raf);\n }, [focusTradeId, trades, bars]);\n\n useEffect(() => {\n if (!candlestickSeriesRef.current || !volumeSeriesRef.current) return;\n\n const sortedBars = [...bars].sort((a, b) => a.timestamp - b.timestamp);\n\n const uniqueBars = sortedBars.reduce((acc, bar) => {\n const exists = acc.find(b => b.timestamp === bar.timestamp);\n if (!exists) {\n acc.push(bar);\n }\n return acc;\n }, [] as OHLCVBar[]);\n\n\n const previousBars = previousBarsRef.current;\n const isInitialLoad = previousBars.length === 0;\n const hasNewBars = uniqueBars.length > previousBars.length;\n const lastBarChanged = uniqueBars.length > 0 && previousBars.length > 0 &&\n (uniqueBars[uniqueBars.length - 1].timestamp === previousBars[previousBars.length - 1].timestamp);\n\n\n if (isLoadingRef.current && uniqueBars.length > previousBarsLengthRef.current) {\n isLoadingRef.current = false;\n setIsLoadingMore(false);\n }\n\n if (isInitialLoad || hasNewBars) {\n const candleData: CandlestickData[] = uniqueBars.map((bar) => ({\n time: (bar.timestamp / 1000) as Time,\n open: bar.open,\n high: bar.high,\n low: bar.low,\n close: bar.close,\n }));\n\n const volumeData: HistogramData[] = uniqueBars.map((bar) => ({\n time: (bar.timestamp / 1000) as Time,\n value: bar.volume,\n color: bar.close >= bar.open ? '#10b98180' : '#ef444480',\n }));\n\n candlestickSeriesRef.current.setData(candleData);\n volumeSeriesRef.current.setData(volumeData);\n } else if (lastBarChanged && uniqueBars.length > 0 && !hasNewBars) {\n const lastBar = uniqueBars[uniqueBars.length - 1];\n const candleUpdate: CandlestickData = {\n time: (lastBar.timestamp / 1000) as Time,\n open: lastBar.open,\n high: lastBar.high,\n low: lastBar.low,\n close: lastBar.close,\n };\n\n const volumeUpdate: HistogramData = {\n time: (lastBar.timestamp / 1000) as Time,\n value: lastBar.volume,\n color: lastBar.close >= lastBar.open ? '#10b98180' : '#ef444480',\n };\n\n candlestickSeriesRef.current.update(candleUpdate);\n volumeSeriesRef.current.update(volumeUpdate);\n }\n\n previousBarsRef.current = uniqueBars;\n }, [bars]);\n\n useEffect(() => {\n if (!chartRef.current || !candlestickSeriesRef.current) return;\n\n priceLineRefs.current.forEach((priceLine) => {\n candlestickSeriesRef.current?.removePriceLine(priceLine);\n });\n priceLineRefs.current.clear();\n\n lines.forEach((line) => {\n const priceLine = candlestickSeriesRef.current?.createPriceLine({\n price: line.price,\n color: line.color,\n lineWidth: (line.lineWidth || 2) as LineWidth,\n lineStyle: getLineStyle(line.lineStyle),\n axisLabelVisible: true,\n title: line.title || '',\n });\n\n if (priceLine) {\n priceLineRefs.current.set(line.id, priceLine);\n }\n });\n\n requestAnimationFrame(() => {\n if (!candlestickSeriesRef.current || !chartContainerRef.current) return;\n const rect = chartContainerRef.current.getBoundingClientRect();\n const newPositions = new Map<string, { top: number; right: number }>();\n lines.forEach((line) => {\n const y = candlestickSeriesRef.current?.priceToCoordinate(line.price);\n if (y !== null && y !== undefined) {\n newPositions.set(line.id, {\n top: rect.top + y,\n right: window.innerWidth - rect.right + 68 + estimateLabelTitleWidth(line.title),\n });\n }\n });\n setLinePositions(newPositions);\n });\n }, [lines]);\n\n useEffect(() => {\n if (!chartRef.current || !candlestickSeriesRef.current) return;\n\n const updatePositions = () => {\n if (!candlestickSeriesRef.current || !chartContainerRef.current) return;\n const rect = chartContainerRef.current.getBoundingClientRect();\n const newPositions = new Map<string, { top: number; right: number }>();\n lines.forEach((line) => {\n const y = candlestickSeriesRef.current?.priceToCoordinate(line.price);\n if (y !== null && y !== undefined) {\n newPositions.set(line.id, {\n top: rect.top + y,\n right: window.innerWidth - rect.right + 68 + estimateLabelTitleWidth(line.title),\n });\n }\n });\n setLinePositions(newPositions);\n };\n\n chartRef.current.timeScale().subscribeVisibleLogicalRangeChange(updatePositions);\n window.addEventListener('scroll', updatePositions, { passive: true });\n window.addEventListener('resize', updatePositions);\n\n return () => {\n chartRef.current?.timeScale().unsubscribeVisibleLogicalRangeChange(updatePositions);\n window.removeEventListener('scroll', updatePositions);\n window.removeEventListener('resize', updatePositions);\n };\n }, [lines]);\n\n useEffect(() => {\n if (!chartRef.current) return;\n\n indicatorSeriesRef.current.forEach((series) => {\n chartRef.current?.removeSeries(series);\n });\n indicatorSeriesRef.current.clear();\n indicatorPaneIndexRef.current.clear();\n nextPaneIndexRef.current = 2;\n\n indicators.forEach((indicator) => {\n const definition = indicatorRegistry.get(indicator.definitionId);\n if (!definition) return;\n\n const data = indicatorCalculator.calculate(indicator, barsRef.current);\n if (!data || data.length === 0) return;\n\n const seriesType = definition.renderConfig.seriesType;\n const isOverlay = definition.renderConfig.overlay !== false;\n const paneIndex = isOverlay ? 0 : nextPaneIndexRef.current;\n\n if (!isOverlay) {\n indicatorPaneIndexRef.current.set(indicator.id, paneIndex);\n nextPaneIndexRef.current++;\n }\n\n if (seriesType === 'line') {\n if (definition.renderConfig.outputCount === 1) {\n const series = chartRef.current!.addSeries(LineSeries, {\n color: indicator.settings.color || '#3b82f6',\n lineWidth: indicator.settings.lineWidth || 2,\n title: indicator.name,\n }, paneIndex);\n const lineData = data.map(d => ({ time: d.time as Time, value: d.value }));\n series.setData(lineData as LineData[]);\n indicatorSeriesRef.current.set(indicator.id, series);\n } else if (definition.renderConfig.hasBandFill && definition.renderConfig.fillBands) {\n const { upper: upperField, lower: lowerField } = definition.renderConfig.fillBands;\n\n const upperSeries = chartRef.current!.addSeries(LineSeries, {\n color: indicator.settings.upperColor || '#ef4444',\n lineWidth: indicator.settings.lineWidth || 2,\n title: `${indicator.name} Upper`,\n }, paneIndex);\n const middleSeries = chartRef.current!.addSeries(LineSeries, {\n color: indicator.settings.middleColor || indicator.settings.vwapColor || '#3b82f6',\n lineWidth: indicator.settings.lineWidth || 2,\n title: `${indicator.name} Middle`,\n }, paneIndex);\n const lowerSeries = chartRef.current!.addSeries(LineSeries, {\n color: indicator.settings.lowerColor || '#10b981',\n lineWidth: indicator.settings.lineWidth || 2,\n title: `${indicator.name} Lower`,\n }, paneIndex);\n\n const upperData = data.map(d => ({ time: d.time as Time, value: d[upperField] })).filter(d => !isNaN(d.value));\n const middleData = data.map(d => ({ time: d.time as Time, value: d.value })).filter(d => !isNaN(d.value));\n const lowerData = data.map(d => ({ time: d.time as Time, value: d[lowerField] })).filter(d => !isNaN(d.value));\n\n upperSeries.setData(upperData as LineData[]);\n middleSeries.setData(middleData as LineData[]);\n lowerSeries.setData(lowerData as LineData[]);\n\n if (indicator.settings.showFill !== false) {\n const bandsPrimitive = new BandsPrimitive({\n upperSeries: upperSeries,\n lowerSeries: lowerSeries,\n fillColor: indicator.settings.fillColor || 'rgba(59, 130, 246, 0.1)',\n });\n upperSeries.attachPrimitive(bandsPrimitive);\n }\n\n indicatorSeriesRef.current.set(`${indicator.id}-upper`, upperSeries);\n indicatorSeriesRef.current.set(`${indicator.id}-middle`, middleSeries);\n indicatorSeriesRef.current.set(`${indicator.id}-lower`, lowerSeries);\n }\n } else if (seriesType === 'histogram') {\n const series = chartRef.current!.addSeries(HistogramSeries, {\n color: indicator.settings.color || '#8b5cf6',\n title: indicator.name,\n }, paneIndex);\n const histData = data.map(d => ({ time: d.time as Time, value: d.value }));\n series.setData(histData as HistogramData[]);\n indicatorSeriesRef.current.set(indicator.id, series);\n } else if (seriesType === 'area') {\n const series = chartRef.current!.addSeries(AreaSeries, {\n topColor: indicator.settings.topColor || '#3b82f680',\n bottomColor: indicator.settings.bottomColor || '#3b82f600',\n lineColor: indicator.settings.lineColor || '#3b82f6',\n lineWidth: indicator.settings.lineWidth || 2,\n title: indicator.name,\n }, paneIndex);\n const areaData = data.map(d => ({ time: d.time as Time, value: d.value }));\n series.setData(areaData as LineData[]);\n indicatorSeriesRef.current.set(indicator.id, series);\n }\n });\n }, [indicators]);\n\n useEffect(() => {\n if (!chartRef.current || indicators.length === 0) return;\n\n indicators.forEach((indicator) => {\n const definition = indicatorRegistry.get(indicator.definitionId);\n if (!definition) return;\n\n const data = indicatorCalculator.calculate(indicator, barsRef.current);\n if (!data || data.length === 0) return;\n\n if (definition.renderConfig.outputCount === 1) {\n const series = indicatorSeriesRef.current.get(indicator.id);\n if (series) {\n const lineData = data.map(d => ({ time: d.time as Time, value: d.value }));\n series.setData(lineData as any);\n }\n } else if (definition.renderConfig.hasBandFill && definition.renderConfig.fillBands) {\n const { upper: upperField, lower: lowerField } = definition.renderConfig.fillBands;\n\n const upperSeries = indicatorSeriesRef.current.get(`${indicator.id}-upper`);\n const middleSeries = indicatorSeriesRef.current.get(`${indicator.id}-middle`);\n const lowerSeries = indicatorSeriesRef.current.get(`${indicator.id}-lower`);\n\n if (upperSeries && middleSeries && lowerSeries) {\n const upperData = data.map(d => ({ time: d.time as Time, value: d[upperField] })).filter(d => !isNaN(d.value));\n const middleData = data.map(d => ({ time: d.time as Time, value: d.value })).filter(d => !isNaN(d.value));\n const lowerData = data.map(d => ({ time: d.time as Time, value: d[lowerField] })).filter(d => !isNaN(d.value));\n\n upperSeries.setData(upperData as any);\n middleSeries.setData(middleData as any);\n lowerSeries.setData(lowerData as any);\n }\n }\n });\n }, [bars, indicators]);\n\n useEffect(() => {\n if (!seriesMarkersRef.current) return;\n const tradeMarkers = buildTradeMarkers(trades, selectedTradeId);\n const selectionMarker: SeriesMarker<Time>[] =\n enableBarSelection && selectedBar\n ? [\n {\n time: (selectedBar.timestamp / 1000) as Time,\n position: 'aboveBar' as const,\n color: '#3b82f6',\n shape: 'circle' as const,\n text: '',\n },\n ]\n : [];\n const all = [...tradeMarkers, ...selectionMarker].sort(\n (a, b) => (a.time as number) - (b.time as number),\n );\n seriesMarkersRef.current.setMarkers(all);\n }, [trades, selectedTradeId, selectedBar, enableBarSelection]);\n\n useEffect(() => {\n if (!chartRef.current || !selectedBar || !enableBarSelection) {\n setSpotlightPosition(null);\n return;\n }\n\n const updateSpotlightPosition = () => {\n if (!chartRef.current || !selectedBar || !chartContainerRef.current) return;\n\n const timeScale = chartRef.current.timeScale();\n const barX = timeScale.timeToCoordinate((selectedBar.timestamp / 1000) as Time);\n\n if (barX !== null) {\n const rect = chartContainerRef.current.getBoundingClientRect();\n const barWidth = Math.max(8, rect.width / bars.length);\n setSpotlightPosition({ x: barX - barWidth / 2, width: barWidth });\n }\n };\n\n updateSpotlightPosition();\n\n const timeScale = chartRef.current.timeScale();\n timeScale.subscribeVisibleLogicalRangeChange(updateSpotlightPosition);\n\n return () => {\n if (chartRef.current) {\n chartRef.current.timeScale().unsubscribeVisibleLogicalRangeChange(updateSpotlightPosition);\n }\n };\n }, [selectedBar, enableBarSelection, bars.length]);\n\n const selectedTrade = trades.find((t) => t.id === selectedTradeId) ?? null;\n\n useEffect(() => {\n if (!chartRef.current || !selectedTrade) {\n setTradePopupPos(null);\n return;\n }\n\n const updateTradePopupPos = () => {\n if (!chartRef.current || !selectedTrade || !chartContainerRef.current) return;\n const timeScale = chartRef.current.timeScale();\n const x = timeScale.timeToCoordinate((selectedTrade.entryTime / 1000) as Time);\n // Hide when the bar is off-screen: timeToCoordinate returns null once it leaves the\n // logical range, but a bar just past the edge returns an out-of-bounds coordinate —\n // bound to [0, width] so the popup never peeks regardless of container overflow.\n const width = chartContainerRef.current.getBoundingClientRect().width;\n setTradePopupPos(x !== null && x >= 0 && x <= width ? { x } : null);\n };\n\n updateTradePopupPos();\n const timeScale = chartRef.current.timeScale();\n timeScale.subscribeVisibleLogicalRangeChange(updateTradePopupPos);\n return () => {\n if (chartRef.current) {\n chartRef.current.timeScale().unsubscribeVisibleLogicalRangeChange(updateTradePopupPos);\n }\n };\n }, [selectedTrade, selectedTrade?.entryTime]);\n\n const handleDeleteLine = (lineId: string) => {\n if (onDeleteLine) {\n onDeleteLine(lineId);\n }\n };\n\n const handleAddLineFromContext = (type: 'entry' | 'stopLoss' | 'takeProfit' | 'support' | 'resistance') => {\n if (onAddLine && contextMenu) {\n onAddLine(type, contextMenu.price);\n setContextMenu(null);\n }\n };\n\n const handleClearAllLines = () => {\n if (onClearAllLines) {\n onClearAllLines();\n setContextMenu(null);\n }\n };\n\n return (\n <div className=\"relative space-y-4\">\n {isLoadingMore && (\n <div className=\"absolute top-4 left-1/2 transform -translate-x-1/2 bg-slate-800 text-slate-200 px-4 py-2 rounded-lg shadow-lg z-10\">\n Loading more data...\n </div>\n )}\n <div className=\"relative\">\n <div ref={chartContainerRef} className=\"w-full\" />\n\n {enableBarSelection && spotlightPosition && (\n <div\n className=\"absolute top-0 bottom-0 pointer-events-none z-5\"\n style={{\n left: `${spotlightPosition.x}px`,\n width: `${spotlightPosition.width}px`,\n background: 'rgba(59, 130, 246, 0.15)',\n borderLeft: '1px solid rgba(59, 130, 246, 0.4)',\n borderRight: '1px solid rgba(59, 130, 246, 0.4)',\n }}\n />\n )}\n\n {selectedTrade && tradePopupPos && renderTradePopup && (\n <div\n className=\"absolute z-20 pointer-events-auto\"\n style={{ left: `${tradePopupPos.x}px`, top: 8, transform: 'translateX(-50%)' }}\n >\n {renderTradePopup(selectedTrade)}\n </div>\n )}\n </div>\n\n {onDeleteLine && chartContainerRef.current && lines.map((line) => {\n const pos = linePositions.get(line.id);\n if (!pos) return null;\n\n return createPortal(\n <button\n key={line.id}\n onClick={() => handleDeleteLine(line.id)}\n className=\"bg-red-500/70 hover:bg-red-500 text-white rounded-full w-4 h-4 flex items-center justify-center text-xs font-bold transition-colors shadow-md\"\n style={{\n position: 'fixed',\n top: `${pos.top - 8}px`,\n right: `${pos.right}px`,\n zIndex: 9999,\n }}\n title=\"Delete line\"\n >\n ×\n </button>,\n document.body\n );\n })}\n\n {contextMenu && (\n <div\n className=\"absolute bg-slate-800 border border-slate-600 rounded-lg shadow-xl z-30 py-1 min-w-[180px]\"\n style={{\n left: `${contextMenu.x}px`,\n top: `${contextMenu.y}px`,\n }}\n >\n <div className=\"px-3 py-1 text-xs text-slate-400 border-b border-slate-600\">\n Price: {contextMenu.price.toFixed(3)}\n </div>\n <button\n onClick={() => handleAddLineFromContext('entry')}\n className=\"w-full px-3 py-2 text-left text-sm text-slate-200 hover:bg-slate-700 transition-colors\"\n >\n Add Entry Line\n </button>\n <button\n onClick={() => handleAddLineFromContext('stopLoss')}\n className=\"w-full px-3 py-2 text-left text-sm text-slate-200 hover:bg-slate-700 transition-colors\"\n >\n Add Stop Loss\n </button>\n <button\n onClick={() => handleAddLineFromContext('takeProfit')}\n className=\"w-full px-3 py-2 text-left text-sm text-slate-200 hover:bg-slate-700 transition-colors\"\n >\n Add Take Profit\n </button>\n <div className=\"border-t border-slate-600 my-1\"></div>\n <button\n onClick={() => handleAddLineFromContext('support')}\n className=\"w-full px-3 py-2 text-left text-sm text-slate-200 hover:bg-slate-700 transition-colors\"\n >\n Add Support Line\n </button>\n <button\n onClick={() => handleAddLineFromContext('resistance')}\n className=\"w-full px-3 py-2 text-left text-sm text-slate-200 hover:bg-slate-700 transition-colors\"\n >\n Add Resistance Line\n </button>\n <div className=\"border-t border-slate-600 my-1\"></div>\n <button\n onClick={handleClearAllLines}\n className=\"w-full px-3 py-2 text-left text-sm text-red-400 hover:bg-slate-700 transition-colors\"\n >\n Clear All Lines\n </button>\n </div>\n )}\n </div>\n );\n}\n\n// A price line with a `title` renders a title box to the LEFT of its on-axis\n// price value, overhanging into the plot. The floating delete button is placed\n// just left of the value box, so without this allowance it lands on top of the\n// title text. Reserve an approximate title-box width (canvas labels can't be\n// measured) so the button clears the label.\nfunction estimateLabelTitleWidth(title?: string): number {\n if (!title) return 0;\n return title.length * 7 + 18;\n}\n\nfunction getLineStyle(style?: 'solid' | 'dashed' | 'dotted'): LineStyle {\n switch (style) {\n case 'dashed':\n return LineStyle.Dashed;\n case 'dotted':\n return LineStyle.Dotted;\n default:\n return LineStyle.Solid;\n }\n}\n","import { z } from 'zod';\nimport { OHLCVBar } from '../../types/chart';\n\nexport enum IndicatorCategory {\n TREND = 'Trend',\n MOMENTUM = 'Momentum',\n VOLATILITY = 'Volatility',\n VOLUME = 'Volume',\n OSCILLATORS = 'Oscillators',\n}\n\nexport enum ChartSeriesType {\n LINE = 'line',\n HISTOGRAM = 'histogram',\n AREA = 'area',\n}\n\nexport const SettingFieldTypeSchema = z.enum([\n 'number',\n 'color',\n 'boolean',\n 'select',\n 'lineStyle',\n]);\n\nexport const LineStyleSchema = z.enum(['solid', 'dashed', 'dotted']);\n\nexport const SettingFieldSchema = z.object({\n type: SettingFieldTypeSchema,\n label: z.string(),\n defaultValue: z.union([z.string(), z.number(), z.boolean()]),\n description: z.string().optional(),\n min: z.number().optional(),\n max: z.number().optional(),\n step: z.number().optional(),\n options: z.array(z.object({ label: z.string(), value: z.string() })).optional(),\n});\n\nexport const IndicatorSettingsSchema = z.record(z.string(), SettingFieldSchema);\n\nexport const IndicatorMetadataSchema = z.object({\n id: z.string(),\n name: z.string(),\n description: z.string(),\n category: z.nativeEnum(IndicatorCategory),\n version: z.string().default('1.0.0'),\n});\n\nexport const RenderConfigSchema = z.object({\n seriesType: z.nativeEnum(ChartSeriesType),\n outputCount: z.number().default(1),\n overlay: z.boolean().default(true),\n hasBandFill: z.boolean().optional(),\n fillBands: z.object({\n upper: z.string(),\n lower: z.string(),\n }).optional(),\n});\n\nexport type SettingFieldType = z.infer<typeof SettingFieldTypeSchema>;\nexport type LineStyle = z.infer<typeof LineStyleSchema>;\nexport type SettingField = z.infer<typeof SettingFieldSchema>;\nexport type IndicatorSettings = z.infer<typeof IndicatorSettingsSchema>;\nexport type IndicatorMetadata = z.infer<typeof IndicatorMetadataSchema>;\nexport type RenderConfig = z.infer<typeof RenderConfigSchema>;\n\nexport interface IndicatorOutput {\n time: number;\n value: number;\n [key: string]: number;\n}\n\nexport type IndicatorCalculation = (\n bars: OHLCVBar[],\n settings: Record<string, any>\n) => IndicatorOutput[];\n\nexport interface IndicatorDefinition {\n metadata: IndicatorMetadata;\n settings: IndicatorSettings;\n renderConfig: RenderConfig;\n calculate: IndicatorCalculation;\n}\n\nexport interface IndicatorInstance {\n id: string;\n definitionId: string;\n name: string;\n settings: Record<string, any>;\n data?: IndicatorOutput[];\n}\n\nexport const IndicatorInstanceSchema = z.object({\n id: z.string(),\n definitionId: z.string(),\n name: z.string(),\n settings: z.record(z.string(), z.any()),\n});\n","import { useState, useMemo } from 'react';\nimport { Search, X, Plus } from 'lucide-react';\nimport { indicatorRegistry } from '../indicators/core/registry';\nimport { IndicatorCategory, IndicatorDefinition } from '../indicators/core/types';\n\ninterface IndicatorBrowserProps {\n isOpen: boolean;\n onClose: () => void;\n onAddIndicator: (definitionId: string) => void;\n}\n\nexport default function IndicatorBrowser({\n isOpen,\n onClose,\n onAddIndicator,\n}: IndicatorBrowserProps) {\n const [searchQuery, setSearchQuery] = useState('');\n const [selectedCategory, setSelectedCategory] = useState<IndicatorCategory | 'All'>('All');\n\n const categories = useMemo(() => {\n return ['All', ...Object.values(IndicatorCategory)];\n }, []);\n\n const filteredIndicators = useMemo(() => {\n let indicators = indicatorRegistry.getAll();\n\n if (selectedCategory !== 'All') {\n indicators = indicators.filter(\n (ind) => ind.metadata.category === selectedCategory\n );\n }\n\n if (searchQuery.trim()) {\n indicators = indicatorRegistry.search(searchQuery);\n if (selectedCategory !== 'All') {\n indicators = indicators.filter(\n (ind) => ind.metadata.category === selectedCategory\n );\n }\n }\n\n return indicators;\n }, [searchQuery, selectedCategory]);\n\n if (!isOpen) return null;\n\n const handleAddIndicator = (definitionId: string) => {\n onAddIndicator(definitionId);\n onClose();\n };\n\n return (\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50\">\n <div className=\"bg-slate-800 rounded-lg shadow-xl w-full max-w-3xl max-h-[80vh] flex flex-col\">\n <div className=\"flex items-center justify-between p-4 border-b border-slate-700\">\n <h2 className=\"text-lg font-semibold text-slate-100\">Add Indicator</h2>\n <button\n onClick={onClose}\n className=\"text-slate-400 hover:text-slate-200 transition\"\n >\n <X size={20} />\n </button>\n </div>\n\n <div className=\"p-4 border-b border-slate-700\">\n <div className=\"relative\">\n <Search\n className=\"absolute left-3 top-1/2 -translate-y-1/2 text-slate-400\"\n size={20}\n />\n <input\n type=\"text\"\n placeholder=\"Search indicators...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"w-full pl-10 pr-4 py-2 bg-slate-700 border border-slate-600 rounded-lg text-slate-100 placeholder-slate-400 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n />\n </div>\n\n <div className=\"flex gap-2 mt-3 overflow-x-auto pb-2\">\n {categories.map((category) => (\n <button\n key={category}\n onClick={() => setSelectedCategory(category as IndicatorCategory | 'All')}\n className={`px-3 py-1.5 rounded-lg text-sm font-medium whitespace-nowrap transition ${\n selectedCategory === category\n ? 'bg-blue-600 text-white'\n : 'bg-slate-700 text-slate-300 hover:bg-slate-600'\n }`}\n >\n {category}\n </button>\n ))}\n </div>\n </div>\n\n <div className=\"flex-1 overflow-y-auto p-4\">\n {filteredIndicators.length === 0 ? (\n <div className=\"text-center py-12 text-slate-400\">\n <p>No indicators found</p>\n {searchQuery && (\n <p className=\"text-sm mt-2\">\n Try adjusting your search or category filter\n </p>\n )}\n </div>\n ) : (\n <div className=\"grid gap-3\">\n {filteredIndicators.map((indicator) => (\n <IndicatorCard\n key={indicator.metadata.id}\n indicator={indicator}\n onAdd={() => handleAddIndicator(indicator.metadata.id)}\n />\n ))}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n\ninterface IndicatorCardProps {\n indicator: IndicatorDefinition;\n onAdd: () => void;\n}\n\nfunction IndicatorCard({ indicator, onAdd }: IndicatorCardProps) {\n const getCategoryColor = (category: IndicatorCategory) => {\n switch (category) {\n case IndicatorCategory.TREND:\n return 'bg-blue-500/20 text-blue-400';\n case IndicatorCategory.MOMENTUM:\n return 'bg-purple-500/20 text-purple-400';\n case IndicatorCategory.VOLATILITY:\n return 'bg-orange-500/20 text-orange-400';\n case IndicatorCategory.VOLUME:\n return 'bg-green-500/20 text-green-400';\n case IndicatorCategory.OSCILLATORS:\n return 'bg-pink-500/20 text-pink-400';\n default:\n return 'bg-slate-500/20 text-slate-400';\n }\n };\n\n return (\n <div className=\"bg-slate-700/50 rounded-lg p-4 hover:bg-slate-700 transition group\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex-1\">\n <div className=\"flex items-center gap-2 mb-2\">\n <h3 className=\"text-slate-100 font-medium\">{indicator.metadata.name}</h3>\n <span\n className={`px-2 py-0.5 rounded text-xs font-medium ${getCategoryColor(\n indicator.metadata.category\n )}`}\n >\n {indicator.metadata.category}\n </span>\n </div>\n <p className=\"text-sm text-slate-400\">{indicator.metadata.description}</p>\n </div>\n <button\n onClick={onAdd}\n className=\"flex items-center gap-1.5 px-3 py-1.5 bg-blue-600 hover:bg-blue-700 text-white rounded-lg transition text-sm font-medium opacity-0 group-hover:opacity-100\"\n >\n <Plus size={16} />\n Add\n </button>\n </div>\n </div>\n );\n}\n","import { useState } from 'react';\nimport { IndicatorSettings, SettingField } from '../indicators/core/types';\n\ninterface IndicatorSettingsFormProps {\n settings: IndicatorSettings;\n currentValues: Record<string, any>;\n onChange: (key: string, value: any) => void;\n}\n\nexport default function IndicatorSettingsForm({\n settings,\n currentValues,\n onChange,\n}: IndicatorSettingsFormProps) {\n return (\n <div className=\"space-y-4\">\n {Object.entries(settings).map(([key, field]) => (\n <div key={key}>\n <label className=\"block text-sm font-medium text-slate-300 mb-1\">\n {field.label}\n </label>\n {field.description && (\n <p className=\"text-xs text-slate-400 mb-2\">{field.description}</p>\n )}\n {renderField(key, field, currentValues[key], onChange)}\n </div>\n ))}\n </div>\n );\n}\n\nfunction parseColor(colorValue: string): { hex: string; opacity: number } {\n const rgbaMatch = colorValue.match(/^rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*([\\d.]+))?\\)$/);\n\n if (rgbaMatch) {\n const r = parseInt(rgbaMatch[1]);\n const g = parseInt(rgbaMatch[2]);\n const b = parseInt(rgbaMatch[3]);\n const a = rgbaMatch[4] ? parseFloat(rgbaMatch[4]) : 1;\n\n const hex = `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;\n return { hex, opacity: Math.round(a * 100) };\n }\n\n return { hex: colorValue, opacity: 100 };\n}\n\nfunction hexToRgba(hex: string, opacity: number): string {\n const r = parseInt(hex.slice(1, 3), 16);\n const g = parseInt(hex.slice(3, 5), 16);\n const b = parseInt(hex.slice(5, 7), 16);\n const a = opacity / 100;\n\n return `rgba(${r}, ${g}, ${b}, ${a})`;\n}\n\nfunction ColorPicker({ value, defaultValue, onChange }: { value: any; defaultValue: string; onChange: (value: string) => void }) {\n const colorValue = value ?? defaultValue;\n const { hex, opacity } = parseColor(colorValue);\n\n const [localHex, setLocalHex] = useState(hex);\n const [localOpacity, setLocalOpacity] = useState(opacity);\n\n const handleColorChange = (newHex: string) => {\n setLocalHex(newHex);\n onChange(hexToRgba(newHex, localOpacity));\n };\n\n const handleOpacityChange = (newOpacity: number) => {\n setLocalOpacity(newOpacity);\n onChange(hexToRgba(localHex, newOpacity));\n };\n\n const handleTextChange = (newValue: string) => {\n const parsed = parseColor(newValue);\n setLocalHex(parsed.hex);\n setLocalOpacity(parsed.opacity);\n onChange(newValue);\n };\n\n return (\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-2\">\n <input\n type=\"color\"\n value={localHex}\n onChange={(e) => handleColorChange(e.target.value)}\n className=\"w-12 h-10 rounded cursor-pointer\"\n />\n <input\n type=\"text\"\n value={colorValue}\n onChange={(e) => handleTextChange(e.target.value)}\n className=\"flex-1 px-3 py-2 bg-slate-700 border border-slate-600 rounded-lg text-slate-100 focus:outline-none focus:ring-2 focus:ring-blue-500 font-mono text-sm\"\n />\n </div>\n <div className=\"flex items-center gap-2\">\n <input\n type=\"range\"\n min=\"0\"\n max=\"100\"\n value={localOpacity}\n onChange={(e) => handleOpacityChange(parseInt(e.target.value))}\n className=\"flex-1 h-2 bg-slate-600 rounded-lg appearance-none cursor-pointer\"\n />\n <span className=\"text-sm text-slate-400 w-12 text-right\">{localOpacity}%</span>\n </div>\n </div>\n );\n}\n\nfunction renderField(\n key: string,\n field: SettingField,\n value: any,\n onChange: (key: string, value: any) => void\n) {\n switch (field.type) {\n case 'number':\n return (\n <input\n type=\"number\"\n value={value ?? field.defaultValue}\n onChange={(e) => onChange(key, parseFloat(e.target.value))}\n min={field.min}\n max={field.max}\n step={field.step}\n className=\"w-full px-3 py-2 bg-slate-700 border border-slate-600 rounded-lg text-slate-100 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n />\n );\n\n case 'color':\n return (\n <ColorPicker\n value={value}\n defaultValue={field.defaultValue as string}\n onChange={(newValue) => onChange(key, newValue)}\n />\n );\n\n case 'boolean':\n return (\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={value ?? field.defaultValue}\n onChange={(e) => onChange(key, e.target.checked)}\n className=\"w-4 h-4 text-blue-600 bg-slate-700 border-slate-600 rounded focus:ring-blue-500\"\n />\n <span className=\"text-sm text-slate-300\">\n {value ?? field.defaultValue ? 'Enabled' : 'Disabled'}\n </span>\n </label>\n );\n\n case 'select':\n return (\n <select\n value={value ?? field.defaultValue}\n onChange={(e) => onChange(key, e.target.value)}\n className=\"w-full px-3 py-2 bg-slate-700 border border-slate-600 rounded-lg text-slate-100 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n {field.options?.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n );\n\n case 'lineStyle':\n return (\n <select\n value={value ?? field.defaultValue}\n onChange={(e) => onChange(key, e.target.value)}\n className=\"w-full px-3 py-2 bg-slate-700 border border-slate-600 rounded-lg text-slate-100 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n <option value=\"solid\">Solid</option>\n <option value=\"dashed\">Dashed</option>\n <option value=\"dotted\">Dotted</option>\n </select>\n );\n\n default:\n return (\n <input\n type=\"text\"\n value={value ?? field.defaultValue}\n onChange={(e) => onChange(key, e.target.value)}\n className=\"w-full px-3 py-2 bg-slate-700 border border-slate-600 rounded-lg text-slate-100 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n />\n );\n }\n}\n","import { useState, useEffect } from 'react';\nimport { X } from 'lucide-react';\nimport { IndicatorInstance } from '../indicators/core/types';\nimport { indicatorRegistry } from '../indicators/core/registry';\nimport IndicatorSettingsForm from './IndicatorSettingsForm';\n\ninterface SettingsDialogProps {\n isOpen: boolean;\n onClose: () => void;\n indicator: IndicatorInstance | null;\n onSave: (indicatorId: string, settings: Record<string, any>) => void;\n}\n\nexport default function SettingsDialog({\n isOpen,\n onClose,\n indicator,\n onSave,\n}: SettingsDialogProps) {\n const [settings, setSettings] = useState<Record<string, any>>({});\n\n useEffect(() => {\n if (indicator) {\n setSettings({ ...indicator.settings });\n }\n }, [indicator]);\n\n if (!isOpen || !indicator) return null;\n\n const definition = indicatorRegistry.get(indicator.definitionId);\n if (!definition) return null;\n\n const handleSave = () => {\n onSave(indicator.id, settings);\n onClose();\n };\n\n const handleChange = (key: string, value: any) => {\n setSettings((prev) => ({\n ...prev,\n [key]: value,\n }));\n };\n\n return (\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50\">\n <div className=\"bg-slate-800 rounded-lg shadow-xl w-full max-w-md\">\n <div className=\"flex items-center justify-between p-4 border-b border-slate-700\">\n <h2 className=\"text-lg font-semibold text-slate-100\">\n {indicator.name} Settings\n </h2>\n <button\n onClick={onClose}\n className=\"text-slate-400 hover:text-slate-200 transition\"\n >\n <X size={20} />\n </button>\n </div>\n\n <div className=\"p-4\">\n <IndicatorSettingsForm\n settings={definition.settings}\n currentValues={settings}\n onChange={handleChange}\n />\n </div>\n\n <div className=\"flex items-center justify-end gap-2 p-4 border-t border-slate-700\">\n <button\n onClick={onClose}\n className=\"px-4 py-2 text-slate-300 hover:text-slate-100 transition\"\n >\n Cancel\n </button>\n <button\n onClick={handleSave}\n className=\"px-4 py-2 bg-blue-600 hover:bg-blue-700 text-white rounded-lg transition\"\n >\n Save Changes\n </button>\n </div>\n </div>\n </div>\n );\n}\n","import { useState, useCallback, useEffect } from 'react';\nimport { ChartLine } from '../types/chart';\nimport { IndicatorInstance } from '../indicators/core/types';\nimport { indicatorRegistry } from '../indicators/core/registry';\nimport { indicatorCalculator } from '../indicators/core/calculator';\nimport { PersistenceAdapter } from '../indicators/core/persistence';\n\ninterface UseChartAPIOptions {\n persistenceAdapter?: PersistenceAdapter;\n}\n\nexport function useChartAPI(options?: UseChartAPIOptions) {\n const [lines, setLines] = useState<ChartLine[]>([]);\n const [indicators, setIndicators] = useState<IndicatorInstance[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n if (options?.persistenceAdapter) {\n options.persistenceAdapter.loadIndicators().then((loaded) => {\n setIndicators(loaded);\n setIsLoading(false);\n });\n } else {\n setIsLoading(false);\n }\n }, [options?.persistenceAdapter]);\n\n useEffect(() => {\n if (!isLoading && options?.persistenceAdapter) {\n options.persistenceAdapter.saveIndicators(indicators);\n }\n }, [indicators, isLoading, options?.persistenceAdapter]);\n\n const addLine = useCallback(\n (\n id: string,\n price: number,\n options?: {\n color?: string;\n lineWidth?: number;\n lineStyle?: 'solid' | 'dashed' | 'dotted';\n title?: string;\n }\n ) => {\n const newLine: ChartLine = {\n id,\n price,\n color: options?.color || '#3b82f6',\n lineWidth: options?.lineWidth || 2,\n lineStyle: options?.lineStyle || 'solid',\n title: options?.title,\n };\n setLines((prev) => [...prev, newLine]);\n },\n []\n );\n\n const removeLine = useCallback((id: string) => {\n setLines((prev) => prev.filter((line) => line.id !== id));\n }, []);\n\n const updateLine = useCallback((id: string, price: number) => {\n setLines((prev) =>\n prev.map((line) => (line.id === id ? { ...line, price } : line))\n );\n }, []);\n\n const addEntryLine = useCallback(\n (price: number) => {\n const id = `entry-${Date.now()}`;\n addLine(id, price, {\n color: '#3b82f6',\n title: 'Entry',\n lineStyle: 'solid',\n });\n },\n [addLine]\n );\n\n const addStopLoss = useCallback(\n (price: number) => {\n const id = `stop-loss-${Date.now()}`;\n addLine(id, price, {\n color: '#ef4444',\n title: 'Stop Loss',\n lineStyle: 'dashed',\n });\n },\n [addLine]\n );\n\n const addTakeProfit = useCallback(\n (price: number) => {\n const id = `take-profit-${Date.now()}`;\n addLine(id, price, {\n color: '#10b981',\n title: 'Take Profit',\n lineStyle: 'dashed',\n });\n },\n [addLine]\n );\n\n const addSupportLine = useCallback(\n (price: number) => {\n const id = `support-${Date.now()}`;\n addLine(id, price, {\n color: '#10b981',\n title: 'Support',\n lineStyle: 'dotted',\n });\n },\n [addLine]\n );\n\n const addResistanceLine = useCallback(\n (price: number) => {\n const id = `resistance-${Date.now()}`;\n addLine(id, price, {\n color: '#f97316',\n title: 'Resistance',\n lineStyle: 'dotted',\n });\n },\n [addLine]\n );\n\n const clearAllLines = useCallback(() => {\n setLines([]);\n }, []);\n\n const addLineByType = useCallback(\n (type: 'entry' | 'stopLoss' | 'takeProfit' | 'support' | 'resistance', price: number) => {\n if (type === 'entry') {\n addEntryLine(price);\n } else if (type === 'stopLoss') {\n addStopLoss(price);\n } else if (type === 'takeProfit') {\n addTakeProfit(price);\n } else if (type === 'support') {\n addSupportLine(price);\n } else if (type === 'resistance') {\n addResistanceLine(price);\n }\n },\n [addEntryLine, addStopLoss, addTakeProfit, addSupportLine, addResistanceLine]\n );\n\n const addIndicator = useCallback((definitionId: string, customSettings?: Record<string, any>) => {\n const instance = indicatorRegistry.createInstance(definitionId, customSettings);\n setIndicators((prev) => [...prev, instance]);\n return instance;\n }, []);\n\n const removeIndicator = useCallback((id: string) => {\n setIndicators((prev) => prev.filter((indicator) => indicator.id !== id));\n indicatorCalculator.invalidateCache(id);\n }, []);\n\n const updateIndicatorSettings = useCallback(\n (id: string, settings: Record<string, any>) => {\n setIndicators((prev) =>\n prev.map((indicator) =>\n indicator.id === id ? { ...indicator, settings } : indicator\n )\n );\n indicatorCalculator.invalidateCache(id);\n },\n []\n );\n\n return {\n lines,\n indicators,\n isLoadingIndicators: isLoading,\n addLine,\n removeLine,\n updateLine,\n addEntryLine,\n addStopLoss,\n addTakeProfit,\n addSupportLine,\n addResistanceLine,\n clearAllLines,\n addLineByType,\n addIndicator,\n removeIndicator,\n updateIndicatorSettings,\n };\n}\n","import { OHLCVBar } from '../types/chart';\n\nexport function validateBar(bar: any): bar is OHLCVBar {\n if (!bar || typeof bar !== 'object') return false;\n\n const required = ['timestamp', 'open', 'high', 'low', 'close', 'volume'];\n for (const field of required) {\n if (!(field in bar)) return false;\n if (typeof bar[field] !== 'number') return false;\n }\n\n if (bar.timestamp <= 0) return false;\n if (bar.open <= 0 || bar.high <= 0 || bar.low <= 0 || bar.close <= 0) return false;\n if (bar.volume < 0) return false;\n if (bar.high < bar.low) return false;\n if (bar.high < bar.open || bar.high < bar.close) return false;\n if (bar.low > bar.open || bar.low > bar.close) return false;\n\n return true;\n}\n\nexport function isValidBar(bar: any): bar is OHLCVBar {\n return validateBar(bar);\n}\n\nexport function normalizeTimestamp(timestamp: number): number {\n if (timestamp < 10000000000) {\n return timestamp * 1000;\n }\n return timestamp;\n}\n\nexport function sortBars(bars: OHLCVBar[]): OHLCVBar[] {\n return [...bars].sort((a, b) => a.timestamp - b.timestamp);\n}\n\nexport function deduplicateBars(bars: OHLCVBar[]): OHLCVBar[] {\n const seen = new Map<number, OHLCVBar>();\n\n for (const bar of bars) {\n const existing = seen.get(bar.timestamp);\n if (!existing) {\n seen.set(bar.timestamp, bar);\n }\n }\n\n return Array.from(seen.values()).sort((a, b) => a.timestamp - b.timestamp);\n}\n\nexport function mergeBars(existingBars: OHLCVBar[], newBars: OHLCVBar[]): OHLCVBar[] {\n const allBars = [...existingBars, ...newBars];\n return deduplicateBars(allBars);\n}\n\nexport function validateAndNormalizeBars(bars: any[]): OHLCVBar[] {\n console.log(`validateAndNormalizeBars: received ${bars.length} bars`);\n const validated = bars\n .filter(bar => {\n if (!validateBar(bar)) {\n console.warn('Invalid bar data:', bar);\n return false;\n }\n return true;\n })\n .map(bar => ({\n ...bar,\n timestamp: normalizeTimestamp(bar.timestamp),\n }));\n console.log(`validateAndNormalizeBars: returning ${validated.length} valid bars`);\n return validated;\n}\n\nexport function updateBarInArray(bars: OHLCVBar[], updatedBar: OHLCVBar): OHLCVBar[] {\n const index = bars.findIndex(b => b.timestamp === updatedBar.timestamp);\n\n if (index === -1) {\n return [...bars, updatedBar].sort((a, b) => a.timestamp - b.timestamp);\n }\n\n const updated = [...bars];\n updated[index] = updatedBar;\n return updated;\n}\n\nexport function appendBar(bars: OHLCVBar[], newBar: OHLCVBar): OHLCVBar[] {\n const exists = bars.find(b => b.timestamp === newBar.timestamp);\n if (exists) {\n return bars;\n }\n\n return [...bars, newBar];\n}\n\nexport function prependBars(bars: OHLCVBar[], newBars: OHLCVBar[]): OHLCVBar[] {\n const existingTimestamps = new Set(bars.map(b => b.timestamp));\n const uniqueNewBars = newBars.filter(b => !existingTimestamps.has(b.timestamp));\n\n return [...uniqueNewBars, ...bars];\n}\n\nexport function getOldestBar(bars: OHLCVBar[]): OHLCVBar | null {\n if (bars.length === 0) return null;\n return bars[0];\n}\n\nexport function getNewestBar(bars: OHLCVBar[]): OHLCVBar | null {\n if (bars.length === 0) return null;\n return bars[bars.length - 1];\n}\n\nexport function updateCurrentBar(\n bars: OHLCVBar[],\n tradePrice: number,\n tradeVolume: number\n): OHLCVBar[] {\n if (bars.length === 0) return bars;\n\n const updated = [...bars];\n const lastBar = { ...updated[updated.length - 1] };\n\n lastBar.close = tradePrice;\n lastBar.high = Math.max(lastBar.high, tradePrice);\n lastBar.low = Math.min(lastBar.low, tradePrice);\n lastBar.volume += tradeVolume;\n\n updated[updated.length - 1] = lastBar;\n return updated;\n}\n","import { useState, useCallback, useRef, useEffect } from 'react';\nimport { OHLCVBar } from '../types/chart';\nimport {\n appendBar as appendBarUtil,\n prependBars as prependBarsUtil,\n updateBarInArray,\n deduplicateBars,\n sortBars,\n validateAndNormalizeBars,\n updateCurrentBar as updateCurrentBarUtil,\n} from '../utils/barUtils';\nimport { BarDataAdapter, HistoricalDataParams, RealtimeSubscription } from '../adapters/types';\n\nexport interface UseBarsDataOptions {\n adapter?: BarDataAdapter;\n symbol?: string;\n timeframe?: string;\n autoFetch?: boolean;\n autoSubscribe?: boolean;\n limit?: number;\n}\n\nexport interface UseBarsDataReturn {\n bars: OHLCVBar[];\n loading: boolean;\n error: Error | null;\n connected: boolean;\n\n setBars: (bars: OHLCVBar[]) => void;\n appendBar: (bar: OHLCVBar) => void;\n updateLastBar: (bar: OHLCVBar) => void;\n updateCurrentBar: (tradePrice: number, tradeVolume: number) => void;\n prependBars: (bars: OHLCVBar[]) => void;\n clearBars: () => void;\n\n fetchHistorical: (params?: Partial<HistoricalDataParams>) => Promise<void>;\n subscribe: () => void;\n unsubscribe: () => void;\n\n refetch: () => Promise<void>;\n}\n\nexport function useBarsData(options: UseBarsDataOptions = {}): UseBarsDataReturn {\n const {\n adapter,\n symbol = 'AAPL',\n timeframe = '5Min',\n autoFetch = false,\n autoSubscribe = false,\n limit = 500,\n } = options;\n\n const [bars, setBarsState] = useState<OHLCVBar[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [connected, setConnected] = useState(false);\n\n const subscriptionRef = useRef<RealtimeSubscription | null>(null);\n const isMountedRef = useRef(true);\n const hasInitialFetchRef = useRef(false);\n const isFetchingRef = useRef(false);\n\n const setBars = useCallback((newBars: OHLCVBar[]) => {\n const validated = validateAndNormalizeBars(newBars);\n const sorted = sortBars(validated);\n setBarsState(sorted);\n }, []);\n\n const appendBar = useCallback((bar: OHLCVBar) => {\n setBarsState(prev => appendBarUtil(prev, bar));\n }, []);\n\n const updateLastBar = useCallback((bar: OHLCVBar) => {\n setBarsState(prev => {\n if (prev.length === 0) return [bar];\n const updated = [...prev];\n updated[updated.length - 1] = bar;\n return updated;\n });\n }, []);\n\n const updateCurrentBar = useCallback((tradePrice: number, tradeVolume: number) => {\n setBarsState(prev => updateCurrentBarUtil(prev, tradePrice, tradeVolume));\n }, []);\n\n const prependBars = useCallback((newBars: OHLCVBar[]) => {\n const validated = validateAndNormalizeBars(newBars);\n setBarsState(prev => prependBarsUtil(prev, validated));\n }, []);\n\n const clearBars = useCallback(() => {\n setBarsState([]);\n }, []);\n\n const fetchHistorical = useCallback(\n async (params: Partial<HistoricalDataParams> = {}) => {\n if (!adapter) {\n setError(new Error('No adapter provided'));\n return;\n }\n\n if (isFetchingRef.current) {\n console.log('fetchHistorical: already fetching, skipping');\n return;\n }\n\n console.log('fetchHistorical called, params:', params);\n console.log('isMountedRef.current:', isMountedRef.current);\n isFetchingRef.current = true;\n setLoading(true);\n setError(null);\n\n try {\n const fetchParams: HistoricalDataParams = {\n symbol: params.symbol || symbol,\n timeframe: params.timeframe || timeframe,\n limit: params.limit || limit,\n before: params.before,\n after: params.after,\n };\n\n console.log('Calling adapter.fetchHistoricalBars with:', fetchParams);\n const data = await adapter.fetchHistoricalBars(fetchParams);\n console.log('adapter.fetchHistoricalBars returned, data.length:', data.length);\n\n if (isMountedRef.current) {\n console.log('Component still mounted, processing data');\n const validated = validateAndNormalizeBars(data);\n\n if (params.before) {\n console.log('Prepending bars (before param present)');\n setBarsState(prev => prependBarsUtil(prev, validated));\n } else {\n console.log('Setting initial bars (no before param)');\n const sorted = sortBars(validated);\n setBarsState(sorted);\n }\n } else {\n console.log('Component unmounted, skipping data update');\n }\n } catch (err) {\n console.log('Error caught:', err);\n if (isMountedRef.current) {\n const error = err instanceof Error ? err : new Error('Failed to fetch historical data');\n setError(error);\n console.error('Failed to fetch historical data:', error);\n }\n } finally {\n console.log('Finally block executing, isMountedRef.current:', isMountedRef.current);\n isFetchingRef.current = false;\n if (isMountedRef.current) {\n console.log('Setting loading to false');\n setLoading(false);\n } else {\n console.log('Skipping setLoading(false) - component unmounted');\n }\n }\n },\n [adapter, symbol, timeframe, limit]\n );\n\n const subscribe = useCallback(() => {\n if (!adapter?.subscribeRealtime) {\n console.warn('Adapter does not support real-time subscriptions');\n return;\n }\n\n if (subscriptionRef.current) {\n console.warn('Already subscribed');\n return;\n }\n\n subscriptionRef.current = adapter.subscribeRealtime(symbol, {\n onBar: (bar) => {\n if (isMountedRef.current) {\n appendBar(bar);\n }\n },\n onTrade: (price, volume) => {\n if (isMountedRef.current) {\n updateCurrentBar(price, volume);\n }\n },\n onError: (err) => {\n if (isMountedRef.current) {\n setError(err);\n setConnected(false);\n }\n },\n onConnect: () => {\n if (isMountedRef.current) {\n setConnected(true);\n }\n },\n onDisconnect: () => {\n if (isMountedRef.current) {\n setConnected(false);\n }\n },\n });\n }, [adapter, symbol, appendBar, updateCurrentBar]);\n\n const unsubscribe = useCallback(() => {\n if (subscriptionRef.current) {\n subscriptionRef.current.unsubscribe();\n subscriptionRef.current = null;\n setConnected(false);\n }\n }, []);\n\n const refetch = useCallback(async () => {\n await fetchHistorical();\n }, [fetchHistorical]);\n\n useEffect(() => {\n console.log('useEffect[autoFetch] running, autoFetch:', autoFetch, 'adapter:', !!adapter, 'hasInitialFetch:', hasInitialFetchRef.current);\n if (autoFetch && adapter && !hasInitialFetchRef.current) {\n console.log('Calling fetchHistorical from useEffect (initial fetch)');\n hasInitialFetchRef.current = true;\n fetchHistorical();\n }\n }, [autoFetch, adapter, fetchHistorical]);\n\n useEffect(() => {\n if (autoSubscribe && adapter?.subscribeRealtime) {\n subscribe();\n }\n\n return () => {\n unsubscribe();\n };\n }, [autoSubscribe, adapter, subscribe, unsubscribe]);\n\n useEffect(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n if (subscriptionRef.current) {\n subscriptionRef.current.unsubscribe();\n subscriptionRef.current = null;\n }\n };\n }, []);\n\n return {\n bars,\n loading,\n error,\n connected,\n setBars,\n appendBar,\n updateLastBar,\n updateCurrentBar,\n prependBars,\n clearBars,\n fetchHistorical,\n subscribe,\n unsubscribe,\n refetch,\n };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { OHLCVBar } from '../types/chart';\n\ninterface RealtimeUpdateConfig {\n enabled: boolean;\n updateIntervalMs: number;\n newBarIntervalMs: number;\n}\n\nexport function useRealtimeUpdates(\n initialBars: OHLCVBar[],\n config: RealtimeUpdateConfig\n) {\n const [bars, setBars] = useState<OHLCVBar[]>([]);\n const updateIntervalRef = useRef<number>();\n const newBarIntervalRef = useRef<number>();\n const lastBarTimeRef = useRef<number>(0);\n const initializedRef = useRef(false);\n\n const updateCurrentBar = useCallback((tradePrice: number, tradeVolume: number) => {\n setBars((prev) => {\n if (prev.length === 0) return prev;\n\n const updated = [...prev];\n const lastBar = { ...updated[updated.length - 1] };\n\n lastBar.close = tradePrice;\n lastBar.high = Math.max(lastBar.high, tradePrice);\n lastBar.low = Math.min(lastBar.low, tradePrice);\n lastBar.volume += tradeVolume;\n\n updated[updated.length - 1] = lastBar;\n return updated;\n });\n }, []);\n\n const addNewBar = useCallback((newBar: OHLCVBar) => {\n setBars((prev) => {\n const exists = prev.find(b => b.timestamp === newBar.timestamp);\n if (exists) return prev;\n return [...prev, newBar];\n });\n }, []);\n\n const prependBars = useCallback((newBars: OHLCVBar[]) => {\n setBars((prev) => {\n const existingTimestamps = new Set(prev.map(b => b.timestamp));\n const uniqueNewBars = newBars.filter(b => !existingTimestamps.has(b.timestamp));\n return [...uniqueNewBars, ...prev];\n });\n }, []);\n\n const generateRealisticPriceMove = useCallback((currentPrice: number): number => {\n const volatility = 0.0005;\n const drift = 0;\n const change = currentPrice * (drift + volatility * (Math.random() * 2 - 1));\n return currentPrice + change;\n }, []);\n\n useEffect(() => {\n if (!initializedRef.current && initialBars.length > 0) {\n setBars(initialBars);\n initializedRef.current = true;\n }\n }, [initialBars]);\n\n useEffect(() => {\n if (!config.enabled || bars.length === 0) return;\n\n const lastBar = bars[bars.length - 1];\n lastBarTimeRef.current = lastBar.timestamp;\n\n updateIntervalRef.current = window.setInterval(() => {\n setBars((prev) => {\n if (prev.length === 0) return prev;\n\n const updated = [...prev];\n const currentBar = { ...updated[updated.length - 1] };\n\n const newPrice = currentBar.close * (1 + (Math.random() - 0.5) * 0.001);\n const newVolume = Math.floor(Math.random() * 100) + 10;\n\n currentBar.close = newPrice;\n currentBar.high = Math.max(currentBar.high, newPrice);\n currentBar.low = Math.min(currentBar.low, newPrice);\n currentBar.volume += newVolume;\n\n updated[updated.length - 1] = currentBar;\n return updated;\n });\n }, config.updateIntervalMs);\n\n newBarIntervalRef.current = window.setInterval(() => {\n setBars((prev) => {\n if (prev.length === 0) return prev;\n\n const lastBar = prev[prev.length - 1];\n const newTimestamp = lastBar.timestamp + config.newBarIntervalMs;\n\n const newPrice = lastBar.close * (1 + (Math.random() - 0.5) * 0.002);\n\n const newBar: OHLCVBar = {\n timestamp: newTimestamp,\n open: lastBar.close,\n high: newPrice,\n low: Math.min(lastBar.close, newPrice),\n close: newPrice,\n volume: Math.floor(Math.random() * 1000) + 100,\n };\n\n lastBarTimeRef.current = newTimestamp;\n return [...prev, newBar];\n });\n }, config.newBarIntervalMs);\n\n return () => {\n if (updateIntervalRef.current) {\n clearInterval(updateIntervalRef.current);\n }\n if (newBarIntervalRef.current) {\n clearInterval(newBarIntervalRef.current);\n }\n };\n }, [config.enabled, config.updateIntervalMs, config.newBarIntervalMs, bars.length]);\n\n return {\n bars,\n updateCurrentBar,\n addNewBar,\n prependBars,\n };\n}\n","import { IndicatorInstance } from './types';\n\nexport interface PersistenceAdapter {\n saveIndicators(indicators: IndicatorInstance[]): Promise<void>;\n loadIndicators(): Promise<IndicatorInstance[]>;\n deleteIndicator(id: string): Promise<void>;\n}\n\nexport class LocalStoragePersistenceAdapter implements PersistenceAdapter {\n private storageKey = 'chart_indicators';\n\n async saveIndicators(indicators: IndicatorInstance[]): Promise<void> {\n try {\n const serialized = JSON.stringify(indicators);\n localStorage.setItem(this.storageKey, serialized);\n } catch (error) {\n console.error('Error saving indicators to localStorage:', error);\n }\n }\n\n async loadIndicators(): Promise<IndicatorInstance[]> {\n try {\n const serialized = localStorage.getItem(this.storageKey);\n if (!serialized) {\n return [];\n }\n\n const parsed = JSON.parse(serialized);\n return Array.isArray(parsed) ? parsed : [];\n } catch (error) {\n console.error('Error loading indicators from localStorage:', error);\n return [];\n }\n }\n\n async deleteIndicator(id: string): Promise<void> {\n try {\n const indicators = await this.loadIndicators();\n const filtered = indicators.filter((ind) => ind.id !== id);\n await this.saveIndicators(filtered);\n } catch (error) {\n console.error('Error deleting indicator from localStorage:', error);\n }\n }\n}\n\nexport class NoOpPersistenceAdapter implements PersistenceAdapter {\n async saveIndicators(indicators: IndicatorInstance[]): Promise<void> {\n }\n\n async loadIndicators(): Promise<IndicatorInstance[]> {\n return [];\n }\n\n async deleteIndicator(id: string): Promise<void> {\n }\n}\n\nexport function createPersistenceAdapter(\n kind: 'noop' | 'localStorage'\n): PersistenceAdapter {\n switch (kind) {\n case 'localStorage':\n return new LocalStoragePersistenceAdapter();\n case 'noop':\n return new NoOpPersistenceAdapter();\n default:\n throw new Error('Unknown persistence kind: ' + kind);\n }\n}\n","import { OHLCVBar } from '../../types/chart';\n\nexport function padIndicatorArray(result: number[], barsLength: number): number[] {\n const missing = barsLength - result.length;\n if (missing <= 0) return result;\n return [...Array(missing).fill(NaN), ...result];\n}\n\nexport function displaceArray(arr: number[], offset: number): number[] {\n if (offset <= 0) return arr;\n return [...arr.slice(offset), ...Array(offset).fill(NaN)];\n}\n\nexport function calculateSMA(bars: OHLCVBar[], period: number): number[] {\n const result: number[] = [];\n\n for (let i = 0; i < bars.length; i++) {\n if (i < period - 1) {\n result.push(NaN);\n } else {\n let sum = 0;\n for (let j = 0; j < period; j++) {\n sum += bars[i - j].close;\n }\n result.push(sum / period);\n }\n }\n\n return result;\n}\n\nexport function calculateEMA(bars: OHLCVBar[], period: number): number[] {\n const result: number[] = [];\n const multiplier = 2 / (period + 1);\n\n let ema = 0;\n let hasStarted = false;\n\n for (let i = 0; i < bars.length; i++) {\n if (i < period - 1) {\n result.push(NaN);\n } else if (i === period - 1) {\n let sum = 0;\n for (let j = 0; j < period; j++) {\n sum += bars[i - j].close;\n }\n ema = sum / period;\n result.push(ema);\n hasStarted = true;\n } else {\n ema = (bars[i].close - ema) * multiplier + ema;\n result.push(ema);\n }\n }\n\n return result;\n}\n\nexport function calculateRSI(bars: OHLCVBar[], period: number): number[] {\n const result: number[] = [];\n const changes: number[] = [];\n\n for (let i = 1; i < bars.length; i++) {\n changes.push(bars[i].close - bars[i - 1].close);\n }\n\n for (let i = 0; i < bars.length; i++) {\n if (i < period) {\n result.push(NaN);\n } else {\n let gains = 0;\n let losses = 0;\n\n for (let j = i - period; j < i; j++) {\n const change = changes[j - 1];\n if (change > 0) {\n gains += change;\n } else {\n losses += Math.abs(change);\n }\n }\n\n const avgGain = gains / period;\n const avgLoss = losses / period;\n\n if (avgLoss === 0) {\n result.push(100);\n } else {\n const rs = avgGain / avgLoss;\n const rsi = 100 - 100 / (1 + rs);\n result.push(rsi);\n }\n }\n }\n\n return result;\n}\n\nexport function calculateStandardDeviation(values: number[], period: number): number[] {\n const result: number[] = [];\n\n for (let i = 0; i < values.length; i++) {\n if (i < period - 1 || isNaN(values[i])) {\n result.push(NaN);\n } else {\n let sum = 0;\n let count = 0;\n\n for (let j = 0; j < period; j++) {\n const val = values[i - j];\n if (!isNaN(val)) {\n sum += val;\n count++;\n }\n }\n\n const mean = sum / count;\n let squaredDiffSum = 0;\n\n for (let j = 0; j < period; j++) {\n const val = values[i - j];\n if (!isNaN(val)) {\n squaredDiffSum += Math.pow(val - mean, 2);\n }\n }\n\n const variance = squaredDiffSum / count;\n result.push(Math.sqrt(variance));\n }\n }\n\n return result;\n}\n\nexport function calculateBollingerBands(\n bars: OHLCVBar[],\n period: number,\n stdDev: number\n): { upper: number[]; middle: number[]; lower: number[] } {\n const middle = calculateSMA(bars, period);\n const closes = bars.map((b) => b.close);\n const std = calculateStandardDeviation(closes, period);\n\n const upper: number[] = [];\n const lower: number[] = [];\n\n for (let i = 0; i < middle.length; i++) {\n if (isNaN(middle[i]) || isNaN(std[i])) {\n upper.push(NaN);\n lower.push(NaN);\n } else {\n upper.push(middle[i] + std[i] * stdDev);\n lower.push(middle[i] - std[i] * stdDev);\n }\n }\n\n return { upper, middle, lower };\n}\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { calculateSMA } from '../utils/calculations';\n\nexport const SMAIndicator: IndicatorDefinition = {\n metadata: {\n id: 'sma',\n name: 'SMA',\n description: 'Simple Moving Average - smooths price data by averaging over a period',\n category: IndicatorCategory.TREND,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 20,\n description: 'Number of bars to average',\n min: 1,\n max: 500,\n step: 1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#3b82f6',\n description: 'Color of the SMA line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the SMA line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: true,\n },\n calculate: (bars, settings) => {\n const smaValues = calculateSMA(bars, settings.period);\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: smaValues[i],\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { calculateEMA } from '../utils/calculations';\n\nexport const EMAIndicator: IndicatorDefinition = {\n metadata: {\n id: 'ema',\n name: 'EMA',\n description: 'Exponential Moving Average - gives more weight to recent prices',\n category: IndicatorCategory.TREND,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 12,\n description: 'Number of bars for EMA calculation',\n min: 1,\n max: 500,\n step: 1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#10b981',\n description: 'Color of the EMA line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the EMA line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: true,\n },\n calculate: (bars, settings) => {\n const emaValues = calculateEMA(bars, settings.period);\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: emaValues[i],\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { calculateRSI } from '../utils/calculations';\n\nexport const RSIIndicator: IndicatorDefinition = {\n metadata: {\n id: 'rsi',\n name: 'RSI',\n description: 'Relative Strength Index - momentum oscillator measuring speed and magnitude of price changes',\n category: IndicatorCategory.MOMENTUM,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 14,\n description: 'Number of bars for RSI calculation',\n min: 2,\n max: 100,\n step: 1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#8b5cf6',\n description: 'Color of the RSI line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the RSI line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: false,\n },\n calculate: (bars, settings) => {\n const rsiValues = calculateRSI(bars, settings.period);\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: rsiValues[i],\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { calculateBollingerBands } from '../utils/calculations';\n\nexport const BollingerBandsIndicator: IndicatorDefinition = {\n metadata: {\n id: 'bollinger',\n name: 'Bollinger Bands',\n description: 'Bollinger Bands - volatility bands placed above and below a moving average',\n category: IndicatorCategory.VOLATILITY,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 20,\n description: 'Number of bars for moving average',\n min: 2,\n max: 200,\n step: 1,\n },\n stdDev: {\n type: 'number',\n label: 'Standard Deviation',\n defaultValue: 2,\n description: 'Number of standard deviations for bands',\n min: 0.5,\n max: 5,\n step: 0.1,\n },\n upperColor: {\n type: 'color',\n label: 'Upper Band Color',\n defaultValue: '#ef4444',\n description: 'Color of the upper band',\n },\n middleColor: {\n type: 'color',\n label: 'Middle Band Color',\n defaultValue: '#3b82f6',\n description: 'Color of the middle band',\n },\n lowerColor: {\n type: 'color',\n label: 'Lower Band Color',\n defaultValue: '#10b981',\n description: 'Color of the lower band',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the band lines',\n min: 1,\n max: 5,\n step: 1,\n },\n showFill: {\n type: 'boolean',\n label: 'Show Fill',\n defaultValue: true,\n description: 'Show shaded area between bands',\n },\n fillColor: {\n type: 'color',\n label: 'Fill Color',\n defaultValue: 'rgba(59, 130, 246, 0.1)',\n description: 'Color of the shaded area between bands',\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 3,\n overlay: true,\n hasBandFill: true,\n fillBands: {\n upper: 'upper',\n lower: 'lower',\n },\n },\n calculate: (bars, settings) => {\n const { upper, middle, lower } = calculateBollingerBands(\n bars,\n settings.period,\n settings.stdDev\n );\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: middle[i],\n upper: upper[i],\n lower: lower[i],\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { OHLCVBar } from '../../types/chart';\n\ntype ResetPeriod = 'none' | 'daily' | 'weekly' | 'monthly';\n\nfunction calculateVWAPWithBands(\n bars: OHLCVBar[],\n {\n reset = 'none' as ResetPeriod,\n bandMultiplier = 1,\n includeBands = true,\n }: {\n reset?: ResetPeriod;\n bandMultiplier?: number;\n includeBands?: boolean;\n }\n) {\n if (!bars.length) return { vwap: [], upper: [], lower: [] };\n\n let cumulativeVolume = 0;\n let cumulativeTPV = 0;\n let sessionPrices: number[] = [];\n\n const vwap: number[] = [];\n const upper: number[] = [];\n const lower: number[] = [];\n\n const getWeek = (d: Date) => {\n const day = new Date(Date.UTC(d.getFullYear(), d.getMonth(), d.getDate()));\n const dayNum = day.getUTCDay() || 7;\n day.setUTCDate(day.getUTCDate() + 4 - dayNum);\n const yearStart = new Date(Date.UTC(day.getUTCFullYear(), 0, 1));\n return Math.ceil(\n ((day.getTime() - yearStart.getTime()) / 86400000 + 1) / 7,\n );\n };\n\n const std = (arr: number[]) => {\n const mean = arr.reduce((a, b) => a + b, 0) / arr.length;\n return Math.sqrt(arr.reduce((a, b) => a + (b - mean) ** 2, 0) / arr.length);\n };\n\n for (let i = 0; i < bars.length; i++) {\n const bar = bars[i];\n const typical = (bar.high + bar.low + bar.close) / 3;\n\n if (i > 0 && reset !== 'none') {\n const prev = new Date(bars[i - 1].timestamp);\n const curr = new Date(bar.timestamp);\n let resetFlag = false;\n\n if (reset === 'daily') {\n resetFlag =\n curr.getDate() !== prev.getDate() ||\n curr.getMonth() !== prev.getMonth() ||\n curr.getFullYear() !== prev.getFullYear();\n } else if (reset === 'weekly') {\n resetFlag =\n getWeek(curr) !== getWeek(prev) ||\n curr.getFullYear() !== prev.getFullYear();\n } else if (reset === 'monthly') {\n resetFlag =\n curr.getMonth() !== prev.getMonth() ||\n curr.getFullYear() !== prev.getFullYear();\n }\n\n if (resetFlag) {\n cumulativeVolume = 0;\n cumulativeTPV = 0;\n sessionPrices = [];\n }\n }\n\n cumulativeTPV += typical * bar.volume;\n cumulativeVolume += bar.volume;\n sessionPrices.push(typical);\n\n const vwapValue = cumulativeTPV / cumulativeVolume;\n vwap.push(vwapValue);\n\n if (includeBands && sessionPrices.length > 1) {\n const sigma = std(sessionPrices);\n upper.push(vwapValue + sigma * bandMultiplier);\n lower.push(vwapValue - sigma * bandMultiplier);\n } else {\n upper.push(NaN);\n lower.push(NaN);\n }\n }\n\n return { vwap, upper, lower };\n}\n\nexport const VWAPIndicator: IndicatorDefinition = {\n metadata: {\n id: 'vwap',\n name: 'VWAP',\n description: 'Volume Weighted Average Price with standard deviation bands',\n category: IndicatorCategory.VOLUME,\n version: '1.0.0',\n },\n settings: {\n reset: {\n type: 'select',\n label: 'Reset Period',\n defaultValue: 'daily',\n description: 'When to reset VWAP calculation',\n options: [\n { label: 'None', value: 'none' },\n { label: 'Daily', value: 'daily' },\n { label: 'Weekly', value: 'weekly' },\n { label: 'Monthly', value: 'monthly' },\n ],\n },\n bandMultiplier: {\n type: 'number',\n label: 'Band Multiplier',\n defaultValue: 1,\n description: 'Standard deviation multiplier for bands',\n min: 0.5,\n max: 5,\n step: 0.1,\n },\n showBands: {\n type: 'boolean',\n label: 'Show Bands',\n defaultValue: true,\n description: 'Show standard deviation bands',\n },\n vwapColor: {\n type: 'color',\n label: 'VWAP Color',\n defaultValue: '#f59e0b',\n description: 'Color of the VWAP line',\n },\n upperColor: {\n type: 'color',\n label: 'Upper Band Color',\n defaultValue: '#ef4444',\n description: 'Color of the upper band',\n },\n lowerColor: {\n type: 'color',\n label: 'Lower Band Color',\n defaultValue: '#10b981',\n description: 'Color of the lower band',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the lines',\n min: 1,\n max: 5,\n step: 1,\n },\n showFill: {\n type: 'boolean',\n label: 'Show Fill',\n defaultValue: true,\n description: 'Show shaded area between bands',\n },\n fillColor: {\n type: 'color',\n label: 'Fill Color',\n defaultValue: 'rgba(245, 158, 11, 0.1)',\n description: 'Color of the shaded area between bands',\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 3,\n overlay: true,\n hasBandFill: true,\n fillBands: {\n upper: 'upper',\n lower: 'lower',\n },\n },\n calculate: (bars, settings) => {\n const { vwap, upper, lower } = calculateVWAPWithBands(bars, {\n reset: settings.reset as ResetPeriod,\n bandMultiplier: settings.bandMultiplier,\n includeBands: settings.showBands,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: vwap[i],\n upper: upper[i],\n lower: lower[i],\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { stochastic } from 'fast-technical-indicators';\n\nexport const StochasticIndicator: IndicatorDefinition = {\n metadata: {\n id: 'stochastic',\n name: 'Stochastic Oscillator',\n description: 'Compares closing price to price range over time - momentum indicator',\n category: IndicatorCategory.MOMENTUM,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period (K)',\n defaultValue: 14,\n description: 'Number of bars for %K calculation',\n min: 2,\n max: 100,\n step: 1,\n },\n signalPeriod: {\n type: 'number',\n label: 'Signal Period (D)',\n defaultValue: 3,\n description: 'Number of bars for %D signal line',\n min: 1,\n max: 50,\n step: 1,\n },\n kColor: {\n type: 'color',\n label: '%K Line Color',\n defaultValue: '#3b82f6',\n description: 'Color of the %K line',\n },\n dColor: {\n type: 'color',\n label: '%D Line Color',\n defaultValue: '#ef4444',\n description: 'Color of the %D signal line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the indicator lines',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 2,\n overlay: false,\n },\n calculate: (bars, settings) => {\n const high = bars.map(bar => bar.high);\n const low = bars.map(bar => bar.low);\n const close = bars.map(bar => bar.close);\n\n const stochValues = stochastic({\n high,\n low,\n close,\n period: settings.period,\n signalPeriod: settings.signalPeriod,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: stochValues[i]?.k ?? NaN,\n signal: stochValues[i]?.d ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { obv } from 'fast-technical-indicators';\n\nexport const OBVIndicator: IndicatorDefinition = {\n metadata: {\n id: 'obv',\n name: 'OBV',\n description: 'On-Balance Volume - cumulative volume indicator showing buying/selling pressure',\n category: IndicatorCategory.VOLUME,\n version: '1.0.0',\n },\n settings: {\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#10b981',\n description: 'Color of the OBV line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the OBV line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: false,\n },\n calculate: (bars) => {\n const close = bars.map(bar => bar.close);\n const volume = bars.map(bar => bar.volume || 0);\n\n const obvValues = obv({ close, volume });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: obvValues[i] ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { mfi } from 'fast-technical-indicators';\n\nexport const MFIIndicator: IndicatorDefinition = {\n metadata: {\n id: 'mfi',\n name: 'MFI',\n description: 'Money Flow Index - volume-weighted momentum indicator (RSI with volume)',\n category: IndicatorCategory.VOLUME,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 14,\n description: 'Number of bars for MFI calculation',\n min: 2,\n max: 100,\n step: 1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#f59e0b',\n description: 'Color of the MFI line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the MFI line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: false,\n },\n calculate: (bars, settings) => {\n const high = bars.map(bar => bar.high);\n const low = bars.map(bar => bar.low);\n const close = bars.map(bar => bar.close);\n const volume = bars.map(bar => bar.volume || 0);\n\n const mfiValues = mfi({\n high,\n low,\n close,\n volume,\n period: settings.period,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: mfiValues[i] ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { forceindex } from 'fast-technical-indicators';\n\nexport const ForceIndexIndicator: IndicatorDefinition = {\n metadata: {\n id: 'forceindex',\n name: 'Force Index',\n description: 'Measures buying/selling pressure using price and volume',\n category: IndicatorCategory.VOLUME,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 13,\n description: 'Smoothing period for force index',\n min: 1,\n max: 100,\n step: 1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#8b5cf6',\n description: 'Color of the Force Index line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the Force Index line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: false,\n },\n calculate: (bars, settings) => {\n const close = bars.map(bar => bar.close);\n const volume = bars.map(bar => bar.volume || 0);\n\n const forceValues = forceindex({\n close,\n volume,\n period: settings.period,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: forceValues[i] ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { atr } from 'fast-technical-indicators';\n\nexport const ATRIndicator: IndicatorDefinition = {\n metadata: {\n id: 'atr',\n name: 'ATR',\n description: 'Average True Range - measures market volatility',\n category: IndicatorCategory.VOLATILITY,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 14,\n description: 'Number of bars for ATR calculation',\n min: 1,\n max: 100,\n step: 1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#14b8a6',\n description: 'Color of the ATR line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the ATR line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: false,\n },\n calculate: (bars, settings) => {\n const high = bars.map(bar => bar.high);\n const low = bars.map(bar => bar.low);\n const close = bars.map(bar => bar.close);\n\n const atrValues = atr({\n high,\n low,\n close,\n period: settings.period,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: atrValues[i] ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { adx } from 'fast-technical-indicators';\n\nexport const ADXIndicator: IndicatorDefinition = {\n metadata: {\n id: 'adx',\n name: 'ADX',\n description: 'Average Directional Index - measures trend strength (not direction)',\n category: IndicatorCategory.TREND,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 14,\n description: 'Number of bars for ADX calculation',\n min: 2,\n max: 100,\n step: 1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#06b6d4',\n description: 'Color of the ADX line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the ADX line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: false,\n },\n calculate: (bars, settings) => {\n const high = bars.map(bar => bar.high);\n const low = bars.map(bar => bar.low);\n const close = bars.map(bar => bar.close);\n\n const adxValues = adx({\n high,\n low,\n close,\n period: settings.period,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: adxValues[i]?.adx ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { macd } from 'fast-technical-indicators';\n\nexport const MACDIndicator: IndicatorDefinition = {\n metadata: {\n id: 'macd',\n name: 'MACD',\n description: 'Moving Average Convergence Divergence - trend-following momentum indicator',\n category: IndicatorCategory.MOMENTUM,\n version: '1.0.0',\n },\n settings: {\n fastPeriod: {\n type: 'number',\n label: 'Fast Period',\n defaultValue: 12,\n description: 'Period for fast EMA',\n min: 2,\n max: 100,\n step: 1,\n },\n slowPeriod: {\n type: 'number',\n label: 'Slow Period',\n defaultValue: 26,\n description: 'Period for slow EMA',\n min: 2,\n max: 100,\n step: 1,\n },\n signalPeriod: {\n type: 'number',\n label: 'Signal Period',\n defaultValue: 9,\n description: 'Period for signal line',\n min: 1,\n max: 50,\n step: 1,\n },\n macdColor: {\n type: 'color',\n label: 'MACD Line Color',\n defaultValue: '#3b82f6',\n description: 'Color of the MACD line',\n },\n signalColor: {\n type: 'color',\n label: 'Signal Line Color',\n defaultValue: '#ef4444',\n description: 'Color of the signal line',\n },\n histogramColor: {\n type: 'color',\n label: 'Histogram Color',\n defaultValue: '#10b981',\n description: 'Color of the histogram',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the MACD and signal lines',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 3,\n overlay: false,\n },\n calculate: (bars, settings) => {\n const values = bars.map(bar => bar.close);\n\n const macdValues = macd({\n values,\n fastPeriod: settings.fastPeriod,\n slowPeriod: settings.slowPeriod,\n signalPeriod: settings.signalPeriod,\n SimpleMAOscillator: false,\n SimpleMASignal: false,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: macdValues[i]?.MACD ?? NaN,\n signal: macdValues[i]?.signal ?? NaN,\n histogram: macdValues[i]?.histogram ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { psar } from 'fast-technical-indicators';\n\nexport const PSARIndicator: IndicatorDefinition = {\n metadata: {\n id: 'psar',\n name: 'Parabolic SAR',\n description: 'Parabolic Stop and Reverse - shows potential reversal points as dots',\n category: IndicatorCategory.TREND,\n version: '1.0.0',\n },\n settings: {\n step: {\n type: 'number',\n label: 'Step (AF)',\n defaultValue: 0.02,\n description: 'Acceleration Factor step',\n min: 0.001,\n max: 1,\n step: 0.001,\n },\n max: {\n type: 'number',\n label: 'Max AF',\n defaultValue: 0.2,\n description: 'Maximum Acceleration Factor',\n min: 0.01,\n max: 1,\n step: 0.01,\n },\n color: {\n type: 'color',\n label: 'Color',\n defaultValue: '#f59e0b',\n description: 'Color of the SAR dots',\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: true,\n },\n calculate: (bars, settings) => {\n const high = bars.map(bar => bar.high);\n const low = bars.map(bar => bar.low);\n\n const psarValues = psar({\n high,\n low,\n step: settings.step,\n max: settings.max,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: psarValues[i] ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { cci } from 'fast-technical-indicators';\n\nexport const CCIIndicator: IndicatorDefinition = {\n metadata: {\n id: 'cci',\n name: 'CCI',\n description: 'Commodity Channel Index - identifies cyclical trends and overbought/oversold levels',\n category: IndicatorCategory.OSCILLATORS,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 20,\n description: 'Number of bars for CCI calculation',\n min: 2,\n max: 100,\n step: 1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#ec4899',\n description: 'Color of the CCI line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the CCI line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: false,\n },\n calculate: (bars, settings) => {\n const high = bars.map(bar => bar.high);\n const low = bars.map(bar => bar.low);\n const close = bars.map(bar => bar.close);\n\n const cciValues = cci({\n high,\n low,\n close,\n period: settings.period,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: cciValues[i] ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { williamsr } from 'fast-technical-indicators';\n\nexport const WilliamsRIndicator: IndicatorDefinition = {\n metadata: {\n id: 'williamsr',\n name: 'Williams %R',\n description: 'Williams Percent Range - momentum indicator showing overbought/oversold levels',\n category: IndicatorCategory.MOMENTUM,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 14,\n description: 'Number of bars for Williams %R calculation',\n min: 2,\n max: 100,\n step: 1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#a855f7',\n description: 'Color of the Williams %R line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the Williams %R line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: false,\n },\n calculate: (bars, settings) => {\n const high = bars.map(bar => bar.high);\n const low = bars.map(bar => bar.low);\n const close = bars.map(bar => bar.close);\n\n const williamsValues = williamsr({\n high,\n low,\n close,\n period: settings.period,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: williamsValues[i] ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { keltnerchannel } from 'fast-technical-indicators';\n\nexport const KeltnerChannelsIndicator: IndicatorDefinition = {\n metadata: {\n id: 'keltner',\n name: 'Keltner Channels',\n description: 'Volatility-based channels using ATR - similar to Bollinger Bands',\n category: IndicatorCategory.VOLATILITY,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 20,\n description: 'Period for middle line (EMA)',\n min: 2,\n max: 200,\n step: 1,\n },\n atrPeriod: {\n type: 'number',\n label: 'ATR Period',\n defaultValue: 10,\n description: 'Period for ATR calculation',\n min: 1,\n max: 100,\n step: 1,\n },\n atrMultiplier: {\n type: 'number',\n label: 'ATR Multiplier',\n defaultValue: 2,\n description: 'Multiplier for channel width',\n min: 0.1,\n max: 10,\n step: 0.1,\n },\n upperColor: {\n type: 'color',\n label: 'Upper Band Color',\n defaultValue: '#ef4444',\n description: 'Color of the upper band',\n },\n middleColor: {\n type: 'color',\n label: 'Middle Line Color',\n defaultValue: '#3b82f6',\n description: 'Color of the middle line',\n },\n lowerColor: {\n type: 'color',\n label: 'Lower Band Color',\n defaultValue: '#10b981',\n description: 'Color of the lower band',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the channel lines',\n min: 1,\n max: 5,\n step: 1,\n },\n showFill: {\n type: 'boolean',\n label: 'Show Fill',\n defaultValue: true,\n description: 'Fill area between bands',\n },\n fillColor: {\n type: 'color',\n label: 'Fill Color',\n defaultValue: 'rgba(59, 130, 246, 0.1)',\n description: 'Color of the channel fill',\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 3,\n overlay: true,\n hasBandFill: true,\n },\n calculate: (bars, settings) => {\n const high = bars.map(bar => bar.high);\n const low = bars.map(bar => bar.low);\n const close = bars.map(bar => bar.close);\n\n const keltnerValues = keltnerchannel({\n high,\n low,\n close,\n period: settings.period,\n atrPeriod: settings.atrPeriod,\n multiplier: settings.atrMultiplier,\n } as any);\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: keltnerValues[i]?.middle ?? NaN,\n upper: keltnerValues[i]?.upper ?? NaN,\n lower: keltnerValues[i]?.lower ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { supertrend } from 'fast-technical-indicators';\n\nexport const SuperTrendIndicator: IndicatorDefinition = {\n metadata: {\n id: 'supertrend',\n name: 'SuperTrend',\n description: 'Modern trend-following indicator with clear buy/sell signals',\n category: IndicatorCategory.TREND,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 10,\n description: 'Period for ATR calculation',\n min: 1,\n max: 100,\n step: 1,\n },\n multiplier: {\n type: 'number',\n label: 'Multiplier',\n defaultValue: 3,\n description: 'ATR multiplier for bands',\n min: 0.1,\n max: 10,\n step: 0.1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#06b6d4',\n description: 'Color of the SuperTrend line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the SuperTrend line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: true,\n },\n calculate: (bars, settings) => {\n const high = bars.map(bar => bar.high);\n const low = bars.map(bar => bar.low);\n const close = bars.map(bar => bar.close);\n\n const supertrendValues = supertrend({\n high,\n low,\n close,\n period: settings.period,\n multiplier: settings.multiplier,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: supertrendValues[i]?.supertrend ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { ichimokucloud } from 'fast-technical-indicators';\nimport { displaceArray } from '../utils/calculations';\n\nexport const IchimokuIndicator: IndicatorDefinition = {\n metadata: {\n id: 'ichimoku',\n name: 'Ichimoku Cloud',\n description: 'Comprehensive trend system with conversion, base, and span lines forming a cloud',\n category: IndicatorCategory.TREND,\n version: '1.0.0',\n },\n settings: {\n conversionPeriod: {\n type: 'number',\n label: 'Conversion Period (Tenkan)',\n defaultValue: 9,\n description: 'Period for conversion line',\n min: 1,\n max: 100,\n step: 1,\n },\n basePeriod: {\n type: 'number',\n label: 'Base Period (Kijun)',\n defaultValue: 26,\n description: 'Period for base line',\n min: 1,\n max: 100,\n step: 1,\n },\n spanPeriod: {\n type: 'number',\n label: 'Span Period (Senkou)',\n defaultValue: 52,\n description: 'Period for span B',\n min: 1,\n max: 200,\n step: 1,\n },\n displacement: {\n type: 'number',\n label: 'Displacement',\n defaultValue: 26,\n description: 'Forward displacement for span lines',\n min: 0,\n max: 100,\n step: 1,\n },\n conversionColor: {\n type: 'color',\n label: 'Conversion Line Color',\n defaultValue: '#3b82f6',\n description: 'Color of the conversion line',\n },\n baseColor: {\n type: 'color',\n label: 'Base Line Color',\n defaultValue: '#ef4444',\n description: 'Color of the base line',\n },\n spanAColor: {\n type: 'color',\n label: 'Span A Color',\n defaultValue: '#10b981',\n description: 'Color of span A (cloud edge)',\n },\n spanBColor: {\n type: 'color',\n label: 'Span B Color',\n defaultValue: '#f59e0b',\n description: 'Color of span B (cloud edge)',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the indicator lines',\n min: 1,\n max: 5,\n step: 1,\n },\n showCloud: {\n type: 'boolean',\n label: 'Show Cloud',\n defaultValue: true,\n description: 'Fill area between span A and span B',\n },\n cloudColor: {\n type: 'color',\n label: 'Cloud Color',\n defaultValue: 'rgba(59, 130, 246, 0.1)',\n description: 'Color of the cloud fill',\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 5,\n overlay: true,\n hasBandFill: true,\n fillBands: {\n upper: 'spanA',\n lower: 'spanB',\n },\n },\n calculate: (bars, settings) => {\n const high = bars.map(bar => bar.high);\n const low = bars.map(bar => bar.low);\n\n const ichimokuValues = ichimokucloud({\n high,\n low,\n conversionPeriod: settings.conversionPeriod,\n basePeriod: settings.basePeriod,\n spanPeriod: settings.spanPeriod,\n displacement: 0,\n });\n\n const conversion = bars.map((_, i) => ichimokuValues[i]?.conversion ?? NaN);\n const base = bars.map((_, i) => ichimokuValues[i]?.base ?? NaN);\n const spanA = bars.map((_, i) => ichimokuValues[i]?.spanA ?? NaN);\n const spanB = bars.map((_, i) => ichimokuValues[i]?.spanB ?? NaN);\n\n const displacedSpanA = displaceArray(spanA, settings.displacement);\n const displacedSpanB = displaceArray(spanB, settings.displacement);\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: conversion[i],\n base: base[i],\n spanA: displacedSpanA[i],\n spanB: displacedSpanB[i],\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { donchianchannels } from 'fast-technical-indicators';\n\nexport const DonchianChannelsIndicator: IndicatorDefinition = {\n metadata: {\n id: 'donchian',\n name: 'Donchian Channels',\n description: 'Highest high and lowest low over a period - classic breakout indicator',\n category: IndicatorCategory.VOLATILITY,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 20,\n description: 'Number of bars to look back',\n min: 2,\n max: 200,\n step: 1,\n },\n upperColor: {\n type: 'color',\n label: 'Upper Band Color',\n defaultValue: '#ef4444',\n description: 'Color of the upper band',\n },\n middleColor: {\n type: 'color',\n label: 'Middle Line Color',\n defaultValue: '#3b82f6',\n description: 'Color of the middle line',\n },\n lowerColor: {\n type: 'color',\n label: 'Lower Band Color',\n defaultValue: '#10b981',\n description: 'Color of the lower band',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the channel lines',\n min: 1,\n max: 5,\n step: 1,\n },\n showFill: {\n type: 'boolean',\n label: 'Show Fill',\n defaultValue: true,\n description: 'Fill area between bands',\n },\n fillColor: {\n type: 'color',\n label: 'Fill Color',\n defaultValue: 'rgba(59, 130, 246, 0.1)',\n description: 'Color of the channel fill',\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 3,\n overlay: true,\n hasBandFill: true,\n fillBands: {\n upper: 'upper',\n lower: 'lower',\n },\n },\n calculate: (bars, settings) => {\n const high = bars.map(bar => bar.high);\n const low = bars.map(bar => bar.low);\n\n const donchianValues = donchianchannels({\n high,\n low,\n period: settings.period,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: donchianValues[i]?.middle ?? NaN,\n upper: donchianValues[i]?.upper ?? NaN,\n lower: donchianValues[i]?.lower ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { roc } from 'fast-technical-indicators';\n\nexport const ROCIndicator: IndicatorDefinition = {\n metadata: {\n id: 'roc',\n name: 'ROC',\n description: 'Rate of Change - measures percentage change in price over a period',\n category: IndicatorCategory.MOMENTUM,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 12,\n description: 'Number of bars for ROC calculation',\n min: 1,\n max: 100,\n step: 1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#06b6d4',\n description: 'Color of the ROC line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the ROC line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: false,\n },\n calculate: (bars, settings) => {\n const values = bars.map(bar => bar.close);\n\n const rocValues = roc({\n values,\n period: settings.period,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: rocValues[i] ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { stochasticrsi } from 'fast-technical-indicators';\n\nexport const StochRSIIndicator: IndicatorDefinition = {\n metadata: {\n id: 'stochrsi',\n name: 'Stochastic RSI',\n description: 'Stochastic RSI - applies Stochastic oscillator to RSI values',\n category: IndicatorCategory.MOMENTUM,\n version: '1.0.0',\n },\n settings: {\n rsiPeriod: {\n type: 'number',\n label: 'RSI Period',\n defaultValue: 14,\n description: 'Period for RSI calculation',\n min: 2,\n max: 100,\n step: 1,\n },\n stochPeriod: {\n type: 'number',\n label: 'Stochastic Period',\n defaultValue: 14,\n description: 'Period for Stochastic calculation',\n min: 2,\n max: 100,\n step: 1,\n },\n kPeriod: {\n type: 'number',\n label: '%K Period',\n defaultValue: 3,\n description: 'Smoothing period for %K',\n min: 1,\n max: 50,\n step: 1,\n },\n dPeriod: {\n type: 'number',\n label: '%D Period',\n defaultValue: 3,\n description: 'Smoothing period for %D signal line',\n min: 1,\n max: 50,\n step: 1,\n },\n kColor: {\n type: 'color',\n label: '%K Line Color',\n defaultValue: '#3b82f6',\n description: 'Color of the %K line',\n },\n dColor: {\n type: 'color',\n label: '%D Line Color',\n defaultValue: '#ef4444',\n description: 'Color of the %D signal line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the indicator lines',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 2,\n overlay: false,\n },\n calculate: (bars, settings) => {\n const values = bars.map(bar => bar.close);\n\n const stochRSIValues = stochasticrsi({\n values,\n rsiPeriod: settings.rsiPeriod,\n stochasticPeriod: settings.stochPeriod,\n kPeriod: settings.kPeriod,\n dPeriod: settings.dPeriod,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: stochRSIValues[i]?.k ?? NaN,\n signal: stochRSIValues[i]?.d ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { wma } from 'fast-technical-indicators';\n\nexport const WMAIndicator: IndicatorDefinition = {\n metadata: {\n id: 'wma',\n name: 'WMA',\n description: 'Weighted Moving Average - gives more weight to recent prices',\n category: IndicatorCategory.TREND,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 20,\n description: 'Number of bars to average',\n min: 1,\n max: 500,\n step: 1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#f59e0b',\n description: 'Color of the WMA line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the WMA line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: true,\n },\n calculate: (bars, settings) => {\n const values = bars.map(bar => bar.close);\n\n const wmaValues = wma({\n values,\n period: settings.period,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: wmaValues[i] ?? NaN,\n }));\n },\n};\n","import { indicatorRegistry } from '../core/registry';\nimport { SMAIndicator } from './sma';\nimport { EMAIndicator } from './ema';\nimport { RSIIndicator } from './rsi';\nimport { BollingerBandsIndicator } from './bollinger';\nimport { VWAPIndicator } from './vwap';\nimport { StochasticIndicator } from './stochastic';\nimport { OBVIndicator } from './obv';\nimport { MFIIndicator } from './mfi';\nimport { ForceIndexIndicator } from './forceindex';\nimport { ATRIndicator } from './atr';\nimport { ADXIndicator } from './adx';\nimport { MACDIndicator } from './macd';\nimport { PSARIndicator } from './psar';\nimport { CCIIndicator } from './cci';\nimport { WilliamsRIndicator } from './williamsr';\nimport { KeltnerChannelsIndicator } from './keltner';\nimport { SuperTrendIndicator } from './supertrend';\nimport { IchimokuIndicator } from './ichimoku';\nimport { DonchianChannelsIndicator } from './donchian';\nimport { ROCIndicator } from './roc';\nimport { StochRSIIndicator } from './stochrsi';\nimport { WMAIndicator } from './wma';\n\nexport function registerBuiltInIndicators(): void {\n indicatorRegistry.register(SMAIndicator);\n indicatorRegistry.register(EMAIndicator);\n indicatorRegistry.register(RSIIndicator);\n indicatorRegistry.register(BollingerBandsIndicator);\n indicatorRegistry.register(VWAPIndicator);\n indicatorRegistry.register(StochasticIndicator);\n indicatorRegistry.register(OBVIndicator);\n indicatorRegistry.register(MFIIndicator);\n indicatorRegistry.register(ForceIndexIndicator);\n indicatorRegistry.register(ATRIndicator);\n indicatorRegistry.register(ADXIndicator);\n indicatorRegistry.register(MACDIndicator);\n indicatorRegistry.register(PSARIndicator);\n indicatorRegistry.register(CCIIndicator);\n indicatorRegistry.register(WilliamsRIndicator);\n indicatorRegistry.register(KeltnerChannelsIndicator);\n indicatorRegistry.register(SuperTrendIndicator);\n indicatorRegistry.register(IchimokuIndicator);\n indicatorRegistry.register(DonchianChannelsIndicator);\n indicatorRegistry.register(ROCIndicator);\n indicatorRegistry.register(StochRSIIndicator);\n indicatorRegistry.register(WMAIndicator);\n}\n\nexport {\n SMAIndicator,\n EMAIndicator,\n RSIIndicator,\n BollingerBandsIndicator,\n VWAPIndicator,\n StochasticIndicator,\n OBVIndicator,\n MFIIndicator,\n ForceIndexIndicator,\n ATRIndicator,\n ADXIndicator,\n MACDIndicator,\n PSARIndicator,\n CCIIndicator,\n WilliamsRIndicator,\n KeltnerChannelsIndicator,\n SuperTrendIndicator,\n IchimokuIndicator,\n DonchianChannelsIndicator,\n ROCIndicator,\n StochRSIIndicator,\n WMAIndicator,\n};\n","import { OHLCVBar } from '../types/chart';\nimport {\n BarDataAdapter,\n BarDataAdapterOptions,\n HistoricalDataParams,\n RealtimeHandlers,\n RealtimeSubscription,\n} from './types';\nimport { normalizeTimestamp, validateAndNormalizeBars } from '../utils/barUtils';\n\ninterface AlpacaBar {\n t: string;\n o: number;\n h: number;\n l: number;\n c: number;\n v: number;\n n?: number;\n vw?: number;\n}\n\ninterface AlpacaBarsResponse {\n bars: {\n [symbol: string]: AlpacaBar[];\n };\n next_page_token?: string;\n}\n\ninterface AlpacaTrade {\n T: string;\n S: string;\n p: number;\n s: number;\n t: string;\n}\n\ninterface AlpacaBar_WS {\n T: string;\n S: string;\n o: number;\n h: number;\n l: number;\n c: number;\n v: number;\n t: string;\n n?: number;\n vw?: number;\n}\n\nexport class AlpacaBarAdapter implements BarDataAdapter {\n private apiKey: string;\n private secretKey: string;\n private baseUrl: string;\n private wsUrl: string;\n private ws: WebSocket | null = null;\n private reconnectAttempts = 0;\n private maxReconnectAttempts = 5;\n private reconnectDelay = 1000;\n private currentHandlers: RealtimeHandlers | null = null;\n private currentSymbol: string | null = null;\n private authenticated = false;\n\n constructor(options: BarDataAdapterOptions) {\n if (!options.apiKey || !options.secretKey) {\n throw new Error('Alpaca API key and secret key are required');\n }\n\n this.apiKey = options.apiKey;\n this.secretKey = options.secretKey;\n this.baseUrl = options.baseUrl || 'https://data.alpaca.markets';\n this.wsUrl = options.wsUrl || 'wss://stream.data.alpaca.markets/v2/iex';\n }\n\n async fetchHistoricalBars(params: HistoricalDataParams): Promise<OHLCVBar[]> {\n const { symbol, timeframe, before, after, limit = 500 } = params;\n\n const url = new URL(`${this.baseUrl}/v2/stocks/${symbol}/bars`);\n url.searchParams.set('timeframe', timeframe);\n url.searchParams.set('limit', limit.toString());\n\n if (before) {\n const beforeDate = new Date(before).toISOString();\n url.searchParams.set('end', beforeDate);\n }\n\n if (after) {\n const afterDate = new Date(after).toISOString();\n url.searchParams.set('start', afterDate);\n }\n\n url.searchParams.set('feed', 'iex');\n\n const headers = {\n 'APCA-API-KEY-ID': this.apiKey,\n 'APCA-API-SECRET-KEY': this.secretKey,\n };\n\n try {\n const response = await fetch(url.toString(), { headers });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Alpaca API error: ${response.status} ${errorText}`);\n }\n\n const data: AlpacaBarsResponse = await response.json();\n const bars = data.bars[symbol] || [];\n\n return this.convertAlpacaBars(bars);\n } catch (error) {\n console.error('Failed to fetch Alpaca bars:', error);\n throw error;\n }\n }\n\n subscribeRealtime(symbol: string, handlers: RealtimeHandlers): RealtimeSubscription {\n this.currentSymbol = symbol;\n this.currentHandlers = handlers;\n\n this.connectWebSocket();\n\n return {\n unsubscribe: () => this.disconnect(),\n };\n }\n\n unsubscribeAll(): void {\n this.disconnect();\n }\n\n private connectWebSocket(): void {\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n console.log('WebSocket already connected');\n return;\n }\n\n try {\n this.ws = new WebSocket(this.wsUrl);\n\n this.ws.onopen = () => {\n console.log('Alpaca WebSocket connected');\n this.authenticated = false;\n this.authenticate();\n };\n\n this.ws.onmessage = (event) => {\n this.handleMessage(event.data);\n };\n\n this.ws.onerror = (event) => {\n console.error('Alpaca WebSocket error:', event);\n this.currentHandlers?.onError?.(new Error('WebSocket error'));\n };\n\n this.ws.onclose = () => {\n console.log('Alpaca WebSocket closed');\n this.authenticated = false;\n this.currentHandlers?.onDisconnect?.();\n this.attemptReconnect();\n };\n } catch (error) {\n console.error('Failed to create WebSocket:', error);\n this.currentHandlers?.onError?.(\n error instanceof Error ? error : new Error('Failed to create WebSocket')\n );\n }\n }\n\n private authenticate(): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) return;\n\n const authMessage = {\n action: 'auth',\n key: this.apiKey,\n secret: this.secretKey,\n };\n\n this.ws.send(JSON.stringify(authMessage));\n }\n\n private subscribe(): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN || !this.currentSymbol) return;\n\n const subscribeMessage = {\n action: 'subscribe',\n trades: [this.currentSymbol],\n bars: [this.currentSymbol],\n };\n\n this.ws.send(JSON.stringify(subscribeMessage));\n console.log(`Subscribed to ${this.currentSymbol}`);\n }\n\n private handleMessage(data: string): void {\n try {\n const messages = JSON.parse(data);\n\n if (!Array.isArray(messages)) {\n console.warn('Unexpected message format:', messages);\n return;\n }\n\n for (const message of messages) {\n if (message.T === 'success' && message.msg === 'authenticated') {\n console.log('Alpaca WebSocket authenticated');\n this.authenticated = true;\n this.reconnectAttempts = 0;\n this.currentHandlers?.onConnect?.();\n this.subscribe();\n } else if (message.T === 'error') {\n console.error('Alpaca error:', message.msg);\n this.currentHandlers?.onError?.(new Error(message.msg));\n } else if (message.T === 't') {\n this.handleTrade(message as AlpacaTrade);\n } else if (message.T === 'b') {\n this.handleBar(message as AlpacaBar_WS);\n } else if (message.T === 'subscription') {\n console.log('Subscription confirmed:', message);\n }\n }\n } catch (error) {\n console.error('Failed to parse WebSocket message:', error);\n }\n }\n\n private handleTrade(trade: AlpacaTrade): void {\n if (trade.S !== this.currentSymbol) return;\n\n this.currentHandlers?.onTrade?.(trade.p, trade.s);\n }\n\n private handleBar(bar: AlpacaBar_WS): void {\n if (bar.S !== this.currentSymbol) return;\n\n const ohlcvBar: OHLCVBar = {\n timestamp: new Date(bar.t).getTime(),\n open: bar.o,\n high: bar.h,\n low: bar.l,\n close: bar.c,\n volume: bar.v,\n trade_count: bar.n,\n vwap: bar.vw,\n };\n\n this.currentHandlers?.onBar?.(ohlcvBar);\n }\n\n private attemptReconnect(): void {\n if (this.reconnectAttempts >= this.maxReconnectAttempts) {\n console.error('Max reconnection attempts reached');\n this.currentHandlers?.onError?.(new Error('Max reconnection attempts reached'));\n return;\n }\n\n this.reconnectAttempts++;\n const delay = this.reconnectDelay * Math.pow(2, this.reconnectAttempts - 1);\n\n console.log(`Attempting to reconnect in ${delay}ms (attempt ${this.reconnectAttempts})`);\n\n setTimeout(() => {\n if (this.currentSymbol && this.currentHandlers) {\n this.connectWebSocket();\n }\n }, delay);\n }\n\n private disconnect(): void {\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n this.authenticated = false;\n this.currentSymbol = null;\n this.currentHandlers = null;\n this.reconnectAttempts = 0;\n }\n\n private convertAlpacaBars(bars: AlpacaBar[]): OHLCVBar[] {\n return bars.map(bar => ({\n timestamp: new Date(bar.t).getTime(),\n open: bar.o,\n high: bar.h,\n low: bar.l,\n close: bar.c,\n volume: bar.v,\n trade_count: bar.n,\n vwap: bar.vw,\n }));\n }\n}\n","import { OHLCVBar } from '../types/chart';\nimport {\n BarDataAdapter,\n HistoricalDataParams,\n RealtimeHandlers,\n RealtimeSubscription,\n} from './types';\n\nexport class MockAdapter implements BarDataAdapter {\n private intervalId: number | null = null;\n\n async fetchHistoricalBars(params: HistoricalDataParams): Promise<OHLCVBar[]> {\n const { limit = 100, before } = params;\n\n await new Promise(resolve => setTimeout(resolve, 800));\n\n const bars: OHLCVBar[] = [];\n const now = before || Date.now();\n let price = 100;\n\n for (let i = limit - 1; i >= 0; i--) {\n const timestamp = now - i * 300000;\n const change = (Math.random() - 0.5) * 2;\n price = Math.max(price + change, 1);\n\n const open = price;\n const close = price + (Math.random() - 0.5) * 1.5;\n const high = Math.max(open, close) + Math.random() * 0.5;\n const low = Math.min(open, close) - Math.random() * 0.5;\n\n bars.push({\n timestamp,\n open: Math.max(open, 0.01),\n high: Math.max(high, 0.01),\n low: Math.max(low, 0.01),\n close: Math.max(close, 0.01),\n volume: Math.floor(Math.random() * 10000) + 1000,\n });\n\n price = Math.max(close, 1);\n }\n\n console.log(`MockAdapter: Generated ${bars.length} bars (before: ${before})`);\n console.log('First bar:', bars[0]);\n console.log('Last bar:', bars[bars.length - 1]);\n\n return bars;\n }\n\n subscribeRealtime(symbol: string, handlers: RealtimeHandlers): RealtimeSubscription {\n handlers.onConnect?.();\n\n let lastPrice = 100;\n\n this.intervalId = window.setInterval(() => {\n const now = Date.now();\n const timestamp = Math.floor(now / 300000) * 300000;\n\n const change = (Math.random() - 0.5) * 2;\n lastPrice = Math.max(lastPrice + change, 1);\n\n const open = lastPrice;\n const close = lastPrice + (Math.random() - 0.5) * 1.5;\n const high = Math.max(open, close) + Math.random() * 0.5;\n const low = Math.min(open, close) - Math.random() * 0.5;\n\n const bar: OHLCVBar = {\n timestamp,\n open,\n high,\n low,\n close,\n volume: Math.floor(Math.random() * 10000) + 1000,\n };\n\n handlers.onBar?.(bar);\n lastPrice = close;\n }, 5000);\n\n return {\n unsubscribe: () => this.unsubscribeAll(),\n };\n }\n\n unsubscribeAll(): void {\n if (this.intervalId !== null) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n }\n }\n}\n"]}