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:
Binary file not shown.
57
bot.log
57
bot.log
@@ -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
33
bot.py
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user