diff --git a/__pycache__/bot.cpython-311.pyc b/__pycache__/bot.cpython-311.pyc index 469a446..b076a2e 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 59fe756..1fedd9c 100644 --- a/bot.log +++ b/bot.log @@ -1752,3 +1752,155 @@ sqlite3.OperationalError: no such column: id 2026-08-02 19:23:11,364 skip KXXRP15M-26AUG022230-30: no swing (0.000% < 0.005%) 2026-08-02 19:23:40,530 skip KXBTC15M-26AUG022230-30: no swing (0.000% < 0.005%) 2026-08-02 19:25:31,546 POST YES x1 KXDOGE15M-26AUG022230-30 @ 50¢ — ⚠ RSI 0 extreme oversold → fade UP +2026-08-02 19:26:03,056 POST YES x1 KXSOL15M-26AUG022230-30 @ 50¢ — ⚠ RSI 0 extreme oversold → fade UP +2026-08-02 19:26:13,916 HEDGE KXBTC15M-TEST: no@45¢ + yes@42¢ → locked 13¢ +2026-08-02 19:26:40,081 POST NO x1 KXETH15M-26AUG022230-30 @ 50¢ — DOWN: UP spike 0.05% conf=0.78 [RSI 17 oversold + BTC bearish macro, fade the spike] +2026-08-02 19:27:08,889 POST YES x1 KXDOGE15M-26AUG022230-30 @ 50¢ — ⚠ RSI 0 extreme oversold → fade UP +2026-08-02 19:27:22,410 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ max_spend=100¢ +2026-08-02 19:27:27,546 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ max_spend=100¢ +2026-08-02 19:27:27,546 staggering start by 20s +2026-08-02 19:27:32,423 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ max_spend=100¢ +2026-08-02 19:27:32,423 staggering start by 40s +2026-08-02 19:27:36,308 POST YES x1 KXDOGE15M-26AUG022230-30 @ 50¢ — ⚠ RSI 0 extreme oversold → fade UP +2026-08-02 19:27:37,723 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ max_spend=100¢ +2026-08-02 19:27:37,723 staggering start by 60s +2026-08-02 19:27:42,716 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ max_spend=100¢ +2026-08-02 19:27:42,716 staggering start by 80s +2026-08-02 19:28:00,714 POST YES x1 KXSOL15M-26AUG022230-30 @ 50¢ — ⚠ RSI 0 extreme oversold → fade UP +2026-08-02 19:28:36,825 POST YES x1 KXETH15M-26AUG022230-30 @ 50¢ — ⚠ RSI 6 extreme oversold → fade UP +2026-08-02 19:28:44,817 POST YES x1 KXXRP15M-26AUG022230-30 @ 50¢ — ⚠ RSI 3 extreme oversold → fade UP +2026-08-02 19:29:13,720 POST YES x1 KXBTC15M-26AUG022230-30 @ 50¢ — ⚠ RSI 0 extreme oversold → fade UP +2026-08-02 19:32:41,278 POST YES x1 KXDOGE15M-26AUG022245-45 @ 50¢ — ⚠ RSI 0 extreme oversold → fade UP +2026-08-02 19:33:04,823 skip KXSOL15M-26AUG022245-45: passes: RSI(5m)=32 oversold, trend all negative — no clear fade edge yet +2026-08-02 19:33:33,082 skip KXETH15M-26AUG022245-45: no swing (0.005% < 0.005%) +2026-08-02 19:33:42,876 POST YES x1 KXXRP15M-26AUG022245-45 @ 50¢ — ⚠ RSI 0 extreme oversold → fade UP +2026-08-02 19:34:12,848 POST YES x1 KXBTC15M-26AUG022245-45 @ 50¢ — ⚠ RSI 0 extreme oversold → fade UP +2026-08-02 19:37:39,640 POST YES x1 KXDOGE15M-26AUG022245-45 @ 50¢ — ⚠ RSI 0 extreme oversold → fade UP +2026-08-02 19:38:10,615 skip KXSOL15M-26AUG022245-45: no swing (0.003% < 0.005%) +2026-08-02 19:38:46,022 POST YES x1 KXXRP15M-26AUG022245-45 @ 50¢ — ⚠ RSI 0 extreme oversold → fade UP +2026-08-02 19:38:47,212 POST NO x1 KXETH15M-26AUG022245-45 @ 50¢ — DOWN: DOWN spike 0.01% conf=0.65 [Sharp 1h/2h decline, RSI(5m)=44 neutral, fading short-term w] +2026-08-02 19:39:15,077 POST YES x1 KXBTC15M-26AUG022245-45 @ 50¢ — ⚠ RSI 0 extreme oversold → fade UP +2026-08-02 19:42:49,063 POST YES x1 KXDOGE15M-26AUG022245-45 @ 50¢ — ⚠ RSI 0 extreme oversold → fade UP +2026-08-02 19:43:09,475 skip KXSOL15M-26AUG022245-45: passes: RSI neutral, choppy regime, no clear edge +2026-08-02 19:43:44,491 POST YES x1 KXETH15M-26AUG022245-45 @ 50¢ — ⚠ RSI 0 extreme oversold → fade UP +2026-08-02 19:43:45,014 POST YES x1 KXXRP15M-26AUG022245-45 @ 50¢ — ⚠ RSI 0 extreme oversold → fade UP +2026-08-02 19:44:13,261 POST YES x1 KXBTC15M-26AUG022245-45 @ 50¢ — ⚠ RSI 0 extreme oversold → fade UP +2026-08-02 19:47:51,999 POST NO x1 KXDOGE15M-26AUG022300-00 @ 50¢ — DOWN: UP spike 0.06% conf=0.65 [RSI(5m)=76 overbought, fading sharp UP spike] +2026-08-02 19:48:16,137 skip KXSOL15M-26AUG022300-00: passes: RSI neutral, no clear spike to fade +2026-08-02 19:48:48,144 POST YES x1 KXXRP15M-26AUG022300-00 @ 50¢ — ⚠ RSI 0 extreme oversold → fade UP +2026-08-02 19:49:02,411 POST YES x1 KXETH15M-26AUG022300-00 @ 50¢ — ⚠ RSI 2 extreme oversold → fade UP +2026-08-02 19:49:13,880 POST YES x1 KXBTC15M-26AUG022300-00 @ 50¢ — ⚠ RSI 0 extreme oversold → fade UP +2026-08-02 19:52:31,790 127.0.0.1 - - [02/Aug/2026 19:52:31] "GET /api/state HTTP/1.1" 200 - +2026-08-02 19:52:44,887 127.0.0.1 - - [02/Aug/2026 19:52:44] "GET /fleet HTTP/1.1" 200 - +2026-08-02 19:52:45,024 127.0.0.1 - - [02/Aug/2026 19:52:45] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 19:52:45,026 127.0.0.1 - - [02/Aug/2026 19:52:45] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 19:52:45,530 127.0.0.1 - - [02/Aug/2026 19:52:45] "GET /api/state HTTP/1.1" 200 - +2026-08-02 19:52:45,696 127.0.0.1 - - [02/Aug/2026 19:52:45] "GET /api/state HTTP/1.1" 200 - +2026-08-02 19:52:51,875 POST YES x1 KXDOGE15M-26AUG022300-00 @ 50¢ — ⚠ RSI 12 extreme oversold → fade UP +2026-08-02 19:52:59,901 127.0.0.1 - - [02/Aug/2026 19:52:59] "GET /fleet HTTP/1.1" 200 - +2026-08-02 19:52:59,993 127.0.0.1 - - [02/Aug/2026 19:52:59] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 19:53:00,479 127.0.0.1 - - [02/Aug/2026 19:53:00] "GET /api/state HTTP/1.1" 200 - +2026-08-02 19:53:14,923 127.0.0.1 - - [02/Aug/2026 19:53:14] "GET /fleet HTTP/1.1" 200 - +2026-08-02 19:53:15,106 127.0.0.1 - - [02/Aug/2026 19:53:15] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 19:53:15,649 127.0.0.1 - - [02/Aug/2026 19:53:15] "GET /api/state HTTP/1.1" 200 - +2026-08-02 19:53:20,660 POST NO x1 KXSOL15M-26AUG022300-00 @ 50¢ — DOWN: DOWN spike 0.05% conf=0.65 [RSI(1m)=17 oversold, sharp down trend fading into mean rever] +2026-08-02 19:53:29,962 127.0.0.1 - - [02/Aug/2026 19:53:29] "GET /fleet HTTP/1.1" 200 - +2026-08-02 19:53:30,291 127.0.0.1 - - [02/Aug/2026 19:53:30] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 19:53:30,293 127.0.0.1 - - [02/Aug/2026 19:53:30] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 19:53:30,772 127.0.0.1 - - [02/Aug/2026 19:53:30] "GET /api/state HTTP/1.1" 200 - +2026-08-02 19:53:30,877 127.0.0.1 - - [02/Aug/2026 19:53:30] "GET /api/state HTTP/1.1" 200 - +2026-08-02 19:53:45,003 127.0.0.1 - - [02/Aug/2026 19:53:44] "GET /fleet HTTP/1.1" 200 - +2026-08-02 19:53:45,178 127.0.0.1 - - [02/Aug/2026 19:53:45] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 19:53:45,190 127.0.0.1 - - [02/Aug/2026 19:53:45] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 19:53:45,714 127.0.0.1 - - [02/Aug/2026 19:53:45] "GET /api/state HTTP/1.1" 200 - +2026-08-02 19:53:46,990 POST YES x1 KXXRP15M-26AUG022300-00 @ 50¢ — ⚠ RSI 0 extreme oversold → fade UP +2026-08-02 19:54:00,025 127.0.0.1 - - [02/Aug/2026 19:54:00] "GET /fleet HTTP/1.1" 200 - +2026-08-02 19:54:00,151 127.0.0.1 - - [02/Aug/2026 19:54:00] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 19:54:00,681 127.0.0.1 - - [02/Aug/2026 19:54:00] "GET /api/state HTTP/1.1" 200 - +2026-08-02 19:54:00,960 POST YES x1 KXETH15M-26AUG022300-00 @ 50¢ — ⚠ RSI 1 extreme oversold → fade UP +2026-08-02 19:54:14,045 POST YES x1 KXBTC15M-26AUG022300-00 @ 50¢ — ⚠ RSI 0 extreme oversold → fade UP +2026-08-02 19:54:15,049 127.0.0.1 - - [02/Aug/2026 19:54:15] "GET /fleet HTTP/1.1" 200 - +2026-08-02 19:54:15,171 127.0.0.1 - - [02/Aug/2026 19:54:15] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 19:54:15,176 127.0.0.1 - - [02/Aug/2026 19:54:15] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 19:54:15,676 127.0.0.1 - - [02/Aug/2026 19:54:15] "GET /api/state HTTP/1.1" 200 - +2026-08-02 19:54:30,067 127.0.0.1 - - [02/Aug/2026 19:54:30] "GET /fleet HTTP/1.1" 200 - +2026-08-02 19:54:30,185 127.0.0.1 - - [02/Aug/2026 19:54:30] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 19:54:30,684 127.0.0.1 - - [02/Aug/2026 19:54:30] "GET /api/state HTTP/1.1" 200 - +2026-08-02 19:58:03,216 POST YES x1 KXDOGE15M-26AUG022300-00 @ 50¢ — ⚠ RSI 0 extreme oversold → fade UP +2026-08-02 19:58:22,247 POST NO x1 KXSOL15M-26AUG022300-00 @ 50¢ — DOWN: DOWN spike 0.10% conf=0.65 [RSI 25 oversold, sharp down trend, fade the dip] +2026-08-02 19:58:29,790 127.0.0.1 - - [02/Aug/2026 19:58:29] "GET /api/state HTTP/1.1" 200 - +2026-08-02 19:58:30,141 127.0.0.1 - - [02/Aug/2026 19:58:30] "GET / HTTP/1.1" 200 - +2026-08-02 19:58:30,972 127.0.0.1 - - [02/Aug/2026 19:58:30] "GET /api/state HTTP/1.1" 200 - +2026-08-02 19:58:35,897 127.0.0.1 - - [02/Aug/2026 19:58:35] "GET /api/state HTTP/1.1" 200 - +2026-08-02 19:58:40,749 127.0.0.1 - - [02/Aug/2026 19:58:40] "GET /api/state HTTP/1.1" 200 - +2026-08-02 19:58:45,983 127.0.0.1 - - [02/Aug/2026 19:58:45] "GET /api/state HTTP/1.1" 200 - +2026-08-02 19:58:50,155 skip KXXRP15M-26AUG022300-00: passes: RSI neutral, no clear spike to fade +2026-08-02 19:58:50,837 127.0.0.1 - - [02/Aug/2026 19:58:50] "GET /api/state HTTP/1.1" 200 - +2026-08-02 19:58:54,839 127.0.0.1 - - [02/Aug/2026 19:58:54] "GET / HTTP/1.1" 200 - +2026-08-02 19:58:55,834 127.0.0.1 - - [02/Aug/2026 19:58:55] "GET /api/state HTTP/1.1" 200 - +2026-08-02 19:59:00,536 127.0.0.1 - - [02/Aug/2026 19:59:00] "GET /api/state HTTP/1.1" 200 - +2026-08-02 19:59:05,465 127.0.0.1 - - [02/Aug/2026 19:59:05] "GET /api/state HTTP/1.1" 200 - +2026-08-02 19:59:10,574 127.0.0.1 - - [02/Aug/2026 19:59:10] "GET /api/state HTTP/1.1" 200 - +2026-08-02 19:59:12,476 POST NO x1 KXETH15M-26AUG022300-00 @ 50¢ — DOWN: DOWN spike 0.16% conf=0.65 [RSI oversold + BTC bearish, fade the sharp down move] +2026-08-02 19:59:15,563 127.0.0.1 - - [02/Aug/2026 19:59:15] "GET /api/state HTTP/1.1" 200 - +2026-08-02 19:59:16,460 127.0.0.1 - - [02/Aug/2026 19:59:16] "GET / HTTP/1.1" 200 - +2026-08-02 19:59:17,231 127.0.0.1 - - [02/Aug/2026 19:59:17] "GET /api/state HTTP/1.1" 200 - +2026-08-02 19:59:17,760 127.0.0.1 - - [02/Aug/2026 19:59:17] "GET /fleept HTTP/1.1" 404 - +2026-08-02 19:59:18,167 POST YES x1 KXBTC15M-26AUG022300-00 @ 50¢ — ⚠ RSI 0 extreme oversold → fade UP +2026-08-02 19:59:22,646 127.0.0.1 - - [02/Aug/2026 19:59:22] "GET /fleet HTTP/1.1" 200 - +2026-08-02 19:59:22,961 127.0.0.1 - - [02/Aug/2026 19:59:22] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 19:59:23,399 127.0.0.1 - - [02/Aug/2026 19:59:23] "GET /api/state HTTP/1.1" 200 - +2026-08-02 19:59:23,428 127.0.0.1 - - [02/Aug/2026 19:59:23] "GET /api/fleet/ticks?coin=btc&mins=60 HTTP/1.1" 200 - +2026-08-02 19:59:23,447 127.0.0.1 - - [02/Aug/2026 19:59:23] "GET /api/fleet/ticks?coin=doge&mins=60 HTTP/1.1" 200 - +2026-08-02 19:59:23,457 127.0.0.1 - - [02/Aug/2026 19:59:23] "GET /api/fleet/ticks?coin=eth&mins=60 HTTP/1.1" 200 - +2026-08-02 19:59:23,466 127.0.0.1 - - [02/Aug/2026 19:59:23] "GET /api/fleet/ticks?coin=sol&mins=60 HTTP/1.1" 200 - +2026-08-02 19:59:23,476 127.0.0.1 - - [02/Aug/2026 19:59:23] "GET /api/fleet/ticks?coin=xrp&mins=60 HTTP/1.1" 200 - +2026-08-02 19:59:37,853 127.0.0.1 - - [02/Aug/2026 19:59:37] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 19:59:38,402 127.0.0.1 - - [02/Aug/2026 19:59:38] "GET /api/state HTTP/1.1" 200 - +2026-08-02 19:59:38,425 127.0.0.1 - - [02/Aug/2026 19:59:38] "GET /api/fleet/ticks?coin=btc&mins=60 HTTP/1.1" 200 - +2026-08-02 19:59:38,444 127.0.0.1 - - [02/Aug/2026 19:59:38] "GET /api/fleet/ticks?coin=doge&mins=60 HTTP/1.1" 200 - +2026-08-02 19:59:38,453 127.0.0.1 - - [02/Aug/2026 19:59:38] "GET /api/fleet/ticks?coin=eth&mins=60 HTTP/1.1" 200 - +2026-08-02 19:59:38,464 127.0.0.1 - - [02/Aug/2026 19:59:38] "GET /api/fleet/ticks?coin=sol&mins=60 HTTP/1.1" 200 - +2026-08-02 19:59:38,473 127.0.0.1 - - [02/Aug/2026 19:59:38] "GET /api/fleet/ticks?coin=xrp&mins=60 HTTP/1.1" 200 - +2026-08-02 19:59:52,895 127.0.0.1 - - [02/Aug/2026 19:59:52] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 19:59:53,518 127.0.0.1 - - [02/Aug/2026 19:59:53] "GET /api/state HTTP/1.1" 200 - +2026-08-02 19:59:53,545 127.0.0.1 - - [02/Aug/2026 19:59:53] "GET /api/fleet/ticks?coin=btc&mins=60 HTTP/1.1" 200 - +2026-08-02 19:59:53,561 127.0.0.1 - - [02/Aug/2026 19:59:53] "GET /api/fleet/ticks?coin=doge&mins=60 HTTP/1.1" 200 - +2026-08-02 19:59:53,576 127.0.0.1 - - [02/Aug/2026 19:59:53] "GET /api/fleet/ticks?coin=eth&mins=60 HTTP/1.1" 200 - +2026-08-02 19:59:53,585 127.0.0.1 - - [02/Aug/2026 19:59:53] "GET /api/fleet/ticks?coin=sol&mins=60 HTTP/1.1" 200 - +2026-08-02 19:59:53,596 127.0.0.1 - - [02/Aug/2026 19:59:53] "GET /api/fleet/ticks?coin=xrp&mins=60 HTTP/1.1" 200 - +2026-08-02 20:00:07,883 127.0.0.1 - - [02/Aug/2026 20:00:07] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 20:00:08,384 127.0.0.1 - - [02/Aug/2026 20:00:08] "GET /api/state HTTP/1.1" 200 - +2026-08-02 20:00:08,426 127.0.0.1 - - [02/Aug/2026 20:00:08] "GET /api/fleet/ticks?coin=btc&mins=60 HTTP/1.1" 200 - +2026-08-02 20:00:08,453 127.0.0.1 - - [02/Aug/2026 20:00:08] "GET /api/fleet/ticks?coin=doge&mins=60 HTTP/1.1" 200 - +2026-08-02 20:00:08,471 127.0.0.1 - - [02/Aug/2026 20:00:08] "GET /api/fleet/ticks?coin=eth&mins=60 HTTP/1.1" 200 - +2026-08-02 20:00:08,490 127.0.0.1 - - [02/Aug/2026 20:00:08] "GET /api/fleet/ticks?coin=sol&mins=60 HTTP/1.1" 200 - +2026-08-02 20:00:08,499 127.0.0.1 - - [02/Aug/2026 20:00:08] "GET /api/fleet/ticks?coin=xrp&mins=60 HTTP/1.1" 200 - +2026-08-02 20:00:24,386 127.0.0.1 - - [02/Aug/2026 20:00:24] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 20:00:25,628 127.0.0.1 - - [02/Aug/2026 20:00:25] "GET /api/state HTTP/1.1" 200 - +2026-08-02 20:00:25,694 127.0.0.1 - - [02/Aug/2026 20:00:25] "GET /api/fleet/ticks?coin=btc&mins=60 HTTP/1.1" 200 - +2026-08-02 20:00:25,718 127.0.0.1 - - [02/Aug/2026 20:00:25] "GET /api/fleet/ticks?coin=doge&mins=60 HTTP/1.1" 200 - +2026-08-02 20:00:25,828 127.0.0.1 - - [02/Aug/2026 20:00:25] "GET /api/fleet/ticks?coin=eth&mins=60 HTTP/1.1" 200 - +2026-08-02 20:00:25,843 127.0.0.1 - - [02/Aug/2026 20:00:25] "GET /api/fleet/ticks?coin=sol&mins=60 HTTP/1.1" 200 - +2026-08-02 20:00:25,867 127.0.0.1 - - [02/Aug/2026 20:00:25] "GET /api/fleet/ticks?coin=xrp&mins=60 HTTP/1.1" 200 - +2026-08-02 20:00:32,477 127.0.0.1 - - [02/Aug/2026 20:00:32] "GET /fleet HTTP/1.1" 200 - +2026-08-02 20:03:01,378 POST NO x1 KXDOGE15M-26AUG022315-15 @ 50¢ — DOWN: DOWN spike 0.07% conf=0.65 [RSI(5m)=28 oversold, 15m momentum down] +2026-08-02 20:03:21,785 POST NO x1 KXSOL15M-26AUG022315-15 @ 50¢ — ⚠ RSI 100 extreme overbought → fade DOWN +2026-08-02 20:03:47,237 skip KXXRP15M-26AUG022315-15: passes: Fear regime + choppy market, no clear edge +2026-08-02 20:04:10,746 POST NO x1 KXETH15M-26AUG022315-15 @ 50¢ — DOWN: UP spike 0.02% conf=0.65 [RSI(1m)=73 overbought, fading sharp UP spike] +2026-08-02 20:04:14,890 POST NO x1 KXBTC15M-26AUG022315-15 @ 50¢ — ⚠ RSI 100 extreme overbought → fade DOWN +2026-08-02 20:06:27,737 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ max_spend=100¢ +2026-08-02 20:06:32,449 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ max_spend=100¢ +2026-08-02 20:06:32,449 staggering start by 20s +2026-08-02 20:06:37,430 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ max_spend=100¢ +2026-08-02 20:06:37,431 staggering start by 40s +2026-08-02 20:06:42,382 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ max_spend=100¢ +2026-08-02 20:06:42,383 staggering start by 60s +2026-08-02 20:06:47,862 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ max_spend=100¢ +2026-08-02 20:06:47,864 staggering start by 80s +2026-08-02 20:06:52,051 skip KXDOGE15M-26AUG022315-15: passes: Choppy regime, no clear edge +2026-08-02 20:07:13,661 skip KXSOL15M-26AUG022315-15: passes: RSI neutral, no clear spike to fade +2026-08-02 20:07:54,193 POST NO x1 KXETH15M-26AUG022315-15 @ 50¢ — DOWN: DOWN spike 0.11% conf=0.65 [Sharp 2h downtrend + RSI(35) neutral, fading short-term dip ] +2026-08-02 20:07:54,850 POST YES x1 KXXRP15M-26AUG022315-15 @ 50¢ — ⚠ RSI 4 extreme oversold → fade UP +2026-08-02 20:08:27,463 POST YES x1 KXBTC15M-26AUG022315-15 @ 50¢ — ⚠ RSI 0 extreme oversold → fade UP +2026-08-02 20:10:05,986 127.0.0.1 - - [02/Aug/2026 20:10:05] "GET /api/fleet HTTP/1.1" 200 - diff --git a/bot.py b/bot.py index 29fcf8b..f0a66fe 100644 --- a/bot.py +++ b/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)) diff --git a/btc.db b/btc.db index 1cbd88a..4e3c80c 100644 Binary files a/btc.db and b/btc.db differ diff --git a/dashboard.py b/dashboard.py index 71450c6..44075ad 100644 --- a/dashboard.py +++ b/dashboard.py @@ -169,7 +169,6 @@ refresh();setInterval(refresh,5000); """ FLEET_HTML = r"""K4LSH1 FLEET - -

K4LSH1_FLEET

+

K4LSH1_FLEET

+
""" @@ -390,6 +466,23 @@ def fleet_api(): return jsonify(result) +@app.route("/api/fleet/ticks") +def fleet_ticks(): + """Price tick history for sparkline charts.""" + coin = request.args.get("coin", "doge").lower() + mins = int(request.args.get("mins", 60)) + fpath = HOME / f"{coin}.json" + if not fpath.exists(): return jsonify({"prices": []}) + c = json.loads(fpath.read_text()) + db_path = HOME / c.get("db_path", f"{coin}.db") + if not db_path.exists(): return jsonify({"prices": []}) + conn = sqlite3.connect(str(db_path)) + rows = conn.execute("SELECT ts, price FROM ticks WHERE ts > ? ORDER BY ts", + (time.time() - mins*60,)).fetchall() + conn.close() + return jsonify({"prices": [r[1] for r in rows], "times": [r[0] for r in rows]}) + + @app.route("/fleet") def fleet_page(): return FLEET_HTML diff --git a/doge.db b/doge.db index e1d5721..182c3fd 100644 Binary files a/doge.db and b/doge.db differ diff --git a/eth.db b/eth.db index a6de89a..cb58587 100644 Binary files a/eth.db and b/eth.db differ diff --git a/sol.db b/sol.db index b892fe0..45ee942 100644 Binary files a/sol.db and b/sol.db differ diff --git a/xrp.db b/xrp.db index 9425146..d16307e 100644 Binary files a/xrp.db and b/xrp.db differ