NASDAQ / Healthcare
BDTX · Black Diamond Therapeutics
Bottom recovery with volume expansion
Volume expanded while price remains close to the recent low. RSI is not overheated, so the setup still has room before becoming crowded.
VOICE MARKET SCANNER
TickerPrompt
Audio request
Email reports are analytics only, not investment advice. Trading decisions and outcomes remain your responsibility.
NASDAQ / Healthcare
Bottom recovery with volume expansion
Volume expanded while price remains close to the recent low. RSI is not overheated, so the setup still has room before becoming crowded.
Premium report intelligence
TickerVoice reviews the week's recurring email reports generated from your saved free-form patterns, ranks repeated strength and signal quality, then delivers 10 priority tickers with a clear market expectation.
Strategy
Strategy JSON
{
"strategy_type": "user_defined_recovery_reversal",
"universe": "US_LISTED_STOCKS_NASDAQ_NYSE_AMEX",
"region_query": "US",
"distance_from_base_low_max_pct": 40,
"max_recent_runup_pct": 25,
"base_duration_days_min": 120,
"volume_surge_min_ratio": 1.5,
"distance_from_90d_low_max_pct": 40,
"liquidity_min_avg_volume": 0,
"exclude_overheated_rsi": true,
"rsi_max": 68,
"explain_top_n": 50
}TradingView strategy script
//@version=5
strategy("TickerVoice: user_defined_recovery_reversal", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=10)
// Generated by TickerPrompt. This script checks the current TradingView chart only.
// Universe hint: US_LISTED_STOCKS_NASDAQ_NYSE_AMEX
// Region hint: US
// Industry hint: any
// Annual/dividend-yield filters are executed by the TickerVoice scanner from profile data; Pine cannot screen the whole universe from one chart.
tv_rsiValue = ta.rsi(close, 14)
tv_avgVolume20 = ta.sma(volume, 20)
tv_volumeRatio = tv_avgVolume20 > 0 ? volume / tv_avgVolume20 : 0
tv_avgVolumeWeek = ta.sma(volume, 5)
tv_avgVolumePrev20 = ta.sma(volume[5], 20)
tv_volume1wRatio = tv_avgVolumePrev20 > 0 ? tv_avgVolumeWeek / tv_avgVolumePrev20 : 0
tv_avgVolumeTwoWeeks = ta.sma(volume, 10)
tv_avgVolumePrevTwoWeeksBase = ta.sma(volume[10], 20)
tv_volume2wRatio = tv_avgVolumePrevTwoWeeksBase > 0 ? tv_avgVolumeTwoWeeks / tv_avgVolumePrevTwoWeeksBase : 0
tv_low90 = ta.lowest(low, 90)
tv_baseLow = ta.lowest(low, 120)
tv_low22 = ta.lowest(low, 22)
tv_high20 = ta.highest(high[1], 20)
tv_distanceFrom90Low = tv_low90 > 0 ? ((close - tv_low90) / tv_low90) * 100 : na
tv_distanceFromBaseLow = tv_baseLow > 0 ? ((close - tv_baseLow) / tv_baseLow) * 100 : na
tv_recentRunup = tv_low22 > 0 ? ((close - tv_low22) / tv_low22) * 100 : na
tv_performance1w = close[5] > 0 ? ((close - close[5]) / close[5]) * 100 : na
tv_performanceWindow = close[5] > 0 ? ((close - close[5]) / close[5]) * 100 : na
tv_sessionPerformance = close[1] > 0 ? ((close - close[1]) / close[1]) * 100 : na
tv_sessionPerformanceOk = tv_sessionPerformance >= -1000 and tv_sessionPerformance <= 1000
tv_performanceOk = tv_performance1w >= -1000 and tv_performance1w <= 1000
tv_performanceWindowOk = tv_performanceWindow >= -1000 and tv_performanceWindow <= 1000
tv_volumeOk = tv_volumeRatio >= 1.5
tv_weeklyVolumeOk = tv_volume1wRatio >= 1.5
tv_twoWeekVolumeOk = tv_volume2wRatio >= 1.5
tv_rsiOk = tv_rsiValue <= 68
tv_distanceOk = tv_distanceFrom90Low <= 40
tv_baseLowOk = tv_distanceFromBaseLow <= 40
tv_runupOk = tv_recentRunup <= 25
tv_breakoutOk = close >= tv_high20
tv_signal = tv_volumeOk and tv_rsiOk and tv_distanceOk and tv_baseLowOk and tv_runupOk and tv_volumeOk and tv_weeklyVolumeOk and tv_twoWeekVolumeOk and tv_rsiOk
plotshape(tv_signal, title="TickerVoice signal", style=shape.triangleup, location=location.belowbar, color=color.lime, size=size.small, text="TV")
plot(tv_sessionPerformance, title="TickerVoice Session Performance %", color=color.lime, display=display.data_window)
plot(tv_performance1w, title="TickerVoice 1W Performance %", color=color.aqua, display=display.data_window)
plot(tv_performanceWindow, title="TickerVoice Window Performance %", color=color.green, display=display.data_window)
plot(tv_volumeRatio, title="TickerVoice Volume Ratio", color=color.orange, display=display.data_window)
plot(tv_volume1wRatio, title="TickerVoice 1W Volume Ratio", color=color.yellow, display=display.data_window)
plot(tv_volume2wRatio, title="TickerVoice 2W Volume Ratio", color=color.fuchsia, display=display.data_window)
plot(tv_rsiValue, title="TickerVoice RSI", color=color.purple, display=display.data_window)
if tv_signal and not tv_signal[1]
strategy.entry("TV_user_defined_recovery_reversal Long", strategy.long)
if strategy.position_size > 0 and (tv_rsiValue > 75 or close < ta.sma(close, 20))
strategy.close("TV_user_defined_recovery_reversal Long")Bonus check
SSI from TradingView Minds, Reddit trader groups, Stocktwits, Yahoo Finance Community and Investing.com Forum; SPE price-emotion divergence, high-volume sideways, good-news exit risk, triple resonance.
Fallback preview. Enter any ticker and press Check for a live bonus analysis.
Contacts

About us
For more than ten years I traded markets while testing different SaaS tools, screeners, alerts and report systems. Many of them were useful, but none fully matched the way I wanted to work as a swing trader: fast idea capture, measurable search rules, live ticker discovery, recurring reports and a clean path from market question to decision support.
In the AI era I finally managed to build something that feels natural for my own workflow: say or type a free-form market idea, let TickerPrompt translate it into scanner logic, and let TickerVoice turn the result into signals, watchlists, charts and reports. I made it first for myself, and now I am sharing it with you.
Sincerely yours, Eitan Lasker, trader