ConnorsRSI_Composite — Status & roadmap
Where this strategy is today
ENGINEERING COMPLETE — the code is correct, uniform and shippable. That is a statement about engineering, not about profitability; the performance verdict is separate and sits below it.
| Dimension | State |
|---|---|
| Correctness | 5 / 5 invariants pass |
| Console output | 25 tagged calls, 0 off-format |
| Side panel | 6 rows, padded to the 3-column grid |
| Chart marks | drawn only after the exchange confirms a fill |
| Palette | 8 / 8 canonical |
| GUI settings | 75 exposed · 75 read at runtime · 0 untunable · 0 inert |
| Deployed to a live install | Not yet — audited and staged, not yet shipped |
Performance verdict. Over three years on 7 markets it returns a median -1.4% against buy-and-hold's 39.2% — an edge of -40.1% — and is profitable on 1 of 7. On this window it is not a replacement for simply holding the asset, and nothing in these reports claims it is.
What it actually does
The pack's shared directional engine with its mode selector set to ConnorsRSI_Composite. One engine, 84 strategies; every file carries the union of every mode's settings in a single the shared settings accessor block, and the other 83 modes sit dormant.
Connors RSI is a three-part composite, each part scaled 0–100 and averaged:
- a short RSI of price,
- an RSI of the current streak — how many consecutive bars price has risen or fallen,
- the percent rank of the latest one-bar return against the last
SIG_lookback(168) returns.
The composite is designed to reach its extremes far more readily than a plain RSI, which is why its thresholds sit at SIG_crsiEntry 19.56 and SIG_crsiExit 68.84 rather than the conventional 30/70.
Around that sits the directional engine's own machinery: a two-state machine (IDLE / IN_POSITION), an ATR stop at SIG_atrMult (2.354) × ATR(SIG_atrPeriod = 49) that is re-anchored on each entry and never loosened, and the pack-wide position-slicing policy — SIG_maxAdds 4, SIG_maxExposure 0.85, SIG_addSpacing 1.0 ATR.
Sizing is nominally all-in: the first entry takes 1 / maxAdds of the allocation and top-ups are supposed to build it back toward the 85% cap.
Read from the shipped strategy source, not from its documentation.
The measured constraint
Time in market is 0.5%, over 322 round trips across all 7 markets and three years. Everything in the performance report rests on that fraction of the bars. A strategy out of the market 99% of the time is not therefore a low-risk one: the 3.2% drawdown happens entirely inside the time it is committed.
Settings, measured
The GUI exposes 75 settings. Which ones this strategy actually reads was measured by running it with a recording config proxy rather than inferred from the source — a directional file bakes 77 keys and only the active mode's branch reads any of them.
- Read at the shipped defaults:
SIG_addScale,SIG_addSpacing,SIG_atrMult,SIG_atrPeriod,SIG_crsiEntry,SIG_crsiExit,SIG_maxAdds,SIG_maxExposure,SIG_period,SIG_trend - Read only once you change
SIG_mode— the value that first reaches each:SIG_adxMax,SIG_adxPeriod,SIG_entryB,SIG_exitBunderBollinger_MR_Regime;SIG_adxMinunderADX_DI_Cross;SIG_af0,SIG_afMaxunderPSAR_EMA_Trend;SIG_base,SIG_conv,SIG_spanBunderIchimoku_Kumo;SIG_chandMultunderDonchian_Chandelier;SIG_cmoOb,SIG_cmoOsunderCMO_Reversion;SIG_cycle,SIG_stcHigh,SIG_stcLowunderSchaff_Trend_Cycle;SIG_dPeriod,SIG_kPeriod,SIG_slowingunderRSI_Stoch_Combo;SIG_don,SIG_rsmAdx,SIG_rsmRsiunderRegime_Switch_Meta;SIG_dpoZunderDPO_Reversion;SIG_entryVotes,SIG_exitVotesunderConfluence_Vote;SIG_entryZ,SIG_exitZ,SIG_useRegimeunderOU_MeanReversion;SIG_expandunderChaikin_Vol_Expansion;SIG_fast,SIG_slowunderEMA_Cross;SIG_fisherOsunderStochastic_Fisher;SIG_gapThreshunderGap_Fade;SIG_hp,SIG_lpunderEhlers_Roofing;SIG_kunderVarianceRatio_Regime;SIG_kcMult,SIG_kpbTrendunderKeltner_Pullback;SIG_lookbackunderTSMOM;SIG_multunderSupertrend;SIG_n1,SIG_n2,SIG_wtOsunderWaveTrend;SIG_ob,SIG_osunderRSI_Reversion;SIG_qqeFactorunderQQE_Signal;SIG_roc1,SIG_roc2,SIG_wmaLenunderCoppock_Curve;SIG_sessIn,SIG_sessOutunderSeasonality_Session;SIG_signalunderMACD_Cross;SIG_smiOs,SIG_smoothunderSMI_Signal;SIG_spike,SIG_volWinunderVolume_Climax;SIG_stdunderBollinger_Reversion;SIG_strongunderAroon_Cross;SIG_tomFirst,SIG_tomLastunderTurn_Of_Month;SIG_tpMultunderWilliams_Fractals;SIG_uoOb,SIG_uoOsunderUltimate_Oscillator;SIG_wickunderWick_Rejection;SIG_winunderHurst_Regime
What to build next
Ordered by expected effect on the result, not by effort.
1. It is in the market 0.5% of the time and never deploys more than a quarter of the account
Highest priority
This is the single most important fact about this strategy, and it is not visible in the return.
| market | peak deployment | mean weight | time in market |
|---|---|---|---|
| ADA | 50.3% | 0.15% | 0.5% |
| BTC | 50.1% | 0.22% | 0.8% |
| DOGE | 25.2% | 0.11% | 0.4% |
| ETH | 25.1% | 0.14% | 0.5% |
| LINK | 25.2% | 0.14% | 0.5% |
| SOL | 25.1% | 0.11% | 0.4% |
| XRP | 25.3% | 0.07% | 0.3% |
Those numbers are not approximate. With SIG_maxAdds at 4, one slice is exactly 25% — so on five of seven markets the top-up never fired once in three years, and on the other two it fired exactly once. SIG_maxExposure, set to 0.85, was never approached on any market.
The top-up gate is not broken; it was repaired across all 84 directional strategies and this file carries the repair. The gate requires price to advance a full ATR above the last entry (SIG_addSpacing 1.0) while the exit signal is still absent. For a mean-reversion archetype that exits on Connors RSI crossing 68.84, the exit almost always arrives first.
So the practical effect of the pack-wide slicing policy on this strategy is "trade at quarter size", not "build a position in quarters". The policy still improved it — all-in was −6.7% return with a 12.3% drawdown, quarter-size is −1.4% with 3.2% — but it did so by risking less, not by managing risk better.
The experiment that follows directly: sweep SIG_addSpacing down from 1.0 toward 0.25 and watch peak deployment. If deployment rises toward the 85% cap and the return holds, the policy is working as designed. If the return degrades as deployment rises, then quarter-size is the strategy's actual edge and SIG_maxAdds should be documented as a position-size control rather than a laddering control.
2. A 1-year ranking put this near the top; three years says it loses to cash
High priority
Median return over three years is −1.4% against a buy-and-hold of +39.2% — an edge of −40.1%. It is profitable on 1 of 7 markets and beats buy-and-hold on 1 of 7.
A −1.4% return with a 3.2% maximum drawdown looks like careful risk control, and in a sense it is. But it is the risk control of a strategy that is in the market 0.5% of the time: holding cash for three years returned 0%, which is better, and it needed no engine.
The per-market profit factors show why the median is so flat rather than merely small: 1.84 on ADA, 0.30 on BTC, with the rest between 0.59 and 0.89. One market carries a real edge and one destroys it, and 322 round trips across seven markets is a thin enough sample that the median is not measuring much.
This is the pack's recurring window lesson in a specific case. The one-year ranking these strategies were first sorted by covered a broad downtrend, where being in cash 99.5% of the time was close to optimal. Over a full cycle containing a real bull market it is simply an expensive way to hold cash.
3. 18% of its exits were stop fills it never mentioned — now repaired across 348 strategies
High priority
Every exit, measured from the strategy's own messages over three years:
| exit | count | share |
|---|---|---|
EXIT — Connors RSI crossed SIG_crsiExit |
261 | 81.1% |
CLOSED OUTSIDE STRATEGY — resting stop filled |
58 | 18.0% |
STOP — market stop, logged |
3 | 0.9% |
Before this audit the middle row printed nothing at all. Its 58 match the engine's restingFills counter exactly, market by market (ADA 5, BTC 16, DOGE 6, ETH 5, LINK 8, SOL 10, XRP 8).
The engine publishes its ATR stop as gb.data.pairLedger.customStopTarget — a resting stop order rather than a market sell — so Gunbot executes it intrabar without calling back into the strategy. That is good design, and it is why only 3 of 61 stops went through the market path: a resting stop fills the moment price trades through it, where a market stop evaluated on the next bar's open gives up the gap.
This strategy never had the defect that this pattern caused elsewhere. On dipHunter and apexEngine a silently-filled resting order left the strategy believing it still held the position — on apexEngine that paralysed it for three years. The Gunbot Quant runtime has a reconcileState() that resets state, entryPrice and stopPrice the moment the wallet reads flat, so the state machine was correct throughout and the audit confirms it. What was missing was only the sentence: an operator saw 261 exits announced and 58 positions simply vanish, with the stop — the exit that matters most — being the silent one.
Repaired, pack-wide. reconcileState() now announces an externally-closed position. It distinguishes the two cases without needing a flag: a sell the strategy performs itself already set state: "IDLE", so only an externally-filled exit is still IN_POSITION when the wallet reads flat. Applied to 348 strategies and to the runtime template, so regeneration keeps it. Log-only, and proven so — see the fixes report.
4. Removing the stop turns −1.4% into +9.7%, and it ends still holding on 6 of 7 markets
High priority
The second variant every report measures — never exit below the position average:
| with the stop | never exits at a loss | |
|---|---|---|
| Median return | −1.4% | +9.7% |
| Median max drawdown | 3.2% | 7.9% |
| Ends still holding | — | 6 of 7 markets |
| Exits refused | — | 42,585 |
The improvement is real and the explanation is mundane: the ATR stop, at 2.354 × ATR(49), is wide but the strategy's holding periods are extremely short, so a stop that fires takes a loss the position had no time to recover. Refusing those exits defers the loss into inventory instead — which is why it finishes still holding on six markets and why the drawdown more than doubles.
This is not a recommendation to turn the stop off. The +9.7% is measured on a book that was never closed. What it does say is that the stop distance is poorly matched to the holding period, which is the same conclusion the deployment analysis reaches from the other direction: the engine's risk machinery is calibrated for positions held far longer than this mode actually holds them.
The measurement worth having is the holding-period distribution. The engine already records entry and exit bars; reporting median bars-in-trade against the ATR stop distance would say directly whether the stop is ever reachable by ordinary drift, or whether every stop that fires is a gap.
5. Sixty-five settings had no GUI control until this audit
Worth testing
The runtime probe found 65 settings this strategy reads with no entry in the GUI editor at all — SIG_useRegime, SIG_entryVotes, SIG_exitVotes, SIG_adxMin / SIG_adxMax, SIG_entryZ / SIG_exitZ, the Ichimoku group, the Parabolic SAR group, and fifty more. All 65 are now exposed with plain-language labels and the defaults the code actually uses.
The re-audit after the fix measures the surface precisely, and the split is the important part:
| Settings baked into the file | 77 |
| Read at runtime | 75 |
| With a GUI control | 75 (was 10) |
| Live at the shipped defaults | 10 |
Live only once SIG_mode is changed |
65 |
| Inert | 0 |
| Untunable | 0 |
So the honest reading is not "65 new things to tune". The directional engine bakes one the shared settings accessor block covering all 84 of its strategies, and 65 of the 75 belong to other modes — they are read, because the block is read whole, but nothing in the ConnorsRSI path acts on them. Ten settings control this strategy.
That distinction is the trap a previous audit in this pack fell into, and it is worth stating flatly: SIG_useRegime now has a control, and setting it will do nothing here, because this mode does not consult a regime filter. A visible knob is not a live knob.
The work that would turn this into something an operator can rely on is a sweep: move each of the ten live settings away from its default one at a time, re-run, and record which ones move a number. That is a short list and a short job, and it would let the GUI mark the other 65 as belonging to another mode rather than presenting all 75 as equals.
6. What this audit repaired
Read before acting on the others
Two repairs, neither of which changed behaviour:
- 65 settings exposed in the GUI that the code reads and the editor hid, each with the default taken from the file rather than from the glossary.
- 15 console messages routed through the tagged log format, including three reconcile events — the class of message an operator most needs attributed when position state has gone wrong.
The re-run after the fix step was byte-identical on all seven markets.
The pyramiding repair applied across all 84 directional strategies was already present and the fixer reported nothing to change. This audit is the first to measure its consequence here, and the consequence is the deployment finding at the top of this page: the gate is reachable and correct, and at SIG_addSpacing 1.0 it almost never fires.
Nothing was tuned. Every experiment above is proposed rather than performed, because each changes live behaviour and belongs in a measurement of its own.
Operator output, measured
Everything below was read out of the strategy file by the presentation audit, not taken from its documentation. These are the surfaces an operator actually watches: the terminal log, the side panel, the chart, and the settings the GUI offers.
- Tagged, aligned, coloured
- 25
- Raw and off-format
- 0
- Exempt (object and error dumps)
- 7
Every non-exempt line carries the strategy name, an event tag and the palette colour for that tag, so one terminal running many pairs stays readable.
- Data rows
- 6
- Section headers
- 1
- Rows with no tooltip
- 0
- Padded to the 3-column grid
- yes
- Model
- fill-confirmed
A mark is drawn only once the exchange confirms the fill, so the chart never shows a trade that did not happen.
- Non-canonical colours
- 0
One colour per meaning, identical in the log, the panel and the chart — the eight canonical roles.
Settings the GUI exposes
75 settings appear in the Gunbot strategy editor for this strategy. 75 of them are read at runtime — measured by running the strategy with a recording proxy over its config, not inferred from the source.
SIG_addScaleSIG_addSpacingSIG_adxMaxSIG_adxMinSIG_adxPeriodSIG_af0SIG_afMaxSIG_atrMultSIG_atrPeriodSIG_baseSIG_chandMultSIG_cmoObSIG_cmoOsSIG_convSIG_crsiEntrySIG_crsiExitSIG_cycleSIG_dPeriodSIG_donSIG_dpoZSIG_entryBSIG_entryVotesSIG_entryZSIG_exitBSIG_exitVotesSIG_exitZSIG_expandSIG_fastSIG_fisherOsSIG_gapThreshSIG_hpSIG_kSIG_kPeriodSIG_kcMultSIG_kpbTrendSIG_lookbackSIG_lpSIG_maxAddsSIG_maxExposureSIG_multSIG_n1SIG_n2SIG_obSIG_osSIG_periodSIG_qqeFactorSIG_roc1SIG_roc2SIG_rsmAdxSIG_rsmRsiSIG_sessInSIG_sessOutSIG_signalSIG_slowSIG_slowingSIG_smiOsSIG_smoothSIG_spanBSIG_spikeSIG_stcHighSIG_stcLowSIG_stdSIG_strongSIG_tomFirstSIG_tomLastSIG_tpMultSIG_trendSIG_uoObSIG_uoOsSIG_useRegimeSIG_volWinSIG_wickSIG_winSIG_wmaLenSIG_wtOs