The strategy()
function in Pine Script is a cornerstone for developing trading strategies. Each argument of this function plays a crucial role. Let’s dive into the details of each argument.
Arguments Explained
title (const string)
- Purpose: Assigns the primary title of the strategy.
- Display: Appears on the chart and as the default title when publishing.
- Example:
title = "My Trading Strategy"
shorttitle (const string)
- Purpose: Provides an alternative, shorter title.
- Display: Replaces the main title in chart-related interfaces.
- Example:
shorttitle = "MTS"
overlay (const bool)
- Purpose: Determines where the strategy is displayed.
- Options:
true
for overlaying on the chart;false
for a separate pane. - Example:
overlay = true
format (const string)
- Purpose: Specifies value formatting (price, volume, percent).
- Options:
format.inherit
,format.price
,format.volume
,format.percent
. - Example:
format = format.price
precision (const int)
- Purpose: Sets the number of decimal places for values.
- Range: 0 to 16.
- Example:
precision = 2
scale (const scale_type)
- Purpose: Defines the price scale used.
- Options:
scale.right
,scale.left
,scale.none
. - Example:
scale = scale.left
pyramiding (const int)
- Purpose: Limits the number of concurrent entries in the same direction.
- Example:
pyramiding = 2
calc_on_order_fills (const bool)
- Purpose: Triggers recalculation post order fill.
- Example:
calc_on_order_fills = true
calc_on_every_tick (const bool)
- Purpose: Enables recalculation on each real-time tick.
- Example:
calc_on_every_tick = false
max_bars_back (const int)
- Purpose: Defines the historical buffer length for referencing past values.
- Default: Automatically detected, but can be set manually.
- Example:
max_bars_back = 50
backtest_fill_limits_assumption (const int)
- Purpose: Sets the threshold for limit order execution in ticks.
- Example:
backtest_fill_limits_assumption = 2
default_qty_type (const string)
- Purpose: Determines the unit for default_qty_value.
- Options:
strategy.fixed
,strategy.cash
,strategy.percent_of_equity
. - Example:
default_qty_type = strategy.fixed
default_qty_value (const int/float)
- Purpose: Specifies the default trading quantity.
- Example:
default_qty_value = 10
initial_capital (const int/float)
- Purpose: Sets the initial trading capital.
- Example:
initial_capital = 100000
currency (const string)
- Purpose: Defines the strategy’s operational currency.
- Options:
currency.NONE
,currency.USD
, etc. - Example:
currency = currency.USD
slippage (const int)
- Purpose: Accounts for slippage in ticks.
- Example:
slippage = 2
commission_type (const string)
- Purpose: Sets the basis for commission calculations.
- Options:
strategy.commission.percent
,strategy.commission.cash_per_contract
,strategy.commission.cash_per_order
. - Example:
commission_type = strategy.commission.percent
commission_value (const int/float)
- Purpose: Specifies the commission amount.
- Example:
commission_value = 0.1
process_orders_on_close (const bool)
- Purpose: Determines if orders are processed at bar close.
- Example:
process_orders_on_close = true
close_entries_rule (const string)
- Purpose: Sets the rule for closing trades.
- Options:
"FIFO"
or"ANY"
. - Example:
close_entries_rule = "FIFO"
margin_long (const int/float)
- Purpose: Specifies the margin percentage for long positions.
- Example:
margin_long = 50
margin_short (const int/float)
- Purpose: Specifies the margin percentage for short positions.
- Example:
margin_short = 50
explicit_plot_zorder (const bool)
- Purpose: Controls the rendering order of plots and lines.
- Example:
explicit_plot_zorder = true
max_lines_count, max_labels_count, max_boxes_count (const int)
- Purpose: Limits the number of display elements.
- Example:
max_lines_count = 100, max_labels_count = 50, max_boxes_count = 25
risk_free_rate (const int/float)
- Purpose: Sets the annual risk-free rate of return.
- Example:
risk_free_rate = 2
use_bar_magnifier (const bool)
- Purpose: Enables lower timeframe data for backtesting.
- Example:
use_bar_magnifier = true
max_polylines_count (const int)
- Purpose: Limits the number of polyline drawings.
- Example:
max_polylines_count = 50
Practical Example of strategy()
Function in Pine Script
Example Strategy Script
//@version=5 strategy("Enhanced Trading Strategy", shorttitle="ETS", overlay=true, precision=2, pyramiding=3, calc_on_order_fills=false, calc_on_every_tick=true, max_bars_back=100, backtest_fill_limits_assumption=1, default_qty_type=strategy.percent_of_equity, default_qty_value=5, initial_capital=50000, currency=currency.USD, slippage=1, commission_type=strategy.commission.percent, commission_value=0.05, process_orders_on_close=true, close_entries_rule="FIFO", margin_long=30, margin_short=30, explicit_plot_zorder=false, max_lines_count=50, max_labels_count=50, max_boxes_count=20, risk_free_rate=2, use_bar_magnifier=false, max_polylines_count=30) // Entry condition: Long when the current close is greater than the previous high. if close > high[1] strategy.entry("LongEntry", strategy.long) // Exit condition: Taking profit at 10 points and stop loss at 5 points. strategy.exit("ExitLong", "LongEntry", profit=10, loss=5)
Key Takeaways
- Customization and Flexibility: This example demonstrates how the
strategy()
function can be customized extensively with a variety of parameters to fit specific trading needs. - Strategy Identification: The
title
andshorttitle
provide a clear identification of the strategy on charts. - Trade Execution and Management:
pyramiding
is set to 3, allowing multiple entries in the same direction.calc_on_every_tick
ensures the strategy recalculates with each real-time price update.process_orders_on_close
allows for processing orders at the close of a bar, adding realism to backtesting.
- Risk and Money Management:
default_qty_type
anddefault_qty_value
control the trade size based on a percentage of equity.margin_long
andmargin_short
set margin requirements, helping in risk management.
- Commission and Slippage: Accounting for real-world trading costs with
commission_type
,commission_value
, andslippage
. - Visualization and Limits:
explicit_plot_zorder
and limits on lines, labels, and boxes (max_lines_count
, etc.) manage the visual aspects of the strategy on the chart.
- Advanced Features:
use_bar_magnifier
for detailed backtesting (disabled in this example).risk_free_rate
to set a baseline for performance comparison.
- Practical Application: The entry and exit logic illustrate a simple trend-following strategy where positions are entered when the current close is above the previous high and exited with a predefined profit or loss.
Conclusion
Each argument of the strategy()
function contributes to shaping the behavior and characteristics of a trading strategy in Pine Script. Understanding and effectively using these parameters allows for the creation of tailored and sophisticated trading strategies.