Rajandran R Creator of OpenAlgo - OpenSource Algo Trading framework for Indian Traders. Telecom Engineer turned Full-time Derivative Trader. Mostly Trading Nifty, Banknifty, High Liquid Stock Derivatives. Trading the Markets Since 2006 onwards. Using Market Profile and Orderflow for more than a decade. Designed and published 100+ open source trading systems on various trading tools. Strongly believe that market understanding and robust trading frameworks are the key to the trading success. Building Algo Platforms, Writing about Markets, Trading System Design, Market Sentiment, Trading Softwares & Trading Nuances since 2007 onwards. Author of Marketcalls.in

Supertrend Strategy with Intraday Controls, Target and Stoploss Module – Tradingview Pinescript

5 min read

Here is a sample pinescript strategy module for those who are looking for building targets, stop loss, and intraday controls to automate their trading strategy from Tradingview using Algomojo Trading Platform.

Looking for Automating your trades in tradingview? Here is the easiest way to integrate any of your tradingview pinescript strategy using Algomojo – Tradingview Pinescript Library

Type of Stoploss/Target Controls Provides

1)Fixed Stoploss
2)Percentage Stoploss
3)Volatility based ATR Stoploss

Controls to switch between Intraday/Positional strategy, Controls to enable/disable stoploss and targets and session timing controls are added to the trading strategy.

feel free to add your comments on what more ready-made modules are required to keep the automation as simple as possible.

Sample Pinescript Trading Strategy

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © tradestudio
// Algomojo Trading Strategy Carry Forward Strategy/Intraday Strategy with Target/Stoploss
// Supertrend Version 1.0
// Code Date : 17th Dec 2021
// Coded by Rajandran R (Founder - Marketcalls / Co-Founder - Algomojo)


//@version=5
strategy('SuperTrend Algomojo Trading Strategy with Target/Stoploss', shorttitle='Supertrend Algomojo', overlay=true)


import algomojo/automation/14

//Block 1 : API Controls + Algomojo Input Controls


//Enter Your Algomojo API Key and API Secret Key

am_client_id = input.string(title='Client ID', defval='ZZ0011', group='AlgoControls')
am_api_key = input.string(title='API Key', defval='xxxxx', group='AlgoControls')
am_api_secret = input.string(title='API Secret Key', defval='xxxxx', group='AlgoControls')
am_broker = input.string(title='Broker', defval='ALICEBLUE', options=['ALICEBLUE', 'ANGELONE', 'FIRSTOCK', 'FYERS','MASTERTRUST','SAMCO','TRADEJINI','UPSTOX','ZEBU','ZERODHA'], group='AlgoControls')
am_strategy = input.string(title='Strategy Name', defval='Supertrend Strategy', group='AlgoControls')
am_symbol = input.string(title='Trading Symbol', defval='RELIANCE-EQ', group='AlgoControls')
am_exchange = input.string(title='Exchange', defval='NSE', options=['NSE', 'NFO', 'MCX', 'BSE'], group='AlgoControls')
am_quantity = input.int(title='Quantity', defval=1, group='AlgoControls')
am_OrderType = input.string(title='Order Type', defval='MARKET', group='AlgoControls')
am_Product = input.string(title='Product', defval='NORMAL', options=['NORMAL', 'INTRADAY', 'DELIVERY', 'MARGIN'], group='AlgoControls')
am_Mode = input.string(title='Algo Mode', defval='ENABLE', options=['ENABLE', 'LONGONLY', 'SHORTONLY'], group='AlgoControls')


////////////////////////////////////////Block 1 Module Ends////////////////////////////////////////////////////////////////////////



//Block 2 : Autotrading API data configuration

[BE,SX,BSR,SE,BX,SSR] = automation.algomodule(am_client_id, am_api_key,am_api_secret,am_broker,am_strategy,am_symbol,am_exchange,am_quantity,am_OrderType, am_Product)


////////////////////////////////////////Block 2 Module Ends////////////////////////////////////////////////////////////////////////

//Block 3 : Backtesting Controls & Live Automation Purpose

FromMonth = input.int(defval=9, title='From Month', minval=1, maxval=12, group='Backtesting')
FromDay = input.int(defval=1, title='From Day', minval=1, maxval=31, group='Backtesting')
FromYear = input.int(defval=2018, title='From Year', minval=999, group='Backtesting')
ToMonth = input.int(defval=1, title='To Month', minval=1, maxval=12, group='Backtesting')
ToDay = input.int(defval=1, title='To Day', minval=1, maxval=31, 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


////////////////////////////////////////Block 3 Module Ends////////////////////////////////////////////////////////////////////////



//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')
highlighting = input.bool(title='Highlighter On/Off ?', defval=true, group='Supertrend Controls')
barcoloring = input.bool(title='Bar Coloring On/Off ?', defval=true, group='Supertrend Controls')

intraday = input.bool(title='Intraday On/Off ?', defval=false, group='Intraday Controls')
marketSession = input.session(title='Market session', defval='0915-1500', confirm=true, 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)

var longCondition = false
var shortCondition = false


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)


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 4 : Execution Controls
if(am_Mode=="ENABLE")
    if longCondition and strategy.position_size == 0
        strategy.entry('BUY', strategy.long, when=window(), alert_message=BE,comment='BUY')
    if longCondition and strategy.position_size < 0
        strategy.entry('BUY', strategy.long, when=window(), alert_message=BSR,comment='BUY')
    if shortCondition and strategy.position_size == 0
        strategy.entry('SELL', strategy.short, when=window(), alert_message=SE,comment='SELL')
    if shortCondition and strategy.position_size > 0
        strategy.entry('SELL', strategy.short, when=window(), alert_message=SSR,comment='SELL')
        
if(am_Mode=="LONGONLY")
    if longCondition and strategy.position_size == 0
        strategy.entry('BUY', strategy.long, when=window(), alert_message=BE,comment='BUY')
    if shortCondition and strategy.position_size > 0
        strategy.close('BUY', when=window(),  alert_message=BX,comment='BUY EXIT')    

if(am_Mode=="SHORTONLY")
    if shortCondition and strategy.position_size == 0
        strategy.entry('SELL', strategy.short, when=window(), alert_message=SE,comment='SHORT')
    if longCondition and strategy.position_size < 0
        strategy.close('SELL', when=window(), alert_message=SX,comment='SHORT EXIT')

if(intraday)
    longsquareOff = not intradaySession and strategy.position_size > 0 
    strategy.close(id='BUY', when=longsquareOff, comment='Square-off',alert_message=BX)
    shortsquareOff = not intradaySession and strategy.position_size < 0 
    strategy.close(id='SELL', when=shortsquareOff, comment='Square-off',alert_message=SX)

////////////////////////////////////////Block 4 Module Ends////////////////////////////////////////////////////////////////////////

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(buy1, open - stoploss, 0)
long_profit_level = ta.valuewhen(buy1, open + target, 0)
short_stop_level = ta.valuewhen(sell1, open + stoploss, 0)
short_profit_level = ta.valuewhen(sell1, open - target, 0)

if(type=="PERCENTAGE")
    long_stop_level := ta.valuewhen(buy1, open, 0) * (100-stoploss)/100
    long_profit_level := ta.valuewhen(buy1, 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(sell1, open, 0) * (100+stoploss)/100
    short_profit_level := ta.valuewhen(sell1, 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(buy1, open - iATR*ATRMultiplier, 0)
    long_profit_level := ta.valuewhen(buy1, open + iATR*ATRMultiplier, 0)
    short_stop_level := ta.valuewhen(sell1, open + iATR*ATRMultiplier, 0)
    short_profit_level := ta.valuewhen(sell1, open - iATR*ATRMultiplier, 0)

if(risk)
    if(strategy.position_size>0)
        strategy.exit('TP/SL', 'BUY', stop=long_stop_level, limit=long_profit_level,alert_message=BX)
    if(strategy.position_size<0)
        strategy.exit('TP/SL', 'SELL', stop=short_stop_level, limit=short_profit_level,alert_message=SX)
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)

Rajandran R Creator of OpenAlgo - OpenSource Algo Trading framework for Indian Traders. Telecom Engineer turned Full-time Derivative Trader. Mostly Trading Nifty, Banknifty, High Liquid Stock Derivatives. Trading the Markets Since 2006 onwards. Using Market Profile and Orderflow for more than a decade. Designed and published 100+ open source trading systems on various trading tools. Strongly believe that market understanding and robust trading frameworks are the key to the trading success. Building Algo Platforms, Writing about Markets, Trading System Design, Market Sentiment, Trading Softwares & Trading Nuances since 2007 onwards. Author of Marketcalls.in

Introducing OpenAlgo V1.0: The Ultimate Open-Source Algorithmic Trading Framework…

OpenAlgo V1.0 is an open-source algorithmic trading platform to automate your trading strategies using Amibroker, Tradingview, Metatrader, Python etc. Designed with the modern trader...
Rajandran R
2 min read

Dive Into the TradingView Paper Trading Competition: A Chance…

Welcome to an exhilarating opportunity presented by TradingView – a paper trading competition that not only tests your trading acumen but also offers a...
Rajandran R
1 min read

Introducing PineGPT – To Build Better Tradingview Pinescript Codes

PineGPT is a customGPT for ChatGPT4 users designed to provide expert guidance on creating and understanding TradingView Pine Script indicators and trading strategies. PineGPT...
Rajandran R
1 min read

One Reply to “Supertrend Strategy with Intraday Controls, Target and Stoploss Module…”

Leave a Reply

Get Notifications, Alerts on Market Updates, Trading Tools, Automation & More