docs: add essential SQL queries to AI agent instructions
Added SQL Analysis Queries section with: - Phase 1 monitoring queries (count, score distribution, recent signals) - Phase 2 comparison queries (blocked vs executed trades) - Pattern analysis queries (range extremes, ADX distribution) Benefits: - AI agents have immediate access to standard queries - Consistent analysis approach each time - No need to context-switch to separate docs - Quick reference for common investigations Includes usage pattern guidance and reference to full docs.
This commit is contained in:
107
.github/copilot-instructions.md
vendored
107
.github/copilot-instructions.md
vendored
@@ -426,6 +426,113 @@ docker exec trading-bot-postgres psql -U postgres -d trading_bot_v4 -c "\dt"
|
|||||||
# Click "Test LONG" or "Test SHORT"
|
# Click "Test LONG" or "Test SHORT"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## SQL Analysis Queries
|
||||||
|
|
||||||
|
Essential queries for monitoring signal quality and blocked signals. Run via:
|
||||||
|
```bash
|
||||||
|
docker exec trading-bot-postgres psql -U postgres -d trading_bot_v4 -c "YOUR_QUERY"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Phase 1: Monitor Data Collection Progress
|
||||||
|
```sql
|
||||||
|
-- Check blocked signals count (target: 10-20 for Phase 2)
|
||||||
|
SELECT COUNT(*) as total_blocked FROM "BlockedSignal";
|
||||||
|
|
||||||
|
-- Score distribution of blocked signals
|
||||||
|
SELECT
|
||||||
|
CASE
|
||||||
|
WHEN signalQualityScore >= 60 THEN '60-64 (Close Call)'
|
||||||
|
WHEN signalQualityScore >= 55 THEN '55-59 (Marginal)'
|
||||||
|
WHEN signalQualityScore >= 50 THEN '50-54 (Weak)'
|
||||||
|
ELSE '0-49 (Very Weak)'
|
||||||
|
END as tier,
|
||||||
|
COUNT(*) as count,
|
||||||
|
ROUND(AVG(signalQualityScore)::numeric, 1) as avg_score
|
||||||
|
FROM "BlockedSignal"
|
||||||
|
WHERE blockReason = 'QUALITY_SCORE_TOO_LOW'
|
||||||
|
GROUP BY tier
|
||||||
|
ORDER BY MIN(signalQualityScore) DESC;
|
||||||
|
|
||||||
|
-- Recent blocked signals with full details
|
||||||
|
SELECT
|
||||||
|
symbol,
|
||||||
|
direction,
|
||||||
|
signalQualityScore as score,
|
||||||
|
ROUND(adx::numeric, 1) as adx,
|
||||||
|
ROUND(atr::numeric, 2) as atr,
|
||||||
|
ROUND(pricePosition::numeric, 1) as pos,
|
||||||
|
ROUND(volumeRatio::numeric, 2) as vol,
|
||||||
|
blockReason,
|
||||||
|
TO_CHAR(createdAt, 'MM-DD HH24:MI') as time
|
||||||
|
FROM "BlockedSignal"
|
||||||
|
ORDER BY createdAt DESC
|
||||||
|
LIMIT 10;
|
||||||
|
```
|
||||||
|
|
||||||
|
### Phase 2: Compare Blocked vs Executed Trades
|
||||||
|
```sql
|
||||||
|
-- Compare executed trades in 60-69 score range
|
||||||
|
SELECT
|
||||||
|
signalQualityScore as score,
|
||||||
|
COUNT(*) as trades,
|
||||||
|
ROUND(AVG(realizedPnL)::numeric, 2) as avg_pnl,
|
||||||
|
ROUND(SUM(realizedPnL)::numeric, 2) as total_pnl,
|
||||||
|
ROUND(100.0 * SUM(CASE WHEN realizedPnL > 0 THEN 1 ELSE 0 END) / COUNT(*)::numeric, 1) as win_rate
|
||||||
|
FROM "Trade"
|
||||||
|
WHERE exitReason IS NOT NULL
|
||||||
|
AND signalQualityScore BETWEEN 60 AND 69
|
||||||
|
GROUP BY signalQualityScore
|
||||||
|
ORDER BY signalQualityScore;
|
||||||
|
|
||||||
|
-- Block reason breakdown
|
||||||
|
SELECT
|
||||||
|
blockReason,
|
||||||
|
COUNT(*) as count,
|
||||||
|
ROUND(AVG(signalQualityScore)::numeric, 1) as avg_score
|
||||||
|
FROM "BlockedSignal"
|
||||||
|
GROUP BY blockReason
|
||||||
|
ORDER BY count DESC;
|
||||||
|
```
|
||||||
|
|
||||||
|
### Analyze Specific Patterns
|
||||||
|
```sql
|
||||||
|
-- Blocked signals at range extremes (price position)
|
||||||
|
SELECT
|
||||||
|
direction,
|
||||||
|
signalQualityScore as score,
|
||||||
|
ROUND(pricePosition::numeric, 1) as pos,
|
||||||
|
ROUND(adx::numeric, 1) as adx,
|
||||||
|
ROUND(volumeRatio::numeric, 2) as vol,
|
||||||
|
symbol,
|
||||||
|
TO_CHAR(createdAt, 'MM-DD HH24:MI') as time
|
||||||
|
FROM "BlockedSignal"
|
||||||
|
WHERE blockReason = 'QUALITY_SCORE_TOO_LOW'
|
||||||
|
AND (pricePosition < 10 OR pricePosition > 90)
|
||||||
|
ORDER BY signalQualityScore DESC;
|
||||||
|
|
||||||
|
-- ADX distribution in blocked signals
|
||||||
|
SELECT
|
||||||
|
CASE
|
||||||
|
WHEN adx >= 25 THEN 'Strong (25+)'
|
||||||
|
WHEN adx >= 20 THEN 'Moderate (20-25)'
|
||||||
|
WHEN adx >= 15 THEN 'Weak (15-20)'
|
||||||
|
ELSE 'Very Weak (<15)'
|
||||||
|
END as adx_tier,
|
||||||
|
COUNT(*) as count,
|
||||||
|
ROUND(AVG(signalQualityScore)::numeric, 1) as avg_score
|
||||||
|
FROM "BlockedSignal"
|
||||||
|
WHERE blockReason = 'QUALITY_SCORE_TOO_LOW'
|
||||||
|
AND adx IS NOT NULL
|
||||||
|
GROUP BY adx_tier
|
||||||
|
ORDER BY MIN(adx) DESC;
|
||||||
|
```
|
||||||
|
|
||||||
|
**Usage Pattern:**
|
||||||
|
1. Run "Monitor Data Collection" queries weekly during Phase 1
|
||||||
|
2. Once 10+ blocked signals collected, run "Compare Blocked vs Executed" queries
|
||||||
|
3. Use "Analyze Specific Patterns" to identify optimization opportunities
|
||||||
|
4. Full query reference: `BLOCKED_SIGNALS_TRACKING.md`
|
||||||
|
|
||||||
## Common Pitfalls
|
## Common Pitfalls
|
||||||
|
|
||||||
1. **Prisma not generated in Docker:** Must run `npx prisma generate` in Dockerfile BEFORE `npm run build`
|
1. **Prisma not generated in Docker:** Must run `npx prisma generate` in Dockerfile BEFORE `npm run build`
|
||||||
|
|||||||
Reference in New Issue
Block a user