export type ExchangeCode = ‘NASDAQ’ | ‘NYSE’ | ‘LSE’ | ‘TSX’ | ‘ASX’ | ‘EURONEXT’;
export type Sector =
| ‘Technology’
| ‘Healthcare’
| ‘Financials’
| ‘Consumer Discretionary’
| ‘Communication Services’
| ‘Industrials’
| ‘Energy’
| ‘Materials’
| ‘Utilities’
| ‘Real Estate’;
export type ConfidenceLevel = ‘HIGH’ | ‘MEDIUM’ | ‘LOW’;
export interface OHLCV {
date: string;
open: number;
high: number;
low: number;
close: number;
volume: number;
}
export interface TechnicalIndicators {
rsi14: number;
sma20: number;
sma50: number;
sma200: number;
sma20Slope: number; // % change per period
sma50Slope: number;
bollingerUpper: number;
bollingerMiddle: number;
bollingerLower: number;
bollingerPctB: number;
bollingerBandwidth: number;
macdLine: number;
macdSignal: number;
macdHistogram: number;
macdCrossStatus: ‘BULLISH_CROSS_RECENT’ | ‘BULLISH_ABOVE_ZERO’ | ‘BEARISH_CROSS’ | ‘NEUTRAL’;
rvol: number; // Relative Volume (e.g. 2.4x)
volumeAvg20: number;
atr14: number;
atrPercent: number;
momentum10d: number; // %
momentum20d: number; // %
supportLevel: number;
resistanceLevel: number;
distanceToSupportPct: number;
distanceToResistancePct: number;
gapHistoryPct: number; // latest session gap %
gapFillRate: number; // 0-100%
trendStrengthADX: number; // 0-100
plusDI: number;
minusDI: number;
priceActionPattern: string; // e.g. “Bullish Engulfing”, “Inside Bar Breakout”, “Hammer at 20MA”, “Squeeze Breakout”
}
export interface GainProbabilities {
gain3to5: number; // Probability % of +3% to +5% next session
gain5to10: number; // Probability % of +5% to +10% next session
gain10to15: number; // Probability % of +10% to +15% next session
gainOver15: number; // Probability % of >+15% next session
positiveWinRate: number; // Overall % of historical matches resulting in positive move
maxFavorableMedian: number; // Median max excursion %
}
export interface IndicatorAttribution {
indicator: string;
contribution: number; // +points or -points out of 100
direction: ‘positive’ | ‘negative’ | ‘neutral’;
description: string;
}
export interface HistoricalMatch {
date: string;
similarityScore: number; // 0-100%
openPrice: number;
nextDayOpen: number;
nextDayHigh: number;
nextDayClose: number;
nextDayReturnPct: number;
maxExcursionPct: number;
outcome: ‘WIN_LARGE’ | ‘WIN_MODERATE’ | ‘WIN_SMALL’ | ‘LOSS’;
setupSummary: string;
}
export interface StockScanResult {
id: string;
ticker: string;
companyName: string;
exchange: ExchangeCode;
exchangeName: string;
currency: string;
currencySymbol: string;
sector: Sector;
industry: string;
currentPrice: number;
dayChangePct: number;
marketCap: number; // in USD equivalent or native
marketCapFormatted: string;
marketCapTier: ‘Mega’ | ‘Large’ | ‘Mid’ | ‘Small’ | ‘Micro’;
volume: number;
volumeAvg20: number;
// Quantitative outputs
probabilityScore: number; // 0 to 100
confidenceRating: ConfidenceLevel;
confidenceScore: number; // 0 to 100
historicalMatchCount: number;
expectedMoveRange: string; // e.g. “+4.2% to +8.5%”
expectedMoveMinPct: number;
expectedMoveMaxPct: number;
gainProbabilities: GainProbabilities;
topContributingIndicators: IndicatorAttribution[];
keySignals: string[];
summary: string;
// Detailed indicators
indicators: TechnicalIndicators;
historicalMatches: HistoricalMatch[];
priceHistory: OHLCV[];
// AI analysis cache
aiThesis?: string;
aiKeyRisks?: string[];
aiCatalystContext?: string;
}
export interface FilterCriteria {
exchanges: ExchangeCode[];
sectors: Sector[];
minPrice: number;
maxPrice: number;
minMarketCapTier: (‘Mega’ | ‘Large’ | ‘Mid’ | ‘Small’ | ‘Micro’)[];
minVolume: number;
minRVOL: number;
minProbability: number;
confidenceLevels: ConfidenceLevel[];
lookbackPeriodDays: number; // 180, 365, 730, 1095, 1825
selectedPattern: string; // ‘ALL’ or specific pattern
sortBy: ‘probabilityScore’ | ‘expectedMove’ | ‘rvol’ | ‘confidence’ | ‘gainOver15’;
sortOrder: ‘asc’ | ‘desc’;
searchQuery: string;
}
export interface ScreenerPreset {
id: string;
name: string;
description: string;
iconName: string;
filters: Partial
}
export interface WordPressEmbedConfig {
theme: ‘light’ | ‘dark’ | ‘auto’;
defaultExchange: string;
minProbability: number;
displayMode: ‘full’ | ‘compact’ | ‘cards’;
showWordPressBranding: boolean;
iframeHeight: number;
autoRefreshMinutes: number;
apiEndpointUrl: string;
}