diff --git a/__pycache__/bot.cpython-311.pyc b/__pycache__/bot.cpython-311.pyc index 67f2af9..7533dba 100644 Binary files a/__pycache__/bot.cpython-311.pyc and b/__pycache__/bot.cpython-311.pyc differ diff --git a/bot.log b/bot.log index dbdea08..ff5bd4e 100644 --- a/bot.log +++ b/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 diff --git a/bot.py b/bot.py index be3aa27..2d34c46 100644 --- a/bot.py +++ b/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() diff --git a/btc.db b/btc.db index c6f92c2..984bddf 100644 Binary files a/btc.db and b/btc.db differ diff --git a/doge.db b/doge.db index d216b6c..1a0148f 100644 Binary files a/doge.db and b/doge.db differ diff --git a/eth.db b/eth.db index 42be63c..eee6b9d 100644 Binary files a/eth.db and b/eth.db differ diff --git a/sol.db b/sol.db index e401e13..9503d9f 100644 Binary files a/sol.db and b/sol.db differ diff --git a/xrp.db b/xrp.db index 56213cf..6ba6af5 100644 Binary files a/xrp.db and b/xrp.db differ