The Complete Guide to Indie & TakeProfit

Table of Contents

The Complete Guide to Indie & TakeProfit

Revolutionizing Financial Indicator Development

Transform your trading analysis with the power of custom indicators built in minutes, not hours.


What is Indie & TakeProfit?

Indie is a groundbreaking technical analysis-oriented programming language specifically designed for developing financial indicators. Built as an enhanced dialect of Python, Indie combines the familiarity of Python syntax with powerful financial analysis capabilities, running natively on the TakeProfit platform.

TakeProfit is the comprehensive trading platform that hosts Indie, providing an integrated development environment, real-time data processing, and seamless indicator deployment directly to your charts.

Why This Matters for Traders & Developers

In traditional trading platforms, creating custom indicators requires:

Indie & TakeProfit eliminate these barriers, offering:


Key Features That Set Indie Apart

1. Familiar Yet Enhanced Syntax

Built on Python, Indie adds financial-specific syntactic sugar through decorators:

@indicator('My Custom RSI', overlay_main_pane=False)
@param.int('period', default=14, min=2, max=100)
def Main(self, period):
    # Your indicator logic here
    return rsi_value

2. Comprehensive Technical Analysis Library

Access 60+ built-in algorithms including:

Trend Indicators Momentum Indicators Volatility Indicators
SMA, EMA, WMA RSI, MACD, Stochastic Bollinger Bands, ATR
VWMA, Hull MA Williams %R, CCI Keltner Channels
Ichimoku Cloud ROC, Momentum Standard Deviation

3. Advanced Visualization Engine

Create stunning, interactive charts with:

4. Real-Time Data Processing

5. Professional Development Environment


What You Can Build

Beginner Level: Enhanced Classics

Transform standard indicators with custom logic:

# indie:lang_version = 5
# Dynamic RSI with Color-Coded Signals
from indie import indicator, param
from indie.algorithms import Rsi
from indie import color
from indie.plot import Line

@indicator('Smart RSI', overlay_main_pane=False)
@param.int('rsi_period', default=14)
@param.float('overbought', default=70.0)
@param.float('oversold', default=30.0)
def Main(self, rsi_period, overbought, oversold):
    rsi = Rsi.new(self.close, rsi_period)
    rsi_value = rsi[0]
    
    # Initialize default color
    signal_color = color.GRAY
    
    # Determine color based on RSI levels
    if rsi_value >= overbought:
        signal_color = color.RED  # Overbought - red
    elif rsi_value <= oversold:
        signal_color = color.GREEN  # Oversold - green
    
    return Line(rsi_value, color=signal_color)

Intermediate Level: Multi-Timeframe Analysis

Combine data from different timeframes:

# indie:lang_version = 5
# Multi-Timeframe Trend Analyzer
from indie import indicator, sec_context, MainContext, TimeFrame
from indie.algorithms import Sma

@sec_context
def SecMain15m(self):
    # Calculate trend for 15m timeframe
    sma_fast = Sma.new(self.close, 20)
    sma_slow = Sma.new(self.close, 50)
    return 1.0 if sma_fast[0] > sma_slow[0] else -1.0

@sec_context
def SecMain1h(self):
    # Calculate trend for 1h timeframe
    sma_fast = Sma.new(self.close, 20)
    sma_slow = Sma.new(self.close, 50)
    return 1.0 if sma_fast[0] > sma_slow[0] else -1.0

@indicator('MTF Trend Radar', overlay_main_pane=False)
class Main(MainContext):
    def __init__(self):
        # Request additional timeframe data
        self.m15_trend = self.calc_on(time_frame=TimeFrame.from_str('15m'), sec_context=SecMain15m)
        self.h1_trend = self.calc_on(time_frame=TimeFrame.from_str('1h'), sec_context=SecMain1h)
    
    def calc(self):
        # Current timeframe trend
        sma_fast = Sma.new(self.close, 20)
        sma_slow = Sma.new(self.close, 50)
        current_trend = 1.0 if sma_fast[0] > sma_slow[0] else -1.0
        
        # Get higher timeframe confirmations
        m15_trend_value = self.m15_trend[0]
        h1_trend_value = self.h1_trend[0]
        
        # Confluence scoring
        trend_score = current_trend + m15_trend_value + h1_trend_value
        return trend_score

Advanced Level: Custom Strategy Indicators

Build sophisticated trading system components:

# indie:lang_version = 5
# Advanced Volatility Breakout System
from indie import indicator, param, MutSeriesF
from indie.algorithms import Atr, Sma
from indie.math import divide

@indicator('Volatility Breakout Scanner', overlay_main_pane=False)
@param.int('lookback', default=20)
@param.float('volatility_threshold', default=1.5)
def Main(self, lookback, volatility_threshold):
    # Calculate normalized volatility using proper ATR syntax
    atr = Atr.new(lookback)  # ATR automatically uses high, low, close from context
    atr_ma = Sma.new(atr, lookback)
    vol_ratio = divide(atr[0], atr_ma[0], 0.0)  # Safe division with default value
    
    # Calculate price range series for average calculation
    price_range_series = MutSeriesF.new()
    price_range_series[0] = self.high[0] - self.low[0]
    
    # Identify breakout conditions
    price_range = self.high[0] - self.low[0]
    avg_range = Sma.new(price_range_series, lookback)[0]
    
    # Initialize breakout signal
    breakout_signal = 0.0
    
    if vol_ratio > volatility_threshold and price_range > avg_range * 1.2:
        if self.close[0] > self.open[0]:
            breakout_signal = 1.0  # Bullish breakout
        else:
            breakout_signal = -1.0  # Bearish breakout
    
    return breakout_signal, vol_ratio

Getting Started: Your First Indicator in 5 Minutes

Step 1: Access the TakeProfit Platform

  1. Navigate to the TakeProfit platform
  2. Add the Indicators Code Editor widget to your workspace
  3. Open a chart for testing your indicators

Step 2: Write Your First Indicator (Simplest Version)

# indie:lang_version = 5
from indie import indicator
from indie.algorithms import Sma

@indicator('My First Indicator', overlay_main_pane=True)
def Main(self):
    # Simple 20-period moving average
    sma = Sma.new(self.close, 20)
    return sma[0]

What this does:

Step 3: Test and Deploy

  1. Copy the code above into the code editor
  2. Click Add to Chart
  3. Watch your indicator appear on the chart in real-time

Step 4: Add Customizable Parameters

Now let’s enhance the same indicator with user-configurable parameters:

# indie:lang_version = 5
from indie import indicator, param, color
from indie.algorithms import Sma
from indie.plot import Line

@indicator('Configurable SMA', overlay_main_pane=True)
@param.int('period', default=20, min=1, max=200, title='SMA Period')
@param.float('line_width', default=2.0, min=1.0, max=5.0, title='Line Width')
def Main(self, period, line_width):
    # Calculate SMA with user-defined period
    sma = Sma.new(self.close, period)
    
    # Dynamic color based on trend
    sma_color = color.GREEN if self.close[0] > sma[0] else color.RED
    
    return Line(sma[0], color=sma_color)

New features added:

Step 5: Access the Settings Panel

  1. Right-click on your indicator in the chart
  2. Select Settings from the context menu
  3. Adjust the SMA Period and Line Width parameters
  4. Click Apply to see changes in real-time

What You’ve Learned

Next Steps: Try modifying the period values or experiment with different color combinations!


Advanced Visualization Capabilities

Multi-Plot Indicators with Dynamic Styling

# indie:lang_version = 5
from indie import indicator, param, color, level
from indie.algorithms import Macd
from indie.plot import Columns, columns, line

@indicator('Advanced MACD', overlay_main_pane=False)
@level(0, line_color=color.GRAY(0.5))
@columns(title='Histogram')
@line(color=color.BLUE, title='MACD')
@line(color=color.ORANGE, title='Signal')
@param.int('fast', default=12)
@param.int('slow', default=26)
@param.int('signal', default=9)
def Main(self, fast, slow, signal):
    # Calculate MACD components - returns tuple of (macd, signal, histogram)
    macd_line, signal_line, histogram = Macd.new(self.close, fast, slow, signal)
    
    # Dynamic histogram coloring based on histogram value and direction
    hist_color = color.BLACK  # default value
    if histogram[0] >= 0:
        if histogram[1] < histogram[0]:
            hist_color = color.GREEN
        else:
            hist_color = color.LIME
    else:
        if histogram[1] < histogram[0]:
            hist_color = color.RED
        else:
            hist_color = color.MAROON
    
    return (
        Columns(histogram[0], color=hist_color),
        macd_line[0],
        signal_line[0],
    )

Interactive Chart Annotations

# indie:lang_version = 5
from indie import indicator, MainContext, color
from indie.drawings import LabelRel, RelativePosition, vertical_anchor, horizontal_anchor

@indicator('Simple Annotation', overlay_main_pane=True)
class Main(MainContext):
    def __init__(self):
        self._created = self.new_var(False)
        
    def calc(self):
        # Create annotation only once
        if not self._created.get() and self.close[0] > 100:
            label = LabelRel(
                text="Price above 100!",
                position=RelativePosition(vertical_anchor.TOP, horizontal_anchor.LEFT, 0.1, 0.80),
                text_color=color.RED
            )
            self.chart.draw(label)
            self._created.set(True)
        return self.close[0]

Real-World Use Cases

For Professional Traders

For Quantitative Analysts

For Portfolio Managers

For Retail Traders


Technical Architecture & Performance

Optimized for Financial Data

Robust Development Framework

# indie:lang_version = 5
# Example of algorithm optimization
from indie import algorithm, SeriesF, MutSeriesF, indicator, param
from indie.plot import Line
from indie import color

@algorithm
def CustomMovingAverage(self, source: SeriesF, period: int) -> SeriesF:
  
    # Use built-in series operations for efficiency
    result = MutSeriesF.new(init=0.0)
    
    # Calculate sum of current window
    current_sum = 0.0
    window_size = min(period, self.ctx.bar_index + 1)
    
    # Sum values in the window
    for i in range(window_size):
        current_sum += source[i]
    
    # Calculate and store average
    result[0] = current_sum / window_size if window_size > 0 else 0.0
    
    return result

@indicator('Custom MA Demo', overlay_main_pane=True)
@param.int('period', default=14, min=1, max=200)
def Main(self, period):
    # Use our custom moving average
    custom_ma = CustomMovingAverage.new(self.close, period)
    
    # Color based on trend
    ma_color = color.GREEN if self.close[0] > custom_ma[0] else color.RED
    
    return Line(custom_ma[0], color=ma_color)

Enterprise-Grade Reliability


Success Stories & Community

Professional Trading Firms

“We migrated from proprietary platforms to Indie and reduced our indicator development time by 75%. The Python-based syntax allowed our entire quantitative team to contribute immediately.”

— Senior Quantitative Developer at Multi-Billion Dollar Hedge Fund

Independent Traders

“I’ve been trading for 15 years and never found a platform that let me implement my exact strategy requirements. With Indie, I built my complete trading system in just 2 weeks.”

— Professional Day Trader

Growing Community


Pricing & Plans

Free Tier

Professional Tier


Get Started Today

Immediate Next Steps

  1. [Access TakeProfit Platform →]
    • Sign up for free account
    • Add Code Editor widget to workspace
    • Start with provided examples
  2. [Explore Documentation →]
    • Complete language reference
    • Step-by-step tutorials
    • Algorithm library documentation
  3. [Join Community →]
    • Connect with other developers
    • Share indicators and strategies
    • Get help from experts

30-Day Challenge

We’re so confident in Indie’s capabilities that we challenge you to:

Week 1: Learn the basics and create your first moving average indicator Week 2: Build a multi-timeframe analysis tool Week 3: Develop a custom strategy indicator with visual signals Week 4: Create an advanced indicator with drawing objects and alerts