mirror of
https://github.com/mauricioabh/arbpulse.git
synced 2026-07-27 15:47:43 +00:00
2e8744ccf0
Real-time BTC cross-exchange arbitrage detection (Kraken, Bybit, OKX, Binance) with React dashboard, GitHub Actions CI, and documented Fly.io deploy workflow. Co-authored-by: Cursor <cursoragent@cursor.com>
59 lines
2.1 KiB
TypeScript
59 lines
2.1 KiB
TypeScript
import { test } from "node:test";
|
|
import assert from "node:assert/strict";
|
|
import { bootstrap } from "../../composition/bootstrap.js";
|
|
import { runtime } from "../../infrastructure/config/runtime.js";
|
|
import { FakeMarketDataFeedFactory } from "../../test-support/fake-market-data-feed.js";
|
|
import { book, FixedClock } from "../../test-support/test-fakes.js";
|
|
import { SyntheticFeed } from "../../infrastructure/demo/synthetic-feed.js";
|
|
|
|
const NOW = 2_000_000;
|
|
|
|
test("fixture feed drives detection through bootstrap without network", () => {
|
|
runtime.demoMode = false;
|
|
runtime.flickerConfirmMs = 0;
|
|
runtime.minNetProfitPct = 0.0001;
|
|
|
|
const fixtures = [
|
|
book("bybit", [{ price: 99_990, qty: 2 }], [{ price: 100_000, qty: 2 }], NOW),
|
|
book("okx", [{ price: 100_600, qty: 2 }], [{ price: 100_610, qty: 2 }], NOW),
|
|
book("kraken", [{ price: 100_200, qty: 2 }], [{ price: 100_210, qty: 2 }], NOW),
|
|
];
|
|
|
|
const ctx = bootstrap({
|
|
feedFactory: new FakeMarketDataFeedFactory(fixtures),
|
|
demoFeed: new SyntheticFeed(),
|
|
clock: new FixedClock(NOW),
|
|
});
|
|
|
|
ctx.start();
|
|
|
|
const snap = ctx.application.getSnapshot();
|
|
ctx.stop();
|
|
|
|
assert.ok(snap.stats.ticksProcessed >= 2, `ticks ${snap.stats.ticksProcessed}`);
|
|
const executed = snap.recentOpportunities.filter((o) => o.status === "executed" || o.status === "executed_partial");
|
|
assert.ok(executed.length >= 1, "expected at least one executed opportunity from fixture cross");
|
|
assert.ok(snap.stats.tradesExecuted >= 1, `trades ${snap.stats.tradesExecuted}`);
|
|
});
|
|
|
|
test("NDJSON-shaped fixture lines replay as order books", () => {
|
|
const line = {
|
|
ts: NOW,
|
|
exchange: "bybit" as const,
|
|
bids: [{ price: 99_000, qty: 1 }],
|
|
asks: [{ price: 99_010, qty: 1 }],
|
|
};
|
|
const fixtures = [book(line.exchange, line.bids, line.asks, line.ts)];
|
|
|
|
runtime.demoMode = false;
|
|
runtime.flickerConfirmMs = 0;
|
|
|
|
const ctx = bootstrap({
|
|
feedFactory: new FakeMarketDataFeedFactory(fixtures),
|
|
clock: new FixedClock(NOW),
|
|
});
|
|
ctx.start();
|
|
assert.equal(ctx.application.getSnapshot().stats.ticksProcessed, 1);
|
|
ctx.stop();
|
|
});
|