# Quick Integration Guide ## Add Momentum Score & Moneyness Context (15 minutes) --- ## Step 1: Add to Options Flow Route **File:** `backend/src/routes/optionsFlow.js` Add these imports at the top: ```javascript import { calculateFlowMomentum, getMomentumLabel } from '../services/momentumScore.js'; import { getMoneynessContext, isGammaSqueezeSetup, getMoneynessLabel } from '../utils/moneynessHelper.js'; ``` Then, in the `dataWithFlowInfo` mapping (around line 218), add: ```javascript const dataWithFlowInfo = sorted.map(row => { const symbol = row.Symbol || row.symbol_norm; const decay = flowDecay[symbol]; const reversal = flowReversals[symbol]; const trend = flowTrends[symbol]; // ADD: Moneyness context const moneyness = getMoneynessContext(row); const isGamma = isGammaSqueezeSetup(row); // ADD: Momentum score const momentumScore = calculateFlowMomentum(row, trend); const momentumLabel = getMomentumLabel(momentumScore); const rowWithFlowInfo = { ...row, flowDecayRaw: decay, flowReversalRaw: reversal, flowTrendRaw: trend, // NEW: Add these fields moneynessContext: moneyness, moneynessLabel: getMoneynessLabel(moneyness), isGammaSqueezeSetup: isGamma, momentumScore: momentumScore, momentumLabel: momentumLabel.label, momentumColor: momentumLabel.color, momentumIcon: momentumLabel.icon }; // Regenerate trade signal with flow trend data const tradeSignal = generateTradeSignal(rowWithFlowInfo); rowWithFlowInfo.tradeSignal = tradeSignal; rowWithFlowInfo.tradeSignalDisplay = formatTradeSignal(tradeSignal); return { ...rowWithFlowInfo, flowDecay: decay ? formatFlowDecay(decay) : null, flowReversal: reversal && reversal.hasReversal ? formatFlowReversal(reversal) : null, flowTrend: trend ? formatFlowTrend(trend) : null }; }); ``` --- ## Step 2: Update Trade Signal Generator to Use Moneyness **File:** `backend/src/services/tradeSignalGenerator.js` Add import at top: ```javascript import { getMoneynessContext, isGammaSqueezeSetup } from '../utils/moneynessHelper.js'; ``` Then update Pattern 1 (around line 27) to check for gamma squeeze: ```javascript // Pattern 1: 🟢 + 💎 + ⭐ + 💰 + ⚡ = BUY SIGNAL if (round === '🟢' && hasDiamond && hasStar && hasMoney && hasFlash) { // CHECK: Is this a gamma squeeze setup? const moneyness = getMoneynessContext(row); const isGamma = isGammaSqueezeSetup(row); if (isGamma || (moneyness.category === 'DEEP_OTM' && row.cp_norm === 'CALL')) { return { signal: 'BUY', type: 'GAMMA_SQUEEZE_SETUP', // NEW TYPE confidence: Math.min(calculateConfidence(row, 'BUY') + 10, 95), // Boost confidence entry: generateEntryStrategy(row, 'BUY'), stop: generateStopLoss(row, 'BUY'), target: generateTarget(row, 'BUY'), reasoning: `Gamma squeeze setup: Deep OTM calls (${moneyness.distancePct}% OTM) + full institutional flow`, timeHorizon: 'INTRADAY', invalidation: generateInvalidation(row, 'BUY') }; } // Regular institutional FOMO return { signal: 'BUY', type: 'INSTITUTIONAL_FOMO', confidence: calculateConfidence(row, 'BUY'), // ... rest stays the same }; } ``` --- ## Step 3: Add Momentum Column to Frontend **File:** `frontend/src/components/dashboard/OptionsFlowPanel.jsx` Add to `allColumns` array (around line 250): ```javascript { accessorKey: 'Momentum', header: 'Momentum', group: 'core', cell: ({ row }) => { const momentum = row.original.momentumScore || 0; const label = row.original.momentumLabel || 'MODERATE'; const color = row.original.momentumColor || 'yellow'; const icon = row.original.momentumIcon || '🟡'; const colorClasses = { green: 'text-green-400 bg-green-500/20', yellow: 'text-yellow-400 bg-yellow-500/20', orange: 'text-orange-400 bg-orange-500/20', red: 'text-red-400 bg-red-500/20' }; return (
{icon} {momentum}
); } }, ``` Add to `DEFAULT_VISIBLE_COLUMNS`: ```javascript const DEFAULT_VISIBLE_COLUMNS = [ 'Symbol', 'badges', 'Rocket', 'Momentum', 'TradeSignal', 'NetPremium', 'FlowTrend', 'Premium', 'CallPut', 'Strike', 'TapeAlign', 'LastFlow', 'PctVsRthOpen', 'CreatedTime' ]; ``` --- ## Step 4: Add Moneyness Badge Add to columns (optional, but helpful): ```javascript { accessorKey: 'Moneyness', header: 'Moneyness', group: 'option', cell: ({ row }) => { const moneyness = row.original.moneynessLabel || 'Unknown'; const isGamma = row.original.isGammaSqueezeSetup; return (
{moneyness} {isGamma && ( ⚡ GAMMA )}
); } } ``` --- ## Step 5: Add Momentum Filter Add to quick filters in `OptionsFlowPanel.jsx`: ```javascript // In the quick filter chips section {quickFilters.has('HighMomentum') && ( filtered = filtered.filter(row => (row.momentumScore || 0) >= 70); )} ``` Add button: ```javascript ``` --- ## Testing After making changes: 1. **Restart backend** - `npm run dev` in backend folder 2. **Refresh frontend** - Should see new columns 3. **Check data** - Look for: - Momentum scores (0-100) in Momentum column - Moneyness labels (ITM/OTM/etc) if you added that column - Gamma squeeze signals showing as `GAMMA_SQUEEZE_SETUP` type --- ## Expected Results - ✅ **Momentum Score** - Single number (0-100) showing flow strength - ✅ **Gamma Squeeze Detection** - Deep OTM calls with full badges = special signal type - ✅ **Better Signal Accuracy** - Moneyness context improves signal quality - ✅ **Easier Filtering** - Filter by momentum to find strongest signals --- **Time:** ~15 minutes to implement all changes **Impact:** - More accurate signals (gamma squeeze detection) - Easier to spot opportunities (momentum score) - Better trade selection (filter by momentum) Ready to implement? Start with Step 1!