← Back to Reviews
20260115_045011_micro_mr_eth_quality.md
# AI Review: micro_mr_eth_quality (1-Minute)
**Date:** Thu Jan 15 04:50:11 CET 2026
**Strategy File:** /root/trade_1m/strategies/micro_mr_eth_quality.py
---
```json
{
"score": 35,
"flags": [
"overfitting",
"execution",
"cost_sensitive",
"inconsistent"
],
"review": "## Critical Issues\n\n### 1. Severe Same-Bar Execution Problem\n\nThe strategy has a **fatal flaw** in its entry logic:\n\n```python\n# Entry checks current_rsi vs prev_rsi to detect \"recovery\"\nrsi_recovery = prev_rsi < rsi_oversold and current_rsi > prev_rsi\n\n# Then enters on the SAME bar where this is detected\nif (rsi_recovery and z_recovery and vwap_deviation < -vwap_stretch and is_bullish_bar):\n actions.append({'action': 'open_long', ...})\n```\n\nAt 1-minute timeframes, this creates unrealistic execution:\n- You detect RSI rising from oversold **after the bar closes**\n- You check if the bar is bullish (close > open) **after it's complete**\n- You enter at the close price of that **same bar**\n\nThis is **lookahead bias** - you're using information from the completed bar (is_bullish_bar, current_rsi) to enter at that bar's close price. In reality, you'd enter on the **next bar's open** at a worse price.\n\n**Impact**: At 1m timeframes, this likely accounts for 30-50% of the edge. The stress test shows only 0.7x factor for +1 bar delay, but this doesn't test the specific same-bar entry problem.\n\n### 2. Over-Engineered Entry Conditions\n\nThe strategy requires **7 simultaneous confirmations**:\n1. RSI momentum check (current vs previous)\n2. RSI absolute level (< 30 or > 70)\n3. Z-score momentum check\n4. Z-score absolute level (±1.5)\n5. VWAP deviation (±0.20%)\n6. Bullish/bearish bar direction\n7. ATR z-score filter\n\nThis is **extreme selectivity** that:\n- Creates tiny sample sizes per market regime\n- Makes results highly sensitive to parameter tweaks\n- Suggests curve-fitting to historical data\n\n**Evidence**: Only 393 trades in 2025 despite 1-minute bars. The strategy found ~80 trades/year, meaning it trades once every ~4.5 days. This extreme selectivity with so many conditions screams overfitting.\n\n### 3. Inconsistent Parameters vs. Documentation\n\nThe code **contradicts its own description**:\n\n**Documented**:\n- RSI < 20 / > 80 (\"extreme\")\n- Z-score threshold: 2.0\n- VWAP stretch: 0.30%\n- Cooldown: 12 hours (720 bars)\n\n**Actual code**:\n- RSI < 30 / > 70 (much less extreme)\n- Z-score threshold: 1.5 (33% less strict)\n- VWAP stretch: 0.20% (33% less strict)\n- Cooldown: 8 hours (480 bars)\n\nThis suggests **parameter optimization** where the author found that looser thresholds performed better in backtest, but didn't update the narrative. The mismatch is a red flag.\n\n### 4. Cost Analysis Concerns\n\nWhile average trade is 0.17% (above 0.10% threshold), this is **marginal**:\n- Gross return: 34.8% (2025)\n- After slippage: 30.9%\n- After +1 bar delay: 21.6%\n- Net after both: 17.7%\n\nThe edge shrinks by **49%** under realistic conditions. With 47% win rate at 1:1 R:R, the strategy is **barely profitable** after costs.\n\n**Sustainability**: The 0.17% average is heavily influenced by the 53% win rate years (2020, 2023, 2024). In 2021/2022 with 47% win rate, the strategy would likely fail after costs.\n\n### 5. Exit Logic Issues\n\n**No stop loss in exit logic**:\n```python\nif key in positions:\n # Only checks: time limit, VWAP touch, vol spike\n # No actual stop loss implementation!\n```\n\nThe code sets `'stop_loss_pct': 0.30` in the action, but **never checks it** in the exit logic. The backtest framework may handle this, but it's unclear if it uses:\n- Next bar's open (realistic)\n- Same bar's worst price (optimistic)\n- Instantaneous stop (impossible at 1m)\n\n**VWAP touch exit**: Exits when price hits VWAP, but this happens **on the same bar** you detect it. Same-bar execution problem again.\n\n### 6. Statistical Significance\n\nDespite 393 trades in 2025:\n- Only 161 trades in 2023 (low regime)\n- Monthly average: ~33 trades/month\n- Some months likely have <20 trades\n\nWith 50% win rate and 1:1 R:R, **20-30 trades per month** creates high variance. A few lucky/unlucky trades swing monthly returns significantly.\n\n**Concentration risk**: Not calculated, but with ~33 trades/month, the top 3 winners likely contribute >50% of monthly PnL.\n\n### 7. Microstructure Edge Questionable\n\nThe strategy claims to trade \"VWAP reversion\" but:\n- Enters when price is still 0.20% from VWAP (not at maximum deviation)\n- Requires RSI \"recovery\" (momentum) not just oversold\n- Exits at VWAP (leaves profit on table if true reversion)\n\nThis is a **momentum strategy disguised as mean reversion**. It's buying into strength after a bounce starts, not fading the extreme. This works in trending markets but fails in choppy conditions.\n\n**Evidence**: 65.6% return in 2021 (bull market) vs 11.0% in 2023 (range-bound). The strategy is regime-dependent.\n\n## Minor Issues\n\n- **Round parameters**: RSI=5, lookback=60, ATR=20 are good. But threshold=1.5, stretch=0.20% are oddly specific.\n- **Warmup period**: 180 bars is appropriate for the longest indicator.\n- **Vol filter**: ATR z-score < 1.5 is reasonable, though the emergency exit at >2.0 suggests uncertainty.\n\n## Verdict\n\nThis strategy suffers from:\n1. **Critical same-bar execution bias** that inflates returns\n2. **Over-optimization** with 7+ conditions and inconsistent parameters\n3. **Marginal cost coverage** that disappears under realistic stress\n4. **Regime dependency** masked by strong 2021 bull market returns\n\nThe 34.8% return in 2025 is likely **15-20%** in reality after fixing execution and applying realistic slippage. The Sharpe of 4.03 would drop to ~2.0, and several months would be negative.\n\n**Not production-ready** without major refactoring of entry timing.",
"review": "## Critical Issues\n\n### 1. Severe Same-Bar Execution Problem\n\nThe strategy has a **fatal flaw** in its entry logic:\n\n```python\n# Entry checks current_rsi vs prev_rsi to detect \"recovery\"\nrsi_recovery = prev_rsi < rsi_oversold and current_rsi > prev_rsi\n\n# Then enters on the SAME bar where this is detected\nif (rsi_recovery and z_recovery and vwap_deviation < -vwap_stretch and is_bullish_bar):\n actions.append({'action': 'open_long', ...})\n```\n\nAt 1-minute timeframes, this creates unrealistic execution:\n- You detect RSI rising from oversold **after the bar closes**\n- You check if the bar is bullish (close > open) **after it's complete**\n- You enter at the close price of that **same bar**\n\nThis is **lookahead bias** - you're using information from the completed bar (is_bullish_bar, current_rsi) to enter at that bar's close price. In reality, you'd enter on the **next bar's open** at a worse price.\n\n**Impact**: At 1m timeframes, this likely accounts for 30-50% of the edge. The stress test shows only 0.7x factor for +1 bar delay, but this doesn't test the specific same-bar entry problem.\n\n### 2. Over-Engineered Entry Conditions\n\nThe strategy requires **7 simultaneous confirmations**:\n1. RSI momentum check (current vs previous)\n2. RSI absolute level (< 30 or > 70)\n3. Z-score momentum check\n4. Z-score absolute level (±1.5)\n5. VWAP deviation (±0.20%)\n6. Bullish/bearish bar direction\n7. ATR z-score filter\n\nThis is **extreme selectivity** that:\n- Creates tiny sample sizes per market regime\n- Makes results highly sensitive to parameter tweaks\n- Suggests curve-fitting to historical data\n\n**Evidence**: Only 393 trades in a full year despite 1-minute bars. The strategy found ~80 trades/year, meaning it trades once every ~4.5 days. This extreme selectivity with so many conditions screams overfitting.\n\n### 3. Inconsistent Parameters vs. Documentation\n\nThe code **contradicts its own description**:\n\n**Documented**:\n- RSI < 20 / > 80 (\"extreme\")\n- Z-score threshold: 2.0\n- VWAP stretch: 0.30%\n- Cooldown: 12 hours (720 bars)\n\n**Actual code**:\n- RSI < 30 / > 70 (much less extreme)\n- Z-score threshold: 1.5 (33% less strict)\n- VWAP stretch: 0.20% (33% less strict)\n- Cooldown: 8 hours (480 bars)\n\nThis suggests **parameter optimization** where the author found that looser thresholds performed better in backtest, but didn't update the narrative. The mismatch is a red flag.\n\n### 4. Cost Analysis Concerns\n\nWhile average trade is 0.17% (above 0.10% threshold), this is **marginal**:\n- After slippage alone: Returns drop ~11%\n- After +1 bar delay: Returns drop ~30%\n- Net after both: Returns drop ~49%\n\nThe edge shrinks by **nearly half** under realistic conditions. With 47% win rate at 1:1 R:R, the strategy is **barely profitable** after costs.\n\n**Sustainability**: The average trade profit is heavily influenced by the 53%+ win rate periods. In years with 47% win rate, the strategy would likely fail after costs.\n\n### 5. Exit Logic Issues\n\n**No stop loss in exit logic**:\n```python\nif key in positions:\n # Only checks: time limit, VWAP touch, vol spike\n # No actual stop loss implementation!\n```\n\nThe code sets `'stop_loss_pct': 0.30` in the action, but **never checks it** in the exit logic. The backtest framework may handle this, but it's unclear if it uses:\n- Next bar's open (realistic)\n- Same bar's worst price (optimistic)\n- Instantaneous stop (impossible at 1m)\n\n**VWAP touch exit**: Exits when price hits VWAP, but this happens **on the same bar** you detect it. Same-bar execution problem again.\n\n### 6. Statistical Significance\n\nDespite hundreds of trades across multiple years:\n- Some periods show only ~160 trades (low regime)\n- Monthly average suggests ~30-35 trades/month in typical conditions\n- Some months likely have <20 trades\n\nWith 50% win rate and 1:1 R:R, **20-30 trades per month** creates high variance. A few lucky/unlucky trades swing monthly returns significantly.\n\n**Concentration risk**: Not calculated, but with ~33 trades/month, the top 3 winners likely contribute >50% of monthly PnL.\n\n### 7. Microstructure Edge Questionable\n\nThe strategy claims to trade \"VWAP reversion\" but:\n- Enters when price is still 0.20% from VWAP (not at maximum deviation)\n- Requires RSI \"recovery\" (momentum) not just oversold\n- Exits at VWAP (leaves profit on table if true reversion)\n\nThis is a **momentum strategy disguised as mean reversion**. It's buying into strength after a bounce starts, not fading the extreme. This works in trending markets but fails in choppy conditions.\n\n**Evidence**: Wide variance in returns across different years (65.6% vs 11.0%). The strategy is regime-dependent.\n\n## Minor Issues\n\n- **Round parameters**: RSI=5, lookback=60, ATR=20 are good. But threshold=1.5, stretch=0.20% are oddly specific.\n- **Warmup period**: 180 bars is appropriate for the longest indicator.\n- **Vol filter**: ATR z-score < 1.5 is reasonable, though the emergency exit at >2.0 suggests uncertainty.\n\n## Verdict\n\nThis strategy suffers from:\n1. **Critical same-bar execution bias** that inflates returns\n2. **Over-optimization** with 7+ conditions and inconsistent parameters\n3. **Marginal cost coverage** that disappears under realistic stress\n4. **Regime dependency** masked by strong bull market returns\n\nThe strong historical returns are likely **30-50% lower** in reality after fixing execution and applying realistic slippage. The high Sharpe ratio would drop significantly, and several months would be negative.\n\n**Not production-ready** without major refactoring of entry timing.",
"rule_suggestion": "1-minute strategies MUST enter on bar N+1 after detecting conditions on bar N. Specifically: (1) All entry conditions must be evaluated using data through bar N-1 or earlier, (2) Entry price must be bar N's open, not bar N-1's close, (3) Any checks on 'current bar' characteristics (is_bullish_bar, body_pct, etc.) constitute same-bar execution and are prohibited. This prevents lookahead bias at micro timeframes where execution lag is material."
}
```