A post-mortem, not a flex. I ran a symmetric long/short strategy on Hyperliquid perps for 47 days and the numbers forced me to kill shorting entirely.
The setup
Four coins: LINK, ETH, BTC, SOL. 3x leverage. Entries gated by a 5-signal score:
- RSI (30 / 70 thresholds)
- Bollinger Band position (0.2 / 0.8)
- MACD crossover
- 4h timeframe confirmation (hard block if 4h disagrees)
- BTC correlation filter (skip if BTC is flat + low vol)
Score of 6+ = enter. Exit on trail (1.5% ATR-adjusted) or SL (1.8% static) or opposite-direction signal.
What the P&L said at the 47-day mark
| direction | trades | wins | WR | net PnL |
|---|---|---|---|---|
| LONG | 64 | 33 | 52% | +$15.00 |
| SHORT | 81 | 39 | 48% | -$42.00 |
4% win rate gap, reflected across 145 trades. That's not a bad-sample-size complaint anymore, that's signal.
Why shorts were bleeding even with a decent WR
Two reasons, in order of impact:
1. Asymmetric payout structure. The winning longs were catching multi-hour momentum moves. The winning shorts were catching pullbacks in an uptrend that reversed fast. Average winning long: +1.9%. Average winning short: +1.1%. Same SL distance on both sides, very different expected value.
2. Funding rates. On the coins I was trading, funding was positive more weeks than not. Shorts pay, longs receive. Over 47 days that's a real drag — not huge per trade, but it compounds against a thin edge.
The fix (one config line)
# strategy.py
MIN_SCORE_LONG = 5.0 # unchanged
MIN_SCORE_SHORT = 99.0 # was 5.0 -> effectively disable shorts
Setting MIN_SCORE_SHORT so high that no realistic score combination hits it is cleaner than deleting the short branch. Keeps the direction-split telemetry intact so I can spot if the regime flips and shorts become viable again.
What happened in the 2 weeks since
- 19 long entries, 12 wins, 7 losses
- Net: +$18
- No regrets about missed shorts (I watched the simulated-short branch — it would have taken 4 more losers)
The broader lesson
I had 81 trades of 'evidence' that my strategy worked. It did — on one side of the tape. The aggregate P&L was net-negative and I assumed the tuning was off. The tuning was fine. The direction was broken.
Before you assume your strategy is symmetric:
longs = [t for t in trades if t.direction == 'long']
shorts = [t for t in trades if t.direction == 'short']
print(f"LONG: {len(longs):3d} trades, {sum(t.pnl for t in longs):+.2f}")
print(f"SHORT: {len(shorts):3d} trades, {sum(t.pnl for t in shorts):+.2f}")
Four lines. I should have had them in the monitor from day one.
Open question
The regime bias could flip. I'm still tracking the short-side hypothetical P&L every week — if it goes net-positive for 3 consecutive weeks I'll lower the threshold back down. But I'm not going to 'feel it out' anymore. The split-by-direction number is the only thing I trust.