Skip to content

X8: signal 669: rewrite the protection block - #1298

Merged
iterativv merged 1 commit into
iterativv:mainfrom
guleconr:s669-protections
Sep 20, 2026
Merged

iterativv merged 1 commit into
iterativv:mainfrom
guleconr:s669-protections

Conversation

@guleconr

Copy link
Copy Markdown
Contributor

Signal 669 (dump hunter, short, experimental) is disabled, and its protection block was mine, from #1201. It had 34 chains, 82% of them built from columns the rest of the file does not use (PH_*, SQZ_CNT, UO, WILLR_480, raw percent-change columns), and no chain in it was ever measured on its own. This replaces the whole block.

The new block is 153 chains. Every clause is a cached boolean that already exists in the entry scope, every threshold on a 0-100 column is a multiple of five, no chain has four clauses, and the clause order is low timeframe to high.

Rig

position_adjustment_enable: false, grinding off, grind_mode_max_slots: 0, 20 slots, signal 669 added alone to the standing enabled set. Three populations: binance 2022 (bear), bybit 2026 and binance 2026. The profit-max cache is deleted before every run. Every number below is a real backtest, not an offline projection.

Result

block trades losses tag P&L
raw, no protections 8,326 506 -16,593
the 34 chains being replaced not re-measured
this block (153) 2,097 28 +99,131

Per population, against the last intermediate block so the last step is visible:

137 chains 153 chains
binance 2022 708t / 7L / +39,088 682t / 7L / +36,064
bybit 2026 732t / 22L / +22,180 722t / 12L / +36,444
binance 2026 710t / 16L / +20,271 693t / 9L / +26,623

53 trades bought 17 losses and 22% more money.

How it was built

The backbone came from a measured round; everything after it is per-loss work. The last two passes read the remaining losses one at a time and wrote a chain for each at zero winner cost in its own population — 16 chains, 14 of them three-clause.

Binance 2022's twelve residual losses split into four scenes:

scene losses reading at entry
upper timeframes already spent ALGO + FIL 10-13, SAND 07-26, SOL 11-22 rsi_3_4h 1.5 / 3.4, rsi_3_1h 0.5, stochrsi_k_1d 0.0, willr_14_4h -99.6
capitulation reversal XRP + DOGE 01-24 rsi_3_change_pct_1d +2269% / +785% against a winner median of -9.65
the 4h has turned up SOL + AAVE 01-31 change_pct_4h +1.3 / +0.8, 98th percentile
small change AXS, FIL, ADA, AVAX no common axis

The first scene is the signal's own blind spot: the Logic checks roc_288 > -10, so it already refuses to sell a 24h that has crashed — but nothing checked whether the 1h, 4h and 1d were spent. Those chains are the complement of a filter the signal already has.

What was measured and rejected

  • Running the round a second time on its own blocked export (164 chains). Offline it takes binance 2022 to zero losses. Run for real it gives 369t / 2L / +13,515 against 137's 722t / 12L / +31,965: ten losses cost 343 winners, 34 per loss, against a break-even of 12.3, and half the money. Not shipped.
  • Chains for the losses that do not separate. SOL and AAVE 01-31 sit in the middle of every distribution; the cheapest chain reaching either costs 176 to 199 winners. DOGE 01-24 costs 39 plus 54 more on another population, ADA 128, FIL 71. Those five losses are left in on purpose.
  • Two candidates dropped for house style, not for their numbers: they needed rsi_3_lt_15 / rsi_3_lt_20, which are not cached in the entry scope, and two more needed non-round raw thresholds (roc_9 < -0.5, roc_9_15m > -2).

The 28 that remain

They are not fast squeezes. Most stay open longer than two days: the break is correct and the market walks over it. Four independent attempts to separate them at entry failed, which is what you would expect from a signal that fires at the break rather than after it — the winner and the loser are the same candle. 170 could be reduced to five losses because it fires after capitulation, when the context already describes the move.

short_entry_condition_669_enable stays False. ruff format and ruff check clean at the pinned version, py_compile clean, and the bare block the measurements ran on is byte-identical to the one in this diff.

🤖 Generated with Claude Code

Signal 669 (dump hunter, short, experimental, disabled) carried 34 protection
chains, 82% of them built from columns outside the four families the rest of
the file uses. They were never measured chain by chain. This replaces them
with 153 chains measured on three populations, all on cached booleans, all
thresholds multiples of five, none longer than three clauses.

Measured with grinding and position adjustment off, 20 slots, tag 669 alone,
on binance 2022, bybit 2026 and binance 2026:

  raw (no protections)   8,326 trades   506 losses   -16,593
  this block             2,097 trades    28 losses   +99,131

The signal stays disabled.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@iterativv
iterativv merged commit 3b2fa44 into iterativv:main Sep 20, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants