@invinite-org/chartlang-runtime 1.0.2 → 1.1.1
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/CHANGELOG.md +101 -0
- package/README.md +10 -2
- package/dist/buildComputeContext.js.map +1 -1
- package/dist/createScriptRunner.d.ts +55 -4
- package/dist/createScriptRunner.d.ts.map +1 -1
- package/dist/createScriptRunner.js +103 -35
- package/dist/createScriptRunner.js.map +1 -1
- package/dist/dep/DepOutputStore.d.ts +92 -0
- package/dist/dep/DepOutputStore.d.ts.map +1 -0
- package/dist/dep/DepOutputStore.js +0 -0
- package/dist/dep/DepOutputStore.js.map +1 -0
- package/dist/dep/DepRunner.d.ts +146 -0
- package/dist/dep/DepRunner.d.ts.map +1 -0
- package/dist/dep/DepRunner.js +243 -0
- package/dist/dep/DepRunner.js.map +1 -0
- package/dist/dep/depOutput.d.ts +50 -0
- package/dist/dep/depOutput.d.ts.map +1 -0
- package/dist/dep/depOutput.js +92 -0
- package/dist/dep/depOutput.js.map +1 -0
- package/dist/dep/emissionFilter.d.ts +70 -0
- package/dist/dep/emissionFilter.d.ts.map +1 -0
- package/dist/dep/emissionFilter.js +105 -0
- package/dist/dep/emissionFilter.js.map +1 -0
- package/dist/dep/index.d.ts +8 -0
- package/dist/dep/index.d.ts.map +1 -0
- package/dist/dep/index.js +7 -0
- package/dist/dep/index.js.map +1 -0
- package/dist/emit/alert.js.map +1 -1
- package/dist/emit/alertConditionEmission.js.map +1 -1
- package/dist/emit/applyPlotOverride.d.ts +24 -0
- package/dist/emit/applyPlotOverride.d.ts.map +1 -0
- package/dist/emit/applyPlotOverride.js +48 -0
- package/dist/emit/applyPlotOverride.js.map +1 -0
- package/dist/emit/draw/annotations/arrow.js +1 -1
- package/dist/emit/draw/annotations/arrow.js.map +1 -1
- package/dist/emit/draw/annotations/arrowMarkDown.js +1 -1
- package/dist/emit/draw/annotations/arrowMarkDown.js.map +1 -1
- package/dist/emit/draw/annotations/arrowMarkUp.js +1 -1
- package/dist/emit/draw/annotations/arrowMarkUp.js.map +1 -1
- package/dist/emit/draw/annotations/arrowMarker.js +1 -1
- package/dist/emit/draw/annotations/arrowMarker.js.map +1 -1
- package/dist/emit/draw/annotations/text.js +1 -1
- package/dist/emit/draw/annotations/text.js.map +1 -1
- package/dist/emit/draw/boxes/circle.js +1 -1
- package/dist/emit/draw/boxes/circle.js.map +1 -1
- package/dist/emit/draw/boxes/ellipse.d.ts +1 -1
- package/dist/emit/draw/boxes/ellipse.js +1 -1
- package/dist/emit/draw/boxes/ellipse.js.map +1 -1
- package/dist/emit/draw/boxes/marker.js +1 -1
- package/dist/emit/draw/boxes/marker.js.map +1 -1
- package/dist/emit/draw/boxes/path.d.ts +1 -1
- package/dist/emit/draw/boxes/path.js +1 -1
- package/dist/emit/draw/boxes/path.js.map +1 -1
- package/dist/emit/draw/boxes/polyline.d.ts +1 -1
- package/dist/emit/draw/boxes/polyline.js +1 -1
- package/dist/emit/draw/boxes/polyline.js.map +1 -1
- package/dist/emit/draw/boxes/rectangle.js +1 -1
- package/dist/emit/draw/boxes/rectangle.js.map +1 -1
- package/dist/emit/draw/boxes/rotatedRectangle.js +1 -1
- package/dist/emit/draw/boxes/rotatedRectangle.js.map +1 -1
- package/dist/emit/draw/boxes/triangle.d.ts +1 -1
- package/dist/emit/draw/boxes/triangle.js +1 -1
- package/dist/emit/draw/boxes/triangle.js.map +1 -1
- package/dist/emit/draw/channels/disjointChannel.js +1 -1
- package/dist/emit/draw/channels/disjointChannel.js.map +1 -1
- package/dist/emit/draw/channels/flatTopBottom.d.ts +1 -2
- package/dist/emit/draw/channels/flatTopBottom.d.ts.map +1 -1
- package/dist/emit/draw/channels/flatTopBottom.js +1 -1
- package/dist/emit/draw/channels/flatTopBottom.js.map +1 -1
- package/dist/emit/draw/channels/regressionTrend.d.ts +3 -4
- package/dist/emit/draw/channels/regressionTrend.d.ts.map +1 -1
- package/dist/emit/draw/channels/regressionTrend.js +1 -1
- package/dist/emit/draw/channels/regressionTrend.js.map +1 -1
- package/dist/emit/draw/channels/trendChannel.js +1 -1
- package/dist/emit/draw/channels/trendChannel.js.map +1 -1
- package/dist/emit/draw/containers/frame.d.ts +1 -1
- package/dist/emit/draw/containers/frame.js +2 -2
- package/dist/emit/draw/containers/frame.js.map +1 -1
- package/dist/emit/draw/containers/group.d.ts +1 -2
- package/dist/emit/draw/containers/group.d.ts.map +1 -1
- package/dist/emit/draw/containers/group.js +2 -2
- package/dist/emit/draw/containers/group.js.map +1 -1
- package/dist/emit/draw/curves/arc.js +1 -1
- package/dist/emit/draw/curves/arc.js.map +1 -1
- package/dist/emit/draw/curves/brush.js +1 -1
- package/dist/emit/draw/curves/brush.js.map +1 -1
- package/dist/emit/draw/curves/curve.js +1 -1
- package/dist/emit/draw/curves/curve.js.map +1 -1
- package/dist/emit/draw/curves/doubleCurve.js +1 -1
- package/dist/emit/draw/curves/doubleCurve.js.map +1 -1
- package/dist/emit/draw/curves/highlighter.js +1 -1
- package/dist/emit/draw/curves/highlighter.js.map +1 -1
- package/dist/emit/draw/curves/pen.js +1 -1
- package/dist/emit/draw/curves/pen.js.map +1 -1
- package/dist/emit/draw/cycles/cyclicLines.js +1 -1
- package/dist/emit/draw/cycles/cyclicLines.js.map +1 -1
- package/dist/emit/draw/cycles/sineLine.js +1 -1
- package/dist/emit/draw/cycles/sineLine.js.map +1 -1
- package/dist/emit/draw/cycles/timeCycles.js +1 -1
- package/dist/emit/draw/cycles/timeCycles.js.map +1 -1
- package/dist/emit/draw/elliott/elliottCorrectionWave.js +1 -1
- package/dist/emit/draw/elliott/elliottCorrectionWave.js.map +1 -1
- package/dist/emit/draw/elliott/elliottDoubleCombo.js +1 -1
- package/dist/emit/draw/elliott/elliottDoubleCombo.js.map +1 -1
- package/dist/emit/draw/elliott/elliottImpulseWave.js +1 -1
- package/dist/emit/draw/elliott/elliottImpulseWave.js.map +1 -1
- package/dist/emit/draw/elliott/elliottTriangleWave.js +1 -1
- package/dist/emit/draw/elliott/elliottTriangleWave.js.map +1 -1
- package/dist/emit/draw/elliott/elliottTripleCombo.js +1 -1
- package/dist/emit/draw/elliott/elliottTripleCombo.js.map +1 -1
- package/dist/emit/draw/fibA/fibChannel.js +1 -1
- package/dist/emit/draw/fibA/fibChannel.js.map +1 -1
- package/dist/emit/draw/fibA/fibRetracement.js +1 -1
- package/dist/emit/draw/fibA/fibRetracement.js.map +1 -1
- package/dist/emit/draw/fibA/fibTimeZone.d.ts +1 -2
- package/dist/emit/draw/fibA/fibTimeZone.d.ts.map +1 -1
- package/dist/emit/draw/fibA/fibTimeZone.js +1 -1
- package/dist/emit/draw/fibA/fibTimeZone.js.map +1 -1
- package/dist/emit/draw/fibA/fibTrendExtension.js +1 -1
- package/dist/emit/draw/fibA/fibTrendExtension.js.map +1 -1
- package/dist/emit/draw/fibA/fibWedge.js +1 -1
- package/dist/emit/draw/fibA/fibWedge.js.map +1 -1
- package/dist/emit/draw/fibB/fibCircles.d.ts +1 -2
- package/dist/emit/draw/fibB/fibCircles.d.ts.map +1 -1
- package/dist/emit/draw/fibB/fibCircles.js +1 -1
- package/dist/emit/draw/fibB/fibCircles.js.map +1 -1
- package/dist/emit/draw/fibB/fibSpeedArcs.js +1 -1
- package/dist/emit/draw/fibB/fibSpeedArcs.js.map +1 -1
- package/dist/emit/draw/fibB/fibSpeedFan.js +1 -1
- package/dist/emit/draw/fibB/fibSpeedFan.js.map +1 -1
- package/dist/emit/draw/fibB/fibSpiral.d.ts +1 -2
- package/dist/emit/draw/fibB/fibSpiral.d.ts.map +1 -1
- package/dist/emit/draw/fibB/fibSpiral.js +1 -1
- package/dist/emit/draw/fibB/fibSpiral.js.map +1 -1
- package/dist/emit/draw/fibB/fibTrendTime.d.ts +1 -2
- package/dist/emit/draw/fibB/fibTrendTime.d.ts.map +1 -1
- package/dist/emit/draw/fibB/fibTrendTime.js +1 -1
- package/dist/emit/draw/fibB/fibTrendTime.js.map +1 -1
- package/dist/emit/draw/gann/gannBox.js +1 -1
- package/dist/emit/draw/gann/gannBox.js.map +1 -1
- package/dist/emit/draw/gann/gannFan.js +1 -1
- package/dist/emit/draw/gann/gannFan.js.map +1 -1
- package/dist/emit/draw/gann/gannSquare.js +1 -1
- package/dist/emit/draw/gann/gannSquare.js.map +1 -1
- package/dist/emit/draw/gann/gannSquareFixed.js +1 -1
- package/dist/emit/draw/gann/gannSquareFixed.js.map +1 -1
- package/dist/emit/draw/handle.d.ts +2 -2
- package/dist/emit/draw/handle.js +2 -2
- package/dist/emit/draw/handle.js.map +1 -1
- package/dist/emit/draw/index.js.map +1 -1
- package/dist/emit/draw/lines/crossLine.js +1 -1
- package/dist/emit/draw/lines/crossLine.js.map +1 -1
- package/dist/emit/draw/lines/horizontalLine.d.ts +1 -1
- package/dist/emit/draw/lines/horizontalLine.js +1 -1
- package/dist/emit/draw/lines/horizontalLine.js.map +1 -1
- package/dist/emit/draw/lines/horizontalRay.js +1 -1
- package/dist/emit/draw/lines/horizontalRay.js.map +1 -1
- package/dist/emit/draw/lines/line.d.ts +1 -1
- package/dist/emit/draw/lines/line.d.ts.map +1 -1
- package/dist/emit/draw/lines/line.js +2 -3
- package/dist/emit/draw/lines/line.js.map +1 -1
- package/dist/emit/draw/lines/trendAngle.js +1 -1
- package/dist/emit/draw/lines/trendAngle.js.map +1 -1
- package/dist/emit/draw/lines/verticalLine.js +1 -1
- package/dist/emit/draw/lines/verticalLine.js.map +1 -1
- package/dist/emit/draw/namespace.d.ts +1 -1
- package/dist/emit/draw/namespace.js +1 -1
- package/dist/emit/draw/namespace.js.map +1 -1
- package/dist/emit/draw/patterns/abcdPattern.js +1 -1
- package/dist/emit/draw/patterns/abcdPattern.js.map +1 -1
- package/dist/emit/draw/patterns/cypherPattern.d.ts +1 -2
- package/dist/emit/draw/patterns/cypherPattern.d.ts.map +1 -1
- package/dist/emit/draw/patterns/cypherPattern.js +1 -1
- package/dist/emit/draw/patterns/cypherPattern.js.map +1 -1
- package/dist/emit/draw/patterns/headAndShoulders.js +1 -1
- package/dist/emit/draw/patterns/headAndShoulders.js.map +1 -1
- package/dist/emit/draw/patterns/threeDrivesPattern.js +1 -1
- package/dist/emit/draw/patterns/threeDrivesPattern.js.map +1 -1
- package/dist/emit/draw/patterns/trianglePattern.d.ts +1 -1
- package/dist/emit/draw/patterns/trianglePattern.js +1 -1
- package/dist/emit/draw/patterns/trianglePattern.js.map +1 -1
- package/dist/emit/draw/patterns/xabcdPattern.js +1 -1
- package/dist/emit/draw/patterns/xabcdPattern.js.map +1 -1
- package/dist/emit/draw/pitchforks/pitchfan.js +1 -1
- package/dist/emit/draw/pitchforks/pitchfan.js.map +1 -1
- package/dist/emit/draw/pitchforks/pitchfork.d.ts +1 -1
- package/dist/emit/draw/pitchforks/pitchfork.js +2 -2
- package/dist/emit/draw/pitchforks/pitchfork.js.map +1 -1
- package/dist/emit/draw/pushDrawing.js.map +1 -1
- package/dist/emit/draw/subIdAllocator.d.ts +1 -1
- package/dist/emit/draw/subIdAllocator.js +1 -1
- package/dist/emit/draw/subIdAllocator.js.map +1 -1
- package/dist/emit/draw/table/table.d.ts +1 -1
- package/dist/emit/draw/table/table.js.map +1 -1
- package/dist/emit/emissionsQueue.js.map +1 -1
- package/dist/emit/hash.js.map +1 -1
- package/dist/emit/hline.d.ts +6 -4
- package/dist/emit/hline.d.ts.map +1 -1
- package/dist/emit/hline.js +5 -2
- package/dist/emit/hline.js.map +1 -1
- package/dist/emit/index.d.ts +2 -1
- package/dist/emit/index.d.ts.map +1 -1
- package/dist/emit/index.js +2 -1
- package/dist/emit/index.js.map +1 -1
- package/dist/emit/logEmission.js.map +1 -1
- package/dist/emit/paneResolver.d.ts +52 -11
- package/dist/emit/paneResolver.d.ts.map +1 -1
- package/dist/emit/paneResolver.js +69 -26
- package/dist/emit/paneResolver.js.map +1 -1
- package/dist/emit/plot.d.ts.map +1 -1
- package/dist/emit/plot.js +2 -1
- package/dist/emit/plot.js.map +1 -1
- package/dist/emit/runtimeError.js.map +1 -1
- package/dist/execution/dispose.d.ts.map +1 -1
- package/dist/execution/dispose.js +7 -0
- package/dist/execution/dispose.js.map +1 -1
- package/dist/execution/drain.js.map +1 -1
- package/dist/execution/index.js.map +1 -1
- package/dist/execution/onBarClose.d.ts +9 -13
- package/dist/execution/onBarClose.d.ts.map +1 -1
- package/dist/execution/onBarClose.js +28 -59
- package/dist/execution/onBarClose.js.map +1 -1
- package/dist/execution/onBarTick.d.ts +4 -10
- package/dist/execution/onBarTick.d.ts.map +1 -1
- package/dist/execution/onBarTick.js +24 -57
- package/dist/execution/onBarTick.js.map +1 -1
- package/dist/execution/onHistory.js.map +1 -1
- package/dist/execution/runComputeStep.d.ts +68 -0
- package/dist/execution/runComputeStep.d.ts.map +1 -0
- package/dist/execution/runComputeStep.js +96 -0
- package/dist/execution/runComputeStep.js.map +1 -0
- package/dist/execution/secondaryStream.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/inputs/index.js.map +1 -1
- package/dist/inputs/resolveInputs.js.map +1 -1
- package/dist/internal.d.ts +12 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +14 -0
- package/dist/internal.js.map +1 -0
- package/dist/persistentStateStore.js.map +1 -1
- package/dist/persistentStateStore.runtime.d.ts +18 -4
- package/dist/persistentStateStore.runtime.d.ts.map +1 -1
- package/dist/persistentStateStore.runtime.js +111 -18
- package/dist/persistentStateStore.runtime.js.map +1 -1
- package/dist/persistentStateStore.validate.d.ts +11 -1
- package/dist/persistentStateStore.validate.d.ts.map +1 -1
- package/dist/persistentStateStore.validate.js +32 -3
- package/dist/persistentStateStore.validate.js.map +1 -1
- package/dist/primitives.js.map +1 -1
- package/dist/request/alignHtfSeriesCache.js.map +1 -1
- package/dist/request/alignHtfSeriesToLtf.d.ts +2 -2
- package/dist/request/alignHtfSeriesToLtf.js +2 -2
- package/dist/request/alignHtfSeriesToLtf.js.map +1 -1
- package/dist/request/bucketLtfBarsByMainContainment.js.map +1 -1
- package/dist/request/bucketLtfBarsCache.js.map +1 -1
- package/dist/request/index.js.map +1 -1
- package/dist/request/lowerTf.js.map +1 -1
- package/dist/request/pushOnce.js.map +1 -1
- package/dist/request/requestNamespace.js.map +1 -1
- package/dist/request/security.js.map +1 -1
- package/dist/request/streamBars.js.map +1 -1
- package/dist/ringBuffer.d.ts +2 -2
- package/dist/ringBuffer.js +1 -1
- package/dist/ringBuffer.js.map +1 -1
- package/dist/runtimeContext.d.ts +65 -7
- package/dist/runtimeContext.d.ts.map +1 -1
- package/dist/runtimeContext.js.map +1 -1
- package/dist/seriesView.d.ts +1 -1
- package/dist/seriesView.js +1 -1
- package/dist/seriesView.js.map +1 -1
- package/dist/state/index.js.map +1 -1
- package/dist/state/lifecycle.js.map +1 -1
- package/dist/state/stateNamespace.d.ts.map +1 -1
- package/dist/state/stateNamespace.js +13 -2
- package/dist/state/stateNamespace.js.map +1 -1
- package/dist/state/stateSlot.js.map +1 -1
- package/dist/stateStore.d.ts +7 -4
- package/dist/stateStore.d.ts.map +1 -1
- package/dist/stateStore.js.map +1 -1
- package/dist/streamState.d.ts +1 -1
- package/dist/streamState.js +1 -1
- package/dist/streamState.js.map +1 -1
- package/dist/ta/adl.js +2 -2
- package/dist/ta/adl.js.map +1 -1
- package/dist/ta/adr.d.ts +3 -3
- package/dist/ta/adr.js +5 -5
- package/dist/ta/adr.js.map +1 -1
- package/dist/ta/adx.d.ts +1 -1
- package/dist/ta/adx.js +3 -3
- package/dist/ta/adx.js.map +1 -1
- package/dist/ta/alma.d.ts +3 -3
- package/dist/ta/alma.js +5 -5
- package/dist/ta/alma.js.map +1 -1
- package/dist/ta/anchoredVolumeProfile.js.map +1 -1
- package/dist/ta/anchoredVwap.d.ts +1 -1
- package/dist/ta/anchoredVwap.js +3 -3
- package/dist/ta/anchoredVwap.js.map +1 -1
- package/dist/ta/ao.js +2 -2
- package/dist/ta/ao.js.map +1 -1
- package/dist/ta/aroon.js +2 -2
- package/dist/ta/aroon.js.map +1 -1
- package/dist/ta/aroonOsc.js +2 -2
- package/dist/ta/aroonOsc.js.map +1 -1
- package/dist/ta/atr.d.ts +1 -1
- package/dist/ta/atr.js +3 -3
- package/dist/ta/atr.js.map +1 -1
- package/dist/ta/barssince.js +1 -1
- package/dist/ta/barssince.js.map +1 -1
- package/dist/ta/bb.d.ts +1 -1
- package/dist/ta/bb.js +3 -3
- package/dist/ta/bb.js.map +1 -1
- package/dist/ta/bbPercentB.js +2 -2
- package/dist/ta/bbPercentB.js.map +1 -1
- package/dist/ta/bbw.js +2 -2
- package/dist/ta/bbw.js.map +1 -1
- package/dist/ta/bop.js +2 -2
- package/dist/ta/bop.js.map +1 -1
- package/dist/ta/cci.js +2 -2
- package/dist/ta/cci.js.map +1 -1
- package/dist/ta/chaikinOsc.d.ts +1 -1
- package/dist/ta/chaikinOsc.js +3 -3
- package/dist/ta/chaikinOsc.js.map +1 -1
- package/dist/ta/chandeKrollStop.d.ts +1 -1
- package/dist/ta/chandeKrollStop.js +3 -3
- package/dist/ta/chandeKrollStop.js.map +1 -1
- package/dist/ta/chandelier.d.ts +1 -1
- package/dist/ta/chandelier.js +3 -3
- package/dist/ta/chandelier.js.map +1 -1
- package/dist/ta/change.js +1 -1
- package/dist/ta/change.js.map +1 -1
- package/dist/ta/chop.js +2 -2
- package/dist/ta/chop.js.map +1 -1
- package/dist/ta/cmf.js +2 -2
- package/dist/ta/cmf.js.map +1 -1
- package/dist/ta/cmo.js +2 -2
- package/dist/ta/cmo.js.map +1 -1
- package/dist/ta/connorsRsi.d.ts +1 -1
- package/dist/ta/connorsRsi.js +3 -3
- package/dist/ta/connorsRsi.js.map +1 -1
- package/dist/ta/coppock.js +2 -2
- package/dist/ta/coppock.js.map +1 -1
- package/dist/ta/crossover.d.ts +1 -1
- package/dist/ta/crossover.js +2 -2
- package/dist/ta/crossover.js.map +1 -1
- package/dist/ta/crossunder.d.ts +1 -1
- package/dist/ta/crossunder.js +2 -2
- package/dist/ta/crossunder.js.map +1 -1
- package/dist/ta/dema.js +2 -2
- package/dist/ta/dema.js.map +1 -1
- package/dist/ta/dmi.d.ts +1 -1
- package/dist/ta/dmi.js +3 -3
- package/dist/ta/dmi.js.map +1 -1
- package/dist/ta/donchian.js +2 -2
- package/dist/ta/donchian.js.map +1 -1
- package/dist/ta/dpo.js +2 -2
- package/dist/ta/dpo.js.map +1 -1
- package/dist/ta/ema.d.ts +1 -1
- package/dist/ta/ema.js +3 -3
- package/dist/ta/ema.js.map +1 -1
- package/dist/ta/envelope.js +2 -2
- package/dist/ta/envelope.js.map +1 -1
- package/dist/ta/eom.d.ts +1 -1
- package/dist/ta/eom.js +3 -3
- package/dist/ta/eom.js.map +1 -1
- package/dist/ta/fisher.js +2 -2
- package/dist/ta/fisher.js.map +1 -1
- package/dist/ta/fixedRangeVolumeProfile.js.map +1 -1
- package/dist/ta/highest.js +1 -1
- package/dist/ta/highest.js.map +1 -1
- package/dist/ta/historicalVolatility.d.ts +1 -1
- package/dist/ta/historicalVolatility.js +3 -3
- package/dist/ta/historicalVolatility.js.map +1 -1
- package/dist/ta/hma.js +2 -2
- package/dist/ta/hma.js.map +1 -1
- package/dist/ta/ichimoku.d.ts +1 -1
- package/dist/ta/ichimoku.js +3 -3
- package/dist/ta/ichimoku.js.map +1 -1
- package/dist/ta/index.js.map +1 -1
- package/dist/ta/kama.js +2 -2
- package/dist/ta/kama.js.map +1 -1
- package/dist/ta/keltner.js +2 -2
- package/dist/ta/keltner.js.map +1 -1
- package/dist/ta/klinger.js +2 -2
- package/dist/ta/klinger.js.map +1 -1
- package/dist/ta/kst.js +2 -2
- package/dist/ta/kst.js.map +1 -1
- package/dist/ta/lib/adxFromDi.js +2 -2
- package/dist/ta/lib/adxFromDi.js.map +1 -1
- package/dist/ta/lib/applyOffset.js +2 -2
- package/dist/ta/lib/applyOffset.js.map +1 -1
- package/dist/ta/lib/computeMa.js +2 -2
- package/dist/ta/lib/computeMa.js.map +1 -1
- package/dist/ta/lib/computeMaOfFloat64.js +2 -2
- package/dist/ta/lib/computeMaOfFloat64.js.map +1 -1
- package/dist/ta/lib/directionalState.js +2 -2
- package/dist/ta/lib/directionalState.js.map +1 -1
- package/dist/ta/lib/donchianMid.js +2 -2
- package/dist/ta/lib/donchianMid.js.map +1 -1
- package/dist/ta/lib/emaFloat64.js +2 -2
- package/dist/ta/lib/emaFloat64.js.map +1 -1
- package/dist/ta/lib/linearRegression.js +2 -2
- package/dist/ta/lib/linearRegression.js.map +1 -1
- package/dist/ta/lib/maTypes.js.map +1 -1
- package/dist/ta/lib/pearson.js +2 -2
- package/dist/ta/lib/pearson.js.map +1 -1
- package/dist/ta/lib/pickCandleSource.js +2 -2
- package/dist/ta/lib/pickCandleSource.js.map +1 -1
- package/dist/ta/lib/readSourceField.js +2 -2
- package/dist/ta/lib/readSourceField.js.map +1 -1
- package/dist/ta/lib/rollingStddev.js +2 -2
- package/dist/ta/lib/rollingStddev.js.map +1 -1
- package/dist/ta/lib/smaFloat64.js +2 -2
- package/dist/ta/lib/smaFloat64.js.map +1 -1
- package/dist/ta/lib/smmaFloat64.js +2 -2
- package/dist/ta/lib/smmaFloat64.js.map +1 -1
- package/dist/ta/lib/sourceValue.js.map +1 -1
- package/dist/ta/lib/trSeries.js +2 -2
- package/dist/ta/lib/trSeries.js.map +1 -1
- package/dist/ta/lib/volume-profile/bucketEdges.js.map +1 -1
- package/dist/ta/lib/volume-profile/bucketizeVolume.js.map +1 -1
- package/dist/ta/lib/volume-profile/developingSeries.js.map +1 -1
- package/dist/ta/lib/volume-profile/index.js.map +1 -1
- package/dist/ta/lib/volume-profile/intercept.js.map +1 -1
- package/dist/ta/lib/volume-profile/scaffold.js.map +1 -1
- package/dist/ta/lib/volume-profile/tooHeavy.js.map +1 -1
- package/dist/ta/lib/volume-profile/types.js.map +1 -1
- package/dist/ta/lib/volume-profile/valueArea.js.map +1 -1
- package/dist/ta/lib/volume-profile/volumeProfileShared.js.map +1 -1
- package/dist/ta/lib/vwmaFloat64.js +2 -2
- package/dist/ta/lib/vwmaFloat64.js.map +1 -1
- package/dist/ta/lib/wilderDirectional.js +2 -2
- package/dist/ta/lib/wilderDirectional.js.map +1 -1
- package/dist/ta/lib/wilderSmoothing.js +2 -2
- package/dist/ta/lib/wilderSmoothing.js.map +1 -1
- package/dist/ta/lib/wmaFloat64.js +2 -2
- package/dist/ta/lib/wmaFloat64.js.map +1 -1
- package/dist/ta/lowest.js +1 -1
- package/dist/ta/lowest.js.map +1 -1
- package/dist/ta/lsma.js +2 -2
- package/dist/ta/lsma.js.map +1 -1
- package/dist/ta/maRibbon.js +2 -2
- package/dist/ta/maRibbon.js.map +1 -1
- package/dist/ta/macd.d.ts +1 -1
- package/dist/ta/macd.js +4 -4
- package/dist/ta/macd.js.map +1 -1
- package/dist/ta/massIndex.d.ts +1 -1
- package/dist/ta/massIndex.js +3 -3
- package/dist/ta/massIndex.js.map +1 -1
- package/dist/ta/mcginley.js +2 -2
- package/dist/ta/mcginley.js.map +1 -1
- package/dist/ta/median.js +2 -2
- package/dist/ta/median.js.map +1 -1
- package/dist/ta/mfi.d.ts +1 -1
- package/dist/ta/mfi.js +3 -3
- package/dist/ta/mfi.js.map +1 -1
- package/dist/ta/momentum.js +2 -2
- package/dist/ta/momentum.js.map +1 -1
- package/dist/ta/netVolume.d.ts +1 -1
- package/dist/ta/netVolume.js +3 -3
- package/dist/ta/netVolume.js.map +1 -1
- package/dist/ta/nvi.d.ts +1 -1
- package/dist/ta/nvi.js +3 -3
- package/dist/ta/nvi.js.map +1 -1
- package/dist/ta/nz.js +1 -1
- package/dist/ta/nz.js.map +1 -1
- package/dist/ta/obv.js +2 -2
- package/dist/ta/obv.js.map +1 -1
- package/dist/ta/persistence.js.map +1 -1
- package/dist/ta/pivotsHighLow.js +2 -2
- package/dist/ta/pivotsHighLow.js.map +1 -1
- package/dist/ta/pivotsStandard.d.ts +1 -1
- package/dist/ta/pivotsStandard.js +3 -3
- package/dist/ta/pivotsStandard.js.map +1 -1
- package/dist/ta/pmo.js +2 -2
- package/dist/ta/pmo.js.map +1 -1
- package/dist/ta/ppo.d.ts +1 -1
- package/dist/ta/ppo.js +3 -3
- package/dist/ta/ppo.js.map +1 -1
- package/dist/ta/psar.js +2 -2
- package/dist/ta/psar.js.map +1 -1
- package/dist/ta/pvi.d.ts +1 -1
- package/dist/ta/pvi.js +3 -3
- package/dist/ta/pvi.js.map +1 -1
- package/dist/ta/pvo.d.ts +1 -1
- package/dist/ta/pvo.js +3 -3
- package/dist/ta/pvo.js.map +1 -1
- package/dist/ta/pvt.d.ts +1 -1
- package/dist/ta/pvt.js +3 -3
- package/dist/ta/pvt.js.map +1 -1
- package/dist/ta/registry.js.map +1 -1
- package/dist/ta/roc.js +2 -2
- package/dist/ta/roc.js.map +1 -1
- package/dist/ta/rsi.d.ts +1 -1
- package/dist/ta/rsi.js +3 -3
- package/dist/ta/rsi.js.map +1 -1
- package/dist/ta/rvgi.js +2 -2
- package/dist/ta/rvgi.js.map +1 -1
- package/dist/ta/rvi.d.ts +1 -1
- package/dist/ta/rvi.js +3 -3
- package/dist/ta/rvi.js.map +1 -1
- package/dist/ta/sessionVolumeProfile.js.map +1 -1
- package/dist/ta/sma.d.ts +1 -1
- package/dist/ta/sma.js +3 -3
- package/dist/ta/sma.js.map +1 -1
- package/dist/ta/smi.js +2 -2
- package/dist/ta/smi.js.map +1 -1
- package/dist/ta/smma.js +2 -2
- package/dist/ta/smma.js.map +1 -1
- package/dist/ta/stdev.d.ts +1 -1
- package/dist/ta/stdev.js +3 -3
- package/dist/ta/stdev.js.map +1 -1
- package/dist/ta/stoch.js +2 -2
- package/dist/ta/stoch.js.map +1 -1
- package/dist/ta/stochRsi.js +2 -2
- package/dist/ta/stochRsi.js.map +1 -1
- package/dist/ta/supertrend.d.ts +1 -1
- package/dist/ta/supertrend.js +3 -3
- package/dist/ta/supertrend.js.map +1 -1
- package/dist/ta/tema.js +2 -2
- package/dist/ta/tema.js.map +1 -1
- package/dist/ta/trendStrengthIndex.d.ts +2 -2
- package/dist/ta/trendStrengthIndex.js +4 -4
- package/dist/ta/trendStrengthIndex.js.map +1 -1
- package/dist/ta/trix.d.ts +1 -1
- package/dist/ta/trix.js +3 -3
- package/dist/ta/trix.js.map +1 -1
- package/dist/ta/tsi.js +2 -2
- package/dist/ta/tsi.js.map +1 -1
- package/dist/ta/ulcerIndex.js +2 -2
- package/dist/ta/ulcerIndex.js.map +1 -1
- package/dist/ta/ultimateOsc.js +2 -2
- package/dist/ta/ultimateOsc.js.map +1 -1
- package/dist/ta/valuewhen.js +1 -1
- package/dist/ta/valuewhen.js.map +1 -1
- package/dist/ta/visibleRangeVolumeProfile.d.ts +2 -2
- package/dist/ta/visibleRangeVolumeProfile.js +2 -2
- package/dist/ta/visibleRangeVolumeProfile.js.map +1 -1
- package/dist/ta/vol.js +2 -2
- package/dist/ta/vol.js.map +1 -1
- package/dist/ta/volatilityStop.d.ts +1 -1
- package/dist/ta/volatilityStop.js +3 -3
- package/dist/ta/volatilityStop.js.map +1 -1
- package/dist/ta/vortex.d.ts +1 -1
- package/dist/ta/vortex.js +3 -3
- package/dist/ta/vortex.js.map +1 -1
- package/dist/ta/vwap.d.ts +3 -3
- package/dist/ta/vwap.js +5 -5
- package/dist/ta/vwap.js.map +1 -1
- package/dist/ta/vwma.js +2 -2
- package/dist/ta/vwma.js.map +1 -1
- package/dist/ta/williamsFractal.js +2 -2
- package/dist/ta/williamsFractal.js.map +1 -1
- package/dist/ta/williamsR.js +2 -2
- package/dist/ta/williamsR.js.map +1 -1
- package/dist/ta/wma.js +2 -2
- package/dist/ta/wma.js.map +1 -1
- package/dist/ta/zigZag.js +2 -2
- package/dist/ta/zigZag.js.map +1 -1
- package/dist/views/barstateView.js.map +1 -1
- package/dist/views/index.js.map +1 -1
- package/dist/views/refreshRuntimeViews.js.map +1 -1
- package/dist/views/symInfoView.js.map +1 -1
- package/dist/views/timeframeView.js.map +1 -1
- package/package.json +7 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wilderDirectional.js","sourceRoot":"","sources":["../../../src/ta/lib/wilderDirectional.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"wilderDirectional.js","sourceRoot":"","sources":["../../../src/ta/lib/wilderDirectional.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAC/D,EAAE;AACF,yFAAyF;AACzF,mEAAmE;AACnE,qEAAqE;AACrE,gBAAgB;AAEhB,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAyBlD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,UAAU,iBAAiB,CAC7B,IAAkB,EAClB,GAAiB,EACjB,KAAmB,EACnB,MAAc;IAEd,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IACtB,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;IACpC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACxB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACzB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACxB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAEzB,IAAI,CAAC,KAAK,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClF,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAChD,CAAC;IAED,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IAC9B,IAAI,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAEzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAClC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QACjB,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7B,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAE3B,IACI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YACnB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YACnB,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;YAC3B,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC1B,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAC3B,CAAC;YACC,UAAU,GAAG,KAAK,CAAC;YACnB,MAAM;QACV,CAAC;QAED,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;QAClC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;QAClC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAE7B,MAAM,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC;QAC5B,MAAM,QAAQ,GAAG,OAAO,GAAG,CAAC,CAAC;QAC7B,MAAM,GAAG,GAAG,MAAM,GAAG,QAAQ,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,MAAM,GAAG,GAAG,QAAQ,GAAG,MAAM,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAE7D,UAAU,IAAI,GAAG,CAAC;QAClB,WAAW,IAAI,GAAG,CAAC;QACnB,MAAM,IAAI,EAAE,CAAC;IACjB,CAAC;IAED,IAAI,CAAC,UAAU;QAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAE7D,IAAI,cAAc,GAAG,UAAU,CAAC;IAChC,IAAI,eAAe,GAAG,WAAW,CAAC;IAClC,IAAI,UAAU,GAAG,MAAM,CAAC;IAExB,MAAM,CAAC,MAAM,CAAC,GAAG,cAAc,GAAG,MAAM,CAAC;IACzC,OAAO,CAAC,MAAM,CAAC,GAAG,eAAe,GAAG,MAAM,CAAC;IAC3C,MAAM,CAAC,MAAM,CAAC,GAAG,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,cAAc,CAAC,GAAG,UAAU,CAAC;IAC5E,OAAO,CAAC,MAAM,CAAC,GAAG,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,eAAe,CAAC,GAAG,UAAU,CAAC;IAE9E,KAAK,IAAI,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QACjB,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7B,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAE3B,IACI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YACnB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YACnB,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;YAC3B,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC1B,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAC3B,CAAC;YACC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAChD,CAAC;QAED,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;QAClC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;QAClC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAE7B,MAAM,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC;QAC5B,MAAM,QAAQ,GAAG,OAAO,GAAG,CAAC,CAAC;QAC7B,MAAM,GAAG,GAAG,MAAM,GAAG,QAAQ,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,MAAM,GAAG,GAAG,QAAQ,GAAG,MAAM,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAE7D,cAAc,GAAG,UAAU,CAAC,cAAc,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QACzD,eAAe,GAAG,UAAU,CAAC,eAAe,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QAC3D,UAAU,GAAG,UAAU,CAAC,UAAU,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;QAEhD,MAAM,CAAC,CAAC,CAAC,GAAG,cAAc,GAAG,MAAM,CAAC;QACpC,OAAO,CAAC,CAAC,CAAC,GAAG,eAAe,GAAG,MAAM,CAAC;QACtC,MAAM,CAAC,CAAC,CAAC,GAAG,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,cAAc,CAAC,GAAG,UAAU,CAAC;QACvE,OAAO,CAAC,CAAC,CAAC,GAAG,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,eAAe,CAAC,GAAG,UAAU,CAAC;IAC7E,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAChD,CAAC","sourcesContent":["// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/lib/wilder-directional.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite).\n// Re-licensed MIT for chartlang. The math is the reference, the code\n// style is not.\n\nimport { wilderStep } from \"./wilderSmoothing.js\";\n\n/**\n * Wilder directional movement bundle. All four arrays have length\n * `n` (= `high.length`); warmup slots `[0, length - 1]` are `NaN`.\n *\n * `plusDm` / `minusDm` are the Wilder-smoothed per-bar directional\n * movement (divided by `length` so they read as averages — matches\n * what TradingView's `ta.dmi` plots). `plusDi` / `minusDi` are\n * `100 * smoothedPlusDm / smoothedTr` (symmetric for the minus\n * side); these are the values consumed by `adxFromDi`.\n *\n * @formula N/A — return-bundle type for {@link wilderDirectional}\n * @since 0.2\n * @stable\n * @example\n * // const dm: DirectionalMovement = wilderDirectional(h, l, c, 14);\n */\nexport type DirectionalMovement = Readonly<{\n plusDm: Float64Array;\n minusDm: Float64Array;\n plusDi: Float64Array;\n minusDi: Float64Array;\n}>;\n\n/**\n * Wilder's `+DM` / `-DM` / `+DI` / `-DI` over a `length`-bar\n * smoothing window. The per-bar raw `+DM` / `-DM` are computed from\n * consecutive high / low deltas, then smoothed via Wilder's α = 1/N\n * recurrence (reuses `wilderStep`). True Range is computed inline\n * (rather than via `lib/trSeries`) because this helper operates on\n * Float64Array inputs, not `Bar[]`.\n *\n * Warmup: `length` — one extra slot above the smoothing window so\n * the TR seed can settle. First valid slot index is `length`.\n *\n * `plusDi` / `minusDi` fall back to `0` when the smoothed TR is\n * zero (matches invinite). Any non-finite input slot inside the\n * seed window leaves the entire output `NaN` from that slot\n * onwards (Wilder recurrence cannot resume past a NaN seed).\n *\n * @formula upMove = high[i] - high[i-1] ;\n * downMove = low[i-1] - low[i] ;\n * plusDm = upMove > downMove && upMove > 0 ? upMove : 0 ;\n * minusDm = downMove > upMove && downMove > 0 ? downMove : 0 ;\n * tr[i] = max(h - l, |h - prevClose|, |l - prevClose|) ;\n * smoothed via wilderStep over `length`.\n * @warmup length\n * @since 0.2\n * @stable\n * @example\n * // import { wilderDirectional } from \"./wilderDirectional\";\n * // const dm = wilderDirectional(highs, lows, closes, 14);\n */\nexport function wilderDirectional(\n high: Float64Array,\n low: Float64Array,\n close: Float64Array,\n length: number,\n): DirectionalMovement {\n const n = high.length;\n const plusDm = new Float64Array(n);\n const minusDm = new Float64Array(n);\n const plusDi = new Float64Array(n);\n const minusDi = new Float64Array(n);\n plusDm.fill(Number.NaN);\n minusDm.fill(Number.NaN);\n plusDi.fill(Number.NaN);\n minusDi.fill(Number.NaN);\n\n if (n === 0 || length <= 0 || n <= length || low.length !== n || close.length !== n) {\n return { minusDi, minusDm, plusDi, plusDm };\n }\n\n let seedPlusDm = 0;\n let seedMinusDm = 0;\n let seedTr = high[0] - low[0];\n let seedFinite = Number.isFinite(seedTr);\n\n for (let i = 1; i <= length; i += 1) {\n const h = high[i];\n const l = low[i];\n const prevClose = close[i - 1];\n const prevHigh = high[i - 1];\n const prevLow = low[i - 1];\n\n if (\n !Number.isFinite(h) ||\n !Number.isFinite(l) ||\n !Number.isFinite(prevClose) ||\n !Number.isFinite(prevHigh) ||\n !Number.isFinite(prevLow)\n ) {\n seedFinite = false;\n break;\n }\n\n const a = h - l;\n const b = Math.abs(h - prevClose);\n const d = Math.abs(l - prevClose);\n const tr = Math.max(a, b, d);\n\n const upMove = h - prevHigh;\n const downMove = prevLow - l;\n const pDm = upMove > downMove && upMove > 0 ? upMove : 0;\n const mDm = downMove > upMove && downMove > 0 ? downMove : 0;\n\n seedPlusDm += pDm;\n seedMinusDm += mDm;\n seedTr += tr;\n }\n\n if (!seedFinite) return { minusDi, minusDm, plusDi, plusDm };\n\n let smoothedPlusDm = seedPlusDm;\n let smoothedMinusDm = seedMinusDm;\n let smoothedTr = seedTr;\n\n plusDm[length] = smoothedPlusDm / length;\n minusDm[length] = smoothedMinusDm / length;\n plusDi[length] = smoothedTr === 0 ? 0 : (100 * smoothedPlusDm) / smoothedTr;\n minusDi[length] = smoothedTr === 0 ? 0 : (100 * smoothedMinusDm) / smoothedTr;\n\n for (let i = length + 1; i < n; i += 1) {\n const h = high[i];\n const l = low[i];\n const prevClose = close[i - 1];\n const prevHigh = high[i - 1];\n const prevLow = low[i - 1];\n\n if (\n !Number.isFinite(h) ||\n !Number.isFinite(l) ||\n !Number.isFinite(prevClose) ||\n !Number.isFinite(prevHigh) ||\n !Number.isFinite(prevLow)\n ) {\n return { minusDi, minusDm, plusDi, plusDm };\n }\n\n const a = h - l;\n const b = Math.abs(h - prevClose);\n const d = Math.abs(l - prevClose);\n const tr = Math.max(a, b, d);\n\n const upMove = h - prevHigh;\n const downMove = prevLow - l;\n const pDm = upMove > downMove && upMove > 0 ? upMove : 0;\n const mDm = downMove > upMove && downMove > 0 ? downMove : 0;\n\n smoothedPlusDm = wilderStep(smoothedPlusDm, pDm, length);\n smoothedMinusDm = wilderStep(smoothedMinusDm, mDm, length);\n smoothedTr = wilderStep(smoothedTr, tr, length);\n\n plusDm[i] = smoothedPlusDm / length;\n minusDm[i] = smoothedMinusDm / length;\n plusDi[i] = smoothedTr === 0 ? 0 : (100 * smoothedPlusDm) / smoothedTr;\n minusDi[i] = smoothedTr === 0 ? 0 : (100 * smoothedMinusDm) / smoothedTr;\n }\n\n return { minusDi, minusDm, plusDi, plusDm };\n}\n"]}
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
// New helper extracted from invinite/src/components/trading-chart/indicators/
|
|
5
5
|
// rsi.ts and atr.ts Wilder smoothing loops
|
|
6
6
|
// (commit d2d1043c1b039f66d2f3674526d303d31cf2f1e0, © Invinite).
|
|
7
|
-
// Re-licensed MIT for chartlang.
|
|
8
|
-
//
|
|
7
|
+
// Re-licensed MIT for chartlang. The math is the reference, the code
|
|
8
|
+
// style is not.
|
|
9
9
|
/**
|
|
10
10
|
* One step of Wilder's α = 1/length smoothing. Returns the updated
|
|
11
11
|
* running average given the prior average and a new sample:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wilderSmoothing.js","sourceRoot":"","sources":["../../../src/ta/lib/wilderSmoothing.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAC/D,EAAE;AACF,8EAA8E;AAC9E,6CAA6C;AAC7C,mEAAmE;AACnE,
|
|
1
|
+
{"version":3,"file":"wilderSmoothing.js","sourceRoot":"","sources":["../../../src/ta/lib/wilderSmoothing.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAC/D,EAAE;AACF,8EAA8E;AAC9E,6CAA6C;AAC7C,mEAAmE;AACnE,qEAAqE;AACrE,gBAAgB;AAEhB;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,MAAc,EAAE,MAAc;IACnE,OAAO,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC;AACnD,CAAC","sourcesContent":["// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// New helper extracted from invinite/src/components/trading-chart/indicators/\n// rsi.ts and atr.ts Wilder smoothing loops\n// (commit d2d1043c1b039f66d2f3674526d303d31cf2f1e0, © Invinite).\n// Re-licensed MIT for chartlang. The math is the reference, the code\n// style is not.\n\n/**\n * One step of Wilder's α = 1/length smoothing. Returns the updated\n * running average given the prior average and a new sample:\n * `prev * (length − 1) / length + sample / length`. RSI's avgGain /\n * avgLoss recurrence and ATR's Wilder ATR recurrence both fold onto\n * this helper so a single line carries the math.\n *\n * @formula out = prev * (length − 1) / length + sample / length\n * @since 0.1\n * @stable\n * @example\n * // import { wilderStep } from \"./wilderSmoothing\";\n * // const nextAvg = wilderStep(prevAvg, gain, 14);\n */\nexport function wilderStep(prev: number, sample: number, length: number): number {\n return (prev * (length - 1) + sample) / length;\n}\n"]}
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
//
|
|
4
4
|
// Ported from invinite/src/components/trading-chart/indicators/lib/wma-of-float64.ts
|
|
5
5
|
// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite).
|
|
6
|
-
// Re-licensed MIT for chartlang.
|
|
7
|
-
//
|
|
6
|
+
// Re-licensed MIT for chartlang. The math is the reference, the code
|
|
7
|
+
// style is not.
|
|
8
8
|
/**
|
|
9
9
|
* Weighted Moving Average over a `Float64Array` input. Walks past any
|
|
10
10
|
* leading-NaN prefix, then runs a linearly-weighted mean over each
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wmaFloat64.js","sourceRoot":"","sources":["../../../src/ta/lib/wmaFloat64.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAC/D,EAAE;AACF,qFAAqF;AACrF,mEAAmE;AACnE,
|
|
1
|
+
{"version":3,"file":"wmaFloat64.js","sourceRoot":"","sources":["../../../src/ta/lib/wmaFloat64.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAC/D,EAAE;AACF,qFAAqF;AACrF,mEAAmE;AACnE,qEAAqE;AACrE,gBAAgB;AAEhB;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,UAAU,CAAC,MAAoB,EAAE,MAAc;IAC3D,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACxB,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;IAChC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACrB,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IAEvC,MAAM,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAE1C,IAAI,aAAa,GAAG,CAAC,CAAC,CAAC;IACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7B,aAAa,GAAG,CAAC,CAAC;YAClB,MAAM;QACV,CAAC;IACL,CAAC;IACD,IAAI,aAAa,GAAG,CAAC,IAAI,CAAC,GAAG,aAAa,GAAG,MAAM;QAAE,OAAO,GAAG,CAAC;IAEhE,KAAK,IAAI,CAAC,GAAG,aAAa,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACrD,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,IAAI,SAAS,GAAG,IAAI,CAAC;QACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACjC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACxB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtB,SAAS,GAAG,KAAK,CAAC;gBAClB,MAAM;YACV,CAAC;YACD,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC,SAAS;YAAE,SAAS;QACzB,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC;IACzB,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC","sourcesContent":["// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/lib/wma-of-float64.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite).\n// Re-licensed MIT for chartlang. The math is the reference, the code\n// style is not.\n\n/**\n * Weighted Moving Average over a `Float64Array` input. Walks past any\n * leading-NaN prefix, then runs a linearly-weighted mean over each\n * trailing `length`-bar window with weights `(1, 2, …, N)` and\n * denominator `N(N + 1) / 2`. A NaN anywhere inside a window\n * short-circuits that bar's output to NaN — full-recompute weighted\n * windows cannot meaningfully forward-fill a gap.\n *\n * Warmup `[0, length − 2]` is `NaN`; `out[length − 1]` is the first\n * defined value.\n *\n * @formula denom = N(N + 1) / 2 ;\n * out[i] = (Σ_{j=0..N-1} input[i − j] * (N − j)) / denom\n * @warmup length − 1\n * @since 0.2\n * @stable\n * @example\n * // import { wmaFloat64 } from \"./wmaFloat64\";\n * // const out = wmaFloat64(new Float64Array([1, 2, 3, 4]), 3);\n */\nexport function wmaFloat64(source: Float64Array, length: number): Float64Array {\n const n = source.length;\n const out = new Float64Array(n);\n out.fill(Number.NaN);\n if (length <= 0 || n === 0) return out;\n\n const denom = (length * (length + 1)) / 2;\n\n let firstValidIdx = -1;\n for (let i = 0; i < n; i += 1) {\n if (Number.isFinite(source[i])) {\n firstValidIdx = i;\n break;\n }\n }\n if (firstValidIdx < 0 || n - firstValidIdx < length) return out;\n\n for (let i = firstValidIdx + length - 1; i < n; i += 1) {\n let sum = 0;\n let allFinite = true;\n for (let j = 0; j < length; j += 1) {\n const v = source[i - j];\n if (!Number.isFinite(v)) {\n allFinite = false;\n break;\n }\n sum += v * (length - j);\n }\n if (!allFinite) continue;\n out[i] = sum / denom;\n }\n return out;\n}\n"]}
|
package/dist/ta/lowest.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Copyright (c) 2026 Invinite. Licensed under the MIT License.
|
|
2
2
|
// See the LICENSE file in the repo root for full license text.
|
|
3
3
|
//
|
|
4
|
-
// No invinite source — semantics per Pine `ta.lowest`.
|
|
4
|
+
// No invinite source — semantics per Pine `ta.lowest`.
|
|
5
5
|
// Structural choices (callsite-id slot, Series<T> proxy, replaceHead
|
|
6
6
|
// mode) follow chartlang's primitive shape.
|
|
7
7
|
import { Float64RingBuffer } from "../ringBuffer.js";
|
package/dist/ta/lowest.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lowest.js","sourceRoot":"","sources":["../../src/ta/lowest.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAC/D,EAAE;AACF,
|
|
1
|
+
{"version":3,"file":"lowest.js","sourceRoot":"","sources":["../../src/ta/lowest.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// No invinite source — semantics per Pine `ta.lowest`.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape.\n\nimport type { LowestOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\ntype LowestSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n /** Closed source values across the trailing `length` bars. */\n readonly sourceWindow: Float64RingBuffer;\n /** Monotone-increasing values front-to-back (front = current min). */\n monoIndices: number[];\n monoValues: number[];\n barCount: number;\n /**\n * Min of the trailing window EXCLUDING the head bar. Computed once\n * per close by walking the source window.\n */\n closedMinExcludingHead: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.lowest called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): LowestSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n sourceWindow: new Float64RingBuffer(length),\n monoIndices: [],\n monoValues: [],\n barCount: 0,\n closedMinExcludingHead: Number.POSITIVE_INFINITY,\n };\n}\n\nfunction recomputeMinExcludingHead(slot: LowestSlot): number {\n let minV = Number.POSITIVE_INFINITY;\n const filled = slot.sourceWindow.length;\n for (let i = 1; i < filled; i += 1) {\n const v = slot.sourceWindow.at(i);\n if (Number.isFinite(v) && v < minV) minV = v;\n }\n return minV;\n}\n\nfunction closeValue(slot: LowestSlot, src: number): number {\n slot.barCount += 1;\n const headIndex = slot.barCount - 1;\n slot.sourceWindow.append(src);\n\n const oldestAllowed = headIndex - slot.length + 1;\n while (slot.monoIndices.length > 0 && slot.monoIndices[0] < oldestAllowed) {\n slot.monoIndices.shift();\n slot.monoValues.shift();\n }\n\n if (Number.isFinite(src)) {\n // Strict `>` keeps equal values in the deque.\n while (slot.monoIndices.length > 0 && slot.monoValues[slot.monoValues.length - 1] > src) {\n slot.monoIndices.pop();\n slot.monoValues.pop();\n }\n slot.monoIndices.push(headIndex);\n slot.monoValues.push(src);\n }\n\n if (slot.barCount < slot.length) {\n slot.closedMinExcludingHead = Number.POSITIVE_INFINITY;\n return Number.NaN;\n }\n\n slot.closedMinExcludingHead = recomputeMinExcludingHead(slot);\n\n if (slot.monoIndices.length === 0) return Number.NaN;\n return slot.monoValues[0];\n}\n\nfunction tickValue(slot: LowestSlot, src: number): number {\n if (slot.barCount < slot.length) return Number.NaN;\n if (!Number.isFinite(src)) {\n return slot.closedMinExcludingHead === Number.POSITIVE_INFINITY\n ? Number.NaN\n : slot.closedMinExcludingHead;\n }\n if (slot.closedMinExcludingHead === Number.POSITIVE_INFINITY) {\n return src;\n }\n return Math.min(slot.closedMinExcludingHead, src);\n}\n\n/**\n * Rolling minimum of the last `length` source values. NaN inputs are\n * skipped from the window; the output is NaN until `length` closed\n * bars have been folded in. Tick-mode replays the head as\n * `min(closedMinExcludingHead, tickValue)`.\n *\n * @formula out[t] = min(source[t − length + 1 .. t]) (NaN slots skipped)\n * @warmup length − 1\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const lower = ta.lowest(bar.low, 20);\n * // plot(lower);\n */\nexport function lowest(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n _opts?: LowestOpts,\n): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as LowestSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const src = readSourceValue(source);\n if (ctx.isTick) {\n slot.outBuffer.replaceHead(tickValue(slot, src));\n } else {\n slot.outBuffer.append(closeValue(slot, src));\n }\n return slot.series;\n}\n"]}
|
package/dist/ta/lsma.js
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
// Ported from invinite/src/components/trading-chart/indicators/lsma.ts
|
|
5
5
|
// plus lib/linear-regression.ts
|
|
6
6
|
// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite).
|
|
7
|
-
// Re-licensed MIT for chartlang.
|
|
8
|
-
//
|
|
7
|
+
// Re-licensed MIT for chartlang. The math is the reference, the code
|
|
8
|
+
// style is not.
|
|
9
9
|
// Structural choices (callsite-id slot, Series<T> proxy, replaceHead
|
|
10
10
|
// mode) follow chartlang's primitive shape — NOT invinite's
|
|
11
11
|
// IndicatorPlugin shape. The per-bar walk is the streaming-compatible
|
package/dist/ta/lsma.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lsma.js","sourceRoot":"","sources":["../../src/ta/lsma.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAC/D,EAAE;AACF,uEAAuE;AACvE,kCAAkC;AAClC,mEAAmE;AACnE,
|
|
1
|
+
{"version":3,"file":"lsma.js","sourceRoot":"","sources":["../../src/ta/lsma.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/lsma.ts\n// plus lib/linear-regression.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite).\n// Re-licensed MIT for chartlang. The math is the reference, the code\n// style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape — NOT invinite's\n// IndicatorPlugin shape. The per-bar walk is the streaming-compatible\n// shape of `lib/linearRegression`'s closed-form formula; that helper is\n// reused verbatim as the reference computation in the property tests.\n\nimport type { LsmaOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\ntype LsmaSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n /** Precomputed `(length − 1) / 2`. */\n readonly xMean: number;\n /** Precomputed `Σ (j − xMean)²` for `j = 0..length − 1`. */\n readonly sumXX: number;\n /**\n * Trailing `length` source values. `at(0)` is the head (most\n * recent close); `at(length − 1)` is the oldest.\n */\n readonly sourceWindow: Float64RingBuffer;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.lsma called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): LsmaSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n const xMean = (length - 1) / 2;\n let sumXX = 0;\n for (let j = 0; j < length; j += 1) {\n const dev = j - xMean;\n sumXX += dev * dev;\n }\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n xMean,\n sumXX,\n sourceWindow: new Float64RingBuffer(length),\n };\n}\n\nfunction lsmaFromWindow(slot: LsmaSlot, headOverride?: number): number {\n // Single-pass scan: build sumY, then a second pass for the\n // covariance numerator. Two passes still fit the streaming budget\n // (O(length) per bar) and the structure mirrors the reference\n // `linearRegression` helper byte-for-byte at the math level.\n let sumY = 0;\n for (let j = 0; j < slot.length; j += 1) {\n // j = 0 → oldest (window.at(length - 1)); j = length - 1 → head.\n const ageFromHead = slot.length - 1 - j;\n const v =\n ageFromHead === 0 && headOverride !== undefined\n ? headOverride\n : slot.sourceWindow.at(ageFromHead);\n if (!Number.isFinite(v)) return Number.NaN;\n sumY += v;\n }\n const yMean = sumY / slot.length;\n let num = 0;\n for (let j = 0; j < slot.length; j += 1) {\n const ageFromHead = slot.length - 1 - j;\n const v =\n ageFromHead === 0 && headOverride !== undefined\n ? headOverride\n : slot.sourceWindow.at(ageFromHead);\n num += (j - slot.xMean) * (v - yMean);\n }\n const slope = num / slot.sumXX;\n const intercept = yMean - slope * slot.xMean;\n return intercept + slope * (slot.length - 1);\n}\n\nfunction closeValue(slot: LsmaSlot, src: number): number {\n slot.sourceWindow.append(src);\n if (slot.sourceWindow.length < slot.length) return Number.NaN;\n return lsmaFromWindow(slot);\n}\n\nfunction tickValue(slot: LsmaSlot, src: number): number {\n if (slot.sourceWindow.length < slot.length) return Number.NaN;\n if (!Number.isFinite(src)) return Number.NaN;\n return lsmaFromWindow(slot, src);\n}\n\n/**\n * Least Squares Moving Average — the value of the ordinary-least-\n * squares regression line `y = a + b·x` evaluated at the last bar of\n * the trailing `length`-bar window (with `x = 0..length − 1` and `y`\n * the source values). Mathematically equivalent to\n * `linearRegression(source, length).value` from `lib/linearRegression`\n * — that helper is reused verbatim as the property-test reference.\n * Per-bar cost is a two-pass O(length) window walk (sumY, then\n * covariance numerator) to keep the per-bar allocation profile flat;\n * a NaN anywhere inside the window short-circuits the output to NaN\n * (matches the WMA / weighted-window convention).\n *\n * @formula xMean = (length − 1) / 2 ;\n * sumXX = Σ (j − xMean)² for j = 0..length − 1 ;\n * yMean = (1 / length) · Σ source[t − length + 1 + j] ;\n * slope = (Σ (j − xMean) · (source[t − length + 1 + j] − yMean)) / sumXX ;\n * intercept = yMean − slope · xMean ;\n * out[t] = intercept + slope · (length − 1)\n * @warmup length − 1\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const l = ta.lsma(bar.close, 25);\n * // plot(l);\n */\nexport function lsma(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n _opts?: LsmaOpts,\n): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as LsmaSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const src = readSourceValue(source);\n if (ctx.isTick) {\n slot.outBuffer.replaceHead(tickValue(slot, src));\n } else {\n slot.outBuffer.append(closeValue(slot, src));\n }\n return slot.series;\n}\n"]}
|
package/dist/ta/maRibbon.js
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
//
|
|
4
4
|
// Ported from invinite/src/components/trading-chart/indicators/ma-ribbon.ts
|
|
5
5
|
// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite).
|
|
6
|
-
// Re-licensed MIT for chartlang.
|
|
7
|
-
//
|
|
6
|
+
// Re-licensed MIT for chartlang. The math is the reference, the code
|
|
7
|
+
// style is not.
|
|
8
8
|
// Structural choices (callsite-id slot, Series<T> proxy, replaceHead
|
|
9
9
|
// mode) follow chartlang's primitive shape — NOT invinite's
|
|
10
10
|
// IndicatorPlugin shape. maRibbon dispatches per-bar through
|
package/dist/ta/maRibbon.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"maRibbon.js","sourceRoot":"","sources":["../../src/ta/maRibbon.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAC/D,EAAE;AACF,4EAA4E;AAC5E,mEAAmE;AACnE,
|
|
1
|
+
{"version":3,"file":"maRibbon.js","sourceRoot":"","sources":["../../src/ta/maRibbon.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/ma-ribbon.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite).\n// Re-licensed MIT for chartlang. The math is the reference, the code\n// style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape — NOT invinite's\n// IndicatorPlugin shape. maRibbon dispatches per-bar through\n// `TA_REGISTRY`'s registered MA primitives (sma / ema / wma / smma)\n// via sub-slot ids derived from the parent slot id; no private MA copy.\n\nimport type {\n MaRibbonOpts,\n MaRibbonResult,\n MaTypeNoVolume,\n Series,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { ema } from \"./ema.js\";\nimport { sma } from \"./sma.js\";\nimport { smma } from \"./smma.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\nimport { wma } from \"./wma.js\";\n\nconst DEFAULT_LENGTHS: ReadonlyArray<number> = Object.freeze([10, 20, 30, 40, 50]);\nconst DEFAULT_MA_TYPE: MaTypeNoVolume = \"sma\";\n\ntype MaRibbonSlot = {\n readonly outputs: MaRibbonResult;\n readonly lengths: ReadonlyArray<number>;\n readonly maType: MaTypeNoVolume;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.maRibbon called outside an active script step\");\n }\n return ctx;\n}\n\nfunction dispatchMa(\n maType: MaTypeNoVolume,\n subSlotId: string,\n source: number,\n length: number,\n): Series<number> {\n switch (maType) {\n case \"sma\":\n return sma(subSlotId, source, length);\n case \"ema\":\n return ema(subSlotId, source, length);\n case \"wma\":\n return wma(subSlotId, source, length);\n case \"smma\":\n return smma(subSlotId, source, length);\n }\n}\n\n/**\n * Resolve the ordered `ma_<length>` keys for an `opts` value. Defaults\n * mirror `ta.maRibbon`'s defaults (`lengths = [10, 20, 30, 40, 50]`)\n * so a no-opts call yields `[\"ma_10\", \"ma_20\", \"ma_30\", \"ma_40\",\n * \"ma_50\"]`. Iteration order matches the resolved `lengths` array;\n * consumers (legend chips, sub-pane axes, the conformance harness) use\n * this helper to enumerate the `MaRibbonResult` record without\n * hard-coding key names.\n *\n * @formula keys = (opts.lengths ?? DEFAULT_LENGTHS).map(n => `ma_${n}`)\n * @since 0.2\n * @stable\n * @example\n * // import { maRibbonOutputKeys } from \"@invinite-org/chartlang-runtime\";\n * // const keys = maRibbonOutputKeys({ lengths: [10, 20, 30] });\n * // // keys === [\"ma_10\", \"ma_20\", \"ma_30\"]\n */\nexport function maRibbonOutputKeys(opts?: MaRibbonOpts): ReadonlyArray<string> {\n const lengths = opts?.lengths ?? DEFAULT_LENGTHS;\n const out: string[] = [];\n for (const length of lengths) out.push(`ma_${length}`);\n return out;\n}\n\n/**\n * MA Ribbon — a fan of K moving averages of the same kind at different\n * lengths. Returns a dynamic-key record `{ ma_<length>: Series<number> }`\n * keyed by the resolved `lengths` array. Each output is composed through\n * `TA_REGISTRY`'s registered MA primitive (`sma` / `ema` / `wma` /\n * `smma`) via the sub-slot id `${slotId}/ma_<length>` — no private MA\n * copy, so a fix to any MA primitive flows in for free (matches the\n * `donchian` / `bb` / `macd` composition convention). Defaults:\n * `lengths = [10, 20, 30, 40, 50]`, `maType = \"sma\"`. Per-output warmup\n * matches the source MA's warmup at that length.\n *\n * The sibling helper {@link maRibbonOutputKeys} returns the ordered\n * `ma_<length>` keys for stable iteration over the result record.\n * `TA_REGISTRY_METADATA.maRibbon` records the default primary key +\n * visible keys + `{ kind: \"auto\" }` y-domain for legend / pane sizing.\n *\n * @formula out.ma_<length> = MA(source, length) for length ∈ lengths\n * @warmup per-output : matches the source MA's warmup at `length` ;\n * ribbon as a whole : `max(lengths) − 1`\n * @anchors lengths, maType\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const r = ta.maRibbon(bar.close, { lengths: [10, 20, 30], maType: \"ema\" });\n * // plot(r.ma_10);\n * // plot(r.ma_20);\n * // plot(r.ma_30);\n */\nexport function maRibbon(\n slotId: string,\n source: ScalarOrSeries,\n opts?: MaRibbonOpts,\n): MaRibbonResult {\n const ctx = getCtx();\n const lengths = opts?.lengths ?? DEFAULT_LENGTHS;\n const maType = opts?.maType ?? DEFAULT_MA_TYPE;\n const src = readSourceValue(source);\n\n let slot = ctx.stream.taSlots.get(slotId) as MaRibbonSlot | undefined;\n if (slot === undefined) {\n // First call: drive every sub-slot to allocate its `Series<number>`,\n // then freeze the result record (identity-stable per parent slot).\n const outputs: Record<string, Series<number>> = {};\n for (const length of lengths) {\n const subSlotId = `${slotId}/ma_${length}`;\n outputs[`ma_${length}`] = dispatchMa(maType, subSlotId, src, length);\n }\n slot = {\n outputs: Object.freeze(outputs),\n lengths,\n maType,\n };\n ctx.stream.taSlots.set(slotId, slot);\n return slot.outputs;\n }\n\n // Subsequent calls: drive every sub-slot through its registered MA\n // primitive — the sub-slots own per-bar advancement (close-side\n // append / tick-side replaceHead via `ctx.isTick`).\n for (const length of slot.lengths) {\n const subSlotId = `${slotId}/ma_${length}`;\n dispatchMa(slot.maType, subSlotId, src, length);\n }\n return slot.outputs;\n}\n"]}
|
package/dist/ta/macd.d.ts
CHANGED
|
@@ -17,7 +17,7 @@ import { type ScalarOrSeries } from "./lib/sourceValue.js";
|
|
|
17
17
|
* @since 0.1
|
|
18
18
|
* @stable
|
|
19
19
|
*
|
|
20
|
-
* `opts.offset` shifts all three outputs in lockstep
|
|
20
|
+
* `opts.offset` shifts all three outputs in lockstep —
|
|
21
21
|
* `series.current` on each output returns the value `offset` bars ago.
|
|
22
22
|
*
|
|
23
23
|
* @example
|
package/dist/ta/macd.js
CHANGED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
// See the LICENSE file in the repo root for full license text.
|
|
3
3
|
//
|
|
4
4
|
// Ported from invinite/src/components/trading-chart/indicators/macd.ts
|
|
5
|
-
// (folded onto lib/ema-of-float64.ts
|
|
5
|
+
// (folded onto lib/ema-of-float64.ts)
|
|
6
6
|
// (commit d2d1043c1b039f66d2f3674526d303d31cf2f1e0, © Invinite).
|
|
7
|
-
// Re-licensed MIT for chartlang.
|
|
8
|
-
//
|
|
7
|
+
// Re-licensed MIT for chartlang. The math is the reference, the code
|
|
8
|
+
// style is not.
|
|
9
9
|
// Structural choices (callsite-id slot, Series<T> proxy, replaceHead
|
|
10
10
|
// mode) follow chartlang's primitive shape — NOT invinite's
|
|
11
11
|
// IndicatorPlugin shape. The MACD primitive composes three EMA
|
|
@@ -72,7 +72,7 @@ function resultForOffset(slot, offset) {
|
|
|
72
72
|
* @since 0.1
|
|
73
73
|
* @stable
|
|
74
74
|
*
|
|
75
|
-
* `opts.offset` shifts all three outputs in lockstep
|
|
75
|
+
* `opts.offset` shifts all three outputs in lockstep —
|
|
76
76
|
* `series.current` on each output returns the value `offset` bars ago.
|
|
77
77
|
*
|
|
78
78
|
* @example
|
package/dist/ta/macd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"macd.js","sourceRoot":"","sources":["../../src/ta/macd.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAC/D,EAAE;AACF,uEAAuE;AACvE,
|
|
1
|
+
{"version":3,"file":"macd.js","sourceRoot":"","sources":["../../src/ta/macd.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAC/D,EAAE;AACF,uEAAuE;AACvE,wCAAwC;AACxC,mEAAmE;AACnE,qEAAqE;AACrE,gBAAgB;AAChB,qEAAqE;AACrE,4DAA4D;AAC5D,+DAA+D;AAC/D,oEAAoE;AACpE,cAAc;AAId,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAuB,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAuB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5E,MAAM,YAAY,GAAG,EAAE,CAAC;AACxB,MAAM,YAAY,GAAG,EAAE,CAAC;AACxB,MAAM,cAAc,GAAG,CAAC,CAAC;AAqBzB,SAAS,MAAM;IACX,MAAM,GAAG,GAAG,sBAAsB,CAAC,OAAO,CAAC;IAC3C,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CACb,QAAgB,EAChB,YAA4B,EAC5B,SAA4B;IAE5B,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAChD,OAAO;QACH,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;YAClB,IAAI,EAAE,cAAc,CAAS,OAAO,CAAC;YACrC,MAAM,EAAE,YAAY;YACpB,IAAI,EAAE,cAAc,CAAS,OAAO,CAAC;SACxC,CAAC;QACF,OAAO;QACP,OAAO;QACP,SAAS;QACT,cAAc,EAAE,IAAI,GAAG,EAAE;KAC5B,CAAC;AACN,CAAC;AAED,SAAS,eAAe,CAAC,IAAc,EAAE,MAAc;IACnD,IAAI,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,MAAM,CAAC;IACrC,IAAI,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YACnB,IAAI,EAAE,qBAAqB,CAAS,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC;YACzD,MAAM,EAAE,qBAAqB,CAAS,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC;YAC7D,IAAI,EAAE,qBAAqB,CAAS,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC;SAC5D,CAAC,CAAC;QACH,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,UAAU,IAAI,CAAC,MAAc,EAAE,MAAsB,EAAE,IAAe;IACxE,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,UAAU,GAAG,IAAI,EAAE,UAAU,IAAI,YAAY,CAAC;IACpD,MAAM,UAAU,GAAG,IAAI,EAAE,UAAU,IAAI,YAAY,CAAC;IACpD,MAAM,YAAY,GAAG,IAAI,EAAE,YAAY,IAAI,cAAc,CAAC;IAC1D,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,IAAI,CAAC,CAAC;IACjC,MAAM,YAAY,GAAG,GAAG,MAAM,SAAS,CAAC;IACxC,MAAM,GAAG,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,UAAU,GAAG,GAAG,CAAC,GAAG,MAAM,OAAO,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;IAC1D,MAAM,UAAU,GAAG,GAAG,CAAC,GAAG,MAAM,OAAO,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;IAC1D,MAAM,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC;IAC9B,MAAM,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC;IAC9B,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;IACpF,2DAA2D;IAC3D,gEAAgE;IAChE,kEAAkE;IAClE,4DAA4D;IAC5D,MAAM,YAAY,GAAG,GAAG,CAAC,YAAY,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;IAEhE,IAAI,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAyB,CAAC;IAClE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACrB,0DAA0D;QAC1D,8DAA8D;QAC9D,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAqC,CAAC;QACzF,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,YAAY,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QAClF,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IACD,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC;IACjC,MAAM,SAAS,GACX,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;IACtF,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACb,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;SAAM,CAAC;QACJ,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACzC,CAAC","sourcesContent":["// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/macd.ts\n// (folded onto lib/ema-of-float64.ts)\n// (commit d2d1043c1b039f66d2f3674526d303d31cf2f1e0, © Invinite).\n// Re-licensed MIT for chartlang. The math is the reference, the code\n// style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape — NOT invinite's\n// IndicatorPlugin shape. The MACD primitive composes three EMA\n// sub-slots and a virtual \"MACD line\" Float64 buffer the signal EMA\n// reads from.\n\nimport type { MacdOpts, MacdResult, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\nimport { ema } from \"./ema.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\nconst DEFAULT_FAST = 12;\nconst DEFAULT_SLOW = 26;\nconst DEFAULT_SIGNAL = 9;\n\ntype MacdSlot = {\n readonly result: MacdResult;\n readonly macdBuf: Float64RingBuffer;\n readonly histBuf: Float64RingBuffer;\n /**\n * Reference to the signal-EMA sub-slot's output ring buffer.\n * Captured at first call so per-offset shifted signal views can be\n * constructed without re-entering `ema()` (which would double-\n * advance the sub-slot's compute on every bar).\n */\n readonly signalBuf: Float64RingBuffer;\n /**\n * Per-offset frozen `MacdResult` cache. `offset === 0` returns\n * `result` directly (identity-preserving). Each cached result\n * proxies the same three underlying outputs via shifted views.\n */\n readonly shiftedResults: Map<number, MacdResult>;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.macd called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(\n capacity: number,\n signalSeries: Series<number>,\n signalBuf: Float64RingBuffer,\n): MacdSlot {\n const macdBuf = new Float64RingBuffer(capacity);\n const histBuf = new Float64RingBuffer(capacity);\n return {\n result: Object.freeze({\n macd: makeSeriesView<number>(macdBuf),\n signal: signalSeries,\n hist: makeSeriesView<number>(histBuf),\n }),\n macdBuf,\n histBuf,\n signalBuf,\n shiftedResults: new Map(),\n };\n}\n\nfunction resultForOffset(slot: MacdSlot, offset: number): MacdResult {\n if (offset === 0) return slot.result;\n let cached = slot.shiftedResults.get(offset);\n if (cached === undefined) {\n cached = Object.freeze({\n macd: makeShiftedSeriesView<number>(slot.macdBuf, offset),\n signal: makeShiftedSeriesView<number>(slot.signalBuf, offset),\n hist: makeShiftedSeriesView<number>(slot.histBuf, offset),\n });\n slot.shiftedResults.set(offset, cached);\n }\n return cached;\n}\n\n/**\n * MACD — fast EMA minus slow EMA, with a signal-line EMA over the\n * MACD line and a histogram of their difference. Defaults\n * `{ fastLength: 12, slowLength: 26, signalLength: 9 }`. Composes\n * three EMA primitives at sub-slots `${slotId}/fast`, `${slotId}/slow`,\n * `${slotId}/signal`. The signal EMA reads from an internal MACD\n * Float64 ring; the user-facing `macd` Series wraps the same buffer.\n *\n * @formula fast = ema(source, fastLength) ;\n * slow = ema(source, slowLength) ;\n * macd = fast − slow ;\n * signal = ema(macd, signalLength) ;\n * hist = macd − signal\n * @warmup slowLength + signalLength − 1 (slow EMA seeds at slowLength − 1; signal EMA seeds signalLength − 1 bars after that)\n * @since 0.1\n * @stable\n *\n * `opts.offset` shifts all three outputs in lockstep —\n * `series.current` on each output returns the value `offset` bars ago.\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const m = ta.macd(\"slot\", bar.close);\n * // const h = m.hist.current;\n * // const lagged = ta.macd(\"slot2\", bar.close, { offset: 5 });\n */\nexport function macd(slotId: string, source: ScalarOrSeries, opts?: MacdOpts): MacdResult {\n const ctx = getCtx();\n const fastLength = opts?.fastLength ?? DEFAULT_FAST;\n const slowLength = opts?.slowLength ?? DEFAULT_SLOW;\n const signalLength = opts?.signalLength ?? DEFAULT_SIGNAL;\n const offset = opts?.offset ?? 0;\n const signalSlotId = `${slotId}/signal`;\n const src = readSourceValue(source);\n const fastSeries = ema(`${slotId}/fast`, src, fastLength);\n const slowSeries = ema(`${slotId}/slow`, src, slowLength);\n const fa = fastSeries.current;\n const sa = slowSeries.current;\n const macdValue = Number.isFinite(fa) && Number.isFinite(sa) ? fa - sa : Number.NaN;\n // Feed macdValue into the signal EMA. Always call with the\n // un-shifted (default) view — offset shifting for the composite\n // MacdResult happens via the local `resultForOffset`, which reads\n // directly off the signal-EMA's outBuffer (captured below).\n const signalSeries = ema(signalSlotId, macdValue, signalLength);\n\n let slot = ctx.stream.taSlots.get(slotId) as MacdSlot | undefined;\n if (slot === undefined) {\n // Capture the signal-EMA sub-slot's output ring buffer so\n // future shifted-view lookups don't need to re-enter `ema()`.\n const emaSlot = ctx.stream.taSlots.get(signalSlotId) as { outBuffer: Float64RingBuffer };\n slot = initSlot(ctx.stream.ohlcv.close.capacity, signalSeries, emaSlot.outBuffer);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const sig = signalSeries.current;\n const histValue =\n Number.isFinite(macdValue) && Number.isFinite(sig) ? macdValue - sig : Number.NaN;\n if (ctx.isTick) {\n slot.macdBuf.replaceHead(macdValue);\n slot.histBuf.replaceHead(histValue);\n } else {\n slot.macdBuf.append(macdValue);\n slot.histBuf.append(histValue);\n }\n return resultForOffset(slot, offset);\n}\n"]}
|
package/dist/ta/massIndex.d.ts
CHANGED
|
@@ -18,7 +18,7 @@ import type { MassIndexOpts, Series } from "@invinite-org/chartlang-core";
|
|
|
18
18
|
* @stable
|
|
19
19
|
*
|
|
20
20
|
* `opts.offset` shifts the returned series so `series.current` reads
|
|
21
|
-
* the value `offset` bars ago
|
|
21
|
+
* the value `offset` bars ago.
|
|
22
22
|
*
|
|
23
23
|
* @example
|
|
24
24
|
* // import { ta } from "@invinite-org/chartlang-core";
|
package/dist/ta/massIndex.js
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
//
|
|
4
4
|
// Ported from invinite/src/components/trading-chart/indicators/mass-index.ts
|
|
5
5
|
// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite).
|
|
6
|
-
// Re-licensed MIT for chartlang.
|
|
7
|
-
//
|
|
6
|
+
// Re-licensed MIT for chartlang. The math is the reference, the code
|
|
7
|
+
// style is not.
|
|
8
8
|
// Structural choices (callsite-id slot, Series<T> proxy, replaceHead
|
|
9
9
|
// mode) follow chartlang's primitive shape — NOT invinite's
|
|
10
10
|
// IndicatorPlugin shape. The chained EMA-of-range and EMA-of-EMA
|
|
@@ -116,7 +116,7 @@ function tickValue(slot, ratio) {
|
|
|
116
116
|
* @stable
|
|
117
117
|
*
|
|
118
118
|
* `opts.offset` shifts the returned series so `series.current` reads
|
|
119
|
-
* the value `offset` bars ago
|
|
119
|
+
* the value `offset` bars ago.
|
|
120
120
|
*
|
|
121
121
|
* @example
|
|
122
122
|
* // import { ta } from "@invinite-org/chartlang-core";
|
package/dist/ta/massIndex.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"massIndex.js","sourceRoot":"","sources":["../../src/ta/massIndex.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"massIndex.js","sourceRoot":"","sources":["../../src/ta/massIndex.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/mass-index.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite).\n// Re-licensed MIT for chartlang. The math is the reference, the code\n// style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape — NOT invinite's\n// IndicatorPlugin shape. The chained EMA-of-range and EMA-of-EMA\n// arms compose `ta.ema` via sub-slots `${slotId}/ema1` /\n// `${slotId}/ema2` so the EMA recurrence + warmup semantics flow in\n// by reference. The rolling-sum-of-ratio window is folded\n// incrementally per bar.\n\nimport type { MassIndexOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\nimport { ema } from \"./ema.js\";\n\nconst DEFAULT_EMA_LENGTH = 9;\nconst DEFAULT_SUM_LENGTH = 25;\n\ntype MassIndexSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly emaLength: number;\n readonly sumLength: number;\n readonly ratioWindow: Float64RingBuffer;\n sumRatio: number;\n /** Per-offset Series-view cache; see `sma.ts` for the convention. */\n readonly shiftedViews: Map<number, Series<number>>;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.massIndex called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(emaLength: number, sumLength: number, capacity: number): MassIndexSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n emaLength,\n sumLength,\n ratioWindow: new Float64RingBuffer(sumLength),\n sumRatio: 0,\n shiftedViews: new Map(),\n };\n}\n\nfunction viewForOffset(slot: MassIndexSlot, offset: number): Series<number> {\n if (offset === 0) return slot.series;\n let view = slot.shiftedViews.get(offset);\n if (view === undefined) {\n view = makeShiftedSeriesView<number>(slot.outBuffer, offset);\n slot.shiftedViews.set(offset, view);\n }\n return view;\n}\n\nfunction ratioValue(e1: number, e2: number): number {\n if (!Number.isFinite(e1) || !Number.isFinite(e2) || e2 === 0) return Number.NaN;\n return e1 / e2;\n}\n\nfunction recomputeSum(slot: MassIndexSlot): void {\n let sum = 0;\n let anyNaN = false;\n for (let i = 0; i < slot.ratioWindow.length; i += 1) {\n const v = slot.ratioWindow.at(i);\n if (!Number.isFinite(v)) {\n anyNaN = true;\n break;\n }\n sum += v;\n }\n slot.sumRatio = anyNaN ? Number.NaN : sum;\n}\n\nfunction closeValue(slot: MassIndexSlot, ratio: number): number {\n if (slot.ratioWindow.length < slot.ratioWindow.capacity) {\n slot.ratioWindow.append(ratio);\n if (Number.isFinite(ratio)) {\n slot.sumRatio += ratio;\n } else {\n slot.sumRatio = Number.NaN;\n }\n if (slot.ratioWindow.length < slot.ratioWindow.capacity) return Number.NaN;\n return slot.sumRatio;\n }\n const outgoing = slot.ratioWindow.at(slot.ratioWindow.length - 1);\n slot.ratioWindow.append(ratio);\n if (Number.isFinite(outgoing) && Number.isFinite(ratio) && Number.isFinite(slot.sumRatio)) {\n slot.sumRatio = slot.sumRatio - outgoing + ratio;\n } else {\n recomputeSum(slot);\n }\n return slot.sumRatio;\n}\n\nfunction tickValue(slot: MassIndexSlot, ratio: number): number {\n if (slot.ratioWindow.length < slot.ratioWindow.capacity) return Number.NaN;\n const oldestInHead = slot.ratioWindow.at(0);\n // NaN propagates through subtraction/addition — Infinity does too —\n // so a poisoned sum, NaN ratio, or NaN oldestInHead all surface as\n // a non-finite value at the head.\n return slot.sumRatio - oldestInHead + ratio;\n}\n\n/**\n * Mass Index — sub-pane volatility line tracking the range-EMA\n * \"bulge\" ratio to flag trend-reversal setups via the canonical\n * 27 threshold. Built on EMA-of-EMA-of-range via two chained\n * sub-slots (`${slotId}/ema1`, `${slotId}/ema2`) — a fix to EMA's\n * recurrence flows in for free. Reads `bar.high − bar.low` directly\n * (no source param). NaN when either chained EMA is NaN or when\n * the inner EMA of EMA is zero (degenerate ratio).\n *\n * @formula range[t] = high[t] − low[t] ;\n * ema1 = EMA(emaLength)(range) ;\n * ema2 = EMA(emaLength)(ema1) ;\n * ratio[t] = ema1[t] / ema2[t] ;\n * mi[t] = sum(ratio[t − sumLength + 1..= t])\n * @warmup emaLength + emaLength + sumLength − 3\n * @since 0.2\n * @stable\n *\n * `opts.offset` shifts the returned series so `series.current` reads\n * the value `offset` bars ago.\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const mi = ta.massIndex();\n * // plot(mi);\n */\nexport function massIndex(slotId: string, opts?: MassIndexOpts): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as MassIndexSlot | undefined;\n if (slot === undefined) {\n const emaLength = opts?.emaLength ?? DEFAULT_EMA_LENGTH;\n const sumLength = opts?.sumLength ?? DEFAULT_SUM_LENGTH;\n slot = initSlot(emaLength, sumLength, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const range = ctx.stream.bar.high - ctx.stream.bar.low;\n const ema1Series = ema(`${slotId}/ema1`, range, slot.emaLength);\n const e1 = ema1Series.current;\n const ema2Series = ema(`${slotId}/ema2`, e1, slot.emaLength);\n const e2 = ema2Series.current;\n const ratio = ratioValue(e1, e2);\n if (ctx.isTick) {\n slot.outBuffer.replaceHead(tickValue(slot, ratio));\n } else {\n slot.outBuffer.append(closeValue(slot, ratio));\n }\n return viewForOffset(slot, opts?.offset ?? 0);\n}\n"]}
|
package/dist/ta/mcginley.js
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
//
|
|
4
4
|
// Ported from invinite/src/components/trading-chart/indicators/mcginley.ts
|
|
5
5
|
// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite).
|
|
6
|
-
// Re-licensed MIT for chartlang.
|
|
7
|
-
//
|
|
6
|
+
// Re-licensed MIT for chartlang. The math is the reference, the code
|
|
7
|
+
// style is not.
|
|
8
8
|
// Structural choices (callsite-id slot, Series<T> proxy, replaceHead
|
|
9
9
|
// mode) follow chartlang's primitive shape — NOT invinite's
|
|
10
10
|
// IndicatorPlugin shape.
|
package/dist/ta/mcginley.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcginley.js","sourceRoot":"","sources":["../../src/ta/mcginley.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAC/D,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,
|
|
1
|
+
{"version":3,"file":"mcginley.js","sourceRoot":"","sources":["../../src/ta/mcginley.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/mcginley.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite).\n// Re-licensed MIT for chartlang. The math is the reference, the code\n// style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape — NOT invinite's\n// IndicatorPlugin shape.\n\nimport type { McginleyOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\ntype McginleySlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n /** Tick-side recurrence anchor (current bar, may be intra-bar). */\n prevMc: number;\n /** Close-side recurrence anchor (prior closed bar). */\n prevClosedMc: number;\n /** Number of finite source values folded into the slot so far. */\n seedCount: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.mcginley called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): McginleySlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n prevMc: Number.NaN,\n prevClosedMc: Number.NaN,\n seedCount: 0,\n };\n}\n\n/**\n * Apply the McGinley Dynamic recurrence step given the prior MC\n * anchor. `prev === 0` is the well-defined zero-seed edge case:\n * `(src/0)^4 = +Infinity` → division by `+Infinity` → 0 → sticky-zero\n * fix-point. The task spec calls for NaN in that regime — concretely,\n * a `prev === 0` recurrence cannot escape the fix-point, so we emit\n * NaN to signal the degenerate state.\n */\nfunction step(src: number, prev: number, length: number): number {\n if (prev === 0) return Number.NaN;\n const ratio = src / prev;\n const denom = length * ratio * ratio * ratio * ratio;\n return prev + (src - prev) / denom;\n}\n\nfunction compute(slot: McginleySlot, src: number, isTick: boolean): number {\n if (!Number.isFinite(src)) {\n // Mid-stream NaN forward-fills the prior value (matches the\n // EMA / SMMA recurrence convention).\n return isTick ? slot.prevMc : slot.prevClosedMc;\n }\n // Warmup: emit NaN until `length` finite source values have been\n // seen (matches invinite's seed convention). At the warmup\n // boundary the recurrence is seeded with the source value itself.\n if (slot.seedCount < slot.length - 1) {\n if (isTick) return Number.NaN;\n slot.seedCount += 1;\n slot.prevClosedMc = Number.NaN;\n slot.prevMc = Number.NaN;\n return Number.NaN;\n }\n if (!Number.isFinite(slot.prevClosedMc)) {\n // Seed bar — `length`-th finite source value lands here.\n if (isTick) return src;\n slot.seedCount += 1;\n slot.prevClosedMc = src;\n slot.prevMc = src;\n return src;\n }\n const prev = slot.prevClosedMc;\n const next = step(src, prev, slot.length);\n if (!isTick) {\n slot.prevClosedMc = next;\n slot.prevMc = next;\n }\n return next;\n}\n\n/**\n * McGinley Dynamic — an adaptive moving average with an automatic\n * lag-compensation correction. The recurrence\n * `mc[t] = mc[t-1] + (src[t] − mc[t-1]) / (length · (src[t] / mc[t-1])⁴)`\n * scales the step size by the relative change between source and the\n * prior MA value, so the indicator tracks faster on strong moves and\n * smoother on quiet bars. NaN source forward-fills the prior value;\n * `prev === 0` is the well-defined zero-seed fix-point and emits NaN\n * (the recurrence cannot escape a zero anchor — matches the invinite\n * reference's NaN-correct degenerate handling).\n *\n * @formula seed at length-th finite source bar : mc = src ;\n * mc[t] = mc[t-1] + (src[t] − mc[t-1]) / (length · (src[t] / mc[t-1])^4)\n * @warmup length\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const m = ta.mcginley(bar.close, 14);\n * // plot(m);\n */\nexport function mcginley(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n _opts?: McginleyOpts,\n): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as McginleySlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const value = compute(slot, readSourceValue(source), ctx.isTick);\n if (ctx.isTick) slot.outBuffer.replaceHead(value);\n else slot.outBuffer.append(value);\n return slot.series;\n}\n"]}
|
package/dist/ta/median.js
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
//
|
|
4
4
|
// Ported from invinite/src/components/trading-chart/indicators/median.ts
|
|
5
5
|
// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite).
|
|
6
|
-
// Re-licensed MIT for chartlang.
|
|
7
|
-
//
|
|
6
|
+
// Re-licensed MIT for chartlang. The math is the reference, the code
|
|
7
|
+
// style is not.
|
|
8
8
|
// Structural choices (callsite-id slot, Series<T> proxy, replaceHead
|
|
9
9
|
// mode) follow chartlang's primitive shape — NOT invinite's
|
|
10
10
|
// IndicatorPlugin shape. Only the median-statistic line is ported;
|
package/dist/ta/median.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"median.js","sourceRoot":"","sources":["../../src/ta/median.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAC/D,EAAE;AACF,yEAAyE;AACzE,mEAAmE;AACnE,
|
|
1
|
+
{"version":3,"file":"median.js","sourceRoot":"","sources":["../../src/ta/median.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAC/D,EAAE;AACF,yEAAyE;AACzE,mEAAmE;AACnE,qEAAqE;AACrE,gBAAgB;AAChB,qEAAqE;AACrE,4DAA4D;AAC5D,mEAAmE;AACnE,qEAAqE;AACrE,oEAAoE;AACpE,gEAAgE;AAChE,iCAAiC;AAIjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAuB,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAuB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAoB5E,SAAS,MAAM;IACX,MAAM,GAAG,GAAG,sBAAsB,CAAC,OAAO,CAAC;IAC3C,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,MAAc,EAAE,QAAgB;IAC9C,MAAM,SAAS,GAAG,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAClD,OAAO;QACH,SAAS;QACT,MAAM,EAAE,cAAc,CAAS,SAAS,CAAC;QACzC,MAAM;QACN,MAAM,EAAE,IAAI,iBAAiB,CAAC,MAAM,CAAC;QACrC,YAAY,EAAE,IAAI,YAAY,CAAC,MAAM,CAAC;KACzC,CAAC;AACN,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,cAAc,CAAC,IAAgB,EAAE,YAAoB;IAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC;IAC9B,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACjC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACrD,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YACrB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACX,CAAC,IAAI,CAAC,CAAC;QACX,CAAC;IACL,CAAC;IACD,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC;IAC/B,iEAAiE;IACjE,8DAA8D;IAC9D,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAChC,IAAI,CAAC,IAAI,EAAE,CAAC;IACZ,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,UAAU,CAAC,IAAgB,EAAE,GAAW;IAC7C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACxB,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC;IACxD,OAAO,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,SAAS,CAAC,IAAgB,EAAE,GAAW;IAC5C,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC;IACxD,OAAO,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACrC,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,MAAM,CAClB,MAAc,EACd,MAAsB,EACtB,MAAc,EACd,KAAkB;IAElB,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,IAAI,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAA2B,CAAC;IACpE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACrB,IAAI,GAAG,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACzD,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IACD,MAAM,GAAG,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACpC,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACb,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IACrD,CAAC;SAAM,CAAC;QACJ,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAC;AACvB,CAAC","sourcesContent":["// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/median.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite).\n// Re-licensed MIT for chartlang. The math is the reference, the code\n// style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape — NOT invinite's\n// IndicatorPlugin shape. Only the median-statistic line is ported;\n// invinite's median plugin also bundles ±ATR bands + an EMA-smoothed\n// median line — those compositions are out of scope for the single-\n// output `ta.median` primitive (script authors compose them via\n// `ta.atr`, `ta.ema` as needed).\n\nimport type { MedianOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\ntype MedianSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n /**\n * Closed source values across the trailing `length` bars (capacity\n * `length`). `at(0)` is the head — most recent close — and\n * `at(length - 1)` is the oldest.\n */\n readonly window: Float64RingBuffer;\n /**\n * Reused scratch buffer for the per-bar sort. Capacity = `length`.\n * Only the first `k` slots (count of finite values in the window)\n * are populated + sorted per emission.\n */\n readonly sortedBuffer: Float64Array;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.median called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): MedianSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n window: new Float64RingBuffer(length),\n sortedBuffer: new Float64Array(length),\n };\n}\n\n/**\n * Compute the median of the window's finite values. Substitutes\n * `headOverride` for the head slot (age 0) when finite — used by\n * tick replay to evaluate the partial-bar tick without mutating\n * the closed window.\n *\n * Returns `NaN` when the window contains no finite values.\n */\nfunction medianOfWindow(slot: MedianSlot, headOverride: number): number {\n const buf = slot.sortedBuffer;\n let k = 0;\n const filled = slot.window.length;\n for (let i = 0; i < filled; i += 1) {\n const v = i === 0 ? headOverride : slot.window.at(i);\n if (Number.isFinite(v)) {\n buf[k] = v;\n k += 1;\n }\n }\n if (k === 0) return Number.NaN;\n // Sort only the populated prefix — `Float64Array.prototype.sort`\n // takes a comparator but here we slice a typed subarray view.\n const view = buf.subarray(0, k);\n view.sort();\n if (k % 2 === 1) return view[(k - 1) >> 1];\n return (view[(k >> 1) - 1] + view[k >> 1]) / 2;\n}\n\nfunction closeValue(slot: MedianSlot, src: number): number {\n slot.window.append(src);\n if (slot.window.length < slot.length) return Number.NaN;\n return medianOfWindow(slot, slot.window.at(0));\n}\n\nfunction tickValue(slot: MedianSlot, src: number): number {\n if (slot.window.length < slot.length) return Number.NaN;\n return medianOfWindow(slot, src);\n}\n\n/**\n * Rolling median — middle-value statistic across the trailing\n * `length` source values. NaN slots are dropped from the sort\n * (window length effectively shrinks); if every slot is NaN the\n * output is NaN. Robust to single-bar spikes the way an SMA isn't.\n * Tick-mode replays the head by substituting the tick value for\n * the age-0 slot before sorting — the closed window is unchanged.\n *\n * @formula out[t] = median(source[t − length + 1 .. t]) ;\n * odd length → middle value ; even length → mean of the\n * two middle values ; NaN slots dropped before sort\n * @warmup length − 1\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const m = ta.median(bar.close, 21);\n * // plot(m);\n */\nexport function median(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n _opts?: MedianOpts,\n): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as MedianSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const src = readSourceValue(source);\n if (ctx.isTick) {\n slot.outBuffer.replaceHead(tickValue(slot, src));\n } else {\n slot.outBuffer.append(closeValue(slot, src));\n }\n return slot.series;\n}\n"]}
|
package/dist/ta/mfi.d.ts
CHANGED
|
@@ -27,7 +27,7 @@ import type { MfiOpts, Series } from "@invinite-org/chartlang-core";
|
|
|
27
27
|
* @since 0.2
|
|
28
28
|
* @stable
|
|
29
29
|
*
|
|
30
|
-
* `opts.offset` shifts the returned series
|
|
30
|
+
* `opts.offset` shifts the returned series.
|
|
31
31
|
*
|
|
32
32
|
* @example
|
|
33
33
|
* // import { ta, plot } from "@invinite-org/chartlang-core";
|
package/dist/ta/mfi.js
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
//
|
|
4
4
|
// Ported from invinite/src/components/trading-chart/indicators/mfi.ts
|
|
5
5
|
// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite).
|
|
6
|
-
// Re-licensed MIT for chartlang.
|
|
7
|
-
//
|
|
6
|
+
// Re-licensed MIT for chartlang. The math is the reference, the code
|
|
7
|
+
// style is not.
|
|
8
8
|
// Structural choices (callsite-id slot, Series<T> proxy, replaceHead
|
|
9
9
|
// mode) follow chartlang's primitive shape — NOT invinite's
|
|
10
10
|
// IndicatorPlugin shape. The rolling-window pos / neg money-flow sums
|
|
@@ -98,7 +98,7 @@ function emitMfi(sumPos, sumNeg, ready) {
|
|
|
98
98
|
* @since 0.2
|
|
99
99
|
* @stable
|
|
100
100
|
*
|
|
101
|
-
* `opts.offset` shifts the returned series
|
|
101
|
+
* `opts.offset` shifts the returned series.
|
|
102
102
|
*
|
|
103
103
|
* @example
|
|
104
104
|
* // import { ta, plot } from "@invinite-org/chartlang-core";
|
package/dist/ta/mfi.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mfi.js","sourceRoot":"","sources":["../../src/ta/mfi.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mfi.js","sourceRoot":"","sources":["../../src/ta/mfi.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/mfi.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite).\n// Re-licensed MIT for chartlang. The math is the reference, the code\n// style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape — NOT invinite's\n// IndicatorPlugin shape. The rolling-window pos / neg money-flow sums\n// follow the `cmf.ts` / `ulcerIndex.ts` \"subtract head + add tick\"\n// tick-mode shape (no window mutation on tick).\n\nimport type { MfiOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\n\ntype MfiSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly shiftedViews: Map<number, Series<number>>;\n readonly length: number;\n /** Closed-bar positive money-flow contributions (capacity `length`). */\n readonly posMfWindow: Float64RingBuffer;\n /** Closed-bar negative money-flow contributions. */\n readonly negMfWindow: Float64RingBuffer;\n sumPosMf: number;\n sumNegMf: number;\n /** Most recent finite typical price (lookback target for the next bar). */\n prevTp: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.mfi called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): MfiSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n shiftedViews: new Map(),\n length,\n posMfWindow: new Float64RingBuffer(length),\n negMfWindow: new Float64RingBuffer(length),\n sumPosMf: 0,\n sumNegMf: 0,\n prevTp: Number.NaN,\n };\n}\n\nfunction viewForOffset(slot: MfiSlot, offset: number): Series<number> {\n if (offset === 0) return slot.series;\n let view = slot.shiftedViews.get(offset);\n if (view === undefined) {\n view = makeShiftedSeriesView<number>(slot.outBuffer, offset);\n slot.shiftedViews.set(offset, view);\n }\n return view;\n}\n\n/**\n * Per-bar typical-price contributions to the (posMF, negMF) split,\n * given the prior typical price. NaN OHLC / volume → (0, 0). Equal\n * `tp === prevTp` or first bar (`prevTp` NaN) → (0, 0) per Pine\n * convention.\n */\nfunction bucketMf(tp: number, prevTp: number, volume: number): { posMf: number; negMf: number } {\n if (!Number.isFinite(tp) || !Number.isFinite(volume)) {\n return { posMf: 0, negMf: 0 };\n }\n if (!Number.isFinite(prevTp) || tp === prevTp) {\n return { posMf: 0, negMf: 0 };\n }\n const mf = tp * volume;\n if (tp > prevTp) return { posMf: mf, negMf: 0 };\n return { posMf: 0, negMf: mf };\n}\n\nfunction emitMfi(sumPos: number, sumNeg: number, ready: boolean): number {\n if (!ready) return Number.NaN;\n const total = sumPos + sumNeg;\n if (total === 0) return Number.NaN;\n return (100 * sumPos) / total;\n}\n\n/**\n * Money Flow Index — volume-weighted RSI over a trailing window of\n * `length` typical-price comparisons. Per-bar typical price `tp = (H +\n * L + C) / 3`; per-bar money flow `mf = tp · volume` lands in the\n * positive bucket when `tp > prevTp`, in the negative bucket when\n * `tp < prevTp`, and is dropped on equality / first bar. The emit is\n * `100 · sumPos / (sumPos + sumNeg)` once `length` such comparisons\n * have accumulated; NaN before warmup and when `sumPos + sumNeg ===\n * 0` (no flow either way — invinite's zero-denominator guard).\n *\n * Range `[0, 100]` when defined: `sumPos === 0` → 0 (perfect\n * downflow); `sumNeg === 0` with `sumPos > 0` → 100 (perfect\n * upflow). NaN OHLC / volume contributes 0 to both buckets (matches\n * `cmf.ts:62-75`'s defensive shape).\n *\n * **Tick mode.** Substitutes the tick's (posMf, negMf) contribution\n * for the head slot's stored values without mutating the trailing-\n * window rings or advancing `prevTp` — mirrors `cmf.ts:125-138`.\n *\n * @formula tp = (high + low + close) / 3 ;\n * mf = tp · volume ;\n * pos = mf when tp > prevTp else 0 ;\n * neg = mf when tp < prevTp else 0 ;\n * mfi = 100 · Σ pos / (Σ pos + Σ neg) over the trailing `length` window\n * @warmup length + 1 (one bar to seed prevTp + `length` comparisons)\n * @since 0.2\n * @stable\n *\n * `opts.offset` shifts the returned series.\n *\n * @example\n * // import { ta, plot } from \"@invinite-org/chartlang-core\";\n * // const m = ta.mfi(14);\n * // plot(m);\n */\nexport function mfi(slotId: string, length: number, opts?: MfiOpts): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as MfiSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const offset = opts?.offset ?? 0;\n const { high, low, close, volume } = ctx.stream.bar;\n const tp = (high + low + close) / 3;\n const { posMf, negMf } = bucketMf(tp, slot.prevTp, volume);\n\n // The seed bar (prevTp NaN) contributes no real comparison — we\n // skip the window append so the trailing window only ever holds\n // `length` REAL (prevTp-defined) comparisons. First finite emit\n // lands at bar `length` (warmup `length + 1` per the JSDoc).\n const hasComparison = Number.isFinite(slot.prevTp);\n\n if (ctx.isTick) {\n const ready = slot.posMfWindow.length === slot.length;\n if (!ready || !hasComparison) {\n slot.outBuffer.replaceHead(Number.NaN);\n return viewForOffset(slot, offset);\n }\n const headPos = slot.posMfWindow.at(0);\n const headNeg = slot.negMfWindow.at(0);\n const hypPos = slot.sumPosMf - headPos + posMf;\n const hypNeg = slot.sumNegMf - headNeg + negMf;\n slot.outBuffer.replaceHead(emitMfi(hypPos, hypNeg, true));\n return viewForOffset(slot, offset);\n }\n\n if (hasComparison) {\n if (slot.posMfWindow.length === slot.length) {\n slot.sumPosMf -= slot.posMfWindow.at(slot.length - 1);\n slot.sumNegMf -= slot.negMfWindow.at(slot.length - 1);\n }\n slot.posMfWindow.append(posMf);\n slot.negMfWindow.append(negMf);\n slot.sumPosMf += posMf;\n slot.sumNegMf += negMf;\n }\n if (Number.isFinite(tp)) slot.prevTp = tp;\n slot.outBuffer.append(\n emitMfi(slot.sumPosMf, slot.sumNegMf, slot.posMfWindow.length === slot.length),\n );\n return viewForOffset(slot, offset);\n}\n"]}
|
package/dist/ta/momentum.js
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
//
|
|
4
4
|
// Ported from invinite/src/components/trading-chart/indicators/momentum.ts
|
|
5
5
|
// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite).
|
|
6
|
-
// Re-licensed MIT for chartlang.
|
|
7
|
-
//
|
|
6
|
+
// Re-licensed MIT for chartlang. The math is the reference, the code
|
|
7
|
+
// style is not.
|
|
8
8
|
import { ACTIVE_RUNTIME_CONTEXT } from "../runtimeContext.js";
|
|
9
9
|
import { change } from "./change.js";
|
|
10
10
|
function getCtx() {
|
package/dist/ta/momentum.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"momentum.js","sourceRoot":"","sources":["../../src/ta/momentum.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAC/D,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,
|
|
1
|
+
{"version":3,"file":"momentum.js","sourceRoot":"","sources":["../../src/ta/momentum.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAC/D,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,qEAAqE;AACrE,gBAAgB;AAIhB,OAAO,EAAE,sBAAsB,EAAuB,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAOrC,SAAS,MAAM;IACX,MAAM,GAAG,GAAG,sBAAsB,CAAC,OAAO,CAAC;IAC3C,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,QAAQ,CACpB,MAAc,EACd,MAAsB,EACtB,MAAc,EACd,KAAoB;IAEpB,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,IAAI,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAA6B,CAAC;IACtE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACrB,IAAI,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QACxB,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,MAAM,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3D,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI;QAAE,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;IAC5C,OAAO,IAAI,CAAC,MAAM,CAAC;AACvB,CAAC","sourcesContent":["// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/momentum.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite).\n// Re-licensed MIT for chartlang. The math is the reference, the code\n// style is not.\n\nimport type { MomentumOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { change } from \"./change.js\";\nimport type { ScalarOrSeries } from \"./lib/sourceValue.js\";\n\ntype MomentumSlot = {\n series: Series<number> | null;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.momentum called outside an active script step\");\n }\n return ctx;\n}\n\n/**\n * Momentum (Pine `mom`) — first-difference `source[0] − source[length]`\n * with a required `length`. Composes {@link change} via a sub-slot so\n * the math kernel lives in one place; the returned `Series<number>` is\n * the sub-slot's series view directly (parent slot just caches its\n * identity for `===`-stable reads). Warmup is `length` bars.\n *\n * @formula out[t] = source[t] − source[t − length]\n * @warmup length\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const m = ta.momentum(\"slot\", bar.close, 10);\n * // const head = m.current;\n */\nexport function momentum(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n _opts?: MomentumOpts,\n): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as MomentumSlot | undefined;\n if (slot === undefined) {\n slot = { series: null };\n ctx.stream.taSlots.set(slotId, slot);\n }\n const sub = change(`${slotId}/change`, source, { length });\n if (slot.series === null) slot.series = sub;\n return slot.series;\n}\n"]}
|
package/dist/ta/netVolume.d.ts
CHANGED
|
@@ -20,7 +20,7 @@ import type { NetVolumeOpts, Series } from "@invinite-org/chartlang-core";
|
|
|
20
20
|
* @since 0.2
|
|
21
21
|
* @stable
|
|
22
22
|
*
|
|
23
|
-
* `opts.offset` shifts the returned series
|
|
23
|
+
* `opts.offset` shifts the returned series.
|
|
24
24
|
*
|
|
25
25
|
* @example
|
|
26
26
|
* // import { ta, plot } from "@invinite-org/chartlang-core";
|
package/dist/ta/netVolume.js
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
//
|
|
4
4
|
// Ported from invinite/src/components/trading-chart/indicators/net-volume.ts
|
|
5
5
|
// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite).
|
|
6
|
-
// Re-licensed MIT for chartlang.
|
|
7
|
-
//
|
|
6
|
+
// Re-licensed MIT for chartlang. The math is the reference, the code
|
|
7
|
+
// style is not.
|
|
8
8
|
// Structural choices (callsite-id slot, Series<T> proxy, replaceHead
|
|
9
9
|
// mode) follow chartlang's primitive shape — NOT invinite's
|
|
10
10
|
// IndicatorPlugin shape. The math is identical to `ta.obv`; both
|
|
@@ -86,7 +86,7 @@ function fold(inCum, inPrevClose, close, volume) {
|
|
|
86
86
|
* @since 0.2
|
|
87
87
|
* @stable
|
|
88
88
|
*
|
|
89
|
-
* `opts.offset` shifts the returned series
|
|
89
|
+
* `opts.offset` shifts the returned series.
|
|
90
90
|
*
|
|
91
91
|
* @example
|
|
92
92
|
* // import { ta, plot } from "@invinite-org/chartlang-core";
|