@coderyo/indicators 1.0.0-rc.2
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/index.d.ts +41 -0
- package/dist/index.js +148 -0
- package/dist/index.js.map +1 -0
- package/package.json +39 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Bar } from '@coderyo/data';
|
|
2
|
+
|
|
3
|
+
declare function sma(bars: Bar[], period: number, field?: 'close' | 'open'): (number | null)[];
|
|
4
|
+
declare function ema(bars: Bar[], period: number, field?: 'close' | 'open'): (number | null)[];
|
|
5
|
+
|
|
6
|
+
interface MacdResult {
|
|
7
|
+
macd: (number | null)[];
|
|
8
|
+
signal: (number | null)[];
|
|
9
|
+
histogram: (number | null)[];
|
|
10
|
+
}
|
|
11
|
+
declare function macd(bars: Bar[], fast?: number, slow?: number, signalPeriod?: number): MacdResult;
|
|
12
|
+
|
|
13
|
+
declare function rsi(bars: Bar[], period?: number): (number | null)[];
|
|
14
|
+
|
|
15
|
+
interface KdjResult {
|
|
16
|
+
k: (number | null)[];
|
|
17
|
+
d: (number | null)[];
|
|
18
|
+
j: (number | null)[];
|
|
19
|
+
}
|
|
20
|
+
declare function kdj(bars: Bar[], period?: number, kSmooth?: number, dSmooth?: number): KdjResult;
|
|
21
|
+
|
|
22
|
+
type IndicatorSource = 'close' | 'hlc3';
|
|
23
|
+
interface IndicatorConfig {
|
|
24
|
+
source: IndicatorSource;
|
|
25
|
+
maPeriod: number;
|
|
26
|
+
volMaPeriod: number;
|
|
27
|
+
macdFast: number;
|
|
28
|
+
macdSlow: number;
|
|
29
|
+
macdSignal: number;
|
|
30
|
+
rsiPeriod: number;
|
|
31
|
+
kdjPeriod: number;
|
|
32
|
+
kdjKSmooth: number;
|
|
33
|
+
kdjDSmooth: number;
|
|
34
|
+
showMacd: boolean;
|
|
35
|
+
showRsi: boolean;
|
|
36
|
+
showKdj: boolean;
|
|
37
|
+
}
|
|
38
|
+
declare const DEFAULT_INDICATOR_CONFIG: IndicatorConfig;
|
|
39
|
+
declare function indicatorConfigStorageKey(symbol: string, interval: string): string;
|
|
40
|
+
|
|
41
|
+
export { DEFAULT_INDICATOR_CONFIG, type IndicatorConfig, type IndicatorSource, type KdjResult, type MacdResult, ema, indicatorConfigStorageKey, kdj, macd, rsi, sma };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
// src/ma.ts
|
|
2
|
+
function sma(bars, period, field = "close") {
|
|
3
|
+
const out = [];
|
|
4
|
+
for (let i = 0; i < bars.length; i++) {
|
|
5
|
+
if (i < period - 1) {
|
|
6
|
+
out.push(null);
|
|
7
|
+
continue;
|
|
8
|
+
}
|
|
9
|
+
let sum = 0;
|
|
10
|
+
for (let j = 0; j < period; j++) {
|
|
11
|
+
sum += bars[i - j][field === "close" ? "c" : "o"];
|
|
12
|
+
}
|
|
13
|
+
out.push(sum / period);
|
|
14
|
+
}
|
|
15
|
+
return out;
|
|
16
|
+
}
|
|
17
|
+
function ema(bars, period, field = "close") {
|
|
18
|
+
const k = 2 / (period + 1);
|
|
19
|
+
const out = [];
|
|
20
|
+
let prev = null;
|
|
21
|
+
for (let i = 0; i < bars.length; i++) {
|
|
22
|
+
const v = bars[i][field === "close" ? "c" : "o"];
|
|
23
|
+
if (prev === null) {
|
|
24
|
+
prev = v;
|
|
25
|
+
out.push(i < period - 1 ? null : v);
|
|
26
|
+
} else {
|
|
27
|
+
prev = v * k + prev * (1 - k);
|
|
28
|
+
out.push(i < period - 1 ? null : prev);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return out;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// src/macd.ts
|
|
35
|
+
function macd(bars, fast = 12, slow = 26, signalPeriod = 9) {
|
|
36
|
+
const fastEma = ema(bars, fast);
|
|
37
|
+
const slowEma = ema(bars, slow);
|
|
38
|
+
const line = bars.map((_, i) => {
|
|
39
|
+
const f = fastEma[i];
|
|
40
|
+
const s = slowEma[i];
|
|
41
|
+
if (f == null || s == null) return null;
|
|
42
|
+
return f - s;
|
|
43
|
+
});
|
|
44
|
+
const pseudoBars = bars.map((b, i) => ({
|
|
45
|
+
...b,
|
|
46
|
+
c: line[i] ?? b.c
|
|
47
|
+
}));
|
|
48
|
+
const signal = ema(pseudoBars, signalPeriod);
|
|
49
|
+
const histogram = line.map(
|
|
50
|
+
(m, i) => m == null || signal[i] == null ? null : m - signal[i]
|
|
51
|
+
);
|
|
52
|
+
return { macd: line, signal, histogram };
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// src/rsi.ts
|
|
56
|
+
function rsi(bars, period = 14) {
|
|
57
|
+
const out = [];
|
|
58
|
+
let avgGain = 0;
|
|
59
|
+
let avgLoss = 0;
|
|
60
|
+
for (let i = 0; i < bars.length; i++) {
|
|
61
|
+
if (i === 0) {
|
|
62
|
+
out.push(null);
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
const change = bars[i].c - bars[i - 1].c;
|
|
66
|
+
const gain = Math.max(change, 0);
|
|
67
|
+
const loss = Math.max(-change, 0);
|
|
68
|
+
if (i < period) {
|
|
69
|
+
avgGain += gain;
|
|
70
|
+
avgLoss += loss;
|
|
71
|
+
out.push(null);
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
if (i === period) {
|
|
75
|
+
avgGain /= period;
|
|
76
|
+
avgLoss /= period;
|
|
77
|
+
} else {
|
|
78
|
+
avgGain = (avgGain * (period - 1) + gain) / period;
|
|
79
|
+
avgLoss = (avgLoss * (period - 1) + loss) / period;
|
|
80
|
+
}
|
|
81
|
+
const rs = avgLoss === 0 ? 100 : avgGain / avgLoss;
|
|
82
|
+
out.push(100 - 100 / (1 + rs));
|
|
83
|
+
}
|
|
84
|
+
return out;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// src/kdj.ts
|
|
88
|
+
function kdj(bars, period = 9, kSmooth = 3, dSmooth = 3) {
|
|
89
|
+
const rsv = [];
|
|
90
|
+
const k = [];
|
|
91
|
+
const d = [];
|
|
92
|
+
const j = [];
|
|
93
|
+
for (let i = 0; i < bars.length; i++) {
|
|
94
|
+
if (i < period - 1) {
|
|
95
|
+
rsv.push(null);
|
|
96
|
+
k.push(null);
|
|
97
|
+
d.push(null);
|
|
98
|
+
j.push(null);
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
let hh = -Infinity;
|
|
102
|
+
let ll = Infinity;
|
|
103
|
+
for (let x = i - period + 1; x <= i; x++) {
|
|
104
|
+
hh = Math.max(hh, bars[x].h);
|
|
105
|
+
ll = Math.min(ll, bars[x].l);
|
|
106
|
+
}
|
|
107
|
+
const r = hh === ll ? 50 : (bars[i].c - ll) / (hh - ll) * 100;
|
|
108
|
+
rsv.push(r);
|
|
109
|
+
const prevK = k[i - 1] ?? 50;
|
|
110
|
+
const prevD = d[i - 1] ?? 50;
|
|
111
|
+
const kv = (prevK * (kSmooth - 1) + r) / kSmooth;
|
|
112
|
+
const dv = (prevD * (dSmooth - 1) + kv) / dSmooth;
|
|
113
|
+
k.push(kv);
|
|
114
|
+
d.push(dv);
|
|
115
|
+
j.push(3 * kv - 2 * dv);
|
|
116
|
+
}
|
|
117
|
+
return { k, d, j };
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// src/config.ts
|
|
121
|
+
var DEFAULT_INDICATOR_CONFIG = {
|
|
122
|
+
source: "close",
|
|
123
|
+
maPeriod: 20,
|
|
124
|
+
volMaPeriod: 5,
|
|
125
|
+
macdFast: 12,
|
|
126
|
+
macdSlow: 26,
|
|
127
|
+
macdSignal: 9,
|
|
128
|
+
rsiPeriod: 14,
|
|
129
|
+
kdjPeriod: 9,
|
|
130
|
+
kdjKSmooth: 3,
|
|
131
|
+
kdjDSmooth: 3,
|
|
132
|
+
showMacd: true,
|
|
133
|
+
showRsi: true,
|
|
134
|
+
showKdj: true
|
|
135
|
+
};
|
|
136
|
+
function indicatorConfigStorageKey(symbol, interval) {
|
|
137
|
+
return `tradview:indicators:${symbol}:${interval}`;
|
|
138
|
+
}
|
|
139
|
+
export {
|
|
140
|
+
DEFAULT_INDICATOR_CONFIG,
|
|
141
|
+
ema,
|
|
142
|
+
indicatorConfigStorageKey,
|
|
143
|
+
kdj,
|
|
144
|
+
macd,
|
|
145
|
+
rsi,
|
|
146
|
+
sma
|
|
147
|
+
};
|
|
148
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ma.ts","../src/macd.ts","../src/rsi.ts","../src/kdj.ts","../src/config.ts"],"sourcesContent":["import type { Bar } from '@coderyo/data';\n\nexport function sma(bars: Bar[], period: number, field: 'close' | 'open' = 'close'): (number | null)[] {\n const out: (number | null)[] = [];\n for (let i = 0; i < bars.length; i++) {\n if (i < period - 1) {\n out.push(null);\n continue;\n }\n let sum = 0;\n for (let j = 0; j < period; j++) {\n sum += bars[i - j]![field === 'close' ? 'c' : 'o'];\n }\n out.push(sum / period);\n }\n return out;\n}\n\nexport function ema(bars: Bar[], period: number, field: 'close' | 'open' = 'close'): (number | null)[] {\n const k = 2 / (period + 1);\n const out: (number | null)[] = [];\n let prev: number | null = null;\n for (let i = 0; i < bars.length; i++) {\n const v = bars[i]![field === 'close' ? 'c' : 'o'];\n if (prev === null) {\n prev = v;\n out.push(i < period - 1 ? null : v);\n } else {\n prev = v * k + prev * (1 - k);\n out.push(i < period - 1 ? null : prev);\n }\n }\n return out;\n}","import type { Bar } from '@coderyo/data';\nimport { ema } from './ma.js';\n\nexport interface MacdResult {\n macd: (number | null)[];\n signal: (number | null)[];\n histogram: (number | null)[];\n}\n\nexport function macd(\n bars: Bar[],\n fast = 12,\n slow = 26,\n signalPeriod = 9,\n): MacdResult {\n const fastEma = ema(bars, fast);\n const slowEma = ema(bars, slow);\n const line: (number | null)[] = bars.map((_, i) => {\n const f = fastEma[i];\n const s = slowEma[i];\n if (f == null || s == null) return null;\n return f - s;\n });\n const pseudoBars = bars.map((b, i) => ({\n ...b,\n c: line[i] ?? b.c,\n }));\n const signal = ema(pseudoBars, signalPeriod);\n const histogram = line.map((m, i) =>\n m == null || signal[i] == null ? null : m - signal[i]!,\n );\n return { macd: line, signal, histogram };\n}","import type { Bar } from '@coderyo/data';\n\nexport function rsi(bars: Bar[], period = 14): (number | null)[] {\n const out: (number | null)[] = [];\n let avgGain = 0;\n let avgLoss = 0;\n\n for (let i = 0; i < bars.length; i++) {\n if (i === 0) {\n out.push(null);\n continue;\n }\n const change = bars[i]!.c - bars[i - 1]!.c;\n const gain = Math.max(change, 0);\n const loss = Math.max(-change, 0);\n\n if (i < period) {\n avgGain += gain;\n avgLoss += loss;\n out.push(null);\n continue;\n }\n if (i === period) {\n avgGain /= period;\n avgLoss /= period;\n } else {\n avgGain = (avgGain * (period - 1) + gain) / period;\n avgLoss = (avgLoss * (period - 1) + loss) / period;\n }\n const rs = avgLoss === 0 ? 100 : avgGain / avgLoss;\n out.push(100 - 100 / (1 + rs));\n }\n return out;\n}","import type { Bar } from '@coderyo/data';\n\nexport interface KdjResult {\n k: (number | null)[];\n d: (number | null)[];\n j: (number | null)[];\n}\n\nexport function kdj(bars: Bar[], period = 9, kSmooth = 3, dSmooth = 3): KdjResult {\n const rsv: (number | null)[] = [];\n const k: (number | null)[] = [];\n const d: (number | null)[] = [];\n const j: (number | null)[] = [];\n\n for (let i = 0; i < bars.length; i++) {\n if (i < period - 1) {\n rsv.push(null);\n k.push(null);\n d.push(null);\n j.push(null);\n continue;\n }\n let hh = -Infinity;\n let ll = Infinity;\n for (let x = i - period + 1; x <= i; x++) {\n hh = Math.max(hh, bars[x]!.h);\n ll = Math.min(ll, bars[x]!.l);\n }\n const r = hh === ll ? 50 : ((bars[i]!.c - ll) / (hh - ll)) * 100;\n rsv.push(r);\n const prevK = k[i - 1] ?? 50;\n const prevD = d[i - 1] ?? 50;\n const kv = (prevK * (kSmooth - 1) + r) / kSmooth;\n const dv = (prevD * (dSmooth - 1) + kv) / dSmooth;\n k.push(kv);\n d.push(dv);\n j.push(3 * kv - 2 * dv);\n }\n return { k, d, j };\n}","export type IndicatorSource = 'close' | 'hlc3';\n\nexport interface IndicatorConfig {\n source: IndicatorSource;\n maPeriod: number;\n volMaPeriod: number;\n macdFast: number;\n macdSlow: number;\n macdSignal: number;\n rsiPeriod: number;\n kdjPeriod: number;\n kdjKSmooth: number;\n kdjDSmooth: number;\n showMacd: boolean;\n showRsi: boolean;\n showKdj: boolean;\n}\n\nexport const DEFAULT_INDICATOR_CONFIG: IndicatorConfig = {\n source: 'close',\n maPeriod: 20,\n volMaPeriod: 5,\n macdFast: 12,\n macdSlow: 26,\n macdSignal: 9,\n rsiPeriod: 14,\n kdjPeriod: 9,\n kdjKSmooth: 3,\n kdjDSmooth: 3,\n showMacd: true,\n showRsi: true,\n showKdj: true,\n};\n\nexport function indicatorConfigStorageKey(symbol: string, interval: string): string {\n return `tradview:indicators:${symbol}:${interval}`;\n}"],"mappings":"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","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@coderyo/indicators",
|
|
3
|
+
"version": "1.0.0-rc.2",
|
|
4
|
+
"license": "MIT",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"exports": {
|
|
7
|
+
".": {
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"import": "./dist/index.js"
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
"dependencies": {
|
|
13
|
+
"@coderyo/data": "1.0.0-rc.2"
|
|
14
|
+
},
|
|
15
|
+
"devDependencies": {
|
|
16
|
+
"tsup": "^8.5.0",
|
|
17
|
+
"typescript": "^5.8.3",
|
|
18
|
+
"vitest": "^3.2.4",
|
|
19
|
+
"@coderyo/eslint-config": "0.0.0",
|
|
20
|
+
"@coderyo/tsconfig": "0.0.0"
|
|
21
|
+
},
|
|
22
|
+
"files": [
|
|
23
|
+
"dist"
|
|
24
|
+
],
|
|
25
|
+
"repository": {
|
|
26
|
+
"type": "git",
|
|
27
|
+
"url": "git+https://github.com/CodeRyoStudio/tradview.git",
|
|
28
|
+
"directory": "packages/indicators"
|
|
29
|
+
},
|
|
30
|
+
"publishConfig": {
|
|
31
|
+
"access": "public"
|
|
32
|
+
},
|
|
33
|
+
"scripts": {
|
|
34
|
+
"build": "tsup",
|
|
35
|
+
"test": "vitest run",
|
|
36
|
+
"lint": "eslint src",
|
|
37
|
+
"typecheck": "tsc --noEmit"
|
|
38
|
+
}
|
|
39
|
+
}
|