Pine Script to Indie Language Conversion Cheat Sheet
Table of Contents
Pine Script to Indie Language Conversion Cheat Sheet
This guide helps PineScript users migrate to TakeProfit’s Indie™ language. It covers language structures, built-in indicators, plotting, and context handling. Examples are taken from official sources and the Indie code examples GitHub repo.
1. Script Declaration & Context
This section outlines how to declare scripts and set their context in both Pine Script™ and Indie, highlighting key structural differences and usage patterns.
Feature | Pine Script™ | Indie | Notes |
---|---|---|---|
Version Declaration | //@version=5 |
# indie:lang_version = 5 |
Pine uses a version directive comment. Indie uses a language directive header that must appear at the top of the file. |
Indicator Declaration | indicator("My Indicator", overlay=true) |
@indicator("My Indicator", overlay_main_pane=True) class Main(MainContext): |
Indie uses Python-style class structure and decorators. The overlay flag becomes overlay_main_pane=True . |
Strategy Declaration | strategy("My Strategy", overlay=true) |
❌ Not supported | Indie is indicator-only. There is no built-in concept of trading strategies (e.g. strategy.entry , strategy.exit ). |
Accessing OHLC Data | open , high , low , close , volume |
self.open , self.high , self.low , self.close , self.volume |
All price/volume series in Indie are accessed via self. inside the class body. |
Historical Referencing | close[1] |
self.close[1] |
Indexing for historical bars is the same, but Indie requires the self. prefix. |
Time and Bar Index | time , bar_index |
self.time , self.bar_index |
self.time is a datetime.datetime object in Indie, while time in Pine is a UNIX timestamp in milliseconds. bar_index is the current bar number. |
✅ Detailed Notes
1. Version Declaration
- Pine:
//@version=5
- Indie:
# indie:lang_version = 5
Must be the first line in the file — sets the language version used by the Indie compiler.
2. Indicator Declaration
- Pine:
indicator("My Indicator", overlay=true)
- Indie:
@indicator("My Indicator", overlay_main_pane=True) class Main(MainContext): ...
The class
Main
must inherit fromMainContext
. All calculation and plot methods go inside this class.
3. Strategy Declaration
- Pine: Supports strategy-based backtesting and trading automation.
strategy("My Strategy", overlay=true) strategy.entry("Long", strategy.long)
- Indie: ❌ Not supported. Indie currently focuses only on indicators and chart visualization, not backtesting or order execution.
4. Accessing OHLCV Data
- Pine: Variables like
close
,volume
are globally accessible. - Indie: Must be accessed with
self.
inside theMain
class.self.close[0] # current close self.volume[1] # previous volume
5. Historical Referencing
- Same bracketed indexing syntax (
[1]
,[2]
, etc.) - In Indie, indexing applies to series accessed through
self.<series>
:self.close[3]
6. Time and Bar Index
- Pine:
time // milliseconds since epoch bar_index // current bar number
- Indie:
self.time.year # datetime object, not a number self.bar_index # current bar index
Indie uses Python’s
datetime.datetime
format for time. So you can access components like:self.time.year, self.time.month, self.time.day
Great! Here’s the fully corrected and verified Section 2: Data Types & Variables, based strictly on official Indie and Pine Script documentation.
2. Data Types & Variables
Concept | Pine Script™ | Indie | Notes |
---|---|---|---|
Variable Declaration | var float x = na |
x = MutSeriesF.new(math.nan) |
Pine uses var for persistent variables. Indie uses mutable series types like MutSeriesF , MutSeriesI . |
Mutable Series (float) | var float x = 0.0 |
x = MutSeriesF.new(0.0) |
Indie explicitly uses mutable containers for persistent values that update bar by bar. |
Mutable Series (int) | var int counter = 0 |
counter = MutSeriesI.new(0) |
Indie uses MutSeriesI for mutable integer series. |
Constant Series (float) | x = close |
x = self.close |
Pine automatically treats all variables as series. Indie uses SeriesF (implicit from self.close ). |
Primitive Types | int , float , bool , string , color |
int , float , bool , str , color |
Indie is Python-based in typing, with str instead of string . |
Series Types | Implicit (all variables are series) | SeriesF , SeriesI , MutSeriesF , MutSeriesI , etc. |
In Indie, series vs scalar must be handled explicitly. |
Default Value | na |
math.nan |
Indie uses Python’s math.nan instead of Pine’s na . |
Undefined Access | Allowed (returns na ) |
❌ Error (must initialize first) | Indie will raise a runtime error if you use an uninitialized variable. |
Replace NaN / fallback | nz(x, 0) |
x if not math.isnan(x) else 0 |
No nz() in Indie — must check and assign manually. |
Boolean Assignment | var bool b = false |
b = MutSeriesB.new(False) |
Indie supports MutSeriesB for bar-by-bar boolean state. |
String Handling | var string s = "" |
s = "Hello" |
Indie allows standard Python string usage, but not bar-indexed series of strings. |
NaN Detection | na(x) |
math.isnan(x) |
Indie uses math.isnan() from Python standard library. |
1. All Variables Are Series (Pine) vs. Explicit Series (Indie)
- Pine Script™:
x = close // Series of floats (implicit) var float x = na // Persistent series
- Indie:
x = self.close # SeriesF (read-only) y = MutSeriesF.new(math.nan) # Mutable persistent series
2. Mutable Series in Indie
To store and update values across bars (like with var
in Pine), Indie uses mutable series classes:
counter = MutSeriesI.new(0)
price_level = MutSeriesF.new(math.nan)
- To read the current value:
counter[0]
- To update the value:
counter[0] += 1
3. Type Safety and Initialization
- Pine Script: allows uninitialized variables (
na
used automatically). - Indie: All variables must be explicitly initialized before use. If not, it raises a runtime error.
4. Series Type Summary (Indie)
Type | Description |
---|---|
SeriesF |
Immutable float series (e.g., self.close ) |
MutSeriesF |
Mutable float series (can update per bar) |
SeriesI |
Immutable int series |
MutSeriesI |
Mutable int series |
MutSeriesB |
Mutable bool series |
Series[float] |
Shorthand for typed series |
5. NaN Handling Example
- Pine Script:
x = nz(mySeries, 0)
- Indie:
x = mySeries[0] if not math.isnan(mySeries[0]) else 0
Here is the fully verified and corrected Section 3: Inputs (Parameters) — based only on official Indie and Pine Script™ documentation.
3. Inputs (Parameters)
Feature | Pine Script™ | Indie | Notes |
---|---|---|---|
Integer Input | input.int(14, title="Length") |
@param.int("length", default=14) |
Indie uses decorators to define parameters; Pine uses input.*() functions. |
Float Input | input.float(1.5, title="Factor") |
@param.float("factor", default=1.5) |
Both accept default float values. |
Boolean Input | input.bool(true, title="Enable Filter") |
@param.bool("enable_filter", default=True) |
Pine default is lowercase true , Indie uses Python True . |
String Input | input.string("SMA", options=["SMA", "EMA"]) |
@param.string("ma_type", options=["SMA", "EMA"], default="SMA") |
Indie requires options + default explicitly. |
Color Input | input.color(color.red) |
@param.color("my_color", default=color.RED) |
Indie uses predefined color constants like color.RED . |
Source Input | input.source(close) |
@param.source("src", default="close") |
Indie inputs are string-referenced sources (like "close" ). |
Default Value | input.int(14) → default = 14 |
@param.int("length", default=14) |
Default values are required in Indie. |
Dropdown Options | input.string(options=["X", "Y"]) |
@param.string("mode", options=["X", "Y"], default="X") |
Both allow option lists. Indie uses the same syntax as Python’s list . |
Tooltip | input.int(14, tooltip="Number of periods") |
❌ Not supported | Indie has no tooltip or UI metadata for inputs. |
Grouping Inputs | group="Settings" |
❌ Not supported | Indie doesn’t support grouping/organizing inputs visually. |
Inline Inputs | inline="MyGroup" |
❌ Not supported | Pine supports grouping inputs inline; Indie doesn’t. |
Input Visibility | input.int(14, inline="x", tooltip="...") → GUI config only |
❌ Not applicable | Indie has no GUI editor — all parameters are fixed in the script. |
✅ Indie Syntax Pattern
In Indie, parameters are defined using decorators before the main function, and then passed as arguments to def Main(...)
.
📌 Example:
@param.int("length", default=14)
@param.bool("use_smoothing", default=True)
@param.string("ma_type", options=["SMA", "EMA"], default="SMA")
def Main(self, length, use_smoothing, ma_type):
...
@param.int(...)
defines the parameter type and UI label.- Parameter names in decorators and function args must match.
- Inputs are passed automatically when the indicator runs.
✅ Source Input Notes
- Pine:
src = input.source(close, "Source")
- Indie:
@param.source("src", default="close") def Main(self, src): series = getattr(self, src)
Use getattr(self, src)
to convert the selected source string (e.g., "close"
) into the actual series.
✅ Color Input Notes
- Pine:
myColor = input.color(color.red)
- Indie:
@param.color("my_color", default=color.RED)
Indie uses named colors (color.RED
, color.BLUE
, etc.), not hex codes in inputs.
Here is the fully corrected and verified Section 4: Series & State Handling, based on real behavior in Pine Script™ and Indie language.
4. Series & State Handling
This section compares how Pine Script™ and Indie handle series data, persistent values, and state updates across bars.
Concept | Pine Script™ | Indie | Notes |
---|---|---|---|
Series are default | All variables are implicitly series | Only self.<name> are series |
Indie requires explicit use of self. to access OHLC and user-defined series. |
Persistent variables | var float x = 0 |
x = MutSeriesF.new(0.0) |
Indie uses mutable series (MutSeriesF , MutSeriesI , etc.) to persist values bar-by-bar. |
Accessing OHLC series | close , high , etc. |
self.close , self.high , etc. |
All standard price and volume series are accessed via self. inside the class. |
Historical access | x[1] |
x[1] |
Same syntax in both, but Indie requires the variable to be a series (self.x , or MutSeriesF , etc.). |
State update syntax | x := x + 1 |
x[0] = x[0] + 1 |
In Indie, assignment to mutable series requires using index [0] . |
Bar state detection | bar_index == 0 , barstate.isfirst |
self.bar_index == 0 |
Indie doesn’t have barstate , so first-bar checks must be done manually. |
Init-once logic | if barstate.isfirst |
Use __init__() constructor |
Indie encourages moving one-time initialization into the __init__() method of the class. |
Access current value | x or x[0] |
x[0] |
In Indie, use [0] to get the current bar’s value from any series. |
Declare in function scope | Global only | Can declare inside any method or class scope | Indie follows standard Python scoping rules. |
✅ Examples
1. Persistent Counter
Pine Script™:
var int counter = 0
counter := counter + 1
Indie:
counter = MutSeriesI.new(0)
def Main(self):
counter[0] += 1
2. Detect First Bar
Pine Script™:
if barstate.isfirst
label.new(bar_index, high, text="Start")
Indie:
@plot("First Marker", style=marker_style.LABEL, marker_position=marker_position.ABOVE)
def start_marker(self):
return plot.Marker(text="Start") if self.bar_index == 0 else plot.Marker(math.nan)
3. Initializing State Once in Indie
In Pine, we write:
var float lastHigh = na
if bar_index == 0
lastHigh := high
In Indie, use the __init__()
constructor:
def __init__(self):
self.last_high = MutSeriesF.new(math.nan)
def Main(self):
if self.bar_index == 0:
self.last_high[0] = self.high[0]
4. Accessing Historical Values
Pine:
x = close[5]
Indie:
x = self.close[5]
Or for a custom series:
ema = Ema.new(self.close, 20)
prev = ema[1]
✅ Indie separates mutable and immutable series, requiring explicit management of memory and state. This gives you more control, but also demands more care than Pine Script’s automatic handling.
Here is the fully corrected and verified Section 5: Built-in Functions & Indicators, based on real usage from both the official Indie documentation and Pine Script™ docs.
5. Built-in Functions & Indicators
This section compares technical indicators and utility functions available in both Pine Script™ and Indie. It shows syntax differences, naming conventions, and key implementation notes.
Function / Indicator | Pine Script™ | Indie | Notes |
---|---|---|---|
Simple MA (SMA) | ta.sma(close, 20) |
Sma.new(self.close, 20) |
Indie uses object-style instantiation for indicators. |
Exponential MA (EMA) | ta.ema(close, 20) |
Ema.new(self.close, 20) |
Same logic, different syntax. |
Weighted MA (WMA) | ta.wma(close, 20) |
Wma.new(self.close, 20) |
Direct equivalent in Indie. |
Volume-weighted MA (VWMA) | ta.vwma(close, 20) |
Vwma.new(self.close, self.volume, 20) |
Requires both price and volume input in Indie. |
Relative Strength Index | ta.rsi(close, 14) |
Rsi.new(self.close, 14) |
Identical behavior. |
MACD | ta.macd(close, 12, 26, 9) |
Macd.new(self.close, 12, 26, 9) |
Returns an object. Access lines via indexing. |
Bollinger Bands | ta.bb(close, 20, 2) |
Bb.new(self.close, 20, 2) |
Returns upper, lower, basis — usually accessed via [0] , [1] , [2] . |
Standard Deviation | ta.stdev(close, 20) |
Stdev.new(self.close, 20) |
Matches ta.stdev . |
Variance | ta.variance(close, 20) |
Variance.new(self.close, 20) |
Also a direct equivalent. |
True Range (TR) | ta.tr() |
Tr.new() |
Available globally in Indie. |
Average True Range (ATR) | ta.atr(14) |
Atr.new(14) |
Works similarly in both. |
Crossover Detection | ta.crossover(x, y) |
x[1] < y[1] and x[0] > y[0] |
Indie has no crossover() function — must implement manually. |
Crossunder Detection | ta.crossunder(x, y) |
x[1] > y[1] and x[0] < y[0] |
Manual logic required in Indie. |
Highest / Lowest | ta.highest(high, 10) ta.lowest(low, 10) |
Highest.new(self.high, 10) Lowest.new(self.low, 10) |
Built-in equivalents, object-style usage. |
✅ Indicator Class Pattern in Indie
All built-in indicators in Indie are object-style, created via .new(...)
, and return series-like objects.
Example: Simple Moving Average
Pine Script™:
sma = ta.sma(close, 20)
Indie:
sma = Sma.new(self.close, 20)
To access the current value:
sma_value = sma[0]
✅ Example: MACD
Pine Script™:
[macdLine, signalLine, hist] = ta.macd(close, 12, 26, 9)
Indie:
macd = Macd.new(self.close, 12, 26, 9)
macd_line = macd[0]
signal_line = macd[1]
hist = macd[2]
✅ Example: Bollinger Bands
Pine Script™:
[basis, upper, lower] = ta.bb(close, 20, 2)
Indie:
bb = Bb.new(self.close, 20, 2)
basis = bb[0]
upper = bb[1]
lower = bb[2]
✅ Example: Crossover Detection
Pine Script™:
bullish = ta.crossover(close, sma)
Indie:
bullish = self.close[1] < sma[1] and self.close[0] > sma[0]
You can also make a helper function:
def crossover(x, y):
return x[1] < y[1] and x[0] > y[0]
Here is the fully corrected and verified Section 6: Plotting & Visualization, based on the official Indie documentation and confirmed Indie indicator examples from GitHub.
6. Plotting & Visualization
| Feature | Pine Script™ | Indie | Notes |
|—————————|————————————————————-|———————————————————————————————————|—————————————————————————————————————————————————|
| Line Plot | plot(series)
| @plot("Label")
def label(self): return series
| Indie requires decorators and return-based plot functions. |
| Multiple Plots | plot(x)
and plot(y)
| Separate @plot(...)
functions | Each visual output must have its own decorated function. |
| Line Width | plot(x, linewidth=2)
| @plot(..., width=2)
| Width is defined in the decorator. |
| Color Setting | plot(x, color=color.red)
| @plot(..., color="red")
orcolor="green" if cond else "red"
| Static or dynamic color strings, or color.rgba(...)
. |
| Conditional Color | plot(x, color=x > 0 ? color.green : color.red)
| @plot(..., color=when(x > 0, "green", "red"))
| Indie uses when(condition, if_true, if_false)
for inline conditions. |
| Area Fill | fill(plot1, plot2, color=color.blue)
| @fill("Name", plot1, plot2, color="blue")
| Indie uses @fill(...)
decorator with names of @plot
functions. |
| Bar Color | barcolor(color.red)
| @bar_color("red")
| Indie uses a decorator to color candles. |
| Background Color | bgcolor(color.gray)
| @background_color("gray")
| Same logic, different structure. |
| Plotshape (markers) | plotshape(cond, style=shape.triangleup)
| @plot(..., style=marker_style.LABEL)
return plot.Marker(...) if cond else plot.Marker(nan)
| Indie requires explicit marker return from function. |
| Label Positioning | location.abovebar
| marker_position.ABOVE
| Position must be defined in decorator or as an argument in plot.Marker(...)
. |
| Transparency / Opacity| plot(..., transp=90)
| color.rgba(..., alpha)
| Indie uses RGBA float alpha (0.0–1.0) instead of integer transp
. |
✅ Basic Line Plot
Pine Script™:
plot(close)
Indie:
@plot("Close")
def plot_close(self):
return self.close[0]
✅ Dynamic Color Example
Pine Script™:
plot(close, color=close > open ? color.green : color.red)
Indie:
@plot("Close", color=when(self.close > self.open, "green", "red"))
def plot_close(self):
return self.close[0]
✅ Bar and Background Coloring
Pine Script™:
barcolor(color.red)
bgcolor(color.new(color.green, 90))
Indie:
@bar_color("red")
@background_color(color.rgba(0, 255, 0, 0.1))
✅ Area Fill Between Lines
Pine Script™:
plot1 = plot(close + 2)
plot2 = plot(close - 2)
fill(plot1, plot2, color=color.blue)
Indie:
@plot("Upper")
def upper(self): return self.close[0] + 2
@plot("Lower")
def lower(self): return self.close[0] - 2
@fill("Range Fill", "Upper", "Lower", color="blue")
✅ Marker / Shape Plot (Equivalent of plotshape()
)
Pine Script™:
plotshape(crossover, style=shape.triangleup, color=color.green)
Indie:
@plot("Buy Marker", style=marker_style.LABEL, marker_position=marker_position.ABOVE, color="green")
def buy_marker(self):
return plot.Marker(text="▲") if crossover(self.close, ema) else plot.Marker(math.nan)
✅ Notes on Indie Plotting System
- Every visual element in Indie must be returned from a
@plot
function. - Plot functions are not called automatically — they are rendered by the engine when decorated.
- If you return
math.nan
, nothing will be drawn. - Marker text, color, and position are set using the
plot.Marker(...)
object. - You can simulate
plotchar()
usingplot.Marker(text=...)
.
Here is the corrected and validated Section 7: Control Flow & Logic, with strict syntax comparison and actual support levels from both Pine Script™ and Indie.
7. Control Flow & Logic
This section compares flow-control structures such as if
, loops, and conditional expressions between Pine Script™ and Indie.
| Feature | Pine Script™ | Indie | Notes |
| ——- | ———— | —– | —– |
| If statement | if condition
statement
| if condition:
statement
| Same logic, but Indie requires :
and indentation (Python style). |
| Else/Else If | else if cond
else
| elif cond:
else:
| Indie uses elif
(like Python), not else if
. |
| Ternary (inline if) | x = cond ? a : b
| x = a if cond else b
| Indie uses Python-style inline if-else. |
| For loop | for i = 0 to 9
...
| for i in range(10):
...
| Indie uses standard Python range()
; Pine uses to
. |
| While loop | ❌ Not supported | ❌ Not supported | Indie does not currently support while
; matches Pine limitations. |
| Break | ✅ Supported (in for
) | ✅ Supported (in for
) | Both support break
in loops. |
| Continue | ❌ Not supported | ❌ Not supported | Indie also lacks continue
. |
| Switch / Match | switch x
=> ...
| ❌ Not supported | Indie does not have any match/switch syntax. Use if
/elif
. |
| Boolean operators | and
, or
, not
| and
, or
, not
| Identical logical operators. |
| Comparison operators | <
, <=
, >
, >=
, ==
, !=
| Same | Fully shared syntax. |
| Function scope | Top-level only | Top-level only | Indie does not support defining functions inside other functions or conditionals. |
| Inline logic (guards) | plot(cond ? val : na)
| return val if cond else math.nan
| Indie doesn’t use na
, so you must return math.nan
. |
Examples
1. If / Else
Pine Script™:
if close > open
bgcolor(color.green)
else
bgcolor(color.red)
Indie:
if self.close[0] > self.open[0]:
self.bgcolor("green")
else:
self.bgcolor("red")
2. If / Else If / Else
Pine Script™:
if x > 0
label.new(..., text="Up")
else if x < 0
label.new(..., text="Down")
else
label.new(..., text="Flat")
Indie:
if x[0] > 0:
return plot.Marker(text="Up")
elif x[0] < 0:
return plot.Marker(text="Down")
else:
return plot.Marker(text="Flat")
3. Ternary Operator
Pine Script™:
color = close > open ? color.green : color.red
Indie:
color = "green" if self.close[0] > self.open[0] else "red"
4. For Loop
Pine Script™:
sum = 0.0
for i = 0 to 9
sum := sum + close[i]
Indie:
total = 0.0
for i in range(10):
total += self.close[i]
5. Break
Pine Script™:
for i = 0 to 10
if close[i] > 100
break
Indie:
for i in range(11):
if self.close[i] > 100:
break
6. Conditional Return with Fallback
Pine Script™:
plot(x > 0 ? x : na)
Indie:
return x[0] if x[0] > 0 else math.nan
Pine Script and Indie share many control structures, but Indie strictly follows Python syntax and omits features like while
, continue
, and switch
. Logic must be explicit and scoped clearly.
Here is the corrected and verified Section 8: Functions & Methods, focusing on function definitions, argument handling, and method usage differences between Pine Script™ and Indie.
8. Functions & Methods
Feature | Pine Script™ | Indie | Notes |
---|---|---|---|
Function Definition | myFunc(x) => x + 1 |
def my_func(x): return x + 1 |
Pine uses arrow (=> ) functions; Indie uses Python-style def . |
Multiline Function | ❌ Not allowed | ✅ Fully supported | Indie supports full Python block functions. |
Named Parameters | myFunc(x = 5) |
def my_func(x=5): |
Both support default argument values. |
Return Statement | => result (implicit) |
return result |
Indie uses explicit return . |
Multiple Returns | [a, b] = myFunc(x) |
a, b = my_func(x) |
Both languages support tuple-style unpacking. |
Function Scope | Top-level only | Top-level only | Indie functions must be declared outside of classes — nested defs not allowed. |
Calling Built-ins | ta.ema(close, 14) |
Ema.new(self.close, 14) |
Indie indicators are classes with .new(...) . |
Calling Object Method | ❌ Not applicable | rsi[0] , macd[2] , etc. |
Indie indicator outputs are accessed as series-like objects. |
Anonymous Functions | ❌ Not supported | ❌ Not supported | No support for lambda in either language. |
Class-based Usage | ❌ Not used | ✅ Required for main logic (class Main(MainContext): ) |
Indie requires OOP structure for indicators. |
Examples
1. Simple Function
Pine Script™:
square(x) => x * x
plot(square(close))
Indie:
def square(x):
return x * x
@plot("Square")
def square_plot(self):
return square(self.close[0])
2. Function With Default Value
Pine Script™:
mult(x, factor = 2) => x * factor
Indie:
def mult(x, factor=2):
return x * factor
3. Multiple Return Values
Pine Script™:
f(x, y) => x + y, x - y
[a, b] = f(10, 5)
Indie:
def f(x, y):
return x + y, x - y
a, b = f(10, 5)
4. Calling Built-in Indicator
Pine Script™:
ema = ta.ema(close, 20)
Indie:
ema = Ema.new(self.close, 20)
To access the current EMA:
value = ema[0]
5. Using Result of Method with Plot
rsi = Rsi.new(self.close, 14)
@plot("RSI")
def plot_rsi(self):
return rsi[0]
Indie function declarations follow standard Python rules. Functions can be defined for helper logic, indicator processing, or value composition.
Built-in indicators like Sma
, Macd
, Atr
return series-like objects that must be accessed by indexing ([0]
, [1]
, etc.).
Here is the corrected and confirmed Section 9: Multi-Timeframe & Security Access, comparing how Pine Script™ and Indie handle multi-timeframe logic and symbol switching.
9. Multi-Timeframe & Security Access
This section covers how to request data from other timeframes or symbols in Pine Script™ using request.security()
, and how to do the same in Indie using @sec_context
and calc_on()
.
Feature | Pine Script™ | Indie | Notes |
---|---|---|---|
Timeframe Access | request.security(syminfo.tickerid, "D", close) |
@sec_context function + self.calc_on(..., time_frame="D") |
Indie uses context-decorated functions and calc_on() for external timeframe calculations. |
Symbol Access | request.security("AAPL", "D", close) |
self.calc_on(Sec, time_frame="D", symbol="AAPL") |
Indie supports symbol switching via symbol="..." parameter in calc_on() . |
Multiple Values Return | request.security(..., expression=[a, b]) |
def Sec(self): return a, b → a, b = self.calc_on(Sec, ...) |
Both support multiple values; Indie returns as tuple. |
Indexed Output | request.security(...)[1] |
daily = self.calc_on(Sec, time_frame="D") daily[1] |
Same logic — use series indexing to access past values. |
MTF calculation function | Lambda inside request.security() |
Full function body using @sec_context |
Indie separates MTF logic into dedicated named functions. |
Resolution string format | "D" , "60" , "1" |
"D" , "60" , "1" |
Both use identical strings for timeframes. |
Nested calls allowed | ✅ Yes | ✅ Yes | You can use multiple layers of calc_on() or request.security() as needed. |
Cannot plot directly inside | ⚠ Only simple expressions | ✅ Indie can plot internally but values must still be returned | Use return values in Indie to pass info to main context. |
✅ Example: Daily Close on Intraday Chart
Pine Script™:
daily_close = request.security(syminfo.tickerid, "D", close)
Indie:
@sec_context
def Sec(self):
return self.close[0]
daily_close = self.calc_on(Sec, time_frame="D")
✅ Example: Daily EMA (previous bar)
Pine Script™:
prev_ema = request.security(syminfo.tickerid, "D", ta.ema(close, 20))[1]
Indie:
@sec_context
def Sec(self):
return Ema.new(self.close, 20)[0]
daily_ema = self.calc_on(Sec, time_frame="D")
prev_ema = daily_ema[1]
✅ Example: Multiple Values (High & Low)
Pine Script™:
[hh, ll] = request.security(syminfo.tickerid, "D", [high, low])
Indie:
@sec_context
def Sec(self):
return self.high[0], self.low[0]
hh, ll = self.calc_on(Sec, time_frame="D")
✅ Example: Other Symbol
Pine Script™:
spy_close = request.security("SPY", "D", close)
Indie:
spy_close = self.calc_on(Sec, time_frame="D", symbol="SPY")
Note:
Sec
must be a@sec_context
-decorated function returningself.close[0]
.
Summary
- In Pine,
request.security()
is a single function with embedded logic. - In Indie, cross-timeframe access is modularized:
- Create a function decorated with
@sec_context
- Use
self.calc_on(...)
to request its result in another timeframe or symbol
- Create a function decorated with
Here is the corrected and confirmed Section 10: Alerts, Labels & Tables, detailing how Pine Script™ and Indie handle visual alerts, annotations, and (simulated) table elements.
Thanks — here’s the updated and corrected version of Section 10: Alerts, Labels & Tables, integrating your feedback and verified against the latest Indie documentation.
10. Alerts, Labels & Tables
Here is the final, corrected and expanded Section 10: Alerts, Labels & Tables, now including clarification on self.bar_index
, additional Indie marker capabilities, and a brief intro to color handling (with a full color breakdown deferred to Section 11).
10. Alerts, Labels & Tables
This section explains how visual alerts, labels, and simulated tables are implemented in Pine Script™ and Indie. Since Indie doesn’t support runtime alerts or GUI tables, it relies on plotting markers and label-style visuals as functional alternatives.
| Feature | Pine Script™ | Indie | Notes |
| ——- | ———— | —– | —– |
| Alert condition | alertcondition(cond, title, message)
| ❌ Not supported — use marker with color/text instead | Indie doesn’t provide runtime alerts; use plotted visual cues instead. |
| Label creation | label.new(x, y, text="BUY")
| @plot(..., style=marker_style.LABEL)
return plot.Marker(text="BUY")
| Indie markers with LABEL
style act as labels. |
| Label position | location.abovebar
, etc. | marker_position.ABOVE
, BELOW
, PRICE
| Position must be set using marker position enums. |
| Marker styles | 30+ styles (e.g. shape.triangleup
, labelup
) | marker_style.LABEL
, CIRCLE
, CROSS
| Indie has fewer marker types. |
| Conditional visibility | plotshape(cond)
| return plot.Marker(...) if cond else plot.Marker(math.nan)
| Return math.nan
to hide the marker. |
| Marker text | text="BUY"
| plot.Marker(text="BUY")
| Indie allows direct text inside markers. |
| Color | color=color.green
or RGB | color="green"
or color=color.GREEN
or RGBA | Indie allows both strings and constants like color.RED
.
Indie uses RGBA float values (a
from 0.0 to 1.0). |
| Table UI | table.new()
, table.cell(...)
| ❌ Not supported — simulate with spaced markers | Use bar_index % n == 0
spacing logic to mimic table rows. |
| Bar index access | bar_index
| self.bar_index
| Confirmed available in Indie — works the same for spacing/conditions. |
| Custom spacing | if bar_index % 10 == 0
| if self.bar_index % 10 == 0
| Used to simulate table rows, limit marker clutter, etc. |
| New marker extensions | ❌ | Indie allows marker size, color, text, and style via plot.Marker(...)
| Supports size
, text
, style
, color
, value
, and marker_position
. |
✅ Example: Visual Alert Marker
Pine Script™:
alertcondition(close > open, title="Bullish", message="Green bar")
plotshape(close > open, style=shape.triangleup, color=color.green)
Indie:
@plot("Bull Marker", style=marker_style.LABEL, marker_position=marker_position.ABOVE, color="green")
def marker(self):
return plot.Marker(text="BUY") if self.close[0] > self.open[0] else plot.Marker(math.nan)
✅ Example: Marker Every N Bars (Simulated Table)
@plot("RSI Label", style=marker_style.LABEL, marker_position=marker_position.ABOVE)
def rsi_label(self):
return plot.Marker(text=f"RSI: {round(rsi[0])}") if self.bar_index % 20 == 0 else plot.Marker(math.nan)
✅ Available Marker Styles (Indie)
Style | Enum |
---|---|
Label/Text | marker_style.LABEL |
Dot/Circle | marker_style.CIRCLE |
Cross/X | marker_style.CROSS |
✅ Marker Positions (Indie)
Position | Enum |
---|---|
Above bar | marker_position.ABOVE |
Below bar | marker_position.BELOW |
At price level | marker_position.PRICE |
Here is the complete and corrected Section 11: Color System & Styling, including named color usage, RGBA support, and differences in opacity control between Pine Script™ and Indie.
11. Color System & Styling
Feature | Pine Script™ | Indie | Notes |
---|---|---|---|
Named Colors | color.red , color.green , etc. |
"red" , "green" or color.RED , color.GREEN |
Indie allows lowercase strings or color.* constants (uppercase). |
Custom RGB Colors | color.rgb(r, g, b) |
color.rgba(r, g, b, a) |
Indie uses RGBA only; the alpha channel must be a float between 0.0 and 1.0 . |
Opacity / Transparency | color.new(baseColor, transp=80) |
color.rgba(r, g, b, 0.2) |
Pine uses transp (0–100); Indie uses alpha (0.0–1.0) in RGBA. |
Hexadecimal Color | "#FF0000" |
❌ Not supported directly | Indie requires using color.rgba() for custom colors; no hex literal support. |
Dynamic Color Logic | plot(x, color=x > y ? color.green : color.red) |
@plot(..., color=when(x > y, "green", "red")) |
Indie uses when(...) helper or inline if/else . |
Color Constants | color.red , etc. |
color.RED , color.BLUE , etc. |
Indie constants are ALL CAPS — must be imported via color module. |
Transparent Plot Line | plot(x, color=color.new(color.red, 80)) |
@plot(..., color=color.rgba(255, 0, 0, 0.2)) |
Indie has no transp= — opacity is controlled via alpha value directly. |
Re-usable Color Var | myColor = color.rgb(255, 100, 0) |
my_color = color.rgba(255, 100, 0, 1.0) |
Indie allows color as variables for re-use in multiple decorators. |
Label/Marker Coloring | plotshape(..., color=color.orange) |
plot.Marker(..., color="orange") |
Set color directly in return value or decorator. |
Bar / Background Color | barcolor(...) , bgcolor(...) |
@bar_color(...) , @background_color(...) |
Indie uses decorators with string or color.rgba values. |
✅ Named Colors in Indie
You can use color names as strings:
@plot("Price", color="red")
Or use constants (imported automatically):
@plot("Price", color=color.GREEN)
✅ RGBA Color Format in Indie
color.rgba(R, G, B, A)
R, G, B
: Integers from 0–255A
: Float from 0.0 (transparent) to 1.0 (opaque)
Examples:
color.rgba(255, 0, 0, 0.3) # semi-transparent red
color.rgba(0, 255, 0, 1.0) # solid green
color.rgba(0, 0, 0, 0.0) # invisible black
✅ Conditional Coloring
Pine Script™:
plot(close, color=close > open ? color.green : color.red)
Indie:
@plot("Color Line", color=when(self.close > self.open, "green", "red"))
def color_line(self):
return self.close[0]
Or:
color = "green" if self.close[0] > self.open[0] else "red"
✅ Transparent Line Example
Pine Script™:
plot(close, color=color.new(color.red, 80))
Indie:
@plot("Faint Red", color=color.rgba(255, 0, 0, 0.2))
def faint_line(self):
return self.close[0]
✅ Full Example With Custom Color Variable
my_color = color.rgba(128, 50, 255, 0.5)
@plot("Styled", color=my_color)
def styled_line(self):
return self.close[0]
Next: Section 12 – Error Handling & NaN Detection.
12. Error Handling & NaN Detection
Feature | Pine Script | Indie | Notes |
---|---|---|---|
Undefined value (NaN) | na |
math.nan |
Both represent “not available” with language-specific constants. |
Check for NaN | na(x) |
math.isnan(x) |
Indie uses Python’s math.isnan() function. |
Replace NaN with fallback | nz(x, 0) |
x if not math.isnan(x) else 0 |
Indie does not have nz() , you handle this manually. |
Raise error manually | runtime.error("Message") |
Not supported | Indie does not support runtime exceptions or explicit errors. |
Catch errors / try-except | ❌ Not available | ❌ Not supported | Indie does not support Python try /except blocks. |
Divide by zero behavior | Returns na (no crash) |
Returns math.nan (safe, no crash) |
Both languages are designed to fail silently — no hard crashes. |
Missing data fallback | x := na(x) ? 0 : x |
x = 0 if math.isnan(x) else x |
Both require conditional assignment for fallbacks. |
Silent fail prevention | na(x) guards before plot |
if not math.isnan(x): return plot.Line(x) |
Use guard condition before plotting or calculation. |
isfinite() / isinf() | ❌ Not available | math.isfinite(x) , math.isinf(x) |
Indie can use Python math module for additional safety checks. |
🔹 Code Examples
1. Basic NaN Check
Pine Script:
plot(na(close) ? 0 : close)
Indie:
@plot("Clean Close")
def clean_close(self):
return 0 if math.isnan(self.close[0]) else self.close[0]
2. Safe divide (avoid div by zero)
Pine Script:
safe_div = close / (volume == 0 ? na : volume)
Indie:
vol = self.volume[0]
safe_div = self.close[0] / vol if vol != 0 else math.nan
3. Plot only if valid
Pine Script:
plot(na(x) ? na : x)
Indie:
@plot("Safe Plot")
def safe(self):
return plot.Line(self.x[0]) if not math.isnan(self.x[0]) else plot.Line(math.nan)
13. Built-in Constants & System Variables
Feature | Pine Script™ | Indie | Notes |
---|---|---|---|
Bar index | bar_index |
self.bar_index |
Bar number on chart (0-based). |
Timestamp (epoch) | time |
self.time (as datetime ) |
Indie gives a datetime object instead of milliseconds. |
Time fields | year , month , etc. |
self.time.year , self.time.day |
Indie supports all datetime attributes (e.g., hour , minute , weekday ). |
Symbol name | syminfo.ticker |
self.symbol |
Active instrument symbol. |
Resolution | syminfo.resolution |
self.time_frame |
Returns chart timeframe (e.g., "5" , "D" ). |
Ticker ID | syminfo.tickerid |
❌ Not available | Indie does not expose exchange-prefixed full IDs. |
Current time (now) | timenow |
datetime.now() |
For wall-clock time. Use only in non-series context (e.g., logs, titles). |
Session checks | session.isfirstbar |
self.bar_index == 0 |
Indie does not have session flags — emulate with conditions. |
Chart type / style | chart.style_line , etc. |
❌ Not available | Chart style settings are not exposed in Indie. |
Timezone conversions | timestamp(...) |
datetime(...).astimezone(...) |
Indie supports full timezone-aware datetime logic via standard Python libraries. |
✅ Example: Detect First Bar
Pine Script™:
if bar_index == 0
label.new(bar_index, high, text="First")
Indie:
@plot("Start Marker", style=marker_style.LABEL, marker_position=marker_position.ABOVE)
def first_bar(self):
return plot.Marker(text="Start") if self.bar_index == 0 else plot.Marker(math.nan)
✅ Example: Show Date Info
@plot("Date Label", style=marker_style.LABEL, marker_position=marker_position.ABOVE)
def date_label(self):
if self.bar_index % 100 == 0:
return plot.Marker(text=self.time.strftime("%Y-%m-%d"))
return plot.Marker(math.nan)
✅ Example: Resolution + Symbol Overlay
@plot("Chart Info", style=marker_style.LABEL, marker_position=marker_position.ABOVE)
def chart_meta(self):
return plot.Marker(text=f"{self.symbol} - {self.time_frame}") if self.bar_index % 50 == 0 else plot.Marker(math.nan)
✅ Accessing Datetime Attributes (Indie)
year = self.time.year
month = self.time.month
hour = self.time.hour
weekday = self.time.weekday() # 0 = Monday
You can build custom session/time filters using full Python datetime logic.
Indie exposes a rich datetime object, direct access to chart metadata (symbol and timeframe), and a flexible bar_index
. Anything beyond this (like exchange ID, chart styling, or built-in session tags) must be manually recreated or is not supported yet.
Indie Language Packages / Built-ins Cheat Sheet
1. Core Package (indie
)
Decorators
Decorator | Purpose | Example |
---|---|---|
@indicator |
Main indicator function | @indicator("RSI", False) |
@param.int |
Integer input parameter | @param.int('length', 14) |
@param.source |
Price source selection | @param.source('src', default=source.CLOSE) |
@band |
Horizontal band with fill | @band(145, 155, line_color=color.RED) |
@level |
Horizontal line for levels | @level(150, line_color=color.RED) |
@param.bool |
Boolean parameter input | @param.bool('show_lines', default=True) |
@param.float |
Floating-point parameter input | @param.float('threshold', default=0.5) |
@param.str |
String parameter input | @param.str('option', default='A', options=['A']) |
@param.time_frame |
Timeframe input | @param.time_frame('tf', default='1D') |
@param_ref |
Refers to param in @sec_context |
@param_ref('referenced_param') |
@sec_context |
Marks secondary context entrypoint | @sec_context |
@algorithm |
Declares a custom series processor | @algorithm |
Context & Types
Component | Description | Example |
---|---|---|
Context |
OHLCV access and instrument metadata | self.close[0] |
MainContext |
Main chart instrument context | class Main(MainContext): |
SecContext |
Additional instrument context | def SecMain(self): |
SeriesF |
Immutable float series | SeriesF.new(values) |
MutSeriesF |
Mutable float series | MutSeriesF.new(init=0) |
Var[T] |
Revertible variable container | Var.new(init_val) |
Optional[T] |
Optional wrapper (nullable type) | Optional[str]("fallback") |
SymbolInfo |
Metadata about current instrument | self.info.ticker |
TimeFrame |
Time granularity of instrument | TimeFrame.from_str("1D") |
TradingSession |
Trading hours per instrument | self.trading_session.is_regular(time) |
Enums
Enum | Values | Example |
---|---|---|
format |
INHERITED , PRICE , VOLUME |
@indicator(format=format.PRICE) |
line_style |
SOLID , DASHED , DOTTED |
@level(100, line_style=line_style.DOTTED) |
source |
OPEN , HIGH , LOW , CLOSE , HL2 , HLC3 , OHLC4 |
@param.source('src', default=source.HLC3) |
time_frame_unit |
MINUTE , HOUR , DAY , WEEK , MONTH |
Used with TimeFrame |
2. Package indie.algorithms
Algorithm | Function Signature & Return Type | Description |
---|---|---|
Adx |
new(adx_len, di_len) -> (SeriesF, SeriesF, SeriesF) |
Minus DI, ADX, Plus DI |
Atr |
new(length, ma_algorithm='RMA') -> SeriesF |
Average True Range |
Bb |
new(src, length, mult) -> (SeriesF, SeriesF, SeriesF) |
Bollinger Bands |
Cci |
new(src, length) -> SeriesF |
Commodity Channel Index |
Change |
new(src, length=1) -> SeriesF |
Difference from length bars ago |
Corr |
new(x, y, length) -> SeriesF |
Correlation Coefficient |
CumSum |
new(src) -> SeriesF |
Cumulative Sum |
Dev |
new(src, length) -> SeriesF |
Mean Absolute Deviation |
Donchian |
new(length) -> SeriesF |
Middle line of Donchian Channel |
Ema |
new(src, length) -> SeriesF |
Exponential MA |
FixNan |
new(src) -> SeriesF |
Replace NaNs with last valid value |
Highest |
new(src, length) -> SeriesF |
Max over length |
LinReg |
new(src, length, offset=0) -> SeriesF |
Linear Regression Curve |
Lowest |
new(src, length) -> SeriesF |
Min over length |
Ma |
new(src, length, algorithm) -> SeriesF |
MA with algorithm: ‘EMA’, ‘SMA’, etc. |
Macd |
new(src, fast_len, slow_len, sig_len, ma_source='EMA', ma_signal='EMA') -> (SeriesF, SeriesF, SeriesF) |
MACD Line, Signal, Histogram |
Median |
new(src, length) -> SeriesF |
Moving Median |
Mfi |
new(src, length) -> SeriesF |
Money Flow Index |
Mfv |
new() -> SeriesF |
Money Flow Volume |
NanToZero |
new(src) -> SeriesF |
Replace NaNs with 0 |
NetVolume |
new(src) -> SeriesF |
Net Volume |
PercentRank |
new(src, length) -> SeriesF |
Percent Rank |
Rma |
new(src, length) -> SeriesF |
Smoothed MA for RSI |
Roc |
new(src, length) -> SeriesF |
Rate of Change |
Rsi |
new(src, length) -> SeriesF |
Relative Strength Index |
Sar |
new(start, increment, maximum) -> SeriesF |
Parabolic SAR |
SinceHighest |
new(src, length) -> Series[int] |
Bars since max in window |
SinceLowest |
new(src, length) -> Series[int] |
Bars since min in window |
SinceTrue |
new(condition) -> Series[int] |
Bars since last True |
Sma |
new(src, length) -> SeriesF |
Simple Moving Average |
StdDev |
new(src, length) -> SeriesF |
Standard Deviation |
Stoch |
new(src, low, high, length) -> SeriesF |
Stochastic Oscillator |
Sum |
new(src, length) -> SeriesF |
Sliding Sum |
Supertrend |
new(factor, atr_period, ma_algorithm) -> (SeriesF, SeriesF) |
Supertrend Line & Direction |
Tr |
new(handle_na=False) -> SeriesF |
True Range |
Tsi |
new(src, long_len, short_len) -> SeriesF |
True Strength Index |
Uo |
new(fast_len, middle_len, slow_len) -> SeriesF |
Ultimate Oscillator |
Vwap |
new(src, anchor, std_dev_mult) -> (SeriesF, SeriesF, SeriesF) |
VWAP + bands |
Vwma |
new(src, length) -> SeriesF |
Volume Weighted MA |
Wma |
new(src, length) -> SeriesF |
Weighted Moving Average |
3. Visualization (indie.plot
)
Plot Types
Type | Decorator | Key Parameters | Example |
---|---|---|---|
Line | @plot.line |
color , line_style , line_width , continuous |
@plot.line(color=color.RED) |
Histogram | @plot.histogram |
color , base_value , line_width |
@plot.histogram(base_value=0) |
Columns | @plot.columns |
color , base_value , rel_width |
@plot.columns(color=color.YELLOW) |
Marker | @plot.marker |
color , text , style , position , size |
@plot.marker(style=marker_style.CIRCLE) |
Fill | @plot.fill |
id1 , id2 , color |
@plot.fill('plot1', 'plot2') |
Steps | @plot.steps |
color , line_width |
@plot.steps(line_width=2) |
Styling Enums
Enum | Options | Example |
---|---|---|
line_style |
SOLID , DASHED , DOTTED |
line_style=DOTTED |
marker_style |
NONE , CIRCLE , LABEL , CROSS |
style=marker_style.CROSS |
marker_position |
ABOVE , BELOW , LEFT , RIGHT , CENTER |
position=marker_position.BELOW |
4. Colors (indie.color
)
Method | Description | Example |
---|---|---|
rgba() |
Custom RGBA color | rgba(255, 0, 0, 0.5) |
Constants | Built-in named colors | color.RED , color.GREEN(0.3) |
Built-in Color Constants:AQUA
, BLACK
, BLUE
, FUCHSIA
, GRAY
, GREEN
, LIME
, MAROON
, NAVY
, OLIVE
, PURPLE
, RED
, SILVER
, TEAL
, WHITE
, YELLOW
5. Math (math
)
Function | Purpose | Example |
---|---|---|
cross() |
Detects any crossover (two series or series vs level) | cross(self.close, self.open) |
cross_over() |
Detects upward crossover | cross_over(self.close, 50) |
cross_under() |
Detects downward crossover | cross_under(self.close, self.open) |
divide() |
Safe division with fallback | divide(x, y, default=0.0) |
6. Schedules (indie.schedule
)
Component | Purpose | Example |
---|---|---|
Schedule |
Manages active time rules and exceptions | Schedule([rule], timezone="UTC") |
ScheduleRule |
Defines a rule with start/end times and days | ScheduleRule(start=time(9), end=time(16), days=WORKDAYS) |
ALL_DAYS |
Mon–Sun list for ScheduleRule |
days=ALL_DAYS |
WORKDAYS |
Mon–Fri list for ScheduleRule |
days=WORKDAYS |
WEEKEND |
Sat–Sun list for ScheduleRule |
days=WEEKEND |
Enum: week_day
MONDAY
, TUESDAY
, WEDNESDAY
, THURSDAY
, FRIDAY
, SATURDAY
, SUNDAY
7. Time (datetime
)
Type | Purpose | Example |
---|---|---|
datetime |
Full date & time object | datetime(2024, 4, 10, 14, 30) |
time |
Time of day (no date) | time(hour=9, minute=0) |
timedelta |
Duration / difference between datetimes | timedelta(days=1, hours=5) |
Key Methods
Method | Description | Example |
---|---|---|
datetime.utcnowfromtimestamp() |
Convert timestamp to datetime | datetime.utcfromtimestamp(ts) |
datetime.strptime() |
Parse datetime from string | datetime.strptime("2025-04-10", "%Y-%m-%d") |
timedelta.total_seconds() |
Duration in seconds | delta.total_seconds() |
8. Statistics (statistics
)
Function | Purpose | Example |
---|---|---|
fmean() |
Mean of list of floats | fmean([1.2, 2.3, 3.4]) |
mean() |
Arithmetic mean (int or float) | mean([1, 2, 3, 4]) |
median() |
Median of data list | median([3, 1, 4, 2]) |
9. Math (math
)
Function | Description | Example |
---|---|---|
acos(x) |
Arc cosine | acos(1.0) |
asin(x) |
Arc sine | asin(0.5) |
atan(x) |
Arc tangent | atan(1.0) |
ceil(x) |
Ceiling (round up) | ceil(2.3) |
cos(x) |
Cosine | cos(pi) |
exp(x) |
Exponential | exp(2) |
exp2(x) |
2 raised to power x | exp2(3) |
floor(x) |
Floor (round down) | floor(2.9) |
isclose(x, y) |
Check approximate equality | isclose(1.0, 1.0000001) |
isnan(x) |
Check if value is NaN | isnan(nan) |
log(x) |
Natural logarithm | log(e) |
log10(x) |
Base-10 logarithm | log10(100) |
log2(x) |
Base-2 logarithm | log2(8) |
pow(x, y) |
Exponentiation | pow(2, 3) |
sin(x) |
Sine | sin(pi / 2) |
sqrt(x) |
Square root | sqrt(9) |
tan(x) |
Tangent | tan(pi / 4) |
Constants
Constant | Description |
---|---|
e |
Euler’s number |
pi |
π (Pi) |
nan |
Not-a-Number |
10. Built-ins
Constants
Constant | Type | Description |
---|---|---|
True |
bool |
Boolean true |
False |
bool |
Boolean false |
None |
NoneType |
Null value |
Functions
Function | Purpose | Example |
---|---|---|
abs(x) |
Absolute value of int/float | abs(-3.5) → 3.5 |
len(x) |
Length of a list/str/series | len([1,2,3]) → 3 |
max(x,y) |
Max of two or more values/list | max(1, 3, 2) → 3 |
min(x,y) |
Min of two or more values/list | min(5, 2, 8) → 2 |
range(...) |
Generate list of ints | range(1, 5) → [1,2,3,4] |
round(x) |
Round float to nearest int or digit | round(2.56) → 3 |
sum(l) |
Sum elements of a list | sum([1, 2, 3]) → 6 |
Types
Type | Description |
---|---|
int |
Integer |
float |
Floating point number |
bool |
Boolean (True / False ) |
str |
String |
list[T] |
List of type T |
tuple[...] |
Tuple |
dict[K,V] |
Dictionary with keys and values |
NoneType |
Represents null (None ) |
String Methods
Method | Description | Example |
---|---|---|
capitalize() |
Capitalizes first letter | 'abc'.capitalize() → 'Abc' |
center(w, ch) |
Centers string in width w with ch |
'hi'.center(5, '-') → '-hi--' |
count(s) |
Count substring | 'ababa'.count('a') → 3 |
endswith(s) |
Check if ends with substring | 'test.py'.endswith('.py') |
find(s) |
First index of substring | 'hello'.find('l') → 2 |
index(s) |
First index (error if not found) | 'hello'.index('e') → 1 |
islower() |
Checks if all characters are lowercase | 'abc'.islower() → True |
isupper() |
Checks if all characters are uppercase | 'ABC'.isupper() → True |
isspace() |
Checks if only whitespace | ' '.isspace() → True |
join(lst) |
Join list into string | ','.join(['a','b']) → 'a,b' |
ljust(w, ch) |
Left justify string | 'hi'.ljust(4,'-') → 'hi--' |
lower() |
Convert to lowercase | 'ABC'.lower() → 'abc' |
lstrip(chs) |
Strip leading characters | '--abc'.lstrip('-') → 'abc' |
partition(s) |
Split into 3 parts at first match | 'a=b'.partition('=') |
replace(o,n) |
Replace substrings | 'one two'.replace('one','1') |
rfind(s) |
Last index of substring | 'hello'.rfind('l') → 3 |
rindex(s) |
Last index (error if not found) | 'hello'.rindex('l') |
rjust(w, ch) |
Right justify | 'hi'.rjust(4,'-') → '--hi' |
rpartition(s) |
Split into 3 parts at last match | 'a=b=c'.rpartition('=') |
rsplit(sep) |
Right split | 'a,b,c'.rsplit(',', 1) |
rstrip(chs) |
Strip trailing characters | 'abc--'.rstrip('-') → 'abc' |
split(sep) |
Split string by separator | 'a,b,c'.split(',') |
startswith(s) |
Check if starts with substring | 'abc'.startswith('a') → True |
strip(chs) |
Strip leading/trailing characters | '--abc--'.strip('-') → 'abc' |
swapcase() |
Swap upper/lowercase | 'AbC'.swapcase() → 'aBc' |
upper() |
Convert to uppercase | 'abc'.upper() → 'ABC' |