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.
- package/README.md +123 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +81 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/hyperliquid.d.ts +20 -0
- package/dist/lib/hyperliquid.d.ts.map +1 -0
- package/dist/lib/hyperliquid.js +82 -0
- package/dist/lib/hyperliquid.js.map +1 -0
- package/dist/lib/indicators.d.ts +38 -0
- package/dist/lib/indicators.d.ts.map +1 -0
- package/dist/lib/indicators.js +201 -0
- package/dist/lib/indicators.js.map +1 -0
- package/dist/lib/license.d.ts +9 -0
- package/dist/lib/license.d.ts.map +1 -0
- package/dist/lib/license.js +56 -0
- package/dist/lib/license.js.map +1 -0
- package/dist/lib/performance-db.d.ts +13 -0
- package/dist/lib/performance-db.d.ts.map +1 -0
- package/dist/lib/performance-db.js +204 -0
- package/dist/lib/performance-db.js.map +1 -0
- package/dist/resources/signal-performance.d.ts +11 -0
- package/dist/resources/signal-performance.d.ts.map +1 -0
- package/dist/resources/signal-performance.js +45 -0
- package/dist/resources/signal-performance.js.map +1 -0
- package/dist/tools/get-market-regime.d.ts +8 -0
- package/dist/tools/get-market-regime.d.ts.map +1 -0
- package/dist/tools/get-market-regime.js +135 -0
- package/dist/tools/get-market-regime.js.map +1 -0
- package/dist/tools/get-trade-signal.d.ts +9 -0
- package/dist/tools/get-trade-signal.d.ts.map +1 -0
- package/dist/tools/get-trade-signal.js +190 -0
- package/dist/tools/get-trade-signal.js.map +1 -0
- package/dist/tools/scan-funding-arb.d.ts +8 -0
- package/dist/tools/scan-funding-arb.d.ts.map +1 -0
- package/dist/tools/scan-funding-arb.js +87 -0
- package/dist/tools/scan-funding-arb.js.map +1 -0
- package/dist/types.d.ts +157 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- 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
|
package/dist/index.d.ts
ADDED
|
@@ -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":"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"}
|
|
@@ -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"}
|