Tighten qualified signal gate
Deploy / lint (push) Successful in 8s
Deploy / test (push) Successful in 1m18s
Deploy / deploy (push) Successful in 40s

This commit is contained in:
2026-07-04 13:51:44 +02:00
parent 23d1db1f30
commit 65335cf1f3
4 changed files with 74 additions and 20 deletions
+5 -3
View File
@@ -39,13 +39,15 @@ export function qualifiesSetup(setup: TradeSetup, config: ActivationConfig): boo
if (setup.current_price != null && liveRiskReward(setup, setup.current_price) < config.min_rr) {
return false;
}
const targetProbability = primaryTargetProbability(setup);
if (targetProbability == null || targetProbability <= 0) return false;
if ((setup.confidence_score ?? 0) < config.min_confidence) return false;
// Residual cross-sectional momentum is the core selection (long-only). While
// the gate is active, shorts never qualify; the percentile floor is enforced
// only when a percentile is attached, otherwise defer to the floors.
// the gate is active, shorts never qualify; missing ranks do not qualify
// because the production edge depends on this cross-sectional selection.
if (config.min_momentum_percentile > 0) {
if (setup.direction === 'short') return false;
if (setup.momentum_percentile != null && setup.momentum_percentile < config.min_momentum_percentile) {
if (setup.momentum_percentile == null || setup.momentum_percentile < config.min_momentum_percentile) {
return false;
}
}