- Create moneyline_1min_price_feed.pinescript (70% smaller payload) - Remove ATR/ADX/RSI/VOL/POS from 1-minute alerts (not used for decisions) - Keep only price + symbol + timeframe for market data cache - Document rationale in docs/1MIN_SIMPLIFIED_FEED.md - Fix: 5-minute trading signals being dropped due to 1-minute flood (60/hour) - Impact: Preserve priority for actual trading signals
220 lines
7.6 KiB
Markdown
220 lines
7.6 KiB
Markdown
# System Architecture & Design
|
||
|
||
**Core technical design documentation for Trading Bot v4 autonomous trading system.**
|
||
|
||
This directory contains architectural decisions, system design patterns, and technical specifications for major system components.
|
||
|
||
---
|
||
|
||
## 🏗️ Key Architecture Documents
|
||
|
||
### **Adaptive Leverage System**
|
||
- `ADAPTIVE_LEVERAGE_SYSTEM.md` - **Complete implementation guide**
|
||
- Quality-based leverage tiers (10x for ≥95, 5x for 90-94)
|
||
- Direction-specific thresholds (LONG ≥95, SHORT ≥90)
|
||
- Settings UI with real-time collateral display
|
||
- Risk-adjusted position sizing based on signal confidence
|
||
- **Status:** ✅ ACTIVE in production (Dec 1, 2025)
|
||
|
||
### **ATR Trailing Stop System**
|
||
- `ATR_TRAILING_STOP_FIX.md` - **Phase 7.3 adaptive trailing enhancement**
|
||
- Real-time 1-minute ADX monitoring (not static entry ADX)
|
||
- Dynamic trail multipliers: base 1.5× + ADX strength tier + acceleration bonus
|
||
- ADX acceleration (+7 points) → 1.3× multiplier
|
||
- Profit acceleration (>2%) → additional 1.3× multiplier
|
||
- Combined max: 3.16× multiplier for strong trending moves
|
||
- **Status:** ✅ DEPLOYED (Nov 27, 2025)
|
||
|
||
### **Indicator Version Tracking**
|
||
- `INDICATOR_VERSION_TRACKING.md` - **TradingView strategy versioning**
|
||
- v9: Money Line with MA Gap + Momentum SHORT Filter (PRODUCTION)
|
||
- v8: Money Line Sticky Trend (ARCHIVED - 57.1% WR baseline)
|
||
- Historical versions (v5-v7) for comparison
|
||
- Database field tracking for performance analysis
|
||
- **Purpose:** A/B testing and strategy evolution
|
||
|
||
### **Position Synchronization**
|
||
- `POSITION_SYNC_QUICK_REF.md` - **Position Manager sync procedures**
|
||
- Startup validation (orphan detection)
|
||
- External closure handling
|
||
- Ghost position cleanup
|
||
- Database-first state management
|
||
- **Critical for:** System restarts, container crashes
|
||
|
||
---
|
||
|
||
## 🎯 Design Principles
|
||
|
||
### **1. Database as Source of Truth**
|
||
- All state-changing operations write to database FIRST
|
||
- In-memory state (Position Manager) is derived from database
|
||
- Container restarts restore state from database
|
||
- External closures update database before removing from memory
|
||
|
||
### **2. Dual-Layer Redundancy**
|
||
- **Layer 1:** On-chain orders (Drift Protocol TP/SL limit orders)
|
||
- **Layer 2:** Software monitoring (Position Manager every 2 seconds)
|
||
- If on-chain orders fail, Position Manager executes via market orders
|
||
- Both layers track to same database for complete history
|
||
|
||
### **3. Singleton Pattern Everywhere**
|
||
```typescript
|
||
// CORRECT: Use getter functions
|
||
const driftService = await initializeDriftService()
|
||
const positionManager = await getInitializedPositionManager()
|
||
const prisma = getPrismaClient()
|
||
|
||
// WRONG: Never create multiple instances
|
||
const driftService = new DriftService() // ❌
|
||
```
|
||
|
||
### **4. Adaptive Systems Over Static Parameters**
|
||
- **ATR-based TP/SL:** Adapts to market volatility automatically
|
||
- **Adaptive Leverage:** Scales risk with signal quality
|
||
- **ADX-based Trailing:** Widens trail during trend acceleration
|
||
- **Smart Entry:** Validates price action before execution
|
||
|
||
### **5. Direction-Specific Configuration**
|
||
- LONG signals: Different quality thresholds than SHORT
|
||
- SHORT signals: Higher baseline difficulty, lower thresholds
|
||
- Momentum filters: Different for LONG (breakout) vs SHORT (reversal)
|
||
- Risk management: ADX-based runner SL positioning
|
||
|
||
---
|
||
|
||
## 📊 System Components
|
||
|
||
### **Core Services (Singletons)**
|
||
- **DriftService:** Drift Protocol SDK wrapper, WebSocket subscriptions
|
||
- **Position Manager:** Software monitoring loop (2-second price checks)
|
||
- **Pyth Price Monitor:** Real-time oracle price feeds (WebSocket)
|
||
- **Stop Hunt Tracker:** 4-hour revenge window monitoring
|
||
- **Blocked Signal Tracker:** 30-minute price tracking for blocked signals
|
||
- **Smart Validation Queue:** Pullback confirmation system (30-second checks)
|
||
|
||
### **Key Workflows**
|
||
1. **Trade Execution:** TradingView → n8n → check-risk → execute → database → Position Manager
|
||
2. **Exit Management:** Price check → TP/SL trigger → closePosition → database → Telegram notification
|
||
3. **Startup Recovery:** Database query → Drift validation → restore Position Manager → resume monitoring
|
||
4. **Ghost Detection:** Drift API check → database cleanup → Position Manager removal
|
||
|
||
### **Data Flow**
|
||
```
|
||
TradingView Alert (5-min candle)
|
||
↓ [Webhook]
|
||
n8n Parse Signal Enhanced
|
||
↓ [HTTP POST]
|
||
/api/trading/check-risk
|
||
↓ [Quality score, cooldown, duplicates]
|
||
/api/trading/execute
|
||
↓ [Market order, TP/SL placement]
|
||
Database (Trade table)
|
||
↓ [State persistence]
|
||
Position Manager (monitoring)
|
||
↓ [2-second price checks]
|
||
Exit Detection (TP1/TP2/SL/Trailing)
|
||
↓ [Market close order]
|
||
Database Update (exit details)
|
||
↓ [P&L, exit reason, timestamps]
|
||
Telegram Notification
|
||
```
|
||
|
||
---
|
||
|
||
## 🔧 Configuration Architecture
|
||
|
||
### **Three-Layer Merge Priority**
|
||
1. **Per-symbol ENV vars** (highest): `SOLANA_*`, `ETHEREUM_*`
|
||
2. **Market config** (code): `SUPPORTED_MARKETS` in config/trading.ts
|
||
3. **Global ENV vars** (fallback): `MAX_POSITION_SIZE_USD`, `LEVERAGE`
|
||
4. **Default config** (lowest): `DEFAULT_TRADING_CONFIG`
|
||
|
||
### **Key Configuration Files**
|
||
- `config/trading.ts` - Central config with merge logic
|
||
- `.env` - Environment variables (482 lines)
|
||
- `prisma/schema.prisma` - Database schema
|
||
- `.github/copilot-instructions.md` - System documentation (6,400+ lines)
|
||
|
||
---
|
||
|
||
## 🚀 Adding New Architecture
|
||
|
||
**When to Create Architecture Docs:**
|
||
- Major system component (Position Manager, Drift client, etc.)
|
||
- Risk management system (leverage, stops, entry validation)
|
||
- Data flow pattern (TradingView → execution → monitoring)
|
||
- Critical decision (database-first vs in-memory, singleton vs multiple instances)
|
||
|
||
**Template Structure:**
|
||
```markdown
|
||
# [Component Name]
|
||
|
||
**Purpose:** [One-line description]
|
||
|
||
## Architecture Decision
|
||
[Why this design was chosen, alternatives considered]
|
||
|
||
## Implementation
|
||
[Code structure, key classes, integration points]
|
||
|
||
## Data Flow
|
||
[How data moves through the component]
|
||
|
||
## Configuration
|
||
[ENV variables, defaults, merge priority]
|
||
|
||
## Error Handling
|
||
[Failure scenarios, recovery procedures]
|
||
|
||
## Verification
|
||
[How to test, expected behaviors, logs to watch]
|
||
|
||
## Deployment
|
||
[Restart requirements, migration steps]
|
||
|
||
## Lessons Learned
|
||
[What worked, what didn't, future improvements]
|
||
```
|
||
|
||
---
|
||
|
||
## 🔍 Finding Architecture Info
|
||
|
||
**By Component:**
|
||
- Leverage system → `ADAPTIVE_LEVERAGE_SYSTEM.md`
|
||
- Trailing stops → `ATR_TRAILING_STOP_FIX.md`
|
||
- Indicator versions → `INDICATOR_VERSION_TRACKING.md`
|
||
- Position sync → `POSITION_SYNC_QUICK_REF.md`
|
||
|
||
**By Pattern:**
|
||
- Singleton → All architecture docs mention singleton pattern
|
||
- Adaptive systems → ATR, Leverage, Trailing Stop docs
|
||
- Database-first → Position Sync, all architecture patterns
|
||
- Direction-specific → Leverage, Indicator docs
|
||
|
||
---
|
||
|
||
## ⚠️ Critical Architecture Constraints
|
||
|
||
**Real Money System:**
|
||
- Every architectural decision affects financial outcomes
|
||
- Database integrity is non-negotiable (write FIRST, read to restore)
|
||
- Position Manager MUST have TP/SL backup (on-chain orders can fail)
|
||
- Container restarts MUST restore full state (database = source of truth)
|
||
|
||
**Performance Requirements:**
|
||
- Position Manager: 2-second monitoring loop (not slower)
|
||
- Price feeds: WebSocket real-time (not HTTP polling)
|
||
- Order placement: <1 second execution (market orders)
|
||
- Database writes: Non-blocking (async, don't wait for confirmation)
|
||
|
||
**Scalability Limits:**
|
||
- Maximum 20 simultaneous positions tracked
|
||
- Maximum 10 trades per hour per symbol
|
||
- Drift SDK: 50 RPC calls/second burst, 10/second sustained
|
||
- PostgreSQL: 10 concurrent connections max
|
||
|
||
---
|
||
|
||
See `../README.md` for overall documentation structure.
|