Skip to content

The graded entry ladder is inert — entry_technique is computed, logged, and never acted on #228

Description

@eaitbrahim

Found while verifying #227 (the is_round_number fix). Recording it because it is the precondition for ever tuning the CTS tier boundaries.

The gap

keel/strategy/indicators_cts.py documents a graded entry ladder:

tier technique documented behaviour
Low (total < 5) confirm_3bar 3-bar-reversal confirmation, smaller size, wider stop
Mid signal_candle
High (total >= 8) aggressive larger size, tighter stop

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_evaluated log 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

  1. 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.
  2. 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.
  3. It affects how fix(analysis): scale is_round_number to the price's own magnitude #227 should be read. fix(analysis): scale is_round_number to the price's own magnitude #227's "no order changes" conclusion is correct, and it is correct because of this defect. If the ladder were ever wired, a CTS shift of the size fix(analysis): scale is_round_number to the price's own magnitude #227 produces (BTC/ETH/PAXG each losing ≈0.96 points, aggressive roughly 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_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).

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions