Table of Contents

Community-maintained · not officially affiliated with TakeProfit

A Python-based language for trading indicators

Indie runs natively on the TakeProfit charting platform. It reuses familiar Python syntax and adds decorators, series types, and a drawing API built specifically for financial charts — so every built-in indicator on the platform is, in fact, written in Indie.

Free to start · no installation, indicators run in the browser

Why Indie

Python syntax, built for markets

Everything you'd expect from a modern scripting language, plus the primitives financial analysis actually needs.

Py

Familiar syntax

If you've written basic Python, the structure — functions, decorators, type hints — will feel immediately familiar. No new language to learn from scratch.

Σ

Series-first data model

Series[T] and MutSeries[T] model time series data directly, with built-in handling for lookback, NaN values, and streaming updates.

⌗

Drawing API

Place labels and lines at exact price/time coordinates, or anchor persistent overlays to a corner of the chart — without touching a rendering engine.

⚙

Parameter decorators

@param.int, @param.float, @param.bool turn function arguments into user-configurable indicator settings automatically.

⇄

Multi-instrument context

@sec_context lets an indicator request data from another symbol or timeframe alongside the chart's own series.

▤

Built-in algorithms

A standard library of moving averages, crossovers, and other reusable @algorithm building blocks — no need to reimplement the basics.

Less boilerplate

A full indicator in a few lines

A parameterized indicator is a decorated function, not a class hierarchy. The @indicator and @param.* decorators handle registration and UI controls; you write the logic.

Browse the full reference →
@indicator('Price Above MA')
@param.int('length', default=20)
def Main(self, length):
    ma = Sma.new(self.close, length)
    return self.close[0] > ma[0]
@indicator('Trend Break Marker', overlay_main_pane=True)
def Main(self):
    if breakout_detected(self):
        self.chart.draw(LabelAbs(
            f"Breakout: {self.close[0]:.2f}",
            AbsolutePosition(self.time[0], self.high[0]),
        ))

        self.chart.draw(LineSegment(
            AbsolutePosition(self.time[10], self.low[10]),
            AbsolutePosition(self.time[0], self.high[0]),
            extend_type=extend_type.RIGHT,
        ))
Chart-native output

Draw directly on the chart

AbsolutePosition pins a label or line to an exact price/time coordinate; extend_type projects a line segment forward so trend markers stay visible as new bars arrive.

See the drawing API →
Guides

Start reading

Community-written guides that go deeper into specific parts of the language and platform.

Language reference

The complete Indie syntax reference: data types, decorators, built-in algorithms, and the platform's alert system.

Coming from TradingView / Pine Script

What's different about Indie and TakeProfit if you're used to Pine Script, and how to write your first custom indicator.

Linear regression projections

A quantitative comparison of OLS regression projections against a simple moving average — lag, noise, and where each one breaks down.

Build your first indicator

TakeProfit is free to start — indicators run in the browser, no local setup required.