← back to Stock Vshape Viewer
public/data.js
49 lines
/* data.js — seed watchlist + filter defaults. The analysis engine lives in
* screen.js (window.SCREEN), shared with the server. Here we just bridge it. */
window.SEED = [
{ ticker: 'NVDA', name: 'NVIDIA', cls: 'Mega-cap', marketCap: '~$5.45T', sector: 'Semiconductors' },
{ ticker: 'PLTR', name: 'Palantir', cls: 'Large-cap', marketCap: '~$0.4T', sector: 'Software / AI' },
{ ticker: 'ORCL', name: 'Oracle', cls: 'Large-cap', marketCap: '~$404B', sector: 'Enterprise Software' },
{ ticker: 'NFLX', name: 'Netflix', cls: 'Large-cap', marketCap: '~$0.5T', sector: 'Streaming / Media' },
{ ticker: 'RNG', name: 'RingCentral', cls: 'Small/Mid-cap', marketCap: '~$5.7B', sector: 'Cloud Comms' },
{ ticker: 'ABLV', name: 'Able View Global', cls: 'Micro-cap', marketCap: '~$47M', sector: 'Consumer / Beauty' },
];
// Every screen rule (adjustable in the ☰ panel). minPrice 8 = "tradeable" floor.
window.DEFAULT_FILTERS = {
weeksAgo: 6, weeksTol: 3, minDip: 10, maxFromHigh: 60, minPrice: 8,
reqNewHigh: true, dipTo50: false, dipTo200: false, below50: false, below200: false,
// cheap far-dated options finder (premium $/share, months to expiry)
optMin: 0.05, optMax: 0.15, optMinMonths: 3, optType: 'both',
};
// 10 preloaded strategy presets — one-click screens. Each sets the filters + timeframe.
window.PRESETS = [
{ name: 'Deep V-Recovery', desc: 'Deep 20%+ correction fully reclaimed to a new high (MRNA-style).',
tfN: 252, filters: { minDip: 20, reqNewHigh: true, weeksAgo: 8, weeksTol: 5, maxFromHigh: 15 } },
{ name: 'Classic V (10% dip)', desc: 'The core screen — ~6-week-old high, 10% dip, fresh new high.',
tfN: 126, filters: { minDip: 10, reqNewHigh: true, weeksAgo: 6, weeksTol: 3, maxFromHigh: 60 } },
{ name: '50-DMA Pullback Buy', desc: 'Uptrend pulling back to touch the 50-day — buy-the-dip setup.',
tfN: 126, filters: { minDip: 5, reqNewHigh: false, dipTo50: true, maxFromHigh: 20 } },
{ name: '200-DMA Deep Value', desc: 'Testing the 200-day average — deep-value entry zone.',
tfN: 252, filters: { minDip: 15, dipTo200: true, reqNewHigh: false, maxFromHigh: 35 } },
{ name: 'Fresh Breakout', desc: 'At new highs right now (within 3% of its recent high).',
tfN: 126, filters: { minDip: 8, reqNewHigh: true, maxFromHigh: 3, weeksAgo: 6 } },
{ name: 'Below 50 — Reversal Watch', desc: 'Broke under the 50-day after a 12%+ dip — watch for a turn.',
tfN: 126, filters: { minDip: 12, below50: true, reqNewHigh: false, maxFromHigh: 40 } },
{ name: 'Momentum Leaders', desc: 'Strong names hugging their highs (shallow dip, close to high).',
tfN: 63, filters: { minDip: 5, reqNewHigh: true, maxFromHigh: 6, weeksAgo: 4, weeksTol: 2 } },
{ name: 'Big-Dip Bottom Fishing', desc: 'Down 25%+ and not recovered yet — deep-dip candidates.',
tfN: 252, filters: { minDip: 25, reqNewHigh: false, maxFromHigh: 60 } },
{ name: 'Coiled Consolidation', desc: 'Recent high, shallow pullback, tightening — pre-breakout coil.',
tfN: 63, filters: { minDip: 8, maxFromHigh: 8, weeksAgo: 4, weeksTol: 2, reqNewHigh: false } },
{ name: 'Yearly Base Reversal', desc: '2-year base, deep dip, currently under the 200-day.',
tfN: 504, filters: { minDip: 20, dipTo200: true, below200: true, reqNewHigh: false } },
];
// bridge the shared engine so existing calls (window.sma / window.analyze) work
window.sma = window.SCREEN.sma;
window.analyze = window.SCREEN.analyze;
window.passFilterOf = window.SCREEN.passFilter;