DuckScript API Reference

Complete reference for all DuckScript functions, columns, and syntax

Built-in Functions

View in Guide →

Moving Averages

sma(series, period)

series<float>

Simple Moving Average

Parameters:

  • series: series<float> - Price series (e.g., close)
  • period: int - Period length

Returns:

series<float>

ma20 = sma(close, 20)

ema(series, period)

series<float>

Exponential Moving Average

Parameters:

  • series: series<float> - Price series
  • period: int - Period length

Returns:

series<float>

ema50 = ema(close, 50)

Technical Indicators

rsi(series, period)

series<float>

Relative Strength Index (simplified approximation)

Parameters:

  • series: series<float> - Price series (typically close)
  • period: int - Period length (typically 14)

Returns:

series<float>

rsi14 = rsi(close, 14)

Volatility

atr(period)

series<float>

Average True Range (simplified approximation)

Parameters:

  • period: int - Period length

Returns:

series<float>

volatility = atr(14)

Volume

vwap()

series<float>

Volume Weighted Average Price

Returns:

series<float>

vwap_value = vwap()

Math Functions

abs(value)

series<float>

Absolute value

Parameters:

  • value: series<float>

Returns:

series<float>

abs_change = abs(close - open)

na(value)

series<bool>

True if value is null/missing; use not na(x) for non-null check (Pine Script compatible)

Parameters:

  • value: series<float> | int | string - Expression to check for null

Returns:

series<bool>

valid = not na(close)

highest(series, period)

series<float>

Maximum value in a rolling window

Parameters:

  • series: series<float> - Price series (e.g., high)
  • period: int - Period length

Returns:

series<float>

highest_20 = highest(high, 20)

lowest(series, period)

series<float>

Minimum value in a rolling window

Parameters:

  • series: series<float> - Price series (e.g., low)
  • period: int - Period length

Returns:

series<float>

lowest_20 = lowest(low, 20)

Pattern Detection

crossover(series1, series2)

series<bool>

Detect when series1 crosses above series2

Parameters:

  • series1: series<float>
  • series2: series<float>

Returns:

series<bool>

golden_cross = crossover(ma_fast, ma_slow)

crossunder(series1, series2)

series<bool>

Detect when series1 crosses below series2

Parameters:

  • series1: series<float>
  • series2: series<float>

Returns:

series<bool>

death_cross = crossunder(ma_fast, ma_slow)

pivothigh(source, leftBars, rightBars)

series<float>

Swing high: returns source value when higher than leftBars bars left AND rightBars bars right; na otherwise (Pine Script compatible)

Parameters:

  • source: series<float> - Price series (e.g., high)
  • leftBars: int - Bars to the left (integer literal)
  • rightBars: int - Bars to the right (integer literal)

Returns:

series<float>

ph = pivothigh(high, 2, 2)

pivotlow(source, leftBars, rightBars)

series<float>

Swing low: returns source value when lower than leftBars bars left AND rightBars bars right; na otherwise

Parameters:

  • source: series<float> - Price series (e.g., low)
  • leftBars: int - Bars to the left (integer literal)
  • rightBars: int - Bars to the right (integer literal)

Returns:

series<float>

pl = pivotlow(low, 2, 2)

Pattern Functions

count_consecutive(condition)

series<float>

Count consecutive bars where condition is true

Parameters:

  • condition: series<bool>

Returns:

series<float>

count_consecutive(close > open)

bars_since(condition)

series<float>

Count bars since last time condition was true

Parameters:

  • condition: series<bool>

Returns:

series<float>

bars_since(close > high[1])

high_since(condition)

series<float>

Maximum high since last time condition was true

Parameters:

  • condition: series<bool>

Returns:

series<float>

high_since(close < open)

low_since(condition)

series<float>

Minimum low since last time condition was true

Parameters:

  • condition: series<bool>

Returns:

series<float>

low_since(close > open)

max_since(condition, series)

series<float>

Maximum value of series since last time condition was true

Parameters:

  • condition: series<bool>
  • series: series<float>

Returns:

series<float>

max_since(close < open, high)

min_since(condition, series)

series<float>

Minimum value of series since last time condition was true

Parameters:

  • condition: series<bool>
  • series: series<float>

Returns:

series<float>

min_since(close > open, low)

accumulate_while(condition, value)

series<float>

Accumulate value while condition is true, reset when false

Parameters:

  • condition: series<bool>
  • value: series<float>

Returns:

series<float>

accumulate_while(close > open, volume)

carry_while(condition, value)

series<float>

First value when condition became true, held during segment; na when false

Parameters:

  • condition: series<bool>
  • value: series<float>

Returns:

series<float>

dq3_open = carry_while(session == "DQ3", open)

carry_forward(condition, value)

series<float>

Last value when condition was true, propagated forward when false (LOCF)

Parameters:

  • condition: series<bool>
  • value: series<float>

Returns:

series<float>

last_dq3_close = carry_forward(session == "DQ3", close)

flag_once(condition)

series<bool>

Flag that becomes true once condition is true and stays true

Parameters:

  • condition: series<bool>

Returns:

series<bool>

flag_once(close > high[1])

latch(condition, reset?)

series<bool>

Flag that holds when condition is true. With two args: latch(condition, reset) — holds until reset is true, then can trigger again

Parameters:

  • condition: series<bool> - Condition that sets the flag
  • reset?: series<bool> - Optional: when true, clears the latch so it can trigger again

Returns:

series<bool>

lat = latch(signal, new_bar)

Date / Time Functions

weekday(date)

series<float>

Day of week (0=Sunday, 1=Monday, ..., 6=Saturday)

Parameters:

  • date: string - Date column or string (e.g., date)

Returns:

series<float>

weekday(date)

hour(timestamp)

int

Extract hour from timestamp (0-23)

Parameters:

  • timestamp: int - Timestamp (e.g., timestamp column)

Returns:

int

hour(timestamp)

minute(timestamp)

int

Extract minute from timestamp (0-59)

Parameters:

  • timestamp: int - Timestamp

Returns:

int

minute(timestamp)

month(date)

series<float>

Extract month from date or timestamp (1-12)

Parameters:

  • date: string - Date column or timestamp

Returns:

series<float>

month(date)

day_of_month(date)

series<float>

Extract day of month from date or timestamp (1-31)

Parameters:

  • date: string - Date column or timestamp

Returns:

series<float>

day_of_month(date)

year(date)

series<float>

Extract year from date or timestamp

Parameters:

  • date: string - Date column or timestamp

Returns:

series<float>

year(date)

bar_size(timestamp?)

int

Bar size (time delta between current and previous bar)

Parameters:

  • timestamp?: int - Optional override timestamp (defaults to timestamp column)

Returns:

int

bar = bar_size()

session_end_timestamp(session, timestamp?)

int

Epoch timestamp of the current row’s session end (based on config.sessions and config.timezone)

Parameters:

  • session: series<string> - Session name (often the session column)
  • timestamp?: int - Optional override timestamp (defaults to timestamp column)

Returns:

int

end_ts = session_end_timestamp(session)

session_start_timestamp(session, timestamp?)

int

Epoch timestamp of the current row’s session start (based on config.sessions and config.timezone)

Parameters:

  • session: series<string> - Session name (often the session column)
  • timestamp?: int - Optional override timestamp (defaults to timestamp column)

Returns:

int

start_ts = session_start_timestamp(session)

date_end_timestamp(date?)

int

Epoch timestamp for end of day (based on config.timezone)

Parameters:

  • date?: series<string> - Optional date override (defaults to date column)

Returns:

int

eod = date_end_timestamp()

date_start_timestamp(date?)

int

Epoch timestamp for start of day (based on config.timezone)

Parameters:

  • date?: series<string> - Optional date override (defaults to date column)

Returns:

int

sod = date_start_timestamp()

time_to_utc(timestamp)

int

Canonical UTC epoch in seconds (for timezone adjustments; timestamp should be in seconds)

Parameters:

  • timestamp: int - Epoch timestamp (seconds)

Returns:

int

utc = time_to_utc(timestamp)

date_from_epoch(epoch)

series<string>

Date string YYYY-MM-DD in UTC for the given epoch (seconds)

Parameters:

  • epoch: int - Unix epoch in seconds

Returns:

series<string>

trading_date = date_from_epoch(utc + 6 * 3600)

Built-in Columns

View in Guide →

OHLCV Prices

open

series<float>

Opening price of the bar

high

series<float>

Highest price of the bar

low

series<float>

Lowest price of the bar

close

series<float>

Closing price of the bar

volume

series<float>

Volume of the bar

Metadata

timestamp

series<int>

Timestamp of the bar

symbol

series<string>

Symbol identifier

Structural Columns

These columns are automatically generated based on your dataset metadata and can be used in aggregations.

session

series<string>

Session identifier (e.g., "premarket", "regular", "afterhours")

date

string

Date as string (e.g., "2025-01-15")

interval_id

string

Interval identifier

interval_start

series<int>

Interval start timestamp

interval_index

int

Global sequential index that continues summing across dates and sessions. Does NOT reset when date or session changes. Depends on interval_duration (e.g., with 90min intervals: 1010, 1011, 1012...).

interval_number

series<int>

Follows the sequence of interval_index but resets at the start of each session. Allows identifying position within each session (1, 2, 3, 4, 5... per session). Depends on interval_duration.

input
func
signal
output
stats
summary
by
count
percent
avg
max
min
stddev
median
first
last
first_when
prev
lead
if
then
else
as
int
float
bool
string
true
false

Arithmetic Operators

+
-
*
/

Comparison Operators

>
<
>=
<=
==
!=

Logical Operators

and
or
not