From relative strength to a portfolio
Assets are ranked against one another. Leaders have stronger performance after adjusting for BTC movement and residual risk; laggards have weaker performance. Leaders enter the long basket and laggards enter the short basket. A leader may simply fall less than the market, while a laggard may rise less.
The hypothesis is that relative performance can persist. Returns depend on the chosen leaders continuing to outperform the laggards after fees, funding and execution costs. This is a testable hypothesis, not a proven guarantee of profit.
Data and instrument selection
The current universe contains 58 crypto assets, with BTC used as the market reference. The model uses closed hourly candles: 721 closing prices produce 720 hourly returns for risk estimation, while the signal covers the latest 168 hours.
Eligible assets need a BTC beta between 0.2 and 3.0, nonzero residual volatility and positive volume in at least 90% of the last 720 candles. The model selects five leaders and five laggards. With fewer than ten eligible assets, it returns a zero target, which can require reducing existing positions.
Missing or misaligned core-asset or BTC data blocks calculation. The volume filter does not guarantee sufficient order-book depth for every portfolio size.
There are 58 coins: 50 core assets and 8 optional additions — ETHFI, RIVER, AVNT, 币安人生, JUP, 牛来, PONS, MARSCOIN. BTC is a separate benchmark and is not one of the 58. An optional asset needs complete hourly history, at least 50,000 USDT of 24-hour turnover and a spread no wider than 0.5%. Missing history or failed filters exclude it from current selection; a core-asset or BTC data error blocks calculation. If an optional coin is already held, missing history blocks the new plan. Optional coins also require catalog availability and aligned leverage; liquidity is checked again before entry. All 58 coins share one portfolio and risk budget.
The signal calculation
For each asset, beta estimates the sensitivity of hourly returns to BTC. The signal subtracts beta times the weekly BTC log return from the asset’s weekly log return. It then divides the residual by the standard deviation of residual hourly returns and the square root of 168.
Ranking therefore adjusts for both market movement and asset risk. The signal’s sign alone does not determine the side: the model selects the relative top and bottom five.
Capital allocation
Signal strength selects candidates. Weights are determined separately by minimizing estimated portfolio variance using the covariance of raw asset returns. The risk matrix combines 75% sample covariance with 25% of its diagonal.
Absolute model weights sum to 100% of the portfolio’s total target notional; each asset is capped at 15% of that notional. Estimated aggregate beta to BTC is zero. Some of the ten candidates may receive a zero weight.
Zero beta does not require equal long and short notionals. It reduces estimated exposure to one factor, but does not eliminate risk: relationships change and executed positions can differ from the target.
Notional exposure, leverage and position sizing
The current total target notional is 10× allocated capital. With 1,000 USDT allocated, the model targets about 10,000 USDT of combined absolute long and short exposure, capped at 1,500 USDT per asset. The 10,000 USDT covers the entire portfolio; the optimizer determines the long/short split.
Exchange leverage defaults to 20×, with 10× for AVNT on both sides. Margin is calculated using each asset’s leverage; G/20 is not a valid portfolio estimate when AVNT is included.
Execution checks actual leverage, available margin, a cost reserve of 2% of allocated capital and a margin limit of 90% of account equity. Sizes are rounded to valid contracts and risk limits are checked again. New openings are blocked if the target portfolio does not fit the budget.
Actual exposure may be below target because of membership confirmation, risk limits, minimum order sizes and partial fills. Larger notional amplifies the effect of market moves and costs on capital; beta neutrality does not remove this risk.
Hourly updates and execution
After each UTC hour closes, the strategy refreshes its data, ranks assets and recalculates target weights. For example, the close of the 11:00–12:00 UTC candle provides the data for the 12:00 UTC target. Rotation follows this hourly schedule throughout the day.
A new asset must be selected on the same side in two consecutive hourly decisions before admission. Existing members can be retained through a brief ranking change; eligibility filters also affect membership. Individually confirmed assets may reach their full raw-model shares after rounding validation; missing shares are not redistributed. Weights of a complete confirmed basket are recalculated every hour even when its assets stay the same.
The engine maintains one current target and gradually moves positions toward it. An update does not require closing and reopening the entire portfolio each hour. Ordinary adjustments to a nonzero target position skip deviations below 1% of allocated capital; position removals and protective reductions follow separate rules.
Execution primarily uses post-only limit orders with price adjustments. Passive entry is configured for up to 4 hours and passive reduction for up to 2 hours, after which price-limited IOC orders may be used while authorization and risk checks remain valid. An ordinary child order is capped at 10% of allocated capital in notional. Execution may span several hours and is not guaranteed by a fixed deadline.
Each new hourly target accounts for completed fills and ongoing transitions. The engine persists order intent, reconciles the account and controls beta, margin and gross exposure. Unknown submission outcomes require exchange reconciliation first.
Protection and its limits
The described configuration has an emergency trigger at a cumulative trading loss of 10% of initially allocated capital. This is not a 10% maximum drawdown from the equity peak, nor a guarantee of an exit exactly at the threshold.
For example, after starting with 1,000 USDT and growing to 1,500 USDT, the original threshold remains about 900 USDT without cash flows. The decline from the peak to that level would be 40%. The check depends on accurate accounting and a running process; managed exchange-side TP/SL orders are not enabled in this configuration.
Market, liquidation, liquidity, funding, slippage, exchange and execution risks remain. Copy trading can differ from lead-account performance. Technical tests validate implementation properties, not profitability.
Copy trading terms
Copy trading is offered through the HTX trader profile. There is no subscription fee; compensation is 25% of profits. Trading fees and funding are separate. No subscription fee does not mean no costs.
Open the profile and review its displayed profit share, calculation rules, availability, limits and copying settings. Choose your allocation and confirm on HTX. The platform’s terms determine the settlement period, profit-sharing base and treatment of earlier losses; this page does not replace those terms.
Connecting through the copy trading interface does not require running your own bot. Follower results can differ because of start time, position sizing, rounding, fees and execution.
Strategy publication and next steps
This page describes the hourly RS Rotation V2 model. Parameters and behavior were checked against the current project configuration on September 14, 2026: a 720-hour risk window, a 168-hour signal, five candidates per side and hourly updates. Source publication on GitHub is planned alongside several strategies for the CROT engine. A link will be added after publication.
The public CROT repository linked in the site menu is the already published project. Until the new strategy is released, it is not a source-code link for RS Rotation V2. No unverified return or backtest figures are presented here.
Complete rules and formulas
Source and configuration snapshot: September 14, 2026. Reproducible formulas and actual conditions, including blockers and limitations.
1. Version and notation
Checked against source and settings on September 14, 2026. Plugin rs_rotation_v1, model original_cov_720h_168h_top5_hourly_v2, policy continuous_target_v2. The URL is version independent; the old address redirects with HTTP 301. This documents checked code, not proof that every setting is currently loaded by the lead account or reproduced by followers.
E is current account equity; f allocation fraction; A allocated capital; G total absolute target notional across both sides; A₀ initial allocated capital. q is contracts and c is base-asset quantity per contract. BTC is benchmark only.
A = fE; G = kA
f = 1; k = 10; L_i = 10 for AVNT; 20 otherwise
A₀ persists; it is not a high-water mark 2. Full universe and data
There are 58 coins: 50 core assets and 8 optional additions — ETHFI, RIVER, AVNT, 币安人生, JUP, 牛来, PONS, MARSCOIN. BTC is a separate benchmark and is not one of the 58. An optional asset needs complete hourly history, at least 50,000 USDT of 24-hour turnover and a spread no wider than 0.5%. Missing history or failed filters exclude it from current selection; a core-asset or BTC data error blocks calculation. If an optional coin is already held, missing history blocks the new plan. Optional coins also require catalog availability and aligned leverage; liquidity is checked again before entry. All 58 coins share one portfolio and risk budget.
History contains 721 closed hourly candles for each included asset and BTC: H = 721×(n+1)×6, with 50≤n≤58. With all 58 assets: 721×59×6. Fields are opening timestamp, open, high, low, close, volume. Candles must be finite, consistent and gap-free; OHLC>0, volume≥0. Missing candles are never filled. Order is core assets, available optional assets, BTC last.
ETH SOL XRP DOGE BNB ADA SUI HYPE PEPE ZEC
LTC FIL WLD TRX XAUT LINK ENA BCH ARB NEAR
TRUMP DOT DASH SHIB WIF ASTER GRAM UNI AVAX ONDO
ORDI ETC OP TAO XLM ATOM XMR FLOKI BEAT FARTCOIN
APT PUMP ICP TIA PENGU LIT PEOPLE AAVE BONK SUSHI
ETHFI RIVER AVNT 币安人生 JUP 牛来 PONS MARSCOIN
D mod 3600 = 0
timestamps = D−721h, …, D−1h
high ≥ max(open,low,close); low ≤ min(open,high,close)
input_hash = SHA256(H: little-endian float64, C order)
spread = (ask-bid)/((ask+bid)/2) ≤ 0.005
optional turnover_24h ≥ 50000 USDT
ticker age ∈ [−5, 30] seconds 3. Returns, beta and residual risk
P is close and B is BTC. Risk uses 720 simple hourly returns. Sample estimates use ddof=1 (denominator 719); beta is centered. BTC variance<10⁻¹² blocks calculation. Residual e has no separate intercept/alpha; σ is its hourly standard deviation, not annualized.
rₜ,ᵢ = Pₜ,ᵢ/Pₜ₋₁,ᵢ − 1, t=1,…,720
r̄ᵢ = Σₜrₜ,ᵢ/720
vB = Σₜ(rₜ,B−r̄B)²/719
βᵢ = [Σₜ(rₜ,ᵢ−r̄ᵢ)(rₜ,B−r̄B)/719]/vB
eₜ,ᵢ = rₜ,ᵢ−βᵢrₜ,B
σᵢ = sqrt[Σₜ(eₜ,ᵢ−ēᵢ)²/719] 4. Score and eligibility
The signal uses 168-hour log returns while beta/σ use 720 simple hourly returns. This explicit mixture is not a log-return regression. Score is not an expected return or success probability.
Eligibility: β∈[0.2,3], σ strictly >10⁻⁶ and volume>0 in at least 90% of the last 720 candles. Valid ineligible assets remain in input. Funding and depth are not score inputs.
Lᵢ = ln(P_last,ᵢ/P_last−168,ᵢ)
scoreᵢ = (Lᵢ−βᵢLB)/max(σᵢ,10⁻⁶)/sqrt(168)
eligible = finite(β) AND 0.2≤β≤3 AND σ>10⁻⁶
AND count(volume>0)/720 ≥ 0.90 5. Selection and ties
Fewer than ten eligible produces the zero target insufficient_eligible, which may close positions. Data/solver errors do not mean flat: no new target is published.
Stable ascending score sort: short takes first five, long takes last five reversed. Ties use universe order with the long tail reversed. Score sign is not a filter. Zero QP weight does not remove raw membership.
rank = stable_argsort(score[eligible])
short = rank[:5]; long = reverse(rank[−5:])
selected = long + short
s = (+1,+1,+1,+1,+1,−1,−1,−1,−1,−1) 6. Covariance and optimization
S uses raw simple asset returns, not residual e. The matrix mixes 75% S and 25% diagonal. x is absolute G weight, w=s⊙x. Score selects candidates but is absent from the objective: no momentum reward, turnover penalty, funding forecast or expected-profit optimization.
Zero weights are allowed; long/short dollar notionals need not match. No equal-weight or simple-volatility fallback.
Sᵢⱼ = Σₜ(rₜ,ᵢ−r̄ᵢ)(rₜ,ⱼ−r̄ⱼ)/719
Σ = 0.75S + 0.25diag(diag(S))
Q = Σ_selected ⊙ (ssᵀ)
minimize 0.5xᵀQx
subject to Σxᵢ=1; Σsᵢβᵢxᵢ=0; 0≤xᵢ≤0.15
w=s⊙x 7. Numerical solver protocol
Exactly 10 variables, 10×10 matrix, 5+/5− signs, finite values and β∈[0.2,3]. Symmetry allclose uses atol=10⁻¹² and default rtol=10⁻⁵; min eigenvalue≥−10⁻¹². Q scaling and 10⁻¹⁰I are numerical regularization. Initialization above cap+10⁻¹² blocks even if another feasible point exists.
After solver, allocate rechecks finite, |gross−1|≤10⁻⁸, |w·β|≤10⁻⁸, cap≤0.15+10⁻⁹ and wᵢsᵢ≥−10⁻¹⁰. Errors/nonconvergence do not yield a simplified portfolio. The entire preset must match model parameters.
Q̃ = Q/max(max(diag(Q)),10⁻¹²) + 10⁻¹⁰I
bL=mean(β_long); bS=mean(β_short)
x_long=bS/[5(bL+bS)]; x_short=bL/[5(bL+bS)]
C=[1ᵀ; (s⊙β)ᵀ]; Cx=(1,0)ᵀ
repeat at most 500 iterations:
F = non-active coordinates; require |F|≥2
g=Q̃x
solve [Q̃_FF C_Fᵀ; C_F 0][d_F;λ]=[−g_F;0;0]
using least squares, rcond=10⁻¹²; d_active=0
if max|d|<10⁻¹⁰:
z=g+Cᵀλ
violation=−z_j at lower bound, +z_j at upper
if no active bounds or max violation<10⁻⁹:
clip x to [0,0.15]
require max|Cx−(1,0)|≤10⁻⁸, max(x)≤0.15+10⁻¹⁰
return x
else release most violated bound
else:
step starts at 1, reduced to first bound along d
|d_j|≤10⁻¹² does not set a bound
x←x+step*d; activate bound reached
otherwise: OptimizationBlocked 8. Membership confirmation
Only D−3600 is adjacent. Per side, retain eligible incumbents present in current or previous raw, then add new candidates present in both. Incumbents first, maximum five. First absence removes entry support; two adjacent absences remove accepted membership. Lost eligibility removes immediately.
After a time gap, eligible incumbents remain and new confirmations restart. Overlap retains the previous side (long searched first). Entry requires supported, nonzero correctly signed raw weight and a flat opposite side. Missed hours are not traded retroactively.
adjacent = previous.D==D−3600
raw_prev = previous.raw if adjacent else empty
kept = previous.accepted ∩ eligible, filtered by
(in raw_now OR in raw_prev OR NOT adjacent)
new = raw_now ∩ raw_prev ∩ eligible, excluding kept
accepted = first 5 of kept+new, per side
supported = accepted ∩ raw_now ∩ raw_prev
degraded = either accepted side has fewer than 5 9. Complete and partial baskets
Complete accepted 5+5: rerun QP on that membership with current risk even if raw differs. Increases still require supported membership and correctly signed raw weight.
For incomplete membership, unsupported incumbents retain current volume and removed assets get zero. Individually supported assets can receive their shares from the complete current raw QP after full rounding validation. Missing shares are not redistributed (confirmed_raw_targets_v1); actual basket/gross can be smaller.
Raw rounding failure blocks new partial targets but preserves holds and removed-asset exits. A complete accepted-model failure has no partial fallback.
10. Contract sizing and rounding
Last close is reference p. q rounds down to contract step, not coin quantity. Exchange quantity/notional minimums apply; leftovers are not redistributed. ŵ is normalized by G but rounded beta by A. At k=10, 0.03 of A means 0.003 of G.
Full targets require gross 98–100% G, both sides and 15% G cap. Zero insufficient_eligible is exempt. Partial execution need not reach 98% G.
qᵢ=sign(wᵢ) floor_step(|wᵢ|G/(pᵢcᵢ))
ŵᵢ=qᵢpᵢcᵢ/G
0.98≤Σ|ŵᵢ|≤1+10⁻⁸; max|ŵᵢ|≤0.15+10⁻⁹
β_A,target=(G/A)Σŵᵢβᵢ; |β_A,target|≤0.03
exists ŵ>0 AND exists ŵ<0 11. Margin and notional
At E=A=1,000 USDT and k=10: G=10,000, asset cap 1,500; L=20 implies about 500 initial margin plus 20 reserve: 520≤900. This is a calculation, not guaranteed margin availability. Leverage does not multiply G again.
Even empty/partial targets are assessed against the full model: maximum of full-model and saved-contract margin plus reserve. Falling equity does not shrink saved contracts automatically. Missing composition/leverage means unavailable, not zero.
G_used/M_used include positions and remaining opening orders at max(order price,current price). Closing orders release nothing until proven fills. Limits are rechecked at dispatch.
Exchange leverage defaults to 20×, with 10× for AVNT on both sides. Margin is calculated using each asset’s leverage; G/20 is not a valid portfolio estimate when AVNT is included.
R=0.02A; margin_limit=0.90E
M_model=Σ|wᵢG|/Lᵢ; M_contracts=Σ|qᵢpᵢcᵢ|/Lᵢ
max(M_model,M_contracts)+R≤0.90E
Opening order added notional N:
M_used+N/L+R≤0.90E; N/L+R≤available_margin
G_used+N≤min(G_saved,10A_current,10.3E_current)
N_symbol+N≤0.15min(G_saved,10A_current) 12. Differences, deadband and slices
Differences are computed per side. Ordinary nonzero-target adjustment skips a delta below 1% A, checked at current and order price. Zero target, emergency and protective reductions bypass deadband.
Initial slice≤10% A, not G, then limited by gross, cap, margin, beta, step and closeability. To avoid an invalid tiny remainder, the whole position may exceed the usual slice only within required reduction and hard beta. Foreign volume is not adopted; available/frozen are not subtracted twice.
Δq_side=q_target,side−q_current,side
ordinary nonzero target: skip if |Δq|pc<0.01A
q_child≤min(|Δq|,0.10A/(p_order c))
close_capacity=max(0,min(position.available,
position.size−remaining_close_orders)) 13. Beta and arbitrary partial fills
B_A uses current A, not G. Pending orders may fill independently: buy adds positive, sell negative exposure regardless of open/close. Order valuation uses max(order,current price).
Hard band ±0.10; ordinary slices use ±0.09, reserving 10% for latency/movement. Final guard uses ±0.10. Out-of-band beta may improve without a worse opposite excursion. A pending breach cancels the largest owned contributor to the breached edge, then reconciles.
B_A=Σsign(position)q c mark β/A
δ_o=sign(buy/sell)remaining_o c β max(order_price,current_price)/A
B_low=B_A+Σmin(0,δ_o); B_high=B_A+Σmax(0,δ_o)
L=min(−tolerance,B_A); U=max(tolerance,B_A)
u=|cβ max(order_price,current_price)/A|
room=U−B_high (positive impact), B_low−L (negative)
q_allowed=floor_step(max(0,min(q_requested,room/u)))
existing envelope outside [L,U] → q_allowed=0
u<10⁻¹⁶ → floor_step(q_requested) 14. Passive prices and repricing
b/a are best bid/ask, m midpoint, σ residual hourly volatility. Offset is fixed at transition creation then decays with age. Stale-plan or missing-σ reductions start at zero offset.
Passive entry 14,400s (4h), reduction 7,200s (2h), then IOC may apply. Buy rounds down, sell up to tick. Entry is bounded ±0.3% from current H1 authorization midpoint. Crossing post-only is blocked.
Ordinary reprice only moves toward a fill (buy higher,sell lower), at least 2 ticks and 120s since last submit/reprice. Lost authorization, incompatible target or phase change cancel without waiting.
m=(b+a)/2
o₀=min(0.001,max((a−b)/m,0.10σ))
o(t)=o₀[1−min(1,elapsed/T_passive)]
p_buy=floor_tick[b(1−o(t))]
p_sell=ceil_tick[a(1+o(t))]
entry buy≤m_auth*1.003; entry sell≥m_auth*0.997 15. IOC, authorization and expiry
IOC is a limit order canceling unfilled remainder. Buy bounded by ask×1.001, sell by bid×0.999, with ±0.3% H1 midpoint bound for entry. Rounded buy<ask or sell>bid blocks without market fallback.
At most 3 entry IOC attempts per authorization, at least 120s apart. New confirmed H1 updates midpoint, expiry and attempts, not arrival, offset or age. Entry expires at 86,400s. Mandatory exit/emergency has no total deadline; emergency retries no more often than 10s.
Raw disappearance and renewed confirmation can start a new episode. A material post-expiry target addition permits only the addition; old remainder is carried separately, not rejuvenated. Backward clocks block entry. Unknown submit retains obligations.
IOC buy=floor_tick(ask*1.001)
IOC sell=ceil_tick(bid*0.999)
entry buy=floor_tick(min(ask*1.001,m_auth*1.003))
entry sell=ceil_tick(max(bid*0.999,m_auth*0.997))
entry attempts/authorization≤3; entry age<86400s 16. Freshness, scheduling and targets
New D is created only within [D,D+3600); duplicate processed D is forbidden. Entry expires D+3720; without a new target entries block and resting entries cancel. Permissible exits/protection continue.
Public worker checks overlap and atomically publishes the complete history; exact inputs are SHA-256 archived. Runtime snapshot/book age≤30s and nonnegative. Entry economic statements verified within 120s.
One ordinary order per instrument/side. Queue favors least recently serviced eligible transition, then reduction, smaller resulting |beta|, symbol. Reprices share the queue. Protection compares |beta| first. Ordinary exits do not globally block all openings.
new plan: D≤now<D+3600
entry expiry=D+3600+120
0≤book_age≤30s; 0≤snapshot_age≤30s
normal priority=(last_service,reduce_before_open,|beta_after|,symbol)
protective priority=(|beta_after|,reduce_before_open,symbol) 17. Beta, gross and margin protection
Protection triggers on emergency, |B_A|>0.10, gross excess or M_used+R>90% E. No openings; IOC reductions take priority. Model target remains separate from protective execution.
Gross/margin reductions are proportional; a position worsening excess beta also reduces toward half-band (0.05). Quantity is capped by position then closeability, price and beta envelope. The cause is rechecked at dispatch.
G_limit=min(10.3E,1.03*10A)
z=min(1,G_limit/max(G_used,10⁻¹²),
max(0,0.90E−R)/max(M_used,10⁻¹²))
q_reduce=q_position*(1−z)
if sign(position)βᵢB_A>0 and |B_A|>0.10:
q_reduce=max(q_reduce,(|B_A|−0.05)A/(mark*c*|βᵢ|))
emergency: q_reduce=q_position
q_reduce=min(q_position,q_reduce) 18. PnL, funding and cash flows
Realized PnL is reconstructed from confirmed fills with per-side average entry and receipt deduplication. Closing beyond proven inventory blocks accounting. Fees are positive costs, rebates negative. Open PnL uses current positions; signed verified funding and cash flows are separate.
Wallet reconciliation uses equity/unrealized from one balance response, not marks from separate REST reads. Gap>0.01 USDT, unverified fees/stale statements block entry. Deposits are not PnL and do not reset A₀. Turnover is Σqpc over fills. Diagnostic maker/taker follows post-only/IOC types, not guaranteed exchange classification.
avg_new=(q_old*avg_old+q_fill*p_fill)/(q_old+q_fill)
PnL_close=sign(side)q_fill*c*(p_fill−avg_entry)
PnL_open=Σsign(side)q_position*c*(mark−entry_price)
PnL_trade=PnL_realized+PnL_open−fees+funding
expected_equity=E₀+PnL_trade+cashflows
wallet_gap=(E−U_balance)
−(E₀−U_balance,0+PnL_realized−fees+funding+cashflows)
|wallet_gap|≤0.01 USDT 19. Emergency loss: exact boundary
Trigger: cumulative trading PnL≤−10% A₀. Not trailing or peak drawdown. A₀=1,000 then growth to 1,500 without flows leaves threshold around 900: 40% from peak. Gross 10A means a 1% adverse portfolio move can cost about 10% A before costs.
Emergency persists and sets execution targets to zero; a better score does not cancel it. No total deadline, but price, closeability, beta and retry interval≥10s remain. Local best-effort protection depends on process, network, accounting and liquidity; managed exchange TP/SL is off.
Accounting exceptions make loss checking unavailable that cycle and block entry; independent beta/gross/margin checks continue with a usable snapshot. An unverified report blocks entry but its computed negative PnL can still trigger emergency.
emergency ⇔ PnL_trade≤−0.10A₀
A₀ survives restart/checkpoint/recovery
A₀≠peak equity; A₀≠G
persist emergency; executable_targets←0 20. Journal and blockers
Intent with unique client_order_id is persisted and fsynced before request; target revision, emergency, price, age, capital, beta, margin, ownership and size are then rechecked. Unknown submit/cancel is not blindly repeated and retains reserves. REST orders/positions are not atomic; mismatch does not prove manual closing.
Entry blocks on foreign/unknown orders, ownership mismatch, unreconciled state, wrong account mode, unavailable leading catalog, unconfirmed configured leverage on both sides (AVNT 10×; others 20×), stale data, economics, unsupported candidate, opposite position, margin, lot, price, beta/cap, expiry or backward clock. Entry blockers must not disable permissible owned reductions.
Schema 2 preserves hashes/revisions, membership, age/authorization, economics and A₀. Checkpoint after 128 intents requires no unknown outcomes and a valid receipt checkpoint; obligations persist. Initial baseline needs a clean account/new ledger. Old state requires explicit recovery, no auto-reset.
21. Limits and copy trading costs
No guaranteed returns, liquidation immunity or exact 10% loss ceiling. Historical BTC beta leaves other factors, correlation changes, funding/basis, liquidity and exchange risk. Weights do not optimize turnover; the volume filter is not market capacity. An H1 candle touching price does not prove a limit fill.
Rules/tests do not replace economic validation. Source is not yet public: this reveals formulas and checked algorithms, not an independent source audit. Profile history may include previous versions.
No subscription fee; 25% profit share; fees/funding separate. HTX determines period, sharing base and loss carryforward: 25% of each winning trade would be unjustified without verifying terms. Followers have their own fills/settings.
22. Model and trading parameters
Fractions are decimals: 0.10 = 10%. seconds means seconds; ticks means minimum price increments. max_passive_seconds constrains valid passive-phase configuration rather than adding a separate exit deadline in the loop. membership_confirmation_bars=2 and strict_target_margin_feasibility=true are mandatory validation settings. max_ioc_attempts is retained for the daily path; hourly uses max_ioc_attempts_per_authorization. Live/post-only/IOC flags are operator permissions, not proof of successful execution.
| Parameter | Value | Unit / basis |
|---|---|---|
model_version | original_cov_720h_168h_top5_hourly_v2 | — |
risk_hours | 720 | — |
signal_hours | 168 | — |
candidates_per_side | 5 | — |
weight_cap | 0.15 | — |
diagonal_shrinkage | 0.25 | — |
position_mode | dual_side | — |
asset_mode | 2 | — |
requested_leverage | 20 | notional / margin |
protection_mode | none | — |
max_margin_fraction | 0.9 | E |
max_gross_fraction | 10.3 | E |
capital_fraction | 1 | E |
target_gross_multiplier | 10 | G / A |
emergency_loss_fraction | 0.1 | A₀ |
cost_reserve_fraction | 0.02 | A |
beta_tolerance | 0.1 | beta-notional / A |
rounding_gross_min | 0.98 | G |
rounding_beta_tolerance | 0.03 | beta-notional / A |
ioc_slippage | 0.001 | bid / ask |
entry_deviation | 0.003 | H1 midpoint |
reprice_seconds | 120 | s |
poll_seconds | 10 | s |
accounting_tolerance_usdt | 0.01 | USDT |
entry_passive_seconds | 14400 | s |
exit_passive_seconds | 7200 | s |
entry_max_age_seconds | 86400 | s |
max_passive_seconds | 86400 | s |
signal_publish_grace_seconds | 120 | s |
child_order_max_equity_fraction | 0.1 | A |
rebalance_delta_equity_fraction | 0.01 | A |
initial_offset_max_fraction | 0.001 | bid / ask |
initial_offset_volatility_fraction | 0.1 | σ |
reprice_min_ticks | 2 | ticks |
strict_target_margin_feasibility | true | — |
membership_confirmation_bars | 2 | H1 |
max_ioc_attempts_per_authorization | 3 | — |
ioc_retry_seconds | 120 | s |
live_enabled | true | — |
post_only_open_confirmed | true | — |
post_only_close_confirmed | true | — |
ioc_confirmed | true | — |
max_ioc_attempts | 3 | — |
universe_count | 58 | — |
core_universe_count | 50 | — |
optional_universe_count | 8 | — |
leverage_override_AVNT | 10 | — |
optional_min_turnover_usdt_24h | 50000 | — |
optional_max_spread_fraction | 0.005 | — |
23. Sources and checksums
Hashes identify the checked source snapshot. They are not an audit of exchange execution and expose no credentials or account state.
- strategies/rs_rotation_v1/signal_engine.py
1e8ab8ae76f5e6408ec95a83d8f19fd62c6c686d01650fcf0a2ed7bce924a8a8- strategies/rs_rotation_v1/plugin.py
88ee68a3bb86d9785dc233d98f1a91ee7d3c2d85101fcfb018d6931046fd9daa- strategies/rs_rotation_v1/parameters.toml
358014490dd8ac61526898b58933f1df2f34e1499ad98a1295dbb13be7537003- htxbot/portfolio_targets.py
232a1e43ab22309d7e2122de6a7d7759a7d7f93016087b3399f43e908e59654e- htxbot/portfolio_continuous.py
0f0e9bdf9eb802e484cb7a9070219bbdc97dff429d2572c2415be7e8084d0695- htxbot/portfolio_risk.py
29bc694ee279e058a4fb5a8317c94d08a749d997304a6b953b072b01fe2e7b3d- htxbot/portfolio_state.py
7350fec1a3319e679900bcf63d9629e5bd7796abfa7118764026ca224c7e16cb- htxbot/portfolio_engine.py
e54c8653f4efa342e3705cdddc4e8d84bb265df99958c4835fcd8213cabc966f- htxbot/copytrade_execution.py
530903e1684dacb158ac66f72debab06d8f42416ddb30cd352f1de02ddf10b20- htxbot/portfolio_runtime.py
fbb47883114e61679c282b5f25093b404ab9d6991240e1742f39d25adabc4484- htxbot/portfolio_history.py
08730a203490b7e0298eb0c466147eb2b9c9eacb93d602d37719735933d83396- copytrade_config.py
9c9e9ae67e25535f5f63c395b8997ab6bbc0d7debace7412094ec4c585a9bb27- htxbot/secondary_universe.py
838d47a30c91378244d41bbc2f174d5fff1c032a1b6274726c97cd36ab6e686c- config/copytrade.toml
f027564adbe3b7e0680184a0a63f6690bf5a7cd3216cd3b06bb98898360f75fa
Performance and questions before subscribing
As of September 13, 2026, the public CrotPro profile on HTX names RS_ROTATION_V2. Profile history may include earlier versions and settings and should not be attributed entirely to the current configuration.
PnL is under reconciliation. Return figures are temporarily withheld pending reconciliation of HTX statistics with trade and deposit history. Account deposits are not trading profits or losses.
Check current data in the HTX profile
Compare matching periods, observation start dates, trade counts, fees, funding and cash flows. Lead-account statistics do not determine a subscriber’s result.
How do I subscribe?
Open the HTX profile, check copying availability for your account, the profit share and calculation rules. Before confirming, review whether existing positions will be copied and which limits and settings apply. No locally installed bot is required.
How do I stop copying?
Use the subscription controls on HTX. Read what happens to existing positions and pending orders before confirming: stopping new copies and closing positions may be separate actions. Afterwards, check your positions, orders and final charges.
Why does my result differ?
Subscription timing, allocated capital, contract rounding, account limits, partial fills, slippage, fees and funding can differ. Compare matching periods after all costs and cash flows.
Copy-trading evaluation checklist · About the project and sources
Connect through HTX
Review the terms, copying settings and lead-account statistics in the trader profile.