7.4 KiB
✅ 1-Minute Market Data Alert Setup (FIXED Dec 9, 2025)
Issue Resolved
Problem: Telegram bot timing out waiting for fresh ATR data
⏳ Waiting for next 1-minute datapoint...
Will execute with fresh ATR (max 60s)
⚠️ Timeout waiting for fresh data
Using preset ATR: 0.43
Root Cause: TradingView alert sends action: "market_data_1min" but endpoint expected exact match "market_data"
Fix: Webhook now accepts both "market_data" and "market_data_1min" actions
Status: ✅ DEPLOYED Dec 9, 2025 19:18 CET (commit 9668349)
TradingView Alert Configuration
Step 1: Add Indicator to Chart
- Open SOL-PERP 1-minute chart in TradingView
- Add indicator: "1-Minute Market Data Feed" (
1min_market_data_feed.pinescript) - Verify it's on the chart (shows ADX/ATR/RSI/Volume/Price Position table)
Step 2: Create Alert
- Click Alert button (clock icon) or press
Alt+A - Condition: Select "1min Market Data" from dropdown
- Options:
- Trigger: Once Per Bar Close (fires every minute)
- Expiration: Never (or set to 1 month)
- Alert actions:
- Check: Webhook URL
- URL: Your n8n webhook URL (e.g.,
https://n8n.your-domain.com/webhook/trading-signal) - Message: Use default (auto-filled from indicator)
Step 3: Verify Alert Message
The alert should send this JSON (auto-generated by indicator):
{
"action": "market_data_1min",
"symbol": "{{ticker}}",
"timeframe": "1",
"atr": 0.55,
"adx": 28.5,
"rsi": 62,
"volumeRatio": 1.35,
"pricePosition": 72,
"currentPrice": 142.85,
"timestamp": "{{timenow}}",
"exchange": "{{exchange}}",
"indicatorVersion": "v9"
}
CRITICAL: Verify action field says "market_data_1min" (endpoint now accepts this!)
Step 4: Test Alert
Manual Test:
curl -X POST http://localhost:3001/api/trading/market-data \
-H "Content-Type: application/json" \
-d '{
"action": "market_data_1min",
"symbol": "SOLUSDT",
"timeframe": "1",
"atr": 0.55,
"adx": 28.5,
"rsi": 62,
"volumeRatio": 1.35,
"pricePosition": 72,
"currentPrice": 142.85
}'
Expected Response:
{
"success": true,
"symbol": "SOL-PERP",
"message": "Market data cached and stored successfully",
"expiresInSeconds": 300
}
Check Cache:
curl http://localhost:3001/api/trading/market-data | jq '.cache."SOL-PERP"'
Expected Output:
{
"symbol": "SOL-PERP",
"atr": 0.55,
"adx": 28.5,
"rsi": 62,
"volumeRatio": 1.35,
"pricePosition": 72,
"currentPrice": 142.85,
"timestamp": 1765302277051,
"timeframe": "1",
"ageSeconds": 15
}
Step 5: Verify in Telegram
Send long sol to Telegram bot. Should see:
⏳ Waiting for next 1-minute datapoint...
Will execute with fresh ATR (max 60s)
✅ Fresh data received
ATR: 0.55 | ADX: 28.5 | RSI: 62.0
Executing LONG SOL...
NOT:
⚠️ Timeout waiting for fresh data
Using preset ATR: 0.43
Alert Rate Limits
Per Symbol: 1 alert every minute = 60/hour Total for 3 Symbols: 180 alerts/hour
TradingView Free Tier:
- 20 alert slots total
- Unlimited alert fires
- 1-minute alerts use 3 slots (SOL, ETH, BTC)
Remaining Slots: 17 for trading signals (v9, stop hunt, etc.)
Troubleshooting
Issue: Telegram bot still timing out
Check 1: Is alert active in TradingView?
- Go to Alerts panel
- Look for "1min Market Data - SOL-PERP"
- Status should be green (active)
Check 2: Is webhook firing?
docker logs trading-bot-v4 2>&1 | grep "Received market data webhook" | tail -5
Expected:
📡 Received market data webhook: { action: 'market_data_1min', symbol: 'SOLUSDT', atr: 0.55, adx: 28.5 }
✅ Market data cached for SOL-PERP
If no logs: Alert not configured or webhook URL wrong
Check 3: Is data in cache?
curl -s http://localhost:3001/api/trading/market-data | jq '.availableSymbols'
Expected: ["SOL-PERP"] or ["SOL-PERP", "ETH-PERP", "BTC-PERP"]
If empty: No data received in last 5 minutes
Check 4: n8n webhook routing
- Verify n8n receives TradingView webhook
- Check "Parse Signal Enhanced" node extracts action correctly
- Verify routes to bot's
/api/trading/market-dataendpoint
Issue: Cache shows stale data
Symptoms:
{
"ageSeconds": 350 // > 300 seconds (5 minutes)
}
Cause: Alert not firing every minute
Fix:
- Check alert condition: Once Per Bar Close (not "Only Once")
- Check alert is active (not paused/expired)
- Verify 1-minute chart is loaded in TradingView (alerts need chart open)
Issue: Wrong ATR value
Symptoms: Telegram shows ATR: 0.43 (preset) instead of fresh value
Diagnosis:
curl -s http://localhost:3001/api/trading/market-data | jq '.cache."SOL-PERP".atr'
If returns null or old value: Alert not sending fresh ATR
Fix:
- Check TradingView alert message includes
"atr": {{ta.atr(14)}} - Verify indicator is on chart (calculates ATR)
- Re-create alert with fresh message template
File Locations
TradingView Indicator:
workflows/trading/1min_market_data_feed.pinescript
Webhook Endpoint:
app/api/trading/market-data/route.ts
Market Data Cache:
lib/trading/market-data-cache.ts
Telegram Bot Logic:
telegram_command_bot.py
Lines 775-825: Fresh data waiting logic
Git Commits
Fix:
9668349- "fix: Accept market_data_1min action in webhook endpoint" (Dec 9, 2025)
Previous Related:
2a1badf- "critical: Fix Smart Validation Queue - restore signals from database on startup" (Dec 9, 2025)
Expected Behavior After Setup
Manual Telegram Trade Flow
User: long sol
Bot: ⏳ Waiting for next 1-minute datapoint...
Will execute with fresh ATR (max 60s)
[Wait 0-60 seconds for next TradingView alert]
Bot: ✅ Fresh data received
ATR: 0.5543 | ADX: 28.5 | RSI: 62.0
Executing LONG SOL...
Bot: ✅ OPENED LONG SOL
Entry: $142.8394
Size: $2224.44 @ 10x
TP1: $143.69 (ATR-based, fresh data!)
TP2: $144.55
SL: $141.54
Key Indicators Fix is Working:
- ✅ "Fresh data received" message appears
- ✅ ATR value matches current volatility (not preset 0.43)
- ✅ Wait time < 60 seconds (data available)
- ✅ TP/SL calculated from fresh ATR
Monitoring
Check alert is firing every minute:
# Watch webhook hits in real-time
docker logs -f trading-bot-v4 2>&1 | grep "market data webhook"
Check cache freshness:
# Data age should be < 60 seconds
watch -n 5 'curl -s http://localhost:3001/api/trading/market-data | jq ".cache.\"SOL-PERP\".ageSeconds"'
Check database storage:
-- Query last 10 market data points
docker exec trading-bot-postgres psql -U postgres -d trading_bot_v4 -c \
"SELECT symbol, timeframe, atr, adx,
TO_CHAR(timestamp, 'HH24:MI:SS') as time
FROM \"MarketData\"
WHERE symbol='SOL-PERP' AND timeframe='1'
ORDER BY timestamp DESC LIMIT 10;"
Success Criteria
✅ TradingView alert fires every 60 seconds ✅ Webhook logs show "Received market data webhook" every minute ✅ Cache shows fresh data (ageSeconds < 60) ✅ Telegram bot uses fresh ATR (not preset 0.43) ✅ TP/SL targets adapt to current volatility ✅ Database stores all 1-minute datapoints
System is working when:
- Manual trades complete within 60 seconds (not timeout)
- ATR values change based on market conditions
- TP/SL distances adapt to volatility automatically