Skip to main content

Overview

pip install tradingview-screener

tradingview-screener is a Python package that allows you to create custom stock screeners using TradingView's official API. This package retrieves data directly from TradingView without the need for web scraping or HTML parsing.

Key Features

  • Markets: Stocks, crypto, forex, CFDs, futures, bonds, and more.
  • 3000+ Data Fields: OHLC data, technical indicators, fundamental metrics (e.g. P/E, EPS), and even internal TradingView-only fields.
  • Timeframes: Use 1m, 5m, 15m, 30m, 1h, 2h, 4h, 1d, 1w, and 1mo — freely mix timeframes per field, no subscription required.
  • Filtering: SQL-like syntax with full support for AND/OR logic.

Links

Note that throughout the documentation, "field" and "column" are used interchangeably. Same with "Scanner" and "Screener".

Quickstart

Here’s a simple example to get you started:

from tradingview_screener import Query

x = (Query()
 .select('name', 'close', 'volume', 'market_cap_basic')
 .get_scanner_data())
print(x)

Output:

(17580,
          ticker  name   close     volume  market_cap_basic
 0   NASDAQ:NVDA  NVDA  127.25  298220762      3.130350e+12
 1      AMEX:SPY   SPY  558.70   33701795               NaN
 2   NASDAQ:TSLA  TSLA  221.10   73869589      7.063350e+11
 3    NASDAQ:QQQ   QQQ  480.26   29102854               NaN
 4    NASDAQ:AMD   AMD  156.40   76693809      2.531306e+11
 ..          ...   ...     ...        ...               ...
 45   NASDAQ:PDD   PDD  144.22    8653323      2.007628e+11
 46     NYSE:JPM   JPM  214.52    5639973      6.103447e+11
 47     NYSE:JNJ   JNJ  160.16    7274621      3.855442e+11
 48  NASDAQ:SQQQ  SQQQ    7.99  139721164               NaN
 49  NASDAQ:ASTS  ASTS   34.32   32361315      9.245616e+09
 
 [50 rows x 5 columns])

By default, the result is limited to 50 rows. You can adjust this limit, but be mindful of server load and potential bans.

A more advanced query:

from tradingview_screener import Query, col

(Query()
 .select('name', 'close', 'close|1', 'close|5', 'volume', 'relative_volume_10d_calc')
 .where(
     col('market_cap_basic').between(1_000_000, 50_000_000),
     col('relative_volume_10d_calc') > 1.2,
     col('MACD.macd|1') >= col('MACD.signal|1')  # 1 minute MACD
 )
 .order_by('volume', ascending=False)
 .offset(5)
 .limit(25)
 .get_scanner_data())

Note that some fields (usually prices and indicators) have multiple timeframes that you can choose from, for example:
Timeframe Column
1 Minute close|1
5 Minutes close|5
15 Minutes close|15
30 Minutes close|30
1 Hour close|60
2 Hours close|120
4 Hours close|240
1 Day close
1 Week close|1W
1 Month close|1M

Real-Time Data Access

To access real-time data, you need to pass your session cookies, as even free real-time data requires authentication.

Verify Update Mode

You can run this query to get an overview on the update_mode you get for each exchange:

from tradingview_screener import Query

_, df = Query().select('exchange', 'update_mode').limit(1_000_000).get_scanner_data()
df = df.groupby('exchange')['update_mode'].value_counts()
print(df)
exchange  update_mode          
AMEX      delayed_streaming_900    3255
NASDAQ    delayed_streaming_900    4294
NYSE      delayed_streaming_900    2863
OTC       delayed_streaming_900    7129

Using rookiepy

rookiepy is a library that loads the cookies from your local browser. So if you are logged in on Chrome (or whatever browser you use), it will use the same session.

  1. Install rookiepy:

    pip install rookiepy
    
  2. Load the cookies:

    import rookiepy
    cookies = rookiepy.to_cookiejar(rookiepy.chrome(['.tradingview.com']))  # replace chrome() with your browser
    
  3. Pass the cookies when querying:

    Query().get_scanner_data(cookies=cookies)
    

Now, if you re-run the update mode check:

_, df = Query().select('exchange', 'update_mode').limit(1_000_000).get_scanner_data(cookies=cookies)
df = df.groupby('exchange')['update_mode'].value_counts()
print(df)
exchange  update_mode          
AMEX      streaming                3256
NASDAQ    streaming                4286
NYSE      streaming                2860
OTC       delayed_streaming_900    7175

We now get live-data for all exchanges except OTC (because my subscription dosent include live-data for OTC tickers).

Other Ways For Loading Cookies

Extract Cookies Manually
  1. Go to TradingView

  2. Open the developer tools (Ctrl + Shift + I)

  3. Navigate to the Application tab.

  4. Go to Storage > Cookies > https://www.tradingview.com/

  5. Copy the value of sessionid

  6. Pass it in your query:

    cookies = {'sessionid': '<your-session-id>'}
    Query().get_scanner_data(cookies=cookies)
    
Authenticate via API

While it's possible to authenticate directly via API, TradingView has restrictions on login frequency, which may result in CAPTCHA requests and account flagging (meaning this method won't work again until the cooldown expires and the CAPTCHA is gone).
If you wish to proceed, here’s how:

from http.cookiejar import CookieJar

import requests
from tradingview_screener import Query


def authenticate(username: str, password: str) -> CookieJar:
    session = requests.Session()
    r = session.post(
       'https://www.tradingview.com/accounts/signin/', 
       headers={'User-Agent': 'Mozilla/5.0', 'Referer': 'https://www.tradingview.com'}, 
       data={'username': username, 'password': password, 'remember': 'on'}, 
       timeout=60,
    )
    r.raise_for_status()
    if r.json().get('error'):
        raise Exception(f'Failed to authenticate: \n{r.json()}')
    return session.cookies


cookies = authenticate('<your-username-or-email>', '<your-password>')
Query().get_scanner_data(cookies=cookies)

Comparison to Similar Packages

Unlike other Python libraries that have specific features like extracting the sentiment, or what not. This package is but a (low-level) wrapper around TradingView's /screener API endpoint.

It merely documents the endpoint, by listing all the functions and operations available, the different fields you can use, the markets, instruments (even some that you wont find on TradingView's website), and so on.

This library is also a wrapper that makes it easier to generate those verbose JSON payloads.

Robustness & Longevity

This package is designed to be future-proof. There are no hard-coded values in the package, all fields/columns and markets are documented on the website, which is updated daily via a GitHub Actions script.

How It Works

When using methods like select() or where(), the Query object constructs a dictionary representing the API request. Here’s an example of the dictionary generated:

{
    'markets': ['america'],
    'symbols': {'query': {'types': []}, 'tickers': []},
    'options': {'lang': 'en'},
    'columns': ['name', 'close', 'volume', 'relative_volume_10d_calc'],
    'sort': {'sortBy': 'volume', 'sortOrder': 'desc'},
    'range': [5, 25],
    'filter': [
        {'left': 'market_cap_basic', 'operation': 'in_range', 'right': [1000000, 50000000]},
        {'left': 'relative_volume_10d_calc', 'operation': 'greater', 'right': 1.2},
        {'left': 'MACD.macd', 'operation': 'egreater', 'right': 'MACD.signal'},
    ],
}

The get_scanner_data() method sends this dictionary as a JSON payload to the TradingView API, allowing you to query data using SQL-like syntax without knowing the specifics of the API.

Feedback and Improvement

If this package has bought value to your projects, please consider starring it.

Stargazers over time

Stargazers over time

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

tradingview_screener-3.1.0.tar.gz (20.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

tradingview_screener-3.1.0-py3-none-any.whl (19.4 kB view details)

Uploaded Python 3

File details

Details for the file tradingview_screener-3.1.0.tar.gz.

File metadata

  • Download URL: tradingview_screener-3.1.0.tar.gz
  • Upload date:
  • Size: 20.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.3 CPython/3.11.4 Linux/6.8.0-40-generic

File hashes

Hashes for tradingview_screener-3.1.0.tar.gz
Algorithm Hash digest
SHA256 948e8cdbcde78260c6106c973569cb94d78653d69197d499688c59066266ec7d
MD5 4a9ac33ab27e10e2dfcb7aaf83d95f62
BLAKE2b-256 b9488b3969c553bd8c38bcc25ffe92fc898b1d96d7d1ddecb9c2fd211fdd0584

See more details on using hashes here.

File details

Details for the file tradingview_screener-3.1.0-py3-none-any.whl.

File metadata

  • Download URL: tradingview_screener-3.1.0-py3-none-any.whl
  • Upload date:
  • Size: 19.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.3 CPython/3.11.4 Linux/6.8.0-40-generic

File hashes

Hashes for tradingview_screener-3.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a9a26ea265deef91912bc627f33c52c77004e3e40dad3d9da0b81150701803b7
MD5 72df444f9c806547a52738a6542d5d5c
BLAKE2b-256 010d7b1db4340c76e31fbf961a79f07cddacc3b2e0b6bb604cb743ca0374a82e

See more details on using hashes here.

Release history Release notifications | RSS feed

3.2.1

2 files

3.2.0

2 files

This release

3.1.0 This release

2 files

3.0.0

2 files

2.5.0

2 files

2.4.1

2 files

2.4.0

2 files

2.3.1

2 files

2.3.0

2 files

2.2.1

2 files

2.2.0

2 files

2.1.0

2 files

2.0.0

2 files

1.0.0

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page