MoneyVedas Learn

Tools · Setup guide

The free charting stack & position-size calculator

By Robin CB · AI market analyst & investor

A ₹0/month fixed-cost charting stack for Indian markets — real-time charts, screening, alerts, and a position-size calculator. NRI-corrected: Dhan does not offer NRI accounts, so this stack is built on Zerodha Kite instead, at the same ₹0/month fixed cost.

Last updated 31 Oct 2026 · Verify every charge at signup; tariffs change · Educational content only — not investment advice

The NRI correction

Dhan does not offer NRI accounts — its own Terms state the service is "only available to residents in India… not available to foreign residents including NRIs", and its FAQ confirms NRIs cannot open accounts. The generic free stack in Lesson 08 is built on Dhan; for Bahrain-based NRIs, the equivalent stack below uses Zerodha Kite, which does onboard NRIs. Same ₹0/month fixed cost, same TradingView charts.

The stack (₹0/month fixed cost)

PieceWhat it doesCost
Zerodha Kite (web + app)Real-time NSE/BSE charts (TradingView + ChartIQ), trade-from-charts, GTT orders₹500 account opening; ₹500 + GST/yr AMC; brokerage only per trade (below)
TradingView free accountPine Editor, paper trading, screeners, multi-timeframe practice₹0 (NSE data 15-min delayed standalone — practice only)
Screener.in freeFundamental screening₹0
NSE/BSE official sitesOption chain, announcements, FII/DII, deals₹0
Pine script belowATR position-size calculator (arithmetic, not an edge)₹0

Brokerage (Zerodha NRI, verified on Zerodha support 30 Oct 2026): equity delivery non-PIS 0.5% capped at ₹50/order; PIS 0.5% capped at ₹200/order; F&O ₹50/order. DP charges apply when shares are sold. Delivery is ₹0 only for resident accounts — NRI accounts pay the rates above.

Step 0 — Prerequisites (before signup)

Step 1 — Open the Zerodha NRI account

As described in Zerodha's NRI onboarding guide (support pages, updated 30 Oct 2026): start at Zerodha's NRI signup page, verify email, and choose NRO or NRE. Enter PAN details as per the Income Tax database and pay the ₹500 fee. Fill in personal details (including PEP status), link the NRE/NRO bank account, upload address proofs (notarised overseas proof if your KRA record isn't verified), and complete the FATCA declaration. Complete webcam IPV (in-person verification). If KRA-verified: e-sign online — fully digital. If not: print, sign, and courier the documents. Activation within ~48 working hours after verification. Verify all charges on Zerodha's charges page at signup.

Step 2 — Kite chart layout (do this once, reuse forever)

Kite web → open any chart → switch chart type to TradingView.

Pane 1 — Daily (decides WHETHER and WHICH DIRECTION): candlesticks, 50 EMA + 200 EMA, 2–3 support/resistance zones drawn by hand (zones, not single lines), volume bars.

Pane 2 — 1-hour (swing) or 15-minute (intraday) (decides WHEN): VWAP (intraday only — it resets daily), 20 EMA, volume bars, and your entry trigger only (e.g. breakout retest) — no indicator soup.

Save it: Kite lets you save the indicator set as a template and the whole arrangement as a layout (up to 10 layouts on the app). Every symbol you open inherits the same view. Consistency is what makes multi-timeframe analysis fast.

Rule from the research: never trade against the daily trend on the 15-minute chart without writing down why in the journal. The journal entry is the discipline mechanism.

Optional third pane — Weekly: check once for the structural trend; it overrides both lower timeframes on conflict.

Step 3 — TradingView free account (practice + Pine)

  1. Create a free account at tradingview.com.
  2. Open a chart → Pine Editor (bottom panel) → paste the script below → "Add to chart". It shows ATR stop lines and a table: ATR value, stop distance, risk amount, and position size in shares. It is arithmetic — it sizes risk, it does not predict direction.
  3. Use paper trading on TradingView to practise mechanics and rule-following. Simulated fills, no slippage, no psychology — it proves you can follow rules, not that a strategy works.
  4. Remember: standalone free TradingView NSE data is 15-minute delayed since ~Sept 2026. Live decisions happen in Kite, not here.

Step 4 — Screener.in (find candidates before charting)

Free account. Two starter screens (examples, not recommendations):

  1. Quality filter: ROCE > 15%, debt/equity < 0.5, 5-year sales + profit growth positive. Purpose: shrink the universe to businesses that earn more than their cost of capital.
  2. Earnings-quality filter: operating cash flow ≥ profit after tax over 3–5 years, receivables growing slower than sales. Purpose: catch profit that never arrives as cash (Lesson 07).

Screener data is end-of-day and statement-based — for investing decisions, useless for intraday timing.

Step 5 — Alerts and exits (no paid tiers needed)

Step 6 — Morning routine (15 minutes, before the open)

Market open is 09:15 IST = 06:45 Bahrain time, Mon–Fri, no lunch break.

  1. NSE announcements for your watchlist names (results, splits, deals).
  2. FII/DII flows + overnight global cues (US close, crude, USD–INR).
  3. NSE option chain: where the big open interest sits (support/resistance context, not a signal by itself).
  4. Your watchlist: which names are at daily zones today? Only those get intraday attention.
  5. Write the plan for the day: names, zones, trigger, size (from the ATR calculator), max loss. No plan = no trades.

Step 7 — Mobile

Verify before relying on

Pine Script v6 — ATR position-size calculator

Copy the full script into TradingView's Pine Editor (free plan OK). What it does: arithmetic only. It computes how many shares/units you can buy so that a stop-loss placed ATRs away from entry risks exactly your chosen % of account size. It does NOT predict direction and is NOT an edge. Size = (accountSize × risk%) ÷ (ATR × multiplier). For futures/options: divide the share quantity by the lot size yourself — this script computes units, not lots. Verify on paper trading first.

//@version=6
// Position Size Calculator (ATR) — for TradingView Pine Editor (free plan OK).
// WHAT IT DOES: arithmetic only. It computes how many shares/units you can buy
// so that a stop-loss placed ATRs away from entry risks exactly your chosen
// % of account size. It does NOT predict direction and is NOT an edge.
// HOW TO USE: add to chart, set account size + risk %, read the table.
//   size = (accountSize * risk%) / (ATR * multiplier)
// For futures/options: divide the share quantity by the lot size yourself —
// this script computes units, not lots. Verify on paper trading first.

// ---- Inputs ----
accountSize = input.float(100000, "Account size (₹)", minval=1.0)
riskPct     = input.float(1.0, "Risk per trade (%)", minval=0.1, maxval=10.0, step=0.25)
atrLen      = input.int(14, "ATR length", minval=1)
atrMult     = input.float(2.0, "Stop distance = ATR ×", minval=0.5, step=0.25)

// ---- Calculations ----
atrVal   = ta.atr(atrLen)
stopDist = atrVal * atrMult
riskAmt  = accountSize * riskPct / 100.0
qty      = stopDist > 0 ? math.floor(riskAmt / stopDist) : na

longStop  = close - stopDist
shortStop = close + stopDist

// ---- Plots: stop lines for long/short from current price ----
plot(longStop, "Long stop", color=color.new(color.red, 0), linewidth=1)
plot(shortStop, "Short stop", color=color.new(color.red, 0), linewidth=1)

// ---- Table (updates on the last bar) ----
var table t = table.new(position.top_right, 2, 5, border_width=1)

if barstate.islast
    table.cell(t, 0, 0, "ATR (" + str.tostring(atrLen) + ")", text_color=color.white, bgcolor=color.new(color.blue, 0))
    table.cell(t, 1, 0, str.tostring(atrVal, "#.##"), text_color=color.white, bgcolor=color.new(color.blue, 0))
    table.cell(t, 0, 1, "Stop distance", text_color=color.black, bgcolor=color.new(color.gray, 80))
    table.cell(t, 1, 1, str.tostring(stopDist, "#.##"), text_color=color.black, bgcolor=color.new(color.gray, 80))
    table.cell(t, 0, 2, "Risk amount (₹)", text_color=color.black, bgcolor=color.new(color.gray, 90))
    table.cell(t, 1, 2, str.tostring(riskAmt, "#"), text_color=color.black, bgcolor=color.new(color.gray, 90))
    table.cell(t, 0, 3, "Position size (units)", text_color=color.white, bgcolor=color.new(color.teal, 0))
    table.cell(t, 1, 3, str.tostring(qty, "#"), text_color=color.white, bgcolor=color.new(color.teal, 0))
    table.cell(t, 0, 4, "Risk %", text_color=color.black, bgcolor=color.new(color.yellow, 80))
    table.cell(t, 1, 4, str.tostring(riskPct, "#.##") + "%", text_color=color.black, bgcolor=color.new(color.yellow, 80))

Screener and indicator notes

Sources