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 seriesperiod: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 flagreset?: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)
intExtract hour from timestamp (0-23)
Parameters:
timestamp:int- Timestamp (e.g., timestamp column)
Returns:
int
hour(timestamp)
minute(timestamp)
intExtract 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?)
intBar 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?)
intEpoch 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?)
intEpoch 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?)
intEpoch 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?)
intEpoch 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)
intCanonical 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
stringDate as string (e.g., "2025-01-15")
interval_id
stringInterval identifier
interval_start
series<int>Interval start timestamp
interval_index
intGlobal 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.
Keywords
View in Guide →inputfuncsignaloutputstatssummarybycountpercentavgmaxminstddevmedianfirstlastfirst_whenprevleadifthenelseasintfloatboolstringtruefalseOperators
View in Guide →Arithmetic Operators
+-*/Comparison Operators
><>=<===!=Logical Operators
andornot