diff --git a/__pycache__/bot.cpython-311.pyc b/__pycache__/bot.cpython-311.pyc index fd81672..67f2af9 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 b5a756d..7f192ab 100644 --- a/bot.log +++ b/bot.log @@ -3912,3 +3912,112 @@ sqlite3.OperationalError: no such column: id 2026-08-03 02:01:31,050 skip KXZEC15M-26AUG030515-15: passes: [SPLIT: 0U/0D/2S] qwen3.5=SKIP | ornith=SKIP 2026-08-03 02:01:33,779 POST YES x1 KXXRP15M-26AUG030515-15 @ 50¢ — ⚠ RSI 0 extreme OS + momentum reversing → fade UP 2026-08-03 02:01:54,510 skip KXBTC15M-26AUG030515-15: passes: [SPLIT: 0U/1D/1S] qwen3.5=SKIP | ornith=DOWN +2026-08-03 02:05:28,789 skip KXDOGE15M-26AUG030515-15: passes: [SPLIT: 0U/0D/2S] qwen3.5=SKIP | ornith=SKIP +2026-08-03 02:05:53,062 skip KXBNB15M-26AUG030515-15: passes: [SPLIT: 0U/1D/1S] qwen3.5=SKIP | ornith=DOWN +2026-08-03 02:05:53,380 POST YES x1 KXSOL15M-26AUG030515-15 @ 50¢ — ⚠ RSI 0 extreme OS + momentum reversing → fade UP +2026-08-03 02:06:06,718 POST YES x1 KXETH15M-26AUG030515-15 @ 50¢ — ⚠ RSI 0 extreme OS + momentum reversing → fade UP +2026-08-03 02:06:10,032 skip KXNEAR15M-26AUG030515-15: passes: [SPLIT: 0U/1D/1S] qwen3.5=SKIP | ornith=DOWN +2026-08-03 02:06:20,653 skip KXZEC15M-26AUG030515-15: passes: [SPLIT: 0U/0D/2S] qwen3.5=SKIP | ornith=SKIP +2026-08-03 02:06:28,351 skip KXXRP15M-26AUG030515-15: passes: [SPLIT: 0U/0D/2S] qwen3.5=SKIP | ornith=SKIP +2026-08-03 02:06:44,811 skip KXBTC15M-26AUG030515-15: passes: [SPLIT: 0U/1D/1S] qwen3.5=SKIP | ornith=DOWN +2026-08-03 02:10:33,718 POST YES x1 KXDOGE15M-26AUG030515-15 @ 50¢ — ⚠ RSI 0 extreme OS + momentum reversing → fade UP +2026-08-03 02:10:57,236 skip KXSOL15M-26AUG030515-15: passes: [SPLIT: 0U/1D/1S] qwen3.5=SKIP | ornith=DOWN +2026-08-03 02:10:57,453 POST YES x1 KXBNB15M-26AUG030515-15 @ 50¢ — ⚠ RSI 0 extreme OS + momentum reversing → fade UP +2026-08-03 02:11:12,723 skip KXNEAR15M-26AUG030515-15: passes: [SPLIT: 0U/1D/1S] qwen3.5=SKIP | ornith=DOWN +2026-08-03 02:11:17,160 skip KXETH15M-26AUG030515-15: passes: [SPLIT: 0U/1D/1S] qwen3.5=SKIP | ornith=DOWN +2026-08-03 02:11:23,393 ⚖ BTC WR=32% → stake $1.00→$0.75 (bets:34) +2026-08-03 02:11:34,883 POST YES x1 KXXRP15M-26AUG030515-15 @ 50¢ — ⚠ RSI 0 extreme OS + momentum reversing → fade UP +2026-08-03 02:11:36,291 POST YES x1 KXZEC15M-26AUG030515-15 @ 50¢ — ⚠ RSI 0 extreme OS + momentum reversing → fade UP +2026-08-03 02:11:55,528 skip KXBTC15M-26AUG030515-15: passes: [SPLIT: 0U/1D/1S] qwen3.5=SKIP | ornith=DOWN +2026-08-03 02:13:31,733 CANCEL stale KXZEC15M-26AUG030515-15 yes@50¢ (mins_left=1.5) +2026-08-03 02:13:31,800 CANCEL stale KXBNB15M-26AUG030515-15 yes@50¢ (mins_left=1.5) +2026-08-03 02:13:32,112 CANCEL stale KXDOGE15M-26AUG030515-15 yes@50¢ (mins_left=1.5) +2026-08-03 02:15:10,799 LOSS KXSOL15M-26AUG030515-15 yes@50¢ → no (-50¢) +2026-08-03 02:15:19,119 LOSS KXSOL15M-26AUG030515-15 yes@50¢ → no (-50¢) +2026-08-03 02:15:26,120 LOSS KXETH15M-26AUG030515-15 yes@50¢ → no (-50¢) +2026-08-03 02:15:31,257 WIN KXXRP15M-26AUG030515-15 yes@50¢ → yes (+50¢) +2026-08-03 02:15:39,605 WIN KXXRP15M-26AUG030515-15 yes@50¢ → yes (+50¢) +2026-08-03 02:15:54,731 skip KXSOL15M-26AUG030530-30: passes: [SPLIT: 0U/1D/1S] qwen3.5=SKIP | ornith=DOWN +2026-08-03 02:16:07,018 skip KXETH15M-26AUG030530-30: passes: [SPLIT: 0U/1D/1S] qwen3.5=SKIP | ornith=DOWN +2026-08-03 02:16:11,470 skip KXNEAR15M-26AUG030530-30: passes: [SPLIT: 0U/1D/1S] qwen3.5=SKIP | ornith=DOWN +2026-08-03 02:16:15,791 skip KXBNB15M-26AUG030530-30: passes: [SPLIT: 0U/1D/1S] qwen3.5=SKIP | ornith=DOWN +2026-08-03 02:16:17,985 POST YES x1 KXDOGE15M-26AUG030530-30 @ 50¢ — ⚠ RSI 0 extreme OS + momentum reversing → fade UP +2026-08-03 02:16:23,214 skip KXZEC15M-26AUG030530-30: passes: [SPLIT: 0U/1D/1S] qwen3.5=SKIP | ornith=DOWN +2026-08-03 02:16:31,987 POST YES x1 KXXRP15M-26AUG030530-30 @ 50¢ — ⚠ RSI 0 extreme OS + momentum reversing → fade UP +2026-08-03 02:16:32,879 127.0.0.1 - - [03/Aug/2026 02:16:32] "GET /api/state HTTP/1.1" 200 - +2026-08-03 02:16:45,288 skip KXBTC15M-26AUG030530-30: passes: [SPLIT: 0U/1D/1S] qwen3.5=SKIP | ornith=DOWN +2026-08-03 02:18:07,566 127.0.0.1 - - [03/Aug/2026 02:18:07] "GET /api/fleet HTTP/1.1" 200 - +2026-08-03 02:18:08,088 127.0.0.1 - - [03/Aug/2026 02:18:08] "GET /api/state HTTP/1.1" 200 - +2026-08-03 02:18:08,112 127.0.0.1 - - [03/Aug/2026 02:18:08] "GET /api/fleet/ticks?coin=bnb&mins=60 HTTP/1.1" 200 - +2026-08-03 02:18:08,146 127.0.0.1 - - [03/Aug/2026 02:18:08] "GET /api/fleet/ticks?coin=btc&mins=60 HTTP/1.1" 200 - +2026-08-03 02:18:08,163 127.0.0.1 - - [03/Aug/2026 02:18:08] "GET /api/fleet/ticks?coin=doge&mins=60 HTTP/1.1" 200 - +2026-08-03 02:18:08,183 127.0.0.1 - - [03/Aug/2026 02:18:08] "GET /api/fleet/ticks?coin=eth&mins=60 HTTP/1.1" 200 - +2026-08-03 02:18:08,198 127.0.0.1 - - [03/Aug/2026 02:18:08] "GET /api/fleet/ticks?coin=near&mins=60 HTTP/1.1" 200 - +2026-08-03 02:18:08,214 127.0.0.1 - - [03/Aug/2026 02:18:08] "GET /api/fleet/ticks?coin=sol&mins=60 HTTP/1.1" 200 - +2026-08-03 02:18:08,237 127.0.0.1 - - [03/Aug/2026 02:18:08] "GET /api/fleet/ticks?coin=xrp&mins=60 HTTP/1.1" 200 - +2026-08-03 02:18:08,251 127.0.0.1 - - [03/Aug/2026 02:18:08] "GET /api/fleet/ticks?coin=zec&mins=60 HTTP/1.1" 200 - +2026-08-03 02:18:22,348 127.0.0.1 - - [03/Aug/2026 02:18:22] "GET /api/fleet HTTP/1.1" 200 - +2026-08-03 02:18:22,848 127.0.0.1 - - [03/Aug/2026 02:18:22] "GET /api/state HTTP/1.1" 200 - +2026-08-03 02:18:22,865 127.0.0.1 - - [03/Aug/2026 02:18:22] "GET /api/fleet/ticks?coin=bnb&mins=60 HTTP/1.1" 200 - +2026-08-03 02:18:22,885 127.0.0.1 - - [03/Aug/2026 02:18:22] "GET /api/fleet/ticks?coin=btc&mins=60 HTTP/1.1" 200 - +2026-08-03 02:18:22,896 127.0.0.1 - - [03/Aug/2026 02:18:22] "GET /api/fleet/ticks?coin=doge&mins=60 HTTP/1.1" 200 - +2026-08-03 02:18:22,905 127.0.0.1 - - [03/Aug/2026 02:18:22] "GET /api/fleet/ticks?coin=eth&mins=60 HTTP/1.1" 200 - +2026-08-03 02:18:22,915 127.0.0.1 - - [03/Aug/2026 02:18:22] "GET /api/fleet/ticks?coin=near&mins=60 HTTP/1.1" 200 - +2026-08-03 02:18:22,925 127.0.0.1 - - [03/Aug/2026 02:18:22] "GET /api/fleet/ticks?coin=sol&mins=60 HTTP/1.1" 200 - +2026-08-03 02:18:22,932 127.0.0.1 - - [03/Aug/2026 02:18:22] "GET /api/fleet/ticks?coin=xrp&mins=60 HTTP/1.1" 200 - +2026-08-03 02:18:22,939 127.0.0.1 - - [03/Aug/2026 02:18:22] "GET /api/fleet/ticks?coin=zec&mins=60 HTTP/1.1" 200 - +2026-08-03 02:18:37,397 127.0.0.1 - - [03/Aug/2026 02:18:37] "GET /api/fleet HTTP/1.1" 200 - +2026-08-03 02:18:37,852 127.0.0.1 - - [03/Aug/2026 02:18:37] "GET /api/state HTTP/1.1" 200 - +2026-08-03 02:18:37,866 127.0.0.1 - - [03/Aug/2026 02:18:37] "GET /api/fleet/ticks?coin=bnb&mins=60 HTTP/1.1" 200 - +2026-08-03 02:18:37,884 127.0.0.1 - - [03/Aug/2026 02:18:37] "GET /api/fleet/ticks?coin=btc&mins=60 HTTP/1.1" 200 - +2026-08-03 02:18:37,899 127.0.0.1 - - [03/Aug/2026 02:18:37] "GET /api/fleet/ticks?coin=doge&mins=60 HTTP/1.1" 200 - +2026-08-03 02:18:37,909 127.0.0.1 - - [03/Aug/2026 02:18:37] "GET /api/fleet/ticks?coin=eth&mins=60 HTTP/1.1" 200 - +2026-08-03 02:18:37,918 127.0.0.1 - - [03/Aug/2026 02:18:37] "GET /api/fleet/ticks?coin=near&mins=60 HTTP/1.1" 200 - +2026-08-03 02:18:37,931 127.0.0.1 - - [03/Aug/2026 02:18:37] "GET /api/fleet/ticks?coin=sol&mins=60 HTTP/1.1" 200 - +2026-08-03 02:18:37,940 127.0.0.1 - - [03/Aug/2026 02:18:37] "GET /api/fleet/ticks?coin=xrp&mins=60 HTTP/1.1" 200 - +2026-08-03 02:18:37,949 127.0.0.1 - - [03/Aug/2026 02:18:37] "GET /api/fleet/ticks?coin=zec&mins=60 HTTP/1.1" 200 - +2026-08-03 02:20:57,785 skip KXSOL15M-26AUG030530-30: passes: [SPLIT: 0U/1D/1S] qwen3.5=SKIP | ornith=DOWN +2026-08-03 02:21:13,762 skip KXBNB15M-26AUG030530-30: passes: [SPLIT: 0U/1D/1S] qwen3.5=SKIP | ornith=DOWN +2026-08-03 02:21:15,893 skip KXNEAR15M-26AUG030530-30: passes: [SPLIT: 0U/1D/1S] qwen3.5=SKIP | ornith=DOWN +2026-08-03 02:21:16,163 POST YES x1 KXDOGE15M-26AUG030530-30 @ 50¢ — ⚠ RSI 0 extreme OS + momentum reversing → fade UP +2026-08-03 02:21:19,530 skip KXETH15M-26AUG030530-30: passes: [SPLIT: 0U/1D/1S] qwen3.5=SKIP | ornith=DOWN +2026-08-03 02:21:23,796 ⚖ BTC WR=32% → stake $1.00→$0.75 (bets:34) +2026-08-03 02:21:34,518 skip KXZEC15M-26AUG030530-30: passes: [SPLIT: 0U/1D/1S] qwen3.5=SKIP | ornith=DOWN +2026-08-03 02:21:36,720 POST YES x1 KXXRP15M-26AUG030530-30 @ 50¢ — ⚠ RSI 0 extreme OS + momentum reversing → fade UP +2026-08-03 02:22:27,354 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ max_spend=100¢ +2026-08-03 02:22:31,344 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ max_spend=100¢ +2026-08-03 02:22:31,344 staggering start by 20s +2026-08-03 02:22:35,364 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ max_spend=100¢ +2026-08-03 02:22:35,364 staggering start by 40s +2026-08-03 02:22:39,400 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ max_spend=100¢ +2026-08-03 02:22:39,400 staggering start by 60s +2026-08-03 02:22:43,698 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ max_spend=100¢ +2026-08-03 02:22:43,699 staggering start by 80s +2026-08-03 02:22:47,702 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ max_spend=100¢ +2026-08-03 02:22:47,702 staggering start by 25s +2026-08-03 02:22:50,948 skip KXDOGE15M-26AUG030530-30: passes: [SPLIT: 0U/1D/1S] qwen3.5=SKIP | ornith=DOWN +2026-08-03 02:22:51,785 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ max_spend=100¢ +2026-08-03 02:22:51,785 staggering start by 30s +2026-08-03 02:22:55,495 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ max_spend=100¢ +2026-08-03 02:22:55,496 staggering start by 35s +2026-08-03 02:23:13,764 skip KXSOL15M-26AUG030530-30: passes: [SPLIT: 0U/1D/1S] qwen3.5=SKIP | ornith=DOWN +2026-08-03 02:23:35,718 skip KXBNB15M-26AUG030530-30: passes: [SPLIT: 0U/1D/1S] qwen3.5=SKIP | ornith=DOWN +2026-08-03 02:23:44,489 skip KXNEAR15M-26AUG030530-30: passes: [SPLIT: 0U/1D/1S] qwen3.5=SKIP | ornith=DOWN +2026-08-03 02:23:46,897 skip KXETH15M-26AUG030530-30: passes: [SPLIT: 0U/1D/1S] qwen3.5=SKIP | ornith=DOWN +2026-08-03 02:24:02,613 skip KXZEC15M-26AUG030530-30: passes: [SPLIT: 0U/1D/1S] qwen3.5=SKIP | ornith=DOWN +2026-08-03 02:24:03,379 skip KXXRP15M-26AUG030530-30: passes: [SPLIT: 0U/1D/1S] qwen3.5=SKIP | ornith=DOWN +2026-08-03 02:24:03,723 ⚖ BTC WR=32% → stake $1.00→$0.75 (bets:34) +2026-08-03 02:24:35,350 skip KXBTC15M-26AUG030530-30: ⚠ RSI 0 extreme OS but 24h -1.0% downtrend — no knife catch +2026-08-03 02:27:51,898 skip KXDOGE15M-26AUG030530-30: ⚠ RSI 0 extreme OS but 24h -1.1% downtrend — no knife catch +2026-08-03 02:28:14,086 skip KXSOL15M-26AUG030530-30: ⚠ RSI 0 extreme OS but 24h -1.2% downtrend — no knife catch +2026-08-03 02:28:30,451 CANCEL stale KXDOGE15M-26AUG030530-30 yes@50¢ (mins_left=1.5) +2026-08-03 02:28:36,106 skip KXBNB15M-26AUG030530-30: passes: [SPLIT: 0U/1D/1S] qwen3.5=SKIP | ornith=DOWN +2026-08-03 02:28:44,469 skip KXNEAR15M-26AUG030530-30: passes: [SPLIT: 0U/1D/1S] qwen3.5=SKIP | ornith=DOWN +2026-08-03 02:28:48,619 skip KXETH15M-26AUG030530-30: passes: [SPLIT: 0U/1D/1S] qwen3.5=SKIP | ornith=DOWN +2026-08-03 02:29:03,203 skip KXZEC15M-26AUG030530-30: passes: [SPLIT: 0U/1D/1S] qwen3.5=SKIP | ornith=DOWN +2026-08-03 02:29:07,002 POST NO x1 KXXRP15M-26AUG030530-30 @ 50¢ — ⚠ RSI 94 extreme OB + momentum reversing → fade DOWN +2026-08-03 02:29:36,384 skip KXBTC15M-26AUG030530-30: passes: [SPLIT: 0U/1D/1S] qwen3.5=SKIP | ornith=DOWN +2026-08-03 02:30:06,860 WIN KXXRP15M-26AUG030530-30 yes@50¢ → yes (+50¢) +2026-08-03 02:30:15,212 WIN KXXRP15M-26AUG030530-30 yes@50¢ → yes (+50¢) +2026-08-03 02:30:17,969 WIN KXDOGE15M-26AUG030530-30 yes@50¢ → yes (+50¢) +2026-08-03 02:30:23,542 LOSS KXXRP15M-26AUG030530-30 no@50¢ → yes (-50¢) diff --git a/bot.py b/bot.py index 4cd3797..82abec1 100644 --- a/bot.py +++ b/bot.py @@ -385,14 +385,20 @@ def decide(cfg, conn, price): if mode == "DOWN_SPAM": return mom, lv, lc, lw, "DOWN", "spam-mode short" if mode == "UP_SPAM": return mom, lv, lc, lw, "UP", "spam-mode long" - # ── RSI contrarian: only on TRUE extremes + reversal confirmation ── + # ── RSI contrarian: only on TRUE extremes + trend alignment ── r = rsi(conn) + ix_pre = intel(cfg.get("coin","BTC")) + chg24 = ix_pre.get("chg24", 0) if r is not None: - # Require BOTH extreme RSI AND momentum already reversing + # Fade DOWN only when: extreme OB + momentum reversing + not deep downtrend if r > 92 and mom == "DOWN" and mom_score > 0.01: return mom, lv, lc, lw, "DOWN", f"⚠ RSI {r:.0f} extreme OB + momentum reversing → fade DOWN" - if r < 8 and mom == "UP" and mom_score > 0.01: + # Fade UP only when: extreme OS + momentum reversing + NOT in deep downtrend (don't catch falling knives) + if r < 8 and mom == "UP" and mom_score > 0.01 and chg24 > -0.5: return mom, lv, lc, lw, "UP", f"⚠ RSI {r:.0f} extreme OS + momentum reversing → fade UP" + # RSI extreme in downtrend → SKIP, don't catch the knife + if r < 8 and chg24 <= -0.5: + return mom, lv, lc, lw, "SKIP", f"⚠ RSI {r:.0f} extreme OS but 24h {chg24:.1f}% downtrend — no knife catch" # ── swing threshold gate ── thr = cfg.get("swing_threshold_pct", 0.005) @@ -401,7 +407,7 @@ def decide(cfg, conn, price): if lv not in ("UP", "DOWN"): return mom, lv, lc, lw, "SKIP", f"passes: {lw}" - # ── BTC macro correlation: don't fight the trend ── + # ── BTC macro correlation: don't fight the trend (both directions) ── coin = cfg.get("coin","BTC") ix = intel(coin) btc_chg = ix.get("chg24", 0) diff --git a/btc.db b/btc.db index 38a9ca5..ca68f86 100644 Binary files a/btc.db and b/btc.db differ diff --git a/doge.db b/doge.db index a168fdf..74065e9 100644 Binary files a/doge.db and b/doge.db differ diff --git a/eth.db b/eth.db index 874a93c..2d84215 100644 Binary files a/eth.db and b/eth.db differ diff --git a/sol.db b/sol.db index 78e9ba2..b87ebcf 100644 Binary files a/sol.db and b/sol.db differ diff --git a/xrp.db b/xrp.db index 17e9e52..3aeb37b 100644 Binary files a/xrp.db and b/xrp.db differ