I got greedy with the profit factor. Walk-forward said no

Rejected methods · 3 min

Adding the "ADX rising" filter to my TJL gold strategy failed to improve long-term performance.

Walk-forward testing: decide the rules on the past, then test on unseen future data (no hindsight).

Walk-forward testing: decide the rules on the past, then test on unseen future data (no hindsight).

Adding the “ADX rising” filter to my TJL gold strategy failed to improve long-term performance. This confirms that I have reached the limit of adding entry constraints. My current baseline remains the ER0.3 (Efficiency Ratio) and ADX20 filter setup. This configuration holds positions for 5 bars and delivers a profit factor (PF) of 2.46 with 97 trades. When adding a 2-ATR stop-loss, the PF improves to 2.54. In other words, the strategy is consistently profitable. I will be keeping version 1.9.0 of the EA exactly as it is.

The search for new filters

I tested five potential filters to see if I could refine the entries further. My criteria for adoption were strict: the strategy had to show a higher PF across the full period and in both the first and second halves of the out-of-sample (OOS) data while maintaining at least 60 trades.

FilterResult
Signal bar qualityDegraded (PF 1.99 to 2.12)
Weekly SMA alignmentMarginal difference (PF 2.39 to 2.48)
Structural exit (low of previous day)Degraded (PF 1.86)
Level breakout (previous high at resistance)PF 3.57 to 11.63 (Too few trades: 13 to 17 over 11 years)
ADX risingPassed (PF 2.88)
The “level breakout” filter produced spectacular PF numbers, but it failed the volume test. With only 13 to 17 trades over 11 years, it only added about 0.05% to 0.06% to the monthly return. While it is too infrequent to use as a primary filter, it is clean enough that I am keeping it in my notes as a potential future “booster” for high-conviction trades.

Why ADX rising failed the final exam

The “ADX rising” filter looked promising at first. It passed my initial screening with a PF of 2.88 and 77 trades. It looked even better when combined with a stop-loss (PF 3.00, 1.3% drawdown, and a Sharpe ratio of 1.24). However, it failed the Walk-Forward (WF) final exam. I ran a grid of 32 configurations across seven different time windows. While the training phase results looked impressive, the linked OOS performance actually dropped. The version with the “rising” filter yielded a PF of 2.10 and a monthly return of 0.235%. This is worse than the baseline version without the filter (PF 2.37, 0.265% monthly return). In other words, the added complexity created more variance than signal. The performance boost I saw in the static test was likely just the result of a small sample size and the fact that ADX was already at 20. This is a classic case of overfitting: the model learns the noise of the past rather than the underlying market mechanics.

Moving forward

I have reached the “noise floor” for this strategy. Adding further entry conditions to a dataset of roughly 77 to 97 trades is no longer statistically sound. To continue improving, I need to look in different directions:

  • Scaling: Testing the TJL definition on silver (XAGUSD) or stock indices to see if this edge holds across other assets.
  • Selective boosting: Managing the “level breakout” logic as a separate, infrequent signal for special occasions.
  • Capital management: Focusing on risk and leverage rather than trying to squeeze more out of the entry logic.

How this connects

This verification builds on earlier ones (what failed before and what I tried this time, comparisons between approaches).