@tradejs/infra 2.0.17 → 2.0.19
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/ai.js +3 -54
- package/dist/ai.mjs +1 -54
- package/dist/chunk-2CZREG43.mjs +112 -0
- package/dist/chunk-DFMKDB2R.mjs +1285 -0
- package/dist/chunk-I2J6YDBD.mjs +910 -0
- package/dist/chunk-NWXFWTWU.mjs +1114 -0
- package/dist/chunk-SZQB7ER5.mjs +492 -0
- package/dist/chunk-YVIHTUV5.mjs +286 -0
- package/dist/internal-2coHaaos.d.mts +26 -0
- package/dist/internal-2coHaaos.d.ts +26 -0
- package/dist/runtimeDeployments.d.mts +10 -0
- package/dist/runtimeDeployments.d.ts +10 -0
- package/dist/runtimeDeployments.js +447 -0
- package/dist/runtimeDeployments.mjs +81 -0
- package/dist/runtimeStrategyConfigs.d.mts +28 -0
- package/dist/runtimeStrategyConfigs.d.ts +28 -0
- package/dist/runtimeStrategyConfigs.js +425 -0
- package/dist/runtimeStrategyConfigs.mjs +89 -0
- package/dist/timescale/candles.d.mts +38 -0
- package/dist/timescale/candles.d.ts +38 -0
- package/dist/timescale/candles.js +408 -0
- package/dist/timescale/candles.mjs +21 -0
- package/dist/timescale/client.d.mts +4 -0
- package/dist/timescale/client.d.ts +4 -0
- package/dist/timescale/client.js +109 -0
- package/dist/timescale/client.mjs +12 -0
- package/dist/timescale/derivatives.d.mts +90 -0
- package/dist/timescale/derivatives.d.ts +90 -0
- package/dist/timescale/derivatives.js +1270 -0
- package/dist/timescale/derivatives.mjs +26 -0
- package/dist/timescale/hyperliquidWhales.d.mts +149 -0
- package/dist/timescale/hyperliquidWhales.d.ts +149 -0
- package/dist/timescale/hyperliquidWhales.js +1893 -0
- package/dist/timescale/hyperliquidWhales.mjs +30 -0
- package/dist/timescale/marketContext.d.mts +188 -0
- package/dist/timescale/marketContext.d.ts +188 -0
- package/dist/timescale/marketContext.js +2091 -0
- package/dist/timescale/marketContext.mjs +60 -0
- package/dist/timescale/spread.d.mts +11 -0
- package/dist/timescale/spread.d.ts +11 -0
- package/dist/timescale/spread.js +215 -0
- package/dist/timescale/spread.mjs +11 -0
- package/dist/timescale.d.mts +9 -476
- package/dist/timescale.d.ts +9 -476
- package/dist/timescale.js +2121 -2112
- package/dist/timescale.mjs +73 -4070
- package/dist/tradingAccounts.d.mts +2 -8
- package/dist/tradingAccounts.d.ts +2 -8
- package/dist/tradingAccounts.js +0 -71
- package/dist/tradingAccounts.mjs +0 -65
- package/dist/values-BrvcmnfM.d.mts +6 -0
- package/dist/values-BrvcmnfM.d.ts +6 -0
- package/package.json +43 -2
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import {
|
|
2
|
+
cleanupDeprecatedMarketContext,
|
|
3
|
+
getLatestMarketBreadth,
|
|
4
|
+
getLatestMarketCmcExchangeLiquidityContext,
|
|
5
|
+
getLatestMarketCmcFearGreedContext,
|
|
6
|
+
getLatestMarketCmcIndexContexts,
|
|
7
|
+
getLatestMarketGlobalContext,
|
|
8
|
+
getLatestMarketReferenceAssetContexts,
|
|
9
|
+
getLatestMarketTradeFlow,
|
|
10
|
+
getMarketBreadthCoverage,
|
|
11
|
+
getMarketCmcExchangeLiquidityContextCoverage,
|
|
12
|
+
getMarketCmcFearGreedContextCoverage,
|
|
13
|
+
getMarketCmcIndexContextCoverage,
|
|
14
|
+
getMarketContextBackfillCoverage,
|
|
15
|
+
getMarketGlobalContextCoverage,
|
|
16
|
+
getMarketReferenceAssetContextCoverage,
|
|
17
|
+
getMarketTradeFlowCoverage,
|
|
18
|
+
upsertMarketBreadthRows,
|
|
19
|
+
upsertMarketCmcExchangeLiquidityContextRows,
|
|
20
|
+
upsertMarketCmcFearGreedContextRows,
|
|
21
|
+
upsertMarketCmcIndexContextRows,
|
|
22
|
+
upsertMarketContextBackfillCoverage,
|
|
23
|
+
upsertMarketGlobalContextRows,
|
|
24
|
+
upsertMarketReferenceAssetContextRows,
|
|
25
|
+
upsertMarketTradeFlowRows
|
|
26
|
+
} from "../chunk-DFMKDB2R.mjs";
|
|
27
|
+
import {
|
|
28
|
+
ensureBinanceMarketSchema,
|
|
29
|
+
ensureCoinMarketCapContextSchema,
|
|
30
|
+
ensureMarketContextSchemas
|
|
31
|
+
} from "../chunk-I2J6YDBD.mjs";
|
|
32
|
+
export {
|
|
33
|
+
cleanupDeprecatedMarketContext,
|
|
34
|
+
ensureBinanceMarketSchema,
|
|
35
|
+
ensureCoinMarketCapContextSchema,
|
|
36
|
+
ensureMarketContextSchemas,
|
|
37
|
+
getLatestMarketBreadth,
|
|
38
|
+
getLatestMarketCmcExchangeLiquidityContext,
|
|
39
|
+
getLatestMarketCmcFearGreedContext,
|
|
40
|
+
getLatestMarketCmcIndexContexts,
|
|
41
|
+
getLatestMarketGlobalContext,
|
|
42
|
+
getLatestMarketReferenceAssetContexts,
|
|
43
|
+
getLatestMarketTradeFlow,
|
|
44
|
+
getMarketBreadthCoverage,
|
|
45
|
+
getMarketCmcExchangeLiquidityContextCoverage,
|
|
46
|
+
getMarketCmcFearGreedContextCoverage,
|
|
47
|
+
getMarketCmcIndexContextCoverage,
|
|
48
|
+
getMarketContextBackfillCoverage,
|
|
49
|
+
getMarketGlobalContextCoverage,
|
|
50
|
+
getMarketReferenceAssetContextCoverage,
|
|
51
|
+
getMarketTradeFlowCoverage,
|
|
52
|
+
upsertMarketBreadthRows,
|
|
53
|
+
upsertMarketCmcExchangeLiquidityContextRows,
|
|
54
|
+
upsertMarketCmcFearGreedContextRows,
|
|
55
|
+
upsertMarketCmcIndexContextRows,
|
|
56
|
+
upsertMarketContextBackfillCoverage,
|
|
57
|
+
upsertMarketGlobalContextRows,
|
|
58
|
+
upsertMarketReferenceAssetContextRows,
|
|
59
|
+
upsertMarketTradeFlowRows
|
|
60
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { DerivativesInterval, SpreadRow } from '@tradejs/types';
|
|
2
|
+
|
|
3
|
+
declare function upsertSpreadRows(rows: SpreadRow[]): Promise<void>;
|
|
4
|
+
declare function getSpreadRangeForSymbols(symbols: string[], interval: DerivativesInterval, startMs: number, endMs: number): Promise<any[]>;
|
|
5
|
+
declare function getSpreadSummary(hours?: number, limit?: number): Promise<{
|
|
6
|
+
rows: any[];
|
|
7
|
+
aggregates: any[];
|
|
8
|
+
hours: number;
|
|
9
|
+
}>;
|
|
10
|
+
|
|
11
|
+
export { getSpreadRangeForSymbols, getSpreadSummary, upsertSpreadRows };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { DerivativesInterval, SpreadRow } from '@tradejs/types';
|
|
2
|
+
|
|
3
|
+
declare function upsertSpreadRows(rows: SpreadRow[]): Promise<void>;
|
|
4
|
+
declare function getSpreadRangeForSymbols(symbols: string[], interval: DerivativesInterval, startMs: number, endMs: number): Promise<any[]>;
|
|
5
|
+
declare function getSpreadSummary(hours?: number, limit?: number): Promise<{
|
|
6
|
+
rows: any[];
|
|
7
|
+
aggregates: any[];
|
|
8
|
+
hours: number;
|
|
9
|
+
}>;
|
|
10
|
+
|
|
11
|
+
export { getSpreadRangeForSymbols, getSpreadSummary, upsertSpreadRows };
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/timescale/spread.ts
|
|
21
|
+
var spread_exports = {};
|
|
22
|
+
__export(spread_exports, {
|
|
23
|
+
getSpreadRangeForSymbols: () => getSpreadRangeForSymbols,
|
|
24
|
+
getSpreadSummary: () => getSpreadSummary,
|
|
25
|
+
upsertSpreadRows: () => upsertSpreadRows
|
|
26
|
+
});
|
|
27
|
+
module.exports = __toCommonJS(spread_exports);
|
|
28
|
+
|
|
29
|
+
// src/timescale/pool.ts
|
|
30
|
+
var import_pg = require("pg");
|
|
31
|
+
var getPool = () => {
|
|
32
|
+
if (!global.__pgPool__) {
|
|
33
|
+
const max = Number(process.env.PG_POOL_MAX ?? 10);
|
|
34
|
+
const connectionTimeoutMillis = Number(
|
|
35
|
+
process.env.PG_CONNECTION_TIMEOUT_MS ?? 3e4
|
|
36
|
+
);
|
|
37
|
+
global.__pgPool__ = new import_pg.Pool({
|
|
38
|
+
host: process.env.PG_HOST || "127.0.0.1",
|
|
39
|
+
port: Number(process.env.PG_PORT ?? 5432),
|
|
40
|
+
user: process.env.PG_USER || "app",
|
|
41
|
+
password: String(process.env.PG_PASSWORD ?? "app"),
|
|
42
|
+
database: process.env.PG_DATABASE || process.env.PG_DB || "app",
|
|
43
|
+
max: Number.isFinite(max) && max > 0 ? Math.floor(max) : 10,
|
|
44
|
+
idleTimeoutMillis: 3e4,
|
|
45
|
+
connectionTimeoutMillis: Number.isFinite(connectionTimeoutMillis) && connectionTimeoutMillis > 0 ? Math.floor(connectionTimeoutMillis) : 3e4
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
return global.__pgPool__;
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
// src/timescale/internal.ts
|
|
52
|
+
var spreadSchemaReady = false;
|
|
53
|
+
var spreadSchemaReadyPromise = null;
|
|
54
|
+
var SPREAD_SCHEMA_LOCK_KEY = 610002;
|
|
55
|
+
var withSchemaLock = async (lockKey, work) => {
|
|
56
|
+
const pool = getPool();
|
|
57
|
+
await pool.query("SELECT pg_advisory_lock($1)", [lockKey]);
|
|
58
|
+
try {
|
|
59
|
+
await work();
|
|
60
|
+
} finally {
|
|
61
|
+
await pool.query("SELECT pg_advisory_unlock($1)", [lockKey]);
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
var ensureSpreadSchema = async () => {
|
|
65
|
+
if (spreadSchemaReady) return;
|
|
66
|
+
if (spreadSchemaReadyPromise) {
|
|
67
|
+
await spreadSchemaReadyPromise;
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const pool = getPool();
|
|
71
|
+
spreadSchemaReadyPromise = withSchemaLock(
|
|
72
|
+
SPREAD_SCHEMA_LOCK_KEY,
|
|
73
|
+
async () => {
|
|
74
|
+
if (spreadSchemaReady) return;
|
|
75
|
+
await pool.query("CREATE EXTENSION IF NOT EXISTS timescaledb");
|
|
76
|
+
await pool.query(`
|
|
77
|
+
CREATE TABLE IF NOT EXISTS market_spread (
|
|
78
|
+
symbol text NOT NULL,
|
|
79
|
+
interval text NOT NULL,
|
|
80
|
+
ts timestamptz NOT NULL,
|
|
81
|
+
binance_price double precision,
|
|
82
|
+
coinbase_price double precision,
|
|
83
|
+
spread double precision,
|
|
84
|
+
source text,
|
|
85
|
+
ingested_at timestamptz NOT NULL DEFAULT now(),
|
|
86
|
+
PRIMARY KEY (symbol, interval, ts)
|
|
87
|
+
)
|
|
88
|
+
`);
|
|
89
|
+
await pool.query(`
|
|
90
|
+
SELECT create_hypertable(
|
|
91
|
+
'market_spread',
|
|
92
|
+
'ts',
|
|
93
|
+
if_not_exists => TRUE,
|
|
94
|
+
chunk_time_interval => interval '14 days'
|
|
95
|
+
)
|
|
96
|
+
`);
|
|
97
|
+
await pool.query(`
|
|
98
|
+
CREATE INDEX IF NOT EXISTS market_spread_symbol_tf_ts_idx
|
|
99
|
+
ON market_spread (symbol, interval, ts DESC)
|
|
100
|
+
`);
|
|
101
|
+
spreadSchemaReady = true;
|
|
102
|
+
}
|
|
103
|
+
).finally(() => {
|
|
104
|
+
spreadSchemaReadyPromise = null;
|
|
105
|
+
});
|
|
106
|
+
await spreadSchemaReadyPromise;
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
// src/timescale/spread.ts
|
|
110
|
+
async function upsertSpreadRows(rows) {
|
|
111
|
+
if (!rows.length) return;
|
|
112
|
+
await ensureSpreadSchema();
|
|
113
|
+
const pool = getPool();
|
|
114
|
+
const cols = [
|
|
115
|
+
"symbol",
|
|
116
|
+
"interval",
|
|
117
|
+
"ts",
|
|
118
|
+
"binance_price",
|
|
119
|
+
"coinbase_price",
|
|
120
|
+
"spread",
|
|
121
|
+
"source"
|
|
122
|
+
];
|
|
123
|
+
const maxRows = Math.floor(65535 / cols.length);
|
|
124
|
+
if (rows.length > maxRows) {
|
|
125
|
+
for (let i = 0; i < rows.length; i += maxRows) {
|
|
126
|
+
await upsertSpreadRows(rows.slice(i, i + maxRows));
|
|
127
|
+
}
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
const valuesSql = rows.map(
|
|
131
|
+
(_, i) => `(${cols.map((__, j) => `$${i * cols.length + j + 1}`).join(",")})`
|
|
132
|
+
).join(",");
|
|
133
|
+
const flat = rows.flatMap((row) => [
|
|
134
|
+
row.symbol,
|
|
135
|
+
row.interval,
|
|
136
|
+
row.ts,
|
|
137
|
+
row.binancePrice ?? null,
|
|
138
|
+
row.coinbasePrice ?? null,
|
|
139
|
+
row.spread ?? null,
|
|
140
|
+
row.source ?? null
|
|
141
|
+
]);
|
|
142
|
+
const sql = `
|
|
143
|
+
INSERT INTO market_spread (${cols.join(",")})
|
|
144
|
+
VALUES ${valuesSql}
|
|
145
|
+
ON CONFLICT (symbol, interval, ts) DO UPDATE SET
|
|
146
|
+
binance_price = COALESCE(EXCLUDED.binance_price, market_spread.binance_price),
|
|
147
|
+
coinbase_price = COALESCE(EXCLUDED.coinbase_price, market_spread.coinbase_price),
|
|
148
|
+
spread = COALESCE(EXCLUDED.spread, market_spread.spread),
|
|
149
|
+
source = COALESCE(EXCLUDED.source, market_spread.source),
|
|
150
|
+
ingested_at = now()
|
|
151
|
+
`;
|
|
152
|
+
await pool.query(sql, flat);
|
|
153
|
+
}
|
|
154
|
+
async function getSpreadRangeForSymbols(symbols, interval, startMs, endMs) {
|
|
155
|
+
if (!symbols.length) {
|
|
156
|
+
return [];
|
|
157
|
+
}
|
|
158
|
+
await ensureSpreadSchema();
|
|
159
|
+
const pool = getPool();
|
|
160
|
+
const sql = `
|
|
161
|
+
SELECT symbol, interval, ts, binance_price, coinbase_price, spread
|
|
162
|
+
FROM market_spread
|
|
163
|
+
WHERE symbol = ANY($1)
|
|
164
|
+
AND interval = $2
|
|
165
|
+
AND ts >= to_timestamp($3/1000.0)
|
|
166
|
+
AND ts <= to_timestamp($4/1000.0)
|
|
167
|
+
ORDER BY symbol ASC, ts ASC
|
|
168
|
+
`;
|
|
169
|
+
const res = await pool.query(sql, [symbols, interval, startMs, endMs]);
|
|
170
|
+
return res.rows;
|
|
171
|
+
}
|
|
172
|
+
async function getSpreadSummary(hours = 24, limit = 500) {
|
|
173
|
+
await ensureSpreadSchema();
|
|
174
|
+
const pool = getPool();
|
|
175
|
+
const cappedHours = Math.max(1, Math.min(24 * 30, hours));
|
|
176
|
+
const cappedLimit = Math.max(50, Math.min(5e3, limit));
|
|
177
|
+
const rowsQ = await pool.query(
|
|
178
|
+
`
|
|
179
|
+
SELECT symbol, interval, ts, binance_price, coinbase_price, spread
|
|
180
|
+
FROM market_spread
|
|
181
|
+
WHERE ts >= now() - ($1 || ' hours')::interval
|
|
182
|
+
ORDER BY ts DESC
|
|
183
|
+
LIMIT $2
|
|
184
|
+
`,
|
|
185
|
+
[String(cappedHours), cappedLimit]
|
|
186
|
+
);
|
|
187
|
+
const aggQ = await pool.query(
|
|
188
|
+
`
|
|
189
|
+
SELECT
|
|
190
|
+
symbol,
|
|
191
|
+
interval,
|
|
192
|
+
COUNT(*)::int AS points,
|
|
193
|
+
MAX(ts) AS last_ts,
|
|
194
|
+
AVG(spread) AS avg_spread,
|
|
195
|
+
STDDEV_POP(spread) AS std_spread
|
|
196
|
+
FROM market_spread
|
|
197
|
+
WHERE ts >= now() - ($1 || ' hours')::interval
|
|
198
|
+
GROUP BY symbol, interval
|
|
199
|
+
ORDER BY points DESC, symbol ASC
|
|
200
|
+
LIMIT 500
|
|
201
|
+
`,
|
|
202
|
+
[String(cappedHours)]
|
|
203
|
+
);
|
|
204
|
+
return {
|
|
205
|
+
rows: rowsQ.rows,
|
|
206
|
+
aggregates: aggQ.rows,
|
|
207
|
+
hours: cappedHours
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
211
|
+
0 && (module.exports = {
|
|
212
|
+
getSpreadRangeForSymbols,
|
|
213
|
+
getSpreadSummary,
|
|
214
|
+
upsertSpreadRows
|
|
215
|
+
});
|