PINE LIBRARY
equity_curve

Library "equity_curve"
f_remove_exchange_name(name)
Remove exchange prefix from ticker string (e.g., "BINANCE:BTCUSD" → "BTCUSD")
Parameters:
name (simple string): Ticker string potentially containing exchange prefix
Returns: Ticker without exchange prefix
f_roc()
Calculate bar-over-bar return as decimal (close-to-close, for buy-and-hold)
Returns: Return as decimal (e.g., 0.02 for +2%)
f_roc_entry()
Calculate open-to-close return (realistic strategy entry assumption at bar open)
Returns: Intrabar return as decimal
f_equity(ticker1, ticker2, ticker3, ticker4, ticker5, ticker6, best_asset, r1, r2, r3, r4, r5, r6, backtest, prev_equity, prev_peak, prev_dd)
Calculate strategy equity for a rotation system (stateless — caller must maintain var state).
Uses best_asset[2] so signal is visible 1 bar before equity acts on it.
Parameters:
ticker1 (simple string): Asset 1 ticker string
ticker2 (simple string): Asset 2 ticker string
ticker3 (simple string): Asset 3 ticker string
ticker4 (simple string): Asset 4 ticker string
ticker5 (simple string): Asset 5 ticker string
ticker6 (simple string): Asset 6 ticker string
best_asset (string): The currently selected best-performing asset ticker
r1 (float): Per-bar return for asset 1 (open-to-close)
r2 (float): Per-bar return for asset 2
r3 (float): Per-bar return for asset 3
r4 (float): Per-bar return for asset 4
r5 (float): Per-bar return for asset 5
r6 (float): Per-bar return for asset 6
backtest (bool): Whether backtesting is active this bar
prev_equity (float): Previous bar's equity value (caller initializes var as na)
prev_peak (float): Previous bar's peak equity value (caller initializes var as na)
prev_dd (float): Previous bar's max drawdown value (caller initializes var as 0.0)
Returns: [equity, peak_equity, max_drawdown]
f_buy_and_hold(r, backtest, prev_equity, prev_peak, prev_dd)
Calculate buy-and-hold equity for a single asset (stateless — caller must maintain var state)
Parameters:
r (float): Per-bar return (close-to-close)
backtest (bool): Whether backtesting is active this bar
prev_equity (float): Previous bar's equity value (caller initializes var as na)
prev_peak (float): Previous bar's peak equity value (caller initializes var as na)
prev_dd (float): Previous bar's max drawdown value (caller initializes var as 0.0)
Returns: [equity, peak_equity, max_drawdown]
f_since(active, prev_count)
Calculate lookback period as bar count since condition became true (stateless — caller must maintain var state)
Parameters:
active (bool): Whether the counting condition is active this bar
prev_count (int): Previous bar's raw count (caller initializes var as 0)
Returns: [output, count] — output is the adjusted lookback for metrics; count is the raw counter to feed back next bar
f_best_asset_col(ticker1, ticker2, ticker3, ticker4, ticker5, ticker6, best_asset, backtest, colors)
Return color for equity curve based on currently held asset.
Uses best_asset[1] so signal is visible 1 bar before equity execution.
Parameters:
ticker1 (simple string): Asset 1 ticker string
ticker2 (simple string): Asset 2 ticker string
ticker3 (simple string): Asset 3 ticker string
ticker4 (simple string): Asset 4 ticker string
ticker5 (simple string): Asset 5 ticker string
ticker6 (simple string): Asset 6 ticker string
best_asset (string): The confirmed best-performing asset ticker
backtest (bool): Whether backtesting is active
colors (array<color>): Array of 8 colors: [asset1, asset2, asset3, asset4, asset5, asset6, usd, text]
Returns: Color corresponding to the currently held asset
f_PerformanceMetrics(base, Lookback, backtest, max_drawdown)
Calculate performance metrics from an equity curve
Parameters:
base (float): The equity curve series
Lookback (int): Number of bars to analyze (capped at 4998)
backtest (bool): Whether backtesting is active
max_drawdown (float): Maximum drawdown value (pre-calculated, as decimal e.g. 0.25 = 25%)
Returns: Array of 10 floats: [mean_all%, mean_pos%, mean_neg%, stdev_all%, stdev_pos%, stdev_neg%, sharpe, sortino, omega, max_dd%]
f_PerfMetricTable(p, ticker1, ticker2, ticker3, ticker4, ticker5, ticker6, strategy, a1, a2, a3, a4, a5, a6, colors)
Populate a performance metrics comparison table. Caller must create the table with `var` and pass it in.
Should only be called on barstate.islast.
Parameters:
p (table): Pre-created table (caller uses: var table p = table.new(position.top_left, 8, 15, ...))
ticker1 (simple string): Asset 1 ticker string
ticker2 (simple string): Asset 2 ticker string
ticker3 (simple string): Asset 3 ticker string
ticker4 (simple string): Asset 4 ticker string
ticker5 (simple string): Asset 5 ticker string
ticker6 (simple string): Asset 6 ticker string
strategy (array<float>): Strategy metrics array (from f_PerformanceMetrics)
a1 (array<float>): Buy-and-hold metrics for asset 1
a2 (array<float>): Buy-and-hold metrics for asset 2
a3 (array<float>): Buy-and-hold metrics for asset 3
a4 (array<float>): Buy-and-hold metrics for asset 4
a5 (array<float>): Buy-and-hold metrics for asset 5
a6 (array<float>): Buy-and-hold metrics for asset 6
colors (array<color>): Array of 8 colors
Returns: The table object
f_remove_exchange_name(name)
Remove exchange prefix from ticker string (e.g., "BINANCE:BTCUSD" → "BTCUSD")
Parameters:
name (simple string): Ticker string potentially containing exchange prefix
Returns: Ticker without exchange prefix
f_roc()
Calculate bar-over-bar return as decimal (close-to-close, for buy-and-hold)
Returns: Return as decimal (e.g., 0.02 for +2%)
f_roc_entry()
Calculate open-to-close return (realistic strategy entry assumption at bar open)
Returns: Intrabar return as decimal
f_equity(ticker1, ticker2, ticker3, ticker4, ticker5, ticker6, best_asset, r1, r2, r3, r4, r5, r6, backtest, prev_equity, prev_peak, prev_dd)
Calculate strategy equity for a rotation system (stateless — caller must maintain var state).
Uses best_asset[2] so signal is visible 1 bar before equity acts on it.
Parameters:
ticker1 (simple string): Asset 1 ticker string
ticker2 (simple string): Asset 2 ticker string
ticker3 (simple string): Asset 3 ticker string
ticker4 (simple string): Asset 4 ticker string
ticker5 (simple string): Asset 5 ticker string
ticker6 (simple string): Asset 6 ticker string
best_asset (string): The currently selected best-performing asset ticker
r1 (float): Per-bar return for asset 1 (open-to-close)
r2 (float): Per-bar return for asset 2
r3 (float): Per-bar return for asset 3
r4 (float): Per-bar return for asset 4
r5 (float): Per-bar return for asset 5
r6 (float): Per-bar return for asset 6
backtest (bool): Whether backtesting is active this bar
prev_equity (float): Previous bar's equity value (caller initializes var as na)
prev_peak (float): Previous bar's peak equity value (caller initializes var as na)
prev_dd (float): Previous bar's max drawdown value (caller initializes var as 0.0)
Returns: [equity, peak_equity, max_drawdown]
f_buy_and_hold(r, backtest, prev_equity, prev_peak, prev_dd)
Calculate buy-and-hold equity for a single asset (stateless — caller must maintain var state)
Parameters:
r (float): Per-bar return (close-to-close)
backtest (bool): Whether backtesting is active this bar
prev_equity (float): Previous bar's equity value (caller initializes var as na)
prev_peak (float): Previous bar's peak equity value (caller initializes var as na)
prev_dd (float): Previous bar's max drawdown value (caller initializes var as 0.0)
Returns: [equity, peak_equity, max_drawdown]
f_since(active, prev_count)
Calculate lookback period as bar count since condition became true (stateless — caller must maintain var state)
Parameters:
active (bool): Whether the counting condition is active this bar
prev_count (int): Previous bar's raw count (caller initializes var as 0)
Returns: [output, count] — output is the adjusted lookback for metrics; count is the raw counter to feed back next bar
f_best_asset_col(ticker1, ticker2, ticker3, ticker4, ticker5, ticker6, best_asset, backtest, colors)
Return color for equity curve based on currently held asset.
Uses best_asset[1] so signal is visible 1 bar before equity execution.
Parameters:
ticker1 (simple string): Asset 1 ticker string
ticker2 (simple string): Asset 2 ticker string
ticker3 (simple string): Asset 3 ticker string
ticker4 (simple string): Asset 4 ticker string
ticker5 (simple string): Asset 5 ticker string
ticker6 (simple string): Asset 6 ticker string
best_asset (string): The confirmed best-performing asset ticker
backtest (bool): Whether backtesting is active
colors (array<color>): Array of 8 colors: [asset1, asset2, asset3, asset4, asset5, asset6, usd, text]
Returns: Color corresponding to the currently held asset
f_PerformanceMetrics(base, Lookback, backtest, max_drawdown)
Calculate performance metrics from an equity curve
Parameters:
base (float): The equity curve series
Lookback (int): Number of bars to analyze (capped at 4998)
backtest (bool): Whether backtesting is active
max_drawdown (float): Maximum drawdown value (pre-calculated, as decimal e.g. 0.25 = 25%)
Returns: Array of 10 floats: [mean_all%, mean_pos%, mean_neg%, stdev_all%, stdev_pos%, stdev_neg%, sharpe, sortino, omega, max_dd%]
f_PerfMetricTable(p, ticker1, ticker2, ticker3, ticker4, ticker5, ticker6, strategy, a1, a2, a3, a4, a5, a6, colors)
Populate a performance metrics comparison table. Caller must create the table with `var` and pass it in.
Should only be called on barstate.islast.
Parameters:
p (table): Pre-created table (caller uses: var table p = table.new(position.top_left, 8, 15, ...))
ticker1 (simple string): Asset 1 ticker string
ticker2 (simple string): Asset 2 ticker string
ticker3 (simple string): Asset 3 ticker string
ticker4 (simple string): Asset 4 ticker string
ticker5 (simple string): Asset 5 ticker string
ticker6 (simple string): Asset 6 ticker string
strategy (array<float>): Strategy metrics array (from f_PerformanceMetrics)
a1 (array<float>): Buy-and-hold metrics for asset 1
a2 (array<float>): Buy-and-hold metrics for asset 2
a3 (array<float>): Buy-and-hold metrics for asset 3
a4 (array<float>): Buy-and-hold metrics for asset 4
a5 (array<float>): Buy-and-hold metrics for asset 5
a6 (array<float>): Buy-and-hold metrics for asset 6
colors (array<color>): Array of 8 colors
Returns: The table object
Pine library
In true TradingView spirit, the author has published this Pine code as an open-source library so that other Pine programmers from our community can reuse it. Cheers to the author! You may use this library privately or in other open-source publications, but reuse of this code in publications is governed by House Rules.
Disclaimer
The information and publications are not meant to be, and do not constitute, financial, investment, trading, or other types of advice or recommendations supplied or endorsed by TradingView. Read more in the Terms of Use.
Pine library
In true TradingView spirit, the author has published this Pine code as an open-source library so that other Pine programmers from our community can reuse it. Cheers to the author! You may use this library privately or in other open-source publications, but reuse of this code in publications is governed by House Rules.
Disclaimer
The information and publications are not meant to be, and do not constitute, financial, investment, trading, or other types of advice or recommendations supplied or endorsed by TradingView. Read more in the Terms of Use.