velo-plot 1.19.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{ChartCore-DQ691eXH.js → ChartCore-BhQ4j7f5.js} +1299 -1102
- package/dist/ChartCore-BhQ4j7f5.js.map +1 -0
- package/dist/SciPlot-GJvw7GJo.js +463 -0
- package/dist/SciPlot-GJvw7GJo.js.map +1 -0
- package/dist/axisFormat-SPX-CD5s.js +200 -0
- package/dist/axisFormat-SPX-CD5s.js.map +1 -0
- package/dist/core/InteractionManager.d.ts +1 -0
- package/dist/core/OverlayRenderer.d.ts +11 -0
- package/dist/core/chart/ChartCore.d.ts +5 -0
- package/dist/core/chart/ChartRenderLoop.d.ts +5 -0
- package/dist/core/chart/ChartRenderer.d.ts +5 -0
- package/dist/core/chart/positionLines.d.ts +12 -0
- package/dist/core/chart/types.d.ts +2 -0
- package/dist/core/format/axisFormat.d.ts +2 -1
- package/dist/core/indicator/addIndicator.d.ts +1 -1
- package/dist/core/indicator/indicatorPresets.d.ts +10 -2
- package/dist/core/time/TimeScale.d.ts +2 -2
- package/dist/core/time/applyTimeScale.d.ts +10 -0
- package/dist/createStackedChart-DJSmqerD.js +706 -0
- package/dist/createStackedChart-DJSmqerD.js.map +1 -0
- package/dist/{index-DjeWClO9.js → index-CWipqOLP.js} +2 -2
- package/dist/{index-DjeWClO9.js.map → index-CWipqOLP.js.map} +1 -1
- package/dist/{index.core-BtGFYMOu.js → index.core-fpZ1dYN0.js} +3 -3
- package/dist/{index.core-BtGFYMOu.js.map → index.core-fpZ1dYN0.js.map} +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/mockDatafeed-Cdg5hKEo.js +511 -0
- package/dist/mockDatafeed-Cdg5hKEo.js.map +1 -0
- package/dist/plugins/drawing-tools/index.d.ts +14 -1
- package/dist/plugins/drawing-tools/measure.d.ts +21 -0
- package/dist/plugins/drawing-tools/snapToCandle.d.ts +21 -0
- package/dist/plugins/tools.js +1 -1
- package/dist/react.js +5 -5
- package/dist/trading/datafeed.d.ts +48 -0
- package/dist/trading/index.d.ts +29 -0
- package/dist/trading/mockDatafeed.d.ts +9 -0
- package/dist/trading/ohlcvGenerator.d.ts +25 -0
- package/dist/trading.d.ts +1 -0
- package/dist/trading.js +95 -0
- package/dist/trading.js.map +1 -0
- package/dist/types.d.ts +1 -1
- package/dist/velo-plot.full.js +833 -1054
- package/dist/velo-plot.full.js.map +1 -1
- package/dist/velo-plot.js +13 -13
- package/package.json +13 -1
- package/dist/ChartCore-DQ691eXH.js.map +0 -1
- package/dist/axisFormat-B7o_uIEA.js +0 -127
- package/dist/axisFormat-B7o_uIEA.js.map +0 -1
- package/dist/createStackedChart-BPooTQ9z.js +0 -1164
- package/dist/createStackedChart-BPooTQ9z.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mockDatafeed-Cdg5hKEo.js","sources":["../src/plugins/drawing-tools/snapToCandle.ts","../src/plugins/drawing-tools/measure.ts","../src/plugins/drawing-tools/index.ts","../src/plugins/replay/index.ts","../src/trading/datafeed.ts","../src/trading/mockDatafeed.ts"],"sourcesContent":["/**\n * Snap drawing points to nearest candlestick O/H/L/C (TradingView-style magnet).\n */\n\nexport interface CandleSnapInput {\n x: number;\n y: number;\n barX: Float32Array | Float64Array;\n open: Float32Array | Float64Array;\n high: Float32Array | Float64Array;\n low: Float32Array | Float64Array;\n close: Float32Array | Float64Array;\n dataToPixelX: (x: number) => number;\n dataToPixelY: (y: number) => number;\n pixelThreshold?: number;\n enabled?: boolean;\n}\n\nexport function findNearestBarIndex(\n barX: Float32Array | Float64Array,\n x: number,\n): number {\n if (barX.length === 0) return -1;\n let bestIdx = 0;\n let bestDist = Math.abs(barX[0] - x);\n for (let i = 1; i < barX.length; i++) {\n const d = Math.abs(barX[i] - x);\n if (d < bestDist) {\n bestDist = d;\n bestIdx = i;\n }\n }\n return bestIdx;\n}\n\nexport function snapToCandle(input: CandleSnapInput): { x: number; y: number } {\n if (input.enabled === false || input.barX.length === 0) {\n return { x: input.x, y: input.y };\n }\n\n const idx = findNearestBarIndex(input.barX, input.x);\n if (idx < 0) return { x: input.x, y: input.y };\n\n const barX = input.barX[idx];\n const candidates = [\n input.open[idx],\n input.high[idx],\n input.low[idx],\n input.close[idx],\n ];\n\n const clickPy = input.dataToPixelY(input.y);\n const threshold = input.pixelThreshold ?? 12;\n let bestY = input.y;\n let bestPyDist = Infinity;\n\n for (const cy of candidates) {\n const py = input.dataToPixelY(cy);\n const dist = Math.abs(py - clickPy);\n if (dist < bestPyDist && dist <= threshold) {\n bestPyDist = dist;\n bestY = cy;\n }\n }\n\n return { x: barX, y: bestY };\n}\n","/**\n * Measurement helper for the price-range / measure tool (TradingView-style).\n */\n\nexport interface MeasurePoint {\n x: number;\n y: number;\n}\n\nexport interface Measurement {\n /** Absolute price change (end - start) */\n change: number;\n /** Percentage change relative to the start price */\n percent: number;\n /** Number of bars spanned (rounded X distance) */\n bars: number;\n /** True when the range moves up (change >= 0) */\n up: boolean;\n}\n\nexport function computeMeasurement(a: MeasurePoint, b: MeasurePoint): Measurement {\n const change = b.y - a.y;\n const denom = Math.abs(a.y);\n const percent = denom > 0 ? (change / denom) * 100 : 0;\n const bars = Math.round(Math.abs(b.x - a.x));\n return { change, percent, bars, up: change >= 0 };\n}\n\nexport function formatMeasurement(m: Measurement): string {\n const sign = m.change >= 0 ? \"+\" : \"\";\n return `${sign}${m.change.toFixed(2)} (${sign}${m.percent.toFixed(2)}%) · ${m.bars} bars`;\n}\n\n/** Compact price formatting used for level labels. */\nexport function formatPrice(value: number): string {\n const abs = Math.abs(value);\n const decimals = abs >= 1000 ? 0 : abs >= 1 ? 2 : 4;\n return value.toLocaleString(\"en-US\", {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n });\n}\n","/**\n * PluginDrawingTools — interactive drawing on chart (Stage 2.9).\n * TradingView-style live preview, drag-to-draw, optional candle magnet.\n */\n\nimport type { ChartPlugin, InteractionEvent, PluginContext, PluginManifest } from \"../types\";\nimport type { Annotation } from \"../../core/annotations/types\";\nimport type { Series } from \"../../core/Series\";\nimport { snapToCandle } from \"./snapToCandle\";\nimport { computeMeasurement, formatMeasurement, formatPrice } from \"./measure\";\n\nexport type DrawingMode =\n | \"none\"\n | \"pan\"\n | \"trendline\"\n | \"horizontal\"\n | \"vertical\"\n | \"rectangle\"\n | \"fibonacci\"\n | \"measure\";\n\nconst FIB_LEVELS = [0, 0.236, 0.382, 0.5, 0.618, 0.786, 1];\nconst DRAG_THRESHOLD_PX = 4;\nconst DEFAULT_MEASURE_UP = \"#26a69a\";\nconst DEFAULT_MEASURE_DOWN = \"#ef5350\";\n\nexport interface PluginDrawingToolsConfig {\n /** Default stroke color */\n color?: string;\n /** Enable candle magnet by default */\n magnet?: boolean;\n /** Return to pan mode after each completed stroke (default true) */\n autoDeselect?: boolean;\n /** Notified when drawing mode changes (including auto-deselect to none) */\n onModeChange?: (mode: DrawingMode) => void;\n /** Color for upward measurements (default green) */\n measureUpColor?: string;\n /** Color for downward measurements (default red) */\n measureDownColor?: string;\n}\n\nfunction withAlpha(color: string, alpha: string): string {\n return color.startsWith(\"#\") && color.length === 7 ? color + alpha : color;\n}\n\nexport interface DrawingToolsAPI {\n setMode(mode: DrawingMode): void;\n getMode(): DrawingMode;\n setMagnet(enabled: boolean): void;\n isMagnet(): boolean;\n undo(): boolean;\n redo(): boolean;\n clear(): void;\n}\n\nconst manifest: PluginManifest = {\n name: \"velo-plot-drawing-tools\",\n version: \"1.0.0\",\n description: \"Interactive trendline, horizontal, vertical, rectangle, and fibonacci drawing\",\n provides: [\"drawing\"],\n tags: [\"drawing\", \"annotations\", \"trading\"],\n};\n\ninterface DrawPoint {\n x: number;\n y: number;\n}\n\ninterface DrawState {\n mode: DrawingMode;\n pending: DrawPoint | null;\n start: DrawPoint | null;\n dragging: boolean;\n dragMoved: boolean;\n dragStartPixel: { x: number; y: number } | null;\n cursor: DrawPoint | null;\n magnet: boolean;\n undoStack: Annotation[][];\n redoStack: Annotation[][];\n}\n\nfunction isDrawingMode(mode: DrawingMode): boolean {\n return mode !== \"none\" && mode !== \"pan\";\n}\n\nfunction findCandlestickSeries(ctx: PluginContext): Series | undefined {\n for (const s of ctx.data.getAllSeries()) {\n if (s.getType() === \"candlestick\") return s;\n }\n return undefined;\n}\n\nexport function PluginDrawingTools(\n config: PluginDrawingToolsConfig = {},\n): ChartPlugin<PluginDrawingToolsConfig> {\n let ctx: PluginContext | null = null;\n const autoDeselect = config.autoDeselect !== false;\n let state: DrawState = {\n mode: \"none\",\n pending: null,\n start: null,\n dragging: false,\n dragMoved: false,\n dragStartPixel: null,\n cursor: null,\n magnet: config.magnet ?? false,\n undoStack: [],\n redoStack: [],\n };\n\n const stroke = config.color ?? \"#38bdf8\";\n const measureUp = config.measureUpColor ?? DEFAULT_MEASURE_UP;\n const measureDown = config.measureDownColor ?? DEFAULT_MEASURE_DOWN;\n\n function snapshot(): Annotation[] {\n return ctx?.chart.getAnnotations?.() ?? [];\n }\n\n function pushUndo(): void {\n state.undoStack.push(snapshot());\n state.redoStack = [];\n }\n\n function resetInteractionState(): void {\n state.pending = null;\n state.start = null;\n state.dragging = false;\n state.dragMoved = false;\n state.dragStartPixel = null;\n }\n\n function setModeInternal(mode: DrawingMode): void {\n state.mode = mode;\n resetInteractionState();\n config.onModeChange?.(mode);\n ctx?.requestRender?.();\n }\n\n function finishStroke(): void {\n resetInteractionState();\n if (autoDeselect) {\n setModeInternal(\"none\");\n } else {\n ctx?.requestRender?.();\n }\n }\n\n function resolvePoint(x: number, y: number): DrawPoint {\n if (!ctx || !state.magnet) return { x, y };\n const series = findCandlestickSeries(ctx);\n if (!series) return { x, y };\n const d = series.getData();\n if (!d.open || !d.high || !d.low || !d.close) return { x, y };\n return snapToCandle({\n x,\n y,\n barX: d.x,\n open: d.open,\n high: d.high,\n low: d.low,\n close: d.close,\n dataToPixelX: (dx) => ctx!.coords.dataToPixelX(dx),\n dataToPixelY: (dy) => ctx!.coords.dataToPixelY(dy),\n enabled: true,\n });\n }\n\n function pointFromEvent(pluginCtx: PluginContext, event: InteractionEvent): DrawPoint {\n return resolvePoint(\n pluginCtx.coords.pixelToDataX(event.pixelX),\n pluginCtx.coords.pixelToDataY(event.pixelY),\n );\n }\n\n function commitHorizontal(y: number): void {\n if (!ctx) return;\n pushUndo();\n ctx.chart.addAnnotation({\n type: \"horizontal-line\",\n y,\n color: stroke,\n interactive: true,\n });\n }\n\n function commitVertical(x: number): void {\n if (!ctx) return;\n pushUndo();\n ctx.chart.addAnnotation({\n type: \"vertical-line\",\n x,\n color: stroke,\n interactive: true,\n });\n }\n\n function commitMeasure(p0: DrawPoint, p1: DrawPoint): void {\n if (!ctx) return;\n pushUndo();\n\n const m = computeMeasurement(p0, p1);\n const color = m.up ? measureUp : measureDown;\n const midX = (p0.x + p1.x) / 2;\n ctx.chart.addAnnotation({\n type: \"rectangle\",\n xMin: Math.min(p0.x, p1.x),\n xMax: Math.max(p0.x, p1.x),\n yMin: Math.min(p0.y, p1.y),\n yMax: Math.max(p0.y, p1.y),\n strokeColor: color,\n fillColor: withAlpha(color, \"33\"),\n interactive: true,\n });\n ctx.chart.addAnnotation({\n type: \"arrow\",\n x1: midX,\n y1: p0.y,\n x2: midX,\n y2: p1.y,\n color,\n headStyle: \"filled\",\n interactive: true,\n });\n ctx.chart.addAnnotation({\n type: \"text\",\n x: midX,\n y: p1.y,\n text: formatMeasurement(m),\n color: \"#ffffff\",\n backgroundColor: color,\n padding: 4,\n fontWeight: \"bold\",\n anchor: m.up ? \"bottom-center\" : \"top-center\",\n interactive: true,\n });\n }\n\n function commitTwoPoint(p0: DrawPoint, p1: DrawPoint): void {\n if (!ctx) return;\n\n if (state.mode === \"measure\") {\n commitMeasure(p0, p1);\n return;\n }\n\n pushUndo();\n\n if (state.mode === \"trendline\") {\n ctx.chart.addAnnotation({\n type: \"arrow\",\n x1: p0.x,\n y1: p0.y,\n x2: p1.x,\n y2: p1.y,\n color: stroke,\n interactive: true,\n });\n } else if (state.mode === \"rectangle\") {\n ctx.chart.addAnnotation({\n type: \"rectangle\",\n xMin: Math.min(p0.x, p1.x),\n xMax: Math.max(p0.x, p1.x),\n yMin: Math.min(p0.y, p1.y),\n yMax: Math.max(p0.y, p1.y),\n strokeColor: stroke,\n fillColor: stroke + \"22\",\n interactive: true,\n });\n } else if (state.mode === \"fibonacci\") {\n const yMin = Math.min(p0.y, p1.y);\n const yMax = Math.max(p0.y, p1.y);\n for (const level of FIB_LEVELS) {\n const fy = yMax - (yMax - yMin) * level;\n ctx.chart.addAnnotation({\n type: \"horizontal-line\",\n y: fy,\n color: stroke,\n lineDash: level === 0 || level === 1 ? undefined : [4, 4],\n label: `${(level * 100).toFixed(1)}% ${formatPrice(fy)}`,\n labelPosition: \"right\",\n interactive: true,\n });\n }\n }\n }\n\n function drawPreview(\n c2d: CanvasRenderingContext2D,\n plotArea: { x: number; y: number; width: number; height: number },\n coords: PluginContext[\"coords\"],\n ): void {\n const mode = state.mode;\n if (!isDrawingMode(mode) || !state.cursor) return;\n\n const cursor = state.cursor;\n const anchor = state.pending ?? state.start;\n\n c2d.save();\n c2d.strokeStyle = stroke;\n c2d.lineWidth = 1.5;\n c2d.setLineDash([6, 4]);\n c2d.globalAlpha = 0.85;\n\n const toPx = (x: number, y: number) => ({\n px: coords.dataToPixelX(x),\n py: coords.dataToPixelY(y),\n });\n\n if (mode === \"horizontal\") {\n const { py } = toPx(0, cursor.y);\n c2d.beginPath();\n c2d.moveTo(plotArea.x, py);\n c2d.lineTo(plotArea.x + plotArea.width, py);\n c2d.stroke();\n } else if (mode === \"vertical\") {\n const { px } = toPx(cursor.x, 0);\n c2d.beginPath();\n c2d.moveTo(px, plotArea.y);\n c2d.lineTo(px, plotArea.y + plotArea.height);\n c2d.stroke();\n } else if (anchor) {\n const a = toPx(anchor.x, anchor.y);\n const b = toPx(cursor.x, cursor.y);\n\n if (mode === \"trendline\") {\n c2d.beginPath();\n c2d.moveTo(a.px, a.py);\n c2d.lineTo(b.px, b.py);\n c2d.stroke();\n } else if (mode === \"rectangle\") {\n const x = Math.min(a.px, b.px);\n const y = Math.min(a.py, b.py);\n const w = Math.abs(b.px - a.px);\n const h = Math.abs(b.py - a.py);\n c2d.strokeRect(x, y, w, h);\n c2d.fillStyle = stroke + \"22\";\n c2d.fillRect(x, y, w, h);\n } else if (mode === \"fibonacci\") {\n const yMin = Math.min(anchor.y, cursor.y);\n const yMax = Math.max(anchor.y, cursor.y);\n c2d.font = \"11px sans-serif\";\n c2d.textAlign = \"left\";\n c2d.textBaseline = \"bottom\";\n for (const level of FIB_LEVELS) {\n const fy = yMax - (yMax - yMin) * level;\n const { py } = toPx(0, fy);\n c2d.beginPath();\n c2d.moveTo(plotArea.x, py);\n c2d.lineTo(plotArea.x + plotArea.width, py);\n c2d.stroke();\n c2d.save();\n c2d.setLineDash([]);\n c2d.globalAlpha = 1;\n c2d.fillStyle = stroke;\n c2d.fillText(\n `${(level * 100).toFixed(1)}% ${formatPrice(fy)}`,\n plotArea.x + 4,\n py - 2,\n );\n c2d.restore();\n }\n } else if (mode === \"measure\") {\n drawMeasurePreview(c2d, a, b, anchor, cursor);\n }\n }\n\n c2d.restore();\n }\n\n function drawMeasurePreview(\n c2d: CanvasRenderingContext2D,\n a: { px: number; py: number },\n b: { px: number; py: number },\n anchor: DrawPoint,\n cursor: DrawPoint,\n ): void {\n const m = computeMeasurement(anchor, cursor);\n const color = m.up ? measureUp : measureDown;\n const x = Math.min(a.px, b.px);\n const y = Math.min(a.py, b.py);\n const w = Math.abs(b.px - a.px);\n const h = Math.abs(b.py - a.py);\n\n c2d.setLineDash([]);\n c2d.globalAlpha = 0.9;\n c2d.fillStyle = withAlpha(color, \"33\");\n c2d.fillRect(x, y, w, h);\n c2d.strokeStyle = color;\n c2d.lineWidth = 1.5;\n c2d.strokeRect(x, y, w, h);\n\n // Vertical direction arrow at the horizontal center.\n const midX = (a.px + b.px) / 2;\n c2d.beginPath();\n c2d.moveTo(midX, a.py);\n c2d.lineTo(midX, b.py);\n c2d.stroke();\n const headLen = 7;\n const dir = b.py >= a.py ? 1 : -1;\n c2d.beginPath();\n c2d.moveTo(midX, b.py);\n c2d.lineTo(midX - 4, b.py - dir * headLen);\n c2d.lineTo(midX + 4, b.py - dir * headLen);\n c2d.closePath();\n c2d.fillStyle = color;\n c2d.fill();\n\n // Label with change / percent / bars.\n const label = formatMeasurement(m);\n c2d.font = \"12px sans-serif\";\n const textW = c2d.measureText(label).width;\n const padX = 6;\n const boxW = textW + padX * 2;\n const boxH = 20;\n const boxX = midX - boxW / 2;\n const boxY = m.up ? b.py - boxH - 8 : b.py + 8;\n c2d.globalAlpha = 1;\n c2d.fillStyle = color;\n c2d.fillRect(boxX, boxY, boxW, boxH);\n c2d.fillStyle = \"#ffffff\";\n c2d.textAlign = \"center\";\n c2d.textBaseline = \"middle\";\n c2d.fillText(label, midX, boxY + boxH / 2);\n }\n\n function handleMouseDown(pluginCtx: PluginContext, event: InteractionEvent): void {\n if (!event.inPlotArea) return;\n\n event.preventDefault();\n const point = pointFromEvent(pluginCtx, event);\n\n if (state.mode === \"horizontal\") {\n commitHorizontal(point.y);\n finishStroke();\n return;\n }\n\n if (state.mode === \"vertical\") {\n commitVertical(point.x);\n finishStroke();\n return;\n }\n\n if (state.pending) {\n commitTwoPoint(state.pending, point);\n finishStroke();\n return;\n }\n\n state.start = point;\n state.dragging = true;\n state.dragMoved = false;\n state.dragStartPixel = { x: event.pixelX, y: event.pixelY };\n state.cursor = point;\n pluginCtx.requestRender?.();\n }\n\n function handleMouseMove(pluginCtx: PluginContext, event: InteractionEvent): void {\n const point = pointFromEvent(pluginCtx, event);\n state.cursor = point;\n\n if (state.dragging && state.dragStartPixel) {\n const dx = event.pixelX - state.dragStartPixel.x;\n const dy = event.pixelY - state.dragStartPixel.y;\n if (Math.hypot(dx, dy) >= DRAG_THRESHOLD_PX) {\n state.dragMoved = true;\n }\n }\n\n event.preventDefault();\n pluginCtx.requestRender?.();\n }\n\n function handleMouseUp(pluginCtx: PluginContext, event: InteractionEvent): void {\n if (!state.dragging || !state.start) return;\n\n const point = pointFromEvent(pluginCtx, event);\n const start = state.start;\n state.dragging = false;\n state.dragStartPixel = null;\n\n if (state.dragMoved) {\n commitTwoPoint(start, point);\n finishStroke();\n return;\n }\n\n state.pending = start;\n state.start = null;\n state.cursor = point;\n pluginCtx.requestRender?.();\n }\n\n const api: DrawingToolsAPI & Record<string, unknown> = {\n setMode(mode) {\n setModeInternal(mode);\n },\n getMode() {\n return state.mode;\n },\n setMagnet(enabled) {\n state.magnet = enabled;\n },\n isMagnet() {\n return state.magnet;\n },\n undo() {\n if (!ctx || state.undoStack.length === 0) return false;\n state.redoStack.push(snapshot());\n const prev = state.undoStack.pop()!;\n const current = snapshot();\n for (const a of current) ctx.chart.removeAnnotation(a.id!);\n for (const a of prev) ctx.chart.addAnnotation(a);\n return true;\n },\n redo() {\n if (!ctx || state.redoStack.length === 0) return false;\n state.undoStack.push(snapshot());\n const next = state.redoStack.pop()!;\n const current = snapshot();\n for (const a of current) ctx.chart.removeAnnotation(a.id!);\n for (const a of next) ctx.chart.addAnnotation(a);\n return true;\n },\n clear() {\n if (!ctx) return;\n pushUndo();\n for (const a of snapshot()) ctx.chart.removeAnnotation(a.id!);\n },\n };\n\n return {\n manifest,\n api,\n onInit(pluginCtx) {\n ctx = pluginCtx;\n },\n onDestroy() {\n ctx = null;\n },\n onInteraction(pluginCtx, event) {\n if (!isDrawingMode(state.mode)) return;\n\n if (event.type === \"mousedown\") {\n handleMouseDown(pluginCtx, event);\n return;\n }\n\n if (event.type === \"mousemove\") {\n handleMouseMove(pluginCtx, event);\n return;\n }\n\n if (event.type === \"mouseup\") {\n handleMouseUp(pluginCtx, event);\n }\n },\n onRenderOverlay(pluginCtx) {\n const c2d = pluginCtx.render.ctx2d;\n if (!c2d) return;\n drawPreview(c2d, pluginCtx.render.plotArea, pluginCtx.coords);\n },\n };\n}\n\nexport { snapToCandle, findNearestBarIndex } from \"./snapToCandle\";\nexport default PluginDrawingTools;\n","/**\n * PluginReplay — bar-by-bar playback (Stage 2.17 MVP).\n */\n\nimport type { ChartPlugin, PluginContext, PluginManifest } from \"../types\";\n\nexport interface PluginReplayConfig {\n /** Series id to replay */\n seriesId: string;\n /** Milliseconds between frames at 1x speed */\n frameMs?: number;\n}\n\nexport interface ReplayAPI {\n play(speed?: number): void;\n pause(): void;\n step(count?: number): void;\n seek(index: number): void;\n getIndex(): number;\n getLength(): number;\n isPlaying(): boolean;\n}\n\nconst manifest: PluginManifest = {\n name: \"velo-plot-replay\",\n version: \"1.0.0\",\n description: \"Bar-by-bar chart replay with speed control\",\n provides: [\"replay\"],\n tags: [\"replay\", \"trading\"],\n};\n\ninterface ReplayBuffer {\n x: Float32Array;\n open?: Float32Array;\n high?: Float32Array;\n low?: Float32Array;\n close?: Float32Array;\n y?: Float32Array;\n}\n\nexport function PluginReplay(config: PluginReplayConfig): ChartPlugin<PluginReplayConfig> {\n let ctx: PluginContext | null = null;\n let buffer: ReplayBuffer | null = null;\n let index = 0;\n let timer: ReturnType<typeof setInterval> | null = null;\n let speed = 1;\n const frameMs = config.frameMs ?? 250;\n\n function applyWindow(end: number): void {\n if (!ctx || !buffer) return;\n const n = Math.min(end + 1, buffer.x.length);\n const slice = (arr?: Float32Array) => (arr ? arr.subarray(0, n) : undefined);\n ctx.chart.updateSeries(config.seriesId, {\n x: slice(buffer.x)!,\n y: slice(buffer.y),\n open: slice(buffer.open),\n high: slice(buffer.high),\n low: slice(buffer.low),\n close: slice(buffer.close),\n });\n }\n\n const api: ReplayAPI & Record<string, unknown> = {\n play(s = 1) {\n if (!buffer) return;\n speed = Math.max(0.1, s);\n if (timer) clearInterval(timer);\n timer = setInterval(() => {\n if (index >= buffer!.x.length - 1) {\n api.pause();\n return;\n }\n index++;\n applyWindow(index);\n }, frameMs / speed);\n },\n pause() {\n if (timer) {\n clearInterval(timer);\n timer = null;\n }\n },\n step(count = 1) {\n if (!buffer) return;\n index = Math.min(buffer.x.length - 1, index + count);\n applyWindow(index);\n },\n seek(i) {\n if (!buffer) return;\n index = Math.max(0, Math.min(buffer.x.length - 1, i));\n applyWindow(index);\n },\n getIndex() {\n return index;\n },\n getLength() {\n return buffer?.x.length ?? 0;\n },\n isPlaying() {\n return timer != null;\n },\n };\n\n return {\n manifest,\n api,\n onInit(pluginCtx) {\n ctx = pluginCtx;\n const series = ctx.chart.getSeries(config.seriesId);\n if (!series) {\n console.warn(`[PluginReplay] Series \"${config.seriesId}\" not found`);\n return;\n }\n const d = series.getData();\n buffer = {\n x: Float32Array.from(d.x),\n y: d.y ? Float32Array.from(d.y) : undefined,\n open: d.open ? Float32Array.from(d.open) : undefined,\n high: d.high ? Float32Array.from(d.high) : undefined,\n low: d.low ? Float32Array.from(d.low) : undefined,\n close: d.close ? Float32Array.from(d.close) : undefined,\n };\n index = Math.max(0, buffer.x.length - 1);\n },\n onDestroy() {\n api.pause();\n ctx = null;\n buffer = null;\n },\n };\n}\n\nexport default PluginReplay;\n","/**\n * UDF-inspired datafeed contract for trading charts (Stage 2.24).\n */\n\nexport interface SymbolInfo {\n symbol: string;\n name: string;\n description?: string;\n timezone?: string;\n session?: string;\n pricescale?: number;\n minmov?: number;\n}\n\nexport interface Bar {\n time: number;\n open: number;\n high: number;\n low: number;\n close: number;\n volume?: number;\n}\n\nexport interface HistoryRequest {\n symbol: string;\n resolution: string;\n from: number;\n to: number;\n}\n\nexport interface SubscribeBarsRequest {\n symbol: string;\n resolution: string;\n onBar: (bar: Bar) => void;\n}\n\n/**\n * TradingView UDF-style adapter surface.\n */\nexport interface DatafeedAdapter {\n resolveSymbol(symbol: string): Promise<SymbolInfo>;\n getBars(request: HistoryRequest): Promise<Bar[]>;\n subscribeBars(request: SubscribeBarsRequest): () => void;\n}\n\n/** Convert bars to typed OHLC arrays for velo-plot series. */\nexport function barsToOhlc(bars: Bar[]): {\n x: Float64Array;\n open: Float32Array;\n high: Float32Array;\n low: Float32Array;\n close: Float32Array;\n volume: Float32Array;\n} {\n const n = bars.length;\n const x = new Float64Array(n);\n const open = new Float32Array(n);\n const high = new Float32Array(n);\n const low = new Float32Array(n);\n const close = new Float32Array(n);\n const volume = new Float32Array(n);\n for (let i = 0; i < n; i++) {\n const b = bars[i];\n x[i] = b.time;\n open[i] = b.open;\n high[i] = b.high;\n low[i] = b.low;\n close[i] = b.close;\n volume[i] = b.volume ?? 0;\n }\n return { x, open, high, low, close, volume };\n}\n","/**\n * Mock datafeed for demos and tests (Stage 2.25).\n */\n\nimport type {\n Bar,\n DatafeedAdapter,\n HistoryRequest,\n SubscribeBarsRequest,\n SymbolInfo,\n} from \"./datafeed\";\n\nexport interface MockDatafeedOptions {\n symbol?: string;\n barMs?: number;\n basePrice?: number;\n seed?: number;\n}\n\nfunction pseudoRandom(seed: number): () => number {\n let s = seed;\n return () => {\n s = (s * 16807) % 2147483647;\n return (s - 1) / 2147483646;\n };\n}\n\nfunction generateBars(from: number, to: number, barMs: number, base: number, rand: () => number): Bar[] {\n const bars: Bar[] = [];\n let price = base;\n for (let t = from; t <= to; t += barMs) {\n const open = price;\n const delta = (rand() - 0.48) * 2;\n const close = Math.max(1, open + delta);\n const high = Math.max(open, close) + rand() * 1.5;\n const low = Math.min(open, close) - rand() * 1.5;\n bars.push({\n time: t,\n open,\n high,\n low,\n close,\n volume: 1000 + rand() * 5000,\n });\n price = close;\n }\n return bars;\n}\n\nexport function createMockDatafeed(options: MockDatafeedOptions = {}): DatafeedAdapter {\n const barMs = options.barMs ?? 60_000;\n const basePrice = options.basePrice ?? 100;\n const rand = pseudoRandom(options.seed ?? 42);\n const cache = new Map<string, Bar[]>();\n\n return {\n async resolveSymbol(sym: string): Promise<SymbolInfo> {\n return {\n symbol: sym,\n name: sym,\n description: `Mock symbol ${sym}`,\n timezone: \"UTC\",\n session: \"24x7\",\n pricescale: 100,\n };\n },\n\n async getBars(request: HistoryRequest): Promise<Bar[]> {\n const key = `${request.symbol}:${request.from}:${request.to}`;\n if (!cache.has(key)) {\n cache.set(\n key,\n generateBars(request.from, request.to, barMs, basePrice, rand),\n );\n }\n return cache.get(key)!;\n },\n\n subscribeBars(request: SubscribeBarsRequest): () => void {\n let last = basePrice + rand() * 5;\n const timer = setInterval(() => {\n const open = last;\n const close = Math.max(1, open + (rand() - 0.5) * 2);\n const high = Math.max(open, close) + rand();\n const low = Math.min(open, close) - rand();\n request.onBar({\n time: Date.now(),\n open,\n high,\n low,\n close,\n volume: 1000 + rand() * 3000,\n });\n last = close;\n }, barMs);\n return () => clearInterval(timer);\n },\n };\n}\n"],"names":["findNearestBarIndex","barX","x","bestIdx","bestDist","d","snapToCandle","input","idx","candidates","clickPy","threshold","bestY","bestPyDist","cy","py","dist","computeMeasurement","a","b","change","denom","percent","bars","formatMeasurement","m","sign","formatPrice","value","abs","decimals","FIB_LEVELS","DRAG_THRESHOLD_PX","DEFAULT_MEASURE_UP","DEFAULT_MEASURE_DOWN","withAlpha","color","alpha","manifest","isDrawingMode","mode","findCandlestickSeries","ctx","s","PluginDrawingTools","config","autoDeselect","state","stroke","measureUp","measureDown","snapshot","_a","_b","pushUndo","resetInteractionState","setModeInternal","finishStroke","resolvePoint","y","series","dx","dy","pointFromEvent","pluginCtx","event","commitHorizontal","commitVertical","commitMeasure","p0","p1","midX","commitTwoPoint","yMin","yMax","level","fy","drawPreview","c2d","plotArea","coords","cursor","anchor","toPx","px","w","h","drawMeasurePreview","headLen","dir","label","boxW","boxH","boxX","boxY","handleMouseDown","point","handleMouseMove","handleMouseUp","start","enabled","prev","current","next","PluginReplay","buffer","index","timer","speed","frameMs","applyWindow","end","n","slice","arr","api","count","i","barsToOhlc","open","high","low","close","volume","pseudoRandom","seed","generateBars","from","to","barMs","base","rand","price","t","delta","createMockDatafeed","options","basePrice","cache","sym","request","key","last"],"mappings":"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"}
|
|
@@ -1,16 +1,29 @@
|
|
|
1
1
|
import { ChartPlugin } from '../types';
|
|
2
2
|
|
|
3
|
-
export type DrawingMode = "none" | "pan" | "trendline" | "horizontal" | "vertical" | "rectangle";
|
|
3
|
+
export type DrawingMode = "none" | "pan" | "trendline" | "horizontal" | "vertical" | "rectangle" | "fibonacci" | "measure";
|
|
4
4
|
export interface PluginDrawingToolsConfig {
|
|
5
5
|
/** Default stroke color */
|
|
6
6
|
color?: string;
|
|
7
|
+
/** Enable candle magnet by default */
|
|
8
|
+
magnet?: boolean;
|
|
9
|
+
/** Return to pan mode after each completed stroke (default true) */
|
|
10
|
+
autoDeselect?: boolean;
|
|
11
|
+
/** Notified when drawing mode changes (including auto-deselect to none) */
|
|
12
|
+
onModeChange?: (mode: DrawingMode) => void;
|
|
13
|
+
/** Color for upward measurements (default green) */
|
|
14
|
+
measureUpColor?: string;
|
|
15
|
+
/** Color for downward measurements (default red) */
|
|
16
|
+
measureDownColor?: string;
|
|
7
17
|
}
|
|
8
18
|
export interface DrawingToolsAPI {
|
|
9
19
|
setMode(mode: DrawingMode): void;
|
|
10
20
|
getMode(): DrawingMode;
|
|
21
|
+
setMagnet(enabled: boolean): void;
|
|
22
|
+
isMagnet(): boolean;
|
|
11
23
|
undo(): boolean;
|
|
12
24
|
redo(): boolean;
|
|
13
25
|
clear(): void;
|
|
14
26
|
}
|
|
15
27
|
export declare function PluginDrawingTools(config?: PluginDrawingToolsConfig): ChartPlugin<PluginDrawingToolsConfig>;
|
|
28
|
+
export { snapToCandle, findNearestBarIndex } from './snapToCandle';
|
|
16
29
|
export default PluginDrawingTools;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Measurement helper for the price-range / measure tool (TradingView-style).
|
|
3
|
+
*/
|
|
4
|
+
export interface MeasurePoint {
|
|
5
|
+
x: number;
|
|
6
|
+
y: number;
|
|
7
|
+
}
|
|
8
|
+
export interface Measurement {
|
|
9
|
+
/** Absolute price change (end - start) */
|
|
10
|
+
change: number;
|
|
11
|
+
/** Percentage change relative to the start price */
|
|
12
|
+
percent: number;
|
|
13
|
+
/** Number of bars spanned (rounded X distance) */
|
|
14
|
+
bars: number;
|
|
15
|
+
/** True when the range moves up (change >= 0) */
|
|
16
|
+
up: boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare function computeMeasurement(a: MeasurePoint, b: MeasurePoint): Measurement;
|
|
19
|
+
export declare function formatMeasurement(m: Measurement): string;
|
|
20
|
+
/** Compact price formatting used for level labels. */
|
|
21
|
+
export declare function formatPrice(value: number): string;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Snap drawing points to nearest candlestick O/H/L/C (TradingView-style magnet).
|
|
3
|
+
*/
|
|
4
|
+
export interface CandleSnapInput {
|
|
5
|
+
x: number;
|
|
6
|
+
y: number;
|
|
7
|
+
barX: Float32Array | Float64Array;
|
|
8
|
+
open: Float32Array | Float64Array;
|
|
9
|
+
high: Float32Array | Float64Array;
|
|
10
|
+
low: Float32Array | Float64Array;
|
|
11
|
+
close: Float32Array | Float64Array;
|
|
12
|
+
dataToPixelX: (x: number) => number;
|
|
13
|
+
dataToPixelY: (y: number) => number;
|
|
14
|
+
pixelThreshold?: number;
|
|
15
|
+
enabled?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export declare function findNearestBarIndex(barX: Float32Array | Float64Array, x: number): number;
|
|
18
|
+
export declare function snapToCandle(input: CandleSnapInput): {
|
|
19
|
+
x: number;
|
|
20
|
+
y: number;
|
|
21
|
+
};
|
package/dist/plugins/tools.js
CHANGED
package/dist/react.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { S as x, u as C } from "./SciPlot-GJvw7GJo.js";
|
|
2
|
+
import { useRef as n, useState as a, useEffect as k, useCallback as f } from "react";
|
|
3
|
+
import { c as m } from "./createStackedChart-DJSmqerD.js";
|
|
4
4
|
function A(c) {
|
|
5
5
|
const s = n(null), r = n(null), [i, l] = a(null), [d, u] = a(!1), o = n(c);
|
|
6
|
-
o.current = c,
|
|
6
|
+
o.current = c, k(() => {
|
|
7
7
|
const t = s.current;
|
|
8
8
|
if (!t) return;
|
|
9
|
-
const e =
|
|
9
|
+
const e = m({
|
|
10
10
|
...o.current,
|
|
11
11
|
container: t
|
|
12
12
|
});
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UDF-inspired datafeed contract for trading charts (Stage 2.24).
|
|
3
|
+
*/
|
|
4
|
+
export interface SymbolInfo {
|
|
5
|
+
symbol: string;
|
|
6
|
+
name: string;
|
|
7
|
+
description?: string;
|
|
8
|
+
timezone?: string;
|
|
9
|
+
session?: string;
|
|
10
|
+
pricescale?: number;
|
|
11
|
+
minmov?: number;
|
|
12
|
+
}
|
|
13
|
+
export interface Bar {
|
|
14
|
+
time: number;
|
|
15
|
+
open: number;
|
|
16
|
+
high: number;
|
|
17
|
+
low: number;
|
|
18
|
+
close: number;
|
|
19
|
+
volume?: number;
|
|
20
|
+
}
|
|
21
|
+
export interface HistoryRequest {
|
|
22
|
+
symbol: string;
|
|
23
|
+
resolution: string;
|
|
24
|
+
from: number;
|
|
25
|
+
to: number;
|
|
26
|
+
}
|
|
27
|
+
export interface SubscribeBarsRequest {
|
|
28
|
+
symbol: string;
|
|
29
|
+
resolution: string;
|
|
30
|
+
onBar: (bar: Bar) => void;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* TradingView UDF-style adapter surface.
|
|
34
|
+
*/
|
|
35
|
+
export interface DatafeedAdapter {
|
|
36
|
+
resolveSymbol(symbol: string): Promise<SymbolInfo>;
|
|
37
|
+
getBars(request: HistoryRequest): Promise<Bar[]>;
|
|
38
|
+
subscribeBars(request: SubscribeBarsRequest): () => void;
|
|
39
|
+
}
|
|
40
|
+
/** Convert bars to typed OHLC arrays for velo-plot series. */
|
|
41
|
+
export declare function barsToOhlc(bars: Bar[]): {
|
|
42
|
+
x: Float64Array;
|
|
43
|
+
open: Float32Array;
|
|
44
|
+
high: Float32Array;
|
|
45
|
+
low: Float32Array;
|
|
46
|
+
close: Float32Array;
|
|
47
|
+
volume: Float32Array;
|
|
48
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* velo-plot/trading — focused trading dashboard bundle (Stage 2).
|
|
3
|
+
* Tree-shakes scientific/3D plugins; includes stacked charts, indicators, drawings, replay.
|
|
4
|
+
*/
|
|
5
|
+
export { createChart } from '../core/Chart';
|
|
6
|
+
export { createStackedChart } from '../core/stacked/createStackedChart';
|
|
7
|
+
export type { Chart, ChartOptions } from '../core/Chart';
|
|
8
|
+
export type { StackedChart, StackedChartOptions, StackedPaneConfig, } from '../core/stacked/types';
|
|
9
|
+
export { mapToBusinessDayScale, isBusinessDay, businessDaySpanMs, type TimeScaleOptions, type BusinessDayMapping, } from '../core/time/TimeScale';
|
|
10
|
+
export { isBusinessDayScaleActive, applyBusinessDayX, formatBusinessDayTick, } from '../core/time/applyTimeScale';
|
|
11
|
+
export { addIndicatorToChart, buildIndicatorPaneFromPreset, computeIndicatorFromSeries, type AddIndicatorOptions, type AddIndicatorResult, type IndicatorPresetName, } from '../core/indicator/addIndicator';
|
|
12
|
+
export { computeHeikinAshi } from '../core/chart/heikinAshi';
|
|
13
|
+
export type { CandlestickMarker, CandlestickMarkerPosition, CandlestickMarkerShape, } from '../core/chart/candlestickMarkers';
|
|
14
|
+
export type { PriceAlertOptions } from '../core/chart/ChartAlerts';
|
|
15
|
+
export type { PositionLineOptions } from '../core/chart/positionLines';
|
|
16
|
+
export { PluginAnnotations } from '../plugins/annotations';
|
|
17
|
+
export type { Annotation, AnnotationType } from '../plugins/annotations';
|
|
18
|
+
export { PluginDrawingTools } from '../plugins/drawing-tools';
|
|
19
|
+
export type { DrawingMode, DrawingToolsAPI } from '../plugins/drawing-tools';
|
|
20
|
+
export { PluginReplay } from '../plugins/replay';
|
|
21
|
+
export type { ReplayAPI } from '../plugins/replay';
|
|
22
|
+
export { PluginKeyboard } from '../plugins/keyboard';
|
|
23
|
+
export { PluginStreaming } from '../plugins/streaming';
|
|
24
|
+
export { ChartGroup } from '../core/sync';
|
|
25
|
+
export { barsToOhlc, type DatafeedAdapter, type SymbolInfo, type Bar, type HistoryRequest, } from './datafeed';
|
|
26
|
+
export { createMockDatafeed } from './mockDatafeed';
|
|
27
|
+
export { generateBusinessDayOhlcv, generateContinuousOhlcv, findLowestBarIndex, findHighestBarIndex, type OhlcvData, type OhlcvOptions, } from './ohlcvGenerator';
|
|
28
|
+
export type { SeriesOptions, SeriesData, AxisOptions, Bounds, } from '../types';
|
|
29
|
+
export { DARK_THEME, LIGHT_THEME, DEFAULT_THEME } from '../theme';
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Seeded OHLCV generators for trading demos and tests.
|
|
3
|
+
*/
|
|
4
|
+
export interface OhlcvData {
|
|
5
|
+
x: Float64Array;
|
|
6
|
+
open: Float32Array;
|
|
7
|
+
high: Float32Array;
|
|
8
|
+
low: Float32Array;
|
|
9
|
+
close: Float32Array;
|
|
10
|
+
volume: Float32Array;
|
|
11
|
+
}
|
|
12
|
+
export interface OhlcvOptions {
|
|
13
|
+
startMs?: number;
|
|
14
|
+
seed?: number;
|
|
15
|
+
}
|
|
16
|
+
/** Mulberry32 PRNG — deterministic when seed is provided. */
|
|
17
|
+
export declare function mulberry32(seed: number): () => number;
|
|
18
|
+
/** OHLCV with business-day timestamps (weekends skipped in data). */
|
|
19
|
+
export declare function generateBusinessDayOhlcv(n: number, startMsOrOptions?: number | OhlcvOptions, legacySeed?: number): OhlcvData;
|
|
20
|
+
/** OHLCV with consecutive calendar days (includes weekends). */
|
|
21
|
+
export declare function generateContinuousOhlcv(n: number, startMsOrOptions?: number | OhlcvOptions, legacySeed?: number): OhlcvData;
|
|
22
|
+
/** Index of the bar with the lowest low. */
|
|
23
|
+
export declare function findLowestBarIndex(low: Float32Array): number;
|
|
24
|
+
/** Index of the bar with the highest high. */
|
|
25
|
+
export declare function findHighestBarIndex(high: Float32Array): number;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './trading/index'
|
package/dist/trading.js
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { D as P, f as b, L as v, a as B, b as E, e as S, d as U, c as H } from "./ChartCore-BhQ4j7f5.js";
|
|
2
|
+
import { c as k } from "./createStackedChart-DJSmqerD.js";
|
|
3
|
+
import { c as _, b as R, f as G, i as K, a as j, m as X } from "./axisFormat-SPX-CD5s.js";
|
|
4
|
+
import { PluginAnnotations as q } from "./plugins/annotations.js";
|
|
5
|
+
import { P as J, a as N, b as O, c as Q } from "./mockDatafeed-Cdg5hKEo.js";
|
|
6
|
+
import { P as W } from "./index-DoYxf1cV.js";
|
|
7
|
+
import { P as $ } from "./index-BMiZoKmm.js";
|
|
8
|
+
import { C as te } from "./index-CUGS98p4.js";
|
|
9
|
+
const p = 864e5;
|
|
10
|
+
function w(e) {
|
|
11
|
+
let a = e >>> 0;
|
|
12
|
+
return () => {
|
|
13
|
+
a = a + 1831565813 >>> 0;
|
|
14
|
+
let t = Math.imul(a ^ a >>> 15, 1 | a);
|
|
15
|
+
return t = t + Math.imul(t ^ t >>> 7, 61 | t) ^ t, ((t ^ t >>> 14) >>> 0) / 4294967296;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
function h(e) {
|
|
19
|
+
return e !== void 0 ? w(e) : Math.random;
|
|
20
|
+
}
|
|
21
|
+
function D(e, a, t = Date.UTC(2024, 0, 2)) {
|
|
22
|
+
const l = typeof e == "object" ? e : { startMs: e, seed: a };
|
|
23
|
+
return {
|
|
24
|
+
startMs: l.startMs ?? t,
|
|
25
|
+
seed: l.seed
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function x(e, a = Date.UTC(2024, 0, 2), t) {
|
|
29
|
+
const { startMs: l, seed: d } = D(a, t), n = h(d), u = new Float64Array(e), c = new Float32Array(e), f = new Float32Array(e), m = new Float32Array(e), s = new Float32Array(e), y = new Float32Array(e);
|
|
30
|
+
let i = l, r = 100;
|
|
31
|
+
for (let o = 0; o < e; o++) {
|
|
32
|
+
for (; new Date(i).getUTCDay() === 0 || new Date(i).getUTCDay() === 6; )
|
|
33
|
+
i += p;
|
|
34
|
+
u[o] = i, c[o] = r;
|
|
35
|
+
const A = (n() - 0.48) * 3;
|
|
36
|
+
s[o] = r + A, f[o] = Math.max(c[o], s[o]) + n() * 1.5, m[o] = Math.min(c[o], s[o]) - n() * 1.5, y[o] = 5e5 + n() * 2e6, r = s[o], i += p;
|
|
37
|
+
}
|
|
38
|
+
return { x: u, open: c, high: f, low: m, close: s, volume: y };
|
|
39
|
+
}
|
|
40
|
+
function g(e, a = Date.UTC(2024, 0, 1), t) {
|
|
41
|
+
const { startMs: l, seed: d } = D(
|
|
42
|
+
a,
|
|
43
|
+
t,
|
|
44
|
+
Date.UTC(2024, 0, 1)
|
|
45
|
+
), n = h(d), u = new Float64Array(e), c = new Float32Array(e), f = new Float32Array(e), m = new Float32Array(e), s = new Float32Array(e), y = new Float32Array(e);
|
|
46
|
+
let i = 100;
|
|
47
|
+
for (let r = 0; r < e; r++) {
|
|
48
|
+
u[r] = l + r * p, c[r] = i;
|
|
49
|
+
const o = (n() - 0.48) * 3;
|
|
50
|
+
s[r] = i + o, f[r] = Math.max(c[r], s[r]) + n() * 1.5, m[r] = Math.min(c[r], s[r]) - n() * 1.5, y[r] = 5e5 + n() * 2e6, i = s[r];
|
|
51
|
+
}
|
|
52
|
+
return { x: u, open: c, high: f, low: m, close: s, volume: y };
|
|
53
|
+
}
|
|
54
|
+
function M(e) {
|
|
55
|
+
let a = 0;
|
|
56
|
+
for (let t = 1; t < e.length; t++)
|
|
57
|
+
e[t] < e[a] && (a = t);
|
|
58
|
+
return a;
|
|
59
|
+
}
|
|
60
|
+
function T(e) {
|
|
61
|
+
let a = 0;
|
|
62
|
+
for (let t = 1; t < e.length; t++)
|
|
63
|
+
e[t] > e[a] && (a = t);
|
|
64
|
+
return a;
|
|
65
|
+
}
|
|
66
|
+
export {
|
|
67
|
+
te as ChartGroup,
|
|
68
|
+
P as DARK_THEME,
|
|
69
|
+
b as DEFAULT_THEME,
|
|
70
|
+
v as LIGHT_THEME,
|
|
71
|
+
q as PluginAnnotations,
|
|
72
|
+
J as PluginDrawingTools,
|
|
73
|
+
W as PluginKeyboard,
|
|
74
|
+
N as PluginReplay,
|
|
75
|
+
$ as PluginStreaming,
|
|
76
|
+
B as addIndicatorToChart,
|
|
77
|
+
_ as applyBusinessDayX,
|
|
78
|
+
O as barsToOhlc,
|
|
79
|
+
E as buildIndicatorPaneFromPreset,
|
|
80
|
+
R as businessDaySpanMs,
|
|
81
|
+
S as computeHeikinAshi,
|
|
82
|
+
U as computeIndicatorFromSeries,
|
|
83
|
+
H as createChart,
|
|
84
|
+
Q as createMockDatafeed,
|
|
85
|
+
k as createStackedChart,
|
|
86
|
+
T as findHighestBarIndex,
|
|
87
|
+
M as findLowestBarIndex,
|
|
88
|
+
G as formatBusinessDayTick,
|
|
89
|
+
x as generateBusinessDayOhlcv,
|
|
90
|
+
g as generateContinuousOhlcv,
|
|
91
|
+
K as isBusinessDay,
|
|
92
|
+
j as isBusinessDayScaleActive,
|
|
93
|
+
X as mapToBusinessDayScale
|
|
94
|
+
};
|
|
95
|
+
//# sourceMappingURL=trading.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trading.js","sources":["../src/trading/ohlcvGenerator.ts"],"sourcesContent":["/**\n * Seeded OHLCV generators for trading demos and tests.\n */\n\nexport interface OhlcvData {\n x: Float64Array;\n open: Float32Array;\n high: Float32Array;\n low: Float32Array;\n close: Float32Array;\n volume: Float32Array;\n}\n\nexport interface OhlcvOptions {\n startMs?: number;\n seed?: number;\n}\n\nconst MS_DAY = 86_400_000;\n\n/** Mulberry32 PRNG — deterministic when seed is provided. */\nexport function mulberry32(seed: number): () => number {\n let s = seed >>> 0;\n return () => {\n s = (s + 0x6d2b79f5) >>> 0;\n let t = Math.imul(s ^ (s >>> 15), 1 | s);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\nfunction resolveRand(seed?: number): () => number {\n return seed !== undefined ? mulberry32(seed) : Math.random;\n}\n\nfunction resolveOptions(\n startMsOrOptions: number | OhlcvOptions,\n legacySeed?: number,\n defaultStartMs = Date.UTC(2024, 0, 2),\n): { startMs: number; seed?: number } {\n const opts: OhlcvOptions =\n typeof startMsOrOptions === \"object\"\n ? startMsOrOptions\n : { startMs: startMsOrOptions, seed: legacySeed };\n return {\n startMs: opts.startMs ?? defaultStartMs,\n seed: opts.seed,\n };\n}\n\n/** OHLCV with business-day timestamps (weekends skipped in data). */\nexport function generateBusinessDayOhlcv(\n n: number,\n startMsOrOptions: number | OhlcvOptions = Date.UTC(2024, 0, 2),\n legacySeed?: number,\n): OhlcvData {\n const { startMs, seed } = resolveOptions(startMsOrOptions, legacySeed);\n const rand = resolveRand(seed);\n\n const x = new Float64Array(n);\n const open = new Float32Array(n);\n const high = new Float32Array(n);\n const low = new Float32Array(n);\n const close = new Float32Array(n);\n const volume = new Float32Array(n);\n\n let t = startMs;\n let price = 100;\n\n for (let i = 0; i < n; i++) {\n while (new Date(t).getUTCDay() === 0 || new Date(t).getUTCDay() === 6) {\n t += MS_DAY;\n }\n x[i] = t;\n open[i] = price;\n const change = (rand() - 0.48) * 3;\n close[i] = price + change;\n high[i] = Math.max(open[i], close[i]) + rand() * 1.5;\n low[i] = Math.min(open[i], close[i]) - rand() * 1.5;\n volume[i] = 500_000 + rand() * 2_000_000;\n price = close[i];\n t += MS_DAY;\n }\n\n return { x, open, high, low, close, volume };\n}\n\n/** OHLCV with consecutive calendar days (includes weekends). */\nexport function generateContinuousOhlcv(\n n: number,\n startMsOrOptions: number | OhlcvOptions = Date.UTC(2024, 0, 1),\n legacySeed?: number,\n): OhlcvData {\n const { startMs, seed } = resolveOptions(\n startMsOrOptions,\n legacySeed,\n Date.UTC(2024, 0, 1),\n );\n const rand = resolveRand(seed);\n\n const x = new Float64Array(n);\n const open = new Float32Array(n);\n const high = new Float32Array(n);\n const low = new Float32Array(n);\n const close = new Float32Array(n);\n const volume = new Float32Array(n);\n\n let price = 100;\n for (let i = 0; i < n; i++) {\n x[i] = startMs + i * MS_DAY;\n open[i] = price;\n const change = (rand() - 0.48) * 3;\n close[i] = price + change;\n high[i] = Math.max(open[i], close[i]) + rand() * 1.5;\n low[i] = Math.min(open[i], close[i]) - rand() * 1.5;\n volume[i] = 500_000 + rand() * 2_000_000;\n price = close[i];\n }\n\n return { x, open, high, low, close, volume };\n}\n\n/** Index of the bar with the lowest low. */\nexport function findLowestBarIndex(low: Float32Array): number {\n let idx = 0;\n for (let i = 1; i < low.length; i++) {\n if (low[i] < low[idx]) idx = i;\n }\n return idx;\n}\n\n/** Index of the bar with the highest high. */\nexport function findHighestBarIndex(high: Float32Array): number {\n let idx = 0;\n for (let i = 1; i < high.length; i++) {\n if (high[i] > high[idx]) idx = i;\n }\n return idx;\n}\n"],"names":["MS_DAY","mulberry32","seed","s","resolveRand","resolveOptions","startMsOrOptions","legacySeed","defaultStartMs","opts","generateBusinessDayOhlcv","n","startMs","rand","x","open","high","low","close","volume","t","price","i","change","generateContinuousOhlcv","findLowestBarIndex","idx","findHighestBarIndex"],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -72,7 +72,7 @@ export interface AxisOptions {
|
|
|
72
72
|
/** Trading time scale (Stage 2) — business-day gaps, session presets */
|
|
73
73
|
timeScale?: import('./core/time/TimeScale').TimeScaleOptions;
|
|
74
74
|
}
|
|
75
|
-
export type SeriesType = "line" | "scatter" | "line+scatter" | "step" | "step+scatter" | "band" | "area" | "bar" | "heatmap" | "candlestick" | "polar" | "radar" | "boxplot" | "waterfall" | "gauge" | "sankey" | "ternary" | "indicator";
|
|
75
|
+
export type SeriesType = "line" | "scatter" | "line+scatter" | "step" | "step+scatter" | "band" | "area" | "bar" | "heatmap" | "candlestick" | "heikin-ashi" | "polar" | "radar" | "boxplot" | "waterfall" | "gauge" | "sankey" | "ternary" | "indicator";
|
|
76
76
|
/** Step mode defines where the step occurs */
|
|
77
77
|
export type StepMode = "before" | "after" | "center";
|
|
78
78
|
/** Error bar direction */
|