sha256:6a34795dff8169aee5554636aa7ec951803d6532cb97da1399eb3b11306c2714
Last pushed
2 months by devslaveux
Type
Compose
Manifest digest
sha256:6a34795dff8169aee5554636aa7ec951803d6532cb97da1399eb3b11306c2714
# KalshiBot5k — one-command deploy (OCI artifact, no files to ship).
#
# Publish (maintainer, after ./publish.sh pushes the images):
# docker compose -f dist/docker-compose.yml publish -y --with-env devslaveux/kbot-stack:latest
#
# Run on ANY machine (after `docker login -u devslaveux` with a read-only token):
# docker compose -f oci://docker.io/devslaveux/kbot-stack:latest up -d
# -> open http://localhost:8080 and install your Kalshi key in Settings.
#
# Settings + credentials + trade data persist in named volumes (kbot-config, kbot-data) — there
# are NO host files to copy. The `environment:` block is the baked default config (safe: demo +
# dry-run + paused); anything you save in the dashboard is written to the volume and overrides it.
name: kalshibot5k
services:
backend:
image: devslaveux/kbot-backend:latest
pull_policy: always
environment:
TZ: UTC
# settings (.env) + private key live in the persisted volume; the dashboard writes them
KBOT_ENV_FILE: /app/config/.env
KALSHI_PRIVATE_KEY_PATH: /app/config/kalshi_private_key.pem
# --- safe defaults for a fresh deploy (dashboard-saved values override these) ---
# Boots paper + paused: the operator installs the Kalshi key, then flips DRY_RUN off and
# unpauses in the dashboard once verified. Values here are conservative starting points;
# tune sizing/gates in the dashboard (they persist to the volume and override this block).
KALSHI_ENV: demo
DRY_RUN: "true"
START_PAUSED: "true"
RESET_ON_START: "false"
LOSS_CAP_ENABLED: "true"
MAX_DAILY_LOSS_DOLLARS: "5.0"
MAX_CONCURRENT_POSITIONS: "6"
# --- settle-lock: THE primary strategy (buy near-locked settlement outcomes, hold to settle) ---
SETTLE_ENABLED: "true"
SETTLE_SHADOW: "false"
# 15M single-strike series only (NO hourly between-brackets -- the residual-variance model
# prices those unreliably and settle holds to settlement with no stop). BNB15M/HYPE15M are
# sticky-thin indices: the sigma-floor guards them, but the model can still over-confidently
# peg fair -- run them with a STRICT SETTLE_MIN_FAIR (0.90+) and watch the reject log.
SETTLE_SERIES: KXBTC15M,KXETH15M,KXSOL15M,KXXRP15M,KXDOGE15M,KXBNB15M,KXHYPE15M
SETTLE_MIN_FAIR: "0.90" # validated operating point
SETTLE_MARGIN_CENTS: "3"
SETTLE_CONTRACTS: "1" # floor size; raise via the dashboard once proven
SETTLE_SIZE_BY_VOLUME: "true"
SETTLE_CONTRACTS_MAX: "3" # volume-scaling ceiling (conservative default)
SETTLE_VOL_PER_CONTRACT: "500"
# Settle is pure hold-to-settlement on the downside (the disaster-flip stop was removed
# 2026-07-13). EARLY take-profit (opt-in): while >LOCK_SECS remain, lock a >=TP_CENTS/contract
# net gain as a taker; inside the final LOCK_SECS hold to fee-free settlement. OFF = pure hold.
SETTLE_TP_ENABLED: "false"
SETTLE_TP_CENTS: "6"
SETTLE_TP_LOCK_SECS: "60"
SETTLE_PRICE_MIN: "50"
SETTLE_PRICE_MAX: "97"
# --- smart-stop exit rails (fair-anchored, mid-anchored, flash-wick debounced) ---
SMART_STOP_ENABLED: "true"
SMART_HARD_CAP_CENTS: "8"
SMART_AGE_TIGHTEN_SEC: "90"
SMART_TIGHT_CAP_CENTS: "6"
SMART_CUT_CONFIRM_SEC: "2.0"
SCALP_MAX_HOLD_SEC: "6600" # must exceed SMART_AGE_TIGHTEN_SEC or the age-tighten is unreachable
# --- fair-anchored maker (HF layer): SHADOW by default; opt into live in the dashboard ---
MAKER_ENABLED: "true"
MAKER_SHADOW: "true"
MAKER_SERIES: KXBTC15M,KXETH15M,KXSOL15M,KXXRP15M,KXDOGE15M
MAKER_CONTRACTS: "1"
MAKER_MAX_INVENTORY: "2"
# --- latency executor: off (no live edge in the recorded data) ---
LAT_ENABLED: "false"
STOP_CHECK_INTERVAL_SECONDS: "0.2"
ONE_POSITION_PER_EVENT: "true"
volumes:
- kbot-config:/app/config # .env + private key (dashboard-managed; persisted)
- kbot-data:/app/data # trade/state files (persisted)
ports:
- "8000:8000"
restart: unless-stopped
dashboard:
image: devslaveux/kbot-dashboard:latest
pull_policy: always
ports:
- "8080:80" # open http://localhost:8080
depends_on:
- backend
restart: unless-stopped
volumes:
kbot-config:
kbot-data:
docker compose -f oci://devslaveux/kbot-stack:latest upUse the above command to pull and run the Compose file. Learn more.