@coderyo/indicators 1.0.3 → 1.1.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/index.d.ts +15 -1
- package/dist/index.js +56 -2
- package/dist/index.js.map +1 -1
- package/package.json +13 -12
package/dist/index.d.ts
CHANGED
|
@@ -49,6 +49,8 @@ interface IndicatorConfig {
|
|
|
49
49
|
showKdj: boolean;
|
|
50
50
|
showMa: boolean;
|
|
51
51
|
showVolMa: boolean;
|
|
52
|
+
/** Volume histogram pane below main price chart. */
|
|
53
|
+
showVolume: boolean;
|
|
52
54
|
}
|
|
53
55
|
declare const DEFAULT_INDICATOR_CONFIG: IndicatorConfig;
|
|
54
56
|
declare function hasVisibleIndicatorPanes(config: IndicatorConfig): boolean;
|
|
@@ -58,5 +60,17 @@ declare function hasAnyActiveIndicators(config: IndicatorConfig): boolean;
|
|
|
58
60
|
/** Hide all indicator panes and main-chart overlays (MA / EMA / BOLL / vol MA). */
|
|
59
61
|
declare function clearedIndicatorConfig(base?: IndicatorConfig): IndicatorConfig;
|
|
60
62
|
declare function indicatorConfigStorageKey(symbol: string, interval: string): string;
|
|
63
|
+
/** Built-in indicator layer id for per-layer remove. */
|
|
64
|
+
type IndicatorLayerId = 'ma' | 'ema' | 'boll' | 'volMa' | 'volume' | 'macd' | 'rsi' | 'kdj';
|
|
65
|
+
interface IndicatorLayerInfo {
|
|
66
|
+
id: IndicatorLayerId;
|
|
67
|
+
label: string;
|
|
68
|
+
/** Main price pane overlay vs separate indicator pane. */
|
|
69
|
+
target: 'main' | 'pane';
|
|
70
|
+
}
|
|
71
|
+
/** @public List enabled built-in indicator layers for a config snapshot. */
|
|
72
|
+
declare function listActiveIndicatorLayers(config: IndicatorConfig): IndicatorLayerInfo[];
|
|
73
|
+
/** @public Turn off a single built-in indicator layer; other params unchanged. */
|
|
74
|
+
declare function disableIndicatorLayer(config: IndicatorConfig, id: IndicatorLayerId): IndicatorConfig;
|
|
61
75
|
|
|
62
|
-
export { type BollResult, DEFAULT_INDICATOR_CONFIG, type IndicatorConfig, type IndicatorSource, type KdjResult, type MacdResult, boll, clearedIndicatorConfig, ema, hasAnyActiveIndicators, hasMainChartOverlays, hasVisibleIndicatorPanes, indicatorConfigStorageKey, kdj, macd, rsi, sma };
|
|
76
|
+
export { type BollResult, DEFAULT_INDICATOR_CONFIG, type IndicatorConfig, type IndicatorLayerId, type IndicatorLayerInfo, type IndicatorSource, type KdjResult, type MacdResult, boll, clearedIndicatorConfig, disableIndicatorLayer, ema, hasAnyActiveIndicators, hasMainChartOverlays, hasVisibleIndicatorPanes, indicatorConfigStorageKey, kdj, listActiveIndicatorLayers, macd, rsi, sma };
|
package/dist/index.js
CHANGED
|
@@ -163,7 +163,8 @@ var DEFAULT_INDICATOR_CONFIG = {
|
|
|
163
163
|
showRsi: true,
|
|
164
164
|
showKdj: true,
|
|
165
165
|
showMa: true,
|
|
166
|
-
showVolMa: true
|
|
166
|
+
showVolMa: true,
|
|
167
|
+
showVolume: true
|
|
167
168
|
};
|
|
168
169
|
function hasVisibleIndicatorPanes(config) {
|
|
169
170
|
return config.showMacd || config.showRsi || config.showKdj;
|
|
@@ -183,22 +184,75 @@ function clearedIndicatorConfig(base = DEFAULT_INDICATOR_CONFIG) {
|
|
|
183
184
|
showEma: false,
|
|
184
185
|
showBoll: false,
|
|
185
186
|
showMa: false,
|
|
186
|
-
showVolMa: false
|
|
187
|
+
showVolMa: false,
|
|
188
|
+
showVolume: false
|
|
187
189
|
};
|
|
188
190
|
}
|
|
189
191
|
function indicatorConfigStorageKey(symbol, interval) {
|
|
190
192
|
return `tradview:indicators:${symbol}:${interval}`;
|
|
191
193
|
}
|
|
194
|
+
function listActiveIndicatorLayers(config) {
|
|
195
|
+
const layers = [];
|
|
196
|
+
if (config.showMa) {
|
|
197
|
+
layers.push({ id: "ma", label: `MA (${config.maPeriod})`, target: "main" });
|
|
198
|
+
}
|
|
199
|
+
if (config.showEma) {
|
|
200
|
+
layers.push({ id: "ema", label: `EMA (${config.emaPeriod})`, target: "main" });
|
|
201
|
+
}
|
|
202
|
+
if (config.showBoll) {
|
|
203
|
+
layers.push({ id: "boll", label: `BOLL (${config.bollPeriod})`, target: "main" });
|
|
204
|
+
}
|
|
205
|
+
if (config.showVolMa) {
|
|
206
|
+
layers.push({ id: "volMa", label: `Vol MA (${config.volMaPeriod})`, target: "main" });
|
|
207
|
+
}
|
|
208
|
+
if (config.showVolume) {
|
|
209
|
+
layers.push({ id: "volume", label: "VOL", target: "pane" });
|
|
210
|
+
}
|
|
211
|
+
if (config.showMacd) {
|
|
212
|
+
layers.push({ id: "macd", label: "MACD", target: "pane" });
|
|
213
|
+
}
|
|
214
|
+
if (config.showRsi) {
|
|
215
|
+
layers.push({ id: "rsi", label: `RSI (${config.rsiPeriod})`, target: "pane" });
|
|
216
|
+
}
|
|
217
|
+
if (config.showKdj) {
|
|
218
|
+
layers.push({ id: "kdj", label: `KDJ (${config.kdjPeriod})`, target: "pane" });
|
|
219
|
+
}
|
|
220
|
+
return layers;
|
|
221
|
+
}
|
|
222
|
+
function disableIndicatorLayer(config, id) {
|
|
223
|
+
switch (id) {
|
|
224
|
+
case "ma":
|
|
225
|
+
return { ...config, showMa: false };
|
|
226
|
+
case "ema":
|
|
227
|
+
return { ...config, showEma: false };
|
|
228
|
+
case "boll":
|
|
229
|
+
return { ...config, showBoll: false };
|
|
230
|
+
case "volMa":
|
|
231
|
+
return { ...config, showVolMa: false };
|
|
232
|
+
case "volume":
|
|
233
|
+
return { ...config, showVolume: false };
|
|
234
|
+
case "macd":
|
|
235
|
+
return { ...config, showMacd: false };
|
|
236
|
+
case "rsi":
|
|
237
|
+
return { ...config, showRsi: false };
|
|
238
|
+
case "kdj":
|
|
239
|
+
return { ...config, showKdj: false };
|
|
240
|
+
default:
|
|
241
|
+
return config;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
192
244
|
export {
|
|
193
245
|
DEFAULT_INDICATOR_CONFIG,
|
|
194
246
|
boll,
|
|
195
247
|
clearedIndicatorConfig,
|
|
248
|
+
disableIndicatorLayer,
|
|
196
249
|
ema,
|
|
197
250
|
hasAnyActiveIndicators,
|
|
198
251
|
hasMainChartOverlays,
|
|
199
252
|
hasVisibleIndicatorPanes,
|
|
200
253
|
indicatorConfigStorageKey,
|
|
201
254
|
kdj,
|
|
255
|
+
listActiveIndicatorLayers,
|
|
202
256
|
macd,
|
|
203
257
|
rsi,
|
|
204
258
|
sma
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ma.ts","../src/boll.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 { sma } from './ma.js';\n\nexport interface BollResult {\n upper: (number | null)[];\n middle: (number | null)[];\n lower: (number | null)[];\n}\n\n/** Bollinger Bands on close. */\nexport function boll(bars: Bar[], period = 20, mult = 2): BollResult {\n const middle = sma(bars, period);\n const upper: (number | null)[] = [];\n const lower: (number | null)[] = [];\n for (let i = 0; i < bars.length; i++) {\n const m = middle[i];\n if (m == null || i < period - 1) {\n upper.push(null);\n lower.push(null);\n continue;\n }\n let sumSq = 0;\n for (let j = 0; j < period; j++) {\n const c = bars[i - j]!.c;\n const d = c - m;\n sumSq += d * d;\n }\n const std = Math.sqrt(sumSq / period);\n upper.push(m + mult * std);\n lower.push(m - mult * std);\n }\n return { upper, middle, lower };\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 showEma: boolean;\n emaPeriod: number;\n showBoll: boolean;\n bollPeriod: number;\n bollMult: 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 showMa: boolean;\n showVolMa: boolean;\n}\n\nexport const DEFAULT_INDICATOR_CONFIG: IndicatorConfig = {\n source: 'close',\n maPeriod: 20,\n showEma: false,\n emaPeriod: 12,\n showBoll: false,\n bollPeriod: 20,\n bollMult: 2,\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 showMa: true,\n showVolMa: true,\n};\n\nexport function hasVisibleIndicatorPanes(config: IndicatorConfig): boolean {\n return config.showMacd || config.showRsi || config.showKdj;\n}\n\nexport function hasMainChartOverlays(config: IndicatorConfig): boolean {\n return config.showMa || config.showVolMa || config.showEma || config.showBoll;\n}\n\n/** Any built-in indicator pane or main-chart overlay enabled. */\nexport function hasAnyActiveIndicators(config: IndicatorConfig): boolean {\n return hasVisibleIndicatorPanes(config) || hasMainChartOverlays(config);\n}\n\n/** Hide all indicator panes and main-chart overlays (MA / EMA / BOLL / vol MA). */\nexport function clearedIndicatorConfig(base: IndicatorConfig = DEFAULT_INDICATOR_CONFIG): IndicatorConfig {\n return {\n ...base,\n showMacd: false,\n showRsi: false,\n showKdj: false,\n showEma: false,\n showBoll: false,\n showMa: false,\n showVolMa: false,\n };\n}\n\nexport function indicatorConfigStorageKey(symbol: string, interval: string): string {\n return `tradview:indicators:${symbol}:${interval}`;\n}"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/ma.ts","../src/boll.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 { sma } from './ma.js';\n\nexport interface BollResult {\n upper: (number | null)[];\n middle: (number | null)[];\n lower: (number | null)[];\n}\n\n/** Bollinger Bands on close. */\nexport function boll(bars: Bar[], period = 20, mult = 2): BollResult {\n const middle = sma(bars, period);\n const upper: (number | null)[] = [];\n const lower: (number | null)[] = [];\n for (let i = 0; i < bars.length; i++) {\n const m = middle[i];\n if (m == null || i < period - 1) {\n upper.push(null);\n lower.push(null);\n continue;\n }\n let sumSq = 0;\n for (let j = 0; j < period; j++) {\n const c = bars[i - j]!.c;\n const d = c - m;\n sumSq += d * d;\n }\n const std = Math.sqrt(sumSq / period);\n upper.push(m + mult * std);\n lower.push(m - mult * std);\n }\n return { upper, middle, lower };\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 showEma: boolean;\n emaPeriod: number;\n showBoll: boolean;\n bollPeriod: number;\n bollMult: 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 showMa: boolean;\n showVolMa: boolean;\n /** Volume histogram pane below main price chart. */\n showVolume: boolean;\n}\n\nexport const DEFAULT_INDICATOR_CONFIG: IndicatorConfig = {\n source: 'close',\n maPeriod: 20,\n showEma: false,\n emaPeriod: 12,\n showBoll: false,\n bollPeriod: 20,\n bollMult: 2,\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 showMa: true,\n showVolMa: true,\n showVolume: true,\n};\n\nexport function hasVisibleIndicatorPanes(config: IndicatorConfig): boolean {\n return config.showMacd || config.showRsi || config.showKdj;\n}\n\nexport function hasMainChartOverlays(config: IndicatorConfig): boolean {\n return config.showMa || config.showVolMa || config.showEma || config.showBoll;\n}\n\n/** Any built-in indicator pane or main-chart overlay enabled. */\nexport function hasAnyActiveIndicators(config: IndicatorConfig): boolean {\n return hasVisibleIndicatorPanes(config) || hasMainChartOverlays(config);\n}\n\n/** Hide all indicator panes and main-chart overlays (MA / EMA / BOLL / vol MA). */\nexport function clearedIndicatorConfig(base: IndicatorConfig = DEFAULT_INDICATOR_CONFIG): IndicatorConfig {\n return {\n ...base,\n showMacd: false,\n showRsi: false,\n showKdj: false,\n showEma: false,\n showBoll: false,\n showMa: false,\n showVolMa: false,\n showVolume: false,\n };\n}\n\nexport function indicatorConfigStorageKey(symbol: string, interval: string): string {\n return `tradview:indicators:${symbol}:${interval}`;\n}\n\n/** Built-in indicator layer id for per-layer remove. */\nexport type IndicatorLayerId =\n | 'ma'\n | 'ema'\n | 'boll'\n | 'volMa'\n | 'volume'\n | 'macd'\n | 'rsi'\n | 'kdj';\n\nexport interface IndicatorLayerInfo {\n id: IndicatorLayerId;\n label: string;\n /** Main price pane overlay vs separate indicator pane. */\n target: 'main' | 'pane';\n}\n\n/** @public List enabled built-in indicator layers for a config snapshot. */\nexport function listActiveIndicatorLayers(config: IndicatorConfig): IndicatorLayerInfo[] {\n const layers: IndicatorLayerInfo[] = [];\n if (config.showMa) {\n layers.push({ id: 'ma', label: `MA (${config.maPeriod})`, target: 'main' });\n }\n if (config.showEma) {\n layers.push({ id: 'ema', label: `EMA (${config.emaPeriod})`, target: 'main' });\n }\n if (config.showBoll) {\n layers.push({ id: 'boll', label: `BOLL (${config.bollPeriod})`, target: 'main' });\n }\n if (config.showVolMa) {\n layers.push({ id: 'volMa', label: `Vol MA (${config.volMaPeriod})`, target: 'main' });\n }\n if (config.showVolume) {\n layers.push({ id: 'volume', label: 'VOL', target: 'pane' });\n }\n if (config.showMacd) {\n layers.push({ id: 'macd', label: 'MACD', target: 'pane' });\n }\n if (config.showRsi) {\n layers.push({ id: 'rsi', label: `RSI (${config.rsiPeriod})`, target: 'pane' });\n }\n if (config.showKdj) {\n layers.push({ id: 'kdj', label: `KDJ (${config.kdjPeriod})`, target: 'pane' });\n }\n return layers;\n}\n\n/** @public Turn off a single built-in indicator layer; other params unchanged. */\nexport function disableIndicatorLayer(\n config: IndicatorConfig,\n id: IndicatorLayerId,\n): IndicatorConfig {\n switch (id) {\n case 'ma':\n return { ...config, showMa: false };\n case 'ema':\n return { ...config, showEma: false };\n case 'boll':\n return { ...config, showBoll: false };\n case 'volMa':\n return { ...config, showVolMa: false };\n case 'volume':\n return { ...config, showVolume: false };\n case 'macd':\n return { ...config, showMacd: false };\n case 'rsi':\n return { ...config, showRsi: false };\n case 'kdj':\n return { ...config, showKdj: false };\n default:\n return config;\n }\n}"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@coderyo/indicators",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -9,15 +9,22 @@
|
|
|
9
9
|
"import": "./dist/index.js"
|
|
10
10
|
}
|
|
11
11
|
},
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsup",
|
|
15
|
+
"test": "vitest run",
|
|
16
|
+
"lint": "eslint src",
|
|
17
|
+
"typecheck": "tsc --noEmit"
|
|
18
|
+
},
|
|
12
19
|
"dependencies": {
|
|
13
|
-
"@coderyo/data": "
|
|
20
|
+
"@coderyo/data": "workspace:*"
|
|
14
21
|
},
|
|
15
22
|
"devDependencies": {
|
|
23
|
+
"@coderyo/eslint-config": "workspace:*",
|
|
24
|
+
"@coderyo/tsconfig": "workspace:*",
|
|
16
25
|
"tsup": "^8.5.0",
|
|
17
26
|
"typescript": "^5.8.3",
|
|
18
|
-
"vitest": "^3.2.4"
|
|
19
|
-
"@coderyo/eslint-config": "0.0.0",
|
|
20
|
-
"@coderyo/tsconfig": "0.0.0"
|
|
27
|
+
"vitest": "^3.2.4"
|
|
21
28
|
},
|
|
22
29
|
"files": [
|
|
23
30
|
"dist"
|
|
@@ -29,11 +36,5 @@
|
|
|
29
36
|
},
|
|
30
37
|
"publishConfig": {
|
|
31
38
|
"access": "public"
|
|
32
|
-
},
|
|
33
|
-
"scripts": {
|
|
34
|
-
"build": "tsup",
|
|
35
|
-
"test": "vitest run",
|
|
36
|
-
"lint": "eslint src",
|
|
37
|
-
"typecheck": "tsc --noEmit"
|
|
38
39
|
}
|
|
39
|
-
}
|
|
40
|
+
}
|