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.

58 lines
2.1 KiB

  1. function generateDailyPacket(stock_code, startDate, days, basePrice) {
  2. const data = [];
  3. let prevClose = Number(basePrice);
  4. const toStrDate = (dateVal) => (typeof dateVal === 'number' ? String(dateVal) : dateVal);
  5. const addDays = (yyyymmdd, delta) => {
  6. const y = parseInt(yyyymmdd.slice(0, 4), 10);
  7. const m = parseInt(yyyymmdd.slice(4, 6), 10) - 1;
  8. const d = parseInt(yyyymmdd.slice(6, 8), 10);
  9. const dt = new Date(y, m, d);
  10. dt.setDate(dt.getDate() + delta);
  11. const yyyy = dt.getFullYear();
  12. const mm = String(dt.getMonth() + 1).padStart(2, '0');
  13. const dd = String(dt.getDate()).padStart(2, '0');
  14. return `${yyyy}${mm}${dd}`;
  15. };
  16. const randDrift = () => (Math.random() - 0.5) * 0.02; // 每日 ±1% 漂移
  17. const spread = 0.00050; // 买卖点差(可按需要调整)
  18. let date = toStrDate(startDate);
  19. for (let i = 0; i < days; i++) {
  20. const open = +(prevClose * (1 + randDrift())).toFixed(5);
  21. const close = +(open * (1 + randDrift())).toFixed(5);
  22. const highRaw = Math.max(open, close) * (1 + Math.random() * 0.01);
  23. const lowRaw = Math.min(open, close) * (1 - Math.random() * 0.01);
  24. const high = +highRaw.toFixed(5);
  25. const low = +lowRaw.toFixed(5);
  26. const tick_qty = Math.floor(1000 + Math.random() * 5000); // 成交量
  27. const amount = +(close * tick_qty).toFixed(2); // 成交额
  28. const item = {
  29. ts_code: stock_code,
  30. trade_date: date,
  31. bid_open: open,
  32. bid_high: high,
  33. bid_low: low,
  34. bid_close: close,
  35. ask_open: +(open + spread).toFixed(5),
  36. ask_high: +(high + spread).toFixed(5),
  37. ask_low: +(low + spread).toFixed(5),
  38. ask_close: +(close + spread).toFixed(5),
  39. tick_qty,
  40. amount,
  41. };
  42. data.push(item);
  43. prevClose = close;
  44. date = addDays(date, 1);
  45. }
  46. return { stock_code, data };
  47. }
  48. // ... existing code ...
  49. export const dailyDataPackets = {
  50. // 如已存在同名键,可合并或覆盖
  51. 'GBPAUD.FXCM': generateDailyPacket('GBPAUD.FXCM', '20240101', 3000, 2.03893),
  52. 'EURUSD.FXCM': generateDailyPacket('EURUSD.FXCM', '20240101', 3000, 1.08350),
  53. // 可按需继续添加更多代码
  54. };