ta-crypto 0.1.5 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/api.js ADDED
@@ -0,0 +1,241 @@
1
+ import { assertFiniteSeries } from "./core/math.js";
2
+ import { normalizePrice, toOHLCV } from "./candles.js";
3
+ import { sma as coreSma, ema as coreEma, rma as coreRma, hl2 as coreHl2, hlc3 as coreHlc3, ohlc4 as coreOhlc4, vwap as coreVwap, bbands as coreBbands } from "./core/overlap.js";
4
+ import { rsi as coreRsi, macd as coreMacd, stoch as coreStoch } from "./core/momentum.js";
5
+ import { trueRange as coreTrueRange, atr as coreAtr, natr as coreNatr } from "./core/volatility.js";
6
+ import { logReturn as coreLogReturn, percentReturn as corePercentReturn, realizedVolatility as coreRealizedVolatility } from "./core/performance.js";
7
+ import { obv as coreObv, mfi as coreMfi } from "./core/volume.js";
8
+ import { adx as coreAdx } from "./core/trend.js";
9
+ import { vwapSession as coreVwapSession, fundingRateCumulative as coreFundingRateCumulative, fundingRateAPR as coreFundingRateAPR, volatilityRegime as coreVolatilityRegime, signedVolume as coreSignedVolume, volumeDelta as coreVolumeDelta, orderflowImbalance as coreOrderflowImbalance } from "./core/crypto.js";
10
+ function isNumericArray(input) {
11
+ return Array.isArray(input) && (input.length === 0 || typeof input[0] === "number");
12
+ }
13
+ function parseHLC(input, low, close) {
14
+ if (isNumericArray(input)) {
15
+ if (!low || !close) {
16
+ throw new Error("Expected high, low, close arrays or candles/OHLCV object input");
17
+ }
18
+ assertFiniteSeries("high", input);
19
+ assertFiniteSeries("low", low);
20
+ assertFiniteSeries("close", close);
21
+ return { high: input, low, close };
22
+ }
23
+ return toOHLCV(input);
24
+ }
25
+ function parseOHLC(input, high, low, close) {
26
+ if (isNumericArray(input)) {
27
+ if (!high || !low || !close) {
28
+ throw new Error("Expected open, high, low, close arrays or candles/OHLCV object input");
29
+ }
30
+ assertFiniteSeries("open", input);
31
+ assertFiniteSeries("high", high);
32
+ assertFiniteSeries("low", low);
33
+ assertFiniteSeries("close", close);
34
+ return { open: input, high, low, close };
35
+ }
36
+ return toOHLCV(input);
37
+ }
38
+ function parseHLCV(input, low, close, volume) {
39
+ if (isNumericArray(input)) {
40
+ if (!low || !close || !volume) {
41
+ throw new Error("Expected high, low, close, volume arrays or candles/OHLCV object input");
42
+ }
43
+ assertFiniteSeries("high", input);
44
+ assertFiniteSeries("low", low);
45
+ assertFiniteSeries("close", close);
46
+ assertFiniteSeries("volume", volume);
47
+ return { high: input, low, close, volume };
48
+ }
49
+ return toOHLCV(input);
50
+ }
51
+ function parseOCV(input, close, volume) {
52
+ if (isNumericArray(input)) {
53
+ if (!close || !volume) {
54
+ throw new Error("Expected open, close, volume arrays or candles/OHLCV object input");
55
+ }
56
+ assertFiniteSeries("open", input);
57
+ assertFiniteSeries("close", close);
58
+ assertFiniteSeries("volume", volume);
59
+ return { open: input, close, volume };
60
+ }
61
+ return toOHLCV(input);
62
+ }
63
+ export function sma(input, length = 14) {
64
+ return coreSma(normalizePrice(input), length);
65
+ }
66
+ export function ema(input, length = 14) {
67
+ return coreEma(normalizePrice(input), length);
68
+ }
69
+ export function rma(input, length = 14) {
70
+ return coreRma(normalizePrice(input), length);
71
+ }
72
+ export function bbands(input, length = 20, std = 2) {
73
+ return coreBbands(normalizePrice(input), length, std);
74
+ }
75
+ export function macd(input, fast = 12, slow = 26, signal = 9) {
76
+ return coreMacd(normalizePrice(input), fast, slow, signal);
77
+ }
78
+ export function rsi(input, length = 14) {
79
+ return coreRsi(normalizePrice(input), length);
80
+ }
81
+ export function logReturn(input, cumulative = false) {
82
+ return coreLogReturn(normalizePrice(input), cumulative);
83
+ }
84
+ export function percentReturn(input, cumulative = false) {
85
+ return corePercentReturn(normalizePrice(input), cumulative);
86
+ }
87
+ export function realizedVolatility(input, length = 30, periodsPerYear = 365) {
88
+ return coreRealizedVolatility(normalizePrice(input), length, periodsPerYear);
89
+ }
90
+ export function hl2(input, low) {
91
+ if (isNumericArray(input)) {
92
+ if (!low)
93
+ throw new Error("Expected high + low arrays or candles/OHLCV object input");
94
+ return coreHl2(input, low);
95
+ }
96
+ const ohlcv = toOHLCV(input);
97
+ return coreHl2(ohlcv.high, ohlcv.low);
98
+ }
99
+ export function hlc3(input, low, close) {
100
+ const ohlcv = parseHLC(input, low, close);
101
+ return coreHlc3(ohlcv.high, ohlcv.low, ohlcv.close);
102
+ }
103
+ export function ohlc4(input, high, low, close) {
104
+ const ohlcv = parseOHLC(input, high, low, close);
105
+ return coreOhlc4(ohlcv.open, ohlcv.high, ohlcv.low, ohlcv.close);
106
+ }
107
+ export function vwap(input, lowOrLength, close, volume, length) {
108
+ if (isNumericArray(input)) {
109
+ const low = Array.isArray(lowOrLength) ? lowOrLength : undefined;
110
+ const resolvedLength = typeof lowOrLength === "number" ? lowOrLength : length;
111
+ const ohlcv = parseHLCV(input, low, close, volume);
112
+ return coreVwap(ohlcv.high, ohlcv.low, ohlcv.close, ohlcv.volume, resolvedLength);
113
+ }
114
+ const ohlcv = toOHLCV(input);
115
+ const resolvedLength = typeof lowOrLength === "number" ? lowOrLength : length;
116
+ return coreVwap(ohlcv.high, ohlcv.low, ohlcv.close, ohlcv.volume, resolvedLength);
117
+ }
118
+ export function stoch(input, lowOrKLength, closeOrDLength, kLength = 14, dLength = 3) {
119
+ if (isNumericArray(input)) {
120
+ const low = Array.isArray(lowOrKLength) ? lowOrKLength : undefined;
121
+ const close = Array.isArray(closeOrDLength) ? closeOrDLength : undefined;
122
+ const resolvedK = typeof lowOrKLength === "number" ? lowOrKLength : kLength;
123
+ const resolvedD = typeof closeOrDLength === "number" ? closeOrDLength : dLength;
124
+ const ohlcv = parseHLC(input, low, close);
125
+ return coreStoch(ohlcv.high, ohlcv.low, ohlcv.close, resolvedK, resolvedD);
126
+ }
127
+ const resolvedK = typeof lowOrKLength === "number" ? lowOrKLength : kLength;
128
+ const resolvedD = typeof closeOrDLength === "number" ? closeOrDLength : dLength;
129
+ const ohlcv = toOHLCV(input);
130
+ return coreStoch(ohlcv.high, ohlcv.low, ohlcv.close, resolvedK, resolvedD);
131
+ }
132
+ export function trueRange(input, low, close) {
133
+ const ohlcv = parseHLC(input, low, close);
134
+ return coreTrueRange(ohlcv.high, ohlcv.low, ohlcv.close);
135
+ }
136
+ export function atr(input, lowOrLength, close, length = 14) {
137
+ if (isNumericArray(input)) {
138
+ const low = Array.isArray(lowOrLength) ? lowOrLength : undefined;
139
+ const resolvedLength = typeof lowOrLength === "number" ? lowOrLength : length;
140
+ const ohlcv = parseHLC(input, low, close);
141
+ return coreAtr(ohlcv.high, ohlcv.low, ohlcv.close, resolvedLength);
142
+ }
143
+ const ohlcv = toOHLCV(input);
144
+ const resolvedLength = typeof lowOrLength === "number" ? lowOrLength : length;
145
+ return coreAtr(ohlcv.high, ohlcv.low, ohlcv.close, resolvedLength);
146
+ }
147
+ export function natr(input, lowOrLength, close, length = 14) {
148
+ if (isNumericArray(input)) {
149
+ const low = Array.isArray(lowOrLength) ? lowOrLength : undefined;
150
+ const resolvedLength = typeof lowOrLength === "number" ? lowOrLength : length;
151
+ const ohlcv = parseHLC(input, low, close);
152
+ return coreNatr(ohlcv.high, ohlcv.low, ohlcv.close, resolvedLength);
153
+ }
154
+ const ohlcv = toOHLCV(input);
155
+ const resolvedLength = typeof lowOrLength === "number" ? lowOrLength : length;
156
+ return coreNatr(ohlcv.high, ohlcv.low, ohlcv.close, resolvedLength);
157
+ }
158
+ export function obv(input, volume) {
159
+ if (isNumericArray(input)) {
160
+ if (!volume)
161
+ throw new Error("Expected close + volume arrays or candles/OHLCV object input");
162
+ return coreObv(input, volume);
163
+ }
164
+ const ohlcv = toOHLCV(input);
165
+ return coreObv(ohlcv.close, ohlcv.volume);
166
+ }
167
+ export function mfi(input, lowOrLength, close, volume, length = 14) {
168
+ if (isNumericArray(input)) {
169
+ const low = Array.isArray(lowOrLength) ? lowOrLength : undefined;
170
+ const resolvedLength = typeof lowOrLength === "number" ? lowOrLength : length;
171
+ const ohlcv = parseHLCV(input, low, close, volume);
172
+ return coreMfi(ohlcv.high, ohlcv.low, ohlcv.close, ohlcv.volume, resolvedLength);
173
+ }
174
+ const ohlcv = toOHLCV(input);
175
+ const resolvedLength = typeof lowOrLength === "number" ? lowOrLength : length;
176
+ return coreMfi(ohlcv.high, ohlcv.low, ohlcv.close, ohlcv.volume, resolvedLength);
177
+ }
178
+ export function adx(input, lowOrLength, close, length = 14) {
179
+ if (isNumericArray(input)) {
180
+ const low = Array.isArray(lowOrLength) ? lowOrLength : undefined;
181
+ const resolvedLength = typeof lowOrLength === "number" ? lowOrLength : length;
182
+ const ohlcv = parseHLC(input, low, close);
183
+ return coreAdx(ohlcv.high, ohlcv.low, ohlcv.close, resolvedLength);
184
+ }
185
+ const ohlcv = toOHLCV(input);
186
+ const resolvedLength = typeof lowOrLength === "number" ? lowOrLength : length;
187
+ return coreAdx(ohlcv.high, ohlcv.low, ohlcv.close, resolvedLength);
188
+ }
189
+ export function vwapSession(input, lowOrSession, close, volume, session) {
190
+ if (isNumericArray(input)) {
191
+ if (!isNumericArray(lowOrSession)) {
192
+ throw new Error("Expected high, low, close, volume, session arrays");
193
+ }
194
+ if (!session || !close || !volume) {
195
+ throw new Error("Expected high, low, close, volume, session arrays");
196
+ }
197
+ return coreVwapSession(input, lowOrSession, close, volume, session);
198
+ }
199
+ if (!Array.isArray(lowOrSession)) {
200
+ throw new Error("session must be an array");
201
+ }
202
+ const ohlcv = toOHLCV(input);
203
+ return coreVwapSession(ohlcv.high, ohlcv.low, ohlcv.close, ohlcv.volume, lowOrSession);
204
+ }
205
+ export function signedVolume(input, close, volume) {
206
+ const ohlcv = parseOCV(input, close, volume);
207
+ return coreSignedVolume(ohlcv.open, ohlcv.close, ohlcv.volume);
208
+ }
209
+ export function volumeDelta(input, closeOrLength, volume, length = 14) {
210
+ if (isNumericArray(input)) {
211
+ const close = Array.isArray(closeOrLength) ? closeOrLength : undefined;
212
+ const resolvedLength = typeof closeOrLength === "number" ? closeOrLength : length;
213
+ const ohlcv = parseOCV(input, close, volume);
214
+ return coreVolumeDelta(ohlcv.open, ohlcv.close, ohlcv.volume, resolvedLength);
215
+ }
216
+ const ohlcv = toOHLCV(input);
217
+ const resolvedLength = typeof closeOrLength === "number" ? closeOrLength : length;
218
+ return coreVolumeDelta(ohlcv.open, ohlcv.close, ohlcv.volume, resolvedLength);
219
+ }
220
+ export function orderflowImbalance(input, closeOrLength, volume, length = 14) {
221
+ if (isNumericArray(input)) {
222
+ const close = Array.isArray(closeOrLength) ? closeOrLength : undefined;
223
+ const resolvedLength = typeof closeOrLength === "number" ? closeOrLength : length;
224
+ const ohlcv = parseOCV(input, close, volume);
225
+ return coreOrderflowImbalance(ohlcv.open, ohlcv.close, ohlcv.volume, resolvedLength);
226
+ }
227
+ const ohlcv = toOHLCV(input);
228
+ const resolvedLength = typeof closeOrLength === "number" ? closeOrLength : length;
229
+ return coreOrderflowImbalance(ohlcv.open, ohlcv.close, ohlcv.volume, resolvedLength);
230
+ }
231
+ export function fundingRateCumulative(values) {
232
+ assertFiniteSeries("values", values);
233
+ return coreFundingRateCumulative(values);
234
+ }
235
+ export function fundingRateAPR(values, periodsPerYear = 365 * 3) {
236
+ assertFiniteSeries("values", values);
237
+ return coreFundingRateAPR(values, periodsPerYear);
238
+ }
239
+ export function volatilityRegime(input, length = 30, periodsPerYear = 365, lowZ = -0.5, highZ = 0.5) {
240
+ return coreVolatilityRegime(normalizePrice(input), length, periodsPerYear, lowZ, highZ);
241
+ }
@@ -0,0 +1,9 @@
1
+ import type { Candle, OHLCV, OHLCVInput, PriceInput } from "./types.js";
2
+ export declare function isCandleArray(input: PriceInput | OHLCVInput): input is Candle[];
3
+ export declare function normalizePrice(input: PriceInput, name?: string): number[];
4
+ export declare function pluckOpen(candles: Candle[]): number[];
5
+ export declare function pluckHigh(candles: Candle[]): number[];
6
+ export declare function pluckLow(candles: Candle[]): number[];
7
+ export declare function pluckClose(candles: Candle[]): number[];
8
+ export declare function pluckVolume(candles: Candle[], fallback?: number): number[];
9
+ export declare function toOHLCV(input: Candle[] | OHLCVInput, volumeFallback?: number): OHLCV;
@@ -0,0 +1,98 @@
1
+ import { assertFiniteSeries, assertSameLength, isNum } from "./core/math.js";
2
+ function readField(candle, index, name, alias) {
3
+ const value = candle[name] ?? candle[alias];
4
+ if (!isNum(value)) {
5
+ throw new Error(`candles[${index}].${name} (or .${alias}) must be a finite number`);
6
+ }
7
+ return value;
8
+ }
9
+ function readTime(candle) {
10
+ const value = candle.time ?? candle.t;
11
+ return value;
12
+ }
13
+ function hasOHLCVArrays(input) {
14
+ return "open" in input && "high" in input && "low" in input && "close" in input;
15
+ }
16
+ export function isCandleArray(input) {
17
+ return Array.isArray(input) && input.length > 0 && typeof input[0] !== "number";
18
+ }
19
+ export function normalizePrice(input, name = "values") {
20
+ if (Array.isArray(input) && (input.length === 0 || typeof input[0] === "number")) {
21
+ assertFiniteSeries(name, input);
22
+ return input;
23
+ }
24
+ return pluckClose(input);
25
+ }
26
+ export function pluckOpen(candles) {
27
+ const out = candles.map((candle, index) => readField(candle, index, "open", "o"));
28
+ assertFiniteSeries("open", out);
29
+ return out;
30
+ }
31
+ export function pluckHigh(candles) {
32
+ const out = candles.map((candle, index) => readField(candle, index, "high", "h"));
33
+ assertFiniteSeries("high", out);
34
+ return out;
35
+ }
36
+ export function pluckLow(candles) {
37
+ const out = candles.map((candle, index) => readField(candle, index, "low", "l"));
38
+ assertFiniteSeries("low", out);
39
+ return out;
40
+ }
41
+ export function pluckClose(candles) {
42
+ const out = candles.map((candle, index) => readField(candle, index, "close", "c"));
43
+ assertFiniteSeries("close", out);
44
+ return out;
45
+ }
46
+ export function pluckVolume(candles, fallback = 0) {
47
+ if (!isNum(fallback)) {
48
+ throw new Error("volumeFallback must be a finite number");
49
+ }
50
+ const out = candles.map((candle, index) => {
51
+ const value = candle.volume ?? candle.v;
52
+ const normalized = value === undefined ? fallback : value;
53
+ if (!isNum(normalized)) {
54
+ throw new Error(`candles[${index}].volume (or .v) must be a finite number`);
55
+ }
56
+ return normalized;
57
+ });
58
+ assertFiniteSeries("volume", out);
59
+ return out;
60
+ }
61
+ export function toOHLCV(input, volumeFallback = 0) {
62
+ if (Array.isArray(input)) {
63
+ return {
64
+ open: pluckOpen(input),
65
+ high: pluckHigh(input),
66
+ low: pluckLow(input),
67
+ close: pluckClose(input),
68
+ volume: pluckVolume(input, volumeFallback),
69
+ time: input.map(c => readTime(c))
70
+ };
71
+ }
72
+ if (hasOHLCVArrays(input)) {
73
+ assertFiniteSeries("open", input.open);
74
+ assertFiniteSeries("high", input.high);
75
+ assertFiniteSeries("low", input.low);
76
+ assertFiniteSeries("close", input.close);
77
+ const volume = input.volume ?? new Array(input.close.length).fill(volumeFallback);
78
+ assertFiniteSeries("volume", volume);
79
+ assertSameLength(input.open, input.high, input.low, input.close, volume);
80
+ const time = input.time ?? new Array(input.close.length).fill(undefined);
81
+ if (time.length !== input.close.length) {
82
+ throw new Error(`All series must have the same length (expected ${input.close.length}, got ${time.length})`);
83
+ }
84
+ return { open: input.open, high: input.high, low: input.low, close: input.close, volume, time };
85
+ }
86
+ assertFiniteSeries("open", input.o);
87
+ assertFiniteSeries("high", input.h);
88
+ assertFiniteSeries("low", input.l);
89
+ assertFiniteSeries("close", input.c);
90
+ const volume = input.v ?? new Array(input.c.length).fill(volumeFallback);
91
+ assertFiniteSeries("volume", volume);
92
+ assertSameLength(input.o, input.h, input.l, input.c, volume);
93
+ const time = input.t ?? new Array(input.c.length).fill(undefined);
94
+ if (time.length !== input.c.length) {
95
+ throw new Error(`All series must have the same length (expected ${input.c.length}, got ${time.length})`);
96
+ }
97
+ return { open: input.o, high: input.h, low: input.l, close: input.c, volume, time };
98
+ }
@@ -1,4 +1,5 @@
1
1
  export declare function isNum(value: unknown): value is number;
2
+ export declare function assertFiniteSeries(name: string, values: number[]): void;
2
3
  export declare function assertSameLength(...series: number[][]): void;
3
4
  export declare function makeSeries(length: number): Array<number | null>;
4
5
  export declare function sum(values: number[], start: number, end: number): number;
package/dist/core/math.js CHANGED
@@ -1,13 +1,20 @@
1
1
  export function isNum(value) {
2
2
  return typeof value === "number" && Number.isFinite(value);
3
3
  }
4
+ export function assertFiniteSeries(name, values) {
5
+ for (let i = 0; i < values.length; i++) {
6
+ if (!isNum(values[i])) {
7
+ throw new Error(`${name}[${i}] must be a finite number`);
8
+ }
9
+ }
10
+ }
4
11
  export function assertSameLength(...series) {
5
12
  if (series.length === 0)
6
13
  return;
7
14
  const len = series[0].length;
8
15
  for (const s of series) {
9
16
  if (s.length !== len) {
10
- throw new Error("All series must have the same length");
17
+ throw new Error(`All series must have the same length (expected ${len}, got ${s.length})`);
11
18
  }
12
19
  }
13
20
  }
@@ -1,4 +1,4 @@
1
- import { makeSeries } from "./math.js";
1
+ import { assertSameLength, makeSeries } from "./math.js";
2
2
  import { ema } from "./overlap.js";
3
3
  export function macd(values, fast = 12, slow = 26, signal = 9) {
4
4
  const fastEma = ema(values, fast);
@@ -47,10 +47,8 @@ export function rsi(values, length = 14) {
47
47
  return out;
48
48
  }
49
49
  export function stoch(high, low, close, kLength = 14, dLength = 3) {
50
+ assertSameLength(high, low, close);
50
51
  const len = close.length;
51
- if (high.length !== len || low.length !== len) {
52
- throw new Error("All series must have the same length");
53
- }
54
52
  const k = makeSeries(len);
55
53
  const d = makeSeries(len);
56
54
  for (let i = kLength - 1; i < len; i++) {
@@ -1,11 +1,9 @@
1
- import { makeSeries } from "./math.js";
1
+ import { assertSameLength, makeSeries } from "./math.js";
2
2
  import { rma } from "./overlap.js";
3
3
  import { trueRange } from "./volatility.js";
4
4
  export function adx(high, low, close, length = 14) {
5
+ assertSameLength(high, low, close);
5
6
  const len = close.length;
6
- if (high.length !== len || low.length !== len) {
7
- throw new Error("All series must have the same length");
8
- }
9
7
  const plusDM = new Array(len).fill(0);
10
8
  const minusDM = new Array(len).fill(0);
11
9
  for (let i = 1; i < len; i++) {
@@ -1,8 +1,6 @@
1
- import { makeSeries } from "./math.js";
1
+ import { assertSameLength, makeSeries } from "./math.js";
2
2
  export function obv(close, volume) {
3
- if (close.length !== volume.length) {
4
- throw new Error("All series must have the same length");
5
- }
3
+ assertSameLength(close, volume);
6
4
  const out = makeSeries(close.length);
7
5
  let acc = 0;
8
6
  for (let i = 0; i < close.length; i++) {
@@ -19,10 +17,8 @@ export function obv(close, volume) {
19
17
  return out;
20
18
  }
21
19
  export function mfi(high, low, close, volume, length = 14) {
20
+ assertSameLength(high, low, close, volume);
22
21
  const len = close.length;
23
- if (high.length !== len || low.length !== len || volume.length !== len) {
24
- throw new Error("All series must have the same length");
25
- }
26
22
  const out = makeSeries(len);
27
23
  if (length <= 0)
28
24
  return out;
@@ -0,0 +1,2 @@
1
+ export { vwapSession, fundingRateCumulative, fundingRateAPR, volatilityRegime, signedVolume, volumeDelta, orderflowImbalance } from "./api.js";
2
+ export { createVWAPSession } from "./stateful.js";
package/dist/crypto.js ADDED
@@ -0,0 +1,2 @@
1
+ export { vwapSession, fundingRateCumulative, fundingRateAPR, volatilityRegime, signedVolume, volumeDelta, orderflowImbalance } from "./api.js";
2
+ export { createVWAPSession } from "./stateful.js";
package/dist/index.d.ts CHANGED
@@ -1,52 +1,83 @@
1
- export { sma, ema, rma, hl2, hlc3, ohlc4, vwap, bbands } from "./core/overlap.js";
2
- export { rsi, macd, stoch } from "./core/momentum.js";
3
- export { trueRange, atr, natr } from "./core/volatility.js";
4
- export { logReturn, percentReturn, realizedVolatility } from "./core/performance.js";
5
- export { obv, mfi } from "./core/volume.js";
6
- export { adx } from "./core/trend.js";
7
- export { vwapSession, fundingRateCumulative, fundingRateAPR, volatilityRegime, signedVolume, volumeDelta, orderflowImbalance } from "./core/crypto.js";
1
+ export { sma, ema, rma, hl2, hlc3, ohlc4, vwap, bbands, rsi, macd, stoch, trueRange, atr, natr, logReturn, percentReturn, realizedVolatility, obv, mfi, adx, vwapSession, fundingRateCumulative, fundingRateAPR, volatilityRegime, signedVolume, volumeDelta, orderflowImbalance } from "./api.js";
2
+ export { pluckOpen, pluckHigh, pluckLow, pluckClose, pluckVolume, toOHLCV } from "./candles.js";
3
+ export { createSMA, createEMA, createRSI, createVWAPSession } from "./stateful.js";
8
4
  export * from "./types.js";
5
+ import * as stateful from "./stateful.js";
9
6
  export declare const ta: {
10
- vwapSession(high: number[], low: number[], close: number[], volume: number[], session: Array<string | number>): Array<number | null>;
11
- fundingRateCumulative(values: number[]): Array<number | null>;
12
- fundingRateAPR(values: number[], periodsPerYear?: number): Array<number | null>;
13
- volatilityRegime(values: number[], length?: number, periodsPerYear?: number, lowZ?: number, highZ?: number): Array<number | null>;
14
- signedVolume(open: number[], close: number[], volume: number[]): Array<number | null>;
15
- volumeDelta(open: number[], close: number[], volume: number[], length?: number): Array<number | null>;
16
- orderflowImbalance(open: number[], close: number[], volume: number[], length?: number): Array<number | null>;
17
- adx(high: number[], low: number[], close: number[], length?: number): {
18
- adx: (number | null)[];
19
- plusDI: (number | null)[];
20
- minusDI: (number | null)[];
7
+ createSMA(period?: number): stateful.StatefulIndicator<number, number | null>;
8
+ createEMA(period?: number): stateful.StatefulIndicator<number, number | null>;
9
+ createRSI(period?: number): stateful.StatefulIndicator<number, number | null>;
10
+ createVWAPSession(): stateful.StatefulIndicator<stateful.VWAPSessionInput, number | null>;
11
+ isCandleArray(input: import("./types.js").PriceInput | import("./types.js").OHLCVInput): input is import("./types.js").Candle[];
12
+ normalizePrice(input: import("./types.js").PriceInput, name?: string): number[];
13
+ pluckOpen(candles: import("./types.js").Candle[]): number[];
14
+ pluckHigh(candles: import("./types.js").Candle[]): number[];
15
+ pluckLow(candles: import("./types.js").Candle[]): number[];
16
+ pluckClose(candles: import("./types.js").Candle[]): number[];
17
+ pluckVolume(candles: import("./types.js").Candle[], fallback?: number): number[];
18
+ toOHLCV(input: import("./types.js").Candle[] | import("./types.js").OHLCVInput, volumeFallback?: number): import("./types.js").OHLCV;
19
+ sma(input: import("./types.js").PriceInput, length?: number): Array<number | null>;
20
+ ema(input: import("./types.js").PriceInput, length?: number): Array<number | null>;
21
+ rma(input: import("./types.js").PriceInput, length?: number): Array<number | null>;
22
+ bbands(input: import("./types.js").PriceInput, length?: number, std?: number): {
23
+ basis: (number | null)[];
24
+ upper: (number | null)[];
25
+ lower: (number | null)[];
21
26
  };
22
- obv(close: number[], volume: number[]): Array<number | null>;
23
- mfi(high: number[], low: number[], close: number[], volume: number[], length?: number): Array<number | null>;
24
- logReturn(values: number[], cumulative?: boolean): Array<number | null>;
25
- percentReturn(values: number[], cumulative?: boolean): Array<number | null>;
26
- realizedVolatility(values: number[], length?: number, periodsPerYear?: number): Array<number | null>;
27
- trueRange(high: number[], low: number[], close: number[]): Array<number | null>;
28
- atr(high: number[], low: number[], close: number[], length?: number): Array<number | null>;
29
- natr(high: number[], low: number[], close: number[], length?: number): Array<number | null>;
30
- macd(values: number[], fast?: number, slow?: number, signal?: number): {
27
+ macd(input: import("./types.js").PriceInput, fast?: number, slow?: number, signal?: number): {
31
28
  macd: (number | null)[];
32
29
  signal: (number | null)[];
33
30
  histogram: (number | null)[];
34
31
  };
35
- rsi(values: number[], length?: number): Array<number | null>;
36
- stoch(high: number[], low: number[], close: number[], kLength?: number, dLength?: number): {
37
- k: (number | null)[];
38
- d: (number | null)[];
39
- };
40
- sma(values: number[], length?: number): Array<number | null>;
41
- ema(values: number[], length?: number): Array<number | null>;
42
- rma(values: number[], length?: number): Array<number | null>;
32
+ rsi(input: import("./types.js").PriceInput, length?: number): Array<number | null>;
33
+ logReturn(input: import("./types.js").PriceInput, cumulative?: boolean): Array<number | null>;
34
+ percentReturn(input: import("./types.js").PriceInput, cumulative?: boolean): Array<number | null>;
35
+ realizedVolatility(input: import("./types.js").PriceInput, length?: number, periodsPerYear?: number): Array<number | null>;
43
36
  hl2(high: number[], low: number[]): Array<number | null>;
37
+ hl2(input: import("./types.js").OHLCVInput | import("./types.js").Candle[]): Array<number | null>;
44
38
  hlc3(high: number[], low: number[], close: number[]): Array<number | null>;
39
+ hlc3(input: import("./types.js").OHLCVInput | import("./types.js").Candle[]): Array<number | null>;
45
40
  ohlc4(open: number[], high: number[], low: number[], close: number[]): Array<number | null>;
41
+ ohlc4(input: import("./types.js").OHLCVInput | import("./types.js").Candle[]): Array<number | null>;
46
42
  vwap(high: number[], low: number[], close: number[], volume: number[], length?: number): Array<number | null>;
47
- bbands(values: number[], length?: number, std?: number): {
48
- basis: (number | null)[];
49
- upper: (number | null)[];
50
- lower: (number | null)[];
43
+ vwap(input: import("./types.js").OHLCVInput | import("./types.js").Candle[], length?: number): Array<number | null>;
44
+ stoch(high: number[], low: number[], close: number[], kLength?: number, dLength?: number): {
45
+ k: Array<number | null>;
46
+ d: Array<number | null>;
47
+ };
48
+ stoch(input: import("./types.js").OHLCVInput | import("./types.js").Candle[], kLength?: number, dLength?: number): {
49
+ k: Array<number | null>;
50
+ d: Array<number | null>;
51
+ };
52
+ trueRange(high: number[], low: number[], close: number[]): Array<number | null>;
53
+ trueRange(input: import("./types.js").OHLCVInput | import("./types.js").Candle[]): Array<number | null>;
54
+ atr(high: number[], low: number[], close: number[], length?: number): Array<number | null>;
55
+ atr(input: import("./types.js").OHLCVInput | import("./types.js").Candle[], length?: number): Array<number | null>;
56
+ natr(high: number[], low: number[], close: number[], length?: number): Array<number | null>;
57
+ natr(input: import("./types.js").OHLCVInput | import("./types.js").Candle[], length?: number): Array<number | null>;
58
+ obv(close: number[], volume: number[]): Array<number | null>;
59
+ obv(input: import("./types.js").OHLCVInput | import("./types.js").Candle[]): Array<number | null>;
60
+ mfi(high: number[], low: number[], close: number[], volume: number[], length?: number): Array<number | null>;
61
+ mfi(input: import("./types.js").OHLCVInput | import("./types.js").Candle[], length?: number): Array<number | null>;
62
+ adx(high: number[], low: number[], close: number[], length?: number): {
63
+ adx: Array<number | null>;
64
+ plusDI: Array<number | null>;
65
+ minusDI: Array<number | null>;
66
+ };
67
+ adx(input: import("./types.js").OHLCVInput | import("./types.js").Candle[], length?: number): {
68
+ adx: Array<number | null>;
69
+ plusDI: Array<number | null>;
70
+ minusDI: Array<number | null>;
51
71
  };
72
+ vwapSession(high: number[], low: number[], close: number[], volume: number[], session: Array<string | number>): Array<number | null>;
73
+ vwapSession(input: import("./types.js").OHLCVInput | import("./types.js").Candle[], session: Array<string | number>): Array<number | null>;
74
+ signedVolume(open: number[], close: number[], volume: number[]): Array<number | null>;
75
+ signedVolume(input: import("./types.js").OHLCVInput | import("./types.js").Candle[]): Array<number | null>;
76
+ volumeDelta(open: number[], close: number[], volume: number[], length?: number): Array<number | null>;
77
+ volumeDelta(input: import("./types.js").OHLCVInput | import("./types.js").Candle[], length?: number): Array<number | null>;
78
+ orderflowImbalance(open: number[], close: number[], volume: number[], length?: number): Array<number | null>;
79
+ orderflowImbalance(input: import("./types.js").OHLCVInput | import("./types.js").Candle[], length?: number): Array<number | null>;
80
+ fundingRateCumulative(values: number[]): Array<number | null>;
81
+ fundingRateAPR(values: number[], periodsPerYear?: number): Array<number | null>;
82
+ volatilityRegime(input: import("./types.js").PriceInput, length?: number, periodsPerYear?: number, lowZ?: number, highZ?: number): Array<number | null>;
52
83
  };
package/dist/index.js CHANGED
@@ -1,24 +1,12 @@
1
- export { sma, ema, rma, hl2, hlc3, ohlc4, vwap, bbands } from "./core/overlap.js";
2
- export { rsi, macd, stoch } from "./core/momentum.js";
3
- export { trueRange, atr, natr } from "./core/volatility.js";
4
- export { logReturn, percentReturn, realizedVolatility } from "./core/performance.js";
5
- export { obv, mfi } from "./core/volume.js";
6
- export { adx } from "./core/trend.js";
7
- export { vwapSession, fundingRateCumulative, fundingRateAPR, volatilityRegime, signedVolume, volumeDelta, orderflowImbalance } from "./core/crypto.js";
1
+ export { sma, ema, rma, hl2, hlc3, ohlc4, vwap, bbands, rsi, macd, stoch, trueRange, atr, natr, logReturn, percentReturn, realizedVolatility, obv, mfi, adx, vwapSession, fundingRateCumulative, fundingRateAPR, volatilityRegime, signedVolume, volumeDelta, orderflowImbalance } from "./api.js";
2
+ export { pluckOpen, pluckHigh, pluckLow, pluckClose, pluckVolume, toOHLCV } from "./candles.js";
3
+ export { createSMA, createEMA, createRSI, createVWAPSession } from "./stateful.js";
8
4
  export * from "./types.js";
9
- import * as overlap from "./core/overlap.js";
10
- import * as momentum from "./core/momentum.js";
11
- import * as volatility from "./core/volatility.js";
12
- import * as performance from "./core/performance.js";
13
- import * as volume from "./core/volume.js";
14
- import * as trend from "./core/trend.js";
15
- import * as crypto from "./core/crypto.js";
5
+ import * as api from "./api.js";
6
+ import * as candles from "./candles.js";
7
+ import * as stateful from "./stateful.js";
16
8
  export const ta = {
17
- ...overlap,
18
- ...momentum,
19
- ...volatility,
20
- ...performance,
21
- ...volume,
22
- ...trend,
23
- ...crypto
9
+ ...api,
10
+ ...candles,
11
+ ...stateful
24
12
  };
@@ -0,0 +1 @@
1
+ export { sma, ema, rma, hl2, hlc3, ohlc4, vwap, bbands, rsi, macd, stoch, trueRange, atr, natr, logReturn, percentReturn, realizedVolatility, obv, mfi, adx } from "./api.js";
@@ -0,0 +1 @@
1
+ export { sma, ema, rma, hl2, hlc3, ohlc4, vwap, bbands, rsi, macd, stoch, trueRange, atr, natr, logReturn, percentReturn, realizedVolatility, obv, mfi, adx } from "./api.js";
@@ -0,0 +1,15 @@
1
+ export type StatefulIndicator<TIn, TOut> = {
2
+ next(value: TIn): TOut;
3
+ reset(): void;
4
+ };
5
+ export declare function createSMA(period?: number): StatefulIndicator<number, number | null>;
6
+ export declare function createEMA(period?: number): StatefulIndicator<number, number | null>;
7
+ export declare function createRSI(period?: number): StatefulIndicator<number, number | null>;
8
+ export type VWAPSessionInput = {
9
+ high: number;
10
+ low: number;
11
+ close: number;
12
+ volume: number;
13
+ sessionId: string | number;
14
+ };
15
+ export declare function createVWAPSession(): StatefulIndicator<VWAPSessionInput, number | null>;