- Updated regex to match FARTCOINUSDT (TradingView sends full symbol with exchange suffix)
- Added explicit SOLUSDT mapping for SOL alerts
- FARTCOINUSDT/FARTCOIN/FART all map to FARTCOIN-PERP
- Fixes issue where FARTCOIN alerts were incorrectly saved as SOL-PERP
- Root cause: n8n workflow only recognized SOL|BTC|ETH in regex
- TradingView sends raw symbol (FARTCOIN) → n8n normalizes to *-PERP format
- Bot normalization code was never reached (symbol already normalized by n8n)
- Added FARTCOIN|FART to regex pattern (checked before SOL to avoid substring match)
- Added conditional mapping: FARTCOIN/FART → FARTCOIN-PERP, others → {SYMBOL}-PERP
- User must import updated workflow to n8n for FARTCOIN data collection to work
PROBLEM: n8n extracting pricePosition (25.19) as signalPrice instead of close price (142.08)
- Request body showed: signalPrice: 25.1908396947 (IDENTICAL to pricePosition)
- Pyth oracle confirmed actual SOL price: $141.796
- TradingView sending correct format: "buy 1 @ 142.08 | ATR:... | POS:25.19"
ROOT CAUSE: Old regex /@\s*([\d.]+)/ too loose, matched first number after @
- Could match POS:25.19 if @ somehow associated with it
FIX: Changed to /@\s*([\d.]+)\s*\|/
- Now REQUIRES pipe after price: "@ 142.08 |"
- Cannot match POS:25.19 (no @ before POS)
- More specific pattern prevents collision
VERIFICATION:
- User must re-import updated parse_signal_enhanced.json into n8n
- Next signal should show $141.XX not $25.XX in logs
- Request body signalPrice should match Pyth price, not pricePosition
PROBLEM:
- Bot logs showing wrong prices ($30-43 vs actual $141-144)
- TradingView sending correct format: 'buy 1 @ 142.08'
- n8n Parse Signal Enhanced wasn't extracting @ price field
ROOT CAUSE:
- n8n workflow parsed ATR, ADX, RSI, VOL, POS, MAGAP, IND
- But @ price field was never extracted
- Bot fell back to undefined → used RSI value instead
SOLUTION:
- Added signalPrice extraction: /@\s*([\d.]+)/
- Returns signalPrice field in n8n output
- Bot receives correct price in body.signalPrice
IMPACT:
- Logs will show correct SOL price ($141-144)
- Database signalPrice field accurate
- BlockedSignalTracker can calculate correct P&L
FILES CHANGED:
- workflows/trading/parse_signal_enhanced.json
NEXT STEP:
User must import updated workflow into n8n
Then 1-minute signals will log correct prices ✅
Integrated MA gap analysis into signal quality evaluation pipeline:
BACKEND SCORING (lib/trading/signal-quality.ts):
- Added maGap?: number parameter to scoreSignalQuality interface
- Implemented convergence/divergence scoring logic:
* LONG: +15pts tight bullish (0-2%), +12pts converging (-2-0%), +8pts early momentum (-5--2%)
* SHORT: +15pts tight bearish (-2-0%), +12pts converging (0-2%), +8pts early momentum (2-5%)
* Penalties: -5pts for misaligned MA structure (>5% wrong direction)
N8N PARSER (workflows/trading/parse_signal_enhanced.json):
- Added MAGAP:([-\d.]+) regex pattern for negative number support
- Extracts maGap from TradingView v9 alert messages
- Returns maGap in parsed output (backward compatible with v8)
- Updated comment to show v9 format
API ENDPOINTS:
- app/api/trading/check-risk/route.ts: Pass maGap to scoreSignalQuality (2 calls)
- app/api/trading/execute/route.ts: Pass maGap to scoreSignalQuality (2 calls)
FULL PIPELINE NOW COMPLETE:
1. TradingView v9 → Generates signal with MAGAP field
2. n8n webhook → Extracts maGap from alert message
3. Backend scoring → Evaluates MA gap convergence (+8 to +15 pts)
4. Quality threshold → Borderline signals (75-85) can reach 91+
5. Execute decision → Only signals scoring ≥91 are executed
MOTIVATION:
Helps borderline quality signals reach execution threshold without overriding
safety rules. Addresses Nov 25 missed opportunity where good signal had MA
convergence but borderline quality score.
TESTING REQUIRED:
- Verify n8n parses MAGAP correctly from v9 alerts
- Confirm backend receives maGap parameter
- Validate MA gap scoring applied to quality calculation
- Monitor first 10-20 v9 signals for scoring accuracy
- Changed regex from /\.P\s+(\d+)/ to /\b(buy|sell)\s+(\d+|D|W|M)\b/i
- Matches new format: 'ETH buy 15' instead of 'SOL buy .P 15'
- Supports all timeframes: 5, 15, 60, D (daily), W (weekly), M (monthly)
- Updated comment to reflect new format example