Changelog¶
All notable changes to tvscreener.
[0.8.1] - 15/10/2026¶
Added¶
- MCP tools for the 0.8.0 features
- 12 new tools:
financials,corporate_events,seasonals,quotes,news,company_documents,earnings_calls,read_text,find_symbols,peers,forward_curve,volatility_smile get_calendaracceptskind="economic", withcountriesandimportanceyield_curveaccepts several countries (orALL) andtenors, and then returns a matrix
Fixed¶
- MCP
custom_queryno longer ignores invalid input. Unknown filter keys (e.g.operatorinstead ofop), fields, operators,sort_byfields and asset types now return an error. A missingoporvaluealso returns an error. Before, a misspelled key quietly became>=, and unknown parts were dropped.
[0.8.0] - 15/10/2026¶
Added¶
- Financial statements:
get_financials(symbol, statement, period) - Income statement, balance sheet, cash flow and statistics, by fiscal year, quarter, half-year or TTM
- About 20 years and 32 quarters for large companies
- TradingView's layout for each company type (industrial, bank, insurer)
get_fundamentals_config()returns the field catalogue- Real-time quotes:
stream_quotes(symbols)yields each quote change pushed by TradingView, including pre/after-market prices and the delay (update_mode) - Corporate events and seasonals
get_corporate_events(symbol): recent dividends, earnings (actual vs estimate, next release) and splitsget_seasonals(symbol): monthly returns by year- Economic calendar:
get_economic_calendar(start, end, countries, importance)with actual, forecast and previous values - Filings and transcripts
get_documents(symbol): 10-Q, 10-K, earnings releases, transcriptsget_document(id): transcript or summary textget_earnings_calls(symbol): call dates, live transcript and recording links- News
get_news()filters:provider,market,sector,corp_activity(insider trading, ESG, analyst ratings...),country,priority- New
idcolumn;get_article(id)reads TradingView's news API - Market helpers
search_symbols(text, type, exchange, country): search by ticker, name, ISIN or CUSIPget_peers(symbol): largest companies of the same industryget_forward_curve(root): futures term structureget_yield_matrix(countries, tenors): government yields of several countries by tenorget_volatility_smile(symbol, expiration): implied volatility by strike or moneyness- New dependency:
websocket-client. It is used byget_financials,stream_quotes,get_corporate_eventsandget_seasonals
Changed¶
get_article()takes a storyid(news API) or astory_path(web page). The argument is renamed fromstory_pathtostory- Article text keeps paragraph breaks, and symbol and link text
[0.7.0] - 15/10/2026¶
Added¶
- OR and nested filter logic (#62)
- Combine conditions with
|and&:ss.where((StockField.SECTOR == 'Finance') | (StockField.SECTOR == 'Utilities')) - Sent as TradingView's
filter2tree; newConditionGroupclass - MCP
custom_queryaccepts{"or": [...]}/{"and": [...]}groups - New filter operations (#63)
has(),has_none_of()for set fields such astypespecsis_empty(),not_empty()in_day_range(start, end)for dates relative to todayabove_pct(),below_pct(),within_pct(),not_within_pct()to compare with a percentage of another field or a number- Available in the MCP
custom_querytool - Scanner helpers (#72)
get_symbol(symbol, *fields): any fields of one symbolget_enum_values(*ids): valid values of enumerable fields (sector, exchange, ETF issuer...)get_metainfo(market)andScreener.metainfo(): field catalogue of a scanner market- Field enums regenerated from TradingView's metainfo (#64)
- New
scripts/generate_fields.py: adds the fields that return data, marks the ones that never do as deprecated - Stocks: analyst estimates (
*_ESTIMATE_FQ/FY/FH/NTM), forward multiples (PRICE_EARNINGS_FWD...), IPO fields,EARNINGS_FQ_H/REVENUES_FQ_Hhistory - Coin:
FUNDING_RATE,OPEN_INTEREST, open interest change and long/short liquidations (15m to 24h) - Bond: durations,
CONVEXITY,DV_01, Z/G/F spreads, YTM/YTW bid/ask, Moody's and Fitch ratings - All price markets: 17 candlestick patterns, absolute performance (
PERF_*_ABS) - Deprecated fields warn when used and are left out of
select_all(). Full lists: Field Changes
| Enum | Added | Deprecated |
|---|---|---|
StockField |
129 | 26 |
CryptoField |
33 | 131 |
ForexField |
31 | 108 |
BondField |
29 | 34 |
FuturesField |
29 | 34 |
CoinField |
56 | 257 |
EconomicsField (new) |
37 | 0 |
IndexField (new) |
358 | 0 |
GovernmentBondField (new) |
129 | 0 |
ETFScreener(#69): ETFs and ETNs sorted by AUM; newINDEX_TRACKEDand readable*_NAMEETF fields (ASSET_CLASS_NAME,FOCUS_NAME...)EconomicsScreener(#66): 15,000+ economic indicators by country andEconomicCategoryIndexScreener(#67): stock indices, index/commodity CFDs and crypto market-cap indicesGovernmentBondScreenerandget_yield_curve(country)(#68): benchmark government bond yields and prices by tenorField.match(pattern): case-insensitive regex match on text fields- Presets and calendars (#70)
StockScreener.set_preset()with thePresetenum (gainers, losers, most volatile, all-time high, oversold...)get_earnings_calendar(),get_dividends_calendar(),get_ipo_calendar()for a date range and marketsset_currency()(#71)- Converts fundamentals (market cap, revenue, EPS...) to one currency:
ss.set_currency("eur") - Prices are not converted
- Code Generator: new operators and OR
- Operators: has any of, has none of, % above, % below, within %, outside %, day range, has a value, is empty
- AND / OR toggle between filters; OR filters are grouped in one
where()call
Fixed¶
StockField.DIVIDEND_YIELD_FYpointed todividend_yield_recent, which returns no data; it now points toDIVIDENDS_YIELD_FY- Docs: coin examples used
CoinField.MARKET_CAP/VOLUME, which return no data; they useMARKET_CAP_CALC/N24H_VOL_CMC with_history()rejected 26 indicators (#65)StockFieldindicators such asRSI2,STOCH_K_5_3_3,ADX_PLUS_DI_50andMOM_14have previous-bar values in TradingView but raisedValueError
Changed¶
StockScreener.set_markets()returns the screener, so it can be chained- Filters on the same field are merged into one
in_rangefilter only for the original comparison operations. The new operations are always kept as separate filters.
[0.6.0] - 14/10/2026¶
Added¶
OptionScreenerandOptionField(#53)- Option chains from the TradingView options scanner, for one or more underlyings (
OptionScreener("NASDAQ:AAPL")) - Greeks (delta, gamma, theta, vega, rho), implied volatility (mid, bid, ask), theoretical price, bid/ask
- Expiration is returned as a datetime; expiration filters accept dates, ISO strings or
YYYYMMDDintegers get_iv_term_structure(symbol)(#53)- Implied volatility by time to expiration: one point per listed expiration and standard tenors (1w to 1y)
[0.5.2] - 23/09/2026¶
Fixed¶
with_interval()rejects fields that already have a time interval- Fields such as
StockField.EMA12_5(EMA12|5) produced an invalid column likeEMA12|5|60 - They now raise
ValueError - New
Field.accepts_interval()tells ifwith_interval()can be applied
Changed¶
- Code Generator redesign
- New layout and styling
- Searchable field picker for filters and sort; every field is reachable
- Search matches initials (
rsi,sma50) - Timeframe (
with_interval()) for filters, columns and sort not in listoperator (not_in())- Market selection for stocks (
set_markets()); the market list now matches theMarketenum
[0.5.1] - 23/09/2026¶
Fixed¶
tvscreener-mcpnow works with mcp 2.x (#60)- mcp 2.x renamed
FastMCPtoMCPServer, which made the server crash at startup - The server supports both mcp 1.x and 2.x
[0.5.0] - 15/09/2026¶
Fixed¶
Rating.find()now classifies boundary values correctly (#57)0.5maps to Buy instead of Strong Buy0.1maps to Neutral instead of Buy- Rating bands no longer overlap at their boundaries
[0.4.1] - 2026¶
Fixed¶
with_interval()andwith_history()no longer crashget()(#56, #57)FieldWithIntervalandFieldWithHistorywere missinghas_recommendation(), whichget_columns_to_request()calls on every selected field-
Any
select()using an interval or history wrapper raisedAttributeError -
Historical offset now placed before the interval suffix
- The auto-added 'Prev.' column built
RSI|1W[1], which TradingView answers withnull; the valid form isRSI[1]|1W - Pre-baked interval fields (e.g.
ForexField.ADX_PLUS_DI_1_1) are handled too -
with_history()no longer stacks a second offset, which previously produced a duplicateRSI[1][1]column -
select_all()works on every screener - Forex, Crypto, Bond, Futures and Coin raised
ValueError: N columns passed, passed data had N+1 columns - Two name collisions dropped a header entry: those enums define a field
named
symbolthat clashed with the injected ticker column, and some distinct fields share one label (High.Allandall_time_highare both 'All Time High') - Duplicate names now get a
.1,.2suffix, matchingpandas.read_csv
Changed¶
test_current_trading_dayno longer asserts a fixed row count. Theactive_symbolfilter returns 0 rows outside market hours, so the test failed whenever it ran off-session.
[0.2.1] - 2026¶
Fixed¶
- Field-to-field comparisons now supported (e.g.,
StockField.EMA5 >= StockField.EMA25) - Removed incorrect TypeError that blocked field-to-field comparisons
- The TradingView API does support these comparisons natively
- Enables strategies like Golden Cross, EMA stacking, etc.
[0.2.0] - 2025¶
Added¶
- MCP Server Integration - Model Context Protocol server for AI assistants
- Enable AI assistants (Claude, etc.) to query market data directly
tvscreener.mcpsubpackage with full MCP support-
tvscreener-mcpCLI entry point -
MCP Tools:
discover_fields- Search 3500+ available fields by keywordlist_field_types- Explore field categoriescustom_query- Flexible queries with any fields and filterssearch_stocks- Screen stocks by price, market cap, sectorsearch_crypto- Screen crypto by volume, market capsearch_forex- Screen forex pairsget_top_movers- Get top gainers/loserslist_sectors- List available stock sectorslist_filter_operators- List available filter operators
Installation¶
# Install with MCP support
pip install tvscreener[mcp]
# Run MCP server
tvscreener-mcp
# Register with Claude Code
claude mcp add tvscreener -- tvscreener-mcp
[0.1.0] - 2024¶
Added¶
-
Pythonic Comparison Operators - Use
>,<,>=,<=,==,!=directly on fields -
Range Methods -
between()andnot_between()for range filtering -
List Methods -
isin()andnot_in()for list matching -
Fluent API - All methods return
selffor chaining -
Index Filtering - Filter by index constituents
-
Select All - Retrieve all ~3,500 fields
-
Time Intervals - Use indicators on multiple timeframes
-
All 6 Screeners - Stock, Crypto, Forex, Bond, Futures, Coin
Changed¶
- Improved type safety with Field enums
- Better error messages for invalid field types
Backward Compatibility¶
- Legacy
where(field, operator, value)syntax still supported - All existing code continues to work
[0.0.x] - Previous Versions¶
Initial releases with basic screening functionality.
Features¶
- Basic screener classes
- Filter by field and operator
- Select specific fields
- Sorting and pagination
- Streaming updates
- Styled output with
beautify()