You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
engine.py:144 computes it and attaches it to Signal.entry_technique. That value then reaches exactly two destinations:
engine.py:360 — serialized into the signals audit payload
agent.py:1166 — a technique= field on an agent.enter_evaluatedlog line
Verified exhaustively: git grep -nE "technique (==|!=|in )" -- '*.py' returns nothing outside tests. sim/portfolio_sim.py carries it as a pass-through field and never reads it. No sizing code, no stop-placement code, and no rail consults it.
So none of the documented behaviour exists. Size and stop are identical whether CTS scores 2 or 12. The module promises a risk-graded ladder and delivers a label.
Why this matters beyond tidiness
The docstring asserts behaviour the code does not have. Anyone reading indicators_cts.py reasonably concludes that a high CTS produces a larger position — it does not. That is the kind of claim this repo normally refuses to leave standing.
It is the precondition for tuning low=5, high=8. Those boundaries currently cannot be validated, because changing them changes nothing measurable. fix(analysis): scale is_round_number to the price's own magnitude #227 showed 16.2% of bars shift tier with no order consequence — the tier is free to move precisely because it is inert.
Either wire the ladder — which is a live money-sizing change and needs the full gate: trials-ledger entry, backtest evidence that graded sizing beats flat sizing, and a rails review, since sizing interacts with the per-order and per-day caps — or delete the promise from the docstring and keep entry_technique as the audit label it actually is.
The second is much cheaper and is honest. The first should not happen without evidence that grading helps; "larger size on higher confluence" is exactly the kind of plausible rule that backtests well by accident.
Related: #227 (where this surfaced), #225 (the bug that prompted it).
Found while verifying #227 (the
is_round_numberfix). Recording it because it is the precondition for ever tuning the CTS tier boundaries.The gap
keel/strategy/indicators_cts.pydocuments a graded entry ladder:total < 5)confirm_3barsignal_candletotal >= 8)aggressiveengine.py:144computes it and attaches it toSignal.entry_technique. That value then reaches exactly two destinations:engine.py:360— serialized into thesignalsaudit payloadagent.py:1166— atechnique=field on anagent.enter_evaluatedlog lineVerified exhaustively:
git grep -nE "technique (==|!=|in )" -- '*.py'returns nothing outside tests.sim/portfolio_sim.pycarries it as a pass-through field and never reads it. No sizing code, no stop-placement code, and no rail consults it.So none of the documented behaviour exists. Size and stop are identical whether CTS scores 2 or 12. The module promises a risk-graded ladder and delivers a label.
Why this matters beyond tidiness
indicators_cts.pyreasonably concludes that a high CTS produces a larger position — it does not. That is the kind of claim this repo normally refuses to leave standing.low=5, high=8. Those boundaries currently cannot be validated, because changing them changes nothing measurable. fix(analysis): scale is_round_number to the price's own magnitude #227 showed 16.2% of bars shift tier with no order consequence — the tier is free to move precisely because it is inert.aggressiveroughly halving on those assets) would become a live change in position sizing.Direction (not a decision)
Either wire the ladder — which is a live money-sizing change and needs the full gate: trials-ledger entry, backtest evidence that graded sizing beats flat sizing, and a rails review, since sizing interacts with the per-order and per-day caps — or delete the promise from the docstring and keep
entry_techniqueas the audit label it actually is.The second is much cheaper and is honest. The first should not happen without evidence that grading helps; "larger size on higher confluence" is exactly the kind of plausible rule that backtests well by accident.
Related: #227 (where this surfaced), #225 (the bug that prompted it).