- High Performance: Batch processing optimized for thousands of candles at once.
- Strict Anchor Alignment: Ensures candles align with specific sessions (e.g., 4h at 23:00 or 23:30 UTC).
- Flexible Timeframes: Supports
m,h,d,w,M(fixed) and1W(calendar week),1Mc(calendar month). - Input validation: Optional
validate: trueto check time, OHLC, duplicates, and order before transform.
Deno (JSR):
deno add jsr:@neabyte/candle-transformnpm:
npm install @neabyte/candle-transformimport { Transform } from '@neabyte/candle-transform'
// 1m data input
const data = [
{ time: 1704067200000, open: 1.0, high: 2.0, low: 0.9, close: 1.5 },
{ time: 1704067260000, open: 1.5, high: 2.5, low: 1.4, close: 2.0 },
{ time: 1704067320000, open: 2.0, high: 3.0, low: 1.8, close: 2.5 }
// ... more candles
]
// Convert to 4-hour chart (Default Anchor 23:00 UTC)
const h4 = Transform.fromCandles(data).toTimeframe('4h')
console.log(h4) // Output: [ { time: 1704063600000, open: 1, high: 2, low: 0.5, close: 1.5, ... }, ... ]
// Convert to 1-day chart with custom anchor (e.g., 00:00 UTC)
const daily = Transform.fromCandles(data).setAnchorTime(0).toTimeframe('1d')
// Anchor with hour and minute (e.g., 23:30 UTC)
const session = Transform.fromCandles(data).setAnchorTime(23, 30).toTimeframe('4h')
// Calendar week (Monday start) and calendar month
const weekly = Transform.fromCandles(data).toTimeframe('1W')
const monthly = Transform.fromCandles(data).toTimeframe('1Mc')
// Optional validation before transform
const safe = Transform.fromCandles(data).toTimeframe('4h', { validate: true })Transform.fromCandles(data)data<CandleData[]>: Array of source OHLC candles- Returns:
Transform - Description: Creates a transformation instance for fluent chaining.
transform.setAnchorTime(hour, minute)hour<number>: Anchor hour in UTC (0–23). Defaults to23.minute<number>: (Optional) Anchor minute (0–59). Defaults to0.- Returns:
this - Description: Sets the anchor time for bucket alignment (e.g. 23:30 UTC).
transform.toTimeframe(timeframe, options)timeframe<string>: Target (e.g.'4h','1d','1W','1Mc').options<object>: (Optional){ validate?: boolean }— run input validation before transform.- Returns:
CandleData[] - Description: Runs the transformation and returns aggregated candles.
transform.setWeekStartDay(weekStartDay)weekStartDay<number>: Week start (0=Sun, 1=Mon, …, 6=Sat). Default1(Monday). Used for'1W'.- Returns:
this - Description: Sets week start day for calendar week timeframe.
Transform.execute(candles, timeframe, anchorHour, anchorMinute, options)candles<CandleData[]>: Source candle arraytimeframe<string>: Target (e.g.'4h','1d','1W','1Mc')anchorHour<number>: (Optional) Anchor hour (0–23). Defaults to23.anchorMinute<number>: (Optional) Anchor minute (0–59). Defaults to0.options<object>: (Optional){ weekStartDay?: 0|1|…|6, validate?: boolean }- Returns:
CandleData[] - Description: Runs batch transformation without a fluent instance.
Static readonly: msPerMinute, msPerHour, msPerDay, msPerWeek, msPerMonth (milliseconds per unit), defaultAnchorOffset (23h in ms).
Time.alignTime(timestamp, intervalMs, anchorHour, anchorMinute)timestamp<number>: Input time in millisecondsintervalMs<number>: Bucket interval in millisecondsanchorHour<number>: (Optional) Anchor hour (0–23). Defaults to23.anchorMinute<number>: (Optional) Anchor minute (0–59). Defaults to0.- Returns:
number - Description: Aligns timestamp to the bucket open time on the anchor grid.
Time.getBucketStart(timestamp, timeframe, anchorHour, anchorMinute, weekStartDay)timestamp<number>: Input time in mstimeframe<string>: e.g.'4h','1d','1W','1Mc'anchorHour/anchorMinute: Used for fixed intervals onlyweekStartDay<number>: (Optional) 0–6 for'1W'. Default1(Monday)- Returns:
number - Description: Bucket start for any timeframe (fixed or calendar).
Time.parseTimeframe(timeframeStr)timeframeStr<string>: Fixed timeframe only (e.g.'15m','4h','1d','1w','1M'). UseTime.getBucketStartfor'1W'/'1Mc'.- Returns:
number - Description: Parses timeframe string to duration in milliseconds.
Validator.validateCandles(candles, options)candles<CandleData[]>: Array to validateoptions<object>: (Optional){ allowDuplicates?, allowUnordered?, strictOHLC? }- Returns:
{ valid: boolean, errors: string[] } - Description: Validates time (finite, non-negative), OHLC, duplicates, and order.
1w= 7 days (fixed);1M= 30-day period (fixed).1W= calendar week (default Monday);1Mc= calendar month (first of month UTC). Validation is opt-in viatoTimeframe(..., { validate: true })orTransform.execute(..., { validate: true }).
This project is licensed under the MIT license. See the LICENSE file for more info.