bfxsentry-agent 0.2.0 → 0.3.1
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/bin/sentry.js +27 -1
- package/dist/bin/sentry.js.map +1 -1
- package/dist/src/backtest/fill-simulator.d.ts.map +1 -1
- package/dist/src/backtest/fill-simulator.js +4 -1
- package/dist/src/backtest/fill-simulator.js.map +1 -1
- package/dist/src/backtest/historical-fetcher.d.ts +8 -0
- package/dist/src/backtest/historical-fetcher.d.ts.map +1 -0
- package/dist/src/backtest/historical-fetcher.js +390 -0
- package/dist/src/backtest/historical-fetcher.js.map +1 -0
- package/dist/src/backtest/optimizer.d.ts +18 -0
- package/dist/src/backtest/optimizer.d.ts.map +1 -0
- package/dist/src/backtest/optimizer.js +264 -0
- package/dist/src/backtest/optimizer.js.map +1 -0
- package/dist/src/backtest/report.d.ts +2 -0
- package/dist/src/backtest/report.d.ts.map +1 -1
- package/dist/src/backtest/report.js +59 -6
- package/dist/src/backtest/report.js.map +1 -1
- package/dist/src/backtest/runner.d.ts.map +1 -1
- package/dist/src/backtest/runner.js +73 -25
- package/dist/src/backtest/runner.js.map +1 -1
- package/dist/src/collector/bitfinex-rest.d.ts +1 -0
- package/dist/src/collector/bitfinex-rest.d.ts.map +1 -1
- package/dist/src/collector/bitfinex-rest.js +1 -1
- package/dist/src/collector/bitfinex-rest.js.map +1 -1
- package/dist/src/risk/position-manager.d.ts +2 -0
- package/dist/src/risk/position-manager.d.ts.map +1 -1
- package/dist/src/risk/position-manager.js +18 -3
- package/dist/src/risk/position-manager.js.map +1 -1
- package/dist/src/skill/backtest.d.ts.map +1 -1
- package/dist/src/skill/backtest.js +11 -5
- package/dist/src/skill/backtest.js.map +1 -1
- package/dist/src/skill/registry.d.ts +12 -0
- package/dist/src/skill/registry.d.ts.map +1 -0
- package/dist/src/skill/registry.js +128 -0
- package/dist/src/skill/registry.js.map +1 -0
- package/package.json +1 -1
package/dist/bin/sentry.js
CHANGED
|
@@ -13,6 +13,7 @@ import { tradeCommand } from '../src/skill/trade.js';
|
|
|
13
13
|
import { backtestCommand } from '../src/skill/backtest.js';
|
|
14
14
|
import { configCommand } from '../src/skill/config.js';
|
|
15
15
|
import { logsCommand } from '../src/skill/logs.js';
|
|
16
|
+
import { getSkillsByCategory } from '../src/skill/registry.js';
|
|
16
17
|
const PID_FILE = getPidPath();
|
|
17
18
|
function writePidFile() {
|
|
18
19
|
try {
|
|
@@ -48,7 +49,32 @@ const program = new Command();
|
|
|
48
49
|
program
|
|
49
50
|
.name('sentry')
|
|
50
51
|
.description('BfxSentry Agent CLI — Bitfinex 信号驱动交易代理')
|
|
51
|
-
.version('0.
|
|
52
|
+
.version('0.3.0');
|
|
53
|
+
// ── sentry skills ──
|
|
54
|
+
program
|
|
55
|
+
.command('skills')
|
|
56
|
+
.description('列出所有可用 Skill')
|
|
57
|
+
.action(() => {
|
|
58
|
+
console.log('\n BfxSentry Agent · Skill 注册表\n');
|
|
59
|
+
const categories = ['signal', 'strategy', 'trade', 'system'];
|
|
60
|
+
const labels = {
|
|
61
|
+
signal: '📡 信号',
|
|
62
|
+
strategy: '🧠 策略',
|
|
63
|
+
trade: '💰 交易',
|
|
64
|
+
system: '⚙️ 系统',
|
|
65
|
+
};
|
|
66
|
+
for (const cat of categories) {
|
|
67
|
+
const items = getSkillsByCategory(cat);
|
|
68
|
+
if (items.length === 0)
|
|
69
|
+
continue;
|
|
70
|
+
console.log(` ${labels[cat]}`);
|
|
71
|
+
for (const s of items) {
|
|
72
|
+
console.log(` ${s.id.padEnd(12)} ${s.name.padEnd(10)} ${s.desc}`);
|
|
73
|
+
console.log(` ${''.padEnd(12)} ${s.usage}`);
|
|
74
|
+
}
|
|
75
|
+
console.log('');
|
|
76
|
+
}
|
|
77
|
+
});
|
|
52
78
|
// ── sentry scan ──
|
|
53
79
|
program
|
|
54
80
|
.command('scan')
|
package/dist/bin/sentry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sentry.js","sourceRoot":"","sources":["../../bin/sentry.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"sentry.js","sourceRoot":"","sources":["../../bin/sentry.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fill-simulator.d.ts","sourceRoot":"","sources":["../../../src/backtest/fill-simulator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAG3D,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,GAAG,eAAe,
|
|
1
|
+
{"version":3,"file":"fill-simulator.d.ts","sourceRoot":"","sources":["../../../src/backtest/fill-simulator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAG3D,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,GAAG,eAAe,CAmC3F;AAGD,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,GAAG,OAAO,EAC3B,YAAY,EAAE,cAAc,GAC3B,OAAO,CAQT"}
|
|
@@ -18,7 +18,10 @@ export function simulateFill(intent, snapshot) {
|
|
|
18
18
|
fillPrice = bestBid * (1 - slippage);
|
|
19
19
|
}
|
|
20
20
|
const capitalUsd = 5000;
|
|
21
|
-
|
|
21
|
+
// Support both percent-based and fixed-stake sizing
|
|
22
|
+
const sizeUsd = intent.sizePct > 0
|
|
23
|
+
? capitalUsd * (intent.sizePct / 100)
|
|
24
|
+
: intent.meta?.stakeUsdc || (intent.meta?.hedgeBtc ? intent.meta.hedgeBtc * fillPrice : 100);
|
|
22
25
|
const fillSize = sizeUsd / fillPrice;
|
|
23
26
|
return {
|
|
24
27
|
success: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fill-simulator.js","sourceRoot":"","sources":["../../../src/backtest/fill-simulator.ts"],"names":[],"mappings":"AAGA,oEAAoE;AACpE,MAAM,UAAU,YAAY,CAAC,MAAmB,EAAE,QAAwB;IACxE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,QAAQ,CAAA;IAEtC,mDAAmD;IACnD,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,MAAM,CAAC,SAAS,CAAA;IAC5D,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,MAAM,CAAC,SAAS,CAAA;IAE5D,IAAI,SAAiB,CAAA;IACrB,IAAI,MAAM,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;QAChC,sDAAsD;QACtD,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,CAAA;QAClC,MAAM,QAAQ,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;QAClE,SAAS,GAAG,OAAO,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAA;IACtC,CAAC;SAAM,CAAC;QACN,4CAA4C;QAC5C,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,CAAA;QAClC,MAAM,QAAQ,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;QAClE,SAAS,GAAG,OAAO,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAA;IACtC,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAA;IACvB,MAAM,OAAO,GAAG,UAAU,GAAG,CAAC,MAAM,CAAC,OAAO,GAAG,GAAG,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"fill-simulator.js","sourceRoot":"","sources":["../../../src/backtest/fill-simulator.ts"],"names":[],"mappings":"AAGA,oEAAoE;AACpE,MAAM,UAAU,YAAY,CAAC,MAAmB,EAAE,QAAwB;IACxE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,QAAQ,CAAA;IAEtC,mDAAmD;IACnD,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,MAAM,CAAC,SAAS,CAAA;IAC5D,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,MAAM,CAAC,SAAS,CAAA;IAE5D,IAAI,SAAiB,CAAA;IACrB,IAAI,MAAM,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;QAChC,sDAAsD;QACtD,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,CAAA;QAClC,MAAM,QAAQ,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;QAClE,SAAS,GAAG,OAAO,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAA;IACtC,CAAC;SAAM,CAAC;QACN,4CAA4C;QAC5C,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,CAAA;QAClC,MAAM,QAAQ,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;QAClE,SAAS,GAAG,OAAO,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAA;IACtC,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAA;IACvB,oDAAoD;IACpD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,GAAG,CAAC;QAChC,CAAC,CAAC,UAAU,GAAG,CAAC,MAAM,CAAC,OAAO,GAAG,GAAG,CAAC;QACrC,CAAC,CAAE,MAAM,CAAC,IAAI,EAAE,SAAoB,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAE,MAAM,CAAC,IAAI,CAAC,QAAmB,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;IACtH,MAAM,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAA;IAEpC,OAAO;QACL,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,MAAM,MAAM,CAAC,EAAE,EAAE;QAC1B,SAAS;QACT,QAAQ;QACR,GAAG,EAAE,OAAO,GAAG,KAAK;QACpB,SAAS,EAAE,QAAQ,CAAC,SAAS;KAC9B,CAAA;AACH,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,cAAc,CAC5B,KAAa,EACb,SAA2B,EAC3B,YAA4B;IAE5B,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;QACzB,mDAAmD;QACnD,OAAO,YAAY,CAAC,MAAM,CAAC,GAAG,IAAI,KAAK,CAAA;IACzC,CAAC;SAAM,CAAC;QACN,oDAAoD;QACpD,OAAO,YAAY,CAAC,MAAM,CAAC,IAAI,IAAI,KAAK,CAAA;IAC1C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AgentConfig } from '../core/config.js';
|
|
2
|
+
import type { MarketSnapshot } from '../collector/types.js';
|
|
3
|
+
export interface FetchProgress {
|
|
4
|
+
phase: string;
|
|
5
|
+
detail: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function fetchHistoricalSnapshots(cfg: AgentConfig, days: number, onProgress?: (p: FetchProgress) => void): Promise<MarketSnapshot[]>;
|
|
8
|
+
//# sourceMappingURL=historical-fetcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"historical-fetcher.d.ts","sourceRoot":"","sources":["../../../src/backtest/historical-fetcher.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,KAAK,EACV,cAAc,EAGf,MAAM,uBAAuB,CAAA;AAia9B,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf;AAED,wBAAsB,wBAAwB,CAC5C,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,GACtC,OAAO,CAAC,cAAc,EAAE,CAAC,CAwD3B"}
|
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 从 Bitfinex REST API 拉取历史数据,构建 MarketSnapshot 序列用于回测。
|
|
3
|
+
* 不再依赖 SQLite 预录数据,用户即装即用。
|
|
4
|
+
*/
|
|
5
|
+
import { fetchJson } from '../collector/bitfinex-rest.js';
|
|
6
|
+
async function fetchCandles(cfg, timeframe, startMs, endMs) {
|
|
7
|
+
const base = cfg.collector.bitfinex.base_url;
|
|
8
|
+
const sym = cfg.collector.bitfinex.symbol;
|
|
9
|
+
const all = [];
|
|
10
|
+
let curStart = startMs;
|
|
11
|
+
// Paginate with sort=1 (ascending), move start forward
|
|
12
|
+
while (true) {
|
|
13
|
+
const url = `${base}/v2/candles/trade:${timeframe}:${sym}/hist?limit=10000&start=${curStart}&end=${endMs}&sort=1`;
|
|
14
|
+
const raw = await fetchJson(url);
|
|
15
|
+
if (!raw || raw.length === 0)
|
|
16
|
+
break;
|
|
17
|
+
for (const c of raw) {
|
|
18
|
+
all.push({ ts: c[0], open: c[1], close: c[2], high: c[3], low: c[4], volume: c[5] });
|
|
19
|
+
}
|
|
20
|
+
if (raw.length < 10000)
|
|
21
|
+
break;
|
|
22
|
+
curStart = raw[raw.length - 1][0] + 1;
|
|
23
|
+
await sleep(300);
|
|
24
|
+
}
|
|
25
|
+
return all.sort((a, b) => a.ts - b.ts);
|
|
26
|
+
}
|
|
27
|
+
// ── Historical Trades (time-windowed pagination) ──
|
|
28
|
+
async function fetchHistoricalTrades(cfg, startMs, endMs) {
|
|
29
|
+
const base = cfg.collector.bitfinex.base_url;
|
|
30
|
+
const sym = cfg.collector.bitfinex.symbol;
|
|
31
|
+
const all = [];
|
|
32
|
+
// Fetch in 6-hour chunks to distribute trades evenly
|
|
33
|
+
const chunkMs = 6 * 3600_000;
|
|
34
|
+
for (let chunkStart = startMs; chunkStart < endMs; chunkStart += chunkMs) {
|
|
35
|
+
const chunkEnd = Math.min(chunkStart + chunkMs, endMs);
|
|
36
|
+
const url = `${base}/v2/trades/${sym}/hist?limit=1000&start=${chunkStart}&end=${chunkEnd}&sort=1`;
|
|
37
|
+
try {
|
|
38
|
+
const raw = await fetchJson(url);
|
|
39
|
+
if (raw && raw.length > 0) {
|
|
40
|
+
for (const r of raw) {
|
|
41
|
+
all.push({
|
|
42
|
+
id: r[0],
|
|
43
|
+
timestamp: r[1],
|
|
44
|
+
amount: Math.abs(r[2]),
|
|
45
|
+
price: r[3],
|
|
46
|
+
side: r[2] > 0 ? 'buy' : 'sell',
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
catch { /* skip chunk on error */ }
|
|
52
|
+
await sleep(300);
|
|
53
|
+
}
|
|
54
|
+
return all.sort((a, b) => a.timestamp - b.timestamp);
|
|
55
|
+
}
|
|
56
|
+
// ── Historical Liquidations ──
|
|
57
|
+
async function fetchHistoricalLiquidations(cfg, startMs, endMs) {
|
|
58
|
+
const base = cfg.collector.bitfinex.base_url;
|
|
59
|
+
const all = [];
|
|
60
|
+
let curStart = startMs;
|
|
61
|
+
while (true) {
|
|
62
|
+
const url = `${base}/v2/liquidations/hist?limit=500&start=${curStart}&end=${endMs}&sort=1`;
|
|
63
|
+
const raw = await fetchJson(url);
|
|
64
|
+
if (!raw || raw.length === 0)
|
|
65
|
+
break;
|
|
66
|
+
for (const outer of raw) {
|
|
67
|
+
const item = outer[0];
|
|
68
|
+
if (!item || !Array.isArray(item))
|
|
69
|
+
continue;
|
|
70
|
+
const amount = Math.abs(item[5] || 0);
|
|
71
|
+
const price = item[6] || 0;
|
|
72
|
+
if (amount === 0 || price === 0)
|
|
73
|
+
continue;
|
|
74
|
+
all.push({
|
|
75
|
+
id: item[1],
|
|
76
|
+
timestamp: item[2],
|
|
77
|
+
symbol: item[4] || '',
|
|
78
|
+
amount,
|
|
79
|
+
price,
|
|
80
|
+
side: item[5] > 0 ? 'short' : 'long',
|
|
81
|
+
usdValue: amount * price,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
if (raw.length < 500)
|
|
85
|
+
break;
|
|
86
|
+
const lastItem = raw[raw.length - 1][0];
|
|
87
|
+
curStart = lastItem[2] + 1;
|
|
88
|
+
await sleep(300);
|
|
89
|
+
}
|
|
90
|
+
return all.sort((a, b) => a.timestamp - b.timestamp);
|
|
91
|
+
}
|
|
92
|
+
// ── Historical Funding Stats ──
|
|
93
|
+
async function fetchHistoricalFunding(cfg, startMs, endMs) {
|
|
94
|
+
const base = cfg.collector.bitfinex.base_url;
|
|
95
|
+
const sym = cfg.collector.bitfinex.funding_symbol;
|
|
96
|
+
const url = `${base}/v2/funding/stats/${sym}/hist?limit=10000&start=${startMs}&end=${endMs}&sort=1`;
|
|
97
|
+
const raw = await fetchJson(url);
|
|
98
|
+
return raw.map(item => {
|
|
99
|
+
const total = item[7] || 0;
|
|
100
|
+
const used = item[8] || 0;
|
|
101
|
+
return {
|
|
102
|
+
timestamp: item[0],
|
|
103
|
+
frr: item[3],
|
|
104
|
+
avgPeriod: item[4],
|
|
105
|
+
totalAmount: total,
|
|
106
|
+
usedAmount: used,
|
|
107
|
+
utilization: total > 0 ? used / total : 0,
|
|
108
|
+
};
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
// ── Build MarketSnapshot from candle + context ──
|
|
112
|
+
function buildSnapshotFromCandle(candle, prevCandles, trades, liqs, funding) {
|
|
113
|
+
const price = candle.close;
|
|
114
|
+
// Candle directional bias: how bullish/bearish is this candle?
|
|
115
|
+
const candleReturn = candle.open > 0 ? (candle.close - candle.open) / candle.open : 0;
|
|
116
|
+
const isBullish = candleReturn > 0.002; // > 0.2% move
|
|
117
|
+
const isBearish = candleReturn < -0.002;
|
|
118
|
+
const isStrongMove = Math.abs(candleReturn) > 0.01; // > 1% move
|
|
119
|
+
// Multi-candle momentum (last 3 candles)
|
|
120
|
+
const recentReturns = prevCandles.slice(-3).map(c => c.open > 0 ? (c.close - c.open) / c.open : 0);
|
|
121
|
+
const avgMomentum = recentReturns.length > 0 ? recentReturns.reduce((a, b) => a + b, 0) / recentReturns.length : 0;
|
|
122
|
+
// Ticker from candle OHLCV
|
|
123
|
+
const ticker = {
|
|
124
|
+
bid: price * 0.9999,
|
|
125
|
+
bidSize: candle.volume * 0.3,
|
|
126
|
+
ask: price * 1.0001,
|
|
127
|
+
askSize: candle.volume * 0.3,
|
|
128
|
+
dailyChange: candle.close - candle.open,
|
|
129
|
+
dailyChangePct: candleReturn,
|
|
130
|
+
lastPrice: price,
|
|
131
|
+
volume: candle.volume,
|
|
132
|
+
high: candle.high,
|
|
133
|
+
low: candle.low,
|
|
134
|
+
};
|
|
135
|
+
// Filter trades in this candle's 1h window
|
|
136
|
+
const windowStart = candle.ts;
|
|
137
|
+
const windowEnd = candle.ts + 3600_000;
|
|
138
|
+
const windowTrades = trades.filter(t => t.timestamp >= windowStart && t.timestamp < windowEnd);
|
|
139
|
+
// TradeFlow — use actual trades if available, otherwise derive from candle
|
|
140
|
+
const tradeFlow = windowTrades.length > 10
|
|
141
|
+
? buildTradeFlow(windowTrades)
|
|
142
|
+
: deriveTradeFlowFromCandle(candle);
|
|
143
|
+
// Synthetic orderbook — biased by candle direction and trade flow
|
|
144
|
+
const buyRatio = tradeFlow.buyRatio60s;
|
|
145
|
+
// Stronger directional candles → more imbalanced orderbook
|
|
146
|
+
const bidMultiplier = isBullish ? (1 + Math.abs(candleReturn) * 50) : isBearish ? (1 - Math.abs(candleReturn) * 25) : 1;
|
|
147
|
+
const askMultiplier = isBearish ? (1 + Math.abs(candleReturn) * 50) : isBullish ? (1 - Math.abs(candleReturn) * 25) : 1;
|
|
148
|
+
const baseBidDepth = candle.volume * 0.25;
|
|
149
|
+
const baseAskDepth = candle.volume * 0.25;
|
|
150
|
+
const bidDepth05 = baseBidDepth * bidMultiplier;
|
|
151
|
+
const askDepth05 = baseAskDepth * askMultiplier;
|
|
152
|
+
const range = candle.high - candle.low;
|
|
153
|
+
const bidAskSpread = Math.max(range * 0.01, price * 0.0001);
|
|
154
|
+
const orderbook = {
|
|
155
|
+
bids: [
|
|
156
|
+
{ price: price - bidAskSpread, count: 10, amount: candle.volume * 0.05 * bidMultiplier },
|
|
157
|
+
{ price: price - bidAskSpread * 3, count: 15, amount: candle.volume * 0.08 * bidMultiplier },
|
|
158
|
+
{ price: price - bidAskSpread * 8, count: 20, amount: candle.volume * 0.12 * bidMultiplier },
|
|
159
|
+
],
|
|
160
|
+
asks: [
|
|
161
|
+
{ price: price + bidAskSpread, count: 10, amount: candle.volume * 0.05 * askMultiplier },
|
|
162
|
+
{ price: price + bidAskSpread * 3, count: 15, amount: candle.volume * 0.08 * askMultiplier },
|
|
163
|
+
{ price: price + bidAskSpread * 8, count: 20, amount: candle.volume * 0.12 * askMultiplier },
|
|
164
|
+
],
|
|
165
|
+
bidDepth02: candle.volume * 0.13 * bidMultiplier,
|
|
166
|
+
bidDepth05,
|
|
167
|
+
bidDepth10: bidDepth05,
|
|
168
|
+
askDepth02: candle.volume * 0.13 * askMultiplier,
|
|
169
|
+
askDepth05,
|
|
170
|
+
askDepth10: askDepth05,
|
|
171
|
+
walls: [], // Walls detected from strong price levels below
|
|
172
|
+
};
|
|
173
|
+
// Detect synthetic walls from extreme candle patterns
|
|
174
|
+
// A strong move that reverses (long wick) suggests a wall
|
|
175
|
+
const upperWick = candle.high - Math.max(candle.open, candle.close);
|
|
176
|
+
const lowerWick = Math.min(candle.open, candle.close) - candle.low;
|
|
177
|
+
const body = Math.abs(candle.close - candle.open);
|
|
178
|
+
if (upperWick > body * 2 && range > 0) {
|
|
179
|
+
// Strong upper wick = ask wall near the high
|
|
180
|
+
orderbook.walls.push({
|
|
181
|
+
side: 'ask',
|
|
182
|
+
price: candle.high,
|
|
183
|
+
amount: candle.volume * 0.5,
|
|
184
|
+
multiplier: 6,
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
if (lowerWick > body * 2 && range > 0) {
|
|
188
|
+
// Strong lower wick = bid wall near the low
|
|
189
|
+
orderbook.walls.push({
|
|
190
|
+
side: 'bid',
|
|
191
|
+
price: candle.low,
|
|
192
|
+
amount: candle.volume * 0.5,
|
|
193
|
+
multiplier: 6,
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
// Filter liquidations in window
|
|
197
|
+
const windowLiqs = liqs.filter(l => l.timestamp >= candle.ts - 3600_000 && l.timestamp < windowEnd);
|
|
198
|
+
// Liq aggregation
|
|
199
|
+
const liqAgg = buildLiqAgg(liqs, candle.ts);
|
|
200
|
+
// Liq intensity
|
|
201
|
+
const liqIntensityPct = calcLiqIntensityFromHistory(liqs.filter(l => l.timestamp <= windowEnd), candle.ts);
|
|
202
|
+
// Funding: all data points up to this candle
|
|
203
|
+
const relevantFunding = funding.filter(f => f.timestamp <= windowEnd);
|
|
204
|
+
const recentFunding = relevantFunding.slice(-12); // need ≥10 for funding signal
|
|
205
|
+
// Derive whale-like data from sustained momentum
|
|
206
|
+
let whaleScore = 50; // neutral default
|
|
207
|
+
let whaleDirection = '中性';
|
|
208
|
+
const whales = [];
|
|
209
|
+
if (prevCandles.length >= 3) {
|
|
210
|
+
// If 3+ candles in same direction with increasing volume, simulate whale activity
|
|
211
|
+
const last3 = prevCandles.slice(-3);
|
|
212
|
+
const allBullish = last3.every(c => c.close > c.open);
|
|
213
|
+
const allBearish = last3.every(c => c.close < c.open);
|
|
214
|
+
const volIncreasing = last3.length >= 2 && last3[last3.length - 1].volume > last3[0].volume * 1.2;
|
|
215
|
+
if (allBullish && volIncreasing) {
|
|
216
|
+
whaleScore = 65 + Math.min(20, Math.abs(avgMomentum) * 1000);
|
|
217
|
+
whaleDirection = whaleScore >= 70 ? '强烈看多' : '偏多';
|
|
218
|
+
// Simulate aligned whales
|
|
219
|
+
for (let w = 0; w < 6; w++) {
|
|
220
|
+
whales.push({
|
|
221
|
+
username: `whale_${w}`,
|
|
222
|
+
rank: w + 1,
|
|
223
|
+
pnl: Math.abs(avgMomentum) * 100000 * (w + 1),
|
|
224
|
+
direction: 'long',
|
|
225
|
+
correlation: 0.7 + Math.random() * 0.2,
|
|
226
|
+
confidence: 0.6 + Math.random() * 0.3,
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
else if (allBearish && volIncreasing) {
|
|
231
|
+
whaleScore = 35 - Math.min(20, Math.abs(avgMomentum) * 1000);
|
|
232
|
+
whaleDirection = whaleScore <= 30 ? '强烈看空' : '偏空';
|
|
233
|
+
for (let w = 0; w < 6; w++) {
|
|
234
|
+
whales.push({
|
|
235
|
+
username: `whale_${w}`,
|
|
236
|
+
rank: w + 1,
|
|
237
|
+
pnl: Math.abs(avgMomentum) * 100000 * (w + 1),
|
|
238
|
+
direction: 'short',
|
|
239
|
+
correlation: -(0.7 + Math.random() * 0.2),
|
|
240
|
+
confidence: 0.6 + Math.random() * 0.3,
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
return {
|
|
246
|
+
timestamp: candle.ts,
|
|
247
|
+
ticker,
|
|
248
|
+
orderbook,
|
|
249
|
+
trades: windowTrades,
|
|
250
|
+
tradeFlow,
|
|
251
|
+
liquidations: windowLiqs,
|
|
252
|
+
liqAgg,
|
|
253
|
+
liqIntensityPct,
|
|
254
|
+
funding: recentFunding,
|
|
255
|
+
fundingCurrent: recentFunding.length > 0 ? recentFunding[recentFunding.length - 1] : null,
|
|
256
|
+
deriv: null,
|
|
257
|
+
whales,
|
|
258
|
+
whaleScore,
|
|
259
|
+
whaleDirection,
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
function deriveTradeFlowFromCandle(candle) {
|
|
263
|
+
// Infer buy/sell ratio from candle direction
|
|
264
|
+
const ret = candle.open > 0 ? (candle.close - candle.open) / candle.open : 0;
|
|
265
|
+
// Bullish candle → more buy volume, bearish → more sell volume
|
|
266
|
+
const buyRatio = 0.5 + Math.min(0.35, Math.max(-0.35, ret * 30));
|
|
267
|
+
const totalVol = candle.volume;
|
|
268
|
+
const buyVol = totalVol * buyRatio;
|
|
269
|
+
const sellVol = totalVol * (1 - buyRatio);
|
|
270
|
+
return {
|
|
271
|
+
buyVol30s: buyVol * 0.008,
|
|
272
|
+
sellVol30s: sellVol * 0.008,
|
|
273
|
+
buyVol60s: buyVol * 0.017,
|
|
274
|
+
sellVol60s: sellVol * 0.017,
|
|
275
|
+
buyVol5m: buyVol * 0.083,
|
|
276
|
+
sellVol5m: sellVol * 0.083,
|
|
277
|
+
buyCount60s: Math.max(1, Math.round(50 * buyRatio)),
|
|
278
|
+
sellCount60s: Math.max(1, Math.round(50 * (1 - buyRatio))),
|
|
279
|
+
netFlow60s: (buyVol - sellVol) * 0.017,
|
|
280
|
+
buyRatio60s: buyRatio,
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
function buildTradeFlow(trades) {
|
|
284
|
+
const buyTrades = trades.filter(t => t.side === 'buy');
|
|
285
|
+
const sellTrades = trades.filter(t => t.side === 'sell');
|
|
286
|
+
const buyVol = buyTrades.reduce((s, t) => s + t.amount, 0);
|
|
287
|
+
const sellVol = sellTrades.reduce((s, t) => s + t.amount, 0);
|
|
288
|
+
const total = buyVol + sellVol;
|
|
289
|
+
// Scale sub-windows proportionally
|
|
290
|
+
return {
|
|
291
|
+
buyVol30s: buyVol * 0.008,
|
|
292
|
+
sellVol30s: sellVol * 0.008,
|
|
293
|
+
buyVol60s: buyVol * 0.017,
|
|
294
|
+
sellVol60s: sellVol * 0.017,
|
|
295
|
+
buyVol5m: buyVol * 0.083,
|
|
296
|
+
sellVol5m: sellVol * 0.083,
|
|
297
|
+
buyCount60s: Math.max(1, Math.round(buyTrades.length * 0.017)),
|
|
298
|
+
sellCount60s: Math.max(1, Math.round(sellTrades.length * 0.017)),
|
|
299
|
+
netFlow60s: (buyVol - sellVol) * 0.017,
|
|
300
|
+
buyRatio60s: total > 0 ? buyVol / total : 0.5,
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
function buildLiqAgg(liqs, refTs) {
|
|
304
|
+
const agg = (sec) => {
|
|
305
|
+
const window = liqs.filter(l => l.timestamp >= refTs - sec * 1000 && l.timestamp <= refTs);
|
|
306
|
+
const longUsd = window.filter(l => l.side === 'long').reduce((s, l) => s + l.usdValue, 0);
|
|
307
|
+
const shortUsd = window.filter(l => l.side === 'short').reduce((s, l) => s + l.usdValue, 0);
|
|
308
|
+
return { longUsd, shortUsd, total: longUsd + shortUsd, count: window.length };
|
|
309
|
+
};
|
|
310
|
+
return { w1m: agg(60), w5m: agg(300), w15m: agg(900), w1h: agg(3600), w24h: agg(86400) };
|
|
311
|
+
}
|
|
312
|
+
function calcLiqIntensityFromHistory(liqs, refTs) {
|
|
313
|
+
if (liqs.length === 0)
|
|
314
|
+
return 0;
|
|
315
|
+
// Use last 24h of liqs for percentile calculation
|
|
316
|
+
const window24h = liqs.filter(l => l.timestamp >= refTs - 86400_000);
|
|
317
|
+
if (window24h.length === 0)
|
|
318
|
+
return 0;
|
|
319
|
+
const buckets = [];
|
|
320
|
+
const start = window24h[0].timestamp;
|
|
321
|
+
for (let t = start; t < refTs; t += 60_000) {
|
|
322
|
+
const bucket = window24h.filter(l => l.timestamp >= t && l.timestamp < t + 60_000);
|
|
323
|
+
buckets.push(bucket.reduce((s, l) => s + l.usdValue, 0));
|
|
324
|
+
}
|
|
325
|
+
if (buckets.length === 0)
|
|
326
|
+
return 0;
|
|
327
|
+
const currentBucket = window24h
|
|
328
|
+
.filter(l => l.timestamp >= refTs - 60_000 && l.timestamp <= refTs)
|
|
329
|
+
.reduce((s, l) => s + l.usdValue, 0);
|
|
330
|
+
const sorted = [...buckets].sort((a, b) => a - b);
|
|
331
|
+
const idx = sorted.findIndex(v => v >= currentBucket);
|
|
332
|
+
return idx >= 0 ? idx / sorted.length : 1;
|
|
333
|
+
}
|
|
334
|
+
function sleep(ms) {
|
|
335
|
+
return new Promise(r => setTimeout(r, ms));
|
|
336
|
+
}
|
|
337
|
+
export async function fetchHistoricalSnapshots(cfg, days, onProgress) {
|
|
338
|
+
const endMs = Date.now();
|
|
339
|
+
const startMs = endMs - days * 86400_000;
|
|
340
|
+
const progress = (phase, detail) => {
|
|
341
|
+
onProgress?.({ phase, detail });
|
|
342
|
+
};
|
|
343
|
+
// Step 1: Fetch 1h candles as price backbone
|
|
344
|
+
progress('candles', `拉取 ${days} 天 K 线数据...`);
|
|
345
|
+
const candles = await fetchCandles(cfg, '1h', startMs, endMs);
|
|
346
|
+
if (candles.length === 0) {
|
|
347
|
+
throw new Error(`无法获取 K 线数据,请检查网络连接`);
|
|
348
|
+
}
|
|
349
|
+
progress('candles', `获取 ${candles.length} 根 1h K 线`);
|
|
350
|
+
// Step 2: Fetch historical trades (time-chunked for even distribution)
|
|
351
|
+
progress('trades', '拉取历史成交数据...');
|
|
352
|
+
let trades = [];
|
|
353
|
+
try {
|
|
354
|
+
trades = await fetchHistoricalTrades(cfg, startMs, endMs);
|
|
355
|
+
progress('trades', `获取 ${trades.length} 条成交记录`);
|
|
356
|
+
}
|
|
357
|
+
catch {
|
|
358
|
+
progress('trades', '成交数据不可用,使用 K 线推算');
|
|
359
|
+
}
|
|
360
|
+
// Step 3: Fetch historical liquidations
|
|
361
|
+
progress('liquidations', '拉取历史爆仓数据...');
|
|
362
|
+
let liqs = [];
|
|
363
|
+
try {
|
|
364
|
+
liqs = await fetchHistoricalLiquidations(cfg, startMs, endMs);
|
|
365
|
+
progress('liquidations', `获取 ${liqs.length} 条爆仓记录`);
|
|
366
|
+
}
|
|
367
|
+
catch {
|
|
368
|
+
progress('liquidations', '爆仓数据不可用');
|
|
369
|
+
}
|
|
370
|
+
// Step 4: Fetch historical funding stats
|
|
371
|
+
progress('funding', '拉取历史融资数据...');
|
|
372
|
+
let funding = [];
|
|
373
|
+
try {
|
|
374
|
+
funding = await fetchHistoricalFunding(cfg, startMs, endMs);
|
|
375
|
+
progress('funding', `获取 ${funding.length} 条融资记录`);
|
|
376
|
+
}
|
|
377
|
+
catch {
|
|
378
|
+
progress('funding', '融资数据不可用');
|
|
379
|
+
}
|
|
380
|
+
// Step 5: Build snapshot for each candle (with look-back context)
|
|
381
|
+
progress('build', `构建 ${candles.length} 个市场快照...`);
|
|
382
|
+
const snapshots = [];
|
|
383
|
+
for (let i = 0; i < candles.length; i++) {
|
|
384
|
+
const prevCandles = candles.slice(Math.max(0, i - 5), i);
|
|
385
|
+
snapshots.push(buildSnapshotFromCandle(candles[i], prevCandles, trades, liqs, funding));
|
|
386
|
+
}
|
|
387
|
+
progress('done', `完成!共 ${snapshots.length} 个快照,覆盖 ${days} 天`);
|
|
388
|
+
return snapshots;
|
|
389
|
+
}
|
|
390
|
+
//# sourceMappingURL=historical-fetcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"historical-fetcher.js","sourceRoot":"","sources":["../../../src/backtest/historical-fetcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { AgentConfig } from '../core/config.js';
|
|
2
|
+
import type { BacktestResult } from './runner.js';
|
|
3
|
+
export interface OptimizeResult {
|
|
4
|
+
best: BacktestResult;
|
|
5
|
+
bestParams: string;
|
|
6
|
+
default: BacktestResult;
|
|
7
|
+
totalCombinations: number;
|
|
8
|
+
topResults: {
|
|
9
|
+
params: string;
|
|
10
|
+
pnl: number;
|
|
11
|
+
winRate: number;
|
|
12
|
+
trades: number;
|
|
13
|
+
sharpe: number;
|
|
14
|
+
score: number;
|
|
15
|
+
}[];
|
|
16
|
+
}
|
|
17
|
+
export declare function runOptimizedBacktest(baseConfig: AgentConfig, strategyFilter_: string | undefined, days: number, onProgress?: (msg: string) => void): Promise<OptimizeResult>;
|
|
18
|
+
//# sourceMappingURL=optimizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optimizer.d.ts","sourceRoot":"","sources":["../../../src/backtest/optimizer.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAEpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAgPjD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,cAAc,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,cAAc,CAAA;IACvB,iBAAiB,EAAE,MAAM,CAAA;IACzB,UAAU,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAC9G;AAED,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,WAAW,EACvB,eAAe,EAAE,MAAM,GAAG,SAAS,EACnC,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GACjC,OAAO,CAAC,cAAc,CAAC,CAyEzB"}
|