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
This commit is contained in:
52
.github/copilot-instructions.md
vendored
52
.github/copilot-instructions.md
vendored
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user