In this tutorial, we will be learning how to use the 5Paisa – Tradingview Webhook feature for automating your Tradingview pinescript strategy. This Module discusses configuring long/short and buy/sell/short/cover trading modules with stop-loss/target/trailing stop-loss controls.
Investment Automation: And in case if you are planning to automate investment ideas then you have to submit Demat Debit and Pledge Instructions to the broker to sell stocks from holdings without entering CDSL OTP or T-PIN-based e-DIS process.
Tradingview Automation Requirements
1)5Paisa Trading Account
2)Tradingview Paid Subscription (Essential, Plus or Premium Plans)
3)Tradingview Pinescript Strategy
Steps to Set Up Automated Trading with 5Paisa and TradingView Webhook
Below is an overview of how to set up automated trading using 5paisa through the TradingView webhook.
Login to your 5paisa account
Tap on FnO 360 icon in the upper right corner
Click on the profile section in the upper right corner
Click on Webhook. Now Generate the Webhook with suitable expiry and Click Generate the JSON object.
Generated Sample JSON
Here is the unique sample JSON Generated from 5Paisa portal.
{
"transactionType": "Buy",
"orderType": "MKT",
"quantity": 1,
"price": "0",
"exchange": "{{exchange}}",
"Symbol": "{{ticker}}",
"productType": "D"
}
Convert the copied JSON into a format that can be used by TradingView’s webhook. Use Strategy placeholders like {{strategy.order.alert_message}}
and {{strategy.order.contracts}}
to insert dynamic buy/sell actions and quantities as part of the trading strategy alerts. Here is the modified response
{
"transactionType": "{{strategy.order.alert_message}}",
"orderType": "MKT",
"quantity": {{strategy.order.contracts}},
"price": "0",
"exchange": "{{exchange}}",
"Symbol": "{{ticker}}",
"productType": "D"
}
Tradingview Pinescript Strategy
Apply your trading strategy script on TradingView. The script should include blocks for backtesting controls, strategy logic, intraday functions, and strategy execution. Here is a sample supertrend trading system with various configurable blocks with intraday, stoploss, target and trailing stoploss controls which fits the stop and reversal trading strategy.
1.Long/Short Module
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Trading Block Description
//Module Name : Long/Short Module
//Coded by Rajandran R (Founder - www.marketcalls.in)
//Version : v1.0
//Coded Date : 20th Dec 2023
//Block 1 : Backtesting Controls & Target and Stoploss Controls
//Block 2 : Trading Strategy and Controls (write your trading strategy in the block
//Block 3 : Intraday Function and Buy and Sell Signal Mapping (Signal Mapping is required)
//Block 4 : Strategy Execution Module
//Block 5 : Strategy Stoploss, Target and Trailing Stoploss Execution Module
///////////////////////////////////////////////////////////////////////////////////////////////////////////
//@version=5
strategy('SuperTrend Trading Strategy with Target/Stoploss/TrailingStoploss', shorttitle='Supertrend Strategy', overlay=true,process_orders_on_close=true)
//Block 1 : Backtesting Controls & Target Stoploss Controls
FromDay = input.int(defval=1, title='From Day', minval=1, maxval=31, group='Backtesting')
FromMonth = input.int(defval=1, title='From Month', minval=1, maxval=12, group='Backtesting')
FromYear = input.int(defval=2018, title='From Year', minval=999, group='Backtesting')
ToDay = input.int(defval=1, title='To Day', minval=1, maxval=31, group='Backtesting')
ToMonth = input.int(defval=1, title='To Month', minval=1, maxval=12, group='Backtesting')
ToYear = input.int(defval=9999, title='To Year', minval=999, group='Backtesting')
start = timestamp(FromYear, FromMonth, FromDay, 00, 00)
finish = timestamp(ToYear, ToMonth, ToDay, 23, 59)
window() =>
time >= start and time <= finish ? true : false
Mode = input.string(title='Algo Mode', defval='ENABLE', options=['ENABLE', 'LONGONLY', 'SHORTONLY'], group='Backtesting')
highlighting = input.bool(title='Highlighter On/Off ?', defval=true, group='Intraday Controls')
barcoloring = input.bool(title='Bar Coloring On/Off ?', defval=true, group='Intraday Controls')
intraday = input.bool(title='Intraday On/Off ?', defval=false, group='Intraday Controls')
marketSession = input.session(title='Market session', defval='0930-1500', confirm=false, group='Intraday Controls')
risk = input.bool(title='Stoploss/Target On/Off', defval=false, group='Stoploss/Target Controls')
type = input.string(title='Type', defval='FIXED', options=['FIXED', 'PERCENTAGE', 'VOLATILITY'], group='Stoploss/Target Controls')
stoploss = input.float(defval=10.0, title='Stoploss', group='Stoploss/Target Controls')
target = input.float(defval=20.0, title='Target', group='Stoploss/Target Controls')
TickSz = input.float(defval=0.05, title='TickSize', group='Stoploss/Target Controls')
ATRMultiplier = input.float(title='ATR Multiplier', step=0.1, defval=1.5, group='Stoploss/Target Controls')
ATRLength = input.int(title='ATR Period', defval=20, group='Stoploss/Target Controls')
iATR = ta.atr(ATRLength)
trail = input.bool(title='Trailing Stoploss On/Off', defval=false, group='Trailstop Controls')
longTrailPerc = input.float(title='Trail Long Stop (%)', minval=0.01, maxval=50.0, step=0.01, defval=1, group='Trailstop Controls') * 0.01
shortTrailPerc = input.float(title='Trail Short Stop (%)', minval=0.01, maxval=50.0, step=0.01, defval=1, group='Trailstop Controls') * 0.01
var longCondition = false
var shortCondition = false
//Tradingview alert_message
string alert_buy = 'Buy'
string alert_sell = 'Sell'
////////////////////////////////////////Block 1 Module Ends////////////////////////////////////////////////////////////////////////
//Block 2 : Trading Strategy
//inputs
src = input(hl2, title='Source', group='Supertrend Controls')
Multiplier = input.float(title='ATR Multiplier', step=0.1, defval=3.0, group='Supertrend Controls')
Periods = input.int(title='ATR Period', defval=10, group='Supertrend Controls')
changeATR = input.bool(title='Change ATR Calculation Method ?', defval=true, group='Supertrend Controls')
showsignals = input.bool(title='Show Buy/Sell Signals ?', defval=true, group='Supertrend Controls')
atr2 = ta.sma(ta.tr, Periods)
atr = changeATR ? ta.atr(Periods) : atr2
up = src - Multiplier * atr
up1 = nz(up[1], up)
up := close[1] > up1 ? math.max(up, up1) : up
dn = src + Multiplier * atr
dn1 = nz(dn[1], dn)
dn := close[1] < dn1 ? math.min(dn, dn1) : dn
trend = 1
trend := nz(trend[1], trend)
trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend
//Plots
upPlot = plot(trend == 1 ? up : na, title='Up Trend', style=plot.style_linebr, linewidth=2, color=color.new(color.green, 0))
buySignal = trend == 1 and trend[1] == -1
plotshape(buySignal ? up : na, title='UpTrend Begins', location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(color.green, 0))
//plotshape(buySignal and showsignals ? up : na, title='Buy', text='Buy', location=location.absolute, style=shape.labelup, size=size.tiny, color=color.new(color.green, 0), textcolor=color.new(color.white, 0))
dnPlot = plot(trend == 1 ? na : dn, title='Down Trend', style=plot.style_linebr, linewidth=2, color=color.new(color.red, 0))
sellSignal = trend == -1 and trend[1] == 1
plotshape(sellSignal ? dn : na, title='DownTrend Begins', location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(color.red, 0))
//plotshape(sellSignal and showsignals ? dn : na, title='Sell', text='Sell', location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.new(color.red, 0), textcolor=color.new(color.white, 0))
mPlot = plot(ohlc4, title='', style=plot.style_circles, linewidth=0)
longFillColor = highlighting ? trend == 1 ? color.new(color.green,90) : na : na
shortFillColor = highlighting ? trend == -1 ? color.new(color.red,90) : na : na
fill(mPlot, upPlot, title='UpTrend Highligter', color=longFillColor)
fill(mPlot, dnPlot, title='DownTrend Highligter', color=shortFillColor)
////////////////////////////////////////Block 2 Module Ends////////////////////////////////////////////////////////////////////////
//Block 3 : Intraday Function and Buy and Sell Signal Mapping
//Remove the comments to do the long/short signal mapping
//buySignal = enterLong
//sellSignal = enterShort
barInSession(sess) =>
time(timeframe.period, sess) != 0
bool intradaySession = barInSession(marketSession)
buy = buySignal
sell = sellSignal
buy1 = buy[1]
sell1 = sell[1]
//assign signals
if(not intraday)
longCondition := buySignal
shortCondition := sellSignal
if(intraday)
longCondition := buySignal and intradaySession
shortCondition := sellSignal and intradaySession
////////////////////////////////////////Block 3 Module Ends////////////////////////////////////////////////////////////////////////
//Block 4 : Execution Controls
if(Mode=="ENABLE")
if longCondition and strategy.position_size == 0 and window()
strategy.entry('BUY', strategy.long, comment='BUY',alert_message = alert_buy)
if longCondition and strategy.position_size < 0 and window()
strategy.entry('BUY', strategy.long, comment='BUY',alert_message = alert_buy)
if shortCondition and strategy.position_size == 0 and window()
strategy.entry('SELL', strategy.short, comment='SELL',alert_message = alert_sell)
if shortCondition and strategy.position_size > 0 and window()
strategy.entry('SELL', strategy.short, comment='SELL',alert_message = alert_sell)
if(Mode=="LONGONLY")
if longCondition and strategy.position_size == 0 and window()
strategy.entry('BUY', strategy.long,comment='BUY',alert_message = alert_buy)
if shortCondition and strategy.position_size > 0 and window()
strategy.close('BUY', comment='BUY EXIT',alert_message = alert_sell)
if(Mode=="SHORTONLY")
if shortCondition and strategy.position_size == 0 and window()
strategy.entry('SELL', strategy.short, comment='SHORT',alert_message = alert_sell)
if longCondition and strategy.position_size < 0 and window()
strategy.close('SELL',comment='SHORT EXIT',alert_message = alert_buy)
if(intraday)
longsquareOff = not intradaySession and strategy.position_size > 0
if(longsquareOff)
strategy.close(id='BUY', comment='Square-off',alert_message = alert_sell)
shortsquareOff = not intradaySession and strategy.position_size < 0
if(shortsquareOff)
strategy.close(id='SELL', comment='Square-off',alert_message = alert_buy)
////////////////////////////////////////Block 4 Module Ends////////////////////////////////////////////////////////////////////////
//Block5 - Stoploss, Target and Trailingstoploss Execution Module
buycount = ta.barssince(buySignal)
sellcount = ta.barssince(sellSignal)
color1 = buycount[1] < sellcount[1] ? color.green : buycount[1] > sellcount[1] ? color.red : na
barcolor(barcoloring ? color1 : na)
long_stop_level = ta.valuewhen(strategy.position_size>0 and strategy.position_size[1]<=0, open - stoploss, 0)
long_profit_level = ta.valuewhen(strategy.position_size>0 and strategy.position_size[1]<=0, open + target, 0)
short_stop_level = ta.valuewhen(strategy.position_size<0 and strategy.position_size[1]>=0, open + stoploss, 0)
short_profit_level = ta.valuewhen(strategy.position_size<0 and strategy.position_size[1]>=0, open - target, 0)
if(type=="PERCENTAGE")
long_stop_level := ta.valuewhen(strategy.position_size>0 and strategy.position_size[1]<=0, open, 0) * (100-stoploss)/100
long_profit_level := ta.valuewhen(strategy.position_size>0 and strategy.position_size[1]<=0, open, 0) * (100+target)/100
long_stop_level := TickSz * math.round(long_stop_level/TickSz)
long_profit_level := TickSz * math.round(long_profit_level/TickSz)
short_stop_level := ta.valuewhen(strategy.position_size<0 and strategy.position_size[1]>=0, open, 0) * (100+stoploss)/100
short_profit_level := ta.valuewhen(strategy.position_size<0 and strategy.position_size[1]>=0, open, 0) * (100-target)/100
short_stop_level := TickSz * math.round(short_stop_level/TickSz)
short_profit_level := TickSz * math.round(short_profit_level/TickSz)
if(type=="VOLATILITY")
long_stop_level := ta.valuewhen(strategy.position_size>0 and strategy.position_size[1]<=0, open - iATR*ATRMultiplier, 0)
long_profit_level := ta.valuewhen(strategy.position_size>0 and strategy.position_size[1]<=0, open + iATR*ATRMultiplier, 0)
short_stop_level := ta.valuewhen(strategy.position_size<0 and strategy.position_size[1]>=0, open + iATR*ATRMultiplier, 0)
short_profit_level := ta.valuewhen(strategy.position_size<0 and strategy.position_size[1]>=0, open - iATR*ATRMultiplier, 0)
//Sending Target/Stoploss Orders
if(risk)
if(strategy.position_size>0)
strategy.exit('TP/SL', 'BUY', stop=long_stop_level, limit=long_profit_level,alert_message = alert_sell)
if(strategy.position_size<0)
strategy.exit('TP/SL', 'SELL', stop=short_stop_level, limit=short_profit_level,alert_message = alert_buy)
plot(strategy.position_size <= 0 or not risk ? na : long_stop_level, color=color.new(color.red, 0), style=plot.style_circles, linewidth=2)
plot(strategy.position_size <= 0 or not risk ? na : long_profit_level, color=color.new(color.green, 0), style=plot.style_circles, linewidth=2)
plot(strategy.position_size >= 0 or not risk ? na : short_stop_level, color=color.new(color.red, 0), style=plot.style_circles, linewidth=2)
plot(strategy.position_size >= 0 or not risk ? na : short_profit_level, color=color.new(color.green, 0), style=plot.style_circles, linewidth=2)
//Initialization of Long Stop Price and Short Stop Price
longStopPrice = 0.0
shortStopPrice = 0.0
//Sending Trailing Stoploss Orders
if(trail)
// Determine trail stop loss prices
longStopPrice := if strategy.position_size > 0
stopValue = close * (1 - longTrailPerc)
math.max(stopValue, longStopPrice[1])
else
0
shortStopPrice := if strategy.position_size < 0
stopValue = close * (1 + shortTrailPerc)
math.min(stopValue, shortStopPrice[1])
else
999999
// Submit exit orders for trail stop loss price
if strategy.position_size > 0
strategy.exit(id='TRAIL HIT', stop=longStopPrice,alert_message = 'S')
if strategy.position_size < 0
strategy.exit(id='TRAIL HIT', stop=shortStopPrice,alert_message = 'B')
// Plot stop loss values for confirmation
plot(series=strategy.position_size > 0 and trail ? longStopPrice : na, color=color.new(color.fuchsia, 0), style=plot.style_cross, linewidth=2, title='Long Trail Stop')
plot(series=strategy.position_size < 0 and trail ? shortStopPrice : na, color=color.new(color.fuchsia, 0), style=plot.style_cross, linewidth=2, title='Short Trail Stop')
2.Buy/Sell/Short/Cover Module
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Trading Block Description
//Module Name : Buy/Sell/Short/Cover Module
//Coded by Rajandran R (Founder - www.marketcalls.in)
//Version : v1.0
//Coded Date : 20th Dec 2023
//Block 1 : Backtesting Controls & Target and Stoploss Controls
//Block 2 : Trading Strategy and Controls (write your trading strategy in the block
//Block 3 : Intraday Function and Buy and Sell Signal Mapping (Signal Mapping is required)
//Block 4 : Strategy Execution Module
///////////////////////////////////////////////////////////////////////////////////////////////////////////
//@version=5
strategy('SuperTrend Trading Strategy with EMA Filter Target/Stoploss/TrailingStoploss', shorttitle='Supertrend EMA Filter Strategy', overlay=true)
//Block 1 : Backtesting Controls & Target Stoploss Controls
FromDay = input.int(defval=1, title='From Day', minval=1, maxval=31, group='Backtesting')
FromMonth = input.int(defval=1, title='From Month', minval=1, maxval=12, group='Backtesting')
FromYear = input.int(defval=2018, title='From Year', minval=999, group='Backtesting')
ToDay = input.int(defval=1, title='To Day', minval=1, maxval=31, group='Backtesting')
ToMonth = input.int(defval=1, title='To Month', minval=1, maxval=12, group='Backtesting')
ToYear = input.int(defval=9999, title='To Year', minval=999, group='Backtesting')
start = timestamp(FromYear, FromMonth, FromDay, 00, 00)
finish = timestamp(ToYear, ToMonth, ToDay, 23, 59)
window() =>
time >= start and time <= finish ? true : false
Mode = input.string(title='Algo Mode', defval='ENABLE', options=['ENABLE', 'LONGONLY', 'SHORTONLY'], group='Backtesting')
highlighting = input.bool(title='Highlighter On/Off ?', defval=true, group='Intraday Controls')
barcoloring = input.bool(title='Bar Coloring On/Off ?', defval=true, group='Intraday Controls')
intraday = input.bool(title='Intraday On/Off ?', defval=false, group='Intraday Controls')
marketSession = input.session(title='Market session', defval='0915-1500', confirm=false, group='Intraday Controls')
var longCondition = false
var shortCondition = false
//Tradingview alert_message
string alert_buy = 'Buy'
string alert_sell = 'Sell'
////////////////////////////////////////Block 1 Module Ends////////////////////////////////////////////////////////////////////////
//Block 2 : Trading Strategy
//input controls
factor = input.float(2.5,"Factor",1.0,10.0,0.5)
length = input.int(10,"ATR Length",1,100,1)
[supertrend,direction] = ta.supertrend(factor,length)
ema200 = ta.ema(close,200)
plot(ema200,"EMA 200",color.yellow,linewidth = 2)
//direction variables contains series of +1 and -1
//supertrend variable contains the supertrend line
supcolor = direction == -1 ? color.green : color.red
plot(supertrend,"Supertrend",supcolor,linewidth = 2)
//Trading Logic
buySignal = direction == -1 and close > ema200
sellSignal = direction == 1
shortSignal = direction == 1 and close < ema200
coverSignal = direction == -1
////////////////////////////////////////Block 2 Module Ends////////////////////////////////////////////////////////////////////////
//Block 3 : Intraday Function and Buy and Sell Signal Mapping
//Remove the comments to do the long/short signal mapping
//buySignal = tbuy
//sellSignal = tsell
//shortSignal = tshort
//coverSignal = tcover
barInSession(marketSession) =>
time(timeframe.period, marketSession) != 0
bool intradaySession = barInSession(marketSession)
buy = buySignal
sell = sellSignal
short = shortSignal
cover = coverSignal
buy1 = buy[1]
sell1 = sell[1]
short1 = short[1]
cover1 = cover[1]
//assign signals
if(not intraday)
buy := buySignal
short := shortSignal
if(intraday)
buy := buy and intradaySession
short := short and intradaySession
////////////////////////////////////////Block 3 Module Ends////////////////////////////////////////////////////////////////////////
//Block 4 : Execution Controls
if(Mode=="ENABLE")
//Fresh Long Entry
if buy and not cover and strategy.position_size == 0 and window()
strategy.entry('buy',strategy.long,comment='BUY',alert_message = alert_buy)
if buy and cover and strategy.position_size == 0 and window()
strategy.entry('buy',strategy.long,comment='BUY',alert_message = alert_buy)
//Stop and Reverse to Buy
if buy and cover and strategy.position_size < 0 and window()
strategy.entry('buy',strategy.long,comment='BUY',alert_message = alert_buy)
//Long Exit
if sell and not short and strategy.position_size > 0 and window()
strategy.close('buy',comment='SELL',alert_message = alert_sell)
//Fresh Short Entry
if short and not sell and strategy.position_size == 0 and window()
strategy.entry('short',strategy.short,comment='SHORT',alert_message = alert_sell)
if short and sell and strategy.position_size == 0 and window()
strategy.entry('short',strategy.short,comment='SHORT',alert_message = alert_sell)
//Stop and Reverse to Buy
if short and sell and strategy.position_size > 0 and window()
strategy.entry('short',strategy.short,comment='SHORT',alert_message = alert_sell)
//Short Exit
if cover and not buy and strategy.position_size < 0 and window()
strategy.close('short',comment='COVER',alert_message = alert_buy)
if(Mode=="LONGONLY")
//Fresh Long Entry
if buy and not cover and strategy.position_size == 0 and window()
strategy.entry('buy',strategy.long,comment='BUY',alert_message = alert_buy)
if buy and cover and strategy.position_size == 0 and window()
strategy.entry('buy',strategy.long,comment='BUY',alert_message = alert_buy)
//Stop and Reverse to Buy
if buy and cover and strategy.position_size < 0 and window()
strategy.entry('buy',strategy.long,comment='BUY',alert_message = alert_buy)
//Long Exit
if sell and not short and strategy.position_size > 0 and window()
strategy.close('buy',comment='SELL',alert_message = alert_sell)
if(Mode=="SHORTONLY")
//Fresh Short Entry
if short and not sell and strategy.position_size == 0 and window()
strategy.entry('short',strategy.short,comment='SHORT',alert_message = alert_sell)
if short and sell and strategy.position_size == 0 and window()
strategy.entry('short',strategy.short,comment='SHORT',alert_message = alert_sell)
//Stop and Reverse to Buy
if short and sell and strategy.position_size > 0 and window()
strategy.entry('short',strategy.short,comment='SHORT',alert_message = alert_sell)
//Short Exit
if cover and not buy and strategy.position_size > 0 and window()
strategy.close('short',comment='COVER',alert_message = alert_buy)
if(intraday)
longsquareOff = not intradaySession and strategy.position_size > 0
if(longsquareOff)
strategy.close(id='BUY', comment='Square-off',alert_message = alert_sell)
shortsquareOff = not intradaySession and strategy.position_size < 0
if(shortsquareOff)
strategy.close(id='SELL', comment='Square-off',alert_message = alert_buy)
////////////////////////////////////////Block 4 Module Ends////////////////////////////////////////////////////////////////////////
Alert Configuration on TradingView:
- After applying the strategy to the charts, create a strategy alert.
2.Enter the strategy name and the configured TradingView alert message.
3.In the alert box, go to the Notifications tab, enable webhook, and enter the 5Paisa webhook URL.
Trade Execution
Once configured, TradingView will send automated orders to 5 Paisa based on the alerts set up by your trading strategy.
Leveraging webhooks to automate trading strategies offers a significant advantage for traders who rely on technical analysis for their trading decisions. This automation streamlines the trading execution, allowing for quicker and more effective trades. This efficiency often results in superior entry and exit points, enhancing overall trading outcomes.