Commit Graph

13 Commits

Author SHA1 Message Date
mindesbunister
4dc42075cb feat: Add direction-specific quality thresholds to settings UI
- Added MIN_SIGNAL_QUALITY_SCORE_LONG and _SHORT fields to Settings interface
- Replaced single quality score field with three fields:
  1. Global Fallback (91) - for BTC and other symbols
  2. LONG Signals (90) - based on 71.4% WR data analysis
  3. SHORT Signals (95) - based on toxic 28.6% WR data, blocks low-quality shorts
- Updated app/api/settings/route.ts GET/POST handlers to support direction-specific fields
- Fixed field naming consistency (MIN_SIGNAL_QUALITY_SCORE vs MIN_QUALITY_SCORE)
- User can now adjust direction-specific thresholds via settings UI without .env editing
- Container deployed: 2025-11-23T14:25:34 UTC
2025-11-23 15:26:13 +01:00
mindesbunister
a7c593077d critical: Fix duplicate Telegram notifications + settings UI restart requirement
Issue #1: Duplicate Telegram Notifications (Nov 23, 2025)
Symptom: Manual closures sent 2x identical notifications
Root Cause: Monitoring loop processes trades from array snapshot, trade removed
during async processing but loop continues with stale reference

Real Incident:
- Trade cmibdii4k0004pe07nzfmturo (SHORT SOL)
- Entry $128.85, Exit $128.79, P&L +$6.44
- Duplicate 'POSITION CLOSED' messages sent
- Logs show 'Manual closure recorded' twice
- Database saved correctly (only once)

Fix (lib/trading/position-manager.ts):
Added guard at start of checkTradeConditions():
```typescript
  console.log(`⏭️ Skipping ${trade.symbol} - already removed`)
  return
}
```

Why needed: handlePriceUpdate() collects trades into array BEFORE async processing
Loop continues even after handleManualClosure() removes trade from Map
Second iteration processes removed trade → duplicate notification

Issue #2: Settings UI Changes Require Container Restart (Nov 23, 2025)
Symptom: Quality threshold raised to 91 via settings UI, but trade with quality 90
still executed (should've been blocked)

Timeline:
- Nov 21 18:55: Threshold raised to 91 in code (commit 08482b4)
- Nov 22 15:08: Container restarted
- Nov 22 16:15: Trade #9 quality 90 executed  (should've blocked)
- .env file had MIN_SIGNAL_QUALITY_SCORE=81 (old value)

Root Cause: Settings API writes to .env but in-memory process.env update doesn't
propagate to all modules. Container restart required for full effect.

Fix (app/api/settings/route.ts):
Added console warning: "⚠️ Container restart recommended"
Changed comment from "immediate effect" to "temporary, may not persist"

User Impact:
- Settings changes via UI now show proper expectations
- Manual .env edit + restart remains required for critical settings
- Future: Add /api/restart call after settings save

Trade #9 Analysis (quality 90, should've been blocked):
- ADX: 17.8 (weak, below 18 minimum)
- Price Position: 98.6% (extreme high, chasing top)
- Loss: -$22.41 (-0.15%)
- Result: Validates quality 91 threshold works correctly

Commits: 08482b4 (threshold raise), this commit (duplicate fix + restart requirement)
2025-11-23 10:57:32 +01:00
mindesbunister
df6c388639 fix: Update POST endpoint to use MIN_SIGNAL_QUALITY_SCORE
Forgot to update the POST endpoint variable name. Both GET and POST
now use MIN_SIGNAL_QUALITY_SCORE consistently.
2025-11-19 09:59:11 +01:00
mindesbunister
0d546dc267 fix: Correct MIN_QUALITY_SCORE to MIN_SIGNAL_QUALITY_SCORE
Settings UI was using wrong variable name (MIN_QUALITY_SCORE) while
code reads MIN_SIGNAL_QUALITY_SCORE. This caused quality score changes
in settings UI to have no effect.

Fixed:
- Settings API now reads/writes MIN_SIGNAL_QUALITY_SCORE
- Updated .env file to use correct variable name
- User's quality score increase to 81 will now work

Related: User increased min quality from 60 to 81 to filter out
small chop trades (avoiding -$99 trade with quality score 80).
2025-11-19 09:53:49 +01:00
mindesbunister
6f0a1bb49b feat: Implement percentage-based position sizing
- Add usePercentageSize flag to SymbolSettings and TradingConfig
- Add calculateActualPositionSize() and getActualPositionSizeForSymbol() helpers
- Update execute and test endpoints to calculate position size from free collateral
- Add SOLANA_USE_PERCENTAGE_SIZE, ETHEREUM_USE_PERCENTAGE_SIZE, USE_PERCENTAGE_SIZE env vars
- Configure SOL to use 100% of portfolio (auto-adjusts to available balance)
- Fix TypeScript errors: replace fillNotionalUSD with actualSizeUSD
- Remove signalQualityVersion and fullyClosed references (not in interfaces)
- Add comprehensive documentation in PERCENTAGE_SIZING_FEATURE.md

Benefits:
- Prevents insufficient collateral errors by using available balance
- Auto-scales positions as account grows/shrinks
- Maintains risk proportional to capital
- Flexible per-symbol configuration (SOL percentage, ETH fixed)
2025-11-10 13:35:10 +01:00
mindesbunister
6d5991172a feat: Implement ATR-based dynamic TP2 system and fix P&L calculation
- Add ATR-based dynamic TP2 scaling from 0.7% to 3.0% based on volatility
- New config options: useAtrBasedTargets, atrMultiplierForTp2, minTp2Percent, maxTp2Percent
- Enhanced settings UI with ATR controls and updated risk calculator
- Fix external closure P&L calculation using unrealized P&L instead of volatile current price
- Update execute and test endpoints to use calculateDynamicTp2() function
- Maintain 25% runner system for capturing extended moves (4-5% targets)
- Add environment variables for ATR-based configuration
- Better P&L accuracy for manual position closures
2025-11-07 17:01:22 +01:00
mindesbunister
a100945864 Enhance trailing stop with ATR-based sizing 2025-11-05 15:28:12 +01:00
mindesbunister
80635fc0c0 feat: Add position scaling controls to settings UI
**UI Updates (settings page):**
Added new '📈 Position Scaling' section with:
- Enable/disable toggle (defaults to OFF)
- Min quality score slider (60-90, default 75)
- Min profit to scale (0-2%, default 0.4%)
- Scale size percent (10-100%, default 50%)
- Max position multiplier (1-3x, default 2.0x)
- Min ADX increase (0-15, default 5)
- Max price position for scale (50-90%, default 70%)

**Visual Feedback:**
- Purple-themed section with warning banner
- Real-time risk calculator showing:
  * Original position size (SOL example)
  * Scale addition amount
  * Total after 1 scale
  * Maximum possible position size
- Dynamic descriptions explain each parameter
- Warning: 'DISABLED by default' with red indicator

**API Updates:**
Extended /api/settings GET/POST to handle 7 new fields:
- ENABLE_POSITION_SCALING
- MIN_SCALE_QUALITY_SCORE
- MIN_PROFIT_FOR_SCALE
- MAX_SCALE_MULTIPLIER
- SCALE_SIZE_PERCENT
- MIN_ADX_INCREASE
- MAX_PRICE_POSITION_FOR_SCALE

**User Flow:**
1. Navigate to http://localhost:3001/settings
2. Scroll to '📈 Position Scaling' section
3. Toggle 'Enable Position Scaling' to 1
4. Adjust thresholds (defaults are conservative)
5. See live calculation of scaling impact
6. Click 'Save Settings'
7. Click 'Restart Bot' to apply

**Safety:**
- Feature OFF by default (requires explicit opt-in)
- Warning banner explains scaling behavior
- Risk calculator shows maximum exposure
- Conservative defaults prevent aggressive scaling
- All parameters adjustable via sliders

**Example:**
With defaults (SOL $210×10x = $2100):
- Scale adds: $1050 (50% of $2100)
- Total after 1 scale: $3150
- Max position (2x): $4200

User can now enable and configure position scaling without touching .env file!
2025-11-03 15:45:11 +01:00
mindesbunister
881a99242d feat: Add per-symbol trading controls for SOL and ETH
- Add SymbolSettings interface with enabled/positionSize/leverage fields
- Implement per-symbol ENV variables (SOLANA_*, ETHEREUM_*)
- Add SOL and ETH sections to settings UI with enable/disable toggles
- Add symbol-specific test buttons (SOL LONG/SHORT, ETH LONG/SHORT)
- Update execute and test endpoints to check symbol enabled status
- Add real-time risk/reward calculator per symbol
- Rename 'Position Sizing' to 'Global Fallback' for clarity
- Fix position manager P&L calculation for externally closed positions
- Fix zero P&L bug affecting 12 historical trades
- Add SQL scripts for recalculating historical P&L data
- Move archive TypeScript files to .archive to fix build

Defaults:
- SOL: 10 base × 10x leverage = 100 notional (profit trading)
- ETH:  base × 1x leverage =  notional (data collection)
- Global: 10 × 10x for BTC and other symbols

Configuration priority: Per-symbol ENV > Market config > Global ENV > Defaults
2025-11-03 10:28:48 +01:00
mindesbunister
a6005b6a5b Add configurable minimum quality score setting
- Added minQualityScore to TradingConfig (default: 60)
- Updated settings UI with slider control (0-100, step 5)
- Updated check-risk endpoint to use config value
- Made scoreSignalQuality function accept minScore parameter
- Updated API to read/write MIN_QUALITY_SCORE env variable
- Allows users to adjust quality threshold from settings page
2025-11-01 01:59:08 +01:00
mindesbunister
4ae9c38ad8 Add trailing stop feature for runner position + fix settings persistence
- Implemented trailing stop logic in Position Manager for remaining position after TP2
- Added new ActiveTrade fields: tp2Hit, trailingStopActive, peakPrice
- New config settings: useTrailingStop, trailingStopPercent, trailingStopActivation
- Added trailing stop UI section in settings page with explanations
- Fixed env file parsing regex to support numbers in variable names (A-Z0-9_)
- Settings now persist correctly across container restarts
- Added back arrow navigation on settings page
- Updated all API endpoints and test files with new fields
- Trailing stop activates when runner reaches configured profit level
- SL trails below peak price by configurable percentage
2025-10-27 12:11:10 +01:00
mindesbunister
1c4cc5d1fb feat: Add customizable TP size percentages and fix settings save
**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
2025-10-24 15:35:36 +02:00
mindesbunister
2405bff68a feat: Complete Trading Bot v4 with Drift Protocol integration
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
2025-10-24 14:24:36 +02:00