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,219 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var bars_exports = {};
|
|
20
|
+
__export(bars_exports, {
|
|
21
|
+
SessionBars: () => SessionBars,
|
|
22
|
+
sessionFlags: () => sessionFlags
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(bars_exports);
|
|
25
|
+
var import_timeframe = require("../timeframe/index.js");
|
|
26
|
+
var import_calendar = require("./calendar.js");
|
|
27
|
+
function unitOf(tf) {
|
|
28
|
+
return { unit: tf.isdaily ? "D" : tf.isweekly ? "W" : "M", n: tf.multiplier };
|
|
29
|
+
}
|
|
30
|
+
const yearOf = (date) => Math.floor(date / 1e4);
|
|
31
|
+
const firstMonday = (year) => {
|
|
32
|
+
const jan1 = year * 1e4 + 101;
|
|
33
|
+
const monday = (0, import_calendar.weekStart)(jan1);
|
|
34
|
+
return monday === jan1 ? jan1 : (0, import_calendar.addDays)(monday, 7);
|
|
35
|
+
};
|
|
36
|
+
class SessionBars {
|
|
37
|
+
constructor(calendar, chartTimeframe) {
|
|
38
|
+
this.calendar = calendar;
|
|
39
|
+
this.chart = (0, import_timeframe.info)(chartTimeframe);
|
|
40
|
+
}
|
|
41
|
+
calendar;
|
|
42
|
+
chart;
|
|
43
|
+
yearDays = /* @__PURE__ */ new Map();
|
|
44
|
+
/** Trading days of a calendar year, in order. */
|
|
45
|
+
tradingDaysOf(year) {
|
|
46
|
+
let days = this.yearDays.get(year);
|
|
47
|
+
if (!days) {
|
|
48
|
+
days = [];
|
|
49
|
+
for (let date = year * 1e4 + 101; yearOf(date) === year; date = (0, import_calendar.addDays)(date, 1)) {
|
|
50
|
+
if (this.calendar.isTradingDay(date)) days.push(date);
|
|
51
|
+
}
|
|
52
|
+
this.yearDays.set(year, days);
|
|
53
|
+
}
|
|
54
|
+
return days;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Dates [from, to] of the `n`-`unit` period that contains `date` (for "D": its first and last trading days).
|
|
58
|
+
* Periods restart each calendar year.
|
|
59
|
+
*/
|
|
60
|
+
periodRange(date, unit, n) {
|
|
61
|
+
if (unit === "D") {
|
|
62
|
+
if (n === 1) return [date, date];
|
|
63
|
+
const days = this.tradingDaysOf(yearOf(date));
|
|
64
|
+
let k = days.findIndex((d) => d >= date);
|
|
65
|
+
if (k === -1) return this.periodRange(yearOf(date) * 1e4 + 1e4 + 101, unit, n);
|
|
66
|
+
k -= k % n;
|
|
67
|
+
return [days[k], days[Math.min(k + n, days.length) - 1]];
|
|
68
|
+
}
|
|
69
|
+
if (unit === "W") {
|
|
70
|
+
const monday = (0, import_calendar.weekStart)(date);
|
|
71
|
+
const year2 = yearOf(monday);
|
|
72
|
+
const first = firstMonday(year2);
|
|
73
|
+
const next = firstMonday(year2 + 1);
|
|
74
|
+
const k = Math.round(((0, import_calendar.dateUtcMs)(monday) - (0, import_calendar.dateUtcMs)(first)) / (7 * 864e5));
|
|
75
|
+
const from = (0, import_calendar.addDays)(first, (k - k % n) * 7);
|
|
76
|
+
const to = (0, import_calendar.addDays)(from, n * 7 - 1);
|
|
77
|
+
return [from, to < next ? to : (0, import_calendar.addDays)(next, -1)];
|
|
78
|
+
}
|
|
79
|
+
const year = yearOf(date);
|
|
80
|
+
const month = Math.floor(date / 100) % 100;
|
|
81
|
+
const firstMonth = month - (month - 1) % n;
|
|
82
|
+
const lastMonth = Math.min(firstMonth + n - 1, 12);
|
|
83
|
+
return [(0, import_calendar.monthStart)(year * 1e4 + firstMonth * 100 + 1), (0, import_calendar.monthEnd)(year * 1e4 + lastMonth * 100 + 1)];
|
|
84
|
+
}
|
|
85
|
+
dayStart(date) {
|
|
86
|
+
return this.calendar.periods(date)[0][0];
|
|
87
|
+
}
|
|
88
|
+
dayEnd(date) {
|
|
89
|
+
const p = this.calendar.periods(date);
|
|
90
|
+
return p[p.length - 1][1];
|
|
91
|
+
}
|
|
92
|
+
/** PineScript `time(tf)` for a bar that opens at `time`; NaN when no trading day is found. */
|
|
93
|
+
timeOf(time, timeframe) {
|
|
94
|
+
const tf = (0, import_timeframe.info)(timeframe);
|
|
95
|
+
const at = this.calendar.locate(time);
|
|
96
|
+
if (!at) return NaN;
|
|
97
|
+
if (tf.isintraday) {
|
|
98
|
+
if (this.chart.isdwm) return time;
|
|
99
|
+
const [start] = this.calendar.periods(at.date)[at.index];
|
|
100
|
+
const ms = (0, import_timeframe.in_seconds)(tf.period) * 1e3;
|
|
101
|
+
return start + Math.floor((time - start) / ms) * ms;
|
|
102
|
+
}
|
|
103
|
+
const { unit, n } = unitOf(tf);
|
|
104
|
+
const [from, to] = this.periodRange(at.date, unit, n);
|
|
105
|
+
const first = this.calendar.firstTradingDay(from, to);
|
|
106
|
+
return first === null ? NaN : this.dayStart(first);
|
|
107
|
+
}
|
|
108
|
+
/** PineScript `time_close(tf)` for a bar that opens at `time`. */
|
|
109
|
+
closeOf(time, timeframe) {
|
|
110
|
+
const tf = (0, import_timeframe.info)(timeframe);
|
|
111
|
+
const at = this.calendar.locate(time);
|
|
112
|
+
if (!at) return NaN;
|
|
113
|
+
if (tf.isintraday) {
|
|
114
|
+
const [, end] = this.calendar.periods(at.date)[at.index];
|
|
115
|
+
if (this.chart.isdwm) return end;
|
|
116
|
+
return Math.min(this.timeOf(time, timeframe) + (0, import_timeframe.in_seconds)(tf.period) * 1e3, end);
|
|
117
|
+
}
|
|
118
|
+
const { unit, n } = unitOf(tf);
|
|
119
|
+
const [from, to] = this.periodRange(at.date, unit, n);
|
|
120
|
+
if (this.chart.isintraday && (unit !== "D" || n > 1)) {
|
|
121
|
+
const [nextFrom, nextTo] = this.periodRange((0, import_calendar.addDays)(to, 1), unit, n);
|
|
122
|
+
const first = this.calendar.firstTradingDay(nextFrom, (0, import_calendar.addDays)(nextTo, 31));
|
|
123
|
+
return first === null ? NaN : this.dayStart(first);
|
|
124
|
+
}
|
|
125
|
+
const last = this.calendar.lastTradingDay(from, to);
|
|
126
|
+
return last === null ? NaN : this.dayEnd(last);
|
|
127
|
+
}
|
|
128
|
+
/** Trading day of a bar: on D / W / M charts the last trading day of the chart period. */
|
|
129
|
+
tradingDay(time) {
|
|
130
|
+
const at = this.calendar.locate(time);
|
|
131
|
+
if (!at) return null;
|
|
132
|
+
if (this.chart.isdwm) {
|
|
133
|
+
const { unit, n } = unitOf(this.chart);
|
|
134
|
+
const [from, to] = this.periodRange(at.date, unit, n);
|
|
135
|
+
return this.calendar.lastTradingDay(from, to);
|
|
136
|
+
}
|
|
137
|
+
return at.date;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* End of the `timeframe` period that contains `time`: the intraday close, the session end of the day,
|
|
141
|
+
* or the session end of the last trading day of the period. Used to know whether the last loaded
|
|
142
|
+
* bar completes a higher-timeframe period (request.security).
|
|
143
|
+
*/
|
|
144
|
+
periodEnd(time, timeframe) {
|
|
145
|
+
const tf = (0, import_timeframe.info)(timeframe);
|
|
146
|
+
const at = this.calendar.locate(time);
|
|
147
|
+
if (!at) return NaN;
|
|
148
|
+
if (tf.isintraday) {
|
|
149
|
+
const [, end] = this.calendar.periods(at.date)[at.index];
|
|
150
|
+
return Math.min(this.timeOf(time, timeframe) + (0, import_timeframe.in_seconds)(tf.period) * 1e3, end);
|
|
151
|
+
}
|
|
152
|
+
const { unit, n } = unitOf(tf);
|
|
153
|
+
const [from, to] = this.periodRange(at.date, unit, n);
|
|
154
|
+
const last = this.calendar.lastTradingDay(from, to);
|
|
155
|
+
return last === null ? NaN : this.dayEnd(last);
|
|
156
|
+
}
|
|
157
|
+
/** PineScript `time_tradingday`: 00:00 UTC of the trading day. */
|
|
158
|
+
tradingDayTime(time) {
|
|
159
|
+
const day = this.tradingDay(time);
|
|
160
|
+
return day === null ? NaN : (0, import_calendar.dateUtcMs)(day);
|
|
161
|
+
}
|
|
162
|
+
/** True when the bar at `time` is inside the session. */
|
|
163
|
+
inside(time) {
|
|
164
|
+
return this.calendar.locate(time)?.inside ?? false;
|
|
165
|
+
}
|
|
166
|
+
/** Session start and end of the trading day of `time`, or null. */
|
|
167
|
+
dayBounds(time) {
|
|
168
|
+
const at = this.calendar.locate(time);
|
|
169
|
+
return at ? { date: at.date, start: this.dayStart(at.date), end: this.dayEnd(at.date) } : null;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
function sessionFlags(times, bars, regular) {
|
|
173
|
+
const n = times.length;
|
|
174
|
+
const flag = () => new Array(n).fill(false);
|
|
175
|
+
const out = {
|
|
176
|
+
isfirstbar: flag(),
|
|
177
|
+
islastbar: flag(),
|
|
178
|
+
ismarket: flag(),
|
|
179
|
+
ispremarket: flag(),
|
|
180
|
+
ispostmarket: flag(),
|
|
181
|
+
isfirstbar_regular: flag(),
|
|
182
|
+
islastbar_regular: flag()
|
|
183
|
+
};
|
|
184
|
+
const chart = bars.chart;
|
|
185
|
+
let previousPeriod = "";
|
|
186
|
+
let previousRegular = "";
|
|
187
|
+
for (let i = 0; i < n; i++) {
|
|
188
|
+
const t = times[i];
|
|
189
|
+
if (chart.isdwm) {
|
|
190
|
+
for (const k of ["isfirstbar", "islastbar", "ismarket", "isfirstbar_regular", "islastbar_regular"]) out[k][i] = true;
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
const at = bars.calendar.locate(t);
|
|
194
|
+
if (!at) {
|
|
195
|
+
previousPeriod = previousRegular = "";
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
const close = bars.closeOf(t, chart.period);
|
|
199
|
+
const [, end] = bars.calendar.periods(at.date)[at.index];
|
|
200
|
+
const period = `${at.date}/${at.index}`;
|
|
201
|
+
out.isfirstbar[i] = period !== previousPeriod;
|
|
202
|
+
out.islastbar[i] = close >= end;
|
|
203
|
+
const regularPeriods = regular.calendar.periods(at.date);
|
|
204
|
+
const r = regularPeriods.findIndex(([s, e]) => s <= t && t < e);
|
|
205
|
+
const market = r !== -1;
|
|
206
|
+
out.ismarket[i] = market;
|
|
207
|
+
if (!market && regularPeriods.length) {
|
|
208
|
+
out.ispremarket[i] = t < regularPeriods[0][0];
|
|
209
|
+
out.ispostmarket[i] = t >= regularPeriods[regularPeriods.length - 1][1];
|
|
210
|
+
}
|
|
211
|
+
const regularPeriod = market ? `${at.date}/${r}` : "";
|
|
212
|
+
out.isfirstbar_regular[i] = market && regularPeriod !== previousRegular;
|
|
213
|
+
out.islastbar_regular[i] = market && close >= regularPeriods[r][1];
|
|
214
|
+
previousPeriod = period;
|
|
215
|
+
previousRegular = regularPeriod;
|
|
216
|
+
}
|
|
217
|
+
return out;
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=bars.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/session/bars.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * PineScript values that depend on the chart timeframe and the symbol session (issue #100):\n * `time(tf)`, `time_close(tf)`, `timeframe.change(tf)`, `time_tradingday`, `session.*`.\n * PineScript rules:\n *\n * - intraday periods are aligned on the start of the session period of the trading day: 240 minutes from\n * 09:30 gives 09:30, 13:30; `time(tf)` is the start of the period that contains the bar open\n * - \"D\" is the session start of the trading day; \"W\" / \"M\" the session start of the first trading day\n * of the week (Monday to Sunday) / month\n * - intraday closes are cut at the end of the session period; the \"D\" close is the session end\n * - on intraday charts the \"W\" / \"M\" (and \"nD\") close is the session start of the next period's first\n * trading day; on D / W / M charts it is the session end of the last trading day of the week / month\n * - on D / W / M charts, intraday timeframes give the chart bar's time, and the end of the session\n * period that contains the bar open as close\n * - `time_tradingday` is 00:00 UTC of the trading day (on W / M charts, of the last trading day)\n *\n * Multipliers above one day (issue #100 follow-up): periods restart each\n * calendar year. \"nD\" groups n trading days from the first trading day of the year; \"nW\" groups n weeks from\n * the first week whose Monday is in the year; \"nM\" groups n months from January. The last group of a year\n * can be shorter.\n */\n\nimport { info, in_seconds, type TimeframeInfo } from '../timeframe/index.js';\nimport {\n TradingCalendar,\n addDays,\n dateUtcMs,\n monthEnd,\n monthStart,\n weekStart,\n type DateNum,\n} from './calendar.js';\n\ntype Unit = 'D' | 'W' | 'M';\n\nfunction unitOf(tf: TimeframeInfo): { unit: Unit; n: number } {\n return { unit: tf.isdaily ? 'D' : tf.isweekly ? 'W' : 'M', n: tf.multiplier };\n}\n\nconst yearOf = (date: DateNum): number => Math.floor(date / 10000);\n\n/** Monday of the first week of `year` (the first Monday on or after 1 January). */\nconst firstMonday = (year: number): DateNum => {\n const jan1 = year * 10000 + 101;\n const monday = weekStart(jan1);\n return monday === jan1 ? jan1 : addDays(monday, 7);\n};\n\n/** Values of the bars of one chart, for a trading calendar. */\nexport class SessionBars {\n readonly chart: TimeframeInfo;\n\n private readonly yearDays = new Map<number, DateNum[]>();\n\n constructor(\n readonly calendar: TradingCalendar,\n chartTimeframe: string\n ) {\n this.chart = info(chartTimeframe);\n }\n\n /** Trading days of a calendar year, in order. */\n private tradingDaysOf(year: number): DateNum[] {\n let days = this.yearDays.get(year);\n if (!days) {\n days = [];\n for (let date = year * 10000 + 101; yearOf(date) === year; date = addDays(date, 1)) {\n if (this.calendar.isTradingDay(date)) days.push(date);\n }\n this.yearDays.set(year, days);\n }\n return days;\n }\n\n /**\n * Dates [from, to] of the `n`-`unit` period that contains `date` (for \"D\": its first and last trading days).\n * Periods restart each calendar year.\n */\n private periodRange(date: DateNum, unit: Unit, n: number): [DateNum, DateNum] {\n if (unit === 'D') {\n if (n === 1) return [date, date];\n const days = this.tradingDaysOf(yearOf(date));\n let k = days.findIndex((d) => d >= date);\n if (k === -1) return this.periodRange(yearOf(date) * 10000 + 10000 + 101, unit, n);\n k -= k % n;\n return [days[k]!, days[Math.min(k + n, days.length) - 1]!];\n }\n if (unit === 'W') {\n const monday = weekStart(date);\n const year = yearOf(monday);\n const first = firstMonday(year);\n const next = firstMonday(year + 1);\n const k = Math.round((dateUtcMs(monday) - dateUtcMs(first)) / (7 * 86_400_000));\n const from = addDays(first, (k - (k % n)) * 7);\n const to = addDays(from, n * 7 - 1);\n return [from, to < next ? to : addDays(next, -1)];\n }\n const year = yearOf(date);\n const month = Math.floor(date / 100) % 100;\n const firstMonth = month - ((month - 1) % n);\n const lastMonth = Math.min(firstMonth + n - 1, 12);\n return [monthStart(year * 10000 + firstMonth * 100 + 1), monthEnd(year * 10000 + lastMonth * 100 + 1)];\n }\n\n private dayStart(date: DateNum): number {\n return this.calendar.periods(date)[0]![0];\n }\n\n private dayEnd(date: DateNum): number {\n const p = this.calendar.periods(date);\n return p[p.length - 1]![1];\n }\n\n /** PineScript `time(tf)` for a bar that opens at `time`; NaN when no trading day is found. */\n timeOf(time: number, timeframe: string): number {\n const tf = info(timeframe);\n const at = this.calendar.locate(time);\n if (!at) return NaN;\n if (tf.isintraday) {\n if (this.chart.isdwm) return time;\n const [start] = this.calendar.periods(at.date)[at.index]!;\n const ms = in_seconds(tf.period) * 1000;\n return start + Math.floor((time - start) / ms) * ms;\n }\n const { unit, n } = unitOf(tf);\n const [from, to] = this.periodRange(at.date, unit, n);\n const first = this.calendar.firstTradingDay(from, to);\n return first === null ? NaN : this.dayStart(first);\n }\n\n /** PineScript `time_close(tf)` for a bar that opens at `time`. */\n closeOf(time: number, timeframe: string): number {\n const tf = info(timeframe);\n const at = this.calendar.locate(time);\n if (!at) return NaN;\n if (tf.isintraday) {\n const [, end] = this.calendar.periods(at.date)[at.index]!;\n // on D / W / M charts: the end of the session period that contains the bar open\n if (this.chart.isdwm) return end;\n return Math.min(this.timeOf(time, timeframe) + in_seconds(tf.period) * 1000, end);\n }\n const { unit, n } = unitOf(tf);\n const [from, to] = this.periodRange(at.date, unit, n);\n // intraday charts: the start of the next period, except \"1D\" (the session end)\n if (this.chart.isintraday && (unit !== 'D' || n > 1)) {\n const [nextFrom, nextTo] = this.periodRange(addDays(to, 1), unit, n);\n const first = this.calendar.firstTradingDay(nextFrom, addDays(nextTo, 31));\n return first === null ? NaN : this.dayStart(first);\n }\n const last = this.calendar.lastTradingDay(from, to);\n return last === null ? NaN : this.dayEnd(last);\n }\n\n /** Trading day of a bar: on D / W / M charts the last trading day of the chart period. */\n tradingDay(time: number): DateNum | null {\n const at = this.calendar.locate(time);\n if (!at) return null;\n if (this.chart.isdwm) {\n const { unit, n } = unitOf(this.chart);\n const [from, to] = this.periodRange(at.date, unit, n);\n return this.calendar.lastTradingDay(from, to);\n }\n return at.date;\n }\n\n /**\n * End of the `timeframe` period that contains `time`: the intraday close, the session end of the day,\n * or the session end of the last trading day of the period. Used to know whether the last loaded\n * bar completes a higher-timeframe period (request.security).\n */\n periodEnd(time: number, timeframe: string): number {\n const tf = info(timeframe);\n const at = this.calendar.locate(time);\n if (!at) return NaN;\n if (tf.isintraday) {\n const [, end] = this.calendar.periods(at.date)[at.index]!;\n return Math.min(this.timeOf(time, timeframe) + in_seconds(tf.period) * 1000, end);\n }\n const { unit, n } = unitOf(tf);\n const [from, to] = this.periodRange(at.date, unit, n);\n const last = this.calendar.lastTradingDay(from, to);\n return last === null ? NaN : this.dayEnd(last);\n }\n\n /** PineScript `time_tradingday`: 00:00 UTC of the trading day. */\n tradingDayTime(time: number): number {\n const day = this.tradingDay(time);\n return day === null ? NaN : dateUtcMs(day);\n }\n\n /** True when the bar at `time` is inside the session. */\n inside(time: number): boolean {\n return this.calendar.locate(time)?.inside ?? false;\n }\n\n /** Session start and end of the trading day of `time`, or null. */\n dayBounds(time: number): { date: DateNum; start: number; end: number } | null {\n const at = this.calendar.locate(time);\n return at ? { date: at.date, start: this.dayStart(at.date), end: this.dayEnd(at.date) } : null;\n }\n}\n\n/** PineScript `session.*` flags of each bar. */\nexport interface SessionFlags {\n isfirstbar: boolean[];\n islastbar: boolean[];\n ismarket: boolean[];\n ispremarket: boolean[];\n ispostmarket: boolean[];\n isfirstbar_regular: boolean[];\n islastbar_regular: boolean[];\n}\n\n/**\n * `session.*` flags for bars that open at `times` (in order). `regular` gives the regular trading\n * hours when the bars include extended hours. PineScript rules: flags use the bar open\n * time; first and last bars are per session period (a trading day can have two periods, e.g. after a\n * futures holiday); pre / post market compare with the regular hours of the same trading day; on\n * D / W / M charts every bar is its own session (first, last, market, first and last regular).\n */\nexport function sessionFlags(times: number[], bars: SessionBars, regular: SessionBars): SessionFlags {\n const n = times.length;\n const flag = () => new Array<boolean>(n).fill(false);\n const out: SessionFlags = {\n isfirstbar: flag(), islastbar: flag(), ismarket: flag(), ispremarket: flag(), ispostmarket: flag(),\n isfirstbar_regular: flag(), islastbar_regular: flag(),\n };\n const chart = bars.chart;\n let previousPeriod = '';\n let previousRegular = '';\n for (let i = 0; i < n; i++) {\n const t = times[i]!;\n if (chart.isdwm) {\n for (const k of ['isfirstbar', 'islastbar', 'ismarket', 'isfirstbar_regular', 'islastbar_regular'] as const) out[k][i] = true;\n continue;\n }\n const at = bars.calendar.locate(t);\n if (!at) {\n previousPeriod = previousRegular = '';\n continue;\n }\n const close = bars.closeOf(t, chart.period);\n const [, end] = bars.calendar.periods(at.date)[at.index]!;\n const period = `${at.date}/${at.index}`;\n out.isfirstbar[i] = period !== previousPeriod;\n out.islastbar[i] = close >= end;\n const regularPeriods = regular.calendar.periods(at.date);\n const r = regularPeriods.findIndex(([s, e]) => s <= t && t < e);\n const market = r !== -1;\n out.ismarket[i] = market;\n if (!market && regularPeriods.length) {\n out.ispremarket[i] = t < regularPeriods[0]![0];\n out.ispostmarket[i] = t >= regularPeriods[regularPeriods.length - 1]![1];\n }\n const regularPeriod = market ? `${at.date}/${r}` : '';\n out.isfirstbar_regular[i] = market && regularPeriod !== previousRegular;\n out.islastbar_regular[i] = market && close >= regularPeriods[r]![1];\n previousPeriod = period;\n previousRegular = regularPeriod;\n }\n return out;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["year"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trading calendar: the session periods of each trading day of a symbol, from the symbol session
|
|
3
|
+
* information (issue #100).
|
|
4
|
+
*
|
|
5
|
+
* Session format (symbol session information, also PineScript session strings):
|
|
6
|
+
* - periods "HHMM-HHMM", several separated by commas; "24x7" is the whole day, every day
|
|
7
|
+
* - a period whose end is not after its start ("1700-1600", "1700-1700") starts the day before the
|
|
8
|
+
* trading day: the session that opens Sunday 17:00 is Monday's
|
|
9
|
+
* - "HHMMF<n>" moves a time <n> days before the trading day ("1700F2-1200F1")
|
|
10
|
+
* - optional days after ":" (1 = Sunday ... 7 = Saturday); without days a symbol session trades Monday to
|
|
11
|
+
* Friday ("24x7": every day), and a PineScript session string follows PineScript's rules (one period:
|
|
12
|
+
* every day; several periods: Monday to Friday)
|
|
13
|
+
* - "#YYYYMMDD/<session>" changes the session from that date ("0900-1746#20251201/0800-2200")
|
|
14
|
+
* - corrections ("session-correction"): "<session>:<dates>;dayoff:<dates>" replace the session of these
|
|
15
|
+
* dates (early closes, days off); holidays ("session_holidays") are dates without session
|
|
16
|
+
*/
|
|
17
|
+
/** Session information of a symbol (hours, corrections, holidays). */
|
|
18
|
+
export interface SessionSpec {
|
|
19
|
+
/** Session hours: "0930-1600", "1700-1600", "24x7", "0400-2000" ... */
|
|
20
|
+
session: string;
|
|
21
|
+
/** Exceptions by date (symbol info "session-correction"): "0930-1300:20251128,20251224;dayoff:20250109" */
|
|
22
|
+
corrections?: string;
|
|
23
|
+
/** Exchange holidays as "YYYYMMDD" (symbol info "session_holidays"), comma-separated or as an array */
|
|
24
|
+
holidays?: string | string[];
|
|
25
|
+
}
|
|
26
|
+
/** Date as YYYYMMDD. */
|
|
27
|
+
export type DateNum = number;
|
|
28
|
+
export declare const toDateNum: (y: number, m: number, d: number) => DateNum;
|
|
29
|
+
export declare const addDays: (date: DateNum, n: number) => DateNum;
|
|
30
|
+
/** 1 = Sunday ... 7 = Saturday */
|
|
31
|
+
export declare const weekdayOf: (date: DateNum) => number;
|
|
32
|
+
/** 00:00 UTC of the date, in ms (PineScript `time_tradingday`). */
|
|
33
|
+
export declare const dateUtcMs: (date: DateNum) => number;
|
|
34
|
+
/** Session periods of every trading day of a symbol, as UNIX times (ms). */
|
|
35
|
+
export declare class TradingCalendar {
|
|
36
|
+
readonly timezone: string;
|
|
37
|
+
private readonly versions;
|
|
38
|
+
private readonly corrections;
|
|
39
|
+
private readonly holidays;
|
|
40
|
+
private readonly cache;
|
|
41
|
+
/**
|
|
42
|
+
* @param timezone - Time zone of the session hours (the exchange time zone)
|
|
43
|
+
* @param spec - Session information (hours, corrections, holidays)
|
|
44
|
+
* @param rule - Days without ":days": 'symbol' (Monday to Friday) or 'pine' (PineScript session strings)
|
|
45
|
+
*/
|
|
46
|
+
constructor(timezone: string, spec: SessionSpec, rule?: 'symbol' | 'pine');
|
|
47
|
+
/** Session periods [start, end) of the trading day `date`; empty when the day has no session. */
|
|
48
|
+
periods(date: DateNum): Array<[number, number]>;
|
|
49
|
+
isTradingDay(date: DateNum): boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Trading day and period of a time: the period that contains it, else the last period that started
|
|
52
|
+
* before it. Null when no trading day is found near the time.
|
|
53
|
+
*/
|
|
54
|
+
locate(time: number): {
|
|
55
|
+
date: DateNum;
|
|
56
|
+
index: number;
|
|
57
|
+
inside: boolean;
|
|
58
|
+
} | null;
|
|
59
|
+
/** First trading day in [from, to] (dates), or null. */
|
|
60
|
+
firstTradingDay(from: DateNum, to: DateNum): DateNum | null;
|
|
61
|
+
/** Last trading day in [from, to] (dates), or null. */
|
|
62
|
+
lastTradingDay(from: DateNum, to: DateNum): DateNum | null;
|
|
63
|
+
}
|
|
64
|
+
/** Monday of the week of `date` (weeks run Monday to Sunday). */
|
|
65
|
+
export declare const weekStart: (date: DateNum) => DateNum;
|
|
66
|
+
/** First day of the month of `date`. */
|
|
67
|
+
export declare const monthStart: (date: DateNum) => DateNum;
|
|
68
|
+
/** Last day of the month of `date`. */
|
|
69
|
+
export declare const monthEnd: (date: DateNum) => DateNum;
|
|
70
|
+
//# sourceMappingURL=calendar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calendar.d.ts","sourceRoot":"","sources":["../../../src/session/calendar.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,sEAAsE;AACtE,MAAM,WAAW,WAAW;IAC1B,uEAAuE;IACvE,OAAO,EAAE,MAAM,CAAC;IAChB,2GAA2G;IAC3G,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uGAAuG;IACvG,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAC9B;AAED,wBAAwB;AACxB,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC;AAkB7B,eAAO,MAAM,SAAS,GAAI,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,KAAG,OAAkC,CAAC;AAM/F,eAAO,MAAM,OAAO,GAAI,MAAM,OAAO,EAAE,GAAG,MAAM,KAAG,OAAgD,CAAC;AACpG,kCAAkC;AAClC,eAAO,MAAM,SAAS,GAAI,MAAM,OAAO,KAAG,MAA+C,CAAC;AAC1F,mEAAmE;AACnE,eAAO,MAAM,SAAS,SATD,OAAO,KAAG,MASD,CAAC;AAqC/B,4EAA4E;AAC5E,qBAAa,eAAe;IAYxB,QAAQ,CAAC,QAAQ,EAAE,MAAM;IAX3B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAY;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAuC;IACnE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAe;IACxC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA+C;IAErE;;;;OAIG;gBAEQ,QAAQ,EAAE,MAAM,EACzB,IAAI,EAAE,WAAW,EACjB,IAAI,GAAE,QAAQ,GAAG,MAAiB;IAmBpC,iGAAiG;IACjG,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAsB/C,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO;IAIpC;;;OAGG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;IAoB9E,wDAAwD;IACxD,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,GAAG,OAAO,GAAG,IAAI;IAK3D,uDAAuD;IACvD,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,GAAG,OAAO,GAAG,IAAI;CAI3D;AAED,iEAAiE;AACjE,eAAO,MAAM,SAAS,GAAI,MAAM,OAAO,KAAG,OAAsD,CAAC;AACjG,wCAAwC;AACxC,eAAO,MAAM,UAAU,GAAI,MAAM,OAAO,KAAG,OAA2C,CAAC;AACvF,uCAAuC;AACvC,eAAO,MAAM,QAAQ,GAAI,MAAM,OAAO,KAAG,OAAiE,CAAC"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var calendar_exports = {};
|
|
20
|
+
__export(calendar_exports, {
|
|
21
|
+
TradingCalendar: () => TradingCalendar,
|
|
22
|
+
addDays: () => addDays,
|
|
23
|
+
dateUtcMs: () => dateUtcMs,
|
|
24
|
+
monthEnd: () => monthEnd,
|
|
25
|
+
monthStart: () => monthStart,
|
|
26
|
+
toDateNum: () => toDateNum,
|
|
27
|
+
weekStart: () => weekStart,
|
|
28
|
+
weekdayOf: () => weekdayOf
|
|
29
|
+
});
|
|
30
|
+
module.exports = __toCommonJS(calendar_exports);
|
|
31
|
+
var import_timezone = require("../time/timezone.js");
|
|
32
|
+
const toDateNum = (y, m, d) => y * 1e4 + m * 100 + d;
|
|
33
|
+
const utcOf = (date) => Date.UTC(Math.floor(date / 1e4), Math.floor(date / 100) % 100 - 1, date % 100);
|
|
34
|
+
const fromUtc = (ms) => {
|
|
35
|
+
const d = new Date(ms);
|
|
36
|
+
return toDateNum(d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate());
|
|
37
|
+
};
|
|
38
|
+
const addDays = (date, n) => fromUtc(utcOf(date) + n * 864e5);
|
|
39
|
+
const weekdayOf = (date) => new Date(utcOf(date)).getUTCDay() + 1;
|
|
40
|
+
const dateUtcMs = utcOf;
|
|
41
|
+
function parseTime(token, spec) {
|
|
42
|
+
const m = /^(\d{2})(\d{2})(?:F(\d+))?$/.exec(token.trim());
|
|
43
|
+
if (!m) throw new SyntaxError(`Invalid session "${spec}"`);
|
|
44
|
+
return { minutes: Number(m[1]) * 60 + Number(m[2]), offset: m[3] === void 0 ? void 0 : Number(m[3]) };
|
|
45
|
+
}
|
|
46
|
+
function parsePeriods(text, spec) {
|
|
47
|
+
if (text.trim() === "24x7") return [{ start: 0, end: 1440, startOffset: 0, endOffset: 0 }];
|
|
48
|
+
return text.split(",").map((p) => {
|
|
49
|
+
const [a = "", b = ""] = p.split("-");
|
|
50
|
+
const s = parseTime(a, spec);
|
|
51
|
+
const e = parseTime(b, spec);
|
|
52
|
+
if (s.minutes === 0 && e.minutes === 0 && s.offset === void 0 && e.offset === void 0) {
|
|
53
|
+
return { start: 0, end: 1440, startOffset: 0, endOffset: 0 };
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
start: s.minutes,
|
|
57
|
+
end: e.minutes,
|
|
58
|
+
startOffset: s.offset ?? (e.minutes <= s.minutes ? 1 : 0),
|
|
59
|
+
endOffset: e.offset ?? 0
|
|
60
|
+
};
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
function parseVersion(text, from, spec, rule) {
|
|
64
|
+
const [periodText = "", dayText] = text.trim().split(":");
|
|
65
|
+
const periods = parsePeriods(periodText, spec);
|
|
66
|
+
const allDays = periodText.trim() === "24x7" || rule === "pine" && periods.length === 1;
|
|
67
|
+
const digits = dayText ?? (allDays ? "1234567" : "23456");
|
|
68
|
+
if (!/^[1-7]+$/.test(digits)) throw new SyntaxError(`Invalid session days in "${spec}"`);
|
|
69
|
+
const days = new Array(8).fill(false);
|
|
70
|
+
for (const d of digits) days[Number(d)] = true;
|
|
71
|
+
return { from, periods, days };
|
|
72
|
+
}
|
|
73
|
+
class TradingCalendar {
|
|
74
|
+
/**
|
|
75
|
+
* @param timezone - Time zone of the session hours (the exchange time zone)
|
|
76
|
+
* @param spec - Session information (hours, corrections, holidays)
|
|
77
|
+
* @param rule - Days without ":days": 'symbol' (Monday to Friday) or 'pine' (PineScript session strings)
|
|
78
|
+
*/
|
|
79
|
+
constructor(timezone, spec, rule = "symbol") {
|
|
80
|
+
this.timezone = timezone;
|
|
81
|
+
const [first = "", ...changes] = spec.session.split("#");
|
|
82
|
+
this.versions = [parseVersion(first, 0, spec.session, rule)];
|
|
83
|
+
for (const change of changes) {
|
|
84
|
+
const m = /^(\d{8})\/(.+)$/.exec(change.trim());
|
|
85
|
+
if (!m) throw new SyntaxError(`Invalid session change in "${spec.session}"`);
|
|
86
|
+
this.versions.push(parseVersion(m[2], Number(m[1]), spec.session, rule));
|
|
87
|
+
}
|
|
88
|
+
for (const part of (spec.corrections ?? "").split(";").filter((p) => p.trim())) {
|
|
89
|
+
const i = part.lastIndexOf(":");
|
|
90
|
+
const text = part.slice(0, i).trim();
|
|
91
|
+
const periods = text === "dayoff" ? null : parsePeriods(text, part);
|
|
92
|
+
for (const date of part.slice(i + 1).split(",")) this.corrections.set(Number(date), periods);
|
|
93
|
+
}
|
|
94
|
+
const holidays = Array.isArray(spec.holidays) ? spec.holidays : (spec.holidays ?? "").split(",");
|
|
95
|
+
this.holidays = new Set(holidays.filter((h) => h.trim()).map(Number));
|
|
96
|
+
}
|
|
97
|
+
timezone;
|
|
98
|
+
versions;
|
|
99
|
+
corrections = /* @__PURE__ */ new Map();
|
|
100
|
+
holidays;
|
|
101
|
+
cache = /* @__PURE__ */ new Map();
|
|
102
|
+
/** Session periods [start, end) of the trading day `date`; empty when the day has no session. */
|
|
103
|
+
periods(date) {
|
|
104
|
+
let out = this.cache.get(date);
|
|
105
|
+
if (out) return out;
|
|
106
|
+
let periods = [];
|
|
107
|
+
const correction = this.corrections.get(date);
|
|
108
|
+
if (correction !== void 0) {
|
|
109
|
+
periods = correction ?? [];
|
|
110
|
+
} else if (!this.holidays.has(date)) {
|
|
111
|
+
const version = [...this.versions].reverse().find((v) => v.from <= date);
|
|
112
|
+
if (version.days[weekdayOf(date)]) periods = version.periods;
|
|
113
|
+
}
|
|
114
|
+
const y = Math.floor(date / 1e4);
|
|
115
|
+
const m = Math.floor(date / 100) % 100;
|
|
116
|
+
const d = date % 100;
|
|
117
|
+
out = periods.map((p) => [
|
|
118
|
+
(0, import_timezone.zonedToUnix)(this.timezone, y, m, d - p.startOffset, Math.floor(p.start / 60), p.start % 60),
|
|
119
|
+
(0, import_timezone.zonedToUnix)(this.timezone, y, m, d - p.endOffset, Math.floor(p.end / 60), p.end % 60)
|
|
120
|
+
]);
|
|
121
|
+
this.cache.set(date, out);
|
|
122
|
+
return out;
|
|
123
|
+
}
|
|
124
|
+
isTradingDay(date) {
|
|
125
|
+
return this.periods(date).length > 0;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Trading day and period of a time: the period that contains it, else the last period that started
|
|
129
|
+
* before it. Null when no trading day is found near the time.
|
|
130
|
+
*/
|
|
131
|
+
locate(time) {
|
|
132
|
+
const f = (0, import_timezone.zonedFields)(time, this.timezone);
|
|
133
|
+
const local = toDateNum(f.year, f.month, f.day);
|
|
134
|
+
for (let k = 0; k <= 5; k++) {
|
|
135
|
+
const date = addDays(local, k);
|
|
136
|
+
const index = this.periods(date).findIndex(([s, e]) => s <= time && time < e);
|
|
137
|
+
if (index !== -1) return { date, index, inside: true };
|
|
138
|
+
}
|
|
139
|
+
for (let k = 5; k >= -7; k--) {
|
|
140
|
+
const date = addDays(local, k);
|
|
141
|
+
const periods = this.periods(date);
|
|
142
|
+
let index = -1;
|
|
143
|
+
periods.forEach(([s], i) => {
|
|
144
|
+
if (s <= time) index = i;
|
|
145
|
+
});
|
|
146
|
+
if (index !== -1) return { date, index, inside: false };
|
|
147
|
+
}
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
/** First trading day in [from, to] (dates), or null. */
|
|
151
|
+
firstTradingDay(from, to) {
|
|
152
|
+
for (let date = from; date <= to; date = addDays(date, 1)) if (this.isTradingDay(date)) return date;
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
/** Last trading day in [from, to] (dates), or null. */
|
|
156
|
+
lastTradingDay(from, to) {
|
|
157
|
+
for (let date = to; date >= from; date = addDays(date, -1)) if (this.isTradingDay(date)) return date;
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
const weekStart = (date) => addDays(date, -((weekdayOf(date) + 5) % 7));
|
|
162
|
+
const monthStart = (date) => Math.floor(date / 100) * 100 + 1;
|
|
163
|
+
const monthEnd = (date) => addDays(monthStart(addDays(monthStart(date), 32)), -1);
|
|
164
|
+
//# sourceMappingURL=calendar.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/session/calendar.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Trading calendar: the session periods of each trading day of a symbol, from the symbol session\n * information (issue #100).\n *\n * Session format (symbol session information, also PineScript session strings):\n * - periods \"HHMM-HHMM\", several separated by commas; \"24x7\" is the whole day, every day\n * - a period whose end is not after its start (\"1700-1600\", \"1700-1700\") starts the day before the\n * trading day: the session that opens Sunday 17:00 is Monday's\n * - \"HHMMF<n>\" moves a time <n> days before the trading day (\"1700F2-1200F1\")\n * - optional days after \":\" (1 = Sunday ... 7 = Saturday); without days a symbol session trades Monday to\n * Friday (\"24x7\": every day), and a PineScript session string follows PineScript's rules (one period:\n * every day; several periods: Monday to Friday)\n * - \"#YYYYMMDD/<session>\" changes the session from that date (\"0900-1746#20251201/0800-2200\")\n * - corrections (\"session-correction\"): \"<session>:<dates>;dayoff:<dates>\" replace the session of these\n * dates (early closes, days off); holidays (\"session_holidays\") are dates without session\n */\n\nimport { zonedFields, zonedToUnix } from '../time/timezone.js';\n\n/** Session information of a symbol (hours, corrections, holidays). */\nexport interface SessionSpec {\n /** Session hours: \"0930-1600\", \"1700-1600\", \"24x7\", \"0400-2000\" ... */\n session: string;\n /** Exceptions by date (symbol info \"session-correction\"): \"0930-1300:20251128,20251224;dayoff:20250109\" */\n corrections?: string;\n /** Exchange holidays as \"YYYYMMDD\" (symbol info \"session_holidays\"), comma-separated or as an array */\n holidays?: string | string[];\n}\n\n/** Date as YYYYMMDD. */\nexport type DateNum = number;\n\ninterface Period {\n /** Minutes after midnight */\n start: number;\n end: number;\n /** Days before the trading day */\n startOffset: number;\n endOffset: number;\n}\n\ninterface Version {\n from: DateNum;\n periods: Period[];\n /** Index 1 (Sunday) to 7 (Saturday) */\n days: boolean[];\n}\n\nexport const toDateNum = (y: number, m: number, d: number): DateNum => y * 10000 + m * 100 + d;\nconst utcOf = (date: DateNum): number => Date.UTC(Math.floor(date / 10000), Math.floor(date / 100) % 100 - 1, date % 100);\nconst fromUtc = (ms: number): DateNum => {\n const d = new Date(ms);\n return toDateNum(d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate());\n};\nexport const addDays = (date: DateNum, n: number): DateNum => fromUtc(utcOf(date) + n * 86_400_000);\n/** 1 = Sunday ... 7 = Saturday */\nexport const weekdayOf = (date: DateNum): number => new Date(utcOf(date)).getUTCDay() + 1;\n/** 00:00 UTC of the date, in ms (PineScript `time_tradingday`). */\nexport const dateUtcMs = utcOf;\n\nfunction parseTime(token: string, spec: string): { minutes: number; offset?: number } {\n const m = /^(\\d{2})(\\d{2})(?:F(\\d+))?$/.exec(token.trim());\n if (!m) throw new SyntaxError(`Invalid session \"${spec}\"`);\n return { minutes: Number(m[1]) * 60 + Number(m[2]), offset: m[3] === undefined ? undefined : Number(m[3]) };\n}\n\nfunction parsePeriods(text: string, spec: string): Period[] {\n if (text.trim() === '24x7') return [{ start: 0, end: 1440, startOffset: 0, endOffset: 0 }];\n return text.split(',').map((p) => {\n const [a = '', b = ''] = p.split('-');\n const s = parseTime(a, spec);\n const e = parseTime(b, spec);\n if (s.minutes === 0 && e.minutes === 0 && s.offset === undefined && e.offset === undefined) {\n return { start: 0, end: 1440, startOffset: 0, endOffset: 0 };\n }\n return {\n start: s.minutes,\n end: e.minutes,\n startOffset: s.offset ?? (e.minutes <= s.minutes ? 1 : 0),\n endOffset: e.offset ?? 0,\n };\n });\n}\n\nfunction parseVersion(text: string, from: DateNum, spec: string, rule: 'symbol' | 'pine'): Version {\n const [periodText = '', dayText] = text.trim().split(':');\n const periods = parsePeriods(periodText, spec);\n const allDays = periodText.trim() === '24x7' || (rule === 'pine' && periods.length === 1);\n const digits = dayText ?? (allDays ? '1234567' : '23456');\n if (!/^[1-7]+$/.test(digits)) throw new SyntaxError(`Invalid session days in \"${spec}\"`);\n const days = new Array<boolean>(8).fill(false);\n for (const d of digits) days[Number(d)] = true;\n return { from, periods, days };\n}\n\n/** Session periods of every trading day of a symbol, as UNIX times (ms). */\nexport class TradingCalendar {\n private readonly versions: Version[];\n private readonly corrections = new Map<DateNum, Period[] | null>();\n private readonly holidays: Set<DateNum>;\n private readonly cache = new Map<DateNum, Array<[number, number]>>();\n\n /**\n * @param timezone - Time zone of the session hours (the exchange time zone)\n * @param spec - Session information (hours, corrections, holidays)\n * @param rule - Days without \":days\": 'symbol' (Monday to Friday) or 'pine' (PineScript session strings)\n */\n constructor(\n readonly timezone: string,\n spec: SessionSpec,\n rule: 'symbol' | 'pine' = 'symbol'\n ) {\n const [first = '', ...changes] = spec.session.split('#');\n this.versions = [parseVersion(first, 0, spec.session, rule)];\n for (const change of changes) {\n const m = /^(\\d{8})\\/(.+)$/.exec(change.trim());\n if (!m) throw new SyntaxError(`Invalid session change in \"${spec.session}\"`);\n this.versions.push(parseVersion(m[2]!, Number(m[1]), spec.session, rule));\n }\n for (const part of (spec.corrections ?? '').split(';').filter((p) => p.trim())) {\n const i = part.lastIndexOf(':');\n const text = part.slice(0, i).trim();\n const periods = text === 'dayoff' ? null : parsePeriods(text, part);\n for (const date of part.slice(i + 1).split(',')) this.corrections.set(Number(date), periods);\n }\n const holidays = Array.isArray(spec.holidays) ? spec.holidays : (spec.holidays ?? '').split(',');\n this.holidays = new Set(holidays.filter((h) => h.trim()).map(Number));\n }\n\n /** Session periods [start, end) of the trading day `date`; empty when the day has no session. */\n periods(date: DateNum): Array<[number, number]> {\n let out = this.cache.get(date);\n if (out) return out;\n let periods: Period[] = [];\n const correction = this.corrections.get(date);\n if (correction !== undefined) {\n periods = correction ?? [];\n } else if (!this.holidays.has(date)) {\n const version = [...this.versions].reverse().find((v) => v.from <= date)!;\n if (version.days[weekdayOf(date)]) periods = version.periods;\n }\n const y = Math.floor(date / 10000);\n const m = Math.floor(date / 100) % 100;\n const d = date % 100;\n out = periods.map((p) => [\n zonedToUnix(this.timezone, y, m, d - p.startOffset, Math.floor(p.start / 60), p.start % 60),\n zonedToUnix(this.timezone, y, m, d - p.endOffset, Math.floor(p.end / 60), p.end % 60),\n ]);\n this.cache.set(date, out);\n return out;\n }\n\n isTradingDay(date: DateNum): boolean {\n return this.periods(date).length > 0;\n }\n\n /**\n * Trading day and period of a time: the period that contains it, else the last period that started\n * before it. Null when no trading day is found near the time.\n */\n locate(time: number): { date: DateNum; index: number; inside: boolean } | null {\n const f = zonedFields(time, this.timezone);\n const local = toDateNum(f.year, f.month, f.day);\n for (let k = 0; k <= 5; k++) {\n const date = addDays(local, k);\n const index = this.periods(date).findIndex(([s, e]) => s <= time && time < e);\n if (index !== -1) return { date, index, inside: true };\n }\n for (let k = 5; k >= -7; k--) {\n const date = addDays(local, k);\n const periods = this.periods(date);\n let index = -1;\n periods.forEach(([s], i) => {\n if (s <= time) index = i;\n });\n if (index !== -1) return { date, index, inside: false };\n }\n return null;\n }\n\n /** First trading day in [from, to] (dates), or null. */\n firstTradingDay(from: DateNum, to: DateNum): DateNum | null {\n for (let date = from; date <= to; date = addDays(date, 1)) if (this.isTradingDay(date)) return date;\n return null;\n }\n\n /** Last trading day in [from, to] (dates), or null. */\n lastTradingDay(from: DateNum, to: DateNum): DateNum | null {\n for (let date = to; date >= from; date = addDays(date, -1)) if (this.isTradingDay(date)) return date;\n return null;\n }\n}\n\n/** Monday of the week of `date` (weeks run Monday to Sunday). */\nexport const weekStart = (date: DateNum): DateNum => addDays(date, -((weekdayOf(date) + 5) % 7));\n/** First day of the month of `date`. */\nexport const monthStart = (date: DateNum): DateNum => Math.floor(date / 100) * 100 + 1;\n/** Last day of the month of `date`. */\nexport const monthEnd = (date: DateNum): DateNum => addDays(monthStart(addDays(monthStart(date), 32)), -1);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Date patterns of `str.format_time` and `str.format("{0,date,...}")`, as PineScript formats them
|
|
3
|
+
* (Java SimpleDateFormat letters, English names):
|
|
4
|
+
*
|
|
5
|
+
* y year, M month (M, MM, MMM, MMMM), d day, E weekday (EEE, EEEE), u weekday number (1 = Monday),
|
|
6
|
+
* D day of year, w week of year (weeks start on Sunday, week 1 contains 1 January), H hour 0-23,
|
|
7
|
+
* k hour 1-24, K hour 0-11, h hour 1-12, a AM/PM, m minute, s second, S millisecond,
|
|
8
|
+
* Z offset (+0530), z time zone name, 'text' literal text ('' is a quote).
|
|
9
|
+
*
|
|
10
|
+
* `z` gives "UTC" for Etc/UTC, "GMT" for "UTC"/"GMT", "GMT+05:00" for other offsets, and the
|
|
11
|
+
* host's short English name for IANA zones (PineScript's names can differ, e.g. "IST" for Asia/Kolkata).
|
|
12
|
+
*/
|
|
13
|
+
/** Formats a UNIX time (ms) with a SimpleDateFormat pattern in `timezone`. */
|
|
14
|
+
export declare function formatDate(time: number, pattern: string, timezone: string): string;
|
|
15
|
+
//# sourceMappingURL=dateformat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dateformat.d.ts","sourceRoot":"","sources":["../../../src/str/dateformat.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAmCH,8EAA8E;AAC9E,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAwDlF"}
|