diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index e8a9077..04c95db 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -50,8 +50,18 @@ - Safety bounds: MIN/MAX caps prevent extremes - Falls back to fixed % if ATR unavailable - **Runner:** 40% remaining after TP1 (configurable via `TAKE_PROFIT_1_SIZE_PERCENT=60`) -- **Trailing Stop:** ATR-based (1.3-1.5x ATR multiplier), activates after TP2 trigger -- **Benefits:** Regime-agnostic (adapts to bull/bear automatically), asset-agnostic (SOL vs BTC different ATR) +- **Trailing Stop:** ATR-based with ADX multiplier (Nov 19, 2025 enhancement): + - Base: ATR × 1.5 multiplier + - **ADX-based widening (graduated):** + - ADX > 30: 1.5× multiplier (very strong trends) + - ADX 25-30: 1.25× multiplier (strong trends) + - ADX < 25: 1.0× multiplier (base trail, weak/moderate trends) + - **Profit acceleration:** Profit > 2%: additional 1.3× multiplier + - **Combined effect:** ADX 29.3 + 2% profit = trail multiplier 1.5 × 1.3 = 1.95× + - **Purpose:** Capture more of massive trend moves (e.g., 38% MFE trades) + - **Backward compatible:** Trades without ADX use base 1.5× multiplier + - Activates after TP2 trigger +- **Benefits:** Regime-agnostic (adapts to bull/bear automatically), asset-agnostic (SOL vs BTC different ATR), trend-strength adaptive (wider trail for strong trends) - **Note:** All UI displays dynamically calculate runner% as `100 - TAKE_PROFIT_1_SIZE_PERCENT` **Per-Symbol Configuration:** SOL and ETH have independent enable/disable toggles and position sizing: @@ -491,7 +501,17 @@ await positionManager.addTrade(activeTrade) - **TP2-as-Runner system**: TP1 (configurable %, default 75%) → TP2 trigger (no close, activate trailing) → Runner (remaining %) with ATR-based trailing stop - Dynamic SL adjustments: Moves to breakeven after TP1, locks profit at +1.2% - **On-chain order synchronization:** After TP1 hits, calls `cancelAllOrders()` then `placeExitOrders()` with updated SL price at breakeven (uses `retryWithBackoff()` for rate limit handling) -- **ATR-based trailing stop:** Calculates trail distance as `(atrAtEntry / currentPrice × 100) × trailingStopAtrMultiplier`, clamped between min/max % +- **ATR-based trailing stop with ADX multiplier (Nov 19, 2025):** + - Base calculation: `(atrAtEntry / currentPrice × 100) × trailingStopAtrMultiplier` + - **ADX-based widening:** Multiplier adjusted based on trend strength at entry + - `trade.adxAtEntry > 30`: Apply 1.5× multiplier (very strong trends) + - `trade.adxAtEntry 25-30`: Apply 1.25× multiplier (strong trends) + - `trade.adxAtEntry < 25`: Apply 1.0× multiplier (base trail) + - **Profit acceleration:** If current profit > 2%, apply additional 1.3× multiplier + - **Combined effect:** ADX 29.3 + 2% profit = 1.5 × 1.3 = 1.95× total multiplier + - **Purpose:** Capture more profit on massive trend moves (e.g., 38% MFE trades) + - **Backward compatible:** Trades without `adxAtEntry` use base multiplier + - Trail distance clamped between min/max % for safety - Trailing stop: Activates when TP2 price hit, tracks `peakPrice` and trails dynamically - Closes positions via `closePosition()` market orders when targets hit - Acts as backup if on-chain orders don't fill @@ -2654,7 +2674,15 @@ if (!enabled) { - Verify TP1 hit → 75% close → SL moved to breakeven - SQL: Check `tp1Hit`, `slMovedToBreakeven`, `currentSize` in Trade table - Compare: Position Manager logs vs actual Drift position size -10. **Calculation changes:** Add verbose logging and verify with SQL + - **ADX multiplier verification:** Watch for "Strong trend (ADX X): Trail multiplier..." messages +11. **Trailing stop changes:** + - ADX multiplier logic in Position Manager (lines 1210-1243) + - Requires `adxAtEntry` field in ActiveTrade interface + - Test with known ADX values to verify graduated multipliers (>30: 1.5×, 25-30: 1.25×, <25: 1.0×) + - Profit acceleration: >2% profit adds 1.3× multiplier + - Log shows: `Strong trend (ADX 29.3): Trail multiplier 1.5x → 1.88x (profit acceleration applied)` + - Backward compatible: Trades without ADX use base multiplier +12. **Calculation changes:** Add verbose logging and verify with SQL - Log every intermediate step, especially unit conversions - Never assume SDK data format - log raw values to verify - SQL query with manual calculation to compare results