feat: scalp mode — 15s watch loop, hedge every tick (5¢ lock), micro-swing entries (0.03%/60s), skip-if-positioned. Always watching, catching swings both ways.

This commit is contained in:
drjones
2026-08-03 03:48:53 -07:00
parent fc96c6f070
commit d631fe529b
8 changed files with 82 additions and 8 deletions

Binary file not shown.

57
bot.log
View File

@@ -4149,3 +4149,60 @@ sqlite3.OperationalError: no such column: id
2026-08-03 03:32:30,840 skip KXZEC15M-26AUG030645-45: ⚠ RSI 1 extreme OS but 24h -0.7% downtrend — no knife catch
2026-08-03 03:32:34,839 ⚖ BTC WR=32% → stake $1.00→$0.75 (bets:34)
2026-08-03 03:33:05,368 skip KXBTC15M-26AUG030645-45: ⚠ RSI 1 extreme OS but 24h -0.7% downtrend — no knife catch
2026-08-03 03:36:18,552 skip KXDOGE15M-26AUG030645-45: ⚠ RSI 0 extreme OS but 24h -0.8% downtrend — no knife catch
2026-08-03 03:36:42,034 skip KXSOL15M-26AUG030645-45: ⚠ RSI 0 extreme OS but 24h -0.9% downtrend — no knife catch
2026-08-03 03:37:04,413 skip KXBNB15M-26AUG030645-45: passes: [split qwen=SKIP(0.85) ornith=SKIP(0.85)] Neutral RSI, choppy market, no clear edge
2026-08-03 03:37:15,470 POST NO x1 KXNEAR15M-26AUG030645-45 @ 50¢ — ⚠ RSI 100 extreme OB + momentum reversing → fade DOWN
2026-08-03 03:37:19,045 POST NO x1 KXETH15M-26AUG030645-45 @ 50¢ — ⚠ RSI 100 extreme OB + momentum reversing → fade DOWN
2026-08-03 03:37:32,619 skip KXXRP15M-26AUG030645-45: passes: [split qwen=SKIP(0.85) ornith=SKIP(0.50)] BTC bearish + choppy regime, no clear edge
2026-08-03 03:37:33,316 skip KXZEC15M-26AUG030645-45: ⚠ RSI 0 extreme OS but 24h -0.8% downtrend — no knife catch
2026-08-03 03:38:09,054 POST NO x1 KXBTC15M-26AUG030645-45 @ 50¢ — ⚠ RSI 97 extreme OB + momentum reversing → fade DOWN
2026-08-03 03:41:16,385 skip KXDOGE15M-26AUG030645-45: ⚠ RSI 0 extreme OS but 24h -0.8% downtrend — no knife catch
2026-08-03 03:41:40,554 skip KXSOL15M-26AUG030645-45: ⚠ RSI 0 extreme OS but 24h -0.9% downtrend — no knife catch
2026-08-03 03:42:02,657 POST NO x1 KXBNB15M-26AUG030645-45 @ 50¢ — ⚠ RSI 100 extreme OB + momentum reversing → fade DOWN
2026-08-03 03:42:06,103 skip KXETH15M-26AUG030645-45: ⚠ RSI 0 extreme OS but 24h -1.1% downtrend — no knife catch
2026-08-03 03:42:13,940 POST NO x1 KXNEAR15M-26AUG030645-45 @ 50¢ — ⚠ RSI 100 extreme OB + momentum reversing → fade DOWN
2026-08-03 03:42:22,990 POST NO x1 KXZEC15M-26AUG030645-45 @ 50¢ — ⚠ RSI 100 extreme OB + momentum reversing → fade DOWN
2026-08-03 03:42:28,231 skip KXXRP15M-26AUG030645-45: ⚠ RSI 0 extreme OS but 24h -1.1% downtrend — no knife catch
2026-08-03 03:42:36,384 ⚖ BTC WR=32% → stake $1.00→$0.75 (bets:34)
2026-08-03 03:42:57,039 POST NO x1 KXBTC15M-26AUG030645-45 @ 50¢ — DOWN: DOWN spike 0.06% conf=0.65 [[ornith-lead DOWN 0.65 | qwen=DOWN] RSI(5m)=97 overbought, s]
2026-08-03 03:43:31,244 CANCEL stale KXBTC15M-26AUG030645-45 no@50¢ (mins_left=1.5)
2026-08-03 03:43:31,251 CANCEL stale KXZEC15M-26AUG030645-45 no@50¢ (mins_left=1.5)
2026-08-03 03:43:32,051 CANCEL stale KXBTC15M-26AUG030645-45 no@50¢ (mins_left=1.5)
2026-08-03 03:43:32,610 CANCEL stale KXETH15M-26AUG030645-45 no@50¢ (mins_left=1.5)
2026-08-03 03:45:13,269 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ max_spend=100¢
2026-08-03 03:45:17,189 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ max_spend=100¢
2026-08-03 03:45:17,189 staggering start by 20s
2026-08-03 03:45:21,191 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ max_spend=100¢
2026-08-03 03:45:21,191 staggering start by 40s
2026-08-03 03:45:25,218 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ max_spend=100¢
2026-08-03 03:45:25,219 staggering start by 60s
2026-08-03 03:45:29,453 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ max_spend=100¢
2026-08-03 03:45:29,453 staggering start by 80s
2026-08-03 03:45:33,690 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ max_spend=100¢
2026-08-03 03:45:33,691 staggering start by 25s
2026-08-03 03:45:34,457 skip KXDOGE15M-26AUG030700-00: ⚠ RSI 0 extreme OS but 24h -0.7% downtrend — no knife catch
2026-08-03 03:45:37,289 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ max_spend=100¢
2026-08-03 03:45:37,289 staggering start by 30s
2026-08-03 03:45:41,288 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ max_spend=100¢
2026-08-03 03:45:41,288 staggering start by 35s
2026-08-03 03:46:01,941 ⚡ micro-swing 0.03%+ in 60s on KXDOGE15M-26AUG030700-00 — evaluating entry
2026-08-03 03:46:08,559 LOSS KXNEAR15M-26AUG030645-45 no@50¢ → yes (-50¢)
2026-08-03 03:46:14,588 LOSS KXBNB15M-26AUG030645-45 no@50¢ → yes (-50¢)
2026-08-03 03:46:16,912 LOSS KXNEAR15M-26AUG030645-45 no@50¢ → yes (-50¢)
2026-08-03 03:46:17,874 skip KXDOGE15M-26AUG030700-00: ⚠ RSI 0 extreme OS but 24h -0.7% downtrend — no knife catch
2026-08-03 03:46:24,945 ⚖ NEAR WR=17% → stake $1.00→$0.75 (bets:6)
2026-08-03 03:46:31,560 skip KXETH15M-26AUG030700-00: ⚠ RSI 3 extreme OS but 24h -1.2% downtrend — no knife catch
2026-08-03 03:46:34,639 ⚡ micro-swing 0.03%+ in 60s on KXDOGE15M-26AUG030700-00 — evaluating entry
2026-08-03 03:46:36,109 skip KXSOL15M-26AUG030700-00: ⚠ RSI 0 extreme OS but 24h -0.9% downtrend — no knife catch
2026-08-03 03:46:46,838 skip KXNEAR15M-26AUG030700-00: passes: [split qwen=SKIP(0.85) ornith=SKIP(0.50)] BTC bearish + neutral RSI, no clear fade edge
2026-08-03 03:46:47,807 skip KXZEC15M-26AUG030700-00: ⚠ RSI 0 extreme OS but 24h -0.8% downtrend — no knife catch
2026-08-03 03:46:49,465 ⚖ BTC WR=32% → stake $1.00→$0.75 (bets:34)
2026-08-03 03:46:50,373 skip KXBNB15M-26AUG030700-00: passes: [split qwen=SKIP(0.50) ornith=SKIP(0.50)] BTC bearish + neutral RSI, no clear fade edge
2026-08-03 03:46:50,397 POST NO x1 KXXRP15M-26AUG030700-00 @ 50¢ — DOWN: UP spike 0.03% conf=0.65 [[ornith-lead DOWN 0.65 | qwen=SKIP] RSI(1m)=100 overbought +]
2026-08-03 03:46:51,779 skip KXDOGE15M-26AUG030700-00: ⚠ RSI 0 extreme OS but 24h -0.7% downtrend — no knife catch
2026-08-03 03:46:53,303 ⚡ micro-swing 0.03%+ in 60s on KXETH15M-26AUG030700-00 — evaluating entry
2026-08-03 03:47:05,644 LOSS KXBNB15M-26AUG030645-45 no@50¢ → yes (-50¢)
2026-08-03 03:47:08,097 skip KXETH15M-26AUG030700-00: ⚠ RSI 1 extreme OS but 24h -1.2% downtrend — no knife catch
2026-08-03 03:47:13,656 ⚖ BNB WR=0% → stake $1.00→$0.75 (bets:5)
2026-08-03 03:47:19,411 skip KXBTC15M-26AUG030700-00: ⚠ RSI 0 extreme OS but 24h -0.8% downtrend — no knife catch

33
bot.py
View File

@@ -535,7 +535,7 @@ def hedge_positions(conn, kx, ticker, cfg, book):
(ticker,)).fetchall()
if not open_orders:
return None
min_profit = cfg.get("min_profit_cents", 8)
min_profit = cfg.get("min_profit_cents", 5) # scalp: lock smaller profits more often
for oid, side, entry_px in open_orders:
opp_side = "yes" if side == "no" else "no"
opp_ask_list = book.get("yes" if opp_side == "yes" else "no")
@@ -726,16 +726,27 @@ def run():
close_ts = datetime.fromisoformat(m["close_time"].replace("Z","+00:00")).timestamp()
mins_left = (close_ts - time.time())/60
if mins_left > 0.5:
# 5-min re-evaluation window
cycle_sec = cfg.get("decision_interval_sec", 300)
now_ts = time.time()
if last_decision_ts and (now_ts - last_decision_ts) < cycle_sec:
continue # wait for next decision window
last_decision_ts = now_ts
# ── ALWAYS watching: hedge check EVERY tick (every 15s) ──
book = kx.orderbook(ticker)
# hedge check: close profitable positions
if hedge_positions(conn, kx, ticker, cfg, book) == "hedged":
continue
# ── micro-swing detector: price moved 0.03%+ in last 60s ──
swing_60s = False
recent = conn.execute(
"SELECT price FROM ticks WHERE ts > ? ORDER BY ts DESC LIMIT 5",
(now_ts - 60,)).fetchall()
if len(recent) >= 4:
hi = max(t[0] for t in recent); lo = min(t[0] for t in recent)
if lo > 0 and (hi - lo) / lo * 100 >= 0.03:
swing_60s = True
# ── 5-min re-evaluation window (skip unless micro-swing) ──
cycle_sec = cfg.get("decision_interval_sec", 300)
if last_decision_ts and (now_ts - last_decision_ts) < cycle_sec and not swing_60s:
continue
last_decision_ts = now_ts
if swing_60s and last_decision_ts:
LOG.info(f"⚡ micro-swing 0.03%+ in 60s on {ticker} — evaluating entry")
mom, lv, lc, lw, final, why = decide(cfg, conn, p)
yes_ask = (book.get("yes") or [[None]])[0][0]
no_ask = (book.get("no") or [[None]])[0][0]
@@ -748,6 +759,12 @@ def run():
if daily_pnl(conn) <= -cfg["daily_loss_cap_cents"]:
log_event(conn, "warning", "daily loss cap hit — sitting out")
continue
# skip-if-positioned: one open position per ticker max
existing = conn.execute(
"SELECT COUNT(*) FROM orders WHERE ticker=? AND status IN ('placed','posted') AND dry=0",
(ticker,)).fetchone()[0]
if existing > 0:
continue # already positioned on this market
try:
verify = kx.req("GET", f"/markets/{ticker}")
vm = verify.get("market", verify) # Kalshi nests under "market"
@@ -789,7 +806,7 @@ def run():
LOG.info(f"skip {ticker}: {why}")
except Exception as e:
log_event(conn, "error", f"loop error: {e}")
time.sleep(20)
time.sleep(15) # scalp loop: watch constantly
if __name__ == "__main__":
run()

BIN
btc.db

Binary file not shown.

BIN
doge.db

Binary file not shown.

BIN
eth.db

Binary file not shown.

BIN
sol.db

Binary file not shown.

BIN
xrp.db

Binary file not shown.