feat: DB-Schema (candles, backtest_runs), Migration, CandleStore
This commit is contained in:
35
src/server/market/candle-store.ts
Normal file
35
src/server/market/candle-store.ts
Normal file
@@ -0,0 +1,35 @@
|
||||
import { and, asc, count, eq, gte, lt, max, min } from 'drizzle-orm';
|
||||
import { db } from '../db/client';
|
||||
import { candles } from '../db/schema';
|
||||
import type { Candle, Pair } from '../types';
|
||||
|
||||
export async function insertCandles(pair: Pair, items: Candle[]): Promise<void> {
|
||||
for (let i = 0; i < items.length; i += 1000) {
|
||||
const chunk = items.slice(i, i + 1000).map((c) => ({
|
||||
pair,
|
||||
ts: new Date(c.ts),
|
||||
open: c.open,
|
||||
high: c.high,
|
||||
low: c.low,
|
||||
close: c.close,
|
||||
volume: c.volume,
|
||||
}));
|
||||
await db.insert(candles).values(chunk).onConflictDoNothing();
|
||||
}
|
||||
}
|
||||
|
||||
export async function getCandles(pair: Pair, from?: number, to?: number): Promise<Candle[]> {
|
||||
const conds = [eq(candles.pair, pair)];
|
||||
if (from !== undefined) conds.push(gte(candles.ts, new Date(from)));
|
||||
if (to !== undefined) conds.push(lt(candles.ts, new Date(to)));
|
||||
const rows = await db.select().from(candles).where(and(...conds)).orderBy(asc(candles.ts));
|
||||
return rows.map((r) => ({ ts: r.ts.getTime(), open: r.open, high: r.high, low: r.low, close: r.close, volume: r.volume }));
|
||||
}
|
||||
|
||||
export async function getCoverage(pair: Pair): Promise<{ from: Date | null; to: Date | null; count: number }> {
|
||||
const [row] = await db
|
||||
.select({ from: min(candles.ts), to: max(candles.ts), count: count() })
|
||||
.from(candles)
|
||||
.where(eq(candles.pair, pair));
|
||||
return { from: row.from, to: row.to, count: Number(row.count) };
|
||||
}
|
||||
Reference in New Issue
Block a user