crypto-quant-signal-mcp 1.0.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.
Files changed (42) hide show
  1. package/README.md +123 -0
  2. package/dist/index.d.ts +3 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +81 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/lib/hyperliquid.d.ts +20 -0
  7. package/dist/lib/hyperliquid.d.ts.map +1 -0
  8. package/dist/lib/hyperliquid.js +82 -0
  9. package/dist/lib/hyperliquid.js.map +1 -0
  10. package/dist/lib/indicators.d.ts +38 -0
  11. package/dist/lib/indicators.d.ts.map +1 -0
  12. package/dist/lib/indicators.js +201 -0
  13. package/dist/lib/indicators.js.map +1 -0
  14. package/dist/lib/license.d.ts +9 -0
  15. package/dist/lib/license.d.ts.map +1 -0
  16. package/dist/lib/license.js +56 -0
  17. package/dist/lib/license.js.map +1 -0
  18. package/dist/lib/performance-db.d.ts +13 -0
  19. package/dist/lib/performance-db.d.ts.map +1 -0
  20. package/dist/lib/performance-db.js +204 -0
  21. package/dist/lib/performance-db.js.map +1 -0
  22. package/dist/resources/signal-performance.d.ts +11 -0
  23. package/dist/resources/signal-performance.d.ts.map +1 -0
  24. package/dist/resources/signal-performance.js +45 -0
  25. package/dist/resources/signal-performance.js.map +1 -0
  26. package/dist/tools/get-market-regime.d.ts +8 -0
  27. package/dist/tools/get-market-regime.d.ts.map +1 -0
  28. package/dist/tools/get-market-regime.js +135 -0
  29. package/dist/tools/get-market-regime.js.map +1 -0
  30. package/dist/tools/get-trade-signal.d.ts +9 -0
  31. package/dist/tools/get-trade-signal.d.ts.map +1 -0
  32. package/dist/tools/get-trade-signal.js +190 -0
  33. package/dist/tools/get-trade-signal.js.map +1 -0
  34. package/dist/tools/scan-funding-arb.d.ts +8 -0
  35. package/dist/tools/scan-funding-arb.d.ts.map +1 -0
  36. package/dist/tools/scan-funding-arb.js +87 -0
  37. package/dist/tools/scan-funding-arb.js.map +1 -0
  38. package/dist/types.d.ts +157 -0
  39. package/dist/types.d.ts.map +1 -0
  40. package/dist/types.js +4 -0
  41. package/dist/types.js.map +1 -0
  42. package/package.json +51 -0
package/README.md ADDED
@@ -0,0 +1,123 @@
1
+ # crypto-quant-signal-mcp
2
+
3
+ AI trading brain for crypto perps — composite signals, funding rate arb scanning, and market regime detection via MCP. Powered by Hyperliquid data.
4
+
5
+ ## What It Does
6
+
7
+ Three opinionated tools + one performance resource that combine multiple indicators into a single verdict with confidence score:
8
+
9
+ | Tool | Description |
10
+ |------|-------------|
11
+ | `get_trade_signal` | Composite BUY/SELL/HOLD signal combining RSI(14), EMA(9/21), funding rate, OI momentum, and volume |
12
+ | `scan_funding_arb` | Cross-venue funding rate arbitrage scanner (Hyperliquid vs Binance vs Bybit) |
13
+ | `get_market_regime` | Market regime classification (TRENDING_UP/DOWN, RANGING, VOLATILE) with strategy suggestions |
14
+ | `signal-performance` | Historical signal track record — win rate, Sharpe ratio, profit factor |
15
+
16
+ ## Quick Start
17
+
18
+ ### Install
19
+
20
+ ```bash
21
+ npm install -g crypto-quant-signal-mcp
22
+ ```
23
+
24
+ Or run directly with npx:
25
+
26
+ ```bash
27
+ npx -y crypto-quant-signal-mcp
28
+ ```
29
+
30
+ ### Claude Desktop Config
31
+
32
+ Add to your `claude_desktop_config.json`:
33
+
34
+ ```json
35
+ {
36
+ "mcpServers": {
37
+ "crypto-quant-signal": {
38
+ "command": "npx",
39
+ "args": ["-y", "crypto-quant-signal-mcp"],
40
+ "env": {
41
+ "CQS_API_KEY": "your-pro-key-here"
42
+ }
43
+ }
44
+ }
45
+ }
46
+ ```
47
+
48
+ No API key needed for free tier — just remove the `env` block.
49
+
50
+ ## Free vs Pro
51
+
52
+ | Feature | Free | Pro ($29/mo) |
53
+ |---------|------|-------------|
54
+ | `get_trade_signal` | BTC + ETH, 1h only | All 200+ perps, 1h/4h/1d |
55
+ | `scan_funding_arb` | Top 5 results | Unlimited |
56
+ | `get_market_regime` | All assets, all timeframes | Same |
57
+ | `signal-performance` | Full access | Full access |
58
+
59
+ Set `CQS_API_KEY` environment variable for Pro access.
60
+
61
+ ## Example Agent Prompts
62
+
63
+ **Quick signal check:**
64
+ > "Get a trade signal for ETH on the 1h timeframe"
65
+
66
+ **Funding arb scan:**
67
+ > "Scan for funding rate arbitrage opportunities with at least 10 bps spread"
68
+
69
+ **Market regime:**
70
+ > "What's the current market regime for BTC on the 4h chart?"
71
+
72
+ **Multi-step analysis:**
73
+ > "Check the market regime for SOL, then get a trade signal. If it's a BUY, also scan for any funding arb opportunities on SOL."
74
+
75
+ ## Tools Reference
76
+
77
+ ### get_trade_signal
78
+
79
+ Returns a composite signal by weighting five indicators:
80
+
81
+ - **RSI(14)** — 25% weight: oversold/overbought detection
82
+ - **EMA(9/21) crossover** — 30% weight: trend direction
83
+ - **Funding rate** — 20% weight: sentiment from derivatives market
84
+ - **OI momentum** — 15% weight: new money confirmation
85
+ - **Volume** — 10% weight: conviction multiplier
86
+
87
+ **Parameters:**
88
+ - `coin` (string, required): Asset symbol (e.g. "ETH", "BTC", "SOL")
89
+ - `timeframe` (string, default "1h"): "1h", "4h", or "1d"
90
+ - `includeReasoning` (boolean, default true): Include human-readable explanation
91
+
92
+ ### scan_funding_arb
93
+
94
+ Scans Hyperliquid's `predictedFundings` endpoint for cross-venue funding rate differences. Normalizes HL hourly rates vs Binance/Bybit 8h rates and annualizes the spread.
95
+
96
+ **Parameters:**
97
+ - `minSpreadBps` (number, default 5): Minimum spread in basis points
98
+ - `limit` (number, default 10): Max results to return
99
+
100
+ ### get_market_regime
101
+
102
+ Classifies market conditions using ADX(14), ATR(14)/price volatility ratio, and price structure (swing high/low analysis).
103
+
104
+ **Parameters:**
105
+ - `coin` (string, required): Asset symbol
106
+ - `timeframe` (string, default "4h"): "1h", "4h", or "1d"
107
+
108
+ ## Performance Tracking
109
+
110
+ Every signal from `get_trade_signal` is stored locally in a SQLite database at `~/.crypto-quant-signal/performance.db`. The server automatically backfills outcome prices at 1h, 4h, and 24h intervals.
111
+
112
+ Access the track record via the `performance://signal-stats` MCP resource — it returns win rate, average return, Sharpe ratio, max drawdown, and profit factor broken down by signal type and asset.
113
+
114
+ ## Technical Details
115
+
116
+ - **Data source:** Hyperliquid public API (free, no auth required)
117
+ - **Transport:** stdio (local MCP)
118
+ - **Storage:** SQLite via better-sqlite3 (local to your machine)
119
+ - **Zero dependencies on external services** — works fully offline after candle data is fetched
120
+
121
+ ## License
122
+
123
+ MIT
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,81 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
5
+ const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
6
+ const zod_1 = require("zod");
7
+ const get_trade_signal_js_1 = require("./tools/get-trade-signal.js");
8
+ const scan_funding_arb_js_1 = require("./tools/scan-funding-arb.js");
9
+ const get_market_regime_js_1 = require("./tools/get-market-regime.js");
10
+ const signal_performance_js_1 = require("./resources/signal-performance.js");
11
+ const performance_db_js_1 = require("./lib/performance-db.js");
12
+ const server = new mcp_js_1.McpServer({
13
+ name: 'crypto-quant-signal-mcp',
14
+ version: '1.0.0',
15
+ });
16
+ // ── Tool 1: get_trade_signal ──
17
+ server.tool('get_trade_signal', "Returns a composite BUY/SELL/HOLD signal for a Hyperliquid perp. Combines RSI(14), EMA(9/21) crossover, funding rate, OI momentum, and volume into a weighted score with confidence percentage.", {
18
+ coin: zod_1.z.string().describe("Asset symbol, e.g. 'ETH', 'BTC', 'SOL'"),
19
+ timeframe: zod_1.z.enum(['1h', '4h', '1d']).default('1h').describe('Candle timeframe (free: 1h only)'),
20
+ includeReasoning: zod_1.z.boolean().default(true).describe('Include human-readable reasoning'),
21
+ }, async ({ coin, timeframe, includeReasoning }) => {
22
+ try {
23
+ const result = await (0, get_trade_signal_js_1.getTradeSignal)({ coin, timeframe, includeReasoning });
24
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
25
+ }
26
+ catch (err) {
27
+ const message = err instanceof Error ? err.message : String(err);
28
+ return { content: [{ type: 'text', text: JSON.stringify({ error: message }) }], isError: true };
29
+ }
30
+ });
31
+ // ── Tool 2: scan_funding_arb ──
32
+ server.tool('scan_funding_arb', 'Scans cross-venue funding rate differences between Hyperliquid, Binance, and Bybit. Returns top arbitrage opportunities ranked by annualized spread.', {
33
+ minSpreadBps: zod_1.z.number().default(5).describe('Minimum spread in basis points to include'),
34
+ limit: zod_1.z.number().default(10).describe('Max results (free: max 5)'),
35
+ }, async ({ minSpreadBps, limit }) => {
36
+ try {
37
+ const result = await (0, scan_funding_arb_js_1.scanFundingArb)({ minSpreadBps, limit });
38
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
39
+ }
40
+ catch (err) {
41
+ const message = err instanceof Error ? err.message : String(err);
42
+ return { content: [{ type: 'text', text: JSON.stringify({ error: message }) }], isError: true };
43
+ }
44
+ });
45
+ // ── Tool 3: get_market_regime ──
46
+ server.tool('get_market_regime', 'Classifies the current market regime (TRENDING_UP, TRENDING_DOWN, RANGING, VOLATILE) for a Hyperliquid perp using ADX(14), volatility ratio, and price structure analysis. Helps decide between trend-following vs mean-reversion strategies.', {
47
+ coin: zod_1.z.string().describe("Asset symbol, e.g. 'BTC', 'ETH', 'SOL'"),
48
+ timeframe: zod_1.z.enum(['1h', '4h', '1d']).default('4h').describe('Candle timeframe'),
49
+ }, async ({ coin, timeframe }) => {
50
+ try {
51
+ const result = await (0, get_market_regime_js_1.getMarketRegime)({ coin, timeframe });
52
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
53
+ }
54
+ catch (err) {
55
+ const message = err instanceof Error ? err.message : String(err);
56
+ return { content: [{ type: 'text', text: JSON.stringify({ error: message }) }], isError: true };
57
+ }
58
+ });
59
+ // ── Resource: signal-performance ──
60
+ server.resource('signal-stats', 'performance://signal-stats', { description: 'Historical signal performance metrics — win rate, Sharpe ratio, profit factor, and per-asset breakdowns. Updated on each access with latest outcome data.' }, async () => {
61
+ const stats = await (0, signal_performance_js_1.getSignalPerformance)();
62
+ return { contents: [{ uri: 'performance://signal-stats', mimeType: 'application/json', text: JSON.stringify(stats, null, 2) }] };
63
+ });
64
+ // ── Start server ──
65
+ async function main() {
66
+ const transport = new stdio_js_1.StdioServerTransport();
67
+ await server.connect(transport);
68
+ // Graceful shutdown
69
+ const shutdown = () => {
70
+ (0, performance_db_js_1.closeDb)();
71
+ process.exit(0);
72
+ };
73
+ process.on('SIGINT', shutdown);
74
+ process.on('SIGTERM', shutdown);
75
+ }
76
+ main().catch((err) => {
77
+ console.error('Fatal:', err);
78
+ (0, performance_db_js_1.closeDb)();
79
+ process.exit(1);
80
+ });
81
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { HLMetaAndAssetCtxs, HLPredictedFunding, Candle } from '../types.js';
2
+ /**
3
+ * Fetch candle data for a coin/interval starting from a given time.
4
+ * Returns parsed Candle[] suitable for indicator calculations.
5
+ */
6
+ export declare function fetchCandles(coin: string, interval: string, startTime: number): Promise<Candle[]>;
7
+ /**
8
+ * Fetch metadata + live asset context for all perps.
9
+ * Returns funding rates, OI, volume, prices.
10
+ */
11
+ export declare function fetchMetaAndAssetCtxs(): Promise<HLMetaAndAssetCtxs>;
12
+ /**
13
+ * Fetch predicted funding rates across venues (HL, Binance, Bybit) for all assets.
14
+ */
15
+ export declare function fetchPredictedFundings(): Promise<HLPredictedFunding[]>;
16
+ /**
17
+ * Fetch the current price for a specific coin using metaAndAssetCtxs.
18
+ */
19
+ export declare function fetchCurrentPrice(coin: string): Promise<number | null>;
20
+ //# sourceMappingURL=hyperliquid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hyperliquid.d.ts","sourceRoot":"","sources":["../../src/lib/hyperliquid.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAY,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAgC5F;;;GAGG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAavG;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAKzE;AAED;;GAEG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAE5E;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAM5E"}
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fetchCandles = fetchCandles;
4
+ exports.fetchMetaAndAssetCtxs = fetchMetaAndAssetCtxs;
5
+ exports.fetchPredictedFundings = fetchPredictedFundings;
6
+ exports.fetchCurrentPrice = fetchCurrentPrice;
7
+ const BASE_URL = 'https://api.hyperliquid.xyz/info';
8
+ const TIMEOUT_MS = 3000;
9
+ const MAX_RETRIES = 1;
10
+ async function hlPost(body, retries = MAX_RETRIES) {
11
+ for (let attempt = 0; attempt <= retries; attempt++) {
12
+ const controller = new AbortController();
13
+ const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);
14
+ try {
15
+ const res = await fetch(BASE_URL, {
16
+ method: 'POST',
17
+ headers: { 'Content-Type': 'application/json' },
18
+ body: JSON.stringify(body),
19
+ signal: controller.signal,
20
+ });
21
+ clearTimeout(timer);
22
+ if (!res.ok) {
23
+ throw new Error(`HL API ${res.status}: ${res.statusText}`);
24
+ }
25
+ return (await res.json());
26
+ }
27
+ catch (err) {
28
+ clearTimeout(timer);
29
+ if (attempt === retries)
30
+ throw err;
31
+ // brief pause before retry
32
+ await new Promise(r => setTimeout(r, 500));
33
+ }
34
+ }
35
+ throw new Error('HL API: max retries exceeded');
36
+ }
37
+ /**
38
+ * Fetch candle data for a coin/interval starting from a given time.
39
+ * Returns parsed Candle[] suitable for indicator calculations.
40
+ */
41
+ async function fetchCandles(coin, interval, startTime) {
42
+ const raw = await hlPost({
43
+ type: 'candleSnapshot',
44
+ req: { coin, interval, startTime },
45
+ });
46
+ return raw.map(c => ({
47
+ open: parseFloat(c.o),
48
+ high: parseFloat(c.h),
49
+ low: parseFloat(c.l),
50
+ close: parseFloat(c.c),
51
+ volume: parseFloat(c.v),
52
+ time: c.t,
53
+ }));
54
+ }
55
+ /**
56
+ * Fetch metadata + live asset context for all perps.
57
+ * Returns funding rates, OI, volume, prices.
58
+ */
59
+ async function fetchMetaAndAssetCtxs() {
60
+ const raw = await hlPost({
61
+ type: 'metaAndAssetCtxs',
62
+ });
63
+ return { meta: raw[0], assetCtxs: raw[1] };
64
+ }
65
+ /**
66
+ * Fetch predicted funding rates across venues (HL, Binance, Bybit) for all assets.
67
+ */
68
+ async function fetchPredictedFundings() {
69
+ return hlPost({ type: 'predictedFundings' });
70
+ }
71
+ /**
72
+ * Fetch the current price for a specific coin using metaAndAssetCtxs.
73
+ */
74
+ async function fetchCurrentPrice(coin) {
75
+ const data = await fetchMetaAndAssetCtxs();
76
+ const idx = data.meta.universe.findIndex(a => a.name === coin);
77
+ if (idx === -1)
78
+ return null;
79
+ const ctx = data.assetCtxs[idx];
80
+ return parseFloat(ctx.oraclePx || ctx.markPx);
81
+ }
82
+ //# sourceMappingURL=hyperliquid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hyperliquid.js","sourceRoot":"","sources":["../../src/lib/hyperliquid.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Pure indicator functions — no side effects, no API calls.
3
+ * All operate on arrays of numbers. Return null if insufficient data.
4
+ */
5
+ /**
6
+ * Exponential Moving Average.
7
+ * Returns the full EMA series (same length as input, first values use SMA seed).
8
+ */
9
+ export declare function ema(closes: number[], period: number): number[] | null;
10
+ /**
11
+ * Get the last valid EMA value.
12
+ */
13
+ export declare function emaLast(closes: number[], period: number): number | null;
14
+ /**
15
+ * RSI (Wilder's smoothing method).
16
+ * Returns the final RSI value (0–100), or null if insufficient data.
17
+ */
18
+ export declare function rsi(closes: number[], period?: number): number | null;
19
+ /**
20
+ * Average True Range (ATR).
21
+ * Returns the final ATR value, or null if insufficient data.
22
+ */
23
+ export declare function atr(highs: number[], lows: number[], closes: number[], period?: number): number | null;
24
+ /**
25
+ * Average Directional Index (ADX).
26
+ * Returns { adx, plusDI, minusDI } or null if insufficient data.
27
+ */
28
+ export declare function adx(highs: number[], lows: number[], closes: number[], period?: number): {
29
+ adx: number;
30
+ plusDI: number;
31
+ minusDI: number;
32
+ } | null;
33
+ /**
34
+ * Detect price structure from candle data.
35
+ * Looks at swing highs and lows over the last N candles.
36
+ */
37
+ export declare function detectPriceStructure(highs: number[], lows: number[], lookback?: number): 'HIGHER_HIGHS' | 'LOWER_LOWS' | 'MIXED';
38
+ //# sourceMappingURL=indicators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indicators.d.ts","sourceRoot":"","sources":["../../src/lib/indicators.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,wBAAgB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAoBrE;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAIvE;AAED;;;GAGG;AACH,wBAAgB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,GAAE,MAAW,GAAG,MAAM,GAAG,IAAI,CA2BxE;AAED;;;GAGG;AACH,wBAAgB,GAAG,CACjB,KAAK,EAAE,MAAM,EAAE,EACf,IAAI,EAAE,MAAM,EAAE,EACd,MAAM,EAAE,MAAM,EAAE,EAChB,MAAM,GAAE,MAAW,GAClB,MAAM,GAAG,IAAI,CA4Bf;AAED;;;GAGG;AACH,wBAAgB,GAAG,CACjB,KAAK,EAAE,MAAM,EAAE,EACf,IAAI,EAAE,MAAM,EAAE,EACd,MAAM,EAAE,MAAM,EAAE,EAChB,MAAM,GAAE,MAAW,GAClB;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAoEzD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,EAAE,EACf,IAAI,EAAE,MAAM,EAAE,EACd,QAAQ,GAAE,MAAU,GACnB,cAAc,GAAG,YAAY,GAAG,OAAO,CAsCzC"}
@@ -0,0 +1,201 @@
1
+ "use strict";
2
+ /**
3
+ * Pure indicator functions — no side effects, no API calls.
4
+ * All operate on arrays of numbers. Return null if insufficient data.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.ema = ema;
8
+ exports.emaLast = emaLast;
9
+ exports.rsi = rsi;
10
+ exports.atr = atr;
11
+ exports.adx = adx;
12
+ exports.detectPriceStructure = detectPriceStructure;
13
+ /**
14
+ * Exponential Moving Average.
15
+ * Returns the full EMA series (same length as input, first values use SMA seed).
16
+ */
17
+ function ema(closes, period) {
18
+ if (closes.length < period)
19
+ return null;
20
+ const k = 2 / (period + 1);
21
+ const result = [];
22
+ // SMA seed for the first `period` values
23
+ let sum = 0;
24
+ for (let i = 0; i < period; i++) {
25
+ sum += closes[i];
26
+ result.push(NaN); // pad until seed is ready
27
+ }
28
+ result[period - 1] = sum / period;
29
+ for (let i = period; i < closes.length; i++) {
30
+ const prev = result[i - 1];
31
+ result.push(closes[i] * k + prev * (1 - k));
32
+ }
33
+ return result;
34
+ }
35
+ /**
36
+ * Get the last valid EMA value.
37
+ */
38
+ function emaLast(closes, period) {
39
+ const series = ema(closes, period);
40
+ if (!series)
41
+ return null;
42
+ return series[series.length - 1];
43
+ }
44
+ /**
45
+ * RSI (Wilder's smoothing method).
46
+ * Returns the final RSI value (0–100), or null if insufficient data.
47
+ */
48
+ function rsi(closes, period = 14) {
49
+ if (closes.length < period + 1)
50
+ return null;
51
+ let avgGain = 0;
52
+ let avgLoss = 0;
53
+ // Initial average gain/loss over first `period` changes
54
+ for (let i = 1; i <= period; i++) {
55
+ const change = closes[i] - closes[i - 1];
56
+ if (change > 0)
57
+ avgGain += change;
58
+ else
59
+ avgLoss += Math.abs(change);
60
+ }
61
+ avgGain /= period;
62
+ avgLoss /= period;
63
+ // Wilder's smoothing for remaining data
64
+ for (let i = period + 1; i < closes.length; i++) {
65
+ const change = closes[i] - closes[i - 1];
66
+ const gain = change > 0 ? change : 0;
67
+ const loss = change < 0 ? Math.abs(change) : 0;
68
+ avgGain = (avgGain * (period - 1) + gain) / period;
69
+ avgLoss = (avgLoss * (period - 1) + loss) / period;
70
+ }
71
+ if (avgLoss === 0)
72
+ return 100;
73
+ const rs = avgGain / avgLoss;
74
+ return 100 - 100 / (1 + rs);
75
+ }
76
+ /**
77
+ * Average True Range (ATR).
78
+ * Returns the final ATR value, or null if insufficient data.
79
+ */
80
+ function atr(highs, lows, closes, period = 14) {
81
+ const len = highs.length;
82
+ if (len < period + 1)
83
+ return null;
84
+ // Compute true ranges
85
+ const trs = [];
86
+ for (let i = 1; i < len; i++) {
87
+ const tr = Math.max(highs[i] - lows[i], Math.abs(highs[i] - closes[i - 1]), Math.abs(lows[i] - closes[i - 1]));
88
+ trs.push(tr);
89
+ }
90
+ // Simple average of first `period` TRs
91
+ let atrVal = 0;
92
+ for (let i = 0; i < period; i++) {
93
+ atrVal += trs[i];
94
+ }
95
+ atrVal /= period;
96
+ // Wilder's smoothing for the rest
97
+ for (let i = period; i < trs.length; i++) {
98
+ atrVal = (atrVal * (period - 1) + trs[i]) / period;
99
+ }
100
+ return atrVal;
101
+ }
102
+ /**
103
+ * Average Directional Index (ADX).
104
+ * Returns { adx, plusDI, minusDI } or null if insufficient data.
105
+ */
106
+ function adx(highs, lows, closes, period = 14) {
107
+ const len = highs.length;
108
+ // Need period + 1 for TR, then period for smoothing +DM/-DM, then period for DX smoothing
109
+ if (len < 2 * period + 1)
110
+ return null;
111
+ // Step 1: compute +DM, -DM, TR arrays (from index 1)
112
+ const plusDMs = [];
113
+ const minusDMs = [];
114
+ const trs = [];
115
+ for (let i = 1; i < len; i++) {
116
+ const upMove = highs[i] - highs[i - 1];
117
+ const downMove = lows[i - 1] - lows[i];
118
+ plusDMs.push(upMove > downMove && upMove > 0 ? upMove : 0);
119
+ minusDMs.push(downMove > upMove && downMove > 0 ? downMove : 0);
120
+ const tr = Math.max(highs[i] - lows[i], Math.abs(highs[i] - closes[i - 1]), Math.abs(lows[i] - closes[i - 1]));
121
+ trs.push(tr);
122
+ }
123
+ // Step 2: Wilder's smoothing for +DM, -DM, TR (initial sum then smooth)
124
+ let smoothPlusDM = 0;
125
+ let smoothMinusDM = 0;
126
+ let smoothTR = 0;
127
+ for (let i = 0; i < period; i++) {
128
+ smoothPlusDM += plusDMs[i];
129
+ smoothMinusDM += minusDMs[i];
130
+ smoothTR += trs[i];
131
+ }
132
+ const dxValues = [];
133
+ // First DI values
134
+ let plusDI = smoothTR !== 0 ? (smoothPlusDM / smoothTR) * 100 : 0;
135
+ let minusDI = smoothTR !== 0 ? (smoothMinusDM / smoothTR) * 100 : 0;
136
+ let diSum = plusDI + minusDI;
137
+ dxValues.push(diSum !== 0 ? (Math.abs(plusDI - minusDI) / diSum) * 100 : 0);
138
+ for (let i = period; i < trs.length; i++) {
139
+ smoothPlusDM = smoothPlusDM - smoothPlusDM / period + plusDMs[i];
140
+ smoothMinusDM = smoothMinusDM - smoothMinusDM / period + minusDMs[i];
141
+ smoothTR = smoothTR - smoothTR / period + trs[i];
142
+ plusDI = smoothTR !== 0 ? (smoothPlusDM / smoothTR) * 100 : 0;
143
+ minusDI = smoothTR !== 0 ? (smoothMinusDM / smoothTR) * 100 : 0;
144
+ diSum = plusDI + minusDI;
145
+ dxValues.push(diSum !== 0 ? (Math.abs(plusDI - minusDI) / diSum) * 100 : 0);
146
+ }
147
+ // Step 3: Smooth DX to get ADX (Wilder's smoothing)
148
+ if (dxValues.length < period)
149
+ return null;
150
+ let adxVal = 0;
151
+ for (let i = 0; i < period; i++) {
152
+ adxVal += dxValues[i];
153
+ }
154
+ adxVal /= period;
155
+ for (let i = period; i < dxValues.length; i++) {
156
+ adxVal = (adxVal * (period - 1) + dxValues[i]) / period;
157
+ }
158
+ return { adx: adxVal, plusDI, minusDI };
159
+ }
160
+ /**
161
+ * Detect price structure from candle data.
162
+ * Looks at swing highs and lows over the last N candles.
163
+ */
164
+ function detectPriceStructure(highs, lows, lookback = 5) {
165
+ if (highs.length < lookback * 2)
166
+ return 'MIXED';
167
+ // Find swing highs and lows using a simple 3-bar pivot
168
+ const swingHighs = [];
169
+ const swingLows = [];
170
+ for (let i = 1; i < highs.length - 1; i++) {
171
+ if (highs[i] > highs[i - 1] && highs[i] > highs[i + 1]) {
172
+ swingHighs.push(highs[i]);
173
+ }
174
+ if (lows[i] < lows[i - 1] && lows[i] < lows[i + 1]) {
175
+ swingLows.push(lows[i]);
176
+ }
177
+ }
178
+ if (swingHighs.length < 2 || swingLows.length < 2)
179
+ return 'MIXED';
180
+ // Compare last few swings
181
+ const recentHighs = swingHighs.slice(-lookback);
182
+ const recentLows = swingLows.slice(-lookback);
183
+ let higherHighCount = 0;
184
+ let lowerLowCount = 0;
185
+ for (let i = 1; i < recentHighs.length; i++) {
186
+ if (recentHighs[i] > recentHighs[i - 1])
187
+ higherHighCount++;
188
+ }
189
+ for (let i = 1; i < recentLows.length; i++) {
190
+ if (recentLows[i] < recentLows[i - 1])
191
+ lowerLowCount++;
192
+ }
193
+ const hhRatio = recentHighs.length > 1 ? higherHighCount / (recentHighs.length - 1) : 0;
194
+ const llRatio = recentLows.length > 1 ? lowerLowCount / (recentLows.length - 1) : 0;
195
+ if (hhRatio > 0.5)
196
+ return 'HIGHER_HIGHS';
197
+ if (llRatio > 0.5)
198
+ return 'LOWER_LOWS';
199
+ return 'MIXED';
200
+ }
201
+ //# sourceMappingURL=indicators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indicators.js","sourceRoot":"","sources":["../../src/lib/indicators.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAMH,kBAoBC;AAKD,0BAIC;AAMD,kBA2BC;AAMD,kBAiCC;AAMD,kBAyEC;AAMD,oDA0CC;AAxOD;;;GAGG;AACH,SAAgB,GAAG,CAAC,MAAgB,EAAE,MAAc;IAClD,IAAI,MAAM,CAAC,MAAM,GAAG,MAAM;QAAE,OAAO,IAAI,CAAC;IAExC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC3B,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,yCAAyC;IACzC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;QACjB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,0BAA0B;IAC9C,CAAC;IACD,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC;IAElC,KAAK,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAgB,OAAO,CAAC,MAAgB,EAAE,MAAc;IACtD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACnC,CAAC;AAED;;;GAGG;AACH,SAAgB,GAAG,CAAC,MAAgB,EAAE,SAAiB,EAAE;IACvD,IAAI,MAAM,CAAC,MAAM,GAAG,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAE5C,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,wDAAwD;IACxD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACzC,IAAI,MAAM,GAAG,CAAC;YAAE,OAAO,IAAI,MAAM,CAAC;;YAC7B,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,IAAI,MAAM,CAAC;IAClB,OAAO,IAAI,MAAM,CAAC;IAElB,wCAAwC;IACxC,KAAK,IAAI,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChD,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,OAAO,GAAG,CAAC,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,MAAM,CAAC;QACnD,OAAO,GAAG,CAAC,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,MAAM,CAAC;IACrD,CAAC;IAED,IAAI,OAAO,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IAC9B,MAAM,EAAE,GAAG,OAAO,GAAG,OAAO,CAAC;IAC7B,OAAO,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;AAC9B,CAAC;AAED;;;GAGG;AACH,SAAgB,GAAG,CACjB,KAAe,EACf,IAAc,EACd,MAAgB,EAChB,SAAiB,EAAE;IAEnB,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC;IACzB,IAAI,GAAG,GAAG,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAElC,sBAAsB;IACtB,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CACjB,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,EAClB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAClC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAClC,CAAC;QACF,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,CAAC;IAED,uCAAuC;IACvC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC;IACD,MAAM,IAAI,MAAM,CAAC;IAEjB,kCAAkC;IAClC,KAAK,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;IACrD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,SAAgB,GAAG,CACjB,KAAe,EACf,IAAc,EACd,MAAgB,EAChB,SAAiB,EAAE;IAEnB,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC;IACzB,0FAA0F;IAC1F,IAAI,GAAG,GAAG,CAAC,GAAG,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAEtC,qDAAqD;IACrD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,GAAG,GAAa,EAAE,CAAC;IAEzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAEvC,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,QAAQ,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,QAAQ,CAAC,IAAI,CAAC,QAAQ,GAAG,MAAM,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEhE,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CACjB,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,EAClB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAClC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAClC,CAAC;QACF,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,CAAC;IAED,wEAAwE;IACxE,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,YAAY,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;QAC3B,aAAa,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC7B,QAAQ,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IAED,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,kBAAkB;IAClB,IAAI,MAAM,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,IAAI,OAAO,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACpE,IAAI,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;IAC7B,QAAQ,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE5E,KAAK,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,YAAY,GAAG,YAAY,GAAG,YAAY,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACjE,aAAa,GAAG,aAAa,GAAG,aAAa,GAAG,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACrE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QAEjD,MAAM,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9D,OAAO,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAChE,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;QACzB,QAAQ,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED,oDAAoD;IACpD,IAAI,QAAQ,CAAC,MAAM,GAAG,MAAM;QAAE,OAAO,IAAI,CAAC;IAE1C,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;IACD,MAAM,IAAI,MAAM,CAAC;IAEjB,KAAK,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;IAC1D,CAAC;IAED,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAC1C,CAAC;AAED;;;GAGG;AACH,SAAgB,oBAAoB,CAClC,KAAe,EACf,IAAc,EACd,WAAmB,CAAC;IAEpB,IAAI,KAAK,CAAC,MAAM,GAAG,QAAQ,GAAG,CAAC;QAAE,OAAO,OAAO,CAAC;IAEhD,uDAAuD;IACvD,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACvD,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5B,CAAC;QACD,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACnD,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,OAAO,CAAC;IAElE,0BAA0B;IAC1B,MAAM,WAAW,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC;IAE9C,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,IAAI,aAAa,GAAG,CAAC,CAAC;IAEtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,IAAI,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC;YAAE,eAAe,EAAE,CAAC;IAC7D,CAAC;IACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,IAAI,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC;YAAE,aAAa,EAAE,CAAC;IACzD,CAAC;IAED,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxF,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEpF,IAAI,OAAO,GAAG,GAAG;QAAE,OAAO,cAAc,CAAC;IACzC,IAAI,OAAO,GAAG,GAAG;QAAE,OAAO,YAAY,CAAC;IACvC,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { LicenseInfo } from '../types.js';
2
+ export declare function getLicense(): LicenseInfo;
3
+ export declare function resetLicenseCache(): void;
4
+ export declare function isFreeTier(): boolean;
5
+ export declare function canAccessCoin(coin: string): boolean;
6
+ export declare function canAccessTimeframe(timeframe: string): boolean;
7
+ export declare function getFundingArbLimit(requestedLimit: number): number;
8
+ export declare function freeGateMessage(coin: string, timeframe: string): string;
9
+ //# sourceMappingURL=license.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"license.d.ts","sourceRoot":"","sources":["../../src/lib/license.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,aAAa,CAAC;AAQ5D,wBAAgB,UAAU,IAAI,WAAW,CAQxC;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAED,wBAAgB,UAAU,IAAI,OAAO,CAEpC;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGnD;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAG7D;AAED,wBAAgB,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAGjE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAUvE"}