@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":"chandeKrollStop.js","sourceRoot":"","sources":["../../src/ta/chandeKrollStop.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chandeKrollStop.js","sourceRoot":"","sources":["../../src/ta/chandeKrollStop.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/chande-kroll-stop.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. ChandeKrollStop composes Phase-1 `ta.atr`\n// plus Task-5 `ta.highest` / `ta.lowest` at sub-slots\n// `${slotId}/atr` / `${slotId}/highHigh` / `${slotId}/lowLow` for the\n// first pass, then walks a self-owned `Float64RingBuffer` window of\n// size `smoothingLength` for the second-pass max/min. The opts\n// naming (`length` / `multiplier` / `smoothingLength`) matches\n// Chande Kroll's 1995 paper — `length` is the ATR period AND the\n// first-pass rolling extreme window, `smoothingLength` is the\n// second-pass extreme window.\n\nimport type { ChandeKrollStopOpts, ChandeKrollStopResult } 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 { atr } from \"./atr.js\";\nimport { highest } from \"./highest.js\";\nimport { lowest } from \"./lowest.js\";\n\nconst DEFAULT_LENGTH = 10;\nconst DEFAULT_MULTIPLIER = 1;\nconst DEFAULT_SMOOTHING = 9;\n\ntype ChandeKrollStopSlot = {\n readonly outputs: ChandeKrollStopResult;\n readonly longBuffer: Float64RingBuffer;\n readonly shortBuffer: Float64RingBuffer;\n readonly length: number;\n readonly multiplier: number;\n readonly smoothingLength: number;\n /**\n * First-pass long/high stops across the trailing `smoothingLength`\n * CLOSED bars. `at(0)` is the most recent close.\n */\n readonly firstHighWindow: Float64RingBuffer;\n /** First-pass short/low stops across the trailing window. */\n readonly firstLowWindow: Float64RingBuffer;\n /** Number of CLOSED bars folded into the slot so far. */\n barCount: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.chandeKrollStop called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(\n capacity: number,\n length: number,\n multiplier: number,\n smoothingLength: number,\n): ChandeKrollStopSlot {\n const longBuffer = new Float64RingBuffer(capacity);\n const shortBuffer = new Float64RingBuffer(capacity);\n return {\n outputs: Object.freeze({\n long: makeSeriesView<number>(longBuffer),\n short: makeSeriesView<number>(shortBuffer),\n }),\n longBuffer,\n shortBuffer,\n length,\n multiplier,\n smoothingLength,\n firstHighWindow: new Float64RingBuffer(smoothingLength),\n firstLowWindow: new Float64RingBuffer(smoothingLength),\n barCount: 0,\n };\n}\n\nfunction firstPass(\n hi: number,\n lo: number,\n atrValue: number,\n multiplier: number,\n): { firstHigh: number; firstLow: number } {\n if (!Number.isFinite(hi) || !Number.isFinite(lo) || !Number.isFinite(atrValue)) {\n return { firstHigh: Number.NaN, firstLow: Number.NaN };\n }\n return {\n firstHigh: hi - multiplier * atrValue,\n firstLow: lo + multiplier * atrValue,\n };\n}\n\n/**\n * Scan `window.at(start)..at(end)` (inclusive of start, exclusive of\n * end+1) for the max of finite entries. Returns `NaN` if no finite\n * entry exists.\n */\nfunction maxOver(\n window: Float64RingBuffer,\n headOverride: number,\n startExclusiveOfHead: boolean,\n smoothingLength: number,\n): number {\n let best = Number.NEGATIVE_INFINITY;\n if (Number.isFinite(headOverride)) best = headOverride;\n const startAge = startExclusiveOfHead ? 1 : 0;\n const filled = window.length;\n for (let k = startAge; k < filled && k < smoothingLength; k += 1) {\n const v = window.at(k);\n if (Number.isFinite(v) && v > best) best = v;\n }\n return best === Number.NEGATIVE_INFINITY ? Number.NaN : best;\n}\n\nfunction minOver(\n window: Float64RingBuffer,\n headOverride: number,\n startExclusiveOfHead: boolean,\n smoothingLength: number,\n): number {\n let best = Number.POSITIVE_INFINITY;\n if (Number.isFinite(headOverride)) best = headOverride;\n const startAge = startExclusiveOfHead ? 1 : 0;\n const filled = window.length;\n for (let k = startAge; k < filled && k < smoothingLength; k += 1) {\n const v = window.at(k);\n if (Number.isFinite(v) && v < best) best = v;\n }\n return best === Number.POSITIVE_INFINITY ? Number.NaN : best;\n}\n\n/**\n * Chande Kroll Stop — two-pass ATR-offset trailing stops. The first\n * pass anchors each bar to its `length`-bar high/low extreme minus /\n * plus `multiplier · ATR`; the second pass smooths the first-pass\n * stops by taking the rolling max / min over a `smoothingLength`-bar\n * window. `long` is the long-trade trailing stop ceiling (max of\n * `firstHigh`), `short` is the short-trade trailing stop floor (min\n * of `firstLow`). Composes `ta.atr` plus `ta.highest`\n * and `ta.lowest` at sub-slots.\n *\n * Source field is hard-coded to `bar.high` / `bar.low` (matches Pine\n * `ta.cks` and the canonical TradingView CKS). Invinite's `source`\n * parameter is omitted; a `source` opt could land in a follow-up.\n *\n * NaN ATR or NaN extreme → NaN at both first-pass and second-pass\n * outputs for that bar (the rolling window retains the NaN slot;\n * downstream max/min skip NaN entries via `Number.isFinite`).\n *\n * @formula firstHigh = highest(bar.high, length) − multiplier · atr(length) ;\n * firstLow = lowest(bar.low, length) + multiplier · atr(length) ;\n * long = max(firstHigh over smoothingLength bars) ;\n * short = min(firstLow over smoothingLength bars)\n * @warmup length + smoothingLength − 1\n * @anchors length, multiplier\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const c = ta.chandeKrollStop({ length: 10, multiplier: 1, smoothingLength: 9 });\n * // plot(c.long);\n * // plot(c.short);\n */\nexport function chandeKrollStop(slotId: string, opts?: ChandeKrollStopOpts): ChandeKrollStopResult {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as ChandeKrollStopSlot | undefined;\n if (slot === undefined) {\n const length = opts?.length ?? DEFAULT_LENGTH;\n const multiplier = opts?.multiplier ?? DEFAULT_MULTIPLIER;\n const smoothingLength = opts?.smoothingLength ?? DEFAULT_SMOOTHING;\n slot = initSlot(ctx.stream.ohlcv.close.capacity, length, multiplier, smoothingLength);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const bar = ctx.stream.bar;\n // Compose: ta.atr + ta.highest + ta.lowest at sub-slots. Each\n // sub-slot owns its own tick replay; the head reads below are\n // correct in both close and tick contexts.\n const atrSeries = atr(`${slotId}/atr`, slot.length);\n const highSeries = highest(`${slotId}/highHigh`, bar.high, slot.length);\n const lowSeries = lowest(`${slotId}/lowLow`, bar.low, slot.length);\n\n const { firstHigh, firstLow } = firstPass(\n highSeries.current,\n lowSeries.current,\n atrSeries.current,\n slot.multiplier,\n );\n\n if (ctx.isTick) {\n // Second pass: scan the CLOSED window (excluding head) plus the\n // tick's first-pass value as the candidate for age 0.\n const long = maxOver(slot.firstHighWindow, firstHigh, true, slot.smoothingLength);\n const short = minOver(slot.firstLowWindow, firstLow, true, slot.smoothingLength);\n // Output is NaN unless both first-pass passes are warm AND the\n // smoothing window has enough closed entries (>= smoothingLength).\n // The closed window has `min(barCount, smoothingLength)` entries;\n // the tick adds one more candidate. So second-pass warm requires\n // `barCount >= smoothingLength`.\n const warm = slot.barCount >= slot.smoothingLength;\n slot.longBuffer.replaceHead(warm ? long : Number.NaN);\n slot.shortBuffer.replaceHead(warm ? short : Number.NaN);\n } else {\n slot.firstHighWindow.append(firstHigh);\n slot.firstLowWindow.append(firstLow);\n slot.barCount += 1;\n // Second-pass warmup needs `smoothingLength` first-pass bars\n // (matches invinite's `secondValidIdx = firstValidIdx + pLength\n // - 1`, which is `length - 1 + smoothingLength - 1` — i.e.\n // `barCount >= length + smoothingLength - 1`). With invinite's\n // `firstValidIdx = max(length - 1, length - 1)`, the second\n // valid index is `length + smoothingLength - 2` (0-based), so\n // bar `length + smoothingLength - 1` (1-based barCount) is the\n // first warm bar.\n const warm = slot.barCount >= slot.length + slot.smoothingLength - 1;\n if (!warm) {\n slot.longBuffer.append(Number.NaN);\n slot.shortBuffer.append(Number.NaN);\n } else {\n // Second pass over the full window (head included).\n const long = maxOver(slot.firstHighWindow, Number.NaN, false, slot.smoothingLength);\n const short = minOver(slot.firstLowWindow, Number.NaN, false, slot.smoothingLength);\n slot.longBuffer.append(long);\n slot.shortBuffer.append(short);\n }\n }\n return slot.outputs;\n}\n"]}
|
package/dist/ta/chandelier.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ import type { ChandelierOpts, ChandelierResult } from "@invinite-org/chartlang-c
|
|
|
5
5
|
* long trades (highest of `bar.high` over the window minus
|
|
6
6
|
* `multiplier · ATR`); `short` is the symmetric stop for short
|
|
7
7
|
* trades (lowest of `bar.low` plus `multiplier · ATR`). Composes
|
|
8
|
-
*
|
|
8
|
+
* `ta.atr` plus `ta.highest` / `ta.lowest` at sub-slots
|
|
9
9
|
* `${slotId}/atr` / `${slotId}/highHigh` / `${slotId}/lowLow`. Returns
|
|
10
10
|
* a cached `{ long, short }` record (same identity every bar).
|
|
11
11
|
*
|
package/dist/ta/chandelier.js
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
//
|
|
4
4
|
// Ported from invinite/src/components/trading-chart/indicators/chandelier.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. Chandelier composes Phase-1 `ta.atr` plus
|
|
@@ -57,7 +57,7 @@ function compute(hi, lo, atrValue, multiplier) {
|
|
|
57
57
|
* long trades (highest of `bar.high` over the window minus
|
|
58
58
|
* `multiplier · ATR`); `short` is the symmetric stop for short
|
|
59
59
|
* trades (lowest of `bar.low` plus `multiplier · ATR`). Composes
|
|
60
|
-
*
|
|
60
|
+
* `ta.atr` plus `ta.highest` / `ta.lowest` at sub-slots
|
|
61
61
|
* `${slotId}/atr` / `${slotId}/highHigh` / `${slotId}/lowLow`. Returns
|
|
62
62
|
* a cached `{ long, short }` record (same identity every bar).
|
|
63
63
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chandelier.js","sourceRoot":"","sources":["../../src/ta/chandelier.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAC/D,EAAE;AACF,6EAA6E;AAC7E,mEAAmE;AACnE,
|
|
1
|
+
{"version":3,"file":"chandelier.js","sourceRoot":"","sources":["../../src/ta/chandelier.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/chandelier.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. Chandelier composes Phase-1 `ta.atr` plus\n// Task-5 `ta.highest` / `ta.lowest` at sub-slots `${slotId}/atr`,\n// `${slotId}/highHigh`, `${slotId}/lowLow` (sources from `bar.high` /\n// `bar.low` per Pine `ta.chandelier_exit`; invinite's `source` field\n// — defaults to close — is deliberately dropped in favour of the\n// Pine-canonical bar-high/low reading).\n\nimport type { ChandelierOpts, ChandelierResult } 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 { atr } from \"./atr.js\";\nimport { highest } from \"./highest.js\";\nimport { lowest } from \"./lowest.js\";\n\nconst DEFAULT_LENGTH = 22;\nconst DEFAULT_MULTIPLIER = 3;\n\ntype ChandelierSlot = {\n readonly outputs: ChandelierResult;\n readonly longBuffer: Float64RingBuffer;\n readonly shortBuffer: Float64RingBuffer;\n readonly length: number;\n readonly multiplier: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.chandelier called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(capacity: number, length: number, multiplier: number): ChandelierSlot {\n const longBuffer = new Float64RingBuffer(capacity);\n const shortBuffer = new Float64RingBuffer(capacity);\n return {\n outputs: Object.freeze({\n long: makeSeriesView<number>(longBuffer),\n short: makeSeriesView<number>(shortBuffer),\n }),\n longBuffer,\n shortBuffer,\n length,\n multiplier,\n };\n}\n\nfunction compute(\n hi: number,\n lo: number,\n atrValue: number,\n multiplier: number,\n): { long: number; short: number } {\n if (!Number.isFinite(hi) || !Number.isFinite(lo) || !Number.isFinite(atrValue)) {\n return { long: Number.NaN, short: Number.NaN };\n }\n return {\n long: hi - multiplier * atrValue,\n short: lo + multiplier * atrValue,\n };\n}\n\n/**\n * Chandelier Exit — two ATR-offset trailing stops anchored to the\n * trailing `length`-bar extremes. `long` is the trailing stop for\n * long trades (highest of `bar.high` over the window minus\n * `multiplier · ATR`); `short` is the symmetric stop for short\n * trades (lowest of `bar.low` plus `multiplier · ATR`). Composes\n * `ta.atr` plus `ta.highest` / `ta.lowest` at sub-slots\n * `${slotId}/atr` / `${slotId}/highHigh` / `${slotId}/lowLow`. Returns\n * a cached `{ long, short }` record (same identity every bar).\n *\n * Source field is hard-coded to `bar.high` (for the upper window)\n * and `bar.low` (for the lower window) — matches Pine\n * `ta.chandelier_exit` and the conventional TradingView reading.\n * Invinite's `source` parameter (default `close`) is deliberately\n * omitted; a `source` opt could land in a follow-up.\n *\n * NaN in ATR or the rolling extreme → NaN at both outputs. The\n * composed sub-slots each handle their own tick replay; tick-side\n * just reads `series.current` from each sub-slot and recomputes.\n *\n * @formula long = highest(bar.high, length) − multiplier · atr(length) ;\n * short = lowest(bar.low, length) + multiplier · atr(length)\n * @warmup length\n * @anchors length, multiplier\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const c = ta.chandelier({ length: 22, multiplier: 3 });\n * // plot(c.long);\n * // plot(c.short);\n */\nexport function chandelier(slotId: string, opts?: ChandelierOpts): ChandelierResult {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as ChandelierSlot | undefined;\n if (slot === undefined) {\n const length = opts?.length ?? DEFAULT_LENGTH;\n const multiplier = opts?.multiplier ?? DEFAULT_MULTIPLIER;\n slot = initSlot(ctx.stream.ohlcv.close.capacity, length, multiplier);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const bar = ctx.stream.bar;\n // Compose: ta.atr + ta.highest + ta.lowest at sub-slots. The\n // composed calls route through the registry and respect ctx.isTick\n // automatically (each sub-slot owns its own tick-replay).\n const atrSeries = atr(`${slotId}/atr`, slot.length);\n const highSeries = highest(`${slotId}/highHigh`, bar.high, slot.length);\n const lowSeries = lowest(`${slotId}/lowLow`, bar.low, slot.length);\n\n const result = compute(\n highSeries.current,\n lowSeries.current,\n atrSeries.current,\n slot.multiplier,\n );\n if (ctx.isTick) {\n slot.longBuffer.replaceHead(result.long);\n slot.shortBuffer.replaceHead(result.short);\n } else {\n slot.longBuffer.append(result.long);\n slot.shortBuffer.append(result.short);\n }\n return slot.outputs;\n}\n"]}
|
package/dist/ta/change.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.change`.
|
|
4
|
+
// No invinite source — semantics per Pine `ta.change`.
|
|
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/change.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"change.js","sourceRoot":"","sources":["../../src/ta/change.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAC/D,EAAE;AACF,
|
|
1
|
+
{"version":3,"file":"change.js","sourceRoot":"","sources":["../../src/ta/change.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.change`.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape.\n\nimport type { ChangeOpts, 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 ChangeSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n /**\n * Closed-bar source values across the last `length + 1` bars. The\n * head (`at(0)`) is the most recent close; `at(length)` is the\n * lookback target the difference is taken against.\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.change called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): ChangeSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n sourceWindow: new Float64RingBuffer(length + 1),\n };\n}\n\nfunction closeValue(slot: ChangeSlot, src: number): number {\n slot.sourceWindow.append(src);\n if (slot.sourceWindow.length <= slot.length) return Number.NaN;\n const head = slot.sourceWindow.at(0);\n const old = slot.sourceWindow.at(slot.length);\n if (!Number.isFinite(head) || !Number.isFinite(old)) return Number.NaN;\n return head - old;\n}\n\nfunction tickValue(slot: ChangeSlot, src: number): number {\n // Tick replaces the head bar's source. Warmup count is based on\n // CLOSED bars in the window, not tick activity — so an unwarmed\n // slot returns NaN.\n if (slot.sourceWindow.length <= slot.length) return Number.NaN;\n // The bar `length` ago relative to the tick is the same bar that\n // was `length` ago relative to the most recent close (the lookback\n // history doesn't change mid-bar).\n const old = slot.sourceWindow.at(slot.length);\n if (!Number.isFinite(src) || !Number.isFinite(old)) return Number.NaN;\n return src - old;\n}\n\n/**\n * First-difference of the source: `source[0] − source[length]`.\n * `opts.length` defaults to `1` (one-bar delta). NaN in either operand\n * propagates to a NaN output. 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-core\";\n * // const delta = ta.change(bar.close, { length: 5 });\n * // plot(delta);\n */\nexport function change(slotId: string, source: ScalarOrSeries, opts?: ChangeOpts): Series<number> {\n const ctx = getCtx();\n const length = opts?.length ?? 1;\n let slot = ctx.stream.taSlots.get(slotId) as ChangeSlot | 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/chop.js
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
//
|
|
4
4
|
// Ported from invinite/src/components/trading-chart/indicators/chop.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. Chop composes `ta.highest` / `ta.lowest`
|
package/dist/ta/chop.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chop.js","sourceRoot":"","sources":["../../src/ta/chop.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chop.js","sourceRoot":"","sources":["../../src/ta/chop.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/chop.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. Chop composes `ta.highest` / `ta.lowest`\n// via sub-slots `${slotId}/highest` / `${slotId}/lowest` over\n// `bar.high` / `bar.low` for the range denominator; the TR-sum\n// numerator is maintained as a sliding-window sum inside the slot\n// (same internal TR formula as `ta.atr`, but raw — Pine `ta.chop`\n// uses raw TR sums rather than the Wilder-smoothed ATR).\n\nimport type { ChopOpts, 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 { highest } from \"./highest.js\";\nimport { lowest } from \"./lowest.js\";\n\ntype ChopSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n readonly logN: number;\n /** Sliding window of TR values (capacity `length`). */\n readonly trWindow: Float64RingBuffer;\n sumTr: number;\n /** Close of the prior closed bar (TR uses `prev.close`). */\n prevClose: number;\n /** Close of the bar before the current bar (used by tick-mode TR). */\n prevPrevClose: number;\n /** TR sum as of the prior closed bar — used by tick-mode replay. */\n prevClosedSumTr: number;\n /** TR value the head close folded in — needed to roll it back on tick. */\n prevClosedHeadTr: number;\n /** TR value evicted by the head close — needed to restore on tick. */\n prevClosedEvictedTr: number;\n /** Number of closed bars folded into the slot. */\n barCount: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.chop called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): ChopSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n logN: Math.log10(length),\n trWindow: new Float64RingBuffer(length),\n sumTr: 0,\n prevClose: Number.NaN,\n prevPrevClose: Number.NaN,\n prevClosedSumTr: 0,\n prevClosedHeadTr: Number.NaN,\n prevClosedEvictedTr: Number.NaN,\n barCount: 0,\n };\n}\n\nfunction trueRange(high: number, low: number, prevClose: number): number {\n if (!Number.isFinite(prevClose)) return high - low;\n return Math.max(high - low, Math.abs(high - prevClose), Math.abs(low - prevClose));\n}\n\nfunction chopValue(slot: ChopSlot, upper: number, lower: number): number {\n if (slot.barCount < slot.length) return Number.NaN;\n // Defensive: upper / lower come from highest / lowest sub-slots over\n // bar.high / bar.low, both finite once the highest / lowest slots\n // are warmed. Same goes for sumTr (kept positive once trSeries seeds).\n /* c8 ignore next */\n if (!Number.isFinite(upper) || !Number.isFinite(lower)) return Number.NaN;\n const range = upper - lower;\n /* c8 ignore next */\n if (range <= 0) return Number.NaN;\n /* c8 ignore next */\n if (!Number.isFinite(slot.sumTr) || slot.sumTr <= 0) return Number.NaN;\n const raw = (100 * Math.log10(slot.sumTr / range)) / slot.logN;\n // Clamp to [0, 100]. The raw value can exceed 100 on bars with\n // large gaps (where TR > range) — Pine + TradingView present chop\n // as a bounded oscillator, so we clamp at the output to match.\n /* c8 ignore next 2 */\n if (raw < 0) return 0;\n if (raw > 100) return 100;\n return raw;\n}\n\nfunction closeValue(\n slot: ChopSlot,\n high: number,\n low: number,\n close: number,\n upper: number,\n lower: number,\n): number {\n if (!Number.isFinite(high) || !Number.isFinite(low) || !Number.isFinite(close)) {\n // Skip the bar (don't advance TR window state); emit NaN.\n return Number.NaN;\n }\n const tr = trueRange(high, low, slot.prevClose);\n // Capture pre-append state for tick-mode rollback.\n slot.prevClosedSumTr = slot.sumTr;\n const evicted =\n slot.trWindow.length === slot.length ? slot.trWindow.at(slot.length - 1) : Number.NaN;\n slot.prevClosedEvictedTr = evicted;\n if (Number.isFinite(evicted)) slot.sumTr -= evicted;\n slot.trWindow.append(tr);\n slot.sumTr += tr;\n slot.prevClosedHeadTr = tr;\n slot.prevPrevClose = slot.prevClose;\n slot.prevClose = close;\n slot.barCount += 1;\n return chopValue(slot, upper, lower);\n}\n\nfunction tickValue(\n slot: ChopSlot,\n high: number,\n low: number,\n close: number,\n upper: number,\n lower: number,\n): number {\n if (!Number.isFinite(high) || !Number.isFinite(low) || !Number.isFinite(close)) {\n return Number.NaN;\n }\n // Defensive: tickValue runs after at least one close, so barCount is ≥ 1.\n /* c8 ignore next */\n if (slot.barCount === 0) return Number.NaN;\n // Recompute the head TR using the BAR-BEFORE-CURRENT's close\n // (mirrors atr.ts:103-117 — the close-side advance moved\n // `prevPrevClose` into the slot before we replaced `prevClose`).\n const tr = trueRange(high, low, slot.prevPrevClose);\n // Synthesise the post-rollback sum and re-fold the tick's TR.\n let synthSum = slot.prevClosedSumTr;\n if (Number.isFinite(slot.prevClosedEvictedTr)) synthSum -= slot.prevClosedEvictedTr;\n synthSum += tr;\n // Temporarily flip the slot's sumTr so chopValue sees the synth.\n const savedSum = slot.sumTr;\n slot.sumTr = synthSum;\n const value = chopValue(slot, upper, lower);\n slot.sumTr = savedSum;\n return value;\n}\n\n/**\n * Choppiness Index — sub-pane volatility regime indicator. High\n * values (`> 61.8`) signal a sideways / choppy market; low values\n * (`< 38.2`) signal a strong trend. Output range `[0, 100]`. Reads\n * `bar.high` / `bar.low` / `bar.close` directly (no source param,\n * mirrors Pine). Composes the registered `ta.highest` / `ta.lowest`\n * primitives via sub-slots `${slotId}/highest` and `${slotId}/lowest`\n * for the range denominator; the TR-sum numerator is a sliding-window\n * sum inside the slot (same internal TR math as `ta.atr` but raw —\n * Pine `ta.chop` does NOT use the Wilder-smoothed ATR). NaN until\n * the trailing `length`-bar window is fully warmed AND the range is\n * positive.\n *\n * @formula TR[t] = max(high − low, |high − prevClose|, |low − prevClose|) ;\n * range = highest(high, length) − lowest(low, length) ;\n * sumTr = Σ TR over trailing length bars ;\n * chop = 100 · log10(sumTr / range) / log10(length)\n * @warmup length\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const c = ta.chop(14);\n * // plot(c);\n */\nexport function chop(slotId: string, length: number, _opts?: ChopOpts): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as ChopSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const bar = ctx.stream.bar;\n const upperSeries = highest(`${slotId}/highest`, bar.high, length);\n const lowerSeries = lowest(`${slotId}/lowest`, bar.low, length);\n const upper = upperSeries.current;\n const lower = lowerSeries.current;\n if (ctx.isTick) {\n slot.outBuffer.replaceHead(tickValue(slot, bar.high, bar.low, bar.close, upper, lower));\n } else {\n slot.outBuffer.append(closeValue(slot, bar.high, bar.low, bar.close, upper, lower));\n }\n return slot.series;\n}\n"]}
|
package/dist/ta/cmf.js
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
//
|
|
4
4
|
// Ported from invinite/src/components/trading-chart/indicators/cmf.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 sum follows the
|
package/dist/ta/cmf.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cmf.js","sourceRoot":"","sources":["../../src/ta/cmf.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAC/D,EAAE;AACF,sEAAsE;AACtE,mEAAmE;AACnE,
|
|
1
|
+
{"version":3,"file":"cmf.js","sourceRoot":"","sources":["../../src/ta/cmf.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/cmf.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 sum follows the\n// `ulcerIndex` \"subtract head + add tick\" pattern for tick-mode replay\n// (no window mutation on tick).\n\nimport type { CmfOpts, 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\";\n\ntype CmfSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n /**\n * Closed-bar money-flow volume values across the trailing\n * `length` bars (capacity `length`). `at(0)` is the head bar's\n * MFV; older slots index upward.\n */\n readonly mfvWindow: Float64RingBuffer;\n /** Closed-bar volume values across the same window. */\n readonly volWindow: Float64RingBuffer;\n sumMfv: number;\n sumVol: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.cmf called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): CmfSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n mfvWindow: new Float64RingBuffer(length),\n volWindow: new Float64RingBuffer(length),\n sumMfv: 0,\n sumVol: 0,\n };\n}\n\n/**\n * Per-bar money-flow volume — CLV × volume with the same zero-range\n * + NaN guards as `adl.ts` (defensive 0 contribution on either edge\n * case).\n */\nfunction mfvAt(close: number, high: number, low: number, volume: number): number {\n if (\n !Number.isFinite(close) ||\n !Number.isFinite(high) ||\n !Number.isFinite(low) ||\n !Number.isFinite(volume)\n ) {\n return 0;\n }\n const range = high - low;\n // Defensive: flat bar (high === low) — emit zero CLV contribution\n // rather than divide-by-zero. Real OHLC streams rarely hit this.\n /* c8 ignore next */\n if (range === 0) return 0;\n const clv = (close - low - (high - close)) / range;\n return clv * volume;\n}\n\n/** Safe-volume contribution to the rolling-window volume sum. */\nfunction safeVol(volume: number): number {\n return Number.isFinite(volume) ? volume : 0;\n}\n\nfunction emit(sumMfv: number, sumVol: number, ready: boolean): number {\n if (!ready || sumVol === 0) return Number.NaN;\n return sumMfv / sumVol;\n}\n\n/**\n * Chaikin Money Flow — trailing-window sum of money-flow volume\n * divided by trailing-window sum of volume. Bounded between -1 and\n * +1 mathematically. Zero-range bars (`high === low`) contribute 0\n * to the numerator (matches invinite's CLV guard); NaN OHLC / volume\n * bars contribute 0 to both numerator and denominator.\n *\n * **Tick mode.** Substitutes the tick's per-bar (mfv, volume)\n * contribution for the head slot's stored values without mutating the\n * trailing-window rings — mirrors the `ulcerIndex.ts` substitution\n * shape (\"hypSum = sum − head + tick\").\n *\n * @formula cmf[t] = Σ_{u ∈ window(t)} mfv[u] / Σ_{u ∈ window(t)} volume[u]\n * where mfv = ((C − L) − (H − C)) / (H − L) · volume\n * @warmup length − 1\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta, plot } from \"@invinite-org/chartlang-core\";\n * // const c = ta.cmf(20);\n * // plot(c);\n */\nexport function cmf(slotId: string, length: number, _opts?: CmfOpts): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as CmfSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const { close, high, low, volume } = ctx.stream.bar;\n const mfv = mfvAt(close, high, low, volume);\n const vol = safeVol(volume);\n\n if (ctx.isTick) {\n // Tick replay against the closed window: substitute the head\n // slot's contribution with the tick's, leaving the window\n // untouched. Pre-warmup ticks emit NaN.\n if (slot.mfvWindow.length < slot.length) {\n slot.outBuffer.replaceHead(Number.NaN);\n return slot.series;\n }\n const headMfv = slot.mfvWindow.at(0);\n const headVol = slot.volWindow.at(0);\n const hypMfv = slot.sumMfv - headMfv + mfv;\n const hypVol = slot.sumVol - headVol + vol;\n slot.outBuffer.replaceHead(emit(hypMfv, hypVol, true));\n return slot.series;\n }\n\n // Close-side: evict the oldest slot if the ring is full, then\n // append the new (mfv, vol) pair and refresh the running sums.\n if (slot.mfvWindow.length === slot.length) {\n slot.sumMfv -= slot.mfvWindow.at(slot.length - 1);\n slot.sumVol -= slot.volWindow.at(slot.length - 1);\n }\n slot.mfvWindow.append(mfv);\n slot.volWindow.append(vol);\n slot.sumMfv += mfv;\n slot.sumVol += vol;\n slot.outBuffer.append(emit(slot.sumMfv, slot.sumVol, slot.mfvWindow.length === slot.length));\n return slot.series;\n}\n"]}
|
package/dist/ta/cmo.js
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
//
|
|
4
4
|
// Ported from invinite/src/components/trading-chart/indicators/cmo.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 { Float64RingBuffer } from "../ringBuffer.js";
|
|
9
9
|
import { ACTIVE_RUNTIME_CONTEXT } from "../runtimeContext.js";
|
|
10
10
|
import { makeSeriesView } from "../seriesView.js";
|
package/dist/ta/cmo.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cmo.js","sourceRoot":"","sources":["../../src/ta/cmo.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cmo.js","sourceRoot":"","sources":["../../src/ta/cmo.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/cmo.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 { CmoOpts, 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 CmoSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n readonly gainWindow: Float64RingBuffer;\n readonly lossWindow: Float64RingBuffer;\n sumGain: number;\n sumLoss: number;\n prevSrc: number;\n /** Source as of the bar before the most recent close — used by tick replay. */\n prevClosedSrc: number;\n /** Most-recent close-side emit (the head bar's CMO). NaN if unwarmed. */\n cmo: number;\n /** Gain pushed onto the window during the most recent close. */\n closedHeadGain: number;\n /** Loss pushed onto the window during the most recent close. */\n closedHeadLoss: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.cmo called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): CmoSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n gainWindow: new Float64RingBuffer(length),\n lossWindow: new Float64RingBuffer(length),\n sumGain: 0,\n sumLoss: 0,\n prevSrc: Number.NaN,\n prevClosedSrc: Number.NaN,\n cmo: Number.NaN,\n closedHeadGain: 0,\n closedHeadLoss: 0,\n };\n}\n\nfunction cmoFromSums(sumGain: number, sumLoss: number): number {\n const denom = sumGain + sumLoss;\n if (denom === 0) return Number.NaN;\n const raw = (100 * (sumGain - sumLoss)) / denom;\n return Math.min(100, Math.max(-100, raw));\n}\n\nfunction closeValue(slot: CmoSlot, src: number): number {\n if (!Number.isFinite(src)) {\n // Hold prior values forward; window is unchanged.\n slot.closedHeadGain = 0;\n slot.closedHeadLoss = 0;\n return slot.cmo;\n }\n if (!Number.isFinite(slot.prevSrc)) {\n slot.prevSrc = src;\n slot.prevClosedSrc = src;\n slot.closedHeadGain = 0;\n slot.closedHeadLoss = 0;\n return Number.NaN;\n }\n const diff = src - slot.prevSrc;\n const gain = diff > 0 ? diff : 0;\n const loss = diff < 0 ? -diff : 0;\n slot.prevClosedSrc = slot.prevSrc;\n slot.prevSrc = src;\n slot.closedHeadGain = gain;\n slot.closedHeadLoss = loss;\n if (slot.gainWindow.length === slot.length) {\n const oldestGain = slot.gainWindow.at(slot.length - 1);\n const oldestLoss = slot.lossWindow.at(slot.length - 1);\n slot.sumGain -= oldestGain;\n slot.sumLoss -= oldestLoss;\n }\n slot.gainWindow.append(gain);\n slot.lossWindow.append(loss);\n slot.sumGain += gain;\n slot.sumLoss += loss;\n if (slot.gainWindow.length < slot.length) {\n slot.cmo = Number.NaN;\n return Number.NaN;\n }\n slot.cmo = cmoFromSums(slot.sumGain, slot.sumLoss);\n return slot.cmo;\n}\n\nfunction tickValue(slot: CmoSlot, src: number): number {\n if (!Number.isFinite(src) || !Number.isFinite(slot.prevClosedSrc)) {\n return slot.cmo;\n }\n if (slot.gainWindow.length < slot.length) return Number.NaN;\n // Swap the most recently pushed gain/loss for the tick's gain/loss.\n const diff = src - slot.prevClosedSrc;\n const gain = diff > 0 ? diff : 0;\n const loss = diff < 0 ? -diff : 0;\n const provGain = slot.sumGain - slot.closedHeadGain + gain;\n const provLoss = slot.sumLoss - slot.closedHeadLoss + loss;\n return cmoFromSums(provGain, provLoss);\n}\n\n/**\n * Chande Momentum Oscillator — `100 · (Σ gain − Σ loss) / (Σ gain + Σ loss)`\n * over the trailing `length` window of per-bar diffs. Bounded `[-100, 100]`.\n * Flat-line input (zero denominator) → NaN. First emit lands at bar\n * `length` (after `length` diffs have been folded; warmup = `length`).\n *\n * @formula diff[t] = source[t] − source[t − 1] ;\n * gain[t] = max(diff[t], 0) ;\n * loss[t] = max(−diff[t], 0) ;\n * CMO[t] = 100 · (Σ gain − Σ loss) / (Σ gain + Σ loss)\n * @warmup length\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const c = ta.cmo(\"slot\", bar.close, 9);\n * // const head = c.current;\n */\nexport function cmo(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n _opts?: CmoOpts,\n): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as CmoSlot | 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/connorsRsi.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ import { type ScalarOrSeries } from "./lib/sourceValue.js";
|
|
|
5
5
|
* `RSI(streak, streakLength)`, and `PercentRank(ROC(source, 1),
|
|
6
6
|
* rocLength)` averaged into a single line bounded `[0, 100]`. The
|
|
7
7
|
* registry records `yDomain: { kind: "fixed", min: 0, max: 100 }` in
|
|
8
|
-
* `TA_REGISTRY_METADATA`. Composes
|
|
8
|
+
* `TA_REGISTRY_METADATA`. Composes `ta.rsi` for both RSI
|
|
9
9
|
* components (no private RSI math). Defaults `(3, 2, 100)` matches
|
|
10
10
|
* Larry Connors' original spec.
|
|
11
11
|
*
|
package/dist/ta/connorsRsi.js
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
//
|
|
4
4
|
// Ported from invinite/src/components/trading-chart/indicators/connors-rsi.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. Composition: Phase-1
|
|
10
10
|
// `ta.rsi` on the raw source (sub-slot `${slotId}/rsi`) + a second
|
|
@@ -137,7 +137,7 @@ function blendCrsi(rsiHead, streakRsiHead, pctRank) {
|
|
|
137
137
|
* `RSI(streak, streakLength)`, and `PercentRank(ROC(source, 1),
|
|
138
138
|
* rocLength)` averaged into a single line bounded `[0, 100]`. The
|
|
139
139
|
* registry records `yDomain: { kind: "fixed", min: 0, max: 100 }` in
|
|
140
|
-
* `TA_REGISTRY_METADATA`. Composes
|
|
140
|
+
* `TA_REGISTRY_METADATA`. Composes `ta.rsi` for both RSI
|
|
141
141
|
* components (no private RSI math). Defaults `(3, 2, 100)` matches
|
|
142
142
|
* Larry Connors' original spec.
|
|
143
143
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connorsRsi.js","sourceRoot":"","sources":["../../src/ta/connorsRsi.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"connorsRsi.js","sourceRoot":"","sources":["../../src/ta/connorsRsi.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/connors-rsi.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. Composition: Phase-1\n// `ta.rsi` on the raw source (sub-slot `${slotId}/rsi`) + a second\n// `ta.rsi` on the signed-streak scalar (sub-slot\n// `${slotId}/streakRsi`) — no private RSI math duplication. The\n// signed-streak helper + the rolling percent-rank live inline in this\n// file per task spec §3 (\"not factored to lib until a second consumer\n// appears\").\n//\n// DEVIATION from invinite: invinite's reference requires all three\n// components (RSI, streak-RSI, percent-rank) finite for the CRSI line\n// to be defined; on any NaN it propagates. The task spec §6 overrides\n// to \"sub-component NaN → component skipped in the average\". We follow\n// the spec — fully-NaN inputs still emit NaN, but a partially-warm\n// state yields a partial average. This is a tighter alignment with\n// the Pine `ta.connorsRsi` semantic where streak-RSI warmup doesn't\n// gate the rsi-on-close component.\n\nimport type { ConnorsRsiOpts, 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 { rsi } from \"./rsi.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\nconst DEFAULT_RSI_LENGTH = 3;\nconst DEFAULT_STREAK_LENGTH = 2;\nconst DEFAULT_ROC_LENGTH = 100;\n\ntype ConnorsRsiSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly rsiLength: number;\n readonly streakLength: number;\n readonly rocLength: number;\n /** Streak state at head (tick-aware). */\n streakSign: 1 | -1 | 0;\n streakRun: number;\n /** Snapshot at last close (used for tick replay). */\n prevClosedStreakSign: 1 | -1 | 0;\n prevClosedStreakRun: number;\n /** Source value at last close (used for streak diff on next close). */\n prevClosedSrc: number;\n /** Per-bar ROC(1) values (signed pct). Head `at(0)` is the current bar's ROC. */\n readonly rocWindow: Float64RingBuffer;\n /** Number of closed bars folded. */\n barCount: number;\n /** Per-offset Series-view cache. */\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.connorsRsi called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(\n rsiLength: number,\n streakLength: number,\n rocLength: number,\n capacity: number,\n): ConnorsRsiSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n rsiLength,\n streakLength,\n rocLength,\n streakSign: 0,\n streakRun: 0,\n prevClosedStreakSign: 0,\n prevClosedStreakRun: 0,\n prevClosedSrc: Number.NaN,\n // rocWindow capacity = rocLength + 1: room for the current\n // bar's ROC at `at(0)` plus the trailing `rocLength` values\n // we percent-rank against.\n rocWindow: new Float64RingBuffer(rocLength + 1),\n barCount: 0,\n shiftedViews: new Map(),\n };\n}\n\nfunction viewForOffset(slot: ConnorsRsiSlot, 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 stepStreak(\n prevSign: 1 | -1 | 0,\n prevRun: number,\n diff: number,\n): { sign: 1 | -1 | 0; run: number } {\n if (!Number.isFinite(diff) || diff === 0) {\n return { sign: 0, run: 0 };\n }\n if (diff > 0) {\n return { sign: 1, run: prevSign === 1 ? prevRun + 1 : 1 };\n }\n return { sign: -1, run: prevSign === -1 ? prevRun + 1 : 1 };\n}\n\nfunction streakScalar(sign: 1 | -1 | 0, run: number): number {\n if (sign === 0) return 0;\n return sign * run;\n}\n\nfunction pctChange(curr: number, prev: number): number {\n if (!Number.isFinite(curr) || !Number.isFinite(prev) || prev === 0) return Number.NaN;\n return (100 * (curr - prev)) / prev;\n}\n\n/**\n * Rolling percent rank of the head ROC value (`rocWindow.at(0)`)\n * within the trailing `rocLength` ROC values (exclusive of the head).\n * Returns 50 on an empty window (matches invinite). NaN target → NaN.\n */\nfunction percentRankHead(slot: ConnorsRsiSlot): number {\n const target = slot.rocWindow.at(0);\n if (!Number.isFinite(target)) return Number.NaN;\n const windowSize = slot.rocWindow.length - 1;\n // Defensive: percentRankHead is only called after the ROC window has\n // at least two entries (post-warmup), so windowSize >= 1 here.\n /* c8 ignore next */\n if (windowSize <= 0) return 50;\n const upper = Math.min(windowSize, slot.rocLength);\n let countBelow = 0;\n let validCount = 0;\n for (let j = 1; j <= upper; j += 1) {\n const v = slot.rocWindow.at(j);\n if (!Number.isFinite(v)) continue;\n validCount += 1;\n if (v < target) countBelow += 1;\n }\n return validCount === 0 ? 50 : (100 * countBelow) / validCount;\n}\n\nfunction blendCrsi(rsiHead: number, streakRsiHead: number, pctRank: number): number {\n let sum = 0;\n let count = 0;\n if (Number.isFinite(rsiHead)) {\n sum += rsiHead;\n count += 1;\n }\n if (Number.isFinite(streakRsiHead)) {\n sum += streakRsiHead;\n count += 1;\n }\n if (Number.isFinite(pctRank)) {\n sum += pctRank;\n count += 1;\n }\n return count === 0 ? Number.NaN : sum / count;\n}\n\n/**\n * Connors RSI — three-component blend of `RSI(source, rsiLength)`,\n * `RSI(streak, streakLength)`, and `PercentRank(ROC(source, 1),\n * rocLength)` averaged into a single line bounded `[0, 100]`. The\n * registry records `yDomain: { kind: \"fixed\", min: 0, max: 100 }` in\n * `TA_REGISTRY_METADATA`. Composes `ta.rsi` for both RSI\n * components (no private RSI math). Defaults `(3, 2, 100)` matches\n * Larry Connors' original spec.\n *\n * @formula diff = source[t] − source[t − 1] ;\n * streak[t] = signed run-length of consecutive same-sign diffs ;\n * rsiClose = rsi(source, rsiLength) ;\n * rsiStreak = rsi(streak, streakLength) ;\n * roc1 = 100 · diff / source[t − 1] ;\n * pctRank = 100 · #(roc1[i] < roc1[t]) / validWindowCount\n * over i in [t − rocLength, t − 1] ;\n * crsi = (rsiClose + rsiStreak + pctRank) / 3 ;\n * components that are NaN are skipped — count adjusts\n * @warmup max(rsiLength, streakLength, rocLength) + 1\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const c = ta.connorsRsi(\"slot\", bar.close);\n * // plot(c);\n */\nexport function connorsRsi(\n slotId: string,\n source: ScalarOrSeries,\n opts?: ConnorsRsiOpts,\n): Series<number> {\n const ctx = getCtx();\n const rsiLength = opts?.rsiLength ?? DEFAULT_RSI_LENGTH;\n const streakLength = opts?.streakLength ?? DEFAULT_STREAK_LENGTH;\n const rocLength = opts?.rocLength ?? DEFAULT_ROC_LENGTH;\n let slot = ctx.stream.taSlots.get(slotId) as ConnorsRsiSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(rsiLength, streakLength, rocLength, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const src = readSourceValue(source);\n\n if (ctx.isTick) {\n // Tick replay: use the SNAPSHOT (prevClosed*) state — do NOT\n // mutate `streakSign` / `streakRun` / `prevClosedSrc` /\n // `barCount` / advance rocWindow.\n const diff = pctChange(src, slot.prevClosedSrc);\n const { sign, run } = stepStreak(\n slot.prevClosedStreakSign,\n slot.prevClosedStreakRun,\n /* c8 ignore next */\n Number.isFinite(slot.prevClosedSrc) ? src - slot.prevClosedSrc : Number.NaN,\n );\n const roc = diff;\n slot.rocWindow.replaceHead(roc);\n const rsiHead = rsi(`${slotId}/rsi`, src, rsiLength).current;\n const streakRsiHead = rsi(\n `${slotId}/streakRsi`,\n streakScalar(sign, run),\n streakLength,\n ).current;\n const pr = percentRankHead(slot);\n slot.outBuffer.replaceHead(blendCrsi(rsiHead, streakRsiHead, pr));\n } else {\n const diff = Number.isFinite(slot.prevClosedSrc) ? src - slot.prevClosedSrc : Number.NaN;\n const { sign, run } = stepStreak(slot.streakSign, slot.streakRun, diff);\n const roc = pctChange(src, slot.prevClosedSrc);\n slot.rocWindow.append(roc);\n const rsiHead = rsi(`${slotId}/rsi`, src, rsiLength).current;\n const streakRsiHead = rsi(\n `${slotId}/streakRsi`,\n streakScalar(sign, run),\n streakLength,\n ).current;\n const pr = percentRankHead(slot);\n slot.outBuffer.append(blendCrsi(rsiHead, streakRsiHead, pr));\n // Advance close-side state.\n slot.prevClosedStreakSign = slot.streakSign;\n slot.prevClosedStreakRun = slot.streakRun;\n slot.streakSign = sign;\n slot.streakRun = run;\n slot.prevClosedSrc = src;\n slot.barCount += 1;\n }\n return viewForOffset(slot, opts?.offset ?? 0);\n}\n"]}
|
package/dist/ta/coppock.js
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
//
|
|
4
4
|
// Ported from invinite/src/components/trading-chart/indicators/coppock.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/coppock.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coppock.js","sourceRoot":"","sources":["../../src/ta/coppock.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAC/D,EAAE;AACF,0EAA0E;AAC1E,mEAAmE;AACnE,0DAA0D;AAC1D,yEAAyE;AACzE,qEAAqE;AACrE,4DAA4D;AAC5D,yBAAyB;AACzB,EAAE;AACF,8DAA8D;AAC9D,8DAA8D;AAC9D,kEAAkE;AAClE,kEAAkE;AAClE,0DAA0D;AAC1D,mEAAmE;AACnE,kEAAkE;AAClE,4DAA4D;AAC5D,gBAAgB;AAIhB,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;AAE5E,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAC/B,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAC/B,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAgB9B,SAAS,MAAM;IACX,MAAM,GAAG,GAAG,sBAAsB,CAAC,OAAO,CAAC;IAC3C,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CACb,UAAkB,EAClB,UAAkB,EAClB,SAAiB,EACjB,QAAgB;IAEhB,MAAM,SAAS,GAAG,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAClD,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC;IAC9D,OAAO;QACH,SAAS;QACT,MAAM,EAAE,cAAc,CAAS,SAAS,CAAC;QACzC,UAAU;QACV,UAAU;QACV,SAAS;QACT,YAAY,EAAE,IAAI,iBAAiB,CAAC,gBAAgB,CAAC;QACrD,SAAS,EAAE,IAAI,iBAAiB,CAAC,SAAS,CAAC;QAC3C,QAAQ,EAAE,CAAC;KACd,CAAC;AACN,CAAC;AAED;;;GAGG;AACH,SAAS,MAAM,CAAC,OAAe,EAAE,QAAgB;IAC7C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5E,OAAO,MAAM,CAAC,GAAG,CAAC;IACtB,CAAC;IACD,OAAO,CAAC,GAAG,GAAG,CAAC,OAAO,GAAG,QAAQ,CAAC,CAAC,GAAG,QAAQ,CAAC;AACnD,CAAC;AAED;;;;;GAKG;AACH,SAAS,gBAAgB,CAAC,IAAiB;IACvC,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC;IAC9D,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC1D,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,OAAO,MAAM,CAAC,GAAG,CAAC;QAC3C,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,GAAG,GAAG,KAAK,CAAC;AACvB,CAAC;AAED,SAAS,aAAa,CAAC,IAAiB,EAAE,GAAW;IACjD,mEAAmE;IACnE,+DAA+D;IAC/D,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC;IACnE,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC;IACnE,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACpC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC;IACxE,OAAO,IAAI,GAAG,IAAI,CAAC;AACvB,CAAC;AAED,SAAS,UAAU,CAAC,IAAiB,EAAE,GAAW;IAC9C,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;IACnB,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACrC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3B,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,SAAS,CAAC,IAAiB,EAAE,GAAW;IAC7C,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC;IACtD,iEAAiE;IACjE,0DAA0D;IAC1D,wCAAwC;IACxC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACrC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAChC,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,OAAO,CACnB,MAAc,EACd,MAAsB,EACtB,IAAkB;IAElB,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,UAAU,GAAG,IAAI,EAAE,UAAU,IAAI,mBAAmB,CAAC;IAC3D,MAAM,UAAU,GAAG,IAAI,EAAE,UAAU,IAAI,mBAAmB,CAAC;IAC3D,MAAM,SAAS,GAAG,IAAI,EAAE,SAAS,IAAI,kBAAkB,CAAC;IACxD,IAAI,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAA4B,CAAC;IACrE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACrB,IAAI,GAAG,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACpF,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"}
|
|
1
|
+
{"version":3,"file":"coppock.js","sourceRoot":"","sources":["../../src/ta/coppock.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAC/D,EAAE;AACF,0EAA0E;AAC1E,mEAAmE;AACnE,qEAAqE;AACrE,gBAAgB;AAChB,qEAAqE;AACrE,4DAA4D;AAC5D,yBAAyB;AACzB,EAAE;AACF,8DAA8D;AAC9D,8DAA8D;AAC9D,kEAAkE;AAClE,kEAAkE;AAClE,0DAA0D;AAC1D,mEAAmE;AACnE,kEAAkE;AAClE,4DAA4D;AAC5D,gBAAgB;AAIhB,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;AAE5E,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAC/B,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAC/B,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAgB9B,SAAS,MAAM;IACX,MAAM,GAAG,GAAG,sBAAsB,CAAC,OAAO,CAAC;IAC3C,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CACb,UAAkB,EAClB,UAAkB,EAClB,SAAiB,EACjB,QAAgB;IAEhB,MAAM,SAAS,GAAG,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAClD,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC;IAC9D,OAAO;QACH,SAAS;QACT,MAAM,EAAE,cAAc,CAAS,SAAS,CAAC;QACzC,UAAU;QACV,UAAU;QACV,SAAS;QACT,YAAY,EAAE,IAAI,iBAAiB,CAAC,gBAAgB,CAAC;QACrD,SAAS,EAAE,IAAI,iBAAiB,CAAC,SAAS,CAAC;QAC3C,QAAQ,EAAE,CAAC;KACd,CAAC;AACN,CAAC;AAED;;;GAGG;AACH,SAAS,MAAM,CAAC,OAAe,EAAE,QAAgB;IAC7C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5E,OAAO,MAAM,CAAC,GAAG,CAAC;IACtB,CAAC;IACD,OAAO,CAAC,GAAG,GAAG,CAAC,OAAO,GAAG,QAAQ,CAAC,CAAC,GAAG,QAAQ,CAAC;AACnD,CAAC;AAED;;;;;GAKG;AACH,SAAS,gBAAgB,CAAC,IAAiB;IACvC,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC;IAC9D,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC1D,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,OAAO,MAAM,CAAC,GAAG,CAAC;QAC3C,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,GAAG,GAAG,KAAK,CAAC;AACvB,CAAC;AAED,SAAS,aAAa,CAAC,IAAiB,EAAE,GAAW;IACjD,mEAAmE;IACnE,+DAA+D;IAC/D,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC;IACnE,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC;IACnE,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACpC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC;IACxE,OAAO,IAAI,GAAG,IAAI,CAAC;AACvB,CAAC;AAED,SAAS,UAAU,CAAC,IAAiB,EAAE,GAAW;IAC9C,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;IACnB,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACrC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3B,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,SAAS,CAAC,IAAiB,EAAE,GAAW;IAC7C,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC;IACtD,iEAAiE;IACjE,0DAA0D;IAC1D,wCAAwC;IACxC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACrC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAChC,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,OAAO,CACnB,MAAc,EACd,MAAsB,EACtB,IAAkB;IAElB,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,UAAU,GAAG,IAAI,EAAE,UAAU,IAAI,mBAAmB,CAAC;IAC3D,MAAM,UAAU,GAAG,IAAI,EAAE,UAAU,IAAI,mBAAmB,CAAC;IAC3D,MAAM,SAAS,GAAG,IAAI,EAAE,SAAS,IAAI,kBAAkB,CAAC;IACxD,IAAI,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAA4B,CAAC;IACrE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACrB,IAAI,GAAG,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACpF,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/coppock.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//\n// DEVIATION from the task spec's \"composes `ta.change`\" hint:\n// `ta.change` emits ABSOLUTE deltas, while Coppock's ROC is a\n// PERCENTAGE rate-of-change (`100 · (src − src[n]) / src[n]`). We\n// compute the percentage ROCs inline against our own sourceWindow\n// rather than composing `ta.change`. The WMA math mirrors\n// `lib/wmaFloat64` (linear weights `(N, N − 1, …, 1)`, denominator\n// `N(N + 1) / 2`); we inline the WMA over a per-close `sumWindow`\n// rather than allocating a `Float64Array` per close to feed\n// `wmaFloat64`.\n\nimport type { CoppockOpts, 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\nconst DEFAULT_ROC1_LENGTH = 11;\nconst DEFAULT_ROC2_LENGTH = 14;\nconst DEFAULT_WMA_LENGTH = 10;\n\ntype CoppockSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly roc1Length: number;\n readonly roc2Length: number;\n readonly wmaLength: number;\n /** Last `max(roc1, roc2) + 1` closed source values. `at(0)` is the head. */\n readonly sourceWindow: Float64RingBuffer;\n /** Last `wmaLength` ROC1+ROC2 sums (`at(0)` is the head). */\n readonly sumWindow: Float64RingBuffer;\n /** Number of closed bars folded into the slot so far. */\n barCount: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.coppock called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(\n roc1Length: number,\n roc2Length: number,\n wmaLength: number,\n capacity: number,\n): CoppockSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n const lookbackCapacity = Math.max(roc1Length, roc2Length) + 1;\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n roc1Length,\n roc2Length,\n wmaLength,\n sourceWindow: new Float64RingBuffer(lookbackCapacity),\n sumWindow: new Float64RingBuffer(wmaLength),\n barCount: 0,\n };\n}\n\n/**\n * Percentage rate-of-change against a lookback value. Returns NaN on\n * a NaN / zero divisor (matching invinite's `prev === 0` guard).\n */\nfunction pctRoc(current: number, lookback: number): number {\n if (!Number.isFinite(lookback) || lookback === 0 || !Number.isFinite(current)) {\n return Number.NaN;\n }\n return (100 * (current - lookback)) / lookback;\n}\n\n/**\n * Inline linear-weighted moving average over the `sumWindow` ring.\n * `at(0)` is the most recent value (weight `wmaLength`); `at(wmaLength − 1)`\n * is the oldest (weight `1`). Returns NaN if the window is not full\n * or any slot is non-finite.\n */\nfunction wmaOverSumWindow(slot: CoppockSlot): number {\n if (slot.sumWindow.length < slot.wmaLength) return Number.NaN;\n const denom = (slot.wmaLength * (slot.wmaLength + 1)) / 2;\n let acc = 0;\n for (let i = 0; i < slot.wmaLength; i += 1) {\n const v = slot.sumWindow.at(i);\n if (!Number.isFinite(v)) return Number.NaN;\n acc += v * (slot.wmaLength - i);\n }\n return acc / denom;\n}\n\nfunction computeRocSum(slot: CoppockSlot, src: number): number {\n // sourceWindow.at(roc1Length) is the bar `roc1Length` ago RELATIVE\n // TO the just-appended head (`at(0)` is `src`). Same for roc2.\n if (slot.sourceWindow.length <= slot.roc1Length) return Number.NaN;\n if (slot.sourceWindow.length <= slot.roc2Length) return Number.NaN;\n const lookback1 = slot.sourceWindow.at(slot.roc1Length);\n const lookback2 = slot.sourceWindow.at(slot.roc2Length);\n const roc1 = pctRoc(src, lookback1);\n const roc2 = pctRoc(src, lookback2);\n if (!Number.isFinite(roc1) || !Number.isFinite(roc2)) return Number.NaN;\n return roc1 + roc2;\n}\n\nfunction closeValue(slot: CoppockSlot, src: number): number {\n slot.sourceWindow.append(src);\n slot.barCount += 1;\n const sum = computeRocSum(slot, src);\n slot.sumWindow.append(sum);\n return wmaOverSumWindow(slot);\n}\n\nfunction tickValue(slot: CoppockSlot, src: number): number {\n if (slot.sourceWindow.length === 0) return Number.NaN;\n // Substitute the head of `sourceWindow` with the tick `src`. The\n // lookback bars (`at(roc1Length)` / `at(roc2Length)`) are\n // pre-close and unaffected by the tick.\n slot.sourceWindow.replaceHead(src);\n const sum = computeRocSum(slot, src);\n slot.sumWindow.replaceHead(sum);\n return wmaOverSumWindow(slot);\n}\n\n/**\n * Coppock Curve — long-term momentum indicator (Edwin Coppock, 1962).\n * `WMA(ROC(source, roc1Length) + ROC(source, roc2Length), wmaLength)`\n * where ROC is the percentage rate-of-change. Defaults `(11, 14, 10)`\n * matches Coppock's original monthly-equities formulation. Unbounded;\n * zero crossings are the canonical signal (positive → bullish).\n *\n * @formula roc1 = 100 · (source[t] − source[t − roc1Length]) / source[t − roc1Length] ;\n * roc2 = 100 · (source[t] − source[t − roc2Length]) / source[t − roc2Length] ;\n * sum = roc1 + roc2 ;\n * coppock = (Σ sum[t − N + 1 + i] · (i + 1)) / (N(N + 1) / 2)\n * for i in 0..N − 1, N = wmaLength\n * @warmup max(roc1Length, roc2Length) + wmaLength − 1\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const c = ta.coppock(\"slot\", bar.close);\n * // plot(c);\n */\nexport function coppock(\n slotId: string,\n source: ScalarOrSeries,\n opts?: CoppockOpts,\n): Series<number> {\n const ctx = getCtx();\n const roc1Length = opts?.roc1Length ?? DEFAULT_ROC1_LENGTH;\n const roc2Length = opts?.roc2Length ?? DEFAULT_ROC2_LENGTH;\n const wmaLength = opts?.wmaLength ?? DEFAULT_WMA_LENGTH;\n let slot = ctx.stream.taSlots.get(slotId) as CoppockSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(roc1Length, roc2Length, wmaLength, 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/crossover.d.ts
CHANGED
|
@@ -17,7 +17,7 @@ import { type ScalarOrSeries } from "./lib/sourceValue.js";
|
|
|
17
17
|
* @stable
|
|
18
18
|
*
|
|
19
19
|
* `opts.offset` shifts the boolean series so `series.current` returns
|
|
20
|
-
* the crossover detection `offset` bars ago
|
|
20
|
+
* the crossover detection `offset` bars ago.
|
|
21
21
|
*
|
|
22
22
|
* @example
|
|
23
23
|
* // import { ta } from "@invinite-org/chartlang-runtime";
|
package/dist/ta/crossover.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// See the LICENSE file in the repo root for full license text.
|
|
3
3
|
//
|
|
4
4
|
// No invinite source — Phase-1 new code, semantics per Pine
|
|
5
|
-
// `ta.crossover` / `ta.crossunder`.
|
|
5
|
+
// `ta.crossover` / `ta.crossunder`.
|
|
6
6
|
// Structural choices (callsite-id slot, Series<T> proxy, replaceHead
|
|
7
7
|
// mode) follow chartlang's primitive shape.
|
|
8
8
|
import { RingBuffer } from "../ringBuffer.js";
|
|
@@ -65,7 +65,7 @@ function detect(prevA, prevB, currA, currB) {
|
|
|
65
65
|
* @stable
|
|
66
66
|
*
|
|
67
67
|
* `opts.offset` shifts the boolean series so `series.current` returns
|
|
68
|
-
* the crossover detection `offset` bars ago
|
|
68
|
+
* the crossover detection `offset` bars ago.
|
|
69
69
|
*
|
|
70
70
|
* @example
|
|
71
71
|
* // import { ta } from "@invinite-org/chartlang-runtime";
|
package/dist/ta/crossover.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crossover.js","sourceRoot":"","sources":["../../src/ta/crossover.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAC/D,EAAE;AACF,4DAA4D;AAC5D,
|
|
1
|
+
{"version":3,"file":"crossover.js","sourceRoot":"","sources":["../../src/ta/crossover.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 — Phase-1 new code, semantics per Pine\n// `ta.crossover` / `ta.crossunder`.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape.\n\nimport type { CrossoverOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\ntype CrossSlot = {\n readonly outBuffer: RingBuffer<boolean>;\n readonly series: Series<boolean>;\n /** Prior closed-bar values of `a` and `b` (rolling 2-slot history). */\n prevA: number;\n prevB: number;\n /** As-of-current-close values, frozen so ticks replay against prior. */\n currA: number;\n currB: number;\n initialised: boolean;\n /** Per-offset Series-view cache; see `sma.ts` for the convention. */\n readonly shiftedViews: Map<number, Series<boolean>>;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.crossover called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(capacity: number): CrossSlot {\n const outBuffer = new RingBuffer<boolean>(capacity);\n return {\n outBuffer,\n series: makeSeriesView<boolean>(outBuffer) as Series<boolean>,\n prevA: Number.NaN,\n prevB: Number.NaN,\n currA: Number.NaN,\n currB: Number.NaN,\n initialised: false,\n shiftedViews: new Map(),\n };\n}\n\nfunction viewForOffset(slot: CrossSlot, offset: number): Series<boolean> {\n if (offset === 0) return slot.series;\n let view = slot.shiftedViews.get(offset);\n if (view === undefined) {\n view = makeShiftedSeriesView<boolean>(slot.outBuffer, offset) as Series<boolean>;\n slot.shiftedViews.set(offset, view);\n }\n return view;\n}\n\nfunction detect(prevA: number, prevB: number, currA: number, currB: number): boolean {\n if (\n !Number.isFinite(prevA) ||\n !Number.isFinite(prevB) ||\n !Number.isFinite(currA) ||\n !Number.isFinite(currB)\n ) {\n return false;\n }\n return currA > currB && prevA <= prevB;\n}\n\n/**\n * `true` exactly at the bar where `a` crosses above `b`: `a.current >\n * b.current && a.prev <= b.prev`. `b` may be a scalar (treated as a\n * constant series). NaN inputs yield `false` — Pine semantics for\n * Boolean series (NaN doesn't bubble through booleans).\n *\n * The slot keeps a 2-slot history of both `a` and `b` so scalar\n * sources work without the caller wrapping them. Tick-mode replays\n * the head with the prior closed-bar's `(a, b)` pair so a partial-\n * bar value doesn't seed the next close's comparison.\n *\n * @formula out[t] = a[t] > b[t] && a[t − 1] ≤ b[t − 1] (else false)\n * @warmup 1 (need a prior bar)\n * @since 0.1\n * @stable\n *\n * `opts.offset` shifts the boolean series so `series.current` returns\n * the crossover detection `offset` bars ago.\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const c = ta.crossover(\"slot\", fastEma, slowEma);\n * // if (c.current) { ... }\n * // const lagged = ta.crossover(\"slot2\", fastEma, slowEma, { offset: 1 });\n */\nexport function crossover(\n slotId: string,\n a: ScalarOrSeries,\n b: ScalarOrSeries,\n opts?: CrossoverOpts,\n): Series<boolean> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as CrossSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const aValue = readSourceValue(a);\n const bValue = readSourceValue(b);\n const offset = opts?.offset ?? 0;\n if (ctx.isTick) {\n const out = detect(slot.prevA, slot.prevB, aValue, bValue);\n slot.outBuffer.replaceHead(out);\n return viewForOffset(slot, offset);\n }\n if (!slot.initialised) {\n slot.initialised = true;\n slot.prevA = aValue;\n slot.prevB = bValue;\n slot.currA = aValue;\n slot.currB = bValue;\n slot.outBuffer.append(false);\n return viewForOffset(slot, offset);\n }\n // Standard close-side advance: prev becomes currA/B, currA/B become the new sample.\n slot.prevA = slot.currA;\n slot.prevB = slot.currB;\n slot.currA = aValue;\n slot.currB = bValue;\n slot.outBuffer.append(detect(slot.prevA, slot.prevB, slot.currA, slot.currB));\n return viewForOffset(slot, offset);\n}\n"]}
|
package/dist/ta/crossunder.d.ts
CHANGED
|
@@ -11,7 +11,7 @@ import { type ScalarOrSeries } from "./lib/sourceValue.js";
|
|
|
11
11
|
* @stable
|
|
12
12
|
*
|
|
13
13
|
* `opts.offset` shifts the boolean series so `series.current` returns
|
|
14
|
-
* the crossunder detection `offset` bars ago
|
|
14
|
+
* the crossunder detection `offset` bars ago.
|
|
15
15
|
*
|
|
16
16
|
* @example
|
|
17
17
|
* // import { ta } from "@invinite-org/chartlang-runtime";
|
package/dist/ta/crossunder.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// See the LICENSE file in the repo root for full license text.
|
|
3
3
|
//
|
|
4
4
|
// No invinite source — Phase-1 new code, semantics per Pine
|
|
5
|
-
// `ta.crossover` / `ta.crossunder`.
|
|
5
|
+
// `ta.crossover` / `ta.crossunder`.
|
|
6
6
|
// Structural choices (callsite-id slot, Series<T> proxy, replaceHead
|
|
7
7
|
// mode) follow chartlang's primitive shape.
|
|
8
8
|
import { RingBuffer } from "../ringBuffer.js";
|
|
@@ -59,7 +59,7 @@ function detect(prevA, prevB, currA, currB) {
|
|
|
59
59
|
* @stable
|
|
60
60
|
*
|
|
61
61
|
* `opts.offset` shifts the boolean series so `series.current` returns
|
|
62
|
-
* the crossunder detection `offset` bars ago
|
|
62
|
+
* the crossunder detection `offset` bars ago.
|
|
63
63
|
*
|
|
64
64
|
* @example
|
|
65
65
|
* // import { ta } from "@invinite-org/chartlang-runtime";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crossunder.js","sourceRoot":"","sources":["../../src/ta/crossunder.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAC/D,EAAE;AACF,4DAA4D;AAC5D,
|
|
1
|
+
{"version":3,"file":"crossunder.js","sourceRoot":"","sources":["../../src/ta/crossunder.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 — Phase-1 new code, semantics per Pine\n// `ta.crossover` / `ta.crossunder`.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape.\n\nimport type { CrossunderOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\ntype CrossSlot = {\n readonly outBuffer: RingBuffer<boolean>;\n readonly series: Series<boolean>;\n prevA: number;\n prevB: number;\n currA: number;\n currB: number;\n initialised: boolean;\n /** Per-offset Series-view cache; see `sma.ts` for the convention. */\n readonly shiftedViews: Map<number, Series<boolean>>;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.crossunder called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(capacity: number): CrossSlot {\n const outBuffer = new RingBuffer<boolean>(capacity);\n return {\n outBuffer,\n series: makeSeriesView<boolean>(outBuffer) as Series<boolean>,\n prevA: Number.NaN,\n prevB: Number.NaN,\n currA: Number.NaN,\n currB: Number.NaN,\n initialised: false,\n shiftedViews: new Map(),\n };\n}\n\nfunction viewForOffset(slot: CrossSlot, offset: number): Series<boolean> {\n if (offset === 0) return slot.series;\n let view = slot.shiftedViews.get(offset);\n if (view === undefined) {\n view = makeShiftedSeriesView<boolean>(slot.outBuffer, offset) as Series<boolean>;\n slot.shiftedViews.set(offset, view);\n }\n return view;\n}\n\nfunction detect(prevA: number, prevB: number, currA: number, currB: number): boolean {\n if (\n !Number.isFinite(prevA) ||\n !Number.isFinite(prevB) ||\n !Number.isFinite(currA) ||\n !Number.isFinite(currB)\n ) {\n return false;\n }\n return currA < currB && prevA >= prevB;\n}\n\n/**\n * `true` exactly at the bar where `a` crosses below `b`: `a.current <\n * b.current && a.prev >= b.prev`. Mirror of {@link crossover}; NaN\n * inputs yield `false`.\n *\n * @formula out[t] = a[t] < b[t] && a[t − 1] ≥ b[t − 1] (else false)\n * @warmup 1\n * @since 0.1\n * @stable\n *\n * `opts.offset` shifts the boolean series so `series.current` returns\n * the crossunder detection `offset` bars ago.\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const c = ta.crossunder(\"slot\", fastEma, slowEma);\n * // if (c.current) { ... }\n * // const lagged = ta.crossunder(\"slot2\", fastEma, slowEma, { offset: 1 });\n */\nexport function crossunder(\n slotId: string,\n a: ScalarOrSeries,\n b: ScalarOrSeries,\n opts?: CrossunderOpts,\n): Series<boolean> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as CrossSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const aValue = readSourceValue(a);\n const bValue = readSourceValue(b);\n const offset = opts?.offset ?? 0;\n if (ctx.isTick) {\n const out = detect(slot.prevA, slot.prevB, aValue, bValue);\n slot.outBuffer.replaceHead(out);\n return viewForOffset(slot, offset);\n }\n if (!slot.initialised) {\n slot.initialised = true;\n slot.prevA = aValue;\n slot.prevB = bValue;\n slot.currA = aValue;\n slot.currB = bValue;\n slot.outBuffer.append(false);\n return viewForOffset(slot, offset);\n }\n slot.prevA = slot.currA;\n slot.prevB = slot.currB;\n slot.currA = aValue;\n slot.currB = bValue;\n slot.outBuffer.append(detect(slot.prevA, slot.prevB, slot.currA, slot.currB));\n return viewForOffset(slot, offset);\n}\n"]}
|
package/dist/ta/dema.js
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
//
|
|
4
4
|
// Ported from invinite/src/components/trading-chart/indicators/dema.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. DEMA composes two EMA sub-slots derived from
|