function generateDailyPacket(stock_code, startDate, days, basePrice) { const data = []; let prevClose = Number(basePrice); const toStrDate = (dateVal) => (typeof dateVal === 'number' ? String(dateVal) : dateVal); const addDays = (yyyymmdd, delta) => { const y = parseInt(yyyymmdd.slice(0, 4), 10); const m = parseInt(yyyymmdd.slice(4, 6), 10) - 1; const d = parseInt(yyyymmdd.slice(6, 8), 10); const dt = new Date(y, m, d); dt.setDate(dt.getDate() + delta); const yyyy = dt.getFullYear(); const mm = String(dt.getMonth() + 1).padStart(2, '0'); const dd = String(dt.getDate()).padStart(2, '0'); return `${yyyy}${mm}${dd}`; }; const randDrift = () => (Math.random() - 0.5) * 0.02; // 每日 ±1% 漂移 const spread = 0.00050; // 买卖点差(可按需要调整) let date = toStrDate(startDate); for (let i = 0; i < days; i++) { const open = +(prevClose * (1 + randDrift())).toFixed(5); const close = +(open * (1 + randDrift())).toFixed(5); const highRaw = Math.max(open, close) * (1 + Math.random() * 0.01); const lowRaw = Math.min(open, close) * (1 - Math.random() * 0.01); const high = +highRaw.toFixed(5); const low = +lowRaw.toFixed(5); const tick_qty = Math.floor(1000 + Math.random() * 5000); // 成交量 const amount = +(close * tick_qty).toFixed(2); // 成交额 const item = { ts_code: stock_code, trade_date: date, bid_open: open, bid_high: high, bid_low: low, bid_close: close, ask_open: +(open + spread).toFixed(5), ask_high: +(high + spread).toFixed(5), ask_low: +(low + spread).toFixed(5), ask_close: +(close + spread).toFixed(5), tick_qty, amount, }; data.push(item); prevClose = close; date = addDays(date, 1); } return { stock_code, data }; } // ... existing code ... export const dailyDataPackets = { // 如已存在同名键,可合并或覆盖 'GBPAUD.FXCM': generateDailyPacket('GBPAUD.FXCM', '20240101', 3000, 2.03893), 'EURUSD.FXCM': generateDailyPacket('EURUSD.FXCM', '20240101', 3000, 1.08350), // 可按需继续添加更多代码 };