Skip to content

Commit 0fd32e2

Browse files
committed
feat: add Binance 4h dataset downloader
1 parent 98451db commit 0fd32e2

1 file changed

Lines changed: 59 additions & 0 deletions

File tree

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import { mkdir, writeFile } from "node:fs/promises";
2+
import { dirname, join } from "node:path";
3+
import { fileURLToPath } from "node:url";
4+
import {
5+
DATASET_END_EXCLUSIVE_MS,
6+
DATASET_START_MS,
7+
DATASET_SYMBOLS,
8+
buildManifestEntry,
9+
candlesToCsv,
10+
fetchKlineRange,
11+
validateCandles
12+
} from "./dataset-tools.mjs";
13+
14+
const scriptDirectory = dirname(fileURLToPath(import.meta.url));
15+
const outputDirectory = join(scriptDirectory, "data");
16+
17+
async function main() {
18+
await mkdir(outputDirectory, { recursive: true });
19+
const files = [];
20+
21+
for (const symbol of DATASET_SYMBOLS) {
22+
console.log(`Downloading ${symbol} 4h candles...`);
23+
const candles = await fetchKlineRange({
24+
symbol,
25+
startTime: DATASET_START_MS,
26+
endExclusive: DATASET_END_EXCLUSIVE_MS
27+
});
28+
const validation = validateCandles(candles, {
29+
expectedStart: DATASET_START_MS,
30+
expectedEndExclusive: DATASET_END_EXCLUSIVE_MS
31+
});
32+
const fileName = `${symbol}-4h-2019-01-01_2026-06-30.csv`;
33+
const csv = candlesToCsv(candles);
34+
await writeFile(join(outputDirectory, fileName), csv, "utf8");
35+
files.push(buildManifestEntry({ symbol, fileName, csv, validation }));
36+
console.log(`Validated ${symbol}: ${validation.rowCount} rows`);
37+
}
38+
39+
const manifest = {
40+
schema_version: 1,
41+
strategy_id: "regime-trend-v1",
42+
source: "Binance Spot REST /api/v3/klines",
43+
generated_at: new Date().toISOString(),
44+
requested_start: new Date(DATASET_START_MS).toISOString(),
45+
requested_end_exclusive: new Date(DATASET_END_EXCLUSIVE_MS).toISOString(),
46+
files
47+
};
48+
await writeFile(
49+
join(outputDirectory, "dataset-manifest.json"),
50+
`${JSON.stringify(manifest, null, 2)}\n`,
51+
"utf8"
52+
);
53+
console.log(`Manifest written to ${join(outputDirectory, "dataset-manifest.json")}`);
54+
}
55+
56+
main().catch((error) => {
57+
console.error(error instanceof Error ? error.stack ?? error.message : error);
58+
process.exitCode = 1;
59+
});

0 commit comments

Comments
 (0)