Introducing Webhook Alerts : Direct Order Placements on TradingView from Dhan

Heloo Naman sir

I m placing order via web hook one time order is fine but how to exit from position

Hello,

I have a question regarding a scenario:

Let’s say I create a basket comprising top high-volume and high-momentum stocks and generate a webhook URL associated with this basket.

Next, I create a custom Pine Script alert for both entry and exit separately.

Suppose, upon the alert triggering for entry, I automatically enter a long position with 100 quantity of any stock from the basket.

Now, for the exit, can I utilize a custom exit alert that is distinct from the entry alert? The exit criteria might involve combining EMA and RSI indicators.

However, the concern arises regarding defining profit targets and trailing stop-loss. Should these parameters be defined in the entry position itself when creating the webhook URL for entry?

Additionally, will there be a separate webhook URL for exiting the same position?

Things i am confused about

  • assuming that there are 50 alerts on standby for 50 stocks will all 50 alerts gets triggered in the dhan platform also will it adust my capitlal for each trade to enter.
  • also the json for basket needs to be attached to the custom script for both entry and exit seprately ?

HI Admin

Can u Plz Help Me automation Of flowing Indicator

This is My Indicator (Pinescriptcode)

// @version=5
// Open-Range-Breakout strategy
// No license. Free and Open Source.

strategy(‘Strategy: ORB’, shorttitle=“ORB”, overlay=true , currency=currency.NONE, initial_capital=100000)

// Inputs
period = input.int(defval=15, title=“TimeRange”, tooltip=“The range in minutes (default: 15m)”)
sessionInput = input.session(defval=“0915-0930”, title=“Time Range”, group=“ORB settings”, tooltip=‘What is the timeperiod (default 9:15AM to 9:30AM, exchange timezone’)
hide = input.bool(defval = false, title=“Hide ORB Range”, group=“ORB setting”, tooltip = ‘Hide the ORB range drawing’)

// SL Related
slAtrLen = input.int(defval=14, title=“ATR Period for placing SL”, group=“StopLoss settings”)
showSLLines = input.bool(defval=false, title=“Show SL lines in chart”, tooltip=“Show SL lines also as dotted lines in chart. Note: chart may look untidy.”, group=“StopLoss settings”)

// Further Filtering
ignoreMementumVolume = input.bool(defval=false, title=“Ignore Momentum & Volume”, tooltip=“Ignore Momentum & Volume to find out trades”, group=“Strengh Settings”)
rsiLen = input.int(defval=14, title=“Momentum Period”, group=“Strengh Settings”, tooltip = ‘To determine the momentum, RSI period is set default to 100’)
rsiBullish = input.int(defval=50, step=1, title=“Bullish Momentum”, group=“Strengh Settings”, tooltip = ‘Bullish Momentum, default set to RSI as 50’)
rsiBearish = input.int(defval=50, step=1, title=“Bearish Momentum”, group=“Strengh Settings”, tooltip = ‘Bearish Momentum, default set to RSI as 50’)
volAvg = input.int(defval=20, step=1, title=“Volume Average Period”, group=“Strengh Settings”, tooltip = ‘To calculate average volume, how many historical bars are considered. Default: 20.’)
volThreshold = input.float(defval=1, step=0.1, title=“Volume Strengh”, group=“Strengh Settings”, tooltip = ‘Multiplier: How big the current bar volume compared to average of last 20’)

trendPeriod = input.int(defval=200, step=1, title=“Trend Period”, group=“Trend Settings”, tooltip = ‘To calculate trend, what period is considered. Default: 200.’)
hideTrend = input.bool(defval = false, title=“Hide the trend line”, group=“Trend Settings”, tooltip = ‘Hide the trend’)

hidePDHCL = input.bool(defval = false, title=“Hide the PDHCL (prev day High Close Low range) & VWAP”, tooltip = ‘Hide the Previous Day High, Close, Low lines, including VWAP’)

hideTable = input.bool(defval = false, title=“Hide the Summary Table”, tooltip = ‘Hide the summary table.’)

// Trade related
rrRatio = input.float(title=‘Risk:Reward’, step=0.1, defval=2.0, group=“Trade settings”)
endOfDay = input.int(defval=1500, title=“Close all trades, default is 3:00 PM, 1500 hours (integer)”, group=“Trade settings”)
mktAlwaysOn = input.bool(defval=true, title=“Markets that never closed (Crypto, Forex, Commodity)”, tooltip=“Some markers never closes. For those cases, make this checked.”, group=“Trade settings”)
lotSize = input.int(title=‘Lot Size’, step=1, defval=1, group=“Trade settings”)

// Util method

is_newbar(res) =>
timeframe.change(time(res)) != 0

annotatePlots(txt, val, hide) =>
if (not hide)
var l1 = label.new(bar_index, hidePDHCL ? na : val, txt, style=label.style_label_left, size = size.tiny, textcolor = color.white, tooltip = txt)
label.set_xy(l1, bar_index, hidePDHCL ? na : val)

// print table
printTable(txt) =>
var table t = table.new(position.bottom_right, 1, 1)
table.cell(t, 0, 0, txt, text_halign = text.align_left, bgcolor = color.lime)

// globals
t = time(timeframe.period, sessionInput + “:1234567”) // everyday
in_session = not na(t)
is_first = in_session and not in_session[1]
is_end_session = in_session[1] and not in_session
green(open, close) => close > open ? true : false
red(open, close) => close < open ? true : false

var float orb_high = na
var float orb_low = na
if is_first
orb_high := high
orb_low := low
else
orb_high := orb_high[1]
orb_low := orb_low[1]
if high > orb_high and in_session
orb_high := high
if low < orb_low and in_session
orb_low := low

plot(hide ? na : orb_high, style=plot.style_line, color=orb_high[1] != orb_high ? na : color.green, title=“ORB High”, linewidth=2)
annotatePlots(‘ORB-H’, orb_high, hide)
plot(hide ? na : orb_low, style=plot.style_line, color=orb_low[1] != orb_low ? na : color.red, title=“ORB Low”, linewidth=2)
annotatePlots(‘ORB-L’, orb_low, hide)

// PDHCL (Previous Day High Close Low)
[dh,dl,dc] = request.security(syminfo.ticker, “D”, [high[1],low[1], close[1]], lookahead=barmerge.lookahead_on)
plot(hidePDHCL ? na : dh, title=“Prev High”, color=color.red, linewidth=2, trackprice=true, show_last = 1)
annotatePlots(‘PDH’, dh, hidePDHCL)
plot(hidePDHCL ? na : dl, title=“Prev Low”, color=color.green, linewidth=2, trackprice=true, show_last = 1)
annotatePlots(‘PDL’, dl, hidePDHCL)
plot(hidePDHCL ? na : dc, title=“Prev Close”, color=color.black, linewidth=2, trackprice=true, show_last = 1)
annotatePlots(‘PDC’, dc, hidePDHCL)
plot(hidePDHCL ? na : ta.vwap(close), title=“VWAP”, color=color.fuchsia, linewidth=2, trackprice=true, show_last = 1)
annotatePlots(‘VWAP’, ta.vwap(close), hidePDHCL)

// For SL calculation
atr = ta.atr(slAtrLen)
highestHigh = ta.highest(high, 7)
lowestLow = ta.lowest(low, 7)
longStop = showSLLines ? lowestLow - (atr * 1) : na
shortStop = showSLLines ? highestHigh + (atr * 1) : na
plot(longStop, title=“Buy SL”, color=color.green, style=plot.style_cross)
plot(shortStop, title=“Sell SL”, color=color.red, style=plot.style_cross)
annotatePlots(‘SL-Long’, longStop, showSLLines)
annotatePlots(‘SL-Short’, shortStop, showSLLines)

// Momentum: rsi
rsi = ta.rsi(close, rsiLen)

// trend: EMA200
ema = ta.ema(close, trendPeriod)
plot(hideTrend ? na : ema, “EMA Trend”, color=close > ema ? color.green : color.red, linewidth = 1)
annotatePlots(‘Trendline’, ema, hideTrend)

// Volume-Weighed Moving Average calculation
vwmaAvg = ta.vwma(close, volAvg)
vwma_latest = volume
// plotshape((barstate.isconfirmed and (vwma_latest > (vwmaAvg * volThreshold))), title=‘VolumeData’, text=‘’, location=location.abovebar, style=shape.diamond, color=color.gray, textcolor=color.gray, size=size.tiny)

// Trade signals

longCond = barstate.isconfirmed and (ta.crossover(close, orb_high) or ta.crossover(close, dh)) and green(open, close) and (ignoreMementumVolume ? true : rsi > rsiBullish and (vwma_latest > (vwmaAvg * volThreshold)))
shortCond = barstate.isconfirmed and (ta.crossunder(close, orb_low) or ta.crossunder(close, dl)) and red(open, close) and (ignoreMementumVolume ? true : rsi < rsiBearish and (vwma_latest > (vwmaAvg * volThreshold)))

plotshape(longCond, title=‘Breakout’, text=‘BO’, location=location.belowbar, style=shape.triangleup, color=color.green, textcolor=color.green)
plotshape(shortCond, title=‘Breakout’, text=‘BD’, location=location.abovebar, style=shape.triangledown, color=color.red, textcolor=color.red)

// Trade execute
h = hour(time(‘1’), syminfo.timezone)
m = minute(time(‘1’), syminfo.timezone)
hourVal = h * 100 + m
totalTrades = strategy.opentrades + strategy.closedtrades
if (mktAlwaysOn or (hourVal < endOfDay))
// Entry
var float sl = na
var float target = na
if (longCond)
strategy.entry(“enter long”, strategy.long, lotSize, limit=na, stop=na, comment=“Enter Long”)
sl := longStop
target := close + ((close - longStop) * rrRatio)
alert(‘Buy:’ + syminfo.ticker + ’ ,SL:’ + str.tostring(math.floor(sl)) + ‘, Target:’ + str.tostring(target), alert.freq_once_per_bar)
if (shortCond)
strategy.entry(“enter short”, strategy.short, lotSize, limit=na, stop=na, comment=“Enter Short”)
sl := shortStop
target := close - ((shortStop - close) * rrRatio)
alert(‘Sell:’ + syminfo.ticker + ’ ,SL:’ + str.tostring(math.floor(sl)) + ‘, Target:’ + str.tostring(target), alert.freq_once_per_bar)

// Exit: target or SL
if ((close >= target) or (close <= sl))
    strategy.close("enter long", comment=close < sl ? "Long SL hit" : "Long target hit")
if ((close <= target) or (close >= sl))
    strategy.close("enter short", comment=close > sl ? "Short SL hit" : "Short target hit")

else if (not mktAlwaysOn)
// Close all open position at the end if Day
strategy.close_all(comment = “Close all entries at end of day.”)

// Plotting table
if (not hideTable and is_end_session)
message = syminfo.ticker + " :\n\nORB Upper: " + str.tostring(math.round(orb_high)) + "\nORB Lower: " + str.tostring(math.round(orb_low)) + "\nPDH: " + str.tostring(math.round(dh)) + "\nPDC: " + str.tostring(math.round(dc)) + "\nPDL: " + str.tostring(math.round(dl)) + "\nVWAP: " + str.tostring(math.round(ta.vwap(close)))
printTable(message)
alert(message, alert.freq_once_per_bar_close)

And This Is Json Message

{
“secret”: “wnflA”,
“alertType”: “multi_leg_order”,
“order_legs”: [
{
“transactionType”: “{{strategy.order.alert_message}}”,
“orderType”: “MKT”,
“quantity”: “{{strategy.order.contracts}}”,
“exchange”: “NSE”,
“symbol”: “HCLTECH”,
“instrument”: “EQ”,
“productType”: “I”,
“sort_order”: “1”,
“price”: “0”
}
]
}

I M getting alert in trading view but not Placing order on dhan via webhook plz helpme with that

Hi, team - I am using webhooks to place an order via Tradingview.
Now, I need to understand how I can use webhooks to exit out of the trade as well.
Example: I have a horizontal line at 200, and the webhooks place a buy order for 10 lots when the candles cross that line.
Now, how can I use webhooks to exit when the price crosses 210? I can create a line at 210 to specify my target. Thanks!

Hello @PravinJ @Naman @RahulDeshpande - Need your support here. I and many on this thread have raised a query about how to exit from an open position using webhooks. Can you please provide your views on this? Thanks much!

Hi @LotOfOptions Exit can also be triggered the same way via webhooks via alerts. Many users have automated this completely with Dhan + TradingView.

Thanks for the reply. It’s good to get the confirmation that it’s possible. If you can direct me to a post that describes how it’s done, it would be great.

Thanks again.

@LotOfOptions u can get a sample code here.

I’m facing problem in placing order with DHAN Webhook system as webhook is only makes entry position and not exit due to target or SL.
My trading view strategy is making both position, entry and exit but dhan is taking only one, please guide me.

@Arpit_Gupta the code shared here shows how u can exit as well

Hello @Hardik ,

I am reaching out if the bracket order is available in Dhan webhook, If not is there any timeline for the implementation.

Hello @jayaraman

Not right now. We are coming up with some updates on orders and post that, will iterate on webhook orders as well.

I have created webhook url, its active. configured in tradingview as explained in documentation. alerts generated are not received at dhan. what could be wrong?

  1. Did you generate JSON after generating the webhook url ?
  2. Does your alert log message match the generated JSON ?

how to create json for strategy? example if supertrend buy and sell triged
automatically order place … in one alert

@RahulDeshpande @Naman @PravinJ what is the rate limit for webhook orders? Currently I am seeing there is lag of 1-2 seconds in execution if 4-5 orders are executed by webhook.

Also I would like to know the impact of sebi regulations on webhook orders. Does it come under API based algo trading?

Hello @Rajendra

Good to see you after so long. There is no rate limits on Webhook Orders, as it is coming from TradingView itself. If you are seeing lag in execution, would request you to kindly share the Client ID and time when you faced this lag, will monitor response times.

On the SEBI regulation, Webhook Orders will not fall under API based algo trading, as the mechanism of this is very different. First of all, the source of all orders remains TradingView.com, when you are using webhooks, making sure we know the source.
Second, TradingView itself does not allow automation of trading, meaning you cannot simply connect Dhan on TV and try automating your strategies.
Dhan Webhooks are inherently alert based execution, which is not in purview of algo trading as of now, as it is semi-automation at best.

Hi Hardik, Thanks for your wonderful explanation. I am 1-2 seconds lag but that’s still ok I believe. If I see further issues, I will definitely connect with you guys.

1 Like