31 lines
1.5 KiB
Python
31 lines
1.5 KiB
Python
|
|
"""Policy constants — from data, never vibes (spec §6 closing note).
|
|||
|
|
|
|||
|
|
Every constant cites its provenance. Where a number is not yet backed by an L8/L10
|
|||
|
|
characterization row it is marked PROVISIONAL and must be calibrated before the smart
|
|||
|
|
path arms with real capital — a provisional constant is a known-unknown, not a vibe.
|
|||
|
|
|
|||
|
|
Cadence is NEVER hardcoded here (no literal 1 s): the drive loop takes its clock
|
|||
|
|
injected (spec §7, C1). These are policy magnitudes, not periods.
|
|||
|
|
"""
|
|||
|
|
from __future__ import annotations
|
|||
|
|
|
|||
|
|
from decimal import Decimal
|
|||
|
|
|
|||
|
|
# PROTECT: "maker at touch, one reprice, ≤2 s total, then cross" (spec §6).
|
|||
|
|
PROTECT_REPRICE_LIMIT: int = 1
|
|||
|
|
PROTECT_MAX_MS: int = 2_000
|
|||
|
|
|
|||
|
|
# HARVEST: "maker at target ± offset, chase ≤ N; give up when regression eats X%
|
|||
|
|
# of unrealized → cross" (spec §6). N and X are PROVISIONAL — no characterization
|
|||
|
|
# row fixes them yet (§17 open question: chase bounds from bookDepth replay).
|
|||
|
|
HARVEST_MAX_CHASES: int = 3 # PROVISIONAL — calibrate vs L8 fill_sim
|
|||
|
|
HARVEST_GIVEUP_REGRESSION_FRAC: Decimal = Decimal("0.25") # PROVISIONAL — 25% of unrealized
|
|||
|
|
|
|||
|
|
# ACQUIRE: "patient maker inside spread; abandon, never chase" (spec §6, §4-1:
|
|||
|
|
# a missed entry is free, a chased entry is not). No chase budget by construction.
|
|||
|
|
ACQUIRE_MAX_CHASES: int = 0
|
|||
|
|
|
|||
|
|
# Dead-man's stop default multiple of software SL distance (spec §10, §17 open
|
|||
|
|
# question: 2× vs ATR-scaled). PROVISIONAL default.
|
|||
|
|
PROTECTIVE_STOP_MULT_DEFAULT: Decimal = Decimal("2.0")
|