feat: order management (cancel/amend), stale order cleanup before market close, enriched LLM reasoning (RSI+BTC+regime), fleet dashboard with SVG charts/gauges/donuts
This commit is contained in:
30
bot.py
30
bot.py
@@ -97,6 +97,15 @@ class Kalshi:
|
||||
"post_only": False, "reduce_only": False}
|
||||
if dry: return {"simulated": True, "order": body}
|
||||
return self.req("POST", "/portfolio/events/orders", json=body)
|
||||
def cancel_order(self, order_id, dry=False):
|
||||
"""Cancel an open order by ID."""
|
||||
if dry: return {"simulated": True, "cancelled": order_id}
|
||||
return self.req("DELETE", f"/portfolio/events/orders/{order_id}")
|
||||
def amend_order(self, order_id, new_price_cents, dry=False):
|
||||
"""Amend an existing order's price."""
|
||||
body = {"price": f"{new_price_cents/100:.4f}"}
|
||||
if dry: return {"simulated": True, "amended": order_id}
|
||||
return self.req("POST", f"/portfolio/events/orders/{order_id}/amend", json=body)
|
||||
|
||||
# ───────── btc price feed ─────────
|
||||
def btc_price(coin="BTC"):
|
||||
@@ -575,6 +584,27 @@ def run():
|
||||
try:
|
||||
resolve_bets(kx, conn)
|
||||
adapt_controls(conn, cfg)
|
||||
# cancel stale unfilled orders close to market expiration
|
||||
try:
|
||||
open_orders = conn.execute(
|
||||
"SELECT id, ticker, order_id, side, price_cents FROM orders WHERE status IN ('placed','posted') AND dry=0"
|
||||
).fetchall()
|
||||
for oid, ticker, koid, side, px in open_orders:
|
||||
try:
|
||||
m = kx.req("GET", f"/markets/{ticker}")
|
||||
ct = m.get("close_time","")
|
||||
if ct:
|
||||
close_ts = datetime.fromisoformat(ct.replace("Z","+00:00")).timestamp()
|
||||
mins_left = (close_ts - time.time())/60
|
||||
if mins_left < 1.5:
|
||||
kx.cancel_order(koid, cfg.get("dry_run", False))
|
||||
conn.execute("UPDATE orders SET status='cancelled' WHERE id=?", (oid,))
|
||||
conn.commit()
|
||||
log_event(conn, "info", f"CANCEL stale {ticker} {side}@{px}¢ (mins_left={mins_left:.1f})")
|
||||
except Exception:
|
||||
pass
|
||||
except Exception:
|
||||
pass
|
||||
p = btc_price(cfg.get("coin", "BTC"))
|
||||
if p:
|
||||
conn.execute("INSERT INTO ticks VALUES (?,?)", (time.time(), p))
|
||||
|
||||
Reference in New Issue
Block a user