You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

59 lines
2.1 KiB

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),
// 可按需继续添加更多代码
};