"""Sentinel pipeline with graduated drawdown management."""
import horizon as hz
from horizon.context import FeedData
def fair_value(ctx: hz.Context) -> float:
feed = ctx.feeds.get("polymarket", FeedData())
return feed.price if feed.price > 0 else 0.50
def quoter(ctx: hz.Context, fair: float) -> list[hz.Quote]:
return hz.quotes(fair, spread=0.04, size=10)
# Sentinel pipeline: monitors risk and takes action
risk_monitor = hz.sentinel(
config=hz.SentinelConfig(
# Graduated drawdown levels
alert_drawdown_pct=5.0, # alert at -5%
reduce_drawdown_pct=10.0, # reduce positions at -10%
pause_drawdown_pct=20.0, # pause quoting at -20%
exit_drawdown_pct=30.0, # exit all positions at -30%
# Risk budgets
max_var_pct=5.0, # max portfolio VaR as % of capital
max_concentration=0.40, # max 40% in one market
# Reporting
report_interval=60, # log risk report every 60 seconds
),
)
hz.run(
name="sentinel_monitored",
markets=["election-winner", "btc-100k"],
feeds={
"polymarket": hz.PolymarketBook("election-winner"),
},
pipeline=[fair_value, quoter, risk_monitor],
risk=hz.Risk(max_position=200, max_drawdown_pct=35),
interval=1.0,
mode="paper",
)