Loading...
Loading...
Browse all reviews, rankings, guides, strategies, and trust documents.
Methodology
From raw market data to a published, confidence-scored signal — the exact pipeline behind every entry, stop, and target.
Last updated: May 20, 2026
One LightGBM gradient-boosted ensemble per (symbol, timeframe) pair — dedicated models, not a single one-size-fits-all classifier. Full 10-symbol × 4-timeframe coverage is being built out during Phase 1b.
Triple-Barrier Method (López de Prado) for labels — three exit conditions rather than fixed-horizon returns. Far less label leakage than naïve approaches.
Confidence score 0-100% comes directly from the model's probability output. Below 60% — no signal published.
ATR(14)-scaled SL/TP placement. R-multiples calibrated per timeframe — typically 1.5R to 3.0R target. No fixed-pip stops.
Economic calendar is surfaced on every signal page so you can apply your own event filter. Algorithmic auto-veto of signals near high-impact events is on the Phase 2 roadmap.
Every published signal passes through these stages in order. No shortcuts. Total wall-clock from bar close to published signal: typically 4-9 seconds.
Real-time tick stream from our primary broker connection (Tier-1 ECN) plus a backup feed for redundancy. Bars assembled at H1/M15/H4/D1 boundaries with strict UTC alignment. Late ticks are dropped — we never repaint.
~50 engineered features per bar: RSI(14), MACD(12,26,9), Bollinger Bands(20,2), ATR(14), 5-21-50-200 EMA stack + crossover flags, session-of-day, and recent volatility regime. Feature set evolves as ablation studies run — anything that doesn't move out-of-sample Sharpe gets cut.
Per-tuple LightGBM model emits a probability for each direction class. Inference latency p99 ≈ 6ms. Calibrated probability post-processing (Platt scaling) is on the Phase 2 roadmap — current probabilities are the raw classifier output.
The model's probability becomes the 0-100% confidence score directly. A signal is only published if confidence clears the per-timeframe threshold (60% intraday / 55% daily) AND the risk-reward ratio is at least 1.5R. Composite scoring with technical confluence + historical hit-rate is on the Phase 2 roadmap.
Signal is published with full payload (entry, ATR-scaled SL, ATR-scaled TP, confidence, model version). The economic calendar for relevant currencies is surfaced alongside on the signal page so you can defer entries near high-impact events. Automatic event-veto is on the Phase 2 roadmap.
Why LightGBM, why one-per-tuple, and what the alternatives looked like.
Each (symbol, timeframe) pair gets its own dedicated LightGBM gradient-boosted decision tree ensemble. EURUSD H1 and EURUSD H4 are different models — even though the underlying symbol is identical, the bar dynamics aren't, and a model that's optimal on hourly bars will overfit or underfit on 4-hour bars.
We tested deep neural networks (LSTM, Transformer) early in development. They achieved similar out-of-sample Sharpe but with 10× the training cost, 100× the inference latency, and far less interpretability. For tabular financial data with limited samples (years of bars, not millions), gradient-boosted trees remain state-of-the-art per the academic literature (Grinsztajn 2022, NeurIPS).
Hyperparameters tuned via Optuna with walk-forward boundaries — never random shuffling, which would leak future information into training. Models are retrained periodically as new market data accumulates; full 10-symbol × 4-timeframe coverage is being built out incrementally during Phase 1b.
Target coverage
10 × 4
10 symbols × 4 timeframes (M15/H1/H4/D1) — building out during Phase 1b
Retrain cadence
Periodic
Retrained as new data accumulates and ablation studies surface improvements
Features per model
~50
Across price action, technical indicators, session context, volatility regime
Why we don't use fixed-horizon returns — and what López de Prado got right.
The most common labelling scheme in retail trading ML is "return at fixed horizon t+N" — but this is mathematically inconsistent with how traders actually trade. A real trade closes when SL or TP hits, not at an arbitrary future timestamp.
Triple-Barrier Method (López de Prado, Advances in Financial Machine Learning, 2018) labels each bar with the outcome that would have occurred from that entry: TP barrier hit (label = +1), SL barrier hit (label = -1), or TTL elapsed without either (label = 0). Barriers are sized as ATR-multiples for symbol-aware risk.
Result: labels reflect the trade we'd actually have taken. Far less label leakage, lower correlation between adjacent labels, more honest cross-validation. Confidence-scored signals reflect probability of a winning trade, not abstract "price up at fixed horizon."
Every feature has a measurable contribution to out-of-sample Sharpe. Anything that didn't survived ablation got cut.
| Indicator | Parameters | Role |
|---|---|---|
| RSI | 14-period | Momentum oscillator — extreme readings indicate overbought/oversold regimes |
| MACD | 12 / 26 / 9 | Trend & momentum divergences — signal-line crossovers + histogram acceleration |
| Bollinger Bands | 20-period, 2σ | Volatility envelope — mean reversion entries on touch + breakout filter |
| ATR | 14-period | Volatility scale — drives SL/TP sizing, no fixed-pip stops |
| EMA stack | 5 / 21 / 50 / 200 | Trend regime detection — slope + multi-timeframe alignment flags |
| S/R proximity | 20-bar swing pivots | Distance to nearest support/resistance — used as confluence weight |
| Session-of-day | Asia / London / NY / Overlap | Liquidity regime — strategies vary by session bias |
| Volatility regime | ATR percentile, trailing 90 bars | Low/normal/high — high-vol regimes get tighter confidence thresholds |
How the score you see on every signal card is actually computed.
Current pipeline (Phase 1b)
confidence = P_ml → publish if confidence ≥ threshold AND risk_reward ≥ 1.5RATR-scaled risk math, not fixed-pip targets.
Every signal carries an entry price, a stop-loss, and a take-profit — all computed at signal-generation time, not chosen by humans. The math is deterministic and identical for every signal of the same timeframe.
Stop-loss = entry ± ATR(14) × stop_multiplier. Stop_multiplier varies by timeframe: M15 = 1.0× ATR, H1 = 1.5× ATR, H4 = 2.0× ATR, D1 = 2.5× ATR. Tight enough that random noise doesn't stop us out; wide enough that normal pullbacks don't either.
Take-profit = entry ± ATR(14) × stop_multiplier × R_target. R_target is the risk-reward ratio: typically 1.5-3.0 depending on confidence. Higher confidence signals carry higher R targets — because we have stronger evidence they'll run.
Result: 2.0R risk-reward. If we win 50% of the time, we're net profitable. We don't need to be right — we need to be calibrated.
We expose the data; algorithmic auto-veto is on the Phase 2 roadmap.
Forex markets are dominated by central bank decisions, employment reports, and inflation prints. A perfectly valid technical setup gets demolished if NFP drops 30 minutes later. We give you the calendar — applying the veto is currently your judgement call.
Every /signals/{symbol}/{tf} page surfaces upcoming high/medium-impact events for the relevant currencies in a dedicated block. Data flows from the MT5 economic calendar via our ingest service (see the public /api/public/economic-calendar endpoint). Refreshes every minute.
What's planned next: automatic veto of fresh signals when high/medium-impact events fall within an event_window. Currently the inference engine has a `news_blackout_enabled` flag wired in but defaulted to false — we'll flip it on once Phase 2 ships and we've back-tested the veto's net effect on Sharpe.
Why we don't trust in-sample backtests — and what an honest evaluation looks like.
Random train/test splits are the #1 source of inflated performance claims in retail trading ML. A random split lets information from the future leak into training (the model learns what's coming because adjacent bars are highly correlated). Honest evaluation requires temporal ordering.
We use walk-forward validation: train on a past window, validate on the next forward window, advance both windows, repeat. Every model version is graded on its full walk-forward record before promotion to production.
Current acceptance thresholds (must hit all four before promotion): Sharpe ratio ≥ 1.0 (intraday) / Win rate ≥ 0.50 / Profit factor ≥ 1.3 / Max drawdown ≤ 20%. Models that fail any threshold are not promoted — the previous good version stays live. Thresholds will tighten as more historical data accumulates and the baseline stabilises.
Automatic model degradation detection is on the roadmap. Current state: human oversight + manual model promotion.
Live trading conditions diverge from historical backtests. Spreads widen, slippage increases, market regime shifts. Even a model that passed walk-forward validation can decay in production. Our long-term defense: continuous monitoring + automatic rollback. Today the monitoring half is in place; the auto-revert half is on the Phase 2 roadmap.
What ships today: every published signal's outcome (TP hit, SL hit, expired) is logged immutably. The track record dashboard at /signals/track-record surfaces rolling Sharpe + win rate + profit factor — so degradation IS visible. We just don't act on it automatically yet.
What's planned for Phase 2: a watchdog that compares the rolling 30-signal window per (symbol, timeframe) against acceptance floors (Sharpe < 0.8 / win rate < 0.45 / profit factor < 1.1). N consecutive misses → auto-revert to the previous good model version + page the on-call engineer. Until that ships, model promotion + rollback are human decisions made against the live track record.
Honest scoping. Our methodology is robust within these boundaries — outside them, you're trusting model extrapolation.
If we promise more than we can deliver, we damage trust. Here's what these signals are not.
Past walk-forward Sharpe doesn't predict future results. Markets evolve. Even a calibrated 70%-confidence signal loses 30% of the time.
Signals are algorithmic outputs. Your account size, broker, leverage, jurisdiction, and risk tolerance determine whether following any specific signal is appropriate for you.
FxRobotEasy doesn't take custody of funds. Signals are information — you're the one clicking buy. We're a software publisher, not a fund manager.
Signals are valid for the next 1-2 bars on the relevant timeframe. If you see an H1 signal 90 minutes after publication, the entry price may be far from current — skip it.
By definition, training data only contains regimes that already happened. Brexit, COVID March 2020, CHF unpeg — our models would react to these but weren't trained on them.
Common follow-up questions on the AI signal pipeline.
For tabular financial data with limited samples (years of bars rather than millions), gradient-boosted trees beat deep nets on Sharpe and interpretability at 10× lower training cost. Deep nets are state-of-the-art for images, language, and continuous-control RL — not for forex bar prediction.
Periodically — driven by new data accumulation and ablation findings rather than a fixed calendar in Phase 1b. Each retrain runs full walk-forward validation against a held-out trailing window. New version only promotes if it beats acceptance thresholds AND the live previous version. A fixed retrain cadence (weekly is the planned baseline) is on the Phase 2 roadmap once the model registry pipeline ships.
Strict temporal ordering on all splits — no random shuffles. Features derived only from data available at bar-close (no look-ahead). Triple-barrier labels resolve forward; we don't include features computed from the resolution window.
The methodology is fully documented (this page). The trained weights, training data, and hyperparameters are not open-source — they're our edge. We publish all signals + outcomes so anyone can verify the pipeline produces what we claim.
In validation we assume Tier-1 ECN spreads (~0.1-0.3 pips on EURUSD majors, 0.5-1.5 pips on minors, 2-4 pips on XAUUSD) plus a slippage buffer. Live performance accounting uses the actual fill prices the broker connection records — so the published track record reflects real execution, not modelled. The validation-vs-live delta is something we surface on /signals/track-record once enough closed signals accumulate.
The methodology is the same on every signal you'll see. Now go look at them.