- Root cause: n8n workflow regex missing FARTCOIN pattern - Evidence: Bot logs showed symbols already normalized by n8n - Solution: Updated parse_signal_enhanced.json with FARTCOIN mapping - User action required: Import updated workflow to n8n - Architecture clarified: n8n normalizes symbols BEFORE bot receives them
5.4 KiB
FARTCOIN Symbol Normalization Fix (Dec 7, 2025)
Problem Summary
User added FARTCOIN 1-minute and 5-minute TradingView alerts for multi-asset data collection, but all FARTCOIN signals were being stored in the database as SOL-PERP instead of FARTCOIN-PERP.
Root Cause Discovery
Initial Hypothesis (WRONG):
- Suspected bot's symbol normalization code was checking
includes('SOL')before FARTCOIN - Applied fixes to
config/trading.tsandapp/api/trading/market-data/route.ts - Result: Fixes had NO effect, logs still showed SOL-PERP
Actual Root Cause (Dec 7, 2025):
- TradingView → n8n → Bot architecture misunderstanding
- n8n workflow normalizes symbols BEFORE sending to bot
- Bot receives symbols already in Drift format (
SOL-PERP,BTC-PERP) - Bot's normalization code is NEVER reached
- n8n workflow regex only matched
(SOL|BTC|ETH)- FARTCOIN was missing
Evidence
Docker logs analysis:
docker logs trading-bot-v4 --since 20m | grep "🎯 Trade execution request"
Result:
{
"symbol": "SOL-PERP", // Already normalized by n8n!
"direction": "long",
"timeframe": "1",
"atr": 0,
"adx": 26.9563054335
}
Key insight: Symbol field was SOL-PERP, not SOLUSDT or SOL - normalization happened BEFORE bot received webhook.
Solution
File: workflows/trading/parse_signal_enhanced.json
Changes:
- Updated symbol regex:
(SOL|BTC|ETH)→(FARTCOIN|FART|SOL|BTC|ETH) - Added FARTCOIN-specific mapping logic:
const symbolMatch = body.match(/\b(FARTCOIN|FART|SOL|BTC|ETH)\b/i);
let symbol;
if (symbolMatch) {
const matched = symbolMatch[1].toUpperCase();
// FARTCOIN and FART both map to FARTCOIN-PERP
if (matched === 'FARTCOIN' || matched === 'FART') {
symbol = 'FARTCOIN-PERP';
} else {
symbol = matched + '-PERP';
}
} else {
symbol = 'SOL-PERP'; // Default fallback
}
Why order matters: FARTCOIN checked BEFORE SOL to avoid substring match issues.
Deployment Steps
1. Code Changes (✅ Complete)
- Updated
workflows/trading/parse_signal_enhanced.json - Committed and pushed (commit
d3e0d20+ebffe9a)
2. n8n Workflow Import (⏳ USER ACTION REQUIRED)
CRITICAL: User must manually import updated workflow to n8n:
- Open n8n web interface
- Navigate to workflows
- Find "Parse Signal Enhanced" workflow
- Import from:
/home/icke/traderv4/workflows/trading/parse_signal_enhanced.json - Activate the updated workflow
Without this step, FARTCOIN symbols will STILL be saved as SOL-PERP
3. Verify Fix Working
After importing workflow, trigger new FARTCOIN alert and check logs:
docker logs trading-bot-v4 --since 5m | grep -i fart
Expected output:
📊 Normalized symbol: FARTCOIN-PERP → FARTCOIN-PERP
📊 DATA COLLECTION: 1min signal from FARTCOIN-PERP
Architecture Clarification
Symbol Normalization Flow:
TradingView Alert (FARTCOIN)
↓
n8n Parse Signal Enhanced
↓ (Regex match + mapping logic)
n8n HTTP POST to Bot
↓ (Symbol already "FARTCOIN-PERP")
Bot Execute Endpoint
↓ (normalizeTradingViewSymbol() called but does nothing - already normalized)
Database Save (FARTCOIN-PERP)
Key Insight: n8n is the ONLY place where raw TradingView symbols get normalized. Bot normalization code is a fallback that's rarely (never?) used in production.
Future Symbol Additions
To add new symbols (BNB, AVAX, etc.):
-
Update n8n workflow (
parse_signal_enhanced.json):- Add to regex:
(FARTCOIN|FART|BNB|SOL|BTC|ETH) - Add mapping if needed (e.g., special cases like FARTCOIN)
- Add to regex:
-
Import to n8n (manual step, MANDATORY)
-
Bot normalization code (optional, for non-n8n webhooks):
- Update
config/trading.ts-normalizeTradingViewSymbol() - Update
app/api/trading/market-data/route.ts- localnormalizeTradingViewSymbol()
- Update
Lessons Learned
1. Verify Data Flow Before Debugging
- Spent time fixing bot code that was never executed
- Should have checked webhook payload FIRST to see pre-normalized symbol
- "Obvious" solution (bot regex order) was wrong because assumption was wrong
2. Architecture Documentation Critical
- n8n symbol normalization was not documented anywhere
- Led to incorrect debugging approach
- Now documented in
.github/copilot-instructions.mdfor future reference
3. Test with Real Data
- Code changes looked correct but logs showed no effect
- Real production logs revealed actual data flow
- Never declare "fixed" without verification
4. Manual Deployment Steps Must Be Explicit
- n8n workflow changes require manual import
- Git commit alone is NOT sufficient
- User must perform import step for fix to take effect
Git Commits
d3e0d20- "fix: Add FARTCOIN symbol mapping to n8n Parse Signal Enhanced"ebffe9a- "docs: Document n8n symbol normalization architecture and FARTCOIN fix"
Status
- ✅ Code fixed and committed
- ✅ Documentation updated
- ⏳ USER ACTION REQUIRED: Import workflow to n8n
- ⏳ Waiting for verification (next FARTCOIN alert)
Related Issues
- Smart Validation Timeout Extension: Also completed Dec 7, 2025 (separate feature)
- Multi-Asset Data Collection: FARTCOIN is part of broader multi-asset analysis initiative
- BlockedSignal Analysis: Quality-blocked signals tracked for threshold optimization
Dec 7, 2025 20:50 CET - Investigation complete, fix applied, awaiting n8n import by user.