I would add two small boundary checks before using this score. With zero trades, the win-rate division happens before the rejection condition, so return before that division. Also, a rejected run scores zero while an accepted run can score below zero. That can put a rejected run above a valid one. Give rejected runs a value below every accepted score, and keep the score and thresholds frozen for the test on later, untouched data. A combined score still needs that separate check.