From 2e47731e8ec8bdf6d3c0515a360dd21329dc6e6c Mon Sep 17 00:00:00 2001 From: mindesbunister Date: Mon, 10 Nov 2025 15:43:48 +0100 Subject: [PATCH] Update AI instructions with latest fixes Added sections: - Recent Critical Fixes (2024-11-10): Runner system + anti-chop filter V2 - JavaScript || vs ?? operator gotcha (#21) - Range-bound chop detection details (#22) - Updated anti-chop filter description with backtest results --- .github/copilot-instructions.md | 52 ++++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index fab8f7e..78b44f4 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -30,6 +30,31 @@ **Manual Trading via Telegram:** Send plain-text messages like `long sol`, `short eth`, `long btc` to open positions instantly (bypasses n8n, calls `/api/trading/execute` directly with preset healthy metrics). +## Recent Critical Fixes (2024-11-10) + +### Runner System - Three Cascading Bugs Fixed +The TP2-as-runner feature was broken by three separate bugs: + +1. **P&L Calculation Bug (65x inflation)** - `lib/drift/orders.ts`, `lib/trading/position-manager.ts` + - Calculated P&L on notional ($2,100) instead of collateral ($210) + - Database showed +$1,345, reality was -$806 loss + - Fix: `collateralUSD = notional / leverage`, calculate P&L on collateral + +2. **Post-TP1 Logic Bug** - `lib/trading/position-manager.ts` lines 1010-1030 + - Placed TP order at TP2 price after TP1 hit (closed position instead of trailing) + - Fix: Check `if (config.takeProfit2SizePercent === 0)` to skip TP orders + +3. **JavaScript || Operator Bug** - `app/api/trading/execute/route.ts`, `test/route.ts` + - `config.takeProfit2SizePercent || 100` treated 0 as falsy → returned 100 + - Fix: Use `??` (nullish coalescing) instead of `||` for numeric defaults + +### Anti-Chop Filter V2 - Range-Bound Detection +- **Problem:** Flip-flop trades in sideways markets (stopped out in 8-24 seconds) +- **Fix:** -25 points when price position <40% AND ADX <25 (both conditions) +- **Location:** `lib/trading/signal-quality.ts` lines 145-165 +- **Impact:** Win rate 43.8% → 55.6%, profit per trade +86% +- **Backtest:** Would have blocked all 3 flip-flop trades from today + ## Critical Components ### 1. Signal Quality Scoring (`lib/trading/signal-quality.ts`) @@ -51,7 +76,10 @@ scoreSignalQuality({ **Price position penalties (all timeframes):** - Long at 90-95%+ range: -15 to -30 points (chasing highs) - Short at <5-10% range: -15 to -30 points (chasing lows) -- Prevents flip-flop losses from entering range extremes +- **ANTI-CHOP (v2024-11-10):** Price position <40% + ADX <25 = -25 points (RANGE-BOUND CHOP) + - Prevents flip-flop losses from entering range extremes + - Targets sideways markets where price is low in range but trend is weak + - Backtest: 43.8% → 55.6% win rate, 86% higher profit per trade **Key behaviors:** - Returns score 0-100 and detailed breakdown object @@ -436,6 +464,28 @@ trade.realizedPnL += actualRealizedPnL // NOT: result.realizedPnL from SDK - Applies to all aggregations: SUM(), AVG(), ROUND() - all return Decimal types - Example: `/api/analytics/version-comparison` converts all numeric fields +21. **JavaScript || vs ?? operators CRITICAL:** When setting default values for numeric config, ALWAYS use `??` (nullish coalescing): + ```typescript + // WRONG - treats 0 as falsy: + tp2SizePercent: config.takeProfit2SizePercent || 100 // 0 becomes 100! + + // CORRECT - only null/undefined are nullish: + tp2SizePercent: config.takeProfit2SizePercent ?? 100 // 0 stays 0 + ``` + - `||` treats `0`, `false`, `""`, `null`, `undefined` as falsy + - `??` only treats `null` and `undefined` as nullish + - Critical for runner system: `TAKE_PROFIT_2_SIZE_PERCENT=0` must be respected + - This bug caused TP2 orders to be placed at 100% despite config setting 0 + - Applies to ALL numeric config values where 0 is valid (TP sizes, leverage, thresholds) + +22. **Range-bound chop detection:** The anti-chop filter V2 (implemented 2024-11-10) prevents flip-flop losses: + - Detection: Price position <40% of range + ADX <25 = weak range-bound market + - Penalty: -25 points to signal quality score + - Why: Trades entering early in range with weak trend get whipsawed in seconds + - Evidence: Backtest showed 5 flip-flop trades (8-24 second holds) all had this pattern + - Result: Win rate improved from 43.8% to 55.6%, profit per trade +86% + - Implementation: `lib/trading/signal-quality.ts` checks both conditions before price position scoring + ## File Conventions - **API routes:** `app/api/[feature]/[action]/route.ts` (Next.js 15 App Router)