oakscriptjs 0.8.1 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +31 -9
- package/dist/cjs/array/index.d.ts +701 -0
- package/dist/cjs/array/index.d.ts.map +1 -0
- package/dist/cjs/array/index.js +392 -0
- package/dist/cjs/array/index.js.map +7 -0
- package/dist/cjs/box/index.d.ts +444 -0
- package/dist/cjs/box/index.d.ts.map +1 -0
- package/dist/cjs/box/index.js +246 -0
- package/dist/cjs/box/index.js.map +7 -0
- package/dist/cjs/callsite/index.d.ts +61 -0
- package/dist/cjs/callsite/index.d.ts.map +1 -0
- package/dist/cjs/callsite/index.js +65 -0
- package/dist/cjs/callsite/index.js.map +7 -0
- package/dist/cjs/chartpoint/index.d.ts +90 -0
- package/dist/cjs/chartpoint/index.d.ts.map +1 -0
- package/dist/cjs/chartpoint/index.js +56 -0
- package/dist/cjs/chartpoint/index.js.map +7 -0
- package/dist/cjs/color/index.d.ts +285 -0
- package/dist/cjs/color/index.d.ts.map +1 -0
- package/dist/cjs/color/index.js +143 -0
- package/dist/cjs/color/index.js.map +7 -0
- package/dist/cjs/compare/index.d.ts +26 -0
- package/dist/cjs/compare/index.d.ts.map +1 -0
- package/dist/cjs/compare/index.js +50 -0
- package/dist/cjs/compare/index.js.map +7 -0
- package/dist/cjs/drawing/registry.d.ts +42 -0
- package/dist/cjs/drawing/registry.d.ts.map +1 -0
- package/dist/cjs/drawing/registry.js +87 -0
- package/dist/cjs/drawing/registry.js.map +7 -0
- package/dist/cjs/index.d.ts +85 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +184 -0
- package/dist/cjs/index.js.map +7 -0
- package/dist/cjs/indicator.d.ts +117 -0
- package/dist/cjs/indicator.d.ts.map +1 -0
- package/dist/cjs/indicator.js +74 -0
- package/dist/cjs/indicator.js.map +7 -0
- package/dist/cjs/input.d.ts +196 -0
- package/dist/cjs/input.d.ts.map +1 -0
- package/dist/cjs/input.js +197 -0
- package/dist/cjs/input.js.map +7 -0
- package/dist/cjs/label/index.d.ts +303 -0
- package/dist/cjs/label/index.d.ts.map +1 -0
- package/dist/cjs/label/index.js +190 -0
- package/dist/cjs/label/index.js.map +7 -0
- package/dist/cjs/lib/index.d.ts +8 -0
- package/dist/cjs/lib/index.d.ts.map +1 -0
- package/dist/cjs/lib/index.js +19 -0
- package/dist/cjs/lib/index.js.map +7 -0
- package/dist/{lib → cjs/lib}/zigzag/index.d.ts +4 -1
- package/dist/cjs/lib/zigzag/index.d.ts.map +1 -0
- package/dist/cjs/lib/zigzag/index.js +27 -0
- package/dist/cjs/lib/zigzag/index.js.map +7 -0
- package/dist/cjs/lib/zigzag/zigzag.d.ts +100 -0
- package/dist/cjs/lib/zigzag/zigzag.d.ts.map +1 -0
- package/dist/cjs/lib/zigzag/zigzag.js +207 -0
- package/dist/cjs/lib/zigzag/zigzag.js.map +7 -0
- package/dist/cjs/line/index.d.ts +342 -0
- package/dist/cjs/line/index.d.ts.map +1 -0
- package/dist/cjs/line/index.js +193 -0
- package/dist/cjs/line/index.js.map +7 -0
- package/dist/cjs/linefill/index.d.ts +124 -0
- package/dist/cjs/linefill/index.d.ts.map +1 -0
- package/dist/cjs/linefill/index.js +56 -0
- package/dist/cjs/linefill/index.js.map +7 -0
- package/dist/cjs/map/index.d.ts +69 -0
- package/dist/cjs/map/index.d.ts.map +1 -0
- package/dist/cjs/map/index.js +80 -0
- package/dist/cjs/map/index.js.map +7 -0
- package/dist/cjs/math/index.d.ts +560 -0
- package/dist/cjs/math/index.d.ts.map +1 -0
- package/dist/cjs/math/index.js +441 -0
- package/dist/cjs/math/index.js.map +7 -0
- package/dist/cjs/matrix/index.d.ts +1231 -0
- package/dist/cjs/matrix/index.d.ts.map +1 -0
- package/dist/cjs/matrix/index.js +1200 -0
- package/dist/cjs/matrix/index.js.map +7 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/plot.d.ts +76 -0
- package/dist/cjs/plot.d.ts.map +1 -0
- package/dist/cjs/plot.js +51 -0
- package/dist/cjs/plot.js.map +7 -0
- package/dist/cjs/polyline/index.d.ts +115 -0
- package/dist/cjs/polyline/index.d.ts.map +1 -0
- package/dist/cjs/polyline/index.js +76 -0
- package/dist/cjs/polyline/index.js.map +7 -0
- package/dist/cjs/runtime/adapters/LightweightChartsAdapter.d.ts +86 -0
- package/dist/cjs/runtime/adapters/LightweightChartsAdapter.d.ts.map +1 -0
- package/dist/cjs/runtime/adapters/LightweightChartsAdapter.js +141 -0
- package/dist/cjs/runtime/adapters/LightweightChartsAdapter.js.map +7 -0
- package/dist/cjs/runtime/adapters/SimpleInputAdapter.d.ts +59 -0
- package/dist/cjs/runtime/adapters/SimpleInputAdapter.d.ts.map +1 -0
- package/dist/cjs/runtime/adapters/SimpleInputAdapter.js +117 -0
- package/dist/cjs/runtime/adapters/SimpleInputAdapter.js.map +7 -0
- package/dist/{runtime → cjs/runtime}/index.d.ts +12 -5
- package/dist/cjs/runtime/index.d.ts.map +1 -0
- package/dist/cjs/runtime/index.js +49 -0
- package/dist/cjs/runtime/index.js.map +7 -0
- package/dist/cjs/runtime/inputs.d.ts +91 -0
- package/dist/cjs/runtime/inputs.d.ts.map +1 -0
- package/dist/cjs/runtime/inputs.js +262 -0
- package/dist/cjs/runtime/inputs.js.map +7 -0
- package/dist/cjs/runtime/runtime.d.ts +70 -0
- package/dist/cjs/runtime/runtime.d.ts.map +1 -0
- package/dist/cjs/runtime/runtime.js +148 -0
- package/dist/cjs/runtime/runtime.js.map +7 -0
- package/dist/cjs/runtime/series.d.ts +362 -0
- package/dist/cjs/runtime/series.d.ts.map +1 -0
- package/dist/cjs/runtime/series.js +560 -0
- package/dist/cjs/runtime/series.js.map +7 -0
- package/dist/cjs/runtime/types.d.ts +282 -0
- package/dist/cjs/runtime/types.d.ts.map +1 -0
- package/dist/cjs/runtime/types.js +17 -0
- package/dist/cjs/runtime/types.js.map +7 -0
- package/dist/cjs/script/index.d.ts +987 -0
- package/dist/cjs/script/index.d.ts.map +1 -0
- package/dist/cjs/script/index.js +1169 -0
- package/dist/cjs/script/index.js.map +7 -0
- package/dist/cjs/security/resample.d.ts +63 -0
- package/dist/cjs/security/resample.d.ts.map +1 -0
- package/dist/cjs/security/resample.js +84 -0
- package/dist/cjs/security/resample.js.map +7 -0
- package/dist/cjs/session/bars.d.ts +80 -0
- package/dist/cjs/session/bars.d.ts.map +1 -0
- package/dist/cjs/session/bars.js +219 -0
- package/dist/cjs/session/bars.js.map +7 -0
- package/dist/cjs/session/calendar.d.ts +70 -0
- package/dist/cjs/session/calendar.d.ts.map +1 -0
- package/dist/cjs/session/calendar.js +164 -0
- package/dist/cjs/session/calendar.js.map +7 -0
- package/dist/cjs/str/dateformat.d.ts +15 -0
- package/dist/cjs/str/dateformat.d.ts.map +1 -0
- package/dist/cjs/str/dateformat.js +149 -0
- package/dist/cjs/str/dateformat.js.map +7 -0
- package/dist/cjs/str/index.d.ts +459 -0
- package/dist/cjs/str/index.d.ts.map +1 -0
- package/dist/cjs/str/index.js +143 -0
- package/dist/cjs/str/index.js.map +7 -0
- package/dist/cjs/str/messageformat.d.ts +14 -0
- package/dist/cjs/str/messageformat.d.ts.map +1 -0
- package/dist/cjs/str/messageformat.js +114 -0
- package/dist/cjs/str/messageformat.js.map +7 -0
- package/dist/cjs/str/numberformat.d.ts +19 -0
- package/dist/cjs/str/numberformat.d.ts.map +1 -0
- package/dist/cjs/str/numberformat.js +170 -0
- package/dist/cjs/str/numberformat.js.map +7 -0
- package/dist/{strategy → cjs/strategy}/index.d.ts +50 -0
- package/dist/cjs/strategy/index.d.ts.map +1 -0
- package/dist/cjs/strategy/index.js +92 -0
- package/dist/cjs/strategy/index.js.map +7 -0
- package/dist/cjs/ta/index.d.ts +1397 -0
- package/dist/cjs/ta/index.d.ts.map +1 -0
- package/dist/cjs/ta/index.js +1715 -0
- package/dist/cjs/ta/index.js.map +7 -0
- package/dist/cjs/ta/running-sum.d.ts +30 -0
- package/dist/cjs/ta/running-sum.d.ts.map +1 -0
- package/dist/cjs/ta/running-sum.js +99 -0
- package/dist/cjs/ta/running-sum.js.map +7 -0
- package/dist/cjs/ta-series.d.ts +558 -0
- package/dist/cjs/ta-series.d.ts.map +1 -0
- package/dist/cjs/ta-series.js +606 -0
- package/dist/cjs/ta-series.js.map +7 -0
- package/dist/cjs/text/index.d.ts +14 -0
- package/dist/cjs/text/index.d.ts.map +1 -0
- package/dist/cjs/text/index.js +29 -0
- package/dist/cjs/text/index.js.map +7 -0
- package/dist/cjs/time/datestring.d.ts +23 -0
- package/dist/cjs/time/datestring.d.ts.map +1 -0
- package/dist/cjs/time/datestring.js +106 -0
- package/dist/cjs/time/datestring.js.map +7 -0
- package/dist/cjs/time/index.d.ts +89 -0
- package/dist/cjs/time/index.d.ts.map +1 -0
- package/dist/cjs/time/index.js +85 -0
- package/dist/cjs/time/index.js.map +7 -0
- package/dist/cjs/time/session.d.ts +17 -0
- package/dist/cjs/time/session.d.ts.map +1 -0
- package/dist/cjs/time/session.js +65 -0
- package/dist/cjs/time/session.js.map +7 -0
- package/dist/cjs/time/timezone.d.ts +40 -0
- package/dist/cjs/time/timezone.d.ts.map +1 -0
- package/dist/cjs/time/timezone.js +125 -0
- package/dist/cjs/time/timezone.js.map +7 -0
- package/dist/cjs/timeframe/index.d.ts +73 -0
- package/dist/cjs/timeframe/index.d.ts.map +1 -0
- package/dist/cjs/timeframe/index.js +85 -0
- package/dist/cjs/timeframe/index.js.map +7 -0
- package/dist/cjs/types/index.d.ts +343 -0
- package/dist/cjs/types/index.d.ts.map +1 -0
- package/dist/cjs/types/index.js +32 -0
- package/dist/cjs/types/index.js.map +7 -0
- package/dist/cjs/types/metadata.d.ts +300 -0
- package/dist/cjs/types/metadata.d.ts.map +1 -0
- package/dist/cjs/types/metadata.js +17 -0
- package/dist/cjs/types/metadata.js.map +7 -0
- package/dist/cjs/utils/index.d.ts +167 -0
- package/dist/cjs/utils/index.d.ts.map +1 -0
- package/dist/cjs/utils/index.js +209 -0
- package/dist/cjs/utils/index.js.map +7 -0
- package/dist/esm/array/index.d.ts +701 -0
- package/dist/esm/array/index.d.ts.map +1 -0
- package/dist/esm/array/index.js +983 -0
- package/dist/esm/array/index.js.map +1 -0
- package/dist/esm/box/index.d.ts +444 -0
- package/dist/esm/box/index.d.ts.map +1 -0
- package/dist/esm/box/index.js +602 -0
- package/dist/esm/box/index.js.map +1 -0
- package/dist/esm/callsite/index.d.ts +61 -0
- package/dist/esm/callsite/index.d.ts.map +1 -0
- package/dist/esm/callsite/index.js +97 -0
- package/dist/esm/callsite/index.js.map +1 -0
- package/dist/esm/chartpoint/index.d.ts +90 -0
- package/dist/esm/chartpoint/index.d.ts.map +1 -0
- package/dist/esm/chartpoint/index.js +113 -0
- package/dist/esm/chartpoint/index.js.map +1 -0
- package/dist/esm/color/index.d.ts +285 -0
- package/dist/esm/color/index.d.ts.map +1 -0
- package/dist/esm/color/index.js +373 -0
- package/dist/esm/color/index.js.map +1 -0
- package/dist/esm/compare/index.d.ts +26 -0
- package/dist/esm/compare/index.d.ts.map +1 -0
- package/dist/esm/compare/index.js +39 -0
- package/dist/esm/compare/index.js.map +1 -0
- package/dist/esm/drawing/registry.d.ts +42 -0
- package/dist/esm/drawing/registry.d.ts.map +1 -0
- package/dist/esm/drawing/registry.js +89 -0
- package/dist/esm/drawing/registry.js.map +1 -0
- package/dist/esm/index.d.ts +85 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +96 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/indicator.d.ts +117 -0
- package/dist/esm/indicator.d.ts.map +1 -0
- package/dist/esm/indicator.js +84 -0
- package/dist/esm/indicator.js.map +1 -0
- package/dist/esm/input.d.ts +196 -0
- package/dist/esm/input.d.ts.map +1 -0
- package/dist/esm/input.js +183 -0
- package/dist/esm/input.js.map +1 -0
- package/dist/esm/label/index.d.ts +303 -0
- package/dist/esm/label/index.d.ts.map +1 -0
- package/dist/esm/label/index.js +417 -0
- package/dist/esm/label/index.js.map +1 -0
- package/dist/esm/lib/index.d.ts +8 -0
- package/dist/esm/lib/index.d.ts.map +1 -0
- package/dist/esm/lib/index.js +8 -0
- package/dist/esm/lib/index.js.map +1 -0
- package/dist/esm/lib/zigzag/index.d.ts +5 -0
- package/dist/esm/lib/zigzag/index.d.ts.map +1 -0
- package/dist/esm/lib/zigzag/index.js +5 -0
- package/dist/esm/lib/zigzag/index.js.map +1 -0
- package/dist/esm/lib/zigzag/zigzag.d.ts +100 -0
- package/dist/esm/lib/zigzag/zigzag.d.ts.map +1 -0
- package/dist/esm/lib/zigzag/zigzag.js +229 -0
- package/dist/esm/lib/zigzag/zigzag.js.map +1 -0
- package/dist/esm/line/index.d.ts +342 -0
- package/dist/esm/line/index.d.ts.map +1 -0
- package/dist/esm/line/index.js +470 -0
- package/dist/esm/line/index.js.map +1 -0
- package/dist/esm/linefill/index.d.ts +124 -0
- package/dist/esm/linefill/index.d.ts.map +1 -0
- package/dist/esm/linefill/index.js +144 -0
- package/dist/esm/linefill/index.js.map +1 -0
- package/dist/esm/map/index.d.ts +69 -0
- package/dist/esm/map/index.d.ts.map +1 -0
- package/dist/esm/map/index.js +106 -0
- package/dist/esm/map/index.js.map +1 -0
- package/dist/esm/math/index.d.ts +560 -0
- package/dist/esm/math/index.d.ts.map +1 -0
- package/dist/esm/math/index.js +495 -0
- package/dist/esm/math/index.js.map +1 -0
- package/dist/esm/matrix/index.d.ts +1231 -0
- package/dist/esm/matrix/index.d.ts.map +1 -0
- package/dist/esm/matrix/index.js +2450 -0
- package/dist/esm/matrix/index.js.map +1 -0
- package/dist/esm/plot.d.ts +76 -0
- package/dist/esm/plot.d.ts.map +1 -0
- package/dist/esm/plot.js +63 -0
- package/dist/esm/plot.js.map +1 -0
- package/dist/esm/polyline/index.d.ts +115 -0
- package/dist/esm/polyline/index.d.ts.map +1 -0
- package/dist/esm/polyline/index.js +157 -0
- package/dist/esm/polyline/index.js.map +1 -0
- package/dist/esm/runtime/adapters/LightweightChartsAdapter.d.ts +86 -0
- package/dist/esm/runtime/adapters/LightweightChartsAdapter.d.ts.map +1 -0
- package/dist/esm/runtime/adapters/LightweightChartsAdapter.js +140 -0
- package/dist/esm/runtime/adapters/LightweightChartsAdapter.js.map +1 -0
- package/dist/esm/runtime/adapters/SimpleInputAdapter.d.ts +59 -0
- package/dist/esm/runtime/adapters/SimpleInputAdapter.d.ts.map +1 -0
- package/dist/esm/runtime/adapters/SimpleInputAdapter.js +115 -0
- package/dist/esm/runtime/adapters/SimpleInputAdapter.js.map +1 -0
- package/dist/esm/runtime/index.d.ts +13 -0
- package/dist/esm/runtime/index.d.ts.map +1 -0
- package/dist/esm/runtime/index.js +14 -0
- package/dist/esm/runtime/index.js.map +1 -0
- package/dist/esm/runtime/inputs.d.ts +91 -0
- package/dist/esm/runtime/inputs.d.ts.map +1 -0
- package/dist/esm/runtime/inputs.js +334 -0
- package/dist/esm/runtime/inputs.js.map +1 -0
- package/dist/esm/runtime/runtime.d.ts +70 -0
- package/dist/esm/runtime/runtime.d.ts.map +1 -0
- package/dist/esm/runtime/runtime.js +193 -0
- package/dist/esm/runtime/runtime.js.map +1 -0
- package/dist/esm/runtime/series.d.ts +362 -0
- package/dist/esm/runtime/series.d.ts.map +1 -0
- package/dist/esm/runtime/series.js +583 -0
- package/dist/esm/runtime/series.js.map +1 -0
- package/dist/esm/runtime/types.d.ts +282 -0
- package/dist/esm/runtime/types.d.ts.map +1 -0
- package/dist/esm/runtime/types.js +7 -0
- package/dist/esm/runtime/types.js.map +1 -0
- package/dist/esm/script/index.d.ts +987 -0
- package/dist/esm/script/index.d.ts.map +1 -0
- package/dist/esm/script/index.js +1289 -0
- package/dist/esm/script/index.js.map +1 -0
- package/dist/esm/security/resample.d.ts +63 -0
- package/dist/esm/security/resample.d.ts.map +1 -0
- package/dist/esm/security/resample.js +110 -0
- package/dist/esm/security/resample.js.map +1 -0
- package/dist/esm/session/bars.d.ts +80 -0
- package/dist/esm/session/bars.d.ts.map +1 -0
- package/dist/esm/session/bars.js +232 -0
- package/dist/esm/session/bars.js.map +1 -0
- package/dist/esm/session/calendar.d.ts +70 -0
- package/dist/esm/session/calendar.d.ts.map +1 -0
- package/dist/esm/session/calendar.js +172 -0
- package/dist/esm/session/calendar.js.map +1 -0
- package/dist/esm/str/dateformat.d.ts +15 -0
- package/dist/esm/str/dateformat.d.ts.map +1 -0
- package/dist/esm/str/dateformat.js +136 -0
- package/dist/esm/str/dateformat.js.map +1 -0
- package/dist/esm/str/index.d.ts +459 -0
- package/dist/esm/str/index.d.ts.map +1 -0
- package/dist/esm/str/index.js +540 -0
- package/dist/esm/str/index.js.map +1 -0
- package/dist/esm/str/messageformat.d.ts +14 -0
- package/dist/esm/str/messageformat.d.ts.map +1 -0
- package/dist/esm/str/messageformat.js +111 -0
- package/dist/esm/str/messageformat.js.map +1 -0
- package/dist/esm/str/numberformat.d.ts +19 -0
- package/dist/esm/str/numberformat.d.ts.map +1 -0
- package/dist/esm/str/numberformat.js +189 -0
- package/dist/esm/str/numberformat.js.map +1 -0
- package/dist/esm/strategy/index.d.ts +245 -0
- package/dist/esm/strategy/index.d.ts.map +1 -0
- package/dist/esm/strategy/index.js +84 -0
- package/dist/esm/strategy/index.js.map +1 -0
- package/dist/esm/ta/index.d.ts +1397 -0
- package/dist/esm/ta/index.d.ts.map +1 -0
- package/dist/esm/ta/index.js +3227 -0
- package/dist/esm/ta/index.js.map +1 -0
- package/dist/esm/ta/running-sum.d.ts +30 -0
- package/dist/esm/ta/running-sum.d.ts.map +1 -0
- package/dist/esm/ta/running-sum.js +113 -0
- package/dist/esm/ta/running-sum.js.map +1 -0
- package/dist/esm/ta-series.d.ts +558 -0
- package/dist/esm/ta-series.d.ts.map +1 -0
- package/dist/esm/ta-series.js +910 -0
- package/dist/esm/ta-series.js.map +1 -0
- package/dist/esm/text/index.d.ts +14 -0
- package/dist/esm/text/index.d.ts.map +1 -0
- package/dist/esm/text/index.js +14 -0
- package/dist/esm/text/index.js.map +1 -0
- package/dist/esm/time/datestring.d.ts +23 -0
- package/dist/esm/time/datestring.d.ts.map +1 -0
- package/dist/esm/time/datestring.js +94 -0
- package/dist/esm/time/datestring.js.map +1 -0
- package/dist/esm/time/index.d.ts +89 -0
- package/dist/esm/time/index.d.ts.map +1 -0
- package/dist/esm/time/index.js +108 -0
- package/dist/esm/time/index.js.map +1 -0
- package/dist/esm/time/session.d.ts +17 -0
- package/dist/esm/time/session.d.ts.map +1 -0
- package/dist/esm/time/session.js +69 -0
- package/dist/esm/time/session.js.map +1 -0
- package/dist/esm/time/timezone.d.ts +40 -0
- package/dist/esm/time/timezone.d.ts.map +1 -0
- package/dist/esm/time/timezone.js +144 -0
- package/dist/esm/time/timezone.js.map +1 -0
- package/dist/esm/timeframe/index.d.ts +73 -0
- package/dist/esm/timeframe/index.d.ts.map +1 -0
- package/dist/esm/timeframe/index.js +131 -0
- package/dist/esm/timeframe/index.js.map +1 -0
- package/dist/esm/types/index.d.ts +343 -0
- package/dist/esm/types/index.d.ts.map +1 -0
- package/dist/esm/types/index.js +17 -0
- package/dist/esm/types/index.js.map +1 -0
- package/dist/esm/types/metadata.d.ts +300 -0
- package/dist/esm/types/metadata.d.ts.map +1 -0
- package/dist/esm/types/metadata.js +7 -0
- package/dist/esm/types/metadata.js.map +1 -0
- package/dist/esm/utils/index.d.ts +167 -0
- package/dist/esm/utils/index.d.ts.map +1 -0
- package/dist/esm/utils/index.js +295 -0
- package/dist/esm/utils/index.js.map +1 -0
- package/package.json +53 -23
- package/src/array/index.ts +1056 -0
- package/src/box/index.ts +680 -0
- package/src/callsite/index.ts +104 -0
- package/src/chartpoint/index.ts +126 -0
- package/src/color/index.ts +411 -0
- package/src/compare/index.ts +46 -0
- package/src/drawing/registry.ts +106 -0
- package/src/index.ts +201 -0
- package/src/indicator.ts +185 -0
- package/src/input.ts +280 -0
- package/src/label/index.ts +490 -0
- package/src/lib/index.ts +8 -0
- package/src/lib/zigzag/index.ts +13 -0
- package/src/lib/zigzag/zigzag.ts +318 -0
- package/src/line/index.ts +530 -0
- package/src/linefill/index.ts +152 -0
- package/src/map/index.ts +115 -0
- package/src/math/index.ts +1071 -0
- package/src/matrix/index.ts +2697 -0
- package/src/plot.ts +121 -0
- package/src/polyline/index.ts +184 -0
- package/src/runtime/adapters/LightweightChartsAdapter.ts +201 -0
- package/src/runtime/adapters/SimpleInputAdapter.ts +132 -0
- package/src/runtime/index.ts +52 -0
- package/src/runtime/inputs.ts +377 -0
- package/src/runtime/runtime.ts +241 -0
- package/src/runtime/series.ts +644 -0
- package/src/runtime/types.ts +292 -0
- package/src/script/index.ts +1865 -0
- package/src/security/resample.ts +119 -0
- package/src/session/bars.ts +262 -0
- package/src/session/calendar.ts +199 -0
- package/src/str/dateformat.ts +104 -0
- package/src/str/index.ts +557 -0
- package/src/str/messageformat.ts +109 -0
- package/src/str/numberformat.ts +197 -0
- package/src/strategy/index.ts +281 -0
- package/src/ta/index.ts +3580 -0
- package/src/ta/running-sum.ts +117 -0
- package/src/ta-series.ts +1036 -0
- package/src/text/index.ts +14 -0
- package/src/time/datestring.ts +96 -0
- package/src/time/index.ts +161 -0
- package/src/time/session.ts +79 -0
- package/src/time/timezone.ts +180 -0
- package/src/timeframe/index.ts +144 -0
- package/src/types/index.ts +398 -0
- package/src/types/metadata.ts +334 -0
- package/src/utils/index.ts +334 -0
- package/dist/array/index.d.ts +0 -57
- package/dist/array/index.d.ts.map +0 -1
- package/dist/box/index.d.ts +0 -37
- package/dist/box/index.d.ts.map +0 -1
- package/dist/callsite/index.d.ts +0 -7
- package/dist/callsite/index.d.ts.map +0 -1
- package/dist/chartpoint/index.d.ts +0 -8
- package/dist/chartpoint/index.d.ts.map +0 -1
- package/dist/color/index.d.ts +0 -28
- package/dist/color/index.d.ts.map +0 -1
- package/dist/compare/index.d.ts +0 -8
- package/dist/compare/index.d.ts.map +0 -1
- package/dist/drawing/registry.d.ts +0 -19
- package/dist/drawing/registry.d.ts.map +0 -1
- package/dist/index.cjs +0 -7979
- package/dist/index.d.ts +0 -64
- package/dist/index.d.ts.map +0 -1
- package/dist/index.mjs +0 -7962
- package/dist/indicator.d.ts +0 -42
- package/dist/indicator.d.ts.map +0 -1
- package/dist/input.d.ts +0 -47
- package/dist/input.d.ts.map +0 -1
- package/dist/label/index.d.ts +0 -30
- package/dist/label/index.d.ts.map +0 -1
- package/dist/lib/index.d.ts +0 -2
- package/dist/lib/index.d.ts.map +0 -1
- package/dist/lib/zigzag/index.d.ts.map +0 -1
- package/dist/lib/zigzag/zigzag.d.ts +0 -47
- package/dist/lib/zigzag/zigzag.d.ts.map +0 -1
- package/dist/line/index.d.ts +0 -30
- package/dist/line/index.d.ts.map +0 -1
- package/dist/linefill/index.d.ts +0 -10
- package/dist/linefill/index.d.ts.map +0 -1
- package/dist/map/index.d.ts +0 -14
- package/dist/map/index.d.ts.map +0 -1
- package/dist/math/index.d.ts +0 -53
- package/dist/math/index.d.ts.map +0 -1
- package/dist/matrix/index.d.ts +0 -52
- package/dist/matrix/index.d.ts.map +0 -1
- package/dist/plot.d.ts +0 -20
- package/dist/plot.d.ts.map +0 -1
- package/dist/polyline/index.d.ts +0 -11
- package/dist/polyline/index.d.ts.map +0 -1
- package/dist/runtime/adapters/LightweightChartsAdapter.d.ts +0 -15
- package/dist/runtime/adapters/LightweightChartsAdapter.d.ts.map +0 -1
- package/dist/runtime/adapters/SimpleInputAdapter.d.ts +0 -16
- package/dist/runtime/adapters/SimpleInputAdapter.d.ts.map +0 -1
- package/dist/runtime/index.cjs +0 -600
- package/dist/runtime/index.d.ts.map +0 -1
- package/dist/runtime/index.mjs +0 -577
- package/dist/runtime/inputs.d.ts +0 -13
- package/dist/runtime/inputs.d.ts.map +0 -1
- package/dist/runtime/runtime.d.ts +0 -16
- package/dist/runtime/runtime.d.ts.map +0 -1
- package/dist/runtime/series.d.ts +0 -60
- package/dist/runtime/series.d.ts.map +0 -1
- package/dist/runtime/types.d.ts +0 -122
- package/dist/runtime/types.d.ts.map +0 -1
- package/dist/script/index.cjs +0 -6372
- package/dist/script/index.d.ts +0 -709
- package/dist/script/index.d.ts.map +0 -1
- package/dist/script/index.mjs +0 -6355
- package/dist/security/resample.d.ts +0 -13
- package/dist/security/resample.d.ts.map +0 -1
- package/dist/session/bars.d.ts +0 -34
- package/dist/session/bars.d.ts.map +0 -1
- package/dist/session/calendar.d.ts +0 -31
- package/dist/session/calendar.d.ts.map +0 -1
- package/dist/str/dateformat.d.ts +0 -2
- package/dist/str/dateformat.d.ts.map +0 -1
- package/dist/str/index.d.ts +0 -24
- package/dist/str/index.d.ts.map +0 -1
- package/dist/str/messageformat.d.ts +0 -2
- package/dist/str/messageformat.d.ts.map +0 -1
- package/dist/str/numberformat.d.ts +0 -3
- package/dist/str/numberformat.d.ts.map +0 -1
- package/dist/strategy/index.d.ts.map +0 -1
- package/dist/ta/index.d.ts +0 -72
- package/dist/ta/index.d.ts.map +0 -1
- package/dist/ta-series.d.ts +0 -143
- package/dist/ta-series.d.ts.map +0 -1
- package/dist/text/index.d.ts +0 -4
- package/dist/text/index.d.ts.map +0 -1
- package/dist/time/datestring.d.ts +0 -2
- package/dist/time/datestring.d.ts.map +0 -1
- package/dist/time/index.d.ts +0 -15
- package/dist/time/index.d.ts.map +0 -1
- package/dist/time/session.d.ts +0 -2
- package/dist/time/session.d.ts.map +0 -1
- package/dist/time/timezone.d.ts +0 -13
- package/dist/time/timezone.d.ts.map +0 -1
- package/dist/timeframe/index.d.ts +0 -17
- package/dist/timeframe/index.d.ts.map +0 -1
- package/dist/types/index.d.ts +0 -181
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/metadata.d.ts +0 -131
- package/dist/types/metadata.d.ts.map +0 -1
- package/dist/utils/index.d.ts +0 -26
- package/dist/utils/index.d.ts.map +0 -1
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Idempotent input registration functions
|
|
3
|
+
* These functions mirror PineScript's input functions with idempotent semantics:
|
|
4
|
+
* - First call registers the input with default value
|
|
5
|
+
* - Subsequent calls return the current stored value (possibly user-updated)
|
|
6
|
+
* @module runtime/inputs
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { InputConfig, InputOptions } from './types.js';
|
|
10
|
+
import { getContext, recalculate } from './runtime.js';
|
|
11
|
+
|
|
12
|
+
// Track registered inputs for idempotent registration
|
|
13
|
+
const registeredInputs = new Map<string, boolean>();
|
|
14
|
+
|
|
15
|
+
// Track if we should auto-recalculate on input change
|
|
16
|
+
let autoRecalculateEnabled = false;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Enable automatic recalculation when inputs change
|
|
20
|
+
*/
|
|
21
|
+
export function enableAutoRecalculate(): void {
|
|
22
|
+
autoRecalculateEnabled = true;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Disable automatic recalculation
|
|
27
|
+
*/
|
|
28
|
+
export function disableAutoRecalculate(): void {
|
|
29
|
+
autoRecalculateEnabled = false;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Reset registered inputs (for testing or context changes)
|
|
34
|
+
* @internal
|
|
35
|
+
*/
|
|
36
|
+
export function resetInputs(): void {
|
|
37
|
+
registeredInputs.clear();
|
|
38
|
+
inputCounter = 0;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Counter for generating unique input IDs when no title is provided
|
|
42
|
+
let inputCounter = 0;
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Generate a unique input ID from title or default
|
|
46
|
+
* @param title - Optional title
|
|
47
|
+
* @param defval - Default value for fallback
|
|
48
|
+
* @param type - Input type
|
|
49
|
+
* @returns Unique input ID
|
|
50
|
+
*/
|
|
51
|
+
function generateInputId(title: string | undefined, defval: unknown, type: string): string {
|
|
52
|
+
if (title) {
|
|
53
|
+
return title.replace(/\s+/g, '_');
|
|
54
|
+
}
|
|
55
|
+
// Use counter to ensure uniqueness when no title is provided
|
|
56
|
+
return `${type}_${inputCounter++}_${String(defval)}`;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Register an integer input
|
|
61
|
+
* First call registers with defval, subsequent calls return current value
|
|
62
|
+
* @param defval - Default value
|
|
63
|
+
* @param title - Display title (optional)
|
|
64
|
+
* @param options - Additional options: min, max, step (optional)
|
|
65
|
+
* @returns Current integer value
|
|
66
|
+
*/
|
|
67
|
+
export function input_int(defval: number, title?: string, options?: InputOptions): number {
|
|
68
|
+
const context = getContext();
|
|
69
|
+
if (!context) {
|
|
70
|
+
// No context - return default value
|
|
71
|
+
return Math.floor(defval);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const id = generateInputId(title, defval, 'int');
|
|
75
|
+
const config: InputConfig = {
|
|
76
|
+
id,
|
|
77
|
+
type: 'int',
|
|
78
|
+
defval: Math.floor(defval),
|
|
79
|
+
title,
|
|
80
|
+
min: options?.min,
|
|
81
|
+
max: options?.max,
|
|
82
|
+
step: options?.step ?? 1,
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
// Check if already registered (idempotent)
|
|
86
|
+
if (!registeredInputs.has(id)) {
|
|
87
|
+
// First call - register the input
|
|
88
|
+
context.inputs.registerInput(config);
|
|
89
|
+
registeredInputs.set(id, true);
|
|
90
|
+
|
|
91
|
+
// Set up auto-recalculate on change if not already done
|
|
92
|
+
if (autoRecalculateEnabled) {
|
|
93
|
+
context.inputs.onInputChange((changedId) => {
|
|
94
|
+
if (changedId === id) {
|
|
95
|
+
recalculate();
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// Return current value (may have been updated by user)
|
|
102
|
+
const value = context.inputs.getValue(id);
|
|
103
|
+
return typeof value === 'number' ? Math.floor(value) : Math.floor(defval);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Register a float input
|
|
108
|
+
* First call registers with defval, subsequent calls return current value
|
|
109
|
+
* @param defval - Default value
|
|
110
|
+
* @param title - Display title (optional)
|
|
111
|
+
* @param options - Additional options: min, max, step (optional)
|
|
112
|
+
* @returns Current float value
|
|
113
|
+
*/
|
|
114
|
+
export function input_float(defval: number, title?: string, options?: InputOptions): number {
|
|
115
|
+
const context = getContext();
|
|
116
|
+
if (!context) {
|
|
117
|
+
// No context - return default value
|
|
118
|
+
return defval;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const id = generateInputId(title, defval, 'float');
|
|
122
|
+
const config: InputConfig = {
|
|
123
|
+
id,
|
|
124
|
+
type: 'float',
|
|
125
|
+
defval,
|
|
126
|
+
title,
|
|
127
|
+
min: options?.min,
|
|
128
|
+
max: options?.max,
|
|
129
|
+
step: options?.step ?? 0.1,
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
// Check if already registered (idempotent)
|
|
133
|
+
if (!registeredInputs.has(id)) {
|
|
134
|
+
context.inputs.registerInput(config);
|
|
135
|
+
registeredInputs.set(id, true);
|
|
136
|
+
|
|
137
|
+
if (autoRecalculateEnabled) {
|
|
138
|
+
context.inputs.onInputChange((changedId) => {
|
|
139
|
+
if (changedId === id) {
|
|
140
|
+
recalculate();
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
const value = context.inputs.getValue(id);
|
|
147
|
+
return typeof value === 'number' ? value : defval;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Register a boolean input
|
|
152
|
+
* First call registers with defval, subsequent calls return current value
|
|
153
|
+
* @param defval - Default value
|
|
154
|
+
* @param title - Display title (optional)
|
|
155
|
+
* @returns Current boolean value
|
|
156
|
+
*/
|
|
157
|
+
export function input_bool(defval: boolean, title?: string): boolean {
|
|
158
|
+
const context = getContext();
|
|
159
|
+
if (!context) {
|
|
160
|
+
return defval;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
const id = generateInputId(title, defval, 'bool');
|
|
164
|
+
const config: InputConfig = {
|
|
165
|
+
id,
|
|
166
|
+
type: 'bool',
|
|
167
|
+
defval,
|
|
168
|
+
title,
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
if (!registeredInputs.has(id)) {
|
|
172
|
+
context.inputs.registerInput(config);
|
|
173
|
+
registeredInputs.set(id, true);
|
|
174
|
+
|
|
175
|
+
if (autoRecalculateEnabled) {
|
|
176
|
+
context.inputs.onInputChange((changedId) => {
|
|
177
|
+
if (changedId === id) {
|
|
178
|
+
recalculate();
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
const value = context.inputs.getValue(id);
|
|
185
|
+
return typeof value === 'boolean' ? value : defval;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Register a string input
|
|
190
|
+
* First call registers with defval, subsequent calls return current value
|
|
191
|
+
* @param defval - Default value
|
|
192
|
+
* @param title - Display title (optional)
|
|
193
|
+
* @param options - Array of string options for dropdown (optional)
|
|
194
|
+
* @returns Current string value
|
|
195
|
+
*/
|
|
196
|
+
export function input_string(defval: string, title?: string, options?: string[]): string {
|
|
197
|
+
const context = getContext();
|
|
198
|
+
if (!context) {
|
|
199
|
+
return defval;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
const id = generateInputId(title, defval, 'string');
|
|
203
|
+
const config: InputConfig = {
|
|
204
|
+
id,
|
|
205
|
+
type: 'string',
|
|
206
|
+
defval,
|
|
207
|
+
title,
|
|
208
|
+
options,
|
|
209
|
+
};
|
|
210
|
+
|
|
211
|
+
if (!registeredInputs.has(id)) {
|
|
212
|
+
context.inputs.registerInput(config);
|
|
213
|
+
registeredInputs.set(id, true);
|
|
214
|
+
|
|
215
|
+
if (autoRecalculateEnabled) {
|
|
216
|
+
context.inputs.onInputChange((changedId) => {
|
|
217
|
+
if (changedId === id) {
|
|
218
|
+
recalculate();
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
const value = context.inputs.getValue(id);
|
|
225
|
+
return typeof value === 'string' ? value : defval;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Registers `config` once (idempotent) and returns the current stored value.
|
|
230
|
+
*/
|
|
231
|
+
function registerOnce(config: InputConfig): unknown {
|
|
232
|
+
const context = getContext()!;
|
|
233
|
+
if (!registeredInputs.has(config.id)) {
|
|
234
|
+
context.inputs.registerInput(config);
|
|
235
|
+
registeredInputs.set(config.id, true);
|
|
236
|
+
|
|
237
|
+
if (autoRecalculateEnabled) {
|
|
238
|
+
context.inputs.onInputChange((changedId) => {
|
|
239
|
+
if (changedId === config.id) {
|
|
240
|
+
recalculate();
|
|
241
|
+
}
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
return context.inputs.getValue(config.id);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* Register a timeframe input (PineScript `input.timeframe`)
|
|
250
|
+
* First call registers with defval, subsequent calls return current value
|
|
251
|
+
* @param defval - Default timeframe string ("60", "1D", "W"); "" means the chart timeframe
|
|
252
|
+
* @param title - Display title (optional)
|
|
253
|
+
* @param options - Array of timeframe options for dropdown (optional)
|
|
254
|
+
* @returns Current timeframe string
|
|
255
|
+
*/
|
|
256
|
+
export function input_timeframe(defval: string, title?: string, options?: string[]): string {
|
|
257
|
+
if (!getContext()) {
|
|
258
|
+
return defval;
|
|
259
|
+
}
|
|
260
|
+
const value = registerOnce({ id: generateInputId(title, defval, 'timeframe'), type: 'timeframe', defval, title, options });
|
|
261
|
+
return typeof value === 'string' ? value : defval;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Register a session input (PineScript `input.session`)
|
|
266
|
+
* First call registers with defval, subsequent calls return current value
|
|
267
|
+
* @param defval - Default session string ("0930-1600", "0930-1600:23456")
|
|
268
|
+
* @param title - Display title (optional)
|
|
269
|
+
* @param options - Array of session options for dropdown (optional)
|
|
270
|
+
* @returns Current session string
|
|
271
|
+
*/
|
|
272
|
+
export function input_session(defval: string, title?: string, options?: string[]): string {
|
|
273
|
+
if (!getContext()) {
|
|
274
|
+
return defval;
|
|
275
|
+
}
|
|
276
|
+
const value = registerOnce({ id: generateInputId(title, defval, 'session'), type: 'session', defval, title, options });
|
|
277
|
+
return typeof value === 'string' ? value : defval;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Register a date/time input (PineScript `input.time`)
|
|
282
|
+
* First call registers with defval, subsequent calls return current value
|
|
283
|
+
* @param defval - Default UNIX time in milliseconds, e.g. `time.timestamp("2024-01-01")`
|
|
284
|
+
* @param title - Display title (optional)
|
|
285
|
+
* @returns Current UNIX time in milliseconds
|
|
286
|
+
*/
|
|
287
|
+
export function input_time(defval: number, title?: string): number {
|
|
288
|
+
if (!getContext()) {
|
|
289
|
+
return defval;
|
|
290
|
+
}
|
|
291
|
+
const value = registerOnce({ id: generateInputId(title, defval, 'time'), type: 'time', defval, title });
|
|
292
|
+
return typeof value === 'number' ? value : defval;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/**
|
|
296
|
+
* Register a source input (returns a data series from OHLCV)
|
|
297
|
+
* First call registers with defval, subsequent calls return current value
|
|
298
|
+
* @param defval - Default source name ('close', 'open', 'high', 'low', 'volume', 'hl2', 'hlc3', 'ohlc4')
|
|
299
|
+
* @param title - Display title (optional)
|
|
300
|
+
* @returns Array of values for the selected source
|
|
301
|
+
*/
|
|
302
|
+
export function input_source(defval: string, title?: string): number[] {
|
|
303
|
+
const context = getContext();
|
|
304
|
+
if (!context) {
|
|
305
|
+
return [];
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
const id = generateInputId(title, defval, 'source');
|
|
309
|
+
const config: InputConfig = {
|
|
310
|
+
id,
|
|
311
|
+
type: 'source',
|
|
312
|
+
defval,
|
|
313
|
+
title,
|
|
314
|
+
options: ['open', 'high', 'low', 'close', 'volume', 'hl2', 'hlc3', 'ohlc4'],
|
|
315
|
+
};
|
|
316
|
+
|
|
317
|
+
if (!registeredInputs.has(id)) {
|
|
318
|
+
context.inputs.registerInput(config);
|
|
319
|
+
registeredInputs.set(id, true);
|
|
320
|
+
|
|
321
|
+
if (autoRecalculateEnabled) {
|
|
322
|
+
context.inputs.onInputChange((changedId) => {
|
|
323
|
+
if (changedId === id) {
|
|
324
|
+
recalculate();
|
|
325
|
+
}
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
const sourceName = (context.inputs.getValue(id) as string) ?? defval;
|
|
331
|
+
|
|
332
|
+
return getSourceData(context.ohlcv, sourceName);
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
/**
|
|
336
|
+
* Get data array for a source name
|
|
337
|
+
* @param ohlcv - OHLCV data
|
|
338
|
+
* @param sourceName - Source name
|
|
339
|
+
* @returns Array of values
|
|
340
|
+
*/
|
|
341
|
+
function getSourceData(
|
|
342
|
+
ohlcv: { open: number[]; high: number[]; low: number[]; close: number[]; volume: number[] },
|
|
343
|
+
sourceName: string
|
|
344
|
+
): number[] {
|
|
345
|
+
switch (sourceName) {
|
|
346
|
+
case 'open':
|
|
347
|
+
return ohlcv.open;
|
|
348
|
+
case 'high':
|
|
349
|
+
return ohlcv.high;
|
|
350
|
+
case 'low':
|
|
351
|
+
return ohlcv.low;
|
|
352
|
+
case 'close':
|
|
353
|
+
return ohlcv.close;
|
|
354
|
+
case 'volume':
|
|
355
|
+
return ohlcv.volume;
|
|
356
|
+
case 'hl2':
|
|
357
|
+
return ohlcv.high.map((h, i) => {
|
|
358
|
+
const l = ohlcv.low[i];
|
|
359
|
+
return l !== undefined ? (h + l) / 2 : NaN;
|
|
360
|
+
});
|
|
361
|
+
case 'hlc3':
|
|
362
|
+
return ohlcv.high.map((h, i) => {
|
|
363
|
+
const l = ohlcv.low[i];
|
|
364
|
+
const c = ohlcv.close[i];
|
|
365
|
+
return l !== undefined && c !== undefined ? (h + l + c) / 3 : NaN;
|
|
366
|
+
});
|
|
367
|
+
case 'ohlc4':
|
|
368
|
+
return ohlcv.open.map((o, i) => {
|
|
369
|
+
const h = ohlcv.high[i];
|
|
370
|
+
const l = ohlcv.low[i];
|
|
371
|
+
const c = ohlcv.close[i];
|
|
372
|
+
return h !== undefined && l !== undefined && c !== undefined ? (o + h + l + c) / 4 : NaN;
|
|
373
|
+
});
|
|
374
|
+
default:
|
|
375
|
+
return ohlcv.close;
|
|
376
|
+
}
|
|
377
|
+
}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview OakScriptJS Runtime - Context management and plot functions
|
|
3
|
+
* This module provides the global runtime context for indicator execution
|
|
4
|
+
* @module runtime/runtime
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { OakScriptContext, SeriesHandle, SeriesOptions } from './types.js';
|
|
8
|
+
|
|
9
|
+
// Global context state
|
|
10
|
+
let context: OakScriptContext | null = null;
|
|
11
|
+
|
|
12
|
+
// Registered calculate function for recalculation
|
|
13
|
+
let calculateFn: (() => void) | null = null;
|
|
14
|
+
|
|
15
|
+
// Track active plots for cleanup
|
|
16
|
+
interface ActivePlot {
|
|
17
|
+
id: string;
|
|
18
|
+
series: SeriesHandle;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const activePlots: ActivePlot[] = [];
|
|
22
|
+
|
|
23
|
+
// Counter for generating unique plot IDs
|
|
24
|
+
let plotCounter = 0;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Set the global OakScript context
|
|
28
|
+
* Must be called by host application before any indicator calculation
|
|
29
|
+
* @param ctx - The context object with chart and input adapters
|
|
30
|
+
*/
|
|
31
|
+
export function setContext(ctx: OakScriptContext): void {
|
|
32
|
+
context = ctx;
|
|
33
|
+
// Reset plot counter and clear active plots when context changes
|
|
34
|
+
plotCounter = 0;
|
|
35
|
+
clearPlots();
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Clear the global context
|
|
40
|
+
* Call when detaching/removing an indicator
|
|
41
|
+
*/
|
|
42
|
+
export function clearContext(): void {
|
|
43
|
+
clearPlots();
|
|
44
|
+
context = null;
|
|
45
|
+
calculateFn = null;
|
|
46
|
+
plotCounter = 0;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Get the current global context
|
|
51
|
+
* @returns The current context or null if not set
|
|
52
|
+
*/
|
|
53
|
+
export function getContext(): OakScriptContext | null {
|
|
54
|
+
return context;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Register the calculate function for recalculation
|
|
59
|
+
* Indicators call this to enable automatic recalculation on input changes
|
|
60
|
+
* @param fn - The calculate function to register
|
|
61
|
+
*/
|
|
62
|
+
export function registerCalculate(fn: () => void): void {
|
|
63
|
+
calculateFn = fn;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Trigger recalculation of the current indicator
|
|
68
|
+
* Clears existing plots and re-invokes the registered calculate function
|
|
69
|
+
*/
|
|
70
|
+
export function recalculate(): void {
|
|
71
|
+
if (calculateFn) {
|
|
72
|
+
clearPlots();
|
|
73
|
+
plotCounter = 0;
|
|
74
|
+
calculateFn();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Clear all active plots from the chart
|
|
80
|
+
* Called internally before recalculation
|
|
81
|
+
*/
|
|
82
|
+
export function clearPlots(): void {
|
|
83
|
+
if (context) {
|
|
84
|
+
for (const plot of activePlots) {
|
|
85
|
+
try {
|
|
86
|
+
context.chart.removeSeries(plot.series);
|
|
87
|
+
} catch {
|
|
88
|
+
// Ignore errors during cleanup
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
activePlots.length = 0;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Map plot style string to lightweight-charts series type
|
|
97
|
+
* @param style - Plot style string
|
|
98
|
+
* @returns Series type string
|
|
99
|
+
*/
|
|
100
|
+
function getSeriesType(style?: string): string {
|
|
101
|
+
switch (style) {
|
|
102
|
+
case 'histogram':
|
|
103
|
+
case 'columns':
|
|
104
|
+
return 'histogram';
|
|
105
|
+
case 'area':
|
|
106
|
+
case 'areabr':
|
|
107
|
+
return 'area';
|
|
108
|
+
case 'circles':
|
|
109
|
+
case 'cross':
|
|
110
|
+
return 'line'; // Use line with markers
|
|
111
|
+
default:
|
|
112
|
+
return 'line';
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Map line style string to numeric value
|
|
118
|
+
* @param style - Line style string
|
|
119
|
+
* @returns Numeric line style
|
|
120
|
+
*/
|
|
121
|
+
function getLineStyle(style?: string): number {
|
|
122
|
+
switch (style) {
|
|
123
|
+
case 'dotted':
|
|
124
|
+
return 1;
|
|
125
|
+
case 'dashed':
|
|
126
|
+
return 2;
|
|
127
|
+
case 'solid':
|
|
128
|
+
default:
|
|
129
|
+
return 0;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Plot a series on the chart
|
|
135
|
+
* @param series - Array of values to plot
|
|
136
|
+
* @param title - Plot title (optional)
|
|
137
|
+
* @param color - Plot color (optional)
|
|
138
|
+
* @param linewidth - Line width (optional)
|
|
139
|
+
* @param style - Plot style (optional)
|
|
140
|
+
* @returns Unique plot ID for this plot
|
|
141
|
+
*/
|
|
142
|
+
export function plot(
|
|
143
|
+
series: number[],
|
|
144
|
+
title?: string,
|
|
145
|
+
color?: string,
|
|
146
|
+
linewidth?: number,
|
|
147
|
+
style?: string,
|
|
148
|
+
colors?: string[]
|
|
149
|
+
): string {
|
|
150
|
+
if (!context) {
|
|
151
|
+
throw new Error('OakScript context not set. Call setContext() before plotting.');
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
const plotId = `plot_${plotCounter++}${title ? '_' + title.replace(/\s+/g, '_') : ''}`;
|
|
155
|
+
|
|
156
|
+
const seriesType = getSeriesType(style);
|
|
157
|
+
const options: SeriesOptions = {
|
|
158
|
+
color: color,
|
|
159
|
+
lineWidth: linewidth,
|
|
160
|
+
lineStyle: getLineStyle(style),
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
// Create series on chart
|
|
164
|
+
const seriesHandle = context.chart.addSeries(seriesType, options);
|
|
165
|
+
|
|
166
|
+
// Convert series data to time-value pairs
|
|
167
|
+
const data: Array<{ time: number; value: number; color?: string }> = [];
|
|
168
|
+
for (let index = 0; index < series.length; index++) {
|
|
169
|
+
const value = series[index];
|
|
170
|
+
const time = context.ohlcv.time[index];
|
|
171
|
+
if (time !== undefined && value !== undefined && !Number.isNaN(value)) {
|
|
172
|
+
const point: { time: number; value: number; color?: string } = { time, value };
|
|
173
|
+
if (colors && colors[index]) {
|
|
174
|
+
point.color = colors[index];
|
|
175
|
+
}
|
|
176
|
+
data.push(point);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// Set the data
|
|
181
|
+
seriesHandle.setData(data);
|
|
182
|
+
|
|
183
|
+
// Track the plot for cleanup
|
|
184
|
+
activePlots.push({ id: plotId, series: seriesHandle });
|
|
185
|
+
|
|
186
|
+
return plotId;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Draw a horizontal line on the chart
|
|
191
|
+
* @param price - Y-axis value for the line
|
|
192
|
+
* @param title - Line title (optional)
|
|
193
|
+
* @param color - Line color (optional)
|
|
194
|
+
* @param linestyle - Line style (optional, default dashed as PineScript)
|
|
195
|
+
* @param linewidth - Line width (optional)
|
|
196
|
+
* @returns Unique hline ID
|
|
197
|
+
*/
|
|
198
|
+
export function hline(
|
|
199
|
+
price: number,
|
|
200
|
+
title?: string,
|
|
201
|
+
color?: string,
|
|
202
|
+
linestyle?: string,
|
|
203
|
+
linewidth?: number
|
|
204
|
+
): string {
|
|
205
|
+
if (!context) {
|
|
206
|
+
throw new Error('OakScript context not set. Call setContext() before creating hlines.');
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
const hlineId = `hline_${plotCounter++}${title ? '_' + title.replace(/\s+/g, '_') : ''}`;
|
|
210
|
+
|
|
211
|
+
const options: SeriesOptions = {
|
|
212
|
+
color: color,
|
|
213
|
+
lineWidth: linewidth,
|
|
214
|
+
lineStyle: getLineStyle(linestyle ?? 'dashed'),
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
// Create a line series for the hline
|
|
218
|
+
const seriesHandle = context.chart.addSeries('line', options);
|
|
219
|
+
|
|
220
|
+
// Create horizontal line data (constant value across all time points)
|
|
221
|
+
const data = context.ohlcv.time.map(time => ({
|
|
222
|
+
time: time,
|
|
223
|
+
value: price,
|
|
224
|
+
}));
|
|
225
|
+
|
|
226
|
+
seriesHandle.setData(data);
|
|
227
|
+
|
|
228
|
+
// Track the hline for cleanup
|
|
229
|
+
activePlots.push({ id: hlineId, series: seriesHandle });
|
|
230
|
+
|
|
231
|
+
return hlineId;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Get the active plots array (for testing purposes)
|
|
236
|
+
* @returns Array of active plots
|
|
237
|
+
* @internal
|
|
238
|
+
*/
|
|
239
|
+
export function getActivePlots(): ReadonlyArray<ActivePlot> {
|
|
240
|
+
return activePlots;
|
|
241
|
+
}
|