This page contains release notes of notable changes in Pine Script.
tostring
now accepts “bool” and “string” types.
New argument for time
and time_close
functions was added:
timezone
- timezone of the session
argument, can only be used when a session is specified. Can be written out in GMT notation (e.g. “GMT-5”) or as an IANA time zone database name (e.g. “America/New_York”).It is now possible to place a drawing object in the future with xloc = xloc.bar_index
.
New argument for study
and strategy
functions was added:
explicit_plot_zorder
- specifies the order in which the indicator’s plots, fills, and hlines are rendered. If true, the plots will be drawn based on the order in which they appear in the indicator’s code, each newer plot being drawn above the previous ones.New variable was added:
barstate.islastconfirmedhistory
- returns true
if script is executing on the dataset’s last bar when market is closed, or script is executing on the bar immediately preceding the real-time bar, if market is open. Returns false
otherwise.New function was added:
round_to_mintick(x)
- returns the value rounded to the symbol’s mintick, i.e. the nearest value that can be divided by syminfo.mintick
, without the remainder, with ties rounding up.Expanded tostring()
functionality. The function now accepts three new formatting arguments:
format.mintick
to format to tick precision.format.volume
to abbreviate large values.format.percent
to format percentages.Improved backtesting functionality by adding the Leverage mechanism.
Added support for table drawings and functions for working with them. Tables are unique objects that are not anchored to specific bars; they float in a script’s space, independently of the chart bars being viewed or the zoom factor used. For more information, see our User Manual page on tables.
New functions were added:
color.rgb(red, green, blue, transp)
- creates a new color with transparency using the RGB color model.color.from_gradient(value, bottom_value, top_value, bottom_color, top_color)
- returns color calculated from the linear gradient between bottom_color to top_color.color.r(color)
, color.g(color)
, color.b(color)
, color.t(color)
- retrieves the value of one of the color components.array.from
- takes a variable number of arguments with one of the types: int
, float
, bool
, string
, label
, line
, color
, box
, table
and returns an array of the corresponding type.A new box
drawing has been added to Pine, making it possible to draw rectangles on charts using the Pine syntax. For more details see the Pine Script reference and the User Manual page on drawings .
The color.new
function can now accept series and input arguments, in which case, the colors will be calculated at runtime. For more information about this, see our User Manual page on colors.
New math constants were added:
math.pi
- is a named constant for Archimedes’ constant. It is equal to 3.1415926535897932.math.phi
- is a named constant for the golden ratio. It is equal to 1.6180339887498948.math.rphi
- is a named constant for the golden ratio conjugate. It is equal to 0.6180339887498948.math.e
- is a named constant for Euler’s number. It is equal to 2.7182818284590452.New math functions were added:
round(x, precision)
- returns the value of x
rounded to the nearest integer, with ties rounding up. If the precision parameter is used, returns a float value rounded to that number of decimal places.median(source, length)
- returns the median of the series.mode(source, length)
- returns the mode of the series. If there are several values with the same frequency, it returns the smallest value.range(source, length)
- returns the difference between the min
and max
values in a series.todegrees(radians)
- returns an approximately equivalent angle in degrees from an angle measured in radians.toradians(degrees)
- returns an approximately equivalent angle in radians from an angle measured in degrees.random(min, max, seed)
- returns a pseudo-random value. The function will generate a different sequence of values for each script execution. Using the same value for the optional seed argument will produce a repeatable sequence.New functions were added:
session.ismarket
- returns true
if the current bar is a part of the regular trading hours (i.e. market hours), false
otherwise.session.ispremarket
- returns true
if the current bar is a part of the pre-market, false
otherwise.session.ispostmarket
- returns true
if the current bar is a part of the post-market, false
otherwise.str.format
- converts the values to strings based on the specified formats. Accepts certain number
modifiers: integer
, currency
, percent
.New assignment operators were added:
+=
- addition assignment-=
- subtraction assignment*=
- multiplication assignment/=
- division assignment%=
- modulus assignmentNew parameters for inputs customization were added:
inline
- combines all the input calls with the same inline value in one line.group
- creates a header above all inputs that use the same group string value. The string is also used as the header text.tooltip
- adds a tooltip icon to the Inputs
menu. The tooltip string is shown when hovering over the tooltip icon.New argument for fill
function was added:
fillgaps
- controls whether fills continue on gaps when one of the plot
calls returns an na
value.A new keyword was added:
varip
- is similar to the var
keyword, but variables declared with varip
retain their values between the updates of a real-time bar.New functions were added:
tonumber
- converts a string value into a float.time_close
- returns the UNIX timestamp of the close of the current bar, based on the resolution and session that is passed to the function.dividends
- requests dividends data for the specified symbol.earnings
- requests earnings data for the specified symbol.splits
- requests splits data for the specified symbol.New arguments for the study() function were added:
resolution_gaps
- fills the gaps between values fetched from higher timeframes when using resolution
.format.percent
- formats the script output values as a percentage.New variable was added:
time_tradingday
- the beginning time of the trading day the current bar belongs to.The following functions now accept a series length parameter:
A new type of alerts was added - script alerts. More information can be found in our Help Center.
New array types were added:
array.new_line
array.new_label
array.new_string
New functions were added:
str.length
- returns number of chars in source string.array.join
- concatenates all of the elements in the array into a string and separates these elements with the specified separator.str.split
- splits a string at a given substring separator.max_labels_count
and max_lines_count
parameters were added to the study and strategy functions. Now you can manage the number of lines and labels by setting values for these parameters from 1 to 500.New function was added:
array.range
- return the difference between the min and max values in the array.The behavior of rising
and falling
functions have changed. For example, rising(close,3)
is now calculated as following:
close[0] > close[1] and close[1] > close[2] and close[2] > close[3]
Added support for input.color
to the input()
function. Now you can provide script users with color selection through the script’s “Settings/Inputs” tab with the same color widget used throughout the TradingView user interface. Learn more about this feature in our blog:
//@version=4
study("My Script", overlay = true)
color c_labelColor = input(color.green, "Main Color", input.color)
var l = label.new(bar_index, close, yloc = yloc.abovebar, text = "Colored label")
label.set_x(l, bar_index)
label.set_color(l, c_labelColor)
Added support for arrays and functions for working with them. You can now use the powerful new array feature to build custom datasets. See our User Manual page on arrays and our blog:
//@version=4
study("My Script")
a = array.new_float(0)
for i = 0 to 5
array.push(a, close[i] - open[i])
plot(array.get(a, 4))
The following functions now accept a series length parameter. Learn more about this feature in our blog:
//@version=4
study("My Script", overlay = true)
length = input(10, "Length", input.integer, minval = 1, maxval = 100)
avgBar = avg(highestbars(length), lowestbars(length))
float dynLen = nz(abs(avgBar) + 1, length)
dynSma = sma(close, int(dynLen))
plot(dynSma)
resolution
parameter was added to the study
function. Now you can add MTF functionality to scripts and decide the timeframe you want the indicator to run on.Please note that you need to reapply the indicator in order for the resolution parameter to appear.
The tooltip
argument was added to the label.new
function along with the label.set_tooltip
function:
//@version=4
study("My Script", overlay=true)
var l=label.new(bar_index, close, yloc=yloc.abovebar, text="Label")
label.set_x(l,bar_index)
label.set_tooltip(l, "Label Tooltip")
timezone
argument was added for time functions. Now you can specify timezone for second
, minute
, hour
, year
, month
, dayofmonth
, dayofweek
functions:
//@version=4
study("My Script")
plot(hour(1591012800000, "GMT+1"))
syminfo.basecurrency
variable was added. Returns the base currency code of the current symbol. For EURUSD symbol returns EUR.
else if
statement was addedsecurity
function has changed: the expression
parameter can be series or tuple.New function was added:
financial
- request financial data for a symbolNew functions for common indicators were added:
cmo
- Chande Momentum Oscillatormfi
- Money Flow Indexbb
- Bollinger Bandsbbw
- Bollinger Bands Widthkc
- Keltner Channelskcw
- Keltner Channels Widthdmi
- DMI/ADXwpr
- Williams % Rhma
- Hull Moving Averagesupertrend
- SuperTrendAdded a detailed description of all the fields in the Strategy Tester Report
New Pine indicator VWAP Anchored was added. Now you can specify the time period: Session, Month, Week, Year.
Fixed a problem with calculating percentrank
function. Now it can return a zero value, which did not happen before due to an incorrect calculation.
The default transparency
parameter for the plot
, plotshape
, and plotchar
functions is now 0%.
For the functions plot
, plotshape
, plotchar
, plotbar
, plotcandle
, plotarrow
, you can set the display
parameter, which controls the display of the plot. The following values can be assigned to it:
display.none
- the plot is not displayeddisplay.all
- the plot is displayed (Default)The textalign
argument was added to the label.new
function along with the label.set_textalign
function. Using those, you can control the alignment of the label’s text:
//@version=4
study("My Script", overlay = true)
var l = label.new(bar_index, high, text="Right\n aligned\n text", textalign=text.align_right)
label.set_xy(l, bar_index, high)
New built-in variables were added:
iii
- Intraday Intensity Indexwvad
- Williams Variable Accumulation/Distributionwad
- Williams Accumulation/Distributionobv
- On Balance Volumepvt
- Price-Volume Trendnvi
- Negative Volume Indexpvi
- Positive Volume IndexNew parameters were added for strategy.close
:
qty
- the number of contracts/shares/lots/units to exit a trade withqty_percent
- defines the percentage of entered contracts/shares/lots/units to exit a trade withcomment
- addtional notes on the orderNew parameter was added for strategy.close_all
:
comment
- additional notes on the orderWarning messages were added.
For example, if you don’t specify exit parameters for strategy.exit
- profit
, limit
, loss
, stop
or one of the following pairs: trail_offset
and trail_price
/ trail_points
- you will see a warning message in the console in the Pine editor.
Increased the maximum number of arguments in max
, min
, avg
functions. Now you can use up to ten arguments in these functions.
plotchar
function now supports most of the Unicode symbols:
//@version=4
study("My Script", overlay=true)
plotchar(open > close, char="🐻")
New bordercolor
argument of the plotcandle
function allows you to change the color of candles’ borders:
//@version=4
study("My Script")
plotcandle(open, high, low, close, title='Title', color = open < close ? color.green : color.red, wickcolor=color.black, bordercolor=color.orange)
New variables added:
syminfo.description
- returns a description of the current symbolsyminfo.currency
- returns the currency code of the current symbol (EUR, USD, etc.)syminfo.type
- returns the type of the current symbol (stock, futures, index, etc.)New parameters to the strategy
function were added:
process_orders_on_close
allows the broker emulator to try to execute orders after calculating the strategy at the bar’s closeclose_entries_rule
allows to define the sequence used for closing positionsSome fixes were made:
fill
function now works correctly with na
as the color
parameter valuesign
function now calculates correctly for literals and constantsstr.replace_all (source, target, replacement)
function was added. It replaces each occurrence of a target
string in the source
string with a replacement
string
New variables added:
timeframe.isseconds
returns true when current resolution is in secondstimeframe.isminutes
returns true when current resolution is in minutestime_close
returns the current bar’s close timeThe behavior of some functions, variables and operators has changed:
The time
variable returns the correct open time of the bar for more special cases than before
An optional seconds parameter of the timestamp
function allows you to set the time to within seconds
security
function:
Added the possibility of requesting resolutions in seconds:
1, 5, 15, 30 seconds (chart resolution should be less than or equal to the requested resolution)
Reduced the maximum value that can be requested in some of the other resolutions:
from 1 to 1440 minutes
from 1 to 365 days
from 1 to 52 weeks
from 1 to 12 months
Changes to the evaluation of ternary operator branches:
In Pine v3, during the execution of a ternary operator, both its branches are calculated, so when this script is added to the chart, a long position is opened, even if the long() function is not called:
//@version=3
strategy(title = "My Strategy")
long() =>
strategy.entry("long", true, 1, when = open > high[1])
1
c = 0
c := true ? 1 : long()
plot(c)
Pine v4 contains built-in functions with side effects ( line.new
and label.new
). If calls to these functions are present in both branches of a ternary operator, both function calls would be executed following v3 conventions. Thus, in Pine v4, only the branch corresponding to the evaluated condition is calculated. While this provides a viable solution in some cases, it will modify the behavior of scripts which depended on the fact that both branches of a ternary were evaluated. The solution is to pre-evaluate expressions prior to the ternary operator. The conversion utility takes this requirement into account when converting scripts from v3 to v4, so that script behavior will be identical in v3 and v4.
var
keyword for one time variable initializationmax_bars_back
function to control series variables internal history buffer sizesshow_last
in the plot-type functions, you can restrict the number of bars that the plot is displayed on.barstate.isconfirmed
variable has been added to the list of variables that return bar status. It lets you create indicators that are calculated based on the closed bars only.options
argument for the input()
function creates an input with a set of options defined by the script’s author.security()
function: it can no longer access the future data by default. This can be changes with the lookahead
parameter.strategy()
function.strategy()
function.fill()
function: one call can now support several different colors.color.new()
function, or by adding an alpha-channel value to a hex color code.for
loops and keywords break
and continue
.:=
operator to assign a new value to a variable that has already been defined.alertcondition()
function allows for creating custom alert conditions in Pine-based indicators.if
statements, making it easier to write more readable and concise code.editable
parameter allows hiding the plot from the Style menu in the indicator settings so that it is not possible to edit its style. The parameter has been added to all the following functions: all plot-type functions, barcolor()
, bgcolor()
, hline()
, and fill()
.plotbar()
and plotcandle()
.plotshape()
function: shape.labelup and shape.labeldown.step
argument for the input()
function, allowing to specify the step size for the indicator’s inputs.source
type to the input()
function, allowing to select the data source for the indicator’s calculations from its settings.text
argument to plotshape()
and plotchar()
functions.plotshape()
function: shape.arrowup, shape.arrowdown, shape.square, shape.diamond.plotshape()
, plotchar()
, and plotarrow()
for situations when you need to highlight specific bars on a chart without drawing a line.security
function.barssince()
and valuewhen()
allow you to check conditions on historical data easier.barcolor()
function lets you specify a color for a bar based on filling of a certain condition.barcolor()
function, the bgcolor()
function changes the color of the background.security()
function, further expanding its functionality.fill()
function, enabling it to be used more than once in one script.round()
function to round and convert float values to integers.