← ConnorsRSI_Composite

ConnorsRSI_Composite — Fixes

ENGINEERING COMPLETEAudited 2026-09-13· directional engine· gunbot-quant· spot

Every defect the audit found and how it was repaired — the same measurements as the engineering record, without the code.

4 issues found and repaired — 1 defect, 3 warnings.

# Issue Severity Surface
1 The stop filled as a resting order and was never announced — 18% of all exits WARNING console
2 Sixty-five settings the code reads had no control in the GUI DEFECT inputs
3 Fifteen diagnostic messages bypassed the log format WARNING console
4 The pyramiding top-up was already repaired, and is measured here for the first time NOTE inherited

Every fix was verified by re-running the full backtest across all 7 markets and comparing the result record against the pre-fix baseline. Where a fix is stated to change no behaviour, the two records are identical to the byte.


The stop filled as a resting order and was never announced — 18% of all exits

Severity WARNING · Surface console · Sites 1

The engine publishes its ATR stop as gb.data.pairLedger.customStopTarget — a resting stop order. Gunbot executes it intrabar without calling back into the strategy, so nothing logged it. reconcileState() noticed the flat wallet and reset the state correctly, but said nothing.

Why it matters. Measured over 3 years x 7 markets: 261 exits (81.1%) announced as SELL | EXIT, 3 (0.9%) as SELL | STOP, and 58 (18.0%) with no message at all — matching restingFills exactly on every market. The exit an operator most needs to see was the one that produced no line in the log.

This is a milder problem than the same pattern caused on dipHunter and apexEngine, and the report says so plainly: there the strategy's own state went stale and, on apexEngine, paralysed it. Here the state machine was always correct. Only the announcement was missing.

Exits by path, 3 years x 7 markets

exit count share announced before?
EXIT — indicator 261 81.1% yes
CLOSED OUTSIDE STRATEGY — resting stop filled 58 18.0% no
STOP — market stop 3 0.9% yes

Per market the newly-announced count is ADA 5, BTC 16, DOGE 6, ETH 5, LINK 8, SOL 10, XRP 8 — identical to the engine's restingFills, which is how the attribution was confirmed rather than assumed.

The fix. Announce it inside reconcileState(). No flag is needed to avoid double-reporting: a sell the strategy performs itself sets state: "IDLE" immediately after sellMarket succeeds, so by the time the flat wallet is observed a self-initiated exit is already IDLE and only an externally-filled one is still IN_POSITION.

The wording is deliberately general. The position can vanish because a resting stop filled, because a sell target filled, or because someone closed it by hand in the GUI. Claiming "stop" when it might have been a manual close would be a worse lie than saying nothing.

Effect on live behaviour. None — proven, not assumed. Re-ran all seven markets and diffed against the pre-fix record: buys, sells and return identical to the last decimal on every one, while the new line fired exactly 5 / 16 / 6 / 5 / 8 / 10 / 8 times. Spot-checked on four further strategies of the same lineage (ATRChannel_MM, Donchian_Reversion_MM, SuperTrend_MM, WaveTrend_LB) — identical in every case. All 429 strategies in the pack still parse.

Scope beyond this strategy. reconcileState() lives in the shared Gunbot Quant runtime, so the repair was applied to 348 strategies and to the shared runtime template. The template matters: the pack has been bitten before by a fix applied to every generated file and not to the template, which the next regeneration silently reverted.


Sixty-five settings the code reads had no control in the GUI

Severity DEFECT · Surface inputs · Sites 65

The runtime probe — which measures knob usage by wrapping the shared settings accessor in a recording Proxy — found 65 settings that this strategy reads and that had no entry in the GUI editor at all. SIG_useRegime, SIG_entryVotes, SIG_exitVotes, SIG_adxMin, SIG_adxMax, SIG_entryZ, SIG_exitZ, the whole Ichimoku group, the whole Parabolic SAR group, and fifty more.

Why it matters. A setting with no GUI control is not tunable by anyone who is not editing the file by hand, which is the audience this pack exists for. Worse, it is invisible: the operator has no way to discover that the behaviour is adjustable, and no way to see what value is in force.

This is the fourth distinct instance of the same class — the glossary has drifted behind the engine repeatedly, and kalmanGrid showed the sharper version of it, where three knobs existed in the GUI under names the code did not read.

GUI settings surface before and after

before after
Knobs the runtime probe sees the code read 65 65
Knobs with a GUI control 0 of 65 65 of 65
Exposed under — "Gunbot Quant — ConnorsRSI Composite" → Strategy Signal

Each is exposed with a plain-language label and the default the code actually uses — SIG_useRegime "Regime filter on/off" default 0, SIG_entryVotes "Entry votes" default 3, and so on — so the editor and the file cannot disagree about what a setting means or what it is set to.

The fix. the hidden-settings fixer reads the probe's measured knob list, diffs it against the editor definition, and adds an entry for every knob the code reads and the GUI hides. It takes the default from the file rather than from the glossary, so the three-sources-three-defaults failure found on kalmanGrid cannot recur here.

Effect on live behaviour. None. Exposing a control does not change what the code does at the shipped values. Verified by re-running the full 3-year backtest on all seven markets and diffing against the pre-fix baseline: identical.

Scope beyond this strategy. The shared directional engine bakes one the shared settings accessor block covering all 84 of its strategies, so every file carries the union of every mode's settings. The GUI editor was built from a glossary that had drifted behind the engine. The same check runs on each directional strategy as the audit reaches it.


Fifteen diagnostic messages bypassed the log format

Severity WARNING · Surface console · Sites 15

Order rejections, blocked orders, reconcile events and the idle/no-bag skips were emitted as bare strings: Buy blocked: qty rounds to zero. No strategy name, no tag, no colour.

Why it matters. In a terminal running many pairs at once that line does not say which pair or which strategy produced it. Three of the fifteen are reconcile events — Reconcile: flat wallet — clearing stale grid rungs — which is precisely the class of message an operator needs attributed when something has gone wrong with position state.

Call sites by format

before after
tagged, aligned, coloured — 15 added
raw and off-format 15 0

The fix. Routed the string-literal sites through the the tagged log emitter emitter already in scope, with the tag and palette colour the event calls for — WARN amber for a blocked or rejected order, SKIP grey for an idle cycle or a reconcile.

Effect on live behaviour. None. Verified by the byte-identical re-run.

Scope beyond this strategy. The same call sites exist across the 348 Gunbot Quant strategies — they predate the tagged format rather than deviating from it.


The pyramiding top-up was already repaired, and is measured here for the first time

Severity NOTE · Surface inherited

The SIG_maxAdds top-up was originally gated on entry signal still holding. For a cross-based archetype like this one the entry signal is true for exactly one bar — the bar the position opens on — so the top-up block was unreachable while the entry size was still being divided by maxAdds. The division always ran; the top-up never did.

Why it matters. It is recorded here because this audit is the first to measure the consequence on this strategy rather than the mechanism. The gate is repaired and reachable — but with SIG_addSpacing at 1.0 ATR it fires almost never in practice. Peak deployment across three years is exactly one slice (25.1–25.3%) on five of seven markets and exactly two (50.1–50.3%) on the other two. SIG_maxExposure, set to 0.85, was never approached on any market.

That is not a defect in the repair; the repair is correct and the fixer reports nothing to change. It is a finding about the shipped addSpacing default, and it belongs in the roadmap rather than here.

The fix. Nothing applied — the position-slicing fixer reported 0 files, because this file already carries the repair.

Effect on live behaviour. None.

Scope beyond this strategy. Applied to all 84 directional strategies and to the Directional engine template — the template matters, or regeneration reverts it.