Skip to content

SCREENER

How screens work

A screen is one expression over every NSE/BSE-listed company DalalOS covers. You name the ratios, set the thresholds, and get back every company that satisfies all of them — each value a raw disclosed figure or a mechanically-computed ratio.

The query is parsed on the server, never in your browser, so what this page describes is exactly what the engine does. Write one in the screen composer.

A first screen

Each condition is a ratio, a comparison and a number. Join conditions with AND or OR:

Return on capital employed > 22% AND
Market Capitalization > 500

That reads: companies whose return on capital employed is above 22 percent and whose market capitalization is above ₹500 crore. Line breaks are only for readability; a ratio name may even wrap across a line. Keywords and function names are case-insensitive.

Operators

OperatorMeaning
> < >= <= = !=Compare two values.
+ - * /Arithmetic between ratios or numbers. Division by zero is a missing value, not an error.
AND · ORCombine conditions. AND binds tighter than OR.
( )Group, to override the default order.

From loosest to tightest the order is: OR, then AND, then comparisons, then + and -, then * and /. So A > 1 OR B > 2 AND C > 3 means A > 1 OR (B > 2 AND C > 3). Write the parentheses when in doubt.

Two ratios can be compared to each other directly:

Price to Earning < Industry PE

Units: a number means what the ratio shows

A threshold is written in the unit the ratio is displayed in, and converted on the server. You never type a rupee amount in full or a percentage as a fraction:

Ratio showsWriteMeans
₹ crore — market cap, sales, profitMarket Capitalization > 500Above ₹500 crore
₹ per share — price, EPSCurrent price < 100Below ₹100 a share
Percent — returns, margins, growth, holdingsReturn on equity > 15Above 15 percent
Multiple — P/E, debt to equityDebt to equity < 0.5Below 0.5×

For a percentage ratio, 15 and 15% are the same threshold. A percent sign on anything else is rejected rather than guessed at — Market Capitalization > 5% fails with “a percentage literal cannot be combined with a currency_crore value”. Comparing two ratios in different units, such as a share price with a market capitalization, is rejected the same way.

The unit of every ratio is listed in the ratio reference.

Functions

FunctionArgumentsReturns
ABS(x)1The absolute value of x.
SQRT(x)1The square root of x.
LOG(x) · LOG(x, base)1 or 2The logarithm of x.
POWER(x, y)2x raised to the power y.
LEAST(a, b, …)1 or moreThe smallest of its arguments.
COALESCE(a, b, …)1 or moreThe first argument that has a value.
IF(condition, a, b)3a when the condition holds, b otherwise.
ABS(YOY Quarterly profit growth) > 50

That matches a quarterly profit swing of more than 50 percent in either direction.

Missing values

Not every company discloses every figure, and some ratios have no meaning for some companies — a bank has no return on capital employed. A missing value is never treated as zero:

  • A condition on a missing value does not match, so the company is left out.
  • Inside an OR, the other side can still match on its own.
  • COALESCE(ratio, 0) is how to say “treat missing as zero” when that is what you mean.
  • When sorting, companies with no value for the sort column come last in either direction.

Screener.in names or DalalOS ids

The default dialect reads Screener.in's ratio names, so a query written there usually runs unchanged. A ratio's DalalOS id, such as roce, is also accepted in this dialect when no Screener.in name matches, and means the same thing: roce > 22 is 22 percent.

The DalalOS dialect is for scripts and the REST API. It takes ids only, and its numbers are in the stored unit, not the displayed one: a percentage ratio is a fraction and money is in whole rupees.

ConditionScreener.in dialectDalalOS dialect
ROCE above 22%roce > 22roce > 0.22
Market cap above ₹500 croreMarket Capitalization > 500market_cap > 5000000000

The same text, two meanings

roce > 22 in the DalalOS dialect asks for a return on capital employed above 2,200 percent, and matches nothing. That is why the dialect is always stated and never guessed from the text.

Sectors, industries and indices

The query language has no text values, so a sector or index name cannot appear in a condition. Classification is applied separately, as an exact filter alongside the query: choose a sector from Browse sectors on the screens hub and every condition you add runs within it. Over the REST API, the same filter is the scope object (sector, industry, industry group, sub-group, company type or index).

During a results season, the composer can also keep only companies that have already filed the latest quarter, so a growth condition compares like with like.

Results, paging and export

  • Results come from one published generation of the nightly metrics, and every page of a result set is read from that same generation. If a refresh lands while you are paging, the screen restarts from the first page rather than mixing two generations.
  • The match count is always the full count. Paging stops at row 5,000; narrow the screen to see past it.
  • Export writes a CSV of up to 5,000 rows (100 · 500 · 1,000 · 5,000). Every column header names its unit — Return on equity (%), Market cap (Rs Cr) — and the values are in that unit.
  • A ratio name the engine does not recognise, or a ratio it cannot compute, stops the run with an error that names it. It is never silently dropped from the query.

What a screen is not

A screen filters on facts. It does not score, rank or rate a company, and a company appearing in a screen is not a recommendation to buy, sell or hold it. The order of the results is the sort you chose and nothing more. DalalOS is a research data layer, not investment advice.

FAQ

Common questions

Can I paste a query from Screener.in?

Usually, yes. The default dialect reads Screener.in's ratio names, its AND/OR keywords, its operators and its units, so a typical Screener.in query runs unchanged. A name DalalOS does not recognise, or a ratio it has no source for, stops the run with an error that names it; nothing is silently dropped from your query.

Why does a company with no value for a ratio not appear?

A condition on a missing value is neither true nor false, so the company does not match it. That is SQL's three-valued logic, applied deliberately: an undisclosed figure is not treated as zero. Inside an OR, the other side can still match on its own.

Can I filter by sector or index in the query text?

No. The query language has no text values, so a sector name cannot appear in a condition. Pick a sector from Browse sectors on the screens hub instead; the sector is applied alongside your query as an exact classification filter.

Is the order of the results a ranking?

No. Results are sorted by the column you choose, market capitalization by default, and nothing else. A screen returns every company that satisfies its conditions; it does not score, rank or recommend any of them.

KEEP EXPLORING