交易场景下多时间框架K线前收盘价计算方案求助
问题修正方案:交易K线指定时间框架前收盘价计算
核心问题梳理
- 已实现:分钟、小时级时间框架(如H1、H4、H12)的前收盘价计算
- 待修复/实现:
- 3d(3日)时间框架计算结果不符合预期
- 未实现周(w)、月(M)级时间框架的计算逻辑
核心逻辑修正思路
1. 日级及多日框架(如3d)
日级框架核心是以交易日起始时间为基准(需区分自然日与交易日,多数品种周末休市)。计算前一根K线收盘价,需先定位当前时间所属K线周期,再往前推对应周期数。
针对3d框架的修正代码逻辑:
function getPreviousCloseForDayFrame(currentTime, frame, priceData) { const dayMs = 24 * 60 * 60 * 1000; let intervalDays = frame === 'd' ? 1 : parseInt(frame) || 3; // 定位当前时间对应的交易日起始点(00:00),并调整至有效交易日(跳过周末) let currentStart = new Date(currentTime); currentStart.setHours(0, 0, 0, 0); while (currentStart.getDay() === 0 || currentStart.getDay() === 6) { currentStart.setTime(currentStart.getTime() - dayMs); } // 往前推对应交易日数,找到前一根K线的结束时间 let prevEnd = new Date(currentStart); let daysCount = 0; while (daysCount < intervalDays) { prevEnd.setTime(prevEnd.getTime() - dayMs); if (prevEnd.getDay() !== 0 && prevEnd.getDay() !== 6) { daysCount++; } } prevEnd.setHours(23, 59, 59, 999); // 从数据中匹配最近的收盘价 return priceData.find(p => p.timestamp <= prevEnd.getTime())?.close; }
2. 周级框架(w)
周级K线通常以周一00:00为起始、周五23:59:59为结束(部分品种需调整规则)。计算逻辑:
- 定位当前时间所属周的周一起始点
- 往前推7天找到上周一,再定位上周五的结束时间,取该时间点的收盘价
示例代码片段:
function getPreviousCloseForWeekFrame(currentTime, priceData) { const dayMs = 24 * 60 * 60 * 1000; const currentDate = new Date(currentTime); // 找到当前周周一 const currentMonday = new Date(currentDate); currentMonday.setDate(currentDate.getDate() - currentDate.getDay() + 1); currentMonday.setHours(0, 0, 0, 0); // 上周五结束时间 const prevFridayEnd = new Date(currentMonday.getTime() - 2 * dayMs); prevFridayEnd.setHours(23, 59, 59, 999); return priceData.find(p => p.timestamp <= prevFridayEnd.getTime())?.close; }
3. 月级框架(M)
月级K线以自然月首日00:00为起始、月末最后一天23:59:59为结束。计算逻辑:
- 定位当前时间所属月份的首日起始点
- 往前推一个月找到上月首日,再定位上月最后一天的结束时间,取该时间点的收盘价
示例代码片段:
function getPreviousCloseForMonthFrame(currentTime, priceData) { const currentDate = new Date(currentTime); // 当前月首日 const currentMonthStart = new Date(currentDate.getFullYear(), currentDate.getMonth(), 1, 0, 0, 0); // 上月最后一天结束时间 const prevMonthEnd = new Date(currentDate.getFullYear(), currentDate.getMonth(), 0, 23, 59, 59, 999); return priceData.find(p => p.timestamp <= prevMonthEnd.getTime())?.close; }
测试用例验证建议
- 3d框架:周一测试时,前一根3dK线应为上周三至周五的收盘价;周四测试时,前一根3dK线应为周一至周三的收盘价
- 周框架:周二测试时,前一根周K线应为上周一至周五的收盘价
- 月框架:5月10日测试时,前一根月K线应为4月全月的收盘价
注意事项
- 不同交易品种休市规则不同(如外汇周末休市、加密货币7*24),需根据品种调整交易日判断逻辑
- 统一使用UTC时间处理时间戳,避免时区差异导致的计算错误
内容的提问来源于stack exchange,提问作者MrCoinSiX
相关产品推荐
相关产品推荐

