When a signal is rejected, nothing is hidden from you. The rejection is logged with the same cost breakdown a passing signal gets, showing exactly which line the expected edge could not clear. Reading one correctly reframes a rejection from "a trade I missed" into "the cost rule protecting me from a trade that did not pay."
A rejection is the rule working
The core discipline is that a signal must beat its full trading cost before it is even considered. A rejection is simply the visible result of that rule returning "no." It is not an error, a bug, or a failure of the signal generator — it is the system refusing to trade an edge that friction would have eaten. Transparent logging exists so you can confirm that for yourself.
Step by step
- Open the rejection entry. Find the logged signal and confirm it was rejected rather than traded. The status is explicit, not implied.
- Read the failing line. The breakdown shows which cost the edge could not clear — most often the spread or slippage in thin or volatile conditions.
- Check the margin. See how far short the edge fell. A near miss and a wide miss tell different stories about how marginal the setup was.
- Accept it as discipline. A logged rejection means the rule held. Treat it as protection earned, not a chance denied.
What rejections tell you over time
A pattern of rejections is information, not frustration. If many signals are failing on slippage, conditions are thin and the cost bar is high. If they fail by a hair, your edges are marginal and worth rethinking. The point of transparency is that you never have to guess why a trade did not happen — the answer is on the record, line by line.
To read the same breakdown for a passing signal, see how to read a signal cost breakdown, and to understand why most signals fall short, read weak signals vs strong signals. Every rejection also appears in the bot's execution audit trail.