JS - 上一个蜡烛收盘时间范围(交易)

问题描述 投票:0回答:1

我正在寻找一种方法来计算交易时给定时间范围内蜡烛的前收盘价。已经弄清楚了基于分钟和小时的时间范围,如 H1、H4、H12,但在每日、每周和每月方面遇到困难,因为我的公式不适用于它们。一些帮助将不胜感激:)

示例

current time in ms: 1691482660000

input: 4h
expected: 1691481600000 (Tue Aug 08 2023 08:00:00 GMT+0000)
actual: 1691481600000 (correct)
period: every 4 hours

input: 12h
expected: 1691452800000 (Tue Aug 08 2023 00:00:00 GMT+0000)
actual: 1691452800000 (correct)
period: every 12 hours

input: 3d
expected: 1691452800000 (Tue Aug 08 2023 00:00:00 GMT+0000)
actual: 1691280000000 (wrong)
period: every 3 days

input: 2d
expected: 1691366400000 (Mon Aug 07 2023 00:00:00 GMT+0000)
actual: 1691366400000(correct)
period: every 2 days

input: 2w
expected: 1690761600000 (Mon Jul 31 2023 00:00:00 GMT+0000)
actual: -
period: every 2 weeks

input: 3w
expected: 1690761600000 (Mon Jul 31 2023 00:00:00 GMT+0000)
actual: -
period: every 3 weeks

来源

function getPreviousClose(timeframe) {
    const value = Number(timeframe.slice(0, -1));
    const unit = timeframe.slice(-1);
    const now = new Date();
    
    switch (unit) {
        case 'm': {
            const duration = value * 60 * 1000;
            return now - (now % duration);
        }
        case 'h': {
            const duration = value * 60 * 60 * 1000;
            return now - (now % duration);
        }
            
        // NOT WORKING AS IT SHOULD
        case 'd': {
            const duration = value * 24 * 60 * 60 * 1000;
            return now - (now % duration);
        }
        case 'w': {
            // ????
        }
            
        case 'M': {
            // ????
        }
            
        default:
            throw new Error('getPreviousClose called with unsupported unit "'+ unit + '"');
    }
}
javascript trading
1个回答
0
投票

你是这个意思吗?

从您的描述中不清楚您期望的输出

function getPreviousClose(timeframe) {
  const [_, value, unit] = timeframe.match(/(\d+)(\w+)/)
  const prevClose = new Date();
  prevClose.setSeconds(0, 0)
  console.log(value, unit)
  switch (unit) {
    case 'm':
      prevClose.setMinutes(prevClose.getMinutes() - value);
      break;
    case 'h':
      prevClose.setHours(prevClose.getHours() - value);
      break;
    case 'd':
      prevClose.setDate(prevClose.getDate() - value);
      break;
    case 'w':
      prevClose.setDate(prevClose.getDate() - (7 * value));
      break;
    case 'M':
      prevClose.setMonth(prevClose.getMonth() - value);
      break;
    default:
      throw new Error(`getPreviousClose called with unsupported unit ${unit}`);
  }

  console.log(prevClose.toLocaleString());
  return prevClose.getTime(); // return timestamp in ms

}
console.log(getPreviousClose("4h"))
console.log(getPreviousClose("12h"))
console.log(getPreviousClose("2d"))
console.log(getPreviousClose("3d"))
console.log(getPreviousClose("8M"))
console.log(getPreviousClose("8x")) // error

© www.soinside.com 2019 - 2024. All rights reserved.