Token selection

When a position slot opens up, token selection decides which symbol fills it. The decision is two-stage: first, which selection algorithm runs (override / fast-track / BTC-bias / fallback), and second, how candidate symbols are ranked by that algorithm. This chapter covers the ranking math; the selection-algorithm choice belongs to the open phase of the position lifecycle.

This is the business-domain lens view. Direction is decided upstream by the signal → direction pipeline; this layer ranks symbols of the matching direction.


The four selection priorities

Before any score is computed, one of four priorities is chosen:

PriorityWhen it runsUses scoring?
OverrideOperator pinned a specific symbol → slotNo — bypasses scoring entirely
Fast-trackA recently-closed winning trade is showing fresh signal — re-enter same symbol fastSkips correlation / elasticity checks
BTC-biasDefault. Direction-bias mode where wrong-sign-correlation candidates are hard-rejectedYes (with hard sign filter pre-score)
FallbackBTC-bias produced no candidateYes (no sign filter — accept either direction's correlation)

Only BTC-bias and fallback use the scoring formula below. Override and fast-track route around it.


The score formula

   base       = log(1 + |elasticity[tf]|) × |correlation[tf]|
   multiplier = stability_weight × diversification_penalty × s_r_proximity
   score      = base × multiplier

tf is the symbol's own concluded timeframe in BTC-bias mode, or the best-scoring timeframe across the configured set in fallback mode. Direction is implicit: LONG uses elasticity_long, SHORT uses elasticity_short. Both inputs are absolute-valued — sign of either is irrelevant, direction-specific behaviour is upstream.


Why log-compress the base

Architectural decision

Raw elasticity × |correlation| over-weights freak high-elasticity outliers. A 100× elasticity / 0.4 correlation token scores 40 under raw multiplication, dwarfing a 5× / 0.9 token (4.5). The log compresses the gap to ~1.5× — strong correlation stays competitive with extreme amplitude. The intent: a reliable, well-correlated mover beats a wild, weakly-correlated one of similar net signal strength.


The three multipliers

Stability weight (btc_correlation_stability)

A 0.7 correlation that's steady across windows is a more reliable signal than a 0.9 that's averaging a jittery underlying series. Stability is the standard deviation of the sliding-window correlation series, persisted at correlation-compute time.

Rule: max(0, 1 - 2 × stddev). So 0.05 stddev → 0.90 multiplier, 0.20 → 0.60, 0.50 → 0. Missing or non-positive stability → 1.0 (graceful degrade — never penalise for absence of data).

Batch diversification penalty

Within a single open batch, picking the same direction repeatedly on highly-correlated symbols compounds risk on one side of the book. The penalty discounts a candidate proportionally to how many already-picked symbols in this batch share its direction and its correlation cluster. The intent: spread risk across uncorrelated movers within a batch, not pile six longs onto BTC, ETH, SOL, AVAX, NEAR, INJ at once.

S/R proximity

A candidate near a major support / resistance is amplitude-rich (more room to move) but lower-probability — it has a clear barrier in the way. The proximity multiplier slightly downweights candidates pinned hard against an obvious S/R. Soft signal, not a hard reject.


Hard sign filter (BTC-bias only)

Before scoring, BTC-bias mode hard-rejects any candidate whose correlation sign disagrees with the direction:

   LONG  + correlation < 0  ─► rejected
   SHORT + correlation > 0  ─► rejected

Fallback mode skips this — it accepts wrong-sign-correlation candidates because the alternative is no candidate at all.