- Split QUALITY_LEVERAGE_THRESHOLD into separate LONG and SHORT variants
- Added /api/drift/account-health endpoint for real-time collateral data
- Updated settings UI to show separate controls for LONG/SHORT thresholds
- Position size calculations now use dynamic collateral from Drift account
- Updated .env and docker-compose.yml with new environment variables
- LONG threshold: 95, SHORT threshold: 90 (configurable independently)
Files changed:
- app/api/drift/account-health/route.ts (NEW) - Account health API endpoint
- app/settings/page.tsx - Added collateral state, separate threshold inputs
- app/api/settings/route.ts - GET/POST handlers for LONG/SHORT thresholds
- .env - Added QUALITY_LEVERAGE_THRESHOLD_LONG/SHORT variables
- docker-compose.yml - Added new env vars with fallback defaults
Impact:
- Users can now configure quality thresholds independently for LONG vs SHORT signals
- Position size display dynamically updates based on actual Drift account collateral
- More flexible risk management with direction-specific leverage tiers
Added 4 adaptive leverage environment variables to docker-compose.yml
so they are properly passed to the container:
- USE_ADAPTIVE_LEVERAGE (default: true)
- HIGH_QUALITY_LEVERAGE (default: 5)
- LOW_QUALITY_LEVERAGE (default: 1)
- QUALITY_LEVERAGE_THRESHOLD (default: 95)
Without these in the environment section, the container couldn't
access them via process.env, causing the settings API to return null.
Now the settings UI can properly load and save adaptive leverage
configuration via the web interface.
- Changed both LONG and SHORT revenge to require 90-second confirmation
- OLD: LONG immediate entry, SHORT 60s confirmation
- NEW: Both require 90s (1.5 minutes) sustained move before entry
- Reasoning: Filters retest wicks while still catching big moves
Real-world scenario (Nov 26, 2025):
- Stop-out: $138.00 at 14:51 CET
- Would enter immediately: $136.32
- Retest bounce: $137.50 (would stop out again at $137.96)
- Actual move: $136 → $144.50 (+$530 opportunity)
- OLD system: Enters $136.32, stops $137.50 = LOSS AGAIN
- NEW system (90s): Waits through retest, enters safely after confirmation
Option 2 approach (1-2 minute confirmation):
- Fast enough to catch moves (not full 5min candle)
- Slow enough to filter quick wick reversals
- Tracks firstCrossTime, resets if price leaves zone
- Logs progress: '⏱️ LONG/SHORT revenge: X.Xmin in zone (need 1.5min)'
Files changed:
- lib/trading/stop-hunt-tracker.ts (lines 254-310)
Deployment:
- Container restarted: 2025-11-26 20:52:55 CET
- Build time: 71.8s compilation
- Status: ✅ DEPLOYED and VERIFIED
Future consideration:
- User suggested TradingView signals every 1 minute for better granularity
- Decision: Validate 90s approach first with real stop-outs
- Added MIN_SIGNAL_QUALITY_SCORE_LONG, _SHORT, and global to environment section
- Required for ENV variables to be available in Node.js process.env
- Without this, container couldn't read .env values for direction-specific thresholds
Testing verified:
- LONG quality 90: ✅ ALLOWED (threshold 90)
- SHORT quality 70: ❌ BLOCKED (threshold 95)
- Direction-specific logic working correctly
- Add tzdata package to Dockerfile runner stage
- Set TZ=Europe/Berlin in docker-compose.yml for both trading-bot and postgres
- All container timestamps now show CET instead of UTC
- User-friendly log times matching local time
Files changed:
- Dockerfile: Added tzdata to runner stage
- docker-compose.yml: Added TZ environment variable
- Auto-close phantom positions immediately via market order
- Return HTTP 200 (not 500) to allow n8n workflow continuation
- Save phantom trades to database with full P&L tracking
- Exit reason: 'manual' category for phantom auto-closes
- Protects user during unavailable hours (sleeping, no phone)
- Add Docker build best practices to instructions (background + tail)
- Document phantom system as Critical Component #1
- Add Common Pitfall #30: Phantom notification workflow
Why auto-close:
- User can't always respond to phantom alerts
- Unmonitored position = unlimited risk exposure
- Better to exit with small loss/gain than leave exposed
- Re-entry possible if setup actually good
Files changed:
- app/api/trading/execute/route.ts: Auto-close logic
- .github/copilot-instructions.md: Documentation + build pattern
- Added TAKE_PROFIT_1_SIZE_PERCENT env var
- Added TAKE_PROFIT_2_SIZE_PERCENT env var
- These were missing causing container to use defaults
- Requires 'docker compose up -d --force-recreate' not just restart
**New Features:**
- Added TAKE_PROFIT_1_SIZE_PERCENT (default: 50%)
- Added TAKE_PROFIT_2_SIZE_PERCENT (default: 50%)
- Users can now control WHAT % to close at each TP level
- Risk calculator now shows actual TP sizes dynamically
**Bug Fixes:**
- Fixed settings save failure by mounting .env file to container
- Added .env volume mount in docker-compose.yml
- Fixed permission issues (.env must be chmod 666)
**UI Changes:**
- Split TP controls into Price % and Size %
- TP1 Price: When to exit first partial
- TP1 Size: What % of position to close (1-100%)
- TP2 Price: When to exit second partial
- TP2 Size: What % of remaining to close (1-100%)
- Risk calculator displays dynamic percentages
**Example:**
- TP1 at +1% price, close 60% of position
- TP2 at +2% price, close 40% of remaining (24% of original)
- Total exit: 84% of position at TP levels
- Added restart button to settings page
- Created /api/restart endpoint (file-flag based)
- Implemented watch-restart.sh daemon
- Added systemd service for restart watcher
- Updated README with restart setup instructions
- Container automatically restarts when settings changed
Settings flow:
1. User edits settings in web UI
2. Click 'Save Settings' to persist to .env
3. Click 'Restart Bot' to apply changes
4. Watcher detects flag and restarts container
5. New settings loaded automatically
Features:
- Autonomous trading system with Drift Protocol on Solana
- Real-time position monitoring with Pyth price feeds
- Dynamic stop-loss and take-profit management
- n8n workflow integration for TradingView signals
- Beautiful web UI for settings management
- REST API for trade execution and monitoring
- Next.js 15 with standalone output mode
- TypeScript with strict typing
- Docker containerization with multi-stage builds
- PostgreSQL database for trade history
- Singleton pattern for Drift client connection pooling
- BN.js for BigNumber handling (Drift SDK requirement)
- Configurable stop-loss and take-profit levels
- Breakeven trigger and profit locking
- Daily loss limits and trade cooldowns
- Slippage tolerance controls
- DRY_RUN mode for safe testing
- Real-time risk calculator
- Interactive sliders for all parameters
- Live preview of trade outcomes
- Position sizing and leverage controls
- Beautiful gradient design with Tailwind CSS
- POST /api/trading/execute - Execute trades
- POST /api/trading/close - Close positions
- GET /api/trading/positions - Monitor active trades
- GET /api/trading/check-risk - Validate trade signals
- GET /api/settings - View configuration
- POST /api/settings - Update configuration
- Fixed Borsh serialization errors (simplified order params)
- Resolved RPC rate limiting with singleton pattern
- Fixed BigInt vs BN type mismatches
- Corrected order execution flow
- Improved position state management
- Complete setup guides
- Docker deployment instructions
- n8n workflow configuration
- API reference documentation
- Risk management guidelines
- Runs on port 3001 (external), 3000 (internal)
- Uses Helius RPC for optimal performance
- Production-ready with error handling
- Health monitoring and logging