commit c14bb98f7fa4411bb28bfee1f52ff7b4e5905206 Author: drjones Date: Sun Aug 2 19:10:27 2026 -0700 K4LSH1_OPS: multi-coin LLM bot — DOGE/SOL/ETH, two-tier qwen+ornith, self-adapting diff --git a/__pycache__/bot.cpython-311.pyc b/__pycache__/bot.cpython-311.pyc new file mode 100644 index 0000000..00cfc59 Binary files /dev/null and b/__pycache__/bot.cpython-311.pyc differ diff --git a/__pycache__/bot.cpython-314.pyc b/__pycache__/bot.cpython-314.pyc new file mode 100644 index 0000000..8552085 Binary files /dev/null and b/__pycache__/bot.cpython-314.pyc differ diff --git a/__pycache__/dashboard.cpython-311.pyc b/__pycache__/dashboard.cpython-311.pyc new file mode 100644 index 0000000..3aeae02 Binary files /dev/null and b/__pycache__/dashboard.cpython-311.pyc differ diff --git a/bot.lock b/bot.lock new file mode 100644 index 0000000..e69de29 diff --git a/bot.log b/bot.log new file mode 100644 index 0000000..85d036c --- /dev/null +++ b/bot.log @@ -0,0 +1,1716 @@ +2026-08-01 21:28:28,778 K4LSH1_OPS online — mode=AUTO dry_run=True stake=50¢ +2026-08-01 21:28:43,182 ollama vote failed: Expecting value: line 1 column 1 (char 0) +2026-08-01 21:28:43,289 skip KXBTC15M-26AUG020030-30: mom=FLAT llm=SKIP +2026-08-01 21:31:06,263 ollama vote failed: Expecting value: line 1 column 1 (char 0) +2026-08-01 21:31:06,365 skip KXBTC15M-26AUG020045-45: mom=FLAT llm=SKIP +2026-08-01 21:32:22,951 K4LSH1_OPS online — mode=AUTO dry_run=True stake=50¢ +2026-08-01 21:32:27,370 skip KXBTC15M-26AUG020045-45: mom=FLAT llm=SKIP +2026-08-01 21:32:48,554 127.0.0.1 - - [01/Aug/2026 21:32:48] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:35:07,483 K4LSH1_OPS online — mode=AUTO dry_run=True stake=50¢ +2026-08-01 21:35:11,460 skip KXBTC15M-26AUG020045-45: mom=FLAT llm=SKIP +2026-08-01 21:35:45,702 127.0.0.1 - - [01/Aug/2026 21:35:45] "POST /api/control HTTP/1.1" 200 - +2026-08-01 21:35:46,925 K4LSH1_OPS online — mode=DOWN_SPAM dry_run=True stake=45¢ +2026-08-01 21:35:50,882 [SIM] MAKER-POST NO KXBTC15M-26AUG020045-45 @ 45¢ — spam-mode short +2026-08-01 21:36:35,412 127.0.0.1 - - [01/Aug/2026 21:36:35] "POST /api/control HTTP/1.1" 200 - +2026-08-01 21:36:36,636 K4LSH1_OPS online — mode=AUTO dry_run=True stake=50¢ +2026-08-01 21:36:39,490 skip KXBTC15M-26AUG020045-45: mom=FLAT llm=SKIP +2026-08-01 21:36:51,971 127.0.0.1 - - [01/Aug/2026 21:36:51] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:37:51,322 127.0.0.1 - - [01/Aug/2026 21:37:51] "GET / HTTP/1.1" 200 - +2026-08-01 21:37:51,475 127.0.0.1 - - [01/Aug/2026 21:37:51] "GET /favicon.ico HTTP/1.1" 404 - +2026-08-01 21:37:51,931 127.0.0.1 - - [01/Aug/2026 21:37:51] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:37:56,802 127.0.0.1 - - [01/Aug/2026 21:37:56] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:38:01,781 127.0.0.1 - - [01/Aug/2026 21:38:01] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:38:06,979 127.0.0.1 - - [01/Aug/2026 21:38:06] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:38:11,858 127.0.0.1 - - [01/Aug/2026 21:38:11] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:38:16,859 127.0.0.1 - - [01/Aug/2026 21:38:16] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:38:21,861 127.0.0.1 - - [01/Aug/2026 21:38:21] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:38:26,861 127.0.0.1 - - [01/Aug/2026 21:38:26] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:38:31,775 127.0.0.1 - - [01/Aug/2026 21:38:31] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:38:36,887 127.0.0.1 - - [01/Aug/2026 21:38:36] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:38:41,957 127.0.0.1 - - [01/Aug/2026 21:38:41] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:38:46,751 127.0.0.1 - - [01/Aug/2026 21:38:46] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:38:51,850 127.0.0.1 - - [01/Aug/2026 21:38:51] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:38:56,742 127.0.0.1 - - [01/Aug/2026 21:38:56] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:39:01,740 127.0.0.1 - - [01/Aug/2026 21:39:01] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:39:06,809 127.0.0.1 - - [01/Aug/2026 21:39:06] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:39:11,751 127.0.0.1 - - [01/Aug/2026 21:39:11] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:39:17,389 127.0.0.1 - - [01/Aug/2026 21:39:17] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:39:21,827 127.0.0.1 - - [01/Aug/2026 21:39:21] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:39:27,040 127.0.0.1 - - [01/Aug/2026 21:39:27] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:39:31,777 127.0.0.1 - - [01/Aug/2026 21:39:31] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:39:37,052 127.0.0.1 - - [01/Aug/2026 21:39:37] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:39:41,781 127.0.0.1 - - [01/Aug/2026 21:39:41] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:39:46,761 127.0.0.1 - - [01/Aug/2026 21:39:46] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:39:51,853 127.0.0.1 - - [01/Aug/2026 21:39:51] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:39:56,761 127.0.0.1 - - [01/Aug/2026 21:39:56] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:41:02,240 K4LSH1_OPS online — mode=AUTO dry_run=True stake=50¢ +2026-08-01 21:41:06,530 skip KXBTC15M-26AUG020045-45: mom=FLAT llm=SKIP +2026-08-01 21:41:07,056 127.0.0.1 - - [01/Aug/2026 21:41:07] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:41:11,883 127.0.0.1 - - [01/Aug/2026 21:41:11] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:41:16,773 127.0.0.1 - - [01/Aug/2026 21:41:16] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:41:21,925 127.0.0.1 - - [01/Aug/2026 21:41:21] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:41:26,934 127.0.0.1 - - [01/Aug/2026 21:41:26] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:41:31,967 127.0.0.1 - - [01/Aug/2026 21:41:31] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:41:36,896 127.0.0.1 - - [01/Aug/2026 21:41:36] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:41:41,793 127.0.0.1 - - [01/Aug/2026 21:41:41] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:41:46,760 127.0.0.1 - - [01/Aug/2026 21:41:46] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:41:51,826 127.0.0.1 - - [01/Aug/2026 21:41:51] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:41:56,747 127.0.0.1 - - [01/Aug/2026 21:41:56] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:42:17,349 127.0.0.1 - - [01/Aug/2026 21:42:17] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:42:30,045 127.0.0.1 - - [01/Aug/2026 21:42:30] "GET / HTTP/1.1" 200 - +2026-08-01 21:43:03,948 127.0.0.1 - - [01/Aug/2026 21:43:03] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:43:08,987 127.0.0.1 - - [01/Aug/2026 21:43:08] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:43:14,528 127.0.0.1 - - [01/Aug/2026 21:43:14] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:43:43,420 127.0.0.1 - - [01/Aug/2026 21:43:43] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:43:48,349 127.0.0.1 - - [01/Aug/2026 21:43:48] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:43:53,497 127.0.0.1 - - [01/Aug/2026 21:43:53] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:43:58,528 127.0.0.1 - - [01/Aug/2026 21:43:58] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:44:03,341 127.0.0.1 - - [01/Aug/2026 21:44:03] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:44:06,563 127.0.0.1 - - [01/Aug/2026 21:44:06] "GET / HTTP/1.1" 200 - +2026-08-01 21:44:07,047 127.0.0.1 - - [01/Aug/2026 21:44:07] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:44:12,082 127.0.0.1 - - [01/Aug/2026 21:44:12] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:44:17,085 127.0.0.1 - - [01/Aug/2026 21:44:17] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:44:22,041 127.0.0.1 - - [01/Aug/2026 21:44:22] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:44:27,089 127.0.0.1 - - [01/Aug/2026 21:44:27] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:44:29,743 127.0.0.1 - - [01/Aug/2026 21:44:29] "POST /api/control HTTP/1.1" 200 - +2026-08-01 21:44:30,399 127.0.0.1 - - [01/Aug/2026 21:44:30] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:44:30,590 127.0.0.1 - - [01/Aug/2026 21:44:30] "POST /api/toggle-dry HTTP/1.1" 200 - +2026-08-01 21:44:31,004 127.0.0.1 - - [01/Aug/2026 21:44:31] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:44:32,058 127.0.0.1 - - [01/Aug/2026 21:44:32] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:44:36,984 127.0.0.1 - - [01/Aug/2026 21:44:36] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:44:42,006 127.0.0.1 - - [01/Aug/2026 21:44:42] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:44:47,063 127.0.0.1 - - [01/Aug/2026 21:44:47] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:44:52,003 127.0.0.1 - - [01/Aug/2026 21:44:52] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:44:57,086 127.0.0.1 - - [01/Aug/2026 21:44:57] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:45:02,147 127.0.0.1 - - [01/Aug/2026 21:45:02] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:45:06,982 127.0.0.1 - - [01/Aug/2026 21:45:06] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:45:11,984 127.0.0.1 - - [01/Aug/2026 21:45:11] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:45:17,097 127.0.0.1 - - [01/Aug/2026 21:45:17] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:45:21,970 127.0.0.1 - - [01/Aug/2026 21:45:21] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:45:27,128 127.0.0.1 - - [01/Aug/2026 21:45:27] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:45:32,133 127.0.0.1 - - [01/Aug/2026 21:45:32] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:45:37,426 127.0.0.1 - - [01/Aug/2026 21:45:37] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:45:38,730 skip KXBTC15M-26AUG020100-00: mom=FLAT llm=SKIP +2026-08-01 21:45:40,622 skip KXBTC15M-26AUG020100-00: mom=FLAT llm=SKIP +2026-08-01 21:45:42,061 127.0.0.1 - - [01/Aug/2026 21:45:42] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:45:42,761 skip KXBTC15M-26AUG020100-00: mom=FLAT llm=SKIP +2026-08-01 21:45:45,645 skip KXBTC15M-26AUG020100-00: mom=FLAT llm=SKIP +2026-08-01 21:45:47,190 127.0.0.1 - - [01/Aug/2026 21:45:47] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:45:50,253 skip KXBTC15M-26AUG020100-00: mom=FLAT llm=SKIP +2026-08-01 21:45:52,028 127.0.0.1 - - [01/Aug/2026 21:45:52] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:45:57,021 127.0.0.1 - - [01/Aug/2026 21:45:57] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:46:02,080 127.0.0.1 - - [01/Aug/2026 21:46:02] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:46:07,005 127.0.0.1 - - [01/Aug/2026 21:46:07] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:46:12,100 127.0.0.1 - - [01/Aug/2026 21:46:12] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:46:17,248 127.0.0.1 - - [01/Aug/2026 21:46:17] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:46:21,988 127.0.0.1 - - [01/Aug/2026 21:46:21] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:46:27,004 127.0.0.1 - - [01/Aug/2026 21:46:27] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:46:32,064 127.0.0.1 - - [01/Aug/2026 21:46:32] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:46:37,131 127.0.0.1 - - [01/Aug/2026 21:46:37] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:46:42,007 127.0.0.1 - - [01/Aug/2026 21:46:42] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:46:47,120 127.0.0.1 - - [01/Aug/2026 21:46:47] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:46:52,231 127.0.0.1 - - [01/Aug/2026 21:46:52] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:46:57,149 127.0.0.1 - - [01/Aug/2026 21:46:57] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:47:02,105 127.0.0.1 - - [01/Aug/2026 21:47:02] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:47:07,010 127.0.0.1 - - [01/Aug/2026 21:47:07] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:47:12,002 127.0.0.1 - - [01/Aug/2026 21:47:12] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:47:17,094 127.0.0.1 - - [01/Aug/2026 21:47:17] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:47:21,980 127.0.0.1 - - [01/Aug/2026 21:47:21] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:47:26,997 127.0.0.1 - - [01/Aug/2026 21:47:26] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:47:32,078 127.0.0.1 - - [01/Aug/2026 21:47:32] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:47:37,006 127.0.0.1 - - [01/Aug/2026 21:47:37] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:47:41,989 127.0.0.1 - - [01/Aug/2026 21:47:41] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:47:47,120 127.0.0.1 - - [01/Aug/2026 21:47:47] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:47:52,010 127.0.0.1 - - [01/Aug/2026 21:47:52] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:47:57,043 127.0.0.1 - - [01/Aug/2026 21:47:57] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:48:02,135 127.0.0.1 - - [01/Aug/2026 21:48:02] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:48:07,106 127.0.0.1 - - [01/Aug/2026 21:48:07] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:48:12,002 127.0.0.1 - - [01/Aug/2026 21:48:12] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:48:17,190 127.0.0.1 - - [01/Aug/2026 21:48:17] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:48:22,032 127.0.0.1 - - [01/Aug/2026 21:48:22] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:48:27,013 127.0.0.1 - - [01/Aug/2026 21:48:27] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:48:32,126 127.0.0.1 - - [01/Aug/2026 21:48:32] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:48:37,012 127.0.0.1 - - [01/Aug/2026 21:48:37] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:48:42,046 127.0.0.1 - - [01/Aug/2026 21:48:42] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:48:47,074 127.0.0.1 - - [01/Aug/2026 21:48:47] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:48:52,120 127.0.0.1 - - [01/Aug/2026 21:48:52] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:48:57,029 127.0.0.1 - - [01/Aug/2026 21:48:57] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:49:02,098 127.0.0.1 - - [01/Aug/2026 21:49:02] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:49:06,994 127.0.0.1 - - [01/Aug/2026 21:49:06] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:49:12,056 127.0.0.1 - - [01/Aug/2026 21:49:12] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:49:17,081 127.0.0.1 - - [01/Aug/2026 21:49:17] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:49:22,102 127.0.0.1 - - [01/Aug/2026 21:49:22] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:49:27,027 127.0.0.1 - - [01/Aug/2026 21:49:27] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:49:32,107 127.0.0.1 - - [01/Aug/2026 21:49:32] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:49:37,249 127.0.0.1 - - [01/Aug/2026 21:49:37] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:49:42,117 127.0.0.1 - - [01/Aug/2026 21:49:42] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:49:47,160 127.0.0.1 - - [01/Aug/2026 21:49:47] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:49:52,084 127.0.0.1 - - [01/Aug/2026 21:49:52] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:49:57,097 127.0.0.1 - - [01/Aug/2026 21:49:57] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:50:02,094 127.0.0.1 - - [01/Aug/2026 21:50:02] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:50:07,054 127.0.0.1 - - [01/Aug/2026 21:50:07] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:50:12,035 127.0.0.1 - - [01/Aug/2026 21:50:12] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:50:17,102 127.0.0.1 - - [01/Aug/2026 21:50:17] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:50:22,031 127.0.0.1 - - [01/Aug/2026 21:50:22] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:50:27,117 127.0.0.1 - - [01/Aug/2026 21:50:27] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:50:32,191 127.0.0.1 - - [01/Aug/2026 21:50:32] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:50:37,024 127.0.0.1 - - [01/Aug/2026 21:50:37] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:50:42,051 127.0.0.1 - - [01/Aug/2026 21:50:42] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:50:47,303 127.0.0.1 - - [01/Aug/2026 21:50:47] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:50:52,096 127.0.0.1 - - [01/Aug/2026 21:50:52] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:50:57,029 127.0.0.1 - - [01/Aug/2026 21:50:57] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:51:02,703 127.0.0.1 - - [01/Aug/2026 21:51:02] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:51:07,022 127.0.0.1 - - [01/Aug/2026 21:51:07] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:51:12,019 127.0.0.1 - - [01/Aug/2026 21:51:12] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:51:17,212 127.0.0.1 - - [01/Aug/2026 21:51:17] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:51:22,027 127.0.0.1 - - [01/Aug/2026 21:51:22] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:51:27,020 127.0.0.1 - - [01/Aug/2026 21:51:27] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:51:32,080 127.0.0.1 - - [01/Aug/2026 21:51:32] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:51:37,028 127.0.0.1 - - [01/Aug/2026 21:51:37] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:51:42,116 127.0.0.1 - - [01/Aug/2026 21:51:42] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:51:47,085 127.0.0.1 - - [01/Aug/2026 21:51:47] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:51:52,071 127.0.0.1 - - [01/Aug/2026 21:51:52] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:51:57,245 127.0.0.1 - - [01/Aug/2026 21:51:57] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:52:02,107 127.0.0.1 - - [01/Aug/2026 21:52:02] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:52:07,014 127.0.0.1 - - [01/Aug/2026 21:52:07] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:52:12,192 127.0.0.1 - - [01/Aug/2026 21:52:12] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:52:17,127 127.0.0.1 - - [01/Aug/2026 21:52:17] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:52:22,061 127.0.0.1 - - [01/Aug/2026 21:52:22] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:52:27,134 127.0.0.1 - - [01/Aug/2026 21:52:27] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:52:32,146 127.0.0.1 - - [01/Aug/2026 21:52:32] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:52:37,025 127.0.0.1 - - [01/Aug/2026 21:52:37] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:52:42,128 127.0.0.1 - - [01/Aug/2026 21:52:42] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:52:47,389 127.0.0.1 - - [01/Aug/2026 21:52:47] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:52:52,030 127.0.0.1 - - [01/Aug/2026 21:52:52] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:52:57,026 127.0.0.1 - - [01/Aug/2026 21:52:57] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:53:02,148 127.0.0.1 - - [01/Aug/2026 21:53:02] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:53:07,010 127.0.0.1 - - [01/Aug/2026 21:53:07] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:53:12,044 127.0.0.1 - - [01/Aug/2026 21:53:12] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:53:17,118 127.0.0.1 - - [01/Aug/2026 21:53:17] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:53:22,218 127.0.0.1 - - [01/Aug/2026 21:53:22] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:53:27,046 127.0.0.1 - - [01/Aug/2026 21:53:27] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:53:32,265 127.0.0.1 - - [01/Aug/2026 21:53:32] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:53:37,191 127.0.0.1 - - [01/Aug/2026 21:53:37] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:53:42,031 127.0.0.1 - - [01/Aug/2026 21:53:42] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:53:47,089 127.0.0.1 - - [01/Aug/2026 21:53:47] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:53:52,360 127.0.0.1 - - [01/Aug/2026 21:53:52] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:53:57,042 127.0.0.1 - - [01/Aug/2026 21:53:57] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:54:02,416 127.0.0.1 - - [01/Aug/2026 21:54:02] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:54:07,052 127.0.0.1 - - [01/Aug/2026 21:54:07] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:54:12,047 127.0.0.1 - - [01/Aug/2026 21:54:12] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:54:17,120 127.0.0.1 - - [01/Aug/2026 21:54:17] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:54:22,054 127.0.0.1 - - [01/Aug/2026 21:54:22] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:54:27,053 127.0.0.1 - - [01/Aug/2026 21:54:27] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:54:32,222 127.0.0.1 - - [01/Aug/2026 21:54:32] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:54:38,048 127.0.0.1 - - [01/Aug/2026 21:54:38] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:54:42,080 127.0.0.1 - - [01/Aug/2026 21:54:42] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:54:47,161 127.0.0.1 - - [01/Aug/2026 21:54:47] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:54:52,057 127.0.0.1 - - [01/Aug/2026 21:54:52] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:54:57,060 127.0.0.1 - - [01/Aug/2026 21:54:57] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:55:02,238 127.0.0.1 - - [01/Aug/2026 21:55:02] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:55:07,161 127.0.0.1 - - [01/Aug/2026 21:55:07] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:55:12,081 127.0.0.1 - - [01/Aug/2026 21:55:12] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:55:17,122 127.0.0.1 - - [01/Aug/2026 21:55:17] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:55:22,061 127.0.0.1 - - [01/Aug/2026 21:55:22] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:55:27,083 127.0.0.1 - - [01/Aug/2026 21:55:27] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:55:32,271 127.0.0.1 - - [01/Aug/2026 21:55:32] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:55:37,057 127.0.0.1 - - [01/Aug/2026 21:55:37] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:55:42,208 127.0.0.1 - - [01/Aug/2026 21:55:42] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:55:47,452 127.0.0.1 - - [01/Aug/2026 21:55:47] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:55:52,059 127.0.0.1 - - [01/Aug/2026 21:55:52] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:55:57,064 127.0.0.1 - - [01/Aug/2026 21:55:57] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:56:02,098 127.0.0.1 - - [01/Aug/2026 21:56:02] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:56:07,364 127.0.0.1 - - [01/Aug/2026 21:56:07] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:56:12,089 127.0.0.1 - - [01/Aug/2026 21:56:12] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:56:17,432 127.0.0.1 - - [01/Aug/2026 21:56:17] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:56:22,190 127.0.0.1 - - [01/Aug/2026 21:56:22] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:56:27,200 127.0.0.1 - - [01/Aug/2026 21:56:27] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:56:32,935 127.0.0.1 - - [01/Aug/2026 21:56:32] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:56:38,162 127.0.0.1 - - [01/Aug/2026 21:56:38] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:56:42,108 127.0.0.1 - - [01/Aug/2026 21:56:42] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:56:47,188 127.0.0.1 - - [01/Aug/2026 21:56:47] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:56:52,181 127.0.0.1 - - [01/Aug/2026 21:56:52] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:56:57,249 127.0.0.1 - - [01/Aug/2026 21:56:57] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:57:02,224 127.0.0.1 - - [01/Aug/2026 21:57:02] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:57:07,122 127.0.0.1 - - [01/Aug/2026 21:57:07] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:57:12,190 127.0.0.1 - - [01/Aug/2026 21:57:12] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:57:17,102 127.0.0.1 - - [01/Aug/2026 21:57:17] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:57:22,617 127.0.0.1 - - [01/Aug/2026 21:57:22] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:57:27,363 127.0.0.1 - - [01/Aug/2026 21:57:27] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:57:32,098 127.0.0.1 - - [01/Aug/2026 21:57:32] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:57:37,218 127.0.0.1 - - [01/Aug/2026 21:57:37] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:57:42,413 127.0.0.1 - - [01/Aug/2026 21:57:42] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:57:47,222 127.0.0.1 - - [01/Aug/2026 21:57:47] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:57:53,188 127.0.0.1 - - [01/Aug/2026 21:57:53] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:57:57,391 127.0.0.1 - - [01/Aug/2026 21:57:57] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:58:02,415 127.0.0.1 - - [01/Aug/2026 21:58:02] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:58:07,235 127.0.0.1 - - [01/Aug/2026 21:58:07] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:58:12,802 127.0.0.1 - - [01/Aug/2026 21:58:12] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:58:17,245 127.0.0.1 - - [01/Aug/2026 21:58:17] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:58:22,459 127.0.0.1 - - [01/Aug/2026 21:58:22] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:58:27,124 127.0.0.1 - - [01/Aug/2026 21:58:27] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:58:32,229 127.0.0.1 - - [01/Aug/2026 21:58:32] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:58:37,255 127.0.0.1 - - [01/Aug/2026 21:58:37] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:58:42,163 127.0.0.1 - - [01/Aug/2026 21:58:42] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:58:47,533 127.0.0.1 - - [01/Aug/2026 21:58:47] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:58:52,229 127.0.0.1 - - [01/Aug/2026 21:58:52] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:58:57,211 127.0.0.1 - - [01/Aug/2026 21:58:57] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:59:02,219 127.0.0.1 - - [01/Aug/2026 21:59:02] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:59:07,226 127.0.0.1 - - [01/Aug/2026 21:59:07] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:59:12,194 127.0.0.1 - - [01/Aug/2026 21:59:12] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:59:17,331 127.0.0.1 - - [01/Aug/2026 21:59:17] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:59:22,207 127.0.0.1 - - [01/Aug/2026 21:59:22] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:59:28,127 127.0.0.1 - - [01/Aug/2026 21:59:28] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:59:32,135 127.0.0.1 - - [01/Aug/2026 21:59:32] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:59:37,330 127.0.0.1 - - [01/Aug/2026 21:59:37] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:59:42,147 127.0.0.1 - - [01/Aug/2026 21:59:42] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:59:47,153 127.0.0.1 - - [01/Aug/2026 21:59:47] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:59:52,236 127.0.0.1 - - [01/Aug/2026 21:59:52] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:59:57,175 127.0.0.1 - - [01/Aug/2026 21:59:57] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:00:02,267 127.0.0.1 - - [01/Aug/2026 22:00:02] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:00:07,619 127.0.0.1 - - [01/Aug/2026 22:00:07] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:00:13,290 127.0.0.1 - - [01/Aug/2026 22:00:13] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:00:18,114 127.0.0.1 - - [01/Aug/2026 22:00:18] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:00:22,255 127.0.0.1 - - [01/Aug/2026 22:00:22] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:00:27,931 127.0.0.1 - - [01/Aug/2026 22:00:27] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:00:32,311 127.0.0.1 - - [01/Aug/2026 22:00:32] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:00:37,571 127.0.0.1 - - [01/Aug/2026 22:00:37] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:00:42,884 127.0.0.1 - - [01/Aug/2026 22:00:42] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:00:43,621 skip KXBTC15M-26AUG020115-15: mom=UP llm=SKIP +2026-08-01 22:00:46,431 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-01 22:00:47,155 127.0.0.1 - - [01/Aug/2026 22:00:47] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:00:48,836 skip KXBTC15M-26AUG020115-15: ask None¢ > stake cap 20¢ +2026-08-01 22:00:52,276 127.0.0.1 - - [01/Aug/2026 22:00:52] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:00:56,705 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-01 22:00:57,201 127.0.0.1 - - [01/Aug/2026 22:00:57] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:00:58,206 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-01 22:01:02,418 127.0.0.1 - - [01/Aug/2026 22:01:02] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:01:07,469 127.0.0.1 - - [01/Aug/2026 22:01:07] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:01:07,999 skip KXBTC15M-26AUG020115-15: mom=UP llm=SKIP +2026-08-01 22:01:11,843 skip KXBTC15M-26AUG020115-15: ask None¢ > stake cap 20¢ +2026-08-01 22:01:13,189 127.0.0.1 - - [01/Aug/2026 22:01:13] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:01:17,228 127.0.0.1 - - [01/Aug/2026 22:01:17] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:01:22,283 127.0.0.1 - - [01/Aug/2026 22:01:22] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:01:24,692 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-01 22:01:26,687 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-01 22:01:27,272 127.0.0.1 - - [01/Aug/2026 22:01:27] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:01:32,527 127.0.0.1 - - [01/Aug/2026 22:01:32] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:01:35,077 skip KXBTC15M-26AUG020115-15: mom=UP llm=SKIP +2026-08-01 22:01:37,360 127.0.0.1 - - [01/Aug/2026 22:01:37] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:01:42,730 127.0.0.1 - - [01/Aug/2026 22:01:42] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:01:47,298 127.0.0.1 - - [01/Aug/2026 22:01:47] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:01:52,285 127.0.0.1 - - [01/Aug/2026 22:01:52] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:01:52,938 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-01 22:01:54,595 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-01 22:01:57,419 127.0.0.1 - - [01/Aug/2026 22:01:57] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:02:02,182 127.0.0.1 - - [01/Aug/2026 22:02:02] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:02:07,471 127.0.0.1 - - [01/Aug/2026 22:02:07] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:02:12,264 127.0.0.1 - - [01/Aug/2026 22:02:12] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:02:16,143 skip KXBTC15M-26AUG020115-15: mom=UP llm=SKIP +2026-08-01 22:02:17,440 127.0.0.1 - - [01/Aug/2026 22:02:17] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:02:22,365 127.0.0.1 - - [01/Aug/2026 22:02:22] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:02:23,023 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-01 22:02:27,318 127.0.0.1 - - [01/Aug/2026 22:02:27] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:02:32,209 127.0.0.1 - - [01/Aug/2026 22:02:32] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:02:37,238 127.0.0.1 - - [01/Aug/2026 22:02:37] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:02:42,723 127.0.0.1 - - [01/Aug/2026 22:02:42] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:02:46,485 skip KXBTC15M-26AUG020115-15: mom=FLAT llm=SKIP +2026-08-01 22:02:47,284 127.0.0.1 - - [01/Aug/2026 22:02:47] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:02:52,281 127.0.0.1 - - [01/Aug/2026 22:02:52] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:02:57,262 127.0.0.1 - - [01/Aug/2026 22:02:57] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:03:02,332 127.0.0.1 - - [01/Aug/2026 22:03:02] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:03:07,200 127.0.0.1 - - [01/Aug/2026 22:03:07] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:03:12,310 127.0.0.1 - - [01/Aug/2026 22:03:12] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:03:17,297 127.0.0.1 - - [01/Aug/2026 22:03:17] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:03:22,417 127.0.0.1 - - [01/Aug/2026 22:03:22] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:03:27,193 127.0.0.1 - - [01/Aug/2026 22:03:27] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:03:32,264 127.0.0.1 - - [01/Aug/2026 22:03:32] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:03:38,982 127.0.0.1 - - [01/Aug/2026 22:03:38] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:03:42,306 127.0.0.1 - - [01/Aug/2026 22:03:42] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:03:47,200 127.0.0.1 - - [01/Aug/2026 22:03:47] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:03:52,294 127.0.0.1 - - [01/Aug/2026 22:03:52] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:03:57,638 127.0.0.1 - - [01/Aug/2026 22:03:57] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:04:02,264 127.0.0.1 - - [01/Aug/2026 22:04:02] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:04:07,228 127.0.0.1 - - [01/Aug/2026 22:04:07] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:04:12,497 127.0.0.1 - - [01/Aug/2026 22:04:12] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:04:17,226 127.0.0.1 - - [01/Aug/2026 22:04:17] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:04:22,624 127.0.0.1 - - [01/Aug/2026 22:04:22] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:04:27,227 127.0.0.1 - - [01/Aug/2026 22:04:27] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:04:32,335 127.0.0.1 - - [01/Aug/2026 22:04:32] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:04:37,237 127.0.0.1 - - [01/Aug/2026 22:04:37] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:04:42,723 127.0.0.1 - - [01/Aug/2026 22:04:42] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:04:47,247 127.0.0.1 - - [01/Aug/2026 22:04:47] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:04:52,600 127.0.0.1 - - [01/Aug/2026 22:04:52] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:04:57,240 127.0.0.1 - - [01/Aug/2026 22:04:57] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:05:02,321 127.0.0.1 - - [01/Aug/2026 22:05:02] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:05:08,296 127.0.0.1 - - [01/Aug/2026 22:05:08] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:05:12,289 127.0.0.1 - - [01/Aug/2026 22:05:12] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:05:17,659 127.0.0.1 - - [01/Aug/2026 22:05:17] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:05:23,121 127.0.0.1 - - [01/Aug/2026 22:05:23] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:05:27,592 127.0.0.1 - - [01/Aug/2026 22:05:27] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:05:32,395 127.0.0.1 - - [01/Aug/2026 22:05:32] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:05:37,348 127.0.0.1 - - [01/Aug/2026 22:05:37] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:05:42,608 127.0.0.1 - - [01/Aug/2026 22:05:42] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:05:47,316 127.0.0.1 - - [01/Aug/2026 22:05:47] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:05:53,106 127.0.0.1 - - [01/Aug/2026 22:05:53] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:05:57,601 127.0.0.1 - - [01/Aug/2026 22:05:57] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:06:02,731 127.0.0.1 - - [01/Aug/2026 22:06:02] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:06:07,353 127.0.0.1 - - [01/Aug/2026 22:06:07] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:06:12,293 127.0.0.1 - - [01/Aug/2026 22:06:12] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:06:17,345 127.0.0.1 - - [01/Aug/2026 22:06:17] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:06:22,415 127.0.0.1 - - [01/Aug/2026 22:06:22] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:06:27,349 127.0.0.1 - - [01/Aug/2026 22:06:27] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:06:32,362 127.0.0.1 - - [01/Aug/2026 22:06:32] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:06:37,513 127.0.0.1 - - [01/Aug/2026 22:06:37] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:06:42,240 127.0.0.1 - - [01/Aug/2026 22:06:42] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:06:47,275 127.0.0.1 - - [01/Aug/2026 22:06:47] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:06:52,416 127.0.0.1 - - [01/Aug/2026 22:06:52] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:06:57,396 127.0.0.1 - - [01/Aug/2026 22:06:57] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:07:02,298 127.0.0.1 - - [01/Aug/2026 22:07:02] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:07:07,315 127.0.0.1 - - [01/Aug/2026 22:07:07] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:07:12,413 127.0.0.1 - - [01/Aug/2026 22:07:12] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:07:18,012 127.0.0.1 - - [01/Aug/2026 22:07:18] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:07:22,449 127.0.0.1 - - [01/Aug/2026 22:07:22] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:07:27,404 127.0.0.1 - - [01/Aug/2026 22:07:27] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:07:32,572 127.0.0.1 - - [01/Aug/2026 22:07:32] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:07:37,438 127.0.0.1 - - [01/Aug/2026 22:07:37] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:07:42,333 127.0.0.1 - - [01/Aug/2026 22:07:42] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:07:47,337 127.0.0.1 - - [01/Aug/2026 22:07:47] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:07:52,358 127.0.0.1 - - [01/Aug/2026 22:07:52] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:07:57,307 127.0.0.1 - - [01/Aug/2026 22:07:57] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:08:02,507 127.0.0.1 - - [01/Aug/2026 22:08:02] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:08:07,487 127.0.0.1 - - [01/Aug/2026 22:08:07] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:08:13,413 127.0.0.1 - - [01/Aug/2026 22:08:13] "GET /api/state HTTP/1.1" 200 - +2026-08-01 22:15:51,326 skip KXBTC15M-26AUG020130-30: mom=DOWN llm=SKIP +2026-08-01 22:15:53,252 skip KXBTC15M-26AUG020130-30: mom=DOWN llm=SKIP +2026-08-01 22:15:57,991 skip KXBTC15M-26AUG020130-30: mom=DOWN llm=SKIP +2026-08-01 22:16:00,178 skip KXBTC15M-26AUG020130-30: mom=DOWN llm=SKIP +2026-08-01 22:16:01,241 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-01 22:16:24,681 skip KXBTC15M-26AUG020130-30: mom=DOWN llm=SKIP +2026-08-01 22:30:28,534 skip KXBTC15M-26AUG020145-45: mom=FLAT llm=SKIP +2026-08-01 22:30:30,798 skip KXBTC15M-26AUG020145-45: mom=FLAT llm=SKIP +2026-08-01 22:30:33,469 skip KXBTC15M-26AUG020145-45: mom=FLAT llm=SKIP +2026-08-01 22:30:35,447 skip KXBTC15M-26AUG020145-45: mom=FLAT llm=SKIP +2026-08-01 22:30:38,119 skip KXBTC15M-26AUG020145-45: mom=FLAT llm=SKIP +2026-08-01 22:45:45,108 skip KXBTC15M-26AUG020200-00: mom=DOWN llm=SKIP +2026-08-01 22:45:46,902 skip KXBTC15M-26AUG020200-00: mom=DOWN llm=SKIP +2026-08-01 22:45:49,008 skip KXBTC15M-26AUG020200-00: mom=DOWN llm=SKIP +2026-08-01 22:45:50,847 skip KXBTC15M-26AUG020200-00: mom=DOWN llm=SKIP +2026-08-01 22:45:52,769 skip KXBTC15M-26AUG020200-00: mom=DOWN llm=SKIP +2026-08-01 23:00:42,225 skip KXBTC15M-26AUG020215-15: mom=FLAT llm=SKIP +2026-08-01 23:00:44,082 skip KXBTC15M-26AUG020215-15: mom=FLAT llm=SKIP +2026-08-01 23:00:46,004 skip KXBTC15M-26AUG020215-15: mom=FLAT llm=SKIP +2026-08-01 23:00:47,853 skip KXBTC15M-26AUG020215-15: mom=FLAT llm=SKIP +2026-08-01 23:00:55,206 skip KXBTC15M-26AUG020215-15: mom=FLAT llm=SKIP +2026-08-01 23:15:39,537 skip KXBTC15M-26AUG020230-30: mom=FLAT llm=SKIP +2026-08-01 23:15:41,592 skip KXBTC15M-26AUG020230-30: mom=FLAT llm=SKIP +2026-08-01 23:15:43,457 skip KXBTC15M-26AUG020230-30: mom=FLAT llm=SKIP +2026-08-01 23:15:45,267 skip KXBTC15M-26AUG020230-30: mom=FLAT llm=SKIP +2026-08-01 23:15:47,287 skip KXBTC15M-26AUG020230-30: mom=FLAT llm=SKIP +2026-08-01 23:30:39,844 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-01 23:30:41,094 skip KXBTC15M-26AUG020245-45: mom=UP llm=SKIP +2026-08-01 23:30:42,247 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-01 23:30:43,887 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-01 23:30:47,443 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-01 23:31:02,912 skip KXBTC15M-26AUG020245-45: mom=UP llm=SKIP +2026-08-01 23:31:04,856 skip KXBTC15M-26AUG020245-45: mom=UP llm=SKIP +2026-08-01 23:31:06,956 skip KXBTC15M-26AUG020245-45: mom=UP llm=SKIP +2026-08-01 23:31:15,212 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-01 23:31:38,420 skip KXBTC15M-26AUG020245-45: mom=UP llm=SKIP +2026-08-01 23:45:33,888 skip KXBTC15M-26AUG020300-00: mom=FLAT llm=SKIP +2026-08-01 23:45:35,575 skip KXBTC15M-26AUG020300-00: mom=FLAT llm=SKIP +2026-08-01 23:45:37,428 skip KXBTC15M-26AUG020300-00: mom=FLAT llm=SKIP +2026-08-01 23:45:40,129 skip KXBTC15M-26AUG020300-00: mom=FLAT llm=SKIP +2026-08-01 23:45:42,154 skip KXBTC15M-26AUG020300-00: mom=FLAT llm=SKIP +2026-08-02 00:00:28,526 skip KXBTC15M-26AUG020315-15: mom=FLAT llm=SKIP +2026-08-02 00:00:30,216 skip KXBTC15M-26AUG020315-15: mom=FLAT llm=SKIP +2026-08-02 00:00:32,066 skip KXBTC15M-26AUG020315-15: mom=FLAT llm=SKIP +2026-08-02 00:00:33,784 skip KXBTC15M-26AUG020315-15: mom=FLAT llm=SKIP +2026-08-02 00:00:35,709 skip KXBTC15M-26AUG020315-15: mom=FLAT llm=SKIP +2026-08-02 00:15:24,448 skip KXBTC15M-26AUG020330-30: mom=FLAT llm=SKIP +2026-08-02 00:15:26,330 skip KXBTC15M-26AUG020330-30: mom=FLAT llm=SKIP +2026-08-02 00:15:28,171 skip KXBTC15M-26AUG020330-30: mom=FLAT llm=SKIP +2026-08-02 00:15:30,051 skip KXBTC15M-26AUG020330-30: mom=FLAT llm=SKIP +2026-08-02 00:15:31,894 skip KXBTC15M-26AUG020330-30: mom=FLAT llm=SKIP +2026-08-02 00:30:40,080 skip KXBTC15M-26AUG020345-45: mom=FLAT llm=SKIP +2026-08-02 00:30:41,938 skip KXBTC15M-26AUG020345-45: mom=FLAT llm=SKIP +2026-08-02 00:30:43,537 skip KXBTC15M-26AUG020345-45: mom=FLAT llm=SKIP +2026-08-02 00:30:45,416 skip KXBTC15M-26AUG020345-45: mom=FLAT llm=SKIP +2026-08-02 00:30:47,247 skip KXBTC15M-26AUG020345-45: mom=FLAT llm=SKIP +2026-08-02 00:45:35,241 skip KXBTC15M-26AUG020400-00: mom=UP llm=SKIP +2026-08-02 00:45:37,097 skip KXBTC15M-26AUG020400-00: mom=UP llm=SKIP +2026-08-02 00:45:38,670 skip KXBTC15M-26AUG020400-00: mom=UP llm=SKIP +2026-08-02 00:45:45,948 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-02 00:45:47,847 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-02 00:46:08,932 skip KXBTC15M-26AUG020400-00: mom=FLAT llm=SKIP +2026-08-02 00:46:11,559 skip KXBTC15M-26AUG020400-00: mom=FLAT llm=SKIP +2026-08-02 01:00:42,618 skip KXBTC15M-26AUG020415-15: mom=FLAT llm=SKIP +2026-08-02 01:00:44,309 skip KXBTC15M-26AUG020415-15: mom=FLAT llm=SKIP +2026-08-02 01:00:45,798 skip KXBTC15M-26AUG020415-15: mom=FLAT llm=SKIP +2026-08-02 01:00:47,209 skip KXBTC15M-26AUG020415-15: mom=FLAT llm=SKIP +2026-08-02 01:00:49,527 skip KXBTC15M-26AUG020415-15: mom=FLAT llm=SKIP +2026-08-02 01:15:57,060 skip KXBTC15M-26AUG020430-30: mom=FLAT llm=SKIP +2026-08-02 01:15:58,723 skip KXBTC15M-26AUG020430-30: mom=FLAT llm=SKIP +2026-08-02 01:16:00,301 skip KXBTC15M-26AUG020430-30: mom=FLAT llm=SKIP +2026-08-02 01:16:01,867 skip KXBTC15M-26AUG020430-30: mom=FLAT llm=SKIP +2026-08-02 01:16:03,992 skip KXBTC15M-26AUG020430-30: mom=FLAT llm=SKIP +2026-08-02 01:30:09,358 skip KXBTC15M-26AUG020445-45: mom=DOWN llm=SKIP +2026-08-02 01:30:10,600 skip KXBTC15M-26AUG020445-45: mom=DOWN llm=SKIP +2026-08-02 01:30:12,000 skip KXBTC15M-26AUG020445-45: mom=DOWN llm=SKIP +2026-08-02 01:30:13,246 skip KXBTC15M-26AUG020445-45: mom=DOWN llm=SKIP +2026-08-02 01:30:14,406 skip KXBTC15M-26AUG020445-45: ask None¢ > stake cap 20¢ +2026-08-02 01:30:36,032 skip KXBTC15M-26AUG020445-45: mom=DOWN llm=SKIP +2026-08-02 01:45:43,435 skip KXBTC15M-26AUG020500-00: mom=DOWN llm=SKIP +2026-08-02 01:45:44,342 skip KXBTC15M-26AUG020500-00: mom=DOWN llm=SKIP +2026-08-02 01:45:45,100 skip KXBTC15M-26AUG020500-00: mom=DOWN llm=SKIP +2026-08-02 01:45:45,943 skip KXBTC15M-26AUG020500-00: mom=DOWN llm=SKIP +2026-08-02 01:45:46,896 skip KXBTC15M-26AUG020500-00: mom=DOWN llm=SKIP +2026-08-02 02:00:37,677 skip KXBTC15M-26AUG020515-15: mom=FLAT llm=SKIP +2026-08-02 02:00:38,705 skip KXBTC15M-26AUG020515-15: mom=FLAT llm=SKIP +2026-08-02 02:00:39,938 skip KXBTC15M-26AUG020515-15: mom=FLAT llm=SKIP +2026-08-02 02:00:40,906 skip KXBTC15M-26AUG020515-15: mom=FLAT llm=SKIP +2026-08-02 02:00:41,808 skip KXBTC15M-26AUG020515-15: mom=FLAT llm=SKIP +2026-08-02 02:15:30,670 skip KXBTC15M-26AUG020530-30: mom=UP llm=SKIP +2026-08-02 02:15:31,451 skip KXBTC15M-26AUG020530-30: mom=UP llm=SKIP +2026-08-02 02:15:32,257 skip KXBTC15M-26AUG020530-30: mom=UP llm=SKIP +2026-08-02 02:15:33,869 skip KXBTC15M-26AUG020530-30: ask None¢ > stake cap 20¢ +2026-08-02 02:15:37,988 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-02 02:15:55,453 skip KXBTC15M-26AUG020530-30: mom=UP llm=SKIP +2026-08-02 02:16:04,159 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-02 02:16:25,744 skip KXBTC15M-26AUG020530-30: mom=FLAT llm=SKIP +2026-08-02 02:30:17,817 skip KXBTC15M-26AUG020545-45: mom=DOWN llm=SKIP +2026-08-02 02:30:18,871 skip KXBTC15M-26AUG020545-45: mom=DOWN llm=SKIP +2026-08-02 02:30:19,876 skip KXBTC15M-26AUG020545-45: mom=DOWN llm=SKIP +2026-08-02 02:30:20,815 skip KXBTC15M-26AUG020545-45: mom=DOWN llm=SKIP +2026-08-02 02:30:22,225 skip KXBTC15M-26AUG020545-45: mom=DOWN llm=SKIP +2026-08-02 02:45:51,515 skip KXBTC15M-26AUG020600-00: mom=FLAT llm=SKIP +2026-08-02 02:45:52,336 skip KXBTC15M-26AUG020600-00: mom=FLAT llm=SKIP +2026-08-02 02:45:53,166 skip KXBTC15M-26AUG020600-00: mom=FLAT llm=SKIP +2026-08-02 02:45:53,865 skip KXBTC15M-26AUG020600-00: mom=FLAT llm=SKIP +2026-08-02 02:45:54,729 skip KXBTC15M-26AUG020600-00: mom=FLAT llm=SKIP +2026-08-02 02:58:32,788 loop error: HTTPSConnectionPool(host='api.elections.kalshi.com', port=443): Read timed out. (read timeout=15) +2026-08-02 02:58:32,790 loop error: HTTPSConnectionPool(host='api.elections.kalshi.com', port=443): Read timed out. (read timeout=15) +2026-08-02 02:58:33,719 loop error: HTTPSConnectionPool(host='api.elections.kalshi.com', port=443): Read timed out. (read timeout=15) +2026-08-02 02:58:34,346 loop error: HTTPSConnectionPool(host='api.elections.kalshi.com', port=443): Read timed out. (read timeout=15) +2026-08-02 02:58:35,283 loop error: HTTPSConnectionPool(host='api.elections.kalshi.com', port=443): Read timed out. (read timeout=15) +2026-08-02 02:59:04,972 loop error: HTTPSConnectionPool(host='api.elections.kalshi.com', port=443): Max retries exceeded with url: /trade-api/v2/markets?series_ticker=KXBTC15M&status=open&limit=3 (Caused by SSLError(SSLEOFError(8, '[SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1016)'))) +2026-08-02 02:59:04,974 loop error: HTTPSConnectionPool(host='api.elections.kalshi.com', port=443): Max retries exceeded with url: /trade-api/v2/markets?series_ticker=KXBTC15M&status=open&limit=3 (Caused by SSLError(SSLEOFError(8, '[SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1016)'))) +2026-08-02 02:59:05,856 loop error: HTTPSConnectionPool(host='api.elections.kalshi.com', port=443): Max retries exceeded with url: /trade-api/v2/markets?series_ticker=KXBTC15M&status=open&limit=3 (Caused by SSLError(SSLEOFError(8, '[SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1016)'))) +2026-08-02 02:59:06,478 loop error: HTTPSConnectionPool(host='api.elections.kalshi.com', port=443): Max retries exceeded with url: /trade-api/v2/markets?series_ticker=KXBTC15M&status=open&limit=3 (Caused by SSLError(SSLEOFError(8, '[SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1016)'))) +2026-08-02 02:59:07,417 loop error: HTTPSConnectionPool(host='api.elections.kalshi.com', port=443): Max retries exceeded with url: /trade-api/v2/markets?series_ticker=KXBTC15M&status=open&limit=3 (Caused by SSLError(SSLEOFError(8, '[SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1016)'))) +2026-08-02 02:59:37,142 loop error: HTTPSConnectionPool(host='api.elections.kalshi.com', port=443): Max retries exceeded with url: /trade-api/v2/markets?series_ticker=KXBTC15M&status=open&limit=3 (Caused by SSLError(SSLEOFError(8, '[SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1016)'))) +2026-08-02 02:59:37,144 loop error: HTTPSConnectionPool(host='api.elections.kalshi.com', port=443): Max retries exceeded with url: /trade-api/v2/markets?series_ticker=KXBTC15M&status=open&limit=3 (Caused by SSLError(SSLEOFError(8, '[SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1016)'))) +2026-08-02 02:59:38,018 loop error: HTTPSConnectionPool(host='api.elections.kalshi.com', port=443): Max retries exceeded with url: /trade-api/v2/markets?series_ticker=KXBTC15M&status=open&limit=3 (Caused by SSLError(SSLEOFError(8, '[SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1016)'))) +2026-08-02 02:59:38,626 loop error: HTTPSConnectionPool(host='api.elections.kalshi.com', port=443): Max retries exceeded with url: /trade-api/v2/markets?series_ticker=KXBTC15M&status=open&limit=3 (Caused by SSLError(SSLEOFError(8, '[SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1016)'))) +2026-08-02 02:59:39,575 loop error: HTTPSConnectionPool(host='api.elections.kalshi.com', port=443): Max retries exceeded with url: /trade-api/v2/markets?series_ticker=KXBTC15M&status=open&limit=3 (Caused by SSLError(SSLEOFError(8, '[SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1016)'))) +2026-08-02 03:00:43,157 skip KXBTC15M-26AUG020615-15: mom=FLAT llm=SKIP +2026-08-02 03:00:44,235 skip KXBTC15M-26AUG020615-15: mom=FLAT llm=SKIP +2026-08-02 03:00:45,057 skip KXBTC15M-26AUG020615-15: mom=FLAT llm=SKIP +2026-08-02 03:00:45,891 skip KXBTC15M-26AUG020615-15: mom=FLAT llm=SKIP +2026-08-02 03:00:46,736 skip KXBTC15M-26AUG020615-15: mom=FLAT llm=SKIP +2026-08-02 03:15:15,539 skip KXBTC15M-26AUG020630-30: mom=DOWN llm=SKIP +2026-08-02 03:15:16,790 skip KXBTC15M-26AUG020630-30: mom=DOWN llm=SKIP +2026-08-02 03:15:18,273 skip KXBTC15M-26AUG020630-30: mom=DOWN llm=SKIP +2026-08-02 03:15:18,602 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-02 03:15:19,599 skip KXBTC15M-26AUG020630-30: mom=DOWN llm=SKIP +2026-08-02 03:16:12,711 skip KXBTC15M-26AUG020630-30: mom=DOWN llm=SKIP +2026-08-02 03:31:24,240 ollama vote failed: HTTPConnectionPool(host='localhost', port=11434): Read timed out. (read timeout=45) +2026-08-02 03:31:24,365 skip KXBTC15M-26AUG020645-45: mom=FLAT llm=SKIP +2026-08-02 03:31:25,838 skip KXBTC15M-26AUG020645-45: mom=FLAT llm=SKIP +2026-08-02 03:31:27,291 skip KXBTC15M-26AUG020645-45: mom=FLAT llm=SKIP +2026-08-02 03:31:29,474 skip KXBTC15M-26AUG020645-45: mom=FLAT llm=SKIP +2026-08-02 03:31:30,958 skip KXBTC15M-26AUG020645-45: mom=FLAT llm=SKIP +2026-08-02 03:45:56,982 skip KXBTC15M-26AUG020700-00: mom=UP llm=SKIP +2026-08-02 03:45:58,591 skip KXBTC15M-26AUG020700-00: mom=UP llm=SKIP +2026-08-02 03:45:59,371 skip KXBTC15M-26AUG020700-00: mom=UP llm=SKIP +2026-08-02 03:46:02,520 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-02 03:46:04,909 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-02 03:46:23,849 skip KXBTC15M-26AUG020700-00: mom=UP llm=SKIP +2026-08-02 03:46:26,271 skip KXBTC15M-26AUG020700-00: mom=UP llm=SKIP +2026-08-02 04:00:19,304 skip KXBTC15M-26AUG020715-15: mom=FLAT llm=SKIP +2026-08-02 04:00:26,091 skip KXBTC15M-26AUG020715-15: mom=FLAT llm=SKIP +2026-08-02 04:00:26,894 skip KXBTC15M-26AUG020715-15: mom=FLAT llm=SKIP +2026-08-02 04:00:28,049 skip KXBTC15M-26AUG020715-15: mom=FLAT llm=SKIP +2026-08-02 04:00:31,611 skip KXBTC15M-26AUG020715-15: mom=FLAT llm=SKIP +2026-08-02 04:15:31,974 skip KXBTC15M-26AUG020730-30: mom=FLAT llm=SKIP +2026-08-02 04:15:34,753 skip KXBTC15M-26AUG020730-30: mom=FLAT llm=SKIP +2026-08-02 04:15:35,639 skip KXBTC15M-26AUG020730-30: mom=FLAT llm=SKIP +2026-08-02 04:15:36,597 skip KXBTC15M-26AUG020730-30: mom=FLAT llm=SKIP +2026-08-02 04:15:39,965 skip KXBTC15M-26AUG020730-30: mom=FLAT llm=SKIP +2026-08-02 04:30:24,112 skip KXBTC15M-26AUG020745-45: mom=FLAT llm=SKIP +2026-08-02 04:30:24,927 skip KXBTC15M-26AUG020745-45: mom=FLAT llm=SKIP +2026-08-02 04:30:25,736 skip KXBTC15M-26AUG020745-45: mom=FLAT llm=SKIP +2026-08-02 04:30:26,838 skip KXBTC15M-26AUG020745-45: mom=FLAT llm=SKIP +2026-08-02 04:30:27,694 skip KXBTC15M-26AUG020745-45: mom=FLAT llm=SKIP +2026-08-02 04:45:36,785 skip KXBTC15M-26AUG020800-00: mom=DOWN llm=SKIP +2026-08-02 04:45:37,654 skip KXBTC15M-26AUG020800-00: mom=DOWN llm=SKIP +2026-08-02 04:45:38,559 skip KXBTC15M-26AUG020800-00: mom=DOWN llm=SKIP +2026-08-02 04:45:39,458 skip KXBTC15M-26AUG020800-00: mom=DOWN llm=SKIP +2026-08-02 04:45:40,349 skip KXBTC15M-26AUG020800-00: mom=DOWN llm=SKIP +2026-08-02 05:00:49,635 skip KXBTC15M-26AUG020815-15: mom=FLAT llm=SKIP +2026-08-02 05:00:50,833 skip KXBTC15M-26AUG020815-15: mom=FLAT llm=SKIP +2026-08-02 05:00:51,695 skip KXBTC15M-26AUG020815-15: mom=FLAT llm=SKIP +2026-08-02 05:00:52,855 skip KXBTC15M-26AUG020815-15: mom=FLAT llm=SKIP +2026-08-02 05:00:53,719 skip KXBTC15M-26AUG020815-15: mom=FLAT llm=SKIP +2026-08-02 05:15:22,437 skip KXBTC15M-26AUG020830-30: mom=UP llm=SKIP +2026-08-02 05:15:26,120 skip KXBTC15M-26AUG020830-30: ask None¢ > stake cap 20¢ +2026-08-02 05:15:28,115 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-02 05:15:28,866 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-02 05:15:30,023 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-02 05:15:47,650 skip KXBTC15M-26AUG020830-30: mom=UP llm=SKIP +2026-08-02 05:15:49,350 skip KXBTC15M-26AUG020830-30: mom=UP llm=SKIP +2026-08-02 05:15:50,158 skip KXBTC15M-26AUG020830-30: mom=UP llm=SKIP +2026-08-02 05:15:56,001 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-02 05:16:22,405 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-02 05:16:48,860 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-02 05:17:10,408 skip KXBTC15M-26AUG020830-30: mom=UP llm=SKIP +2026-08-02 05:30:34,554 skip KXBTC15M-26AUG020845-45: mom=FLAT llm=SKIP +2026-08-02 05:30:35,693 skip KXBTC15M-26AUG020845-45: mom=FLAT llm=SKIP +2026-08-02 05:30:36,662 skip KXBTC15M-26AUG020845-45: mom=FLAT llm=SKIP +2026-08-02 05:30:37,971 skip KXBTC15M-26AUG020845-45: mom=FLAT llm=SKIP +2026-08-02 05:30:38,801 skip KXBTC15M-26AUG020845-45: mom=FLAT llm=SKIP +2026-08-02 05:45:26,802 skip KXBTC15M-26AUG020900-00: mom=FLAT llm=SKIP +2026-08-02 05:45:27,631 skip KXBTC15M-26AUG020900-00: mom=FLAT llm=SKIP +2026-08-02 05:45:28,427 skip KXBTC15M-26AUG020900-00: mom=FLAT llm=SKIP +2026-08-02 05:45:29,223 skip KXBTC15M-26AUG020900-00: mom=FLAT llm=SKIP +2026-08-02 05:45:30,046 skip KXBTC15M-26AUG020900-00: mom=FLAT llm=SKIP +2026-08-02 06:01:18,133 ollama vote failed: HTTPConnectionPool(host='localhost', port=11434): Read timed out. (read timeout=45) +2026-08-02 06:01:18,224 skip KXBTC15M-26AUG020915-15: mom=DOWN llm=SKIP +2026-08-02 06:01:19,219 ollama vote failed: HTTPConnectionPool(host='localhost', port=11434): Read timed out. (read timeout=45) +2026-08-02 06:01:19,298 skip KXBTC15M-26AUG020915-15: mom=DOWN llm=SKIP +2026-08-02 06:01:19,397 ollama vote failed: HTTPConnectionPool(host='localhost', port=11434): Read timed out. (read timeout=45) +2026-08-02 06:01:19,526 skip KXBTC15M-26AUG020915-15: mom=DOWN llm=SKIP +2026-08-02 06:01:21,261 ollama vote failed: HTTPConnectionPool(host='localhost', port=11434): Read timed out. (read timeout=45) +2026-08-02 06:01:21,343 skip KXBTC15M-26AUG020915-15: mom=DOWN llm=SKIP +2026-08-02 06:01:21,685 ollama vote failed: HTTPConnectionPool(host='localhost', port=11434): Read timed out. (read timeout=45) +2026-08-02 06:01:21,767 skip KXBTC15M-26AUG020915-15: mom=DOWN llm=SKIP +2026-08-02 06:15:47,149 skip KXBTC15M-26AUG020930-30: mom=FLAT llm=SKIP +2026-08-02 06:15:48,039 skip KXBTC15M-26AUG020930-30: mom=FLAT llm=SKIP +2026-08-02 06:15:49,804 skip KXBTC15M-26AUG020930-30: mom=FLAT llm=SKIP +2026-08-02 06:15:51,210 skip KXBTC15M-26AUG020930-30: mom=FLAT llm=SKIP +2026-08-02 06:15:52,398 skip KXBTC15M-26AUG020930-30: mom=FLAT llm=SKIP +2026-08-02 06:30:39,593 skip KXBTC15M-26AUG020945-45: mom=FLAT llm=SKIP +2026-08-02 06:30:40,731 skip KXBTC15M-26AUG020945-45: mom=FLAT llm=SKIP +2026-08-02 06:30:41,544 skip KXBTC15M-26AUG020945-45: mom=FLAT llm=SKIP +2026-08-02 06:30:42,342 skip KXBTC15M-26AUG020945-45: mom=FLAT llm=SKIP +2026-08-02 06:30:43,148 skip KXBTC15M-26AUG020945-45: mom=FLAT llm=SKIP +2026-08-02 06:45:31,886 skip KXBTC15M-26AUG021000-00: mom=UP llm=SKIP +2026-08-02 06:45:32,885 skip KXBTC15M-26AUG021000-00: mom=UP llm=SKIP +2026-08-02 06:45:33,761 skip KXBTC15M-26AUG021000-00: ask None¢ > stake cap 20¢ +2026-08-02 06:45:39,485 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-02 06:45:40,288 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-02 06:45:55,288 skip KXBTC15M-26AUG021000-00: mom=UP llm=SKIP +2026-08-02 06:46:01,062 skip KXBTC15M-26AUG021000-00: mom=FLAT llm=SKIP +2026-08-02 06:46:01,890 skip KXBTC15M-26AUG021000-00: mom=FLAT llm=SKIP +2026-08-02 07:00:24,822 skip KXBTC15M-26AUG021015-15: mom=FLAT llm=SKIP +2026-08-02 07:00:25,531 skip KXBTC15M-26AUG021015-15: mom=FLAT llm=SKIP +2026-08-02 07:00:26,365 skip KXBTC15M-26AUG021015-15: mom=FLAT llm=SKIP +2026-08-02 07:00:28,922 skip KXBTC15M-26AUG021015-15: mom=FLAT llm=SKIP +2026-08-02 07:00:29,759 skip KXBTC15M-26AUG021015-15: mom=FLAT llm=SKIP +2026-08-02 07:06:48,604 127.0.0.1 - - [02/Aug/2026 07:06:48] "GET /api/state HTTP/1.1" 200 - +2026-08-02 07:06:53,342 127.0.0.1 - - [02/Aug/2026 07:06:53] "GET /api/state HTTP/1.1" 200 - +2026-08-02 07:06:58,350 127.0.0.1 - - [02/Aug/2026 07:06:58] "GET /api/state HTTP/1.1" 200 - +2026-08-02 07:07:03,435 127.0.0.1 - - [02/Aug/2026 07:07:03] "GET /api/state HTTP/1.1" 200 - +2026-08-02 07:07:08,298 127.0.0.1 - - [02/Aug/2026 07:07:08] "GET /api/state HTTP/1.1" 200 - +2026-08-02 07:07:13,339 127.0.0.1 - - [02/Aug/2026 07:07:13] "GET /api/state HTTP/1.1" 200 - +2026-08-02 07:07:19,049 127.0.0.1 - - [02/Aug/2026 07:07:19] "GET /api/state HTTP/1.1" 200 - +2026-08-02 07:11:33,971 K4LSH1_OPS online — mode=AUTO dry_run=False stake=20¢ +2026-08-02 07:11:45,153 skip KXBTC15M-26AUG021015-15: no swing (0.025% < 0.12%) +2026-08-02 07:12:11,125 127.0.0.1 - - [02/Aug/2026 07:12:11] "GET /api/state HTTP/1.1" 200 - +2026-08-02 07:12:59,130 K4LSH1_OPS online — mode=AUTO dry_run=False stake=20¢ +2026-08-02 07:13:02,716 skip KXBTC15M-26AUG021015-15: no swing (0.007% < 0.12%) +2026-08-02 07:13:34,229 127.0.0.1 - - [02/Aug/2026 07:13:34] "GET /api/state HTTP/1.1" 200 - +2026-08-02 07:14:49,474 K4LSH1_OPS online — mode=AUTO dry_run=False stake=20¢ +2026-08-02 07:15:27,634 127.0.0.1 - - [02/Aug/2026 07:15:27] "GET /api/state HTTP/1.1" 200 - +2026-08-02 07:15:29,763 skip KXBTC15M-26AUG021030-30: no swing (0.011% < 0.12%) +2026-08-02 07:15:33,488 skip KXBTC15M-26AUG021030-30: no swing (0.011% < 0.12%) +2026-08-02 07:15:34,740 skip KXBTC15M-26AUG021030-30: mom=FLAT llm=SKIP +2026-08-02 07:15:35,872 skip KXBTC15M-26AUG021030-30: mom=FLAT llm=SKIP +2026-08-02 07:15:36,714 skip KXBTC15M-26AUG021030-30: mom=FLAT llm=SKIP +2026-08-02 07:15:37,565 skip KXBTC15M-26AUG021030-30: mom=FLAT llm=SKIP +2026-08-02 07:15:38,394 skip KXBTC15M-26AUG021030-30: mom=FLAT llm=SKIP +2026-08-02 07:15:46,537 skip KXBTC15M-26AUG021030-30: no swing (0.018% < 0.12%) +2026-08-02 07:16:34,256 127.0.0.1 - - [02/Aug/2026 07:16:34] "GET /api/state HTTP/1.1" 200 - +2026-08-02 07:17:14,679 127.0.0.1 - - [02/Aug/2026 07:17:14] "GET /api/state HTTP/1.1" 200 - +2026-08-02 07:18:21,009 127.0.0.1 - - [02/Aug/2026 07:18:21] "GET /api/state HTTP/1.1" 200 - +2026-08-02 07:19:51,722 K4LSH1_OPS online — mode=AUTO dry_run=False stake=20¢ +2026-08-02 07:19:55,357 skip KXBTC15M-26AUG021030-30: no swing (0.097% < 0.12%) +2026-08-02 07:30:50,138 skip KXBTC15M-26AUG021045-45: no swing (0.029% < 0.12%) +2026-08-02 07:45:48,276 skip KXBTC15M-26AUG021100-00: no swing (0.012% < 0.12%) +2026-08-02 08:01:27,905 ollama vote failed: HTTPConnectionPool(host='localhost', port=11434): Read timed out. (read timeout=45) +2026-08-02 08:01:27,988 skip KXBTC15M-26AUG021115-15: no swing (0.038% < 0.12%) +2026-08-02 08:16:03,064 skip KXBTC15M-26AUG021130-30: no swing (0.030% < 0.12%) +2026-08-02 08:30:49,265 skip KXBTC15M-26AUG021145-45: no swing (0.019% < 0.12%) +2026-08-02 08:46:26,721 ollama vote failed: HTTPConnectionPool(host='localhost', port=11434): Read timed out. (read timeout=45) +2026-08-02 08:46:26,816 skip KXBTC15M-26AUG021200-00: no swing (0.026% < 0.12%) +2026-08-02 09:00:28,604 skip KXBTC15M-26AUG021215-15: no swing (0.021% < 0.12%) +2026-08-02 09:15:38,371 skip KXBTC15M-26AUG021230-30: no swing (0.031% < 0.12%) +2026-08-02 09:31:36,148 ollama vote failed: HTTPConnectionPool(host='localhost', port=11434): Read timed out. (read timeout=45) +2026-08-02 09:31:36,234 skip KXBTC15M-26AUG021245-45: no swing (0.005% < 0.12%) +2026-08-02 09:46:04,717 skip KXBTC15M-26AUG021300-00: no swing (0.100% < 0.12%) +2026-08-02 10:00:25,295 skip KXBTC15M-26AUG021315-15: no swing (0.024% < 0.12%) +2026-08-02 10:16:08,456 skip KXBTC15M-26AUG021330-30: no swing (0.046% < 0.12%) +2026-08-02 10:30:57,828 skip KXBTC15M-26AUG021345-45: no swing (0.087% < 0.12%) +2026-08-02 10:45:19,917 skip KXBTC15M-26AUG021400-00: no swing (0.048% < 0.12%) +2026-08-02 11:00:42,483 skip KXBTC15M-26AUG021415-15: no swing (0.027% < 0.12%) +2026-08-02 11:15:44,592 skip KXBTC15M-26AUG021430-30: no swing (0.022% < 0.12%) +2026-08-02 11:30:25,791 skip KXBTC15M-26AUG021445-45: no swing (0.039% < 0.12%) +2026-08-02 11:45:55,497 skip KXBTC15M-26AUG021500-00: no swing (0.111% < 0.12%) +2026-08-02 12:00:58,673 skip KXBTC15M-26AUG021515-15: no swing (0.081% < 0.12%) +2026-08-02 12:15:45,811 skip KXBTC15M-26AUG021530-30: no swing (0.019% < 0.12%) +2026-08-02 12:30:27,553 skip KXBTC15M-26AUG021545-45: no swing (0.025% < 0.12%) +2026-08-02 12:45:49,696 skip KXBTC15M-26AUG021600-00: no swing (0.090% < 0.12%) +2026-08-02 13:00:54,053 skip KXBTC15M-26AUG021615-15: no swing (0.018% < 0.12%) +2026-08-02 13:16:04,172 skip KXBTC15M-26AUG021630-30: no swing (0.006% < 0.12%) +2026-08-02 13:30:45,953 skip KXBTC15M-26AUG021645-45: no swing (0.026% < 0.12%) +2026-08-02 13:45:47,102 skip KXBTC15M-26AUG021700-00: no swing (0.003% < 0.12%) +2026-08-02 13:56:39,174 127.0.0.1 - - [02/Aug/2026 13:56:39] "GET /api/status HTTP/1.1" 404 - +2026-08-02 13:56:39,184 127.0.0.1 - - [02/Aug/2026 13:56:39] "GET / HTTP/1.1" 200 - +2026-08-02 13:57:09,922 127.0.0.1 - - [02/Aug/2026 13:57:09] "GET /api/state HTTP/1.1" 200 - +2026-08-02 13:59:52,580 127.0.0.1 - - [02/Aug/2026 13:59:52] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:01:09,818 127.0.0.1 - - [02/Aug/2026 14:01:09] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:01:44,301 ollama vote failed: HTTPConnectionPool(host='localhost', port=11434): Read timed out. (read timeout=45) +2026-08-02 14:01:44,433 skip KXBTC15M-26AUG021715-15: no swing (0.032% < 0.12%) +2026-08-02 14:12:21,902 127.0.0.1 - - [02/Aug/2026 14:12:21] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:14:06,217 127.0.0.1 - - [02/Aug/2026 14:14:06] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:14:39,030 K4LSH1_OPS online — mode=AUTO dry_run=False stake=15¢ +2026-08-02 14:14:48,793 127.0.0.1 - - [02/Aug/2026 14:14:48] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:15:30,283 K4LSH1_OPS online — mode=AUTO dry_run=False stake=15¢ +2026-08-02 14:15:32,813 skip KXBTC15M-26AUG021730-30: no swing (0.019% < 0.08%) +2026-08-02 14:16:34,622 K4LSH1_OPS online — mode=AUTO dry_run=False stake=15¢ +2026-08-02 14:16:43,150 skip KXBTC15M-26AUG021730-30: no swing (0.045% < 0.08%) +2026-08-02 14:16:45,510 127.0.0.1 - - [02/Aug/2026 14:16:45] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:17:01,124 K4LSH1_OPS online — mode=AUTO dry_run=False stake=15¢ +2026-08-02 14:17:03,853 skip KXBTC15M-26AUG021730-30: no swing (0.029% < 0.06%) +2026-08-02 14:17:11,401 127.0.0.1 - - [02/Aug/2026 14:17:11] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:19:09,095 K4LSH1_OPS online — mode=AUTO dry_run=False stake=15¢ +2026-08-02 14:19:11,849 skip KXDOGE15M-26AUG021730-30: no swing (0.017% < 0.06%) +2026-08-02 14:19:24,512 127.0.0.1 - - [02/Aug/2026 14:19:24] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:20:25,027 127.0.0.1 - - [02/Aug/2026 14:20:25] "GET / HTTP/1.1" 200 - +2026-08-02 14:20:31,448 127.0.0.1 - - [02/Aug/2026 14:20:31] "GET / HTTP/1.1" 200 - +2026-08-02 14:20:32,014 127.0.0.1 - - [02/Aug/2026 14:20:32] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:20:36,892 127.0.0.1 - - [02/Aug/2026 14:20:36] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:20:41,864 127.0.0.1 - - [02/Aug/2026 14:20:41] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:20:46,953 127.0.0.1 - - [02/Aug/2026 14:20:46] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:20:51,983 127.0.0.1 - - [02/Aug/2026 14:20:51] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:20:56,920 127.0.0.1 - - [02/Aug/2026 14:20:56] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:21:01,939 127.0.0.1 - - [02/Aug/2026 14:21:01] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:21:06,898 127.0.0.1 - - [02/Aug/2026 14:21:06] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:21:11,990 127.0.0.1 - - [02/Aug/2026 14:21:11] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:21:17,009 127.0.0.1 - - [02/Aug/2026 14:21:17] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:21:21,860 127.0.0.1 - - [02/Aug/2026 14:21:21] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:21:26,876 127.0.0.1 - - [02/Aug/2026 14:21:26] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:21:31,948 127.0.0.1 - - [02/Aug/2026 14:21:31] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:21:36,876 127.0.0.1 - - [02/Aug/2026 14:21:36] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:21:41,885 127.0.0.1 - - [02/Aug/2026 14:21:41] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:21:46,963 127.0.0.1 - - [02/Aug/2026 14:21:46] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:21:51,864 127.0.0.1 - - [02/Aug/2026 14:21:51] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:21:56,890 127.0.0.1 - - [02/Aug/2026 14:21:56] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:22:01,934 127.0.0.1 - - [02/Aug/2026 14:22:01] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:22:08,011 127.0.0.1 - - [02/Aug/2026 14:22:08] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:22:11,910 127.0.0.1 - - [02/Aug/2026 14:22:11] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:22:12,487 127.0.0.1 - - [02/Aug/2026 14:22:12] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:22:16,933 127.0.0.1 - - [02/Aug/2026 14:22:16] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:22:21,971 127.0.0.1 - - [02/Aug/2026 14:22:21] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:22:26,995 127.0.0.1 - - [02/Aug/2026 14:22:26] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:22:31,959 127.0.0.1 - - [02/Aug/2026 14:22:31] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:22:36,886 127.0.0.1 - - [02/Aug/2026 14:22:36] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:22:41,889 127.0.0.1 - - [02/Aug/2026 14:22:41] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:22:46,951 127.0.0.1 - - [02/Aug/2026 14:22:46] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:22:51,888 127.0.0.1 - - [02/Aug/2026 14:22:51] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:22:56,886 127.0.0.1 - - [02/Aug/2026 14:22:56] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:23:01,959 127.0.0.1 - - [02/Aug/2026 14:23:01] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:23:06,882 127.0.0.1 - - [02/Aug/2026 14:23:06] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:23:11,897 127.0.0.1 - - [02/Aug/2026 14:23:11] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:23:16,973 127.0.0.1 - - [02/Aug/2026 14:23:16] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:23:21,878 127.0.0.1 - - [02/Aug/2026 14:23:21] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:23:26,923 127.0.0.1 - - [02/Aug/2026 14:23:26] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:23:31,965 127.0.0.1 - - [02/Aug/2026 14:23:31] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:23:36,984 127.0.0.1 - - [02/Aug/2026 14:23:36] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:23:41,873 127.0.0.1 - - [02/Aug/2026 14:23:41] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:23:46,947 127.0.0.1 - - [02/Aug/2026 14:23:46] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:23:51,892 127.0.0.1 - - [02/Aug/2026 14:23:51] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:23:56,879 127.0.0.1 - - [02/Aug/2026 14:23:56] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:24:01,990 127.0.0.1 - - [02/Aug/2026 14:24:01] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:24:06,890 127.0.0.1 - - [02/Aug/2026 14:24:06] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:24:11,884 127.0.0.1 - - [02/Aug/2026 14:24:11] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:24:16,949 127.0.0.1 - - [02/Aug/2026 14:24:16] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:24:21,873 127.0.0.1 - - [02/Aug/2026 14:24:21] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:24:26,891 127.0.0.1 - - [02/Aug/2026 14:24:26] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:24:31,989 127.0.0.1 - - [02/Aug/2026 14:24:31] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:24:36,890 127.0.0.1 - - [02/Aug/2026 14:24:36] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:24:42,016 127.0.0.1 - - [02/Aug/2026 14:24:42] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:24:46,960 127.0.0.1 - - [02/Aug/2026 14:24:46] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:24:51,875 127.0.0.1 - - [02/Aug/2026 14:24:51] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:24:56,899 127.0.0.1 - - [02/Aug/2026 14:24:56] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:25:01,964 127.0.0.1 - - [02/Aug/2026 14:25:01] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:25:06,913 127.0.0.1 - - [02/Aug/2026 14:25:06] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:25:11,907 127.0.0.1 - - [02/Aug/2026 14:25:11] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:25:16,946 127.0.0.1 - - [02/Aug/2026 14:25:16] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:25:21,900 127.0.0.1 - - [02/Aug/2026 14:25:21] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:25:26,872 127.0.0.1 - - [02/Aug/2026 14:25:26] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:25:32,069 127.0.0.1 - - [02/Aug/2026 14:25:32] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:25:36,900 127.0.0.1 - - [02/Aug/2026 14:25:36] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:25:41,891 127.0.0.1 - - [02/Aug/2026 14:25:41] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:25:46,971 127.0.0.1 - - [02/Aug/2026 14:25:46] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:25:51,936 127.0.0.1 - - [02/Aug/2026 14:25:51] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:25:56,905 127.0.0.1 - - [02/Aug/2026 14:25:56] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:26:01,962 127.0.0.1 - - [02/Aug/2026 14:26:01] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:26:06,891 127.0.0.1 - - [02/Aug/2026 14:26:06] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:26:11,991 127.0.0.1 - - [02/Aug/2026 14:26:11] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:26:16,984 127.0.0.1 - - [02/Aug/2026 14:26:16] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:26:21,920 127.0.0.1 - - [02/Aug/2026 14:26:21] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:26:27,009 127.0.0.1 - - [02/Aug/2026 14:26:27] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:26:31,995 127.0.0.1 - - [02/Aug/2026 14:26:31] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:26:36,900 127.0.0.1 - - [02/Aug/2026 14:26:36] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:26:41,893 127.0.0.1 - - [02/Aug/2026 14:26:41] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:26:46,992 127.0.0.1 - - [02/Aug/2026 14:26:46] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:26:51,897 127.0.0.1 - - [02/Aug/2026 14:26:51] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:26:56,888 127.0.0.1 - - [02/Aug/2026 14:26:56] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:27:01,980 127.0.0.1 - - [02/Aug/2026 14:27:01] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:27:06,887 127.0.0.1 - - [02/Aug/2026 14:27:06] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:27:13,070 127.0.0.1 - - [02/Aug/2026 14:27:13] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:27:17,081 127.0.0.1 - - [02/Aug/2026 14:27:17] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:27:21,993 127.0.0.1 - - [02/Aug/2026 14:27:21] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:27:26,944 127.0.0.1 - - [02/Aug/2026 14:27:26] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:27:31,974 127.0.0.1 - - [02/Aug/2026 14:27:31] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:27:36,993 127.0.0.1 - - [02/Aug/2026 14:27:36] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:27:41,892 127.0.0.1 - - [02/Aug/2026 14:27:41] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:27:46,981 127.0.0.1 - - [02/Aug/2026 14:27:46] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:27:51,911 127.0.0.1 - - [02/Aug/2026 14:27:51] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:27:56,916 127.0.0.1 - - [02/Aug/2026 14:27:56] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:28:01,979 127.0.0.1 - - [02/Aug/2026 14:28:01] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:28:06,908 127.0.0.1 - - [02/Aug/2026 14:28:06] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:28:12,011 127.0.0.1 - - [02/Aug/2026 14:28:12] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:28:16,981 127.0.0.1 - - [02/Aug/2026 14:28:16] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:28:21,913 127.0.0.1 - - [02/Aug/2026 14:28:21] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:28:26,896 127.0.0.1 - - [02/Aug/2026 14:28:26] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:28:32,003 127.0.0.1 - - [02/Aug/2026 14:28:32] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:28:36,907 127.0.0.1 - - [02/Aug/2026 14:28:36] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:28:41,930 127.0.0.1 - - [02/Aug/2026 14:28:41] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:28:46,967 127.0.0.1 - - [02/Aug/2026 14:28:46] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:28:51,904 127.0.0.1 - - [02/Aug/2026 14:28:51] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:28:56,920 127.0.0.1 - - [02/Aug/2026 14:28:56] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:29:01,976 127.0.0.1 - - [02/Aug/2026 14:29:01] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:29:06,921 127.0.0.1 - - [02/Aug/2026 14:29:06] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:29:11,932 127.0.0.1 - - [02/Aug/2026 14:29:11] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:29:16,985 127.0.0.1 - - [02/Aug/2026 14:29:16] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:29:22,009 127.0.0.1 - - [02/Aug/2026 14:29:22] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:29:26,901 127.0.0.1 - - [02/Aug/2026 14:29:26] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:29:31,980 127.0.0.1 - - [02/Aug/2026 14:29:31] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:29:37,005 127.0.0.1 - - [02/Aug/2026 14:29:37] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:29:42,011 127.0.0.1 - - [02/Aug/2026 14:29:42] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:29:47,068 127.0.0.1 - - [02/Aug/2026 14:29:47] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:29:51,913 127.0.0.1 - - [02/Aug/2026 14:29:51] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:29:56,911 127.0.0.1 - - [02/Aug/2026 14:29:56] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:30:02,027 127.0.0.1 - - [02/Aug/2026 14:30:02] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:30:06,903 127.0.0.1 - - [02/Aug/2026 14:30:06] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:30:11,910 127.0.0.1 - - [02/Aug/2026 14:30:11] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:30:17,010 127.0.0.1 - - [02/Aug/2026 14:30:17] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:30:21,931 127.0.0.1 - - [02/Aug/2026 14:30:21] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:30:26,905 127.0.0.1 - - [02/Aug/2026 14:30:26] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:30:31,984 127.0.0.1 - - [02/Aug/2026 14:30:31] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:30:37,010 127.0.0.1 - - [02/Aug/2026 14:30:37] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:30:41,903 127.0.0.1 - - [02/Aug/2026 14:30:41] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:30:46,683 skip KXDOGE15M-26AUG021745-45: no swing (0.044% < 0.06%) +2026-08-02 14:30:46,986 127.0.0.1 - - [02/Aug/2026 14:30:46] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:30:52,023 127.0.0.1 - - [02/Aug/2026 14:30:52] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:30:56,926 127.0.0.1 - - [02/Aug/2026 14:30:56] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:31:02,005 127.0.0.1 - - [02/Aug/2026 14:31:02] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:31:06,939 127.0.0.1 - - [02/Aug/2026 14:31:06] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:31:11,936 127.0.0.1 - - [02/Aug/2026 14:31:11] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:31:17,035 127.0.0.1 - - [02/Aug/2026 14:31:17] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:31:21,976 127.0.0.1 - - [02/Aug/2026 14:31:21] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:31:26,934 127.0.0.1 - - [02/Aug/2026 14:31:26] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:31:32,009 127.0.0.1 - - [02/Aug/2026 14:31:32] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:31:36,938 127.0.0.1 - - [02/Aug/2026 14:31:36] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:31:41,934 127.0.0.1 - - [02/Aug/2026 14:31:41] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:31:47,090 127.0.0.1 - - [02/Aug/2026 14:31:47] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:31:51,925 127.0.0.1 - - [02/Aug/2026 14:31:51] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:31:56,991 127.0.0.1 - - [02/Aug/2026 14:31:56] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:32:02,071 127.0.0.1 - - [02/Aug/2026 14:32:02] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:32:07,027 127.0.0.1 - - [02/Aug/2026 14:32:07] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:32:11,950 127.0.0.1 - - [02/Aug/2026 14:32:11] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:32:18,061 127.0.0.1 - - [02/Aug/2026 14:32:18] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:32:21,942 127.0.0.1 - - [02/Aug/2026 14:32:21] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:32:27,040 127.0.0.1 - - [02/Aug/2026 14:32:27] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:32:32,045 127.0.0.1 - - [02/Aug/2026 14:32:32] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:32:36,942 127.0.0.1 - - [02/Aug/2026 14:32:36] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:32:41,949 127.0.0.1 - - [02/Aug/2026 14:32:41] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:32:47,046 127.0.0.1 - - [02/Aug/2026 14:32:47] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:32:51,982 127.0.0.1 - - [02/Aug/2026 14:32:51] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:32:56,990 127.0.0.1 - - [02/Aug/2026 14:32:56] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:33:02,120 127.0.0.1 - - [02/Aug/2026 14:33:02] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:33:07,058 127.0.0.1 - - [02/Aug/2026 14:33:07] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:33:11,957 127.0.0.1 - - [02/Aug/2026 14:33:11] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:33:17,036 127.0.0.1 - - [02/Aug/2026 14:33:17] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:33:21,988 127.0.0.1 - - [02/Aug/2026 14:33:21] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:33:26,961 127.0.0.1 - - [02/Aug/2026 14:33:26] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:33:32,006 127.0.0.1 - - [02/Aug/2026 14:33:32] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:33:36,970 127.0.0.1 - - [02/Aug/2026 14:33:36] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:33:41,958 127.0.0.1 - - [02/Aug/2026 14:33:41] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:33:47,044 127.0.0.1 - - [02/Aug/2026 14:33:47] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:33:51,991 127.0.0.1 - - [02/Aug/2026 14:33:51] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:33:56,954 127.0.0.1 - - [02/Aug/2026 14:33:56] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:34:02,103 127.0.0.1 - - [02/Aug/2026 14:34:02] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:34:06,970 127.0.0.1 - - [02/Aug/2026 14:34:06] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:34:12,023 127.0.0.1 - - [02/Aug/2026 14:34:12] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:34:17,038 127.0.0.1 - - [02/Aug/2026 14:34:17] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:34:21,971 127.0.0.1 - - [02/Aug/2026 14:34:21] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:34:26,973 127.0.0.1 - - [02/Aug/2026 14:34:26] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:34:32,055 127.0.0.1 - - [02/Aug/2026 14:34:32] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:34:36,967 127.0.0.1 - - [02/Aug/2026 14:34:36] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:34:41,992 127.0.0.1 - - [02/Aug/2026 14:34:41] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:34:47,061 127.0.0.1 - - [02/Aug/2026 14:34:47] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:34:51,970 127.0.0.1 - - [02/Aug/2026 14:34:51] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:34:56,978 127.0.0.1 - - [02/Aug/2026 14:34:56] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:35:02,187 127.0.0.1 - - [02/Aug/2026 14:35:02] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:35:06,985 127.0.0.1 - - [02/Aug/2026 14:35:06] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:35:12,013 127.0.0.1 - - [02/Aug/2026 14:35:12] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:35:17,159 127.0.0.1 - - [02/Aug/2026 14:35:17] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:35:21,990 127.0.0.1 - - [02/Aug/2026 14:35:21] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:35:27,001 127.0.0.1 - - [02/Aug/2026 14:35:27] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:35:32,069 127.0.0.1 - - [02/Aug/2026 14:35:32] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:35:36,989 127.0.0.1 - - [02/Aug/2026 14:35:36] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:35:42,010 127.0.0.1 - - [02/Aug/2026 14:35:42] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:35:47,131 127.0.0.1 - - [02/Aug/2026 14:35:47] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:35:52,096 127.0.0.1 - - [02/Aug/2026 14:35:52] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:35:57,016 127.0.0.1 - - [02/Aug/2026 14:35:57] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:36:02,074 127.0.0.1 - - [02/Aug/2026 14:36:02] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:36:07,008 127.0.0.1 - - [02/Aug/2026 14:36:07] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:36:12,013 127.0.0.1 - - [02/Aug/2026 14:36:12] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:36:17,066 127.0.0.1 - - [02/Aug/2026 14:36:17] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:36:22,097 127.0.0.1 - - [02/Aug/2026 14:36:22] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:36:27,044 127.0.0.1 - - [02/Aug/2026 14:36:27] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:36:32,098 127.0.0.1 - - [02/Aug/2026 14:36:32] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:36:37,004 127.0.0.1 - - [02/Aug/2026 14:36:37] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:36:42,110 127.0.0.1 - - [02/Aug/2026 14:36:42] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:36:47,093 127.0.0.1 - - [02/Aug/2026 14:36:47] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:36:52,144 127.0.0.1 - - [02/Aug/2026 14:36:52] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:36:57,057 127.0.0.1 - - [02/Aug/2026 14:36:57] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:37:02,090 127.0.0.1 - - [02/Aug/2026 14:37:02] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:37:07,048 127.0.0.1 - - [02/Aug/2026 14:37:07] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:37:12,058 127.0.0.1 - - [02/Aug/2026 14:37:12] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:37:17,081 127.0.0.1 - - [02/Aug/2026 14:37:17] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:37:26,203 127.0.0.1 - - [02/Aug/2026 14:37:26] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:37:27,120 127.0.0.1 - - [02/Aug/2026 14:37:27] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:37:32,213 127.0.0.1 - - [02/Aug/2026 14:37:32] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:37:37,130 127.0.0.1 - - [02/Aug/2026 14:37:37] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:37:42,029 127.0.0.1 - - [02/Aug/2026 14:37:42] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:37:47,097 127.0.0.1 - - [02/Aug/2026 14:37:47] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:37:52,037 127.0.0.1 - - [02/Aug/2026 14:37:52] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:37:57,036 127.0.0.1 - - [02/Aug/2026 14:37:57] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:38:02,125 127.0.0.1 - - [02/Aug/2026 14:38:02] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:38:07,069 127.0.0.1 - - [02/Aug/2026 14:38:07] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:38:12,027 127.0.0.1 - - [02/Aug/2026 14:38:12] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:38:17,116 127.0.0.1 - - [02/Aug/2026 14:38:17] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:38:22,071 127.0.0.1 - - [02/Aug/2026 14:38:22] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:38:27,036 127.0.0.1 - - [02/Aug/2026 14:38:27] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:38:32,209 127.0.0.1 - - [02/Aug/2026 14:38:32] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:38:37,029 127.0.0.1 - - [02/Aug/2026 14:38:37] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:38:42,042 127.0.0.1 - - [02/Aug/2026 14:38:42] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:38:47,100 127.0.0.1 - - [02/Aug/2026 14:38:47] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:38:52,040 127.0.0.1 - - [02/Aug/2026 14:38:52] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:38:57,039 127.0.0.1 - - [02/Aug/2026 14:38:57] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:39:02,140 127.0.0.1 - - [02/Aug/2026 14:39:02] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:39:07,032 127.0.0.1 - - [02/Aug/2026 14:39:07] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:39:12,141 127.0.0.1 - - [02/Aug/2026 14:39:12] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:39:17,111 127.0.0.1 - - [02/Aug/2026 14:39:17] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:39:22,048 127.0.0.1 - - [02/Aug/2026 14:39:22] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:39:27,052 127.0.0.1 - - [02/Aug/2026 14:39:27] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:39:32,233 127.0.0.1 - - [02/Aug/2026 14:39:32] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:39:37,045 127.0.0.1 - - [02/Aug/2026 14:39:37] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:39:42,035 127.0.0.1 - - [02/Aug/2026 14:39:42] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:39:47,119 127.0.0.1 - - [02/Aug/2026 14:39:47] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:39:52,034 127.0.0.1 - - [02/Aug/2026 14:39:52] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:39:57,050 127.0.0.1 - - [02/Aug/2026 14:39:57] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:40:02,149 127.0.0.1 - - [02/Aug/2026 14:40:02] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:40:07,022 127.0.0.1 - - [02/Aug/2026 14:40:07] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:40:12,161 127.0.0.1 - - [02/Aug/2026 14:40:12] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:40:17,239 127.0.0.1 - - [02/Aug/2026 14:40:17] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:40:22,095 127.0.0.1 - - [02/Aug/2026 14:40:22] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:40:27,052 127.0.0.1 - - [02/Aug/2026 14:40:27] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:40:32,116 127.0.0.1 - - [02/Aug/2026 14:40:32] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:40:37,037 127.0.0.1 - - [02/Aug/2026 14:40:37] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:40:42,058 127.0.0.1 - - [02/Aug/2026 14:40:42] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:40:47,114 127.0.0.1 - - [02/Aug/2026 14:40:47] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:40:52,043 127.0.0.1 - - [02/Aug/2026 14:40:52] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:40:57,086 127.0.0.1 - - [02/Aug/2026 14:40:57] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:41:02,139 127.0.0.1 - - [02/Aug/2026 14:41:02] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:41:07,040 127.0.0.1 - - [02/Aug/2026 14:41:07] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:41:12,059 127.0.0.1 - - [02/Aug/2026 14:41:12] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:41:17,124 127.0.0.1 - - [02/Aug/2026 14:41:17] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:41:22,054 127.0.0.1 - - [02/Aug/2026 14:41:22] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:41:27,065 127.0.0.1 - - [02/Aug/2026 14:41:27] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:41:32,157 127.0.0.1 - - [02/Aug/2026 14:41:32] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:41:37,062 127.0.0.1 - - [02/Aug/2026 14:41:37] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:41:42,067 127.0.0.1 - - [02/Aug/2026 14:41:42] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:41:47,126 127.0.0.1 - - [02/Aug/2026 14:41:47] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:41:52,053 127.0.0.1 - - [02/Aug/2026 14:41:52] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:41:57,163 127.0.0.1 - - [02/Aug/2026 14:41:57] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:42:02,161 127.0.0.1 - - [02/Aug/2026 14:42:02] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:42:07,060 127.0.0.1 - - [02/Aug/2026 14:42:07] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:42:12,076 127.0.0.1 - - [02/Aug/2026 14:42:12] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:42:17,233 127.0.0.1 - - [02/Aug/2026 14:42:17] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:42:22,077 127.0.0.1 - - [02/Aug/2026 14:42:22] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:42:33,225 127.0.0.1 - - [02/Aug/2026 14:42:33] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:42:34,495 127.0.0.1 - - [02/Aug/2026 14:42:34] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:42:37,182 127.0.0.1 - - [02/Aug/2026 14:42:37] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:42:42,096 127.0.0.1 - - [02/Aug/2026 14:42:42] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:42:47,231 127.0.0.1 - - [02/Aug/2026 14:42:47] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:42:52,167 127.0.0.1 - - [02/Aug/2026 14:42:52] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:42:57,181 127.0.0.1 - - [02/Aug/2026 14:42:57] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:43:02,148 127.0.0.1 - - [02/Aug/2026 14:43:02] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:43:07,084 127.0.0.1 - - [02/Aug/2026 14:43:07] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:43:12,097 127.0.0.1 - - [02/Aug/2026 14:43:12] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:43:17,160 127.0.0.1 - - [02/Aug/2026 14:43:17] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:43:22,104 127.0.0.1 - - [02/Aug/2026 14:43:22] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:43:27,086 127.0.0.1 - - [02/Aug/2026 14:43:27] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:43:32,255 127.0.0.1 - - [02/Aug/2026 14:43:32] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:43:37,081 127.0.0.1 - - [02/Aug/2026 14:43:37] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:43:42,104 127.0.0.1 - - [02/Aug/2026 14:43:42] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:43:47,152 127.0.0.1 - - [02/Aug/2026 14:43:47] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:43:52,090 127.0.0.1 - - [02/Aug/2026 14:43:52] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:43:57,083 127.0.0.1 - - [02/Aug/2026 14:43:57] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:44:02,185 127.0.0.1 - - [02/Aug/2026 14:44:02] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:44:07,090 127.0.0.1 - - [02/Aug/2026 14:44:07] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:44:12,152 127.0.0.1 - - [02/Aug/2026 14:44:12] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:44:17,166 127.0.0.1 - - [02/Aug/2026 14:44:17] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:44:22,118 127.0.0.1 - - [02/Aug/2026 14:44:22] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:44:27,145 127.0.0.1 - - [02/Aug/2026 14:44:27] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:44:32,298 127.0.0.1 - - [02/Aug/2026 14:44:32] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:44:37,190 127.0.0.1 - - [02/Aug/2026 14:44:37] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:44:42,120 127.0.0.1 - - [02/Aug/2026 14:44:42] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:44:47,178 127.0.0.1 - - [02/Aug/2026 14:44:47] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:44:52,123 127.0.0.1 - - [02/Aug/2026 14:44:52] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:44:57,120 127.0.0.1 - - [02/Aug/2026 14:44:57] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:45:02,195 127.0.0.1 - - [02/Aug/2026 14:45:02] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:45:07,211 127.0.0.1 - - [02/Aug/2026 14:45:07] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:45:12,228 127.0.0.1 - - [02/Aug/2026 14:45:12] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:45:17,190 127.0.0.1 - - [02/Aug/2026 14:45:17] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:45:22,112 127.0.0.1 - - [02/Aug/2026 14:45:22] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:45:27,129 127.0.0.1 - - [02/Aug/2026 14:45:27] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:45:32,213 127.0.0.1 - - [02/Aug/2026 14:45:32] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:45:37,126 127.0.0.1 - - [02/Aug/2026 14:45:37] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:45:42,245 127.0.0.1 - - [02/Aug/2026 14:45:42] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:45:47,197 127.0.0.1 - - [02/Aug/2026 14:45:47] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:45:48,851 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-02 14:45:52,139 127.0.0.1 - - [02/Aug/2026 14:45:52] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:45:57,133 127.0.0.1 - - [02/Aug/2026 14:45:57] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:46:02,309 127.0.0.1 - - [02/Aug/2026 14:46:02] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:46:07,141 127.0.0.1 - - [02/Aug/2026 14:46:07] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:46:12,159 127.0.0.1 - - [02/Aug/2026 14:46:12] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:46:15,201 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-02 14:46:17,211 127.0.0.1 - - [02/Aug/2026 14:46:17] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:46:22,245 127.0.0.1 - - [02/Aug/2026 14:46:22] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:46:27,132 127.0.0.1 - - [02/Aug/2026 14:46:27] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:46:32,213 127.0.0.1 - - [02/Aug/2026 14:46:32] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:46:36,897 skip KXDOGE15M-26AUG021800-00: llm vetoes fade: wants SKIP +2026-08-02 14:46:37,156 127.0.0.1 - - [02/Aug/2026 14:46:37] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:46:42,143 127.0.0.1 - - [02/Aug/2026 14:46:42] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:46:47,221 127.0.0.1 - - [02/Aug/2026 14:46:47] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:46:52,133 127.0.0.1 - - [02/Aug/2026 14:46:52] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:46:57,148 127.0.0.1 - - [02/Aug/2026 14:46:57] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:47:02,229 127.0.0.1 - - [02/Aug/2026 14:47:02] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:47:07,147 127.0.0.1 - - [02/Aug/2026 14:47:07] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:47:12,178 127.0.0.1 - - [02/Aug/2026 14:47:12] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:47:17,214 127.0.0.1 - - [02/Aug/2026 14:47:17] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:47:22,258 127.0.0.1 - - [02/Aug/2026 14:47:22] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:47:27,274 127.0.0.1 - - [02/Aug/2026 14:47:27] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:47:32,268 127.0.0.1 - - [02/Aug/2026 14:47:32] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:47:38,210 127.0.0.1 - - [02/Aug/2026 14:47:38] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:47:42,156 127.0.0.1 - - [02/Aug/2026 14:47:42] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:47:47,393 127.0.0.1 - - [02/Aug/2026 14:47:47] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:47:52,173 127.0.0.1 - - [02/Aug/2026 14:47:52] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:47:57,174 127.0.0.1 - - [02/Aug/2026 14:47:57] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:48:02,249 127.0.0.1 - - [02/Aug/2026 14:48:02] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:48:07,261 127.0.0.1 - - [02/Aug/2026 14:48:07] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:48:12,278 127.0.0.1 - - [02/Aug/2026 14:48:12] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:48:17,298 127.0.0.1 - - [02/Aug/2026 14:48:17] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:48:22,342 127.0.0.1 - - [02/Aug/2026 14:48:22] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:48:27,180 127.0.0.1 - - [02/Aug/2026 14:48:27] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:48:32,181 127.0.0.1 - - [02/Aug/2026 14:48:32] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:48:37,281 127.0.0.1 - - [02/Aug/2026 14:48:37] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:48:42,193 127.0.0.1 - - [02/Aug/2026 14:48:42] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:48:47,215 127.0.0.1 - - [02/Aug/2026 14:48:47] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:48:52,185 127.0.0.1 - - [02/Aug/2026 14:48:52] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:48:57,359 127.0.0.1 - - [02/Aug/2026 14:48:57] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:49:02,195 127.0.0.1 - - [02/Aug/2026 14:49:02] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:49:07,193 127.0.0.1 - - [02/Aug/2026 14:49:07] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:49:12,206 127.0.0.1 - - [02/Aug/2026 14:49:12] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:49:17,261 127.0.0.1 - - [02/Aug/2026 14:49:17] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:49:22,394 127.0.0.1 - - [02/Aug/2026 14:49:22] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:49:27,206 127.0.0.1 - - [02/Aug/2026 14:49:27] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:49:32,204 127.0.0.1 - - [02/Aug/2026 14:49:32] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:49:37,268 127.0.0.1 - - [02/Aug/2026 14:49:37] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:49:42,213 127.0.0.1 - - [02/Aug/2026 14:49:42] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:49:47,195 127.0.0.1 - - [02/Aug/2026 14:49:47] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:49:52,209 127.0.0.1 - - [02/Aug/2026 14:49:52] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:49:57,316 127.0.0.1 - - [02/Aug/2026 14:49:57] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:50:02,207 127.0.0.1 - - [02/Aug/2026 14:50:02] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:50:07,205 127.0.0.1 - - [02/Aug/2026 14:50:07] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:50:12,223 127.0.0.1 - - [02/Aug/2026 14:50:12] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:50:17,278 127.0.0.1 - - [02/Aug/2026 14:50:17] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:50:22,217 127.0.0.1 - - [02/Aug/2026 14:50:22] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:50:27,207 127.0.0.1 - - [02/Aug/2026 14:50:27] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:50:32,212 127.0.0.1 - - [02/Aug/2026 14:50:32] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:50:37,420 127.0.0.1 - - [02/Aug/2026 14:50:37] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:50:42,211 127.0.0.1 - - [02/Aug/2026 14:50:42] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:50:47,224 127.0.0.1 - - [02/Aug/2026 14:50:47] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:50:52,437 127.0.0.1 - - [02/Aug/2026 14:50:52] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:50:57,235 127.0.0.1 - - [02/Aug/2026 14:50:57] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:51:02,232 127.0.0.1 - - [02/Aug/2026 14:51:02] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:51:07,232 127.0.0.1 - - [02/Aug/2026 14:51:07] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:51:12,303 127.0.0.1 - - [02/Aug/2026 14:51:12] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:51:17,231 127.0.0.1 - - [02/Aug/2026 14:51:17] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:51:22,243 127.0.0.1 - - [02/Aug/2026 14:51:22] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:51:27,232 127.0.0.1 - - [02/Aug/2026 14:51:27] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:51:32,395 127.0.0.1 - - [02/Aug/2026 14:51:32] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:51:37,244 127.0.0.1 - - [02/Aug/2026 14:51:37] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:51:42,254 127.0.0.1 - - [02/Aug/2026 14:51:42] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:51:47,321 127.0.0.1 - - [02/Aug/2026 14:51:47] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:51:52,248 127.0.0.1 - - [02/Aug/2026 14:51:52] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:51:57,234 127.0.0.1 - - [02/Aug/2026 14:51:57] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:52:02,504 127.0.0.1 - - [02/Aug/2026 14:52:02] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:52:07,270 127.0.0.1 - - [02/Aug/2026 14:52:07] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:52:12,287 127.0.0.1 - - [02/Aug/2026 14:52:12] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:52:17,232 127.0.0.1 - - [02/Aug/2026 14:52:17] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:52:22,300 127.0.0.1 - - [02/Aug/2026 14:52:22] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:52:27,239 127.0.0.1 - - [02/Aug/2026 14:52:27] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:52:32,246 127.0.0.1 - - [02/Aug/2026 14:52:32] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:52:37,413 127.0.0.1 - - [02/Aug/2026 14:52:37] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:52:43,351 127.0.0.1 - - [02/Aug/2026 14:52:43] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:52:47,276 127.0.0.1 - - [02/Aug/2026 14:52:47] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:52:52,399 127.0.0.1 - - [02/Aug/2026 14:52:52] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:52:57,269 127.0.0.1 - - [02/Aug/2026 14:52:57] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:53:02,271 127.0.0.1 - - [02/Aug/2026 14:53:02] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:53:07,341 127.0.0.1 - - [02/Aug/2026 14:53:07] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:53:12,333 127.0.0.1 - - [02/Aug/2026 14:53:12] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:53:17,286 127.0.0.1 - - [02/Aug/2026 14:53:17] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:53:22,346 127.0.0.1 - - [02/Aug/2026 14:53:22] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:53:27,262 127.0.0.1 - - [02/Aug/2026 14:53:27] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:53:32,361 127.0.0.1 - - [02/Aug/2026 14:53:32] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:53:37,464 127.0.0.1 - - [02/Aug/2026 14:53:37] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:53:42,394 127.0.0.1 - - [02/Aug/2026 14:53:42] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:53:47,265 127.0.0.1 - - [02/Aug/2026 14:53:47] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:53:52,477 127.0.0.1 - - [02/Aug/2026 14:53:52] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:53:57,295 127.0.0.1 - - [02/Aug/2026 14:53:57] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:54:02,394 127.0.0.1 - - [02/Aug/2026 14:54:02] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:54:07,357 127.0.0.1 - - [02/Aug/2026 14:54:07] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:54:12,290 127.0.0.1 - - [02/Aug/2026 14:54:12] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:54:17,279 127.0.0.1 - - [02/Aug/2026 14:54:17] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:54:22,489 127.0.0.1 - - [02/Aug/2026 14:54:22] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:54:27,285 127.0.0.1 - - [02/Aug/2026 14:54:27] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:54:32,298 127.0.0.1 - - [02/Aug/2026 14:54:32] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:54:37,369 127.0.0.1 - - [02/Aug/2026 14:54:37] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:54:42,472 127.0.0.1 - - [02/Aug/2026 14:54:42] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:54:47,411 127.0.0.1 - - [02/Aug/2026 14:54:47] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:54:52,373 127.0.0.1 - - [02/Aug/2026 14:54:52] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:54:57,291 127.0.0.1 - - [02/Aug/2026 14:54:57] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:55:02,484 127.0.0.1 - - [02/Aug/2026 14:55:02] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:55:07,391 127.0.0.1 - - [02/Aug/2026 14:55:07] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:55:12,489 127.0.0.1 - - [02/Aug/2026 14:55:12] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:55:17,298 127.0.0.1 - - [02/Aug/2026 14:55:17] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:55:22,371 127.0.0.1 - - [02/Aug/2026 14:55:22] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:55:27,302 127.0.0.1 - - [02/Aug/2026 14:55:27] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:55:32,397 127.0.0.1 - - [02/Aug/2026 14:55:32] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:55:37,457 127.0.0.1 - - [02/Aug/2026 14:55:37] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:55:42,398 127.0.0.1 - - [02/Aug/2026 14:55:42] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:55:47,314 127.0.0.1 - - [02/Aug/2026 14:55:47] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:55:52,480 127.0.0.1 - - [02/Aug/2026 14:55:52] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:55:57,305 127.0.0.1 - - [02/Aug/2026 14:55:57] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:56:02,401 127.0.0.1 - - [02/Aug/2026 14:56:02] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:56:07,463 127.0.0.1 - - [02/Aug/2026 14:56:07] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:56:12,351 127.0.0.1 - - [02/Aug/2026 14:56:12] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:56:17,374 127.0.0.1 - - [02/Aug/2026 14:56:17] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:56:22,492 127.0.0.1 - - [02/Aug/2026 14:56:22] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:56:27,344 127.0.0.1 - - [02/Aug/2026 14:56:27] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:56:32,400 127.0.0.1 - - [02/Aug/2026 14:56:32] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:56:38,913 127.0.0.1 - - [02/Aug/2026 14:56:38] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:56:43,974 127.0.0.1 - - [02/Aug/2026 14:56:43] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:56:57,612 127.0.0.1 - - [02/Aug/2026 14:56:57] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:57:11,345 127.0.0.1 - - [02/Aug/2026 14:57:11] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:57:39,386 127.0.0.1 - - [02/Aug/2026 14:57:39] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:58:24,437 127.0.0.1 - - [02/Aug/2026 14:58:24] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:58:33,194 127.0.0.1 - - [02/Aug/2026 14:58:33] "GET /api/state HTTP/1.1" 200 - +2026-08-02 14:59:49,701 127.0.0.1 - - [02/Aug/2026 14:59:49] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:00:00,323 127.0.0.1 - - [02/Aug/2026 15:00:00] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:00:41,194 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-02 15:01:02,733 skip KXDOGE15M-26AUG021815-15: no swing (0.038% < 0.06%) +2026-08-02 15:02:33,255 127.0.0.1 - - [02/Aug/2026 15:02:33] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:05:04,179 127.0.0.1 - - [02/Aug/2026 15:05:04] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:10:10,305 127.0.0.1 - - [02/Aug/2026 15:10:10] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:14:56,954 127.0.0.1 - - [02/Aug/2026 15:14:56] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:16:01,078 skip KXDOGE15M-26AUG021830-30: no swing (0.023% < 0.06%) +2026-08-02 15:17:54,566 127.0.0.1 - - [02/Aug/2026 15:17:54] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:17:58,222 127.0.0.1 - - [02/Aug/2026 15:17:58] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:18:03,233 127.0.0.1 - - [02/Aug/2026 15:18:03] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:18:08,216 127.0.0.1 - - [02/Aug/2026 15:18:08] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:18:13,285 127.0.0.1 - - [02/Aug/2026 15:18:13] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:18:18,201 127.0.0.1 - - [02/Aug/2026 15:18:18] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:18:21,258 127.0.0.1 - - [02/Aug/2026 15:18:21] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:18:23,204 127.0.0.1 - - [02/Aug/2026 15:18:23] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:18:28,206 127.0.0.1 - - [02/Aug/2026 15:18:28] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:18:33,417 127.0.0.1 - - [02/Aug/2026 15:18:33] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:18:38,226 127.0.0.1 - - [02/Aug/2026 15:18:38] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:18:43,229 127.0.0.1 - - [02/Aug/2026 15:18:43] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:18:48,418 127.0.0.1 - - [02/Aug/2026 15:18:48] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:18:53,224 127.0.0.1 - - [02/Aug/2026 15:18:53] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:18:58,218 127.0.0.1 - - [02/Aug/2026 15:18:58] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:19:03,242 127.0.0.1 - - [02/Aug/2026 15:19:03] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:19:08,286 127.0.0.1 - - [02/Aug/2026 15:19:08] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:19:13,205 127.0.0.1 - - [02/Aug/2026 15:19:13] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:19:17,969 K4LSH1_OPS online — mode=AUTO dry_run=False stake=15¢ +2026-08-02 15:19:18,271 127.0.0.1 - - [02/Aug/2026 15:19:18] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:19:23,214 127.0.0.1 - - [02/Aug/2026 15:19:23] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:19:28,438 skip KXDOGE15M-26AUG021830-30: llm vetoes fade: wants DOWN +2026-08-02 15:19:28,443 127.0.0.1 - - [02/Aug/2026 15:19:28] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:19:33,219 127.0.0.1 - - [02/Aug/2026 15:19:33] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:19:38,219 127.0.0.1 - - [02/Aug/2026 15:19:38] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:19:43,244 127.0.0.1 - - [02/Aug/2026 15:19:43] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:19:48,314 127.0.0.1 - - [02/Aug/2026 15:19:48] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:19:53,201 127.0.0.1 - - [02/Aug/2026 15:19:53] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:19:58,212 127.0.0.1 - - [02/Aug/2026 15:19:58] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:20:03,212 127.0.0.1 - - [02/Aug/2026 15:20:03] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:20:08,385 127.0.0.1 - - [02/Aug/2026 15:20:08] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:20:13,308 127.0.0.1 - - [02/Aug/2026 15:20:13] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:20:18,237 127.0.0.1 - - [02/Aug/2026 15:20:18] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:20:23,224 127.0.0.1 - - [02/Aug/2026 15:20:23] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:20:28,274 127.0.0.1 - - [02/Aug/2026 15:20:28] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:20:33,238 127.0.0.1 - - [02/Aug/2026 15:20:33] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:20:38,232 127.0.0.1 - - [02/Aug/2026 15:20:38] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:20:43,236 127.0.0.1 - - [02/Aug/2026 15:20:43] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:20:48,305 127.0.0.1 - - [02/Aug/2026 15:20:48] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:20:53,232 127.0.0.1 - - [02/Aug/2026 15:20:53] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:20:58,233 127.0.0.1 - - [02/Aug/2026 15:20:58] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:21:03,344 127.0.0.1 - - [02/Aug/2026 15:21:03] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:21:08,393 127.0.0.1 - - [02/Aug/2026 15:21:08] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:21:13,238 127.0.0.1 - - [02/Aug/2026 15:21:13] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:21:18,352 127.0.0.1 - - [02/Aug/2026 15:21:18] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:21:23,243 127.0.0.1 - - [02/Aug/2026 15:21:23] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:21:28,324 127.0.0.1 - - [02/Aug/2026 15:21:28] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:21:33,247 127.0.0.1 - - [02/Aug/2026 15:21:33] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:21:38,314 127.0.0.1 - - [02/Aug/2026 15:21:38] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:21:43,240 127.0.0.1 - - [02/Aug/2026 15:21:43] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:21:48,320 127.0.0.1 - - [02/Aug/2026 15:21:48] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:21:53,266 127.0.0.1 - - [02/Aug/2026 15:21:53] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:21:58,342 127.0.0.1 - - [02/Aug/2026 15:21:58] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:22:03,366 127.0.0.1 - - [02/Aug/2026 15:22:03] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:22:08,279 127.0.0.1 - - [02/Aug/2026 15:22:08] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:22:09,915 127.0.0.1 - - [02/Aug/2026 15:22:09] "GET / HTTP/1.1" 200 - +2026-08-02 15:22:10,619 127.0.0.1 - - [02/Aug/2026 15:22:10] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:22:15,593 127.0.0.1 - - [02/Aug/2026 15:22:15] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:22:20,680 127.0.0.1 - - [02/Aug/2026 15:22:20] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:22:25,629 127.0.0.1 - - [02/Aug/2026 15:22:25] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:22:30,645 127.0.0.1 - - [02/Aug/2026 15:22:30] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:22:35,674 127.0.0.1 - - [02/Aug/2026 15:22:35] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:22:40,669 127.0.0.1 - - [02/Aug/2026 15:22:40] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:22:45,621 127.0.0.1 - - [02/Aug/2026 15:22:45] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:22:50,671 127.0.0.1 - - [02/Aug/2026 15:22:50] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:23:04,096 127.0.0.1 - - [02/Aug/2026 15:23:04] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:23:05,773 127.0.0.1 - - [02/Aug/2026 15:23:05] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:23:09,040 127.0.0.1 - - [02/Aug/2026 15:23:09] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:23:10,613 127.0.0.1 - - [02/Aug/2026 15:23:10] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:23:15,623 127.0.0.1 - - [02/Aug/2026 15:23:15] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:23:20,651 127.0.0.1 - - [02/Aug/2026 15:23:20] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:23:25,625 127.0.0.1 - - [02/Aug/2026 15:23:25] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:23:30,601 127.0.0.1 - - [02/Aug/2026 15:23:30] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:23:35,658 127.0.0.1 - - [02/Aug/2026 15:23:35] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:23:40,614 127.0.0.1 - - [02/Aug/2026 15:23:40] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:23:45,610 127.0.0.1 - - [02/Aug/2026 15:23:45] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:23:50,764 127.0.0.1 - - [02/Aug/2026 15:23:50] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:23:55,615 127.0.0.1 - - [02/Aug/2026 15:23:55] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:24:00,716 127.0.0.1 - - [02/Aug/2026 15:24:00] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:24:05,770 127.0.0.1 - - [02/Aug/2026 15:24:05] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:24:10,604 127.0.0.1 - - [02/Aug/2026 15:24:10] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:24:15,709 127.0.0.1 - - [02/Aug/2026 15:24:15] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:24:20,684 127.0.0.1 - - [02/Aug/2026 15:24:20] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:24:25,598 127.0.0.1 - - [02/Aug/2026 15:24:25] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:24:30,631 127.0.0.1 - - [02/Aug/2026 15:24:30] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:24:35,674 127.0.0.1 - - [02/Aug/2026 15:24:35] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:24:40,609 127.0.0.1 - - [02/Aug/2026 15:24:40] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:24:45,607 127.0.0.1 - - [02/Aug/2026 15:24:45] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:24:50,753 127.0.0.1 - - [02/Aug/2026 15:24:50] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:24:55,701 127.0.0.1 - - [02/Aug/2026 15:24:55] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:25:00,703 127.0.0.1 - - [02/Aug/2026 15:25:00] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:25:05,652 127.0.0.1 - - [02/Aug/2026 15:25:05] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:25:10,602 127.0.0.1 - - [02/Aug/2026 15:25:10] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:25:15,603 127.0.0.1 - - [02/Aug/2026 15:25:15] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:25:20,661 127.0.0.1 - - [02/Aug/2026 15:25:20] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:25:25,601 127.0.0.1 - - [02/Aug/2026 15:25:25] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:25:30,720 127.0.0.1 - - [02/Aug/2026 15:25:30] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:25:35,777 127.0.0.1 - - [02/Aug/2026 15:25:35] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:25:40,629 127.0.0.1 - - [02/Aug/2026 15:25:40] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:25:45,605 127.0.0.1 - - [02/Aug/2026 15:25:45] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:25:50,796 127.0.0.1 - - [02/Aug/2026 15:25:50] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:25:55,717 127.0.0.1 - - [02/Aug/2026 15:25:55] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:26:00,665 127.0.0.1 - - [02/Aug/2026 15:26:00] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:26:05,679 127.0.0.1 - - [02/Aug/2026 15:26:05] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:26:10,644 127.0.0.1 - - [02/Aug/2026 15:26:10] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:26:15,614 127.0.0.1 - - [02/Aug/2026 15:26:15] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:26:20,731 127.0.0.1 - - [02/Aug/2026 15:26:20] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:26:25,041 127.0.0.1 - - [02/Aug/2026 15:26:25] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:26:25,616 127.0.0.1 - - [02/Aug/2026 15:26:25] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:26:26,932 127.0.0.1 - - [02/Aug/2026 15:26:26] "GET / HTTP/1.1" 200 - +2026-08-02 15:26:27,347 127.0.0.1 - - [02/Aug/2026 15:26:27] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:26:32,402 127.0.0.1 - - [02/Aug/2026 15:26:32] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:26:37,412 127.0.0.1 - - [02/Aug/2026 15:26:37] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:26:42,361 127.0.0.1 - - [02/Aug/2026 15:26:42] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:26:47,353 127.0.0.1 - - [02/Aug/2026 15:26:47] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:26:52,485 127.0.0.1 - - [02/Aug/2026 15:26:52] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:26:57,353 127.0.0.1 - - [02/Aug/2026 15:26:57] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:27:02,527 127.0.0.1 - - [02/Aug/2026 15:27:02] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:27:07,533 127.0.0.1 - - [02/Aug/2026 15:27:07] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:27:12,487 127.0.0.1 - - [02/Aug/2026 15:27:12] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:27:17,346 127.0.0.1 - - [02/Aug/2026 15:27:17] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:27:22,412 127.0.0.1 - - [02/Aug/2026 15:27:22] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:27:27,441 127.0.0.1 - - [02/Aug/2026 15:27:27] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:27:32,405 127.0.0.1 - - [02/Aug/2026 15:27:32] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:27:37,514 127.0.0.1 - - [02/Aug/2026 15:27:37] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:27:42,341 127.0.0.1 - - [02/Aug/2026 15:27:42] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:27:47,366 127.0.0.1 - - [02/Aug/2026 15:27:47] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:27:52,487 127.0.0.1 - - [02/Aug/2026 15:27:52] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:27:57,358 127.0.0.1 - - [02/Aug/2026 15:27:57] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:28:02,347 127.0.0.1 - - [02/Aug/2026 15:28:02] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:28:07,435 127.0.0.1 - - [02/Aug/2026 15:28:07] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:28:13,496 127.0.0.1 - - [02/Aug/2026 15:28:13] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:28:17,376 127.0.0.1 - - [02/Aug/2026 15:28:17] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:28:22,536 127.0.0.1 - - [02/Aug/2026 15:28:22] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:28:27,348 127.0.0.1 - - [02/Aug/2026 15:28:27] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:28:32,340 127.0.0.1 - - [02/Aug/2026 15:28:32] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:28:37,428 127.0.0.1 - - [02/Aug/2026 15:28:37] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:28:42,402 127.0.0.1 - - [02/Aug/2026 15:28:42] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:28:47,380 127.0.0.1 - - [02/Aug/2026 15:28:47] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:28:52,435 127.0.0.1 - - [02/Aug/2026 15:28:52] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:28:57,382 127.0.0.1 - - [02/Aug/2026 15:28:57] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:29:02,402 127.0.0.1 - - [02/Aug/2026 15:29:02] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:29:07,428 127.0.0.1 - - [02/Aug/2026 15:29:07] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:29:12,359 127.0.0.1 - - [02/Aug/2026 15:29:12] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:29:17,363 127.0.0.1 - - [02/Aug/2026 15:29:17] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:29:22,492 127.0.0.1 - - [02/Aug/2026 15:29:22] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:29:27,365 127.0.0.1 - - [02/Aug/2026 15:29:27] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:29:32,475 127.0.0.1 - - [02/Aug/2026 15:29:32] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:29:37,444 127.0.0.1 - - [02/Aug/2026 15:29:37] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:29:42,405 127.0.0.1 - - [02/Aug/2026 15:29:42] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:29:47,405 127.0.0.1 - - [02/Aug/2026 15:29:47] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:29:52,446 127.0.0.1 - - [02/Aug/2026 15:29:52] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:29:57,412 127.0.0.1 - - [02/Aug/2026 15:29:57] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:30:02,357 127.0.0.1 - - [02/Aug/2026 15:30:02] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:30:07,498 127.0.0.1 - - [02/Aug/2026 15:30:07] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:30:12,502 127.0.0.1 - - [02/Aug/2026 15:30:12] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:30:17,363 127.0.0.1 - - [02/Aug/2026 15:30:17] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:30:22,610 127.0.0.1 - - [02/Aug/2026 15:30:22] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:30:27,411 127.0.0.1 - - [02/Aug/2026 15:30:27] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:30:32,505 127.0.0.1 - - [02/Aug/2026 15:30:32] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:30:37,466 127.0.0.1 - - [02/Aug/2026 15:30:37] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:30:42,357 127.0.0.1 - - [02/Aug/2026 15:30:42] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:30:47,382 127.0.0.1 - - [02/Aug/2026 15:30:47] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:30:52,520 127.0.0.1 - - [02/Aug/2026 15:30:52] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:30:57,362 127.0.0.1 - - [02/Aug/2026 15:30:57] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:31:02,363 127.0.0.1 - - [02/Aug/2026 15:31:02] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:31:03,357 skip KXDOGE15M-26AUG021845-45: llm vetoes fade: wants DOWN +2026-08-02 15:31:07,447 127.0.0.1 - - [02/Aug/2026 15:31:07] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:31:12,493 127.0.0.1 - - [02/Aug/2026 15:31:12] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:31:17,474 127.0.0.1 - - [02/Aug/2026 15:31:17] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:31:22,678 127.0.0.1 - - [02/Aug/2026 15:31:22] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:31:27,366 127.0.0.1 - - [02/Aug/2026 15:31:27] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:31:32,369 127.0.0.1 - - [02/Aug/2026 15:31:32] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:31:37,543 127.0.0.1 - - [02/Aug/2026 15:31:37] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:31:42,505 127.0.0.1 - - [02/Aug/2026 15:31:42] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:31:47,397 127.0.0.1 - - [02/Aug/2026 15:31:47] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:31:52,427 127.0.0.1 - - [02/Aug/2026 15:31:52] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:31:57,375 127.0.0.1 - - [02/Aug/2026 15:31:57] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:32:02,497 127.0.0.1 - - [02/Aug/2026 15:32:02] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:32:07,476 127.0.0.1 - - [02/Aug/2026 15:32:07] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:32:12,423 127.0.0.1 - - [02/Aug/2026 15:32:12] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:32:17,371 127.0.0.1 - - [02/Aug/2026 15:32:17] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:32:22,442 127.0.0.1 - - [02/Aug/2026 15:32:22] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:32:27,542 127.0.0.1 - - [02/Aug/2026 15:32:27] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:32:32,376 127.0.0.1 - - [02/Aug/2026 15:32:32] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:32:37,597 127.0.0.1 - - [02/Aug/2026 15:32:37] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:32:42,491 127.0.0.1 - - [02/Aug/2026 15:32:42] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:32:47,388 127.0.0.1 - - [02/Aug/2026 15:32:47] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:32:52,588 127.0.0.1 - - [02/Aug/2026 15:32:52] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:32:57,486 127.0.0.1 - - [02/Aug/2026 15:32:57] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:33:02,503 127.0.0.1 - - [02/Aug/2026 15:33:02] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:33:07,441 127.0.0.1 - - [02/Aug/2026 15:33:07] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:33:12,381 127.0.0.1 - - [02/Aug/2026 15:33:12] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:33:18,443 127.0.0.1 - - [02/Aug/2026 15:33:18] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:33:22,587 127.0.0.1 - - [02/Aug/2026 15:33:22] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:33:27,382 127.0.0.1 - - [02/Aug/2026 15:33:27] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:33:32,424 127.0.0.1 - - [02/Aug/2026 15:33:32] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:33:37,476 127.0.0.1 - - [02/Aug/2026 15:33:37] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:33:42,491 127.0.0.1 - - [02/Aug/2026 15:33:42] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:33:47,380 127.0.0.1 - - [02/Aug/2026 15:33:47] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:33:52,460 127.0.0.1 - - [02/Aug/2026 15:33:52] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:33:57,385 127.0.0.1 - - [02/Aug/2026 15:33:57] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:34:02,488 127.0.0.1 - - [02/Aug/2026 15:34:02] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:34:07,453 127.0.0.1 - - [02/Aug/2026 15:34:07] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:34:12,500 127.0.0.1 - - [02/Aug/2026 15:34:12] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:34:17,392 127.0.0.1 - - [02/Aug/2026 15:34:17] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:34:22,451 127.0.0.1 - - [02/Aug/2026 15:34:22] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:34:27,381 127.0.0.1 - - [02/Aug/2026 15:34:27] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:34:32,401 127.0.0.1 - - [02/Aug/2026 15:34:32] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:34:37,443 127.0.0.1 - - [02/Aug/2026 15:34:37] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:34:42,384 127.0.0.1 - - [02/Aug/2026 15:34:42] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:34:47,399 127.0.0.1 - - [02/Aug/2026 15:34:47] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:34:47,821 127.0.0.1 - - [02/Aug/2026 15:34:47] "GET / HTTP/1.1" 200 - +2026-08-02 15:34:48,553 127.0.0.1 - - [02/Aug/2026 15:34:48] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:34:53,619 127.0.0.1 - - [02/Aug/2026 15:34:53] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:34:58,531 127.0.0.1 - - [02/Aug/2026 15:34:58] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:35:03,527 127.0.0.1 - - [02/Aug/2026 15:35:03] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:35:08,611 127.0.0.1 - - [02/Aug/2026 15:35:08] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:35:13,543 127.0.0.1 - - [02/Aug/2026 15:35:13] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:35:18,536 127.0.0.1 - - [02/Aug/2026 15:35:18] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:36:13,693 K4LSH1_OPS online — mode=AUTO dry_run=False stake=15¢ +2026-08-02 15:36:20,128 skip KXDOGE15M-26AUG021845-45: llm vetoes fade: wants DOWN +2026-08-02 15:36:26,462 K4LSH1_OPS online — mode=AUTO dry_run=False stake=15¢ +2026-08-02 15:36:30,475 K4LSH1_OPS online — mode=AUTO dry_run=False stake=15¢ +2026-08-02 15:36:33,349 skip KXSOL15M-26AUG021845-45: llm vetoes fade: wants DOWN +2026-08-02 15:36:34,582 K4LSH1_OPS online — mode=AUTO dry_run=False stake=15¢ +2026-08-02 15:36:36,572 skip KXDOGE15M-26AUG021845-45: llm vetoes fade: wants DOWN +2026-08-02 15:36:40,198 skip KXETH15M-26AUG021845-45: llm vetoes fade: wants DOWN +2026-08-02 15:40:19,510 K4LSH1_OPS online — mode=AUTO dry_run=False stake=15¢ +2026-08-02 15:40:22,279 skip KXDOGE15M-26AUG021845-45: llm vetoes fade: wants SKIP +2026-08-02 15:40:24,531 K4LSH1_OPS online — mode=AUTO dry_run=False stake=15¢ +2026-08-02 15:40:27,143 skip KXSOL15M-26AUG021845-45: llm vetoes fade: wants DOWN +2026-08-02 15:40:29,552 K4LSH1_OPS online — mode=AUTO dry_run=False stake=15¢ +2026-08-02 15:40:32,174 skip KXETH15M-26AUG021845-45: llm vetoes fade: wants DOWN +2026-08-02 15:41:55,913 Exception on /api/fleet [GET] +Traceback (most recent call last): + File "/Users/drjones/kalshi-bot/.venv/lib/python3.11/site-packages/flask/app.py", line 1511, in wsgi_app + response = self.full_dispatch_request() + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/drjones/kalshi-bot/.venv/lib/python3.11/site-packages/flask/app.py", line 919, in full_dispatch_request + rv = self.handle_user_exception(e) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/drjones/kalshi-bot/.venv/lib/python3.11/site-packages/flask/app.py", line 917, in full_dispatch_request + rv = self.dispatch_request() + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/drjones/kalshi-bot/.venv/lib/python3.11/site-packages/flask/app.py", line 902, in dispatch_request + return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/drjones/kalshi-bot/dashboard.py", line 320, in fleet_api + evts = [dict(r) for r in conn.execute("SELECT * FROM events ORDER BY id DESC LIMIT 40")] + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +sqlite3.OperationalError: no such column: id +2026-08-02 15:41:55,915 127.0.0.1 - - [02/Aug/2026 15:41:55] "GET /api/fleet HTTP/1.1" 500 - +2026-08-02 15:41:59,998 Exception on /api/fleet [GET] +Traceback (most recent call last): + File "/Users/drjones/kalshi-bot/.venv/lib/python3.11/site-packages/flask/app.py", line 1511, in wsgi_app + response = self.full_dispatch_request() + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/drjones/kalshi-bot/.venv/lib/python3.11/site-packages/flask/app.py", line 919, in full_dispatch_request + rv = self.handle_user_exception(e) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/drjones/kalshi-bot/.venv/lib/python3.11/site-packages/flask/app.py", line 917, in full_dispatch_request + rv = self.dispatch_request() + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/drjones/kalshi-bot/.venv/lib/python3.11/site-packages/flask/app.py", line 902, in dispatch_request + return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/drjones/kalshi-bot/dashboard.py", line 320, in fleet_api + evts = [dict(r) for r in conn.execute("SELECT * FROM events ORDER BY id DESC LIMIT 40")] + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +sqlite3.OperationalError: no such column: id +2026-08-02 15:41:59,998 127.0.0.1 - - [02/Aug/2026 15:41:59] "GET /api/fleet HTTP/1.1" 500 - +2026-08-02 15:42:04,978 Exception on /api/fleet [GET] +Traceback (most recent call last): + File "/Users/drjones/kalshi-bot/.venv/lib/python3.11/site-packages/flask/app.py", line 1511, in wsgi_app + response = self.full_dispatch_request() + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/drjones/kalshi-bot/.venv/lib/python3.11/site-packages/flask/app.py", line 919, in full_dispatch_request + rv = self.handle_user_exception(e) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/drjones/kalshi-bot/.venv/lib/python3.11/site-packages/flask/app.py", line 917, in full_dispatch_request + rv = self.dispatch_request() + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/drjones/kalshi-bot/.venv/lib/python3.11/site-packages/flask/app.py", line 902, in dispatch_request + return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/drjones/kalshi-bot/dashboard.py", line 320, in fleet_api + evts = [dict(r) for r in conn.execute("SELECT * FROM events ORDER BY id DESC LIMIT 40")] + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +sqlite3.OperationalError: no such column: id +2026-08-02 15:42:14,186 127.0.0.1 - - [02/Aug/2026 15:42:14] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:42:26,168 127.0.0.1 - - [02/Aug/2026 15:42:26] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:42:41,329 127.0.0.1 - - [02/Aug/2026 15:42:41] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:42:45,499 127.0.0.1 - - [02/Aug/2026 15:42:45] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:43:19,872 127.0.0.1 - - [02/Aug/2026 15:43:19] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:43:49,817 127.0.0.1 - - [02/Aug/2026 15:43:49] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:44:05,051 127.0.0.1 - - [02/Aug/2026 15:44:05] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:44:09,558 127.0.0.1 - - [02/Aug/2026 15:44:09] "GET / HTTP/1.1" 200 - +2026-08-02 15:44:09,937 127.0.0.1 - - [02/Aug/2026 15:44:09] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:44:10,279 127.0.0.1 - - [02/Aug/2026 15:44:10] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:44:15,266 127.0.0.1 - - [02/Aug/2026 15:44:15] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:44:17,748 127.0.0.1 - - [02/Aug/2026 15:44:17] "GET / HTTP/1.1" 200 - +2026-08-02 15:44:18,181 127.0.0.1 - - [02/Aug/2026 15:44:18] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:44:19,504 127.0.0.1 - - [02/Aug/2026 15:44:19] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:44:19,999 127.0.0.1 - - [02/Aug/2026 15:44:19] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:44:20,523 127.0.0.1 - - [02/Aug/2026 15:44:20] "GET /api/state HTTP/1.1" 200 - +2026-08-02 15:44:34,846 127.0.0.1 - - [02/Aug/2026 15:44:34] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:44:34,935 127.0.0.1 - - [02/Aug/2026 15:44:34] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:44:49,861 127.0.0.1 - - [02/Aug/2026 15:44:49] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:44:49,946 127.0.0.1 - - [02/Aug/2026 15:44:49] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:45:04,937 127.0.0.1 - - [02/Aug/2026 15:45:04] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:45:05,100 127.0.0.1 - - [02/Aug/2026 15:45:05] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:45:17,020 K4LSH1_OPS online — mode=AUTO dry_run=False stake=15¢ +2026-08-02 15:45:19,977 127.0.0.1 - - [02/Aug/2026 15:45:19] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:45:20,057 127.0.0.1 - - [02/Aug/2026 15:45:20] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:45:22,013 K4LSH1_OPS online — mode=AUTO dry_run=False stake=15¢ +2026-08-02 15:45:27,049 K4LSH1_OPS online — mode=AUTO dry_run=False stake=15¢ +2026-08-02 15:45:30,063 skip KXETH15M-26AUG021900-00: market closed (status=?) +2026-08-02 15:45:34,995 127.0.0.1 - - [02/Aug/2026 15:45:34] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:45:35,078 127.0.0.1 - - [02/Aug/2026 15:45:35] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:45:44,817 skip KXSOL15M-26AUG021900-00: ornith passes: RSI neutral + narrow range = no exhaustion +2026-08-02 15:45:50,011 127.0.0.1 - - [02/Aug/2026 15:45:50] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:45:50,090 127.0.0.1 - - [02/Aug/2026 15:45:50] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:46:00,488 skip KXDOGE15M-26AUG021900-00: market closed (status=?) +2026-08-02 15:46:05,028 127.0.0.1 - - [02/Aug/2026 15:46:05] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:46:05,108 127.0.0.1 - - [02/Aug/2026 15:46:05] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:46:20,045 127.0.0.1 - - [02/Aug/2026 15:46:20] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:46:20,126 127.0.0.1 - - [02/Aug/2026 15:46:20] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:46:35,058 127.0.0.1 - - [02/Aug/2026 15:46:35] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:46:35,141 127.0.0.1 - - [02/Aug/2026 15:46:35] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:46:50,074 127.0.0.1 - - [02/Aug/2026 15:46:50] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:46:50,155 127.0.0.1 - - [02/Aug/2026 15:46:50] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:47:05,091 127.0.0.1 - - [02/Aug/2026 15:47:05] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:47:05,176 127.0.0.1 - - [02/Aug/2026 15:47:05] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:47:20,109 127.0.0.1 - - [02/Aug/2026 15:47:20] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:47:20,191 127.0.0.1 - - [02/Aug/2026 15:47:20] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:47:35,129 127.0.0.1 - - [02/Aug/2026 15:47:35] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:47:35,210 127.0.0.1 - - [02/Aug/2026 15:47:35] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:47:41,626 127.0.0.1 - - [02/Aug/2026 15:47:41] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:47:50,147 127.0.0.1 - - [02/Aug/2026 15:47:50] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:47:50,233 127.0.0.1 - - [02/Aug/2026 15:47:50] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:47:54,751 K4LSH1_OPS online — mode=AUTO dry_run=False stake=15¢ +2026-08-02 15:47:57,862 MAKER-POST NO KXDOGE15M-26AUG021900-00 @ 45¢ — ornith: DOWN spike 100.00% → DOWN conf=0.72 +2026-08-02 15:48:00,735 K4LSH1_OPS online — mode=AUTO dry_run=False stake=15¢ +2026-08-02 15:48:05,165 127.0.0.1 - - [02/Aug/2026 15:48:05] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:48:05,251 127.0.0.1 - - [02/Aug/2026 15:48:05] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:48:06,771 K4LSH1_OPS online — mode=AUTO dry_run=False stake=15¢ +2026-08-02 15:48:09,436 skip KXETH15M-26AUG021900-00: ornith passes: RSI neutral + Fear&Greed low = no clear exhaustion +2026-08-02 15:48:12,064 MAKER-POST NO KXSOL15M-26AUG021900-00 @ 45¢ — ornith: UP spike 62392.45% → DOWN conf=0.72 +2026-08-02 15:48:20,184 127.0.0.1 - - [02/Aug/2026 15:48:20] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:48:20,272 127.0.0.1 - - [02/Aug/2026 15:48:20] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:48:35,203 127.0.0.1 - - [02/Aug/2026 15:48:35] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:48:35,296 127.0.0.1 - - [02/Aug/2026 15:48:35] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:48:50,226 127.0.0.1 - - [02/Aug/2026 15:48:50] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:48:50,306 127.0.0.1 - - [02/Aug/2026 15:48:50] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:49:05,244 127.0.0.1 - - [02/Aug/2026 15:49:05] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:49:05,331 127.0.0.1 - - [02/Aug/2026 15:49:05] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:49:20,262 127.0.0.1 - - [02/Aug/2026 15:49:20] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:49:20,636 127.0.0.1 - - [02/Aug/2026 15:49:20] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:49:34,601 K4LSH1_OPS online — mode=AUTO dry_run=False stake=15¢ +2026-08-02 15:49:35,558 127.0.0.1 - - [02/Aug/2026 15:49:35] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:49:35,644 127.0.0.1 - - [02/Aug/2026 15:49:35] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:49:40,588 K4LSH1_OPS online — mode=AUTO dry_run=False stake=15¢ +2026-08-02 15:49:40,959 MAKER-POST NO KXDOGE15M-26AUG021900-00 @ 45¢ — ornith: DOWN spike 100.00% → DOWN conf=0.75 +2026-08-02 15:49:43,544 skip KXSOL15M-26AUG021900-00: ornith passes: RSI neutral, 24h range tight—no spike to fade +2026-08-02 15:49:46,623 K4LSH1_OPS online — mode=AUTO dry_run=False stake=15¢ +2026-08-02 15:49:50,578 127.0.0.1 - - [02/Aug/2026 15:49:50] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:49:50,672 127.0.0.1 - - [02/Aug/2026 15:49:50] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:49:57,612 MAKER-POST NO KXETH15M-26AUG021900-00 @ 45¢ — ornith: UP spike 1594287.58% → DOWN conf=0.72 +2026-08-02 15:50:05,598 127.0.0.1 - - [02/Aug/2026 15:50:05] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:50:05,692 127.0.0.1 - - [02/Aug/2026 15:50:05] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:50:20,617 127.0.0.1 - - [02/Aug/2026 15:50:20] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:50:20,704 127.0.0.1 - - [02/Aug/2026 15:50:20] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:50:35,637 127.0.0.1 - - [02/Aug/2026 15:50:35] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:50:35,723 127.0.0.1 - - [02/Aug/2026 15:50:35] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:50:50,659 127.0.0.1 - - [02/Aug/2026 15:50:50] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:50:50,746 127.0.0.1 - - [02/Aug/2026 15:50:50] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:51:05,679 127.0.0.1 - - [02/Aug/2026 15:51:05] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:51:05,766 127.0.0.1 - - [02/Aug/2026 15:51:05] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:51:20,699 127.0.0.1 - - [02/Aug/2026 15:51:20] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:51:20,787 127.0.0.1 - - [02/Aug/2026 15:51:20] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:51:35,720 127.0.0.1 - - [02/Aug/2026 15:51:35] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:51:35,807 127.0.0.1 - - [02/Aug/2026 15:51:35] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:51:50,743 127.0.0.1 - - [02/Aug/2026 15:51:50] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:51:50,831 127.0.0.1 - - [02/Aug/2026 15:51:50] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:52:05,764 127.0.0.1 - - [02/Aug/2026 15:52:05] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:52:05,861 127.0.0.1 - - [02/Aug/2026 15:52:05] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:52:20,785 127.0.0.1 - - [02/Aug/2026 15:52:20] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:52:20,874 127.0.0.1 - - [02/Aug/2026 15:52:20] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:52:34,539 K4LSH1_OPS online — mode=AUTO dry_run=False stake=15¢ +2026-08-02 15:52:35,808 127.0.0.1 - - [02/Aug/2026 15:52:35] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:52:35,897 127.0.0.1 - - [02/Aug/2026 15:52:35] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:52:37,218 skip KXDOGE15M-26AUG021900-00: no swing (0.000% < 0.04%) +2026-08-02 15:52:45,716 K4LSH1_OPS online — mode=AUTO dry_run=False stake=15¢ +2026-08-02 15:52:48,082 skip KXDOGE15M-26AUG021900-00: no swing (0.000% < 0.04%) +2026-08-02 15:52:50,831 127.0.0.1 - - [02/Aug/2026 15:52:50] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:52:50,916 127.0.0.1 - - [02/Aug/2026 15:52:50] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:52:51,768 K4LSH1_OPS online — mode=AUTO dry_run=False stake=15¢ +2026-08-02 15:52:54,734 skip KXSOL15M-26AUG021900-00: no swing (0.000% < 0.04%) +2026-08-02 15:52:57,817 K4LSH1_OPS online — mode=AUTO dry_run=False stake=15¢ +2026-08-02 15:53:05,852 127.0.0.1 - - [02/Aug/2026 15:53:05] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:53:05,952 127.0.0.1 - - [02/Aug/2026 15:53:05] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:53:07,667 skip KXETH15M-26AUG021900-00: no swing (0.000% < 0.04%) +2026-08-02 15:53:20,878 127.0.0.1 - - [02/Aug/2026 15:53:20] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:53:20,968 127.0.0.1 - - [02/Aug/2026 15:53:20] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:53:35,900 127.0.0.1 - - [02/Aug/2026 15:53:35] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:53:35,992 127.0.0.1 - - [02/Aug/2026 15:53:35] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:53:50,922 127.0.0.1 - - [02/Aug/2026 15:53:50] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:53:51,014 127.0.0.1 - - [02/Aug/2026 15:53:51] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:54:05,944 127.0.0.1 - - [02/Aug/2026 15:54:05] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:54:06,038 127.0.0.1 - - [02/Aug/2026 15:54:06] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:54:20,967 127.0.0.1 - - [02/Aug/2026 15:54:20] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:54:21,344 127.0.0.1 - - [02/Aug/2026 15:54:21] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:54:36,271 127.0.0.1 - - [02/Aug/2026 15:54:36] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:54:36,365 127.0.0.1 - - [02/Aug/2026 15:54:36] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:54:51,297 127.0.0.1 - - [02/Aug/2026 15:54:51] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:54:51,385 127.0.0.1 - - [02/Aug/2026 15:54:51] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:55:06,320 127.0.0.1 - - [02/Aug/2026 15:55:06] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:55:06,414 127.0.0.1 - - [02/Aug/2026 15:55:06] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:55:21,343 127.0.0.1 - - [02/Aug/2026 15:55:21] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:55:21,440 127.0.0.1 - - [02/Aug/2026 15:55:21] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:55:36,368 127.0.0.1 - - [02/Aug/2026 15:55:36] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:55:36,455 127.0.0.1 - - [02/Aug/2026 15:55:36] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:55:51,392 127.0.0.1 - - [02/Aug/2026 15:55:51] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:55:51,480 127.0.0.1 - - [02/Aug/2026 15:55:51] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:56:06,416 127.0.0.1 - - [02/Aug/2026 15:56:06] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:56:06,514 127.0.0.1 - - [02/Aug/2026 15:56:06] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:56:21,441 127.0.0.1 - - [02/Aug/2026 15:56:21] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:56:21,533 127.0.0.1 - - [02/Aug/2026 15:56:21] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:56:36,465 127.0.0.1 - - [02/Aug/2026 15:56:36] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:56:36,555 127.0.0.1 - - [02/Aug/2026 15:56:36] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:56:51,488 127.0.0.1 - - [02/Aug/2026 15:56:51] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:56:51,577 127.0.0.1 - - [02/Aug/2026 15:56:51] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:57:06,512 127.0.0.1 - - [02/Aug/2026 15:57:06] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:57:06,605 127.0.0.1 - - [02/Aug/2026 15:57:06] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:57:21,535 127.0.0.1 - - [02/Aug/2026 15:57:21] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:57:21,632 127.0.0.1 - - [02/Aug/2026 15:57:21] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:57:36,560 127.0.0.1 - - [02/Aug/2026 15:57:36] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:57:36,661 127.0.0.1 - - [02/Aug/2026 15:57:36] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:57:51,588 127.0.0.1 - - [02/Aug/2026 15:57:51] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:57:51,679 127.0.0.1 - - [02/Aug/2026 15:57:51] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:58:06,613 127.0.0.1 - - [02/Aug/2026 15:58:06] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:58:06,710 127.0.0.1 - - [02/Aug/2026 15:58:06] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:58:21,638 127.0.0.1 - - [02/Aug/2026 15:58:21] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:58:21,729 127.0.0.1 - - [02/Aug/2026 15:58:21] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:58:36,666 127.0.0.1 - - [02/Aug/2026 15:58:36] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:58:36,754 127.0.0.1 - - [02/Aug/2026 15:58:36] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:58:51,690 127.0.0.1 - - [02/Aug/2026 15:58:51] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:58:51,786 127.0.0.1 - - [02/Aug/2026 15:58:51] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:59:06,721 127.0.0.1 - - [02/Aug/2026 15:59:06] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:59:06,849 127.0.0.1 - - [02/Aug/2026 15:59:06] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 15:59:21,749 127.0.0.1 - - [02/Aug/2026 15:59:21] "GET /fleet HTTP/1.1" 200 - +2026-08-02 15:59:22,164 127.0.0.1 - - [02/Aug/2026 15:59:22] "GET /api/fleet HTTP/1.1" 200 - +2026-08-02 16:00:46,169 skip KXETH15M-26AUG021915-15: no swing (0.005% < 0.04%) +2026-08-02 16:00:46,792 skip KXDOGE15M-26AUG021915-15: no swing (0.039% < 0.04%) +2026-08-02 16:00:50,587 MAKER-POST NO KXSOL15M-26AUG021915-15 @ 45¢ — ornith: DOWN spike 0.05% → DOWN conf=0.72 +2026-08-02 16:04:35,227 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ +2026-08-02 16:04:41,274 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ +2026-08-02 16:04:44,285 MAKER-POST NO KXDOGE15M-26AUG021915-15 @ 5¢ — ornith: DOWN spike 0.05% → DOWN conf=0.65 +2026-08-02 16:04:47,230 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ +2026-08-02 16:04:49,730 skip KXETH15M-26AUG021915-15: no swing (0.011% < 0.005%) +2026-08-02 16:06:49,958 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ +2026-08-02 16:06:55,895 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ +2026-08-02 16:07:01,928 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ +2026-08-02 16:07:04,838 MAKER-POST NO KXETH15M-26AUG021915-15 @ 5¢ — ornith: DOWN spike 0.12% → DOWN conf=0.65 +2026-08-02 16:14:08,061 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ +2026-08-02 16:14:14,080 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ +2026-08-02 16:14:20,046 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ +2026-08-02 16:15:29,455 MAKER-POST NO KXSOL15M-26AUG021930-30 @ 5¢ — ornith: DOWN spike 0.11% → DOWN conf=0.62 +2026-08-02 16:15:42,620 MAKER-POST NO KXDOGE15M-26AUG021930-30 @ 5¢ — ornith: DOWN spike 0.19% → DOWN conf=0.65 +2026-08-02 16:16:06,181 MAKER-POST NO KXETH15M-26AUG021930-30 @ 5¢ — ornith: DOWN spike 0.12% → DOWN conf=0.65 +2026-08-02 16:18:28,645 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ +2026-08-02 16:18:34,647 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ +2026-08-02 16:18:40,632 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ +2026-08-02 16:22:43,485 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ +2026-08-02 16:23:15,210 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ +2026-08-02 16:23:21,226 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ +2026-08-02 16:23:27,279 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ +2026-08-02 16:28:55,974 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ +2026-08-02 16:29:00,991 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ +2026-08-02 16:29:06,033 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ +2026-08-02 16:30:19,789 skip KXSOL15M-26AUG021945-45: ornith passes: RSI neutral, no exhaustion signal +2026-08-02 16:30:55,893 MAKER-POST NO KXDOGE15M-26AUG021945-45 @ 50¢ — ornith: UP spike 0.14% → DOWN conf=0.72 +2026-08-02 16:30:57,528 MAKER-POST NO KXETH15M-26AUG021945-45 @ 50¢ — ornith: UP spike 0.11% → DOWN conf=0.62 +2026-08-02 16:45:41,471 skip KXETH15M-26AUG022000-00: ornith passes: RSI neutral, no exhaustion signal +2026-08-02 16:45:41,512 MAKER-POST NO KXSOL15M-26AUG022000-00 @ 50¢ — ornith: DOWN spike 0.05% → DOWN conf=0.65 +2026-08-02 16:45:50,785 skip KXDOGE15M-26AUG022000-00: ornith passes: RSI oversold + 24h range $0-$0 = dead market, no fade signal +2026-08-02 17:00:31,843 MAKER-POST NO KXDOGE15M-26AUG022015-15 @ 50¢ — ornith: UP spike 0.07% → DOWN conf=0.65 +2026-08-02 17:00:32,629 MAKER-POST NO KXSOL15M-26AUG022015-15 @ 50¢ — ornith: UP spike 0.17% → DOWN conf=0.72 +2026-08-02 17:00:51,056 skip KXETH15M-26AUG022015-15: ornith passes: RSI neutral, no exhaustion signal +2026-08-02 17:15:31,474 MAKER-POST NO KXSOL15M-26AUG022030-30 @ 50¢ — ornith: DOWN spike 0.10% → DOWN conf=0.62 +2026-08-02 17:15:36,471 MAKER-POST NO KXETH15M-26AUG022030-30 @ 50¢ — ornith: DOWN spike 0.14% → DOWN conf=0.62 +2026-08-02 17:15:36,896 MAKER-POST NO KXDOGE15M-26AUG022030-30 @ 50¢ — ornith: DOWN spike 0.11% → DOWN conf=0.65 +2026-08-02 17:30:40,931 MAKER-POST NO KXSOL15M-26AUG022045-45 @ 50¢ — ornith: DOWN spike 0.22% → DOWN conf=0.65 +2026-08-02 17:30:42,121 MAKER-POST NO KXETH15M-26AUG022045-45 @ 50¢ — ornith: DOWN spike 0.22% → DOWN conf=0.65 +2026-08-02 17:30:56,054 skip KXDOGE15M-26AUG022045-45: ornith passes: No price data to assess trend +2026-08-02 17:45:35,718 MAKER-POST NO KXDOGE15M-26AUG022100-00 @ 50¢ — ornith: DOWN spike 0.10% → DOWN conf=0.72 +2026-08-02 17:45:36,474 MAKER-POST NO KXSOL15M-26AUG022100-00 @ 50¢ — ornith: DOWN spike 0.11% → DOWN conf=0.72 +2026-08-02 17:45:58,340 skip KXETH15M-26AUG022100-00: ornith passes: RSI oversold + Fear&Greed low = bottoming, not fading +2026-08-02 17:48:03,830 HEDGE KXBTC15M-TEST: no@45¢ + yes@42¢ → locked 13¢ +2026-08-02 17:48:04,314 ollama vote failed: Expecting value: line 1 column 1 (char 0) +2026-08-02 17:48:04,315 ollama vote failed: Expecting value: line 1 column 1 (char 0) +2026-08-02 17:48:04,315 ollama vote failed: Expecting value: line 1 column 1 (char 0) +2026-08-02 17:49:52,453 HEDGE KXBTC15M-TEST: no@45¢ + yes@42¢ → locked 13¢ +2026-08-02 17:49:54,007 ollama vote failed: the JSON object must be str, bytes or bytearray, not MagicMock +2026-08-02 17:49:54,007 ollama vote failed: the JSON object must be str, bytes or bytearray, not MagicMock +2026-08-02 17:49:54,008 ollama vote failed: the JSON object must be str, bytes or bytearray, not MagicMock +2026-08-02 18:00:41,758 MAKER-POST NO KXSOL15M-26AUG022115-15 @ 50¢ — ornith: DOWN spike 0.11% → DOWN conf=0.72 +2026-08-02 18:00:45,615 skip KXDOGE15M-26AUG022115-15: ornith passes: RSI=0 oversold + 24h range $0-$0 = no real move to fade +2026-08-02 18:00:51,663 MAKER-POST NO KXETH15M-26AUG022115-15 @ 50¢ — ornith: DOWN spike 0.10% → DOWN conf=0.72 +2026-08-02 18:15:16,621 skip KXSOL15M-26AUG022130-30: ornith passes: RSI neutral, no exhaustion signal +2026-08-02 18:16:00,588 skip KXDOGE15M-26AUG022130-30: ornith passes: No price data provided for BTC +2026-08-02 18:16:08,336 MAKER-POST NO KXETH15M-26AUG022130-30 @ 50¢ — ornith: DOWN spike 0.14% → DOWN conf=0.62 +2026-08-02 18:18:13,638 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ max_spend=100¢ +2026-08-02 18:18:20,615 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ max_spend=100¢ +2026-08-02 18:18:20,615 staggering start by 20s +2026-08-02 18:18:23,872 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ max_spend=100¢ +2026-08-02 18:18:23,872 staggering start by 40s +2026-08-02 18:18:24,609 POST NO x1 KXDOGE15M-26AUG022130-30 @ 50¢ — ornith: DOWN spike 0.13% → DOWN conf=0.72 +2026-08-02 18:18:50,177 POST NO x1 KXSOL15M-26AUG022130-30 @ 50¢ — ornith: DOWN spike 0.12% → DOWN conf=0.62 +2026-08-02 18:19:24,020 POST NO x1 KXETH15M-26AUG022130-30 @ 50¢ — ornith: DOWN spike 0.08% → DOWN conf=0.52 +2026-08-02 18:23:20,655 skip KXDOGE15M-26AUG022130-30: ornith passes: RSI neutral, no spike detected +2026-08-02 18:23:49,313 skip KXSOL15M-26AUG022130-30: ornith passes: RSI neutral at 50, no exhaustion signal +2026-08-02 18:24:14,604 POST NO x1 KXETH15M-26AUG022130-30 @ 50¢ — ornith: DOWN spike 0.03% → DOWN conf=0.72 +2026-08-02 18:28:26,185 skip KXDOGE15M-26AUG022130-30: ornith passes: RSI 98 overbought but no price data to confirm trend vs spike +2026-08-02 18:28:53,977 POST NO x1 KXSOL15M-26AUG022130-30 @ 50¢ — ornith: DOWN spike 0.07% → DOWN conf=0.65 +2026-08-02 18:29:26,169 skip KXETH15M-26AUG022130-30: ornith passes: RSI neutral, no exhaustion signal +2026-08-02 18:33:30,453 POST NO x1 KXDOGE15M-26AUG022145-45 @ 50¢ — ornith: UP spike 0.05% → DOWN conf=0.72 +2026-08-02 18:33:51,482 POST NO x1 KXSOL15M-26AUG022145-45 @ 50¢ — ornith: DOWN spike 0.03% → DOWN conf=0.65 +2026-08-02 18:34:15,865 skip KXETH15M-26AUG022145-45: ornith passes: RSI neutral, no exhaustion signal +2026-08-02 18:38:33,367 skip KXDOGE15M-26AUG022145-45: ornith passes: RSI=0 oversold + 24h flat = no trend to fade +2026-08-02 18:38:58,086 POST NO x1 KXSOL15M-26AUG022145-45 @ 50¢ — ornith: DOWN spike 0.08% → DOWN conf=0.65 +2026-08-02 18:39:31,032 skip KXETH15M-26AUG022145-45: ornith passes: RSI 63 not stretched; no spike data +2026-08-02 18:43:32,402 skip KXDOGE15M-26AUG022145-45: ornith passes: RSI=0 oversold + 24h range $0-$0 = no real move +2026-08-02 18:43:57,637 POST NO x1 KXSOL15M-26AUG022145-45 @ 50¢ — ornith: UP spike 0.08% → DOWN conf=0.65 +2026-08-02 18:44:21,425 skip KXETH15M-26AUG022145-45: ornith passes: RSI 61 not stretched; range wide suggests trend, not chop +2026-08-02 18:47:01,043 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ max_spend=100¢ +2026-08-02 18:47:04,138 HEDGE KXBTC15M-TEST: no@45¢ + yes@42¢ → locked 13¢ +2026-08-02 18:47:04,648 deep llm failed: '>=' not supported between instances of 'MagicMock' and 'int' +2026-08-02 18:47:04,649 deep llm failed: '>=' not supported between instances of 'MagicMock' and 'int' +2026-08-02 18:47:04,650 deep llm failed: '>=' not supported between instances of 'MagicMock' and 'int' +2026-08-02 18:47:06,182 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ max_spend=100¢ +2026-08-02 18:47:06,183 staggering start by 20s +2026-08-02 18:47:11,233 POST YES x1 KXDOGE15M-26AUG022200-00 @ 50¢ — ⚠ RSI 0 extreme oversold → fade UP +2026-08-02 18:47:11,548 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ max_spend=100¢ +2026-08-02 18:47:11,548 staggering start by 40s +2026-08-02 18:47:36,491 skip KXSOL15M-26AUG022200-00: BTC +0.5% 24h — no counter-trend shorts (conf 0.65<0.78) +2026-08-02 18:48:11,162 skip KXETH15M-26AUG022200-00: BTC +0.6% 24h — no counter-trend shorts (conf 0.72<0.78) +2026-08-02 18:50:30,184 HEDGE KXBTC15M-TEST: no@45¢ + yes@42¢ → locked 13¢ +2026-08-02 18:50:30,587 deep llm failed: '>=' not supported between instances of 'MagicMock' and 'int' +2026-08-02 18:50:30,588 deep llm failed: '>=' not supported between instances of 'MagicMock' and 'int' +2026-08-02 18:50:30,589 deep llm failed: '>=' not supported between instances of 'MagicMock' and 'int' +2026-08-02 18:52:15,246 POST YES x1 KXDOGE15M-26AUG022200-00 @ 50¢ — ⚠ RSI 0 extreme oversold → fade UP +2026-08-02 18:52:41,123 POST YES x1 KXSOL15M-26AUG022200-00 @ 50¢ — ⚠ RSI 0 extreme oversold → fade UP +2026-08-02 18:53:05,662 POST NO x1 KXETH15M-26AUG022200-00 @ 50¢ — ⚠ RSI 100 extreme overbought → fade DOWN +2026-08-02 18:57:19,234 POST NO x1 KXDOGE15M-26AUG022200-00 @ 50¢ — ⚠ RSI 100 extreme overbought → fade DOWN +2026-08-02 18:57:40,738 POST NO x1 KXSOL15M-26AUG022200-00 @ 50¢ — ⚠ RSI 86 extreme overbought → fade DOWN +2026-08-02 18:58:16,098 skip KXETH15M-26AUG022200-00: BTC +0.5% 24h — no counter-trend shorts (conf 0.65<0.78) +2026-08-02 19:02:20,989 skip KXDOGE15M-26AUG022215-15: passes: RSI 63 not stretched, no spike data +2026-08-02 19:02:46,568 POST YES x1 KXSOL15M-26AUG022215-15 @ 50¢ — ⚠ RSI 0 extreme oversold → fade UP +2026-08-02 19:03:11,001 POST NO x1 KXETH15M-26AUG022215-15 @ 50¢ — ⚠ RSI 98 extreme overbought → fade DOWN +2026-08-02 19:07:21,813 POST NO x1 KXDOGE15M-26AUG022215-15 @ 50¢ — ⚠ RSI 100 extreme overbought → fade DOWN +2026-08-02 19:07:46,317 POST YES x1 KXSOL15M-26AUG022215-15 @ 50¢ — ⚠ RSI 0 extreme oversold → fade UP +2026-08-02 19:08:14,797 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ max_spend=100¢ +2026-08-02 19:08:19,711 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ max_spend=100¢ +2026-08-02 19:08:19,711 staggering start by 20s +2026-08-02 19:08:21,175 loop error: name 'llm_vote' is not defined +2026-08-02 19:08:24,773 K4LSH1_OPS online — mode=AUTO dry_run=False stake=10¢ max_spend=100¢ +2026-08-02 19:08:24,774 staggering start by 40s +2026-08-02 19:08:26,747 POST NO x1 KXETH15M-26AUG022215-15 @ 50¢ — DOWN: DOWN spike 0.06% conf=0.65 [RSI oversold + Fear, but 15m momentum DOWN suggests fading t] +2026-08-02 19:08:45,920 loop error: name 'llm_vote' is not defined +2026-08-02 19:09:12,858 loop error: name 'llm_vote' is not defined diff --git a/bot.py b/bot.py new file mode 100644 index 0000000..2dcc9f7 --- /dev/null +++ b/bot.py @@ -0,0 +1,617 @@ +#!/usr/bin/env python3 +""" +K4LSH1_OPS — autonomous 15-minute BTC up/down trading bot. +Momentum + local-Ollama ensemble, tiny stakes, full sqlite audit trail. +Modes: AUTO | DOWN_SPAM | UP_SPAM | OFF (persisted in config.json, hot-reloaded) +DRY_RUN=true simulates orders (still logs + tracks hypothetical P&L). +""" +import base64, json, logging, os, sqlite3, sys, time +from datetime import datetime, timezone +from pathlib import Path +from uuid import uuid4 + +import requests +from cryptography.hazmat.primitives import hashes, serialization +from cryptography.hazmat.primitives.asymmetric import padding + +HOME = Path(__file__).parent +CFG_PATH = HOME / "config.json" +DB_PATH = HOME / "state.db" +# per-coin Kraken pairs +KRAKEN_PAIRS = {"BTC": "XBTUSD", "ETH": "ETHUSD", "DOGE": "XDGUSD", "SOL": "SOLUSD", "XRP": "XRPUSD"} +LOG = logging.getLogger("bot") +logging.basicConfig(level=logging.INFO, format="%(asctime)s %(message)s", + handlers=[logging.FileHandler(HOME/"bot.log"), logging.StreamHandler()]) + +DEFAULT_CFG = { + "api_key_id": "28d5876b-2ece-4aa3-aa17-ec96e1e706eb", + "key_path": str(HOME / "kalshi_private_key.pem"), + "mode": "AUTO", # AUTO | DOWN_SPAM | UP_SPAM | OFF + "dry_run": True, # simulated until flipped from dashboard + "stake_cents": 50, # taker: max ask we'll pay; maker: price we post + "post_price_cents": 45, # maker mode: resting bid price when book is empty + "max_contracts": 1, + "daily_loss_cap_cents": 500, + "min_conf": 0.55, # AUTO mode: min ensemble confidence to fire + "swing_threshold_pct": 0.12, # fade triggers when |weighted 15m move| >= this + "learning": True, + "ollama_url": "http://localhost:11434", + "ollama_model": "qwen3.5:4b", + "series": "KXBTC15M", + "kill": False, +} + +def load_cfg(): + cfg = dict(DEFAULT_CFG) + if CFG_PATH.exists(): + try: cfg.update(json.loads(CFG_PATH.read_text())) + except Exception: pass + else: + CFG_PATH.write_text(json.dumps(cfg, indent=1)) + return cfg + +# ───────── kalshi client ───────── +class Kalshi: + BASE = "https://api.elections.kalshi.com" + PRE = "/trade-api/v2" + def __init__(self, key_id, key_path): + self.key_id = key_id + self.pk = serialization.load_pem_private_key(open(key_path, "rb").read(), password=None) + self.s = requests.Session() + def _h(self, method, path): + ts = str(int(time.time()*1000)) + msg = ts + method.upper() + path.split("?")[0] + sig = self.pk.sign(msg.encode(), padding.PSS(mgf=padding.MGF1(hashes.SHA256()), + salt_length=padding.PSS.DIGEST_LENGTH), hashes.SHA256()) + return {"KALSHI-ACCESS-KEY": self.key_id, + "KALSHI-ACCESS-SIGNATURE": base64.b64encode(sig).decode(), + "KALSHI-ACCESS-TIMESTAMP": ts} + def req(self, method, path, **kw): + full = self.PRE + path + for attempt in range(3): + try: + r = self.s.request(method, self.BASE+full, headers=self._h(method, full), timeout=15, **kw) + r.raise_for_status() + return r.json() + except requests.HTTPError as e: + if r.status_code in (401, 403): raise + if attempt == 2: raise + time.sleep(1.5*(attempt+1)) + def markets(self, series, status="open", limit=5): + return self.req("GET", f"/markets?series_ticker={series}&status={status}&limit={limit}").get("markets", []) + def orderbook(self, ticker, depth=5): + return self.req("GET", f"/markets/{ticker}/orderbook?depth={depth}").get("orderbook", {}) + def balance(self): + return self.req("GET", "/portfolio/balance") + def positions(self): + return self.req("GET", "/portfolio/positions?limit=50").get("market_positions", []) + def order(self, ticker, side, count, price_cents, dry): + """side='yes'|'no'. price_cents = limit price in cents. + V2 endpoint: /portfolio/events/orders with bid/ask side + dollar prices.""" + side_v2 = "bid" if side == "yes" else "ask" + price_dollars = f"{price_cents / 100:.4f}" + body = {"ticker": ticker, "client_order_id": str(uuid4()), + "side": side_v2, "count": f"{count:.2f}", + "price": price_dollars, "time_in_force": "good_till_canceled", + "self_trade_prevention_type": "taker_at_cross", + "post_only": False, "reduce_only": False} + if dry: return {"simulated": True, "order": body} + return self.req("POST", "/portfolio/events/orders", json=body) + +# ───────── btc price feed ───────── +def btc_price(coin="BTC"): + pair = KRAKEN_PAIRS.get(coin, "XBTUSD") + try: + r = requests.get(f"https://api.kraken.com/0/public/Ticker?pair={pair}", timeout=8).json() + key = list(r["result"].keys())[0] + t = r["result"][key] + _intel_cache.setdefault("kraken", {})["open24"] = float(t["o"][1] if isinstance(t["o"], list) else t["o"]) + return float(t["c"][0]) + except Exception: + try: + cb = "BTC" if coin == "BTC" else coin + r = requests.get(f"https://api.coinbase.com/v2/prices/{cb}-USD/spot", timeout=8) + return float(r.json()["data"]["amount"]) + except Exception: + return None + +# ───────── db ───────── +def db(): + conn = sqlite3.connect(DB_PATH) + conn.execute("""CREATE TABLE IF NOT EXISTS ticks (ts REAL, price REAL)""") + conn.execute("""CREATE TABLE IF NOT EXISTS decisions ( + id INTEGER PRIMARY KEY AUTOINCREMENT, ts REAL, ticker TEXT, mode TEXT, + momentum TEXT, llm_vote TEXT, llm_conf REAL, llm_why TEXT, + final TEXT, price REAL, reason TEXT)""") + conn.execute("""CREATE TABLE IF NOT EXISTS orders ( + id INTEGER PRIMARY KEY AUTOINCREMENT, ts REAL, ticker TEXT, side TEXT, + count INT, price_cents INT, dry INT, order_id TEXT, status TEXT, + settle_ts REAL, pnl_cents INT)""") + conn.execute("""CREATE TABLE IF NOT EXISTS events (ts REAL, level TEXT, msg TEXT)""") + conn.execute("""CREATE TABLE IF NOT EXISTS kv (k TEXT PRIMARY KEY, v REAL)""") + return conn + +def log_event(conn, level, msg): + conn.execute("INSERT INTO events VALUES (?,?,?)", (time.time(), level, msg)) + conn.commit() + getattr(LOG, level if level in ("info","warning","error") else "info")(msg) + +# ───────── brain ───────── +def momentum(conn): + rows = conn.execute("SELECT ts, price FROM ticks WHERE ts > ? ORDER BY ts", + (time.time()-1800,)).fetchall() + if len(rows) < 4: return "FLAT", 0.0 + now = rows[-1][1] + def ret(minutes): + ref = min(rows, key=lambda r: abs(r[0]-(time.time()-minutes*60)))[1] + return (now-ref)/ref*100 if ref else 0 + r5, r15 = ret(5), ret(15) + score = r5*0.6 + r15*0.4 + if score > 0.008: return "UP", abs(score) + if score < -0.008: return "DOWN", abs(score) + return "FLAT", abs(score) + +# ───────── multi-source intel ───────── +_intel_cache = {"ts": 0, "data": {}} +def intel(coin="BTC"): + """Slow external context, cached 5 min: Binance 24h stats, Fear&Greed, mempool fees.""" + if time.time() - _intel_cache["ts"] < 300 and _intel_cache["data"] and coin in _intel_cache.get("coins", {}): + return _intel_cache["data"] + d = {} + # per-coin binance 24h + BINANCE_SYMBOLS = {"BTC": "BTCUSDT", "ETH": "ETHUSDT", "DOGE": "DOGEUSDT", "SOL": "SOLUSDT", "XRP": "XRPUSDT"} + bs = BINANCE_SYMBOLS.get(coin, "BTCUSDT") + try: + j = requests.get(f"https://api.binance.com/api/v3/ticker/24hr?symbol={bs}", timeout=8).json() + d["chg24"] = float(j["priceChangePercent"]); d["vol24"] = float(j["volume"]) + d["high24"] = float(j["highPrice"]); d["low24"] = float(j["lowPrice"]) + except Exception: + pass + if "chg24" not in d: + # kraken-derived 24h change (works everywhere, no geo block) + k = _intel_cache.get("kraken", {}).get("open24") + try: + cur = requests.get("https://api.kraken.com/0/public/Ticker?pair=XBTUSD", timeout=8).json()["result"]["XXBTZUSD"] + op = float(cur["o"][1] if isinstance(cur["o"], list) else cur["o"]) + cl = float(cur["c"][0]) + d["chg24"] = (cl - op) / op * 100 + d["high24"] = float(cur["h"][1]); d["low24"] = float(cur["l"][1]) + d["vol24"] = float(cur["v"][1]) + except Exception: + pass + try: + j = requests.get("https://api.alternative.me/fng/?limit=1", timeout=8).json() + d["fng"] = int(j["data"][0]["value"]); d["fng_class"] = j["data"][0]["value_classification"] + except Exception: pass + try: + j = requests.get("https://mempool.space/api/v1/fees/recommended", timeout=8).json() + d["fee_fast"] = j.get("fastestFee") + except Exception: pass + _intel_cache.update({"ts": time.time(), "data": d, "coins": {coin: True}}) + return d + +def rsi(conn, period=14): + rows = conn.execute("SELECT price FROM ticks WHERE ts > ? ORDER BY ts", (time.time()-1200,)).fetchall() + px = [r[0] for r in rows] + if len(px) < period+2: return None + gains, losses = [], [] + for a, b in zip(px[-period-1:-1], px[-period:]): + ch = b - a + (gains if ch >= 0 else losses).append(abs(ch)) + ag = sum(gains)/period; al = sum(losses)/period if losses else 1e-9 + return 100 - 100/(1 + ag/al) + +def enriched_context(cfg, price, mom, mom_score, conn): + """Build rich trading context: multi-TF trends, RSI, orderbook, BTC corr, WR history, regime.""" + coin = cfg.get("coin","BTC") + ix = intel(coin) + r1 = rsi(conn, 14); r5 = rsi(conn, 14*5) # 1min and 5min RSI + + lines = [f"=== {coin} MARKET SNAPSHOT ==="] + lines.append(f"spot: ${price:,.4f}") + lines.append(f"15m momentum: {mom} ({mom_score:.3f}%)") + if r1 is not None: lines.append(f"RSI(14,1m): {r1:.0f} {'OVERBOUGHT' if r1>70 else 'OVERSOLD' if r1<30 else 'neutral'}") + if r5 is not None: lines.append(f"RSI(14,5m): {r5:.0f} {'OVERBOUGHT' if r5>70 else 'OVERSOLD' if r5<30 else 'neutral'}") + + # Multi-timeframe trend + rows = conn.execute("SELECT ts, price FROM ticks WHERE ts > ? ORDER BY ts", + (time.time()-7200,)).fetchall() + if len(rows) >= 8: + def ret_at(minutes): + ref = min(rows, key=lambda r: abs(r[0]-(time.time()-minutes*60)))[1] + return (price-ref)/ref*100 if ref else 0 + lines.append(f"trend 1m: {ret_at(1):+.3f}% | 5m: {ret_at(5):+.3f}% | 15m: {ret_at(15):+.3f}% | 1h: {ret_at(60):+.2f}% | 2h: {ret_at(120):+.2f}%") + + # 24h stats + if "chg24" in ix: + lines.append(f"24h change: {ix['chg24']:+.2f}% | range: ${ix.get('low24',0):,.2f}-${ix.get('high24',0):,.2f} | vol24: {ix.get('vol24',0):,.0f}") + + # BTC correlation + btc_chg = ix.get("chg24", 0) + if abs(btc_chg) > 0.3: + lines.append(f"BTC 24h: {btc_chg:+.1f}% ({'bullish' if btc_chg>0 else 'bearish'}) — {'coin follows' if coin=='BTC' else 'alt follows macro'}") + + # Orderbook depth (if ticker available) + ticker = getattr(cfg, '_current_ticker', None) + if ticker: + try: + kx = Kalshi(cfg["api_key_id"], cfg["key_path"]) + book = kx.orderbook(ticker) + yes = book.get("yes",[]); no = book.get("no",[]) + if yes and no: + y_ask = yes[0][0]; n_ask = no[0][0] + spread = abs(y_ask - n_ask) + lines.append(f"orderbook: YES ask={y_ask}¢ NO ask={n_ask}¢ spread={spread}¢") + # imbalance + y_depth = sum(o[1] for o in yes[:3]) if len(yes)>=3 else 0 + n_depth = sum(o[1] for o in no[:3]) if len(no)>=3 else 0 + if y_depth+n_depth > 0: + imb = (y_depth - n_depth) / (y_depth + n_depth) + lines.append(f"orderbook imbalance: {'YES-heavy' if imb>0.15 else 'NO-heavy' if imb<-0.15 else 'balanced'} ({imb:+.2f})") + except Exception: + pass + + # Fear&Greed + if "fng" in ix: + lines.append(f"Fear&Greed: {ix['fng']} ({ix.get('fng_class','')})") + + # Per-coin recent performance + perf = conn.execute("SELECT COUNT(*), SUM(CASE WHEN pnl_cents>0 THEN 1 ELSE 0 END) FROM orders WHERE dry=0 AND status IN ('won','lost') AND ts > ?", + (time.time()-86400,)).fetchone() + total, wins = perf[0] or 0, perf[1] or 0 + if total >= 3: + wr = wins / total + lines.append(f"{coin} 24h record: {wins}W/{total-wins}L ({wr:.0%})") + + # Market regime + if len(rows) >= 20: + prices = [r[1] for r in rows[-20:]] + mean = sum(prices)/len(prices) + std = (sum((p-mean)**2 for p in prices)/len(prices))**0.5 + vol = std/mean*100 if mean else 0 + regime = "choppy" if vol < 0.01 else "trending" if vol > 0.05 else "normal" + lines.append(f"market regime: {regime} (vol={vol:.3f}%)") + + # On-chain + if "fee_fast" in ix: + lines.append(f"mempool fast fee: {ix['fee_fast']} sat/vB") + + lines.append("") + lines.append("You trade 15-minute crypto up/down binary contracts by FADING spikes:") + lines.append("- Sharp UP move → bet DOWN (mean reversion)") + lines.append("- Sharp DOWN move → bet UP (mean reversion)") + lines.append("- SKIP when: strong trend continuation, thin orderbook, BTC-fighting trade, or no clear edge") + lines.append("- Consider: RSI extremes (>80 or <20 = high-prob fade), 24h range position, BTC macro direction") + lines.append("Reply with ONLY JSON: {\"vote\":\"UP\"|\"DOWN\"|\"SKIP\",\"conf\":0.0-1.0,\"why\":\"<10 words>\"}") + return "\n".join(lines) + """Two-tier: qwen3.5 (fast gate, 0.4s on MacBook) → ornith (deep verify on RTX 3070). + Gate handles clear signals; borderline calls escalate to ornith for final verdict.""" + coin = cfg.get("coin","BTC") + ix = intel(coin); r = rsi(conn) + prompt = enriched_context(cfg, price, mom, mom_score, conn) + try: + fast_url = cfg.get("fast_llm_url", cfg.get("ollama_url","http://localhost:11434")) + fast_model = cfg.get("fast_llm_model", "qwen3.5:4b") + r1 = requests.post(fast_url+"/api/generate", + json={"model": fast_model, "prompt": prompt, "stream": False, "think": False, + "options": {"temperature": 0.3, "num_predict": 60}}, timeout=8) + txt = r1.json().get("response","") + s, e = txt.find("{"), txt.rfind("}")+1 + d1 = json.loads(txt[s:e]) if s >= 0 else {} + fast_v, fast_c, fast_w = str(d1.get("vote","BORDERLINE")).upper(), float(d1.get("conf",0.5)), str(d1.get("why",""))[:120] + except Exception as ex: + fast_v, fast_c, fast_w = "BORDERLINE", 0.50, f"gate: {str(ex)[:40]}" + + if fast_v == "BORDERLINE" or (fast_v in ("UP","DOWN") and fast_c < 0.70): + try: + deep_url = cfg.get("deep_llm_url", cfg.get("ollama_url","http://10.30.20.186:11434")) + deep_model = cfg.get("deep_llm_model", cfg.get("ollama_model","ornith:latest")) + r2 = requests.post(deep_url+"/api/generate", + json={"model": deep_model, "prompt": prompt, "stream": False, "think": False, + "options": {"temperature": 0.2, "num_predict": 90}}, timeout=60) + txt2 = r2.json().get("response","") + s2, e2 = txt2.find("{"), txt2.rfind("}")+1 + d2 = json.loads(txt2[s2:e2]) if s2 >= 0 else {} + v = str(d2.get("vote","SKIP")).upper() + if v not in ("UP","DOWN","SKIP"): v = "SKIP" + return v, float(d2.get("conf",0)), str(d2.get("why",""))[:120] + except Exception as ex2: + LOG.warning(f"deep llm failed: {ex2}") + if fast_v in ("UP","DOWN","SKIP"): return fast_v, fast_c, fast_w + return "SKIP", 0.0, "llm offline" + if fast_v not in ("UP","DOWN","SKIP"): fast_v = "SKIP" + return fast_v, fast_c, fast_w + +def decide(cfg, conn, price): + """Two-tier decision: qwen fast-gate → ornith deep-verify. + RSI extremes → force mean-reversion. BTC macro trend → gate counter-trend bets. + Self-adapting thresholds from resolved bet performance.""" + mom, mom_score = momentum(conn) + lv, lc, lw = llm_vote(cfg, price, mom, mom_score, conn) + mode = cfg["mode"] + 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: extreme readings → auto-fade ── + r = rsi(conn) + if r is not None: + if r > 85: + return mom, lv, lc, lw, "DOWN", f"⚠ RSI {r:.0f} extreme overbought → fade DOWN" + if r < 15: + return mom, lv, lc, lw, "UP", f"⚠ RSI {r:.0f} extreme oversold → fade UP" + + # ── swing threshold gate ── + thr = cfg.get("swing_threshold_pct", 0.005) + if mom == "FLAT" or mom_score < thr: + return mom, lv, lc, lw, "SKIP", f"no swing ({mom_score:.3f}% < {thr}%)" + if lv not in ("UP", "DOWN"): + return mom, lv, lc, lw, "SKIP", f"passes: {lw}" + + # ── BTC macro correlation: don't fight the trend ── + coin = cfg.get("coin","BTC") + ix = intel(coin) + btc_chg = ix.get("chg24", 0) + if lv == "DOWN" and btc_chg > 0.5: + if lc < 0.78: + return mom, lv, lc, lw, "SKIP", f"BTC +{btc_chg:.1f}% 24h — no counter-trend shorts (conf {lc:.2f}<0.78)" + if lv == "UP" and btc_chg < -0.5: + if lc < 0.78: + return mom, lv, lc, lw, "SKIP", f"BTC {btc_chg:.1f}% 24h — no counter-trend longs (conf {lc:.2f}<0.78)" + + # ── adaptive confidence (self-tunes from resolved bets) ── + min_conf = learned_min_conf(conn, cfg) + + # ── self-adapting overrides (LLM-written after bet resolution) ── + override = conn.execute("SELECT v FROM kv WHERE k='control_override'").fetchone() + if override: + try: + ov = json.loads(override[0]) + if ov.get("force_min_conf"): min_conf = float(ov["force_min_conf"]) + thr = ov.get("force_swing_threshold", thr) + except Exception: pass + + if lc < min_conf: + return mom, lv, lc, lw, "SKIP", f"conf {lc:.2f}<{min_conf:.2f} (adaptive)" + + return mom, lv, lc, lw, lv, f"{lv}: {mom} spike {mom_score:.2f}% conf={lc:.2f} [{lw[:60]}]" + +# ───────── learning: resolve + adapt ───────── +def learned_min_conf(conn, cfg): + """Adaptive confidence: rises after losses, relaxes after wins. Persisted in kv table.""" + if not cfg.get("learning", True): + return cfg.get("min_conf", 0.55) + row = conn.execute("SELECT v FROM kv WHERE k='min_conf'").fetchone() + stored = row[0] if row else cfg.get("min_conf", 0.55) + res = conn.execute("SELECT pnl_cents FROM orders WHERE status IN ('won','lost') ORDER BY id DESC LIMIT 20").fetchall() + if len(res) < 8: + return stored + wr = sum(1 for r in res if r[0] and r[0] > 0) / len(res) + new = stored + if wr < 0.45: new = min(0.80, stored + 0.05) + elif wr > 0.60: new = max(0.50, stored - 0.05) + if new != stored: + conn.execute("INSERT OR REPLACE INTO kv VALUES ('min_conf', ?)", (new,)) + conn.commit() + return new + +def resolve_bets(kx, conn): + """Settle finished markets against real outcomes (sim AND live).""" + open_orders = conn.execute( + "SELECT id, ticker, side, count, price_cents, dry FROM orders WHERE status IN ('placed','posted')").fetchall() + for oid, ticker, side, count, px, dry in open_orders: + try: + m = kx.req("GET", f"/markets/{ticker}") + status = m.get("status") + if status not in ("settled", "finalized", "determined"): + # also catch expired-untraded: close_time passed + no result → mark dead + ct = m.get("close_time") + if ct: + from datetime import datetime, timezone + if datetime.fromisoformat(ct.replace("Z","+00:00")).timestamp() < time.time() - 120: + conn.execute("UPDATE orders SET status='expired', settle_ts=? WHERE id=?", (time.time(), oid)) + conn.commit() + continue + result = (m.get("result") or "").lower() # 'yes' | 'no' + if not result: + continue + won = (result == side) + pnl = (100 - px) * count if won else -px * count + conn.execute("UPDATE orders SET status=?, settle_ts=?, pnl_cents=? WHERE id=?", + ("won" if won else "lost", time.time(), pnl, oid)) + conn.commit() + log_event(conn, "info", f"{'[SIM] ' if dry else ''}{'WIN' if won else 'LOSS'} {ticker} {side}@{px}¢ → {result} ({'+' if won else ''}{pnl}¢)") + except Exception: + continue + +# ───────── counter-hedge: lock in profit on open positions ───────── +def hedge_positions(conn, kx, ticker, cfg, book): + """Scan open positions. If opposite side is cheap enough, buy it to lock profit. + Returns 'hedged' if a counter-order was placed, else None.""" + open_orders = conn.execute( + "SELECT id,side,price_cents FROM orders WHERE ticker=? AND status IN ('placed','posted')", + (ticker,)).fetchall() + if not open_orders: + return None + min_profit = cfg.get("min_profit_cents", 8) + 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") + opp_ask = (opp_ask_list or [[None]])[0][0] + if opp_ask is None: + continue + profit = 100 - entry_px - opp_ask + if profit >= min_profit: + res = kx.order(ticker, opp_side, 1, opp_ask, cfg["dry_run"]) + oid2 = res.get("order_id", res.get("order", {}).get("order_id", "hedge")) + conn.execute("INSERT INTO orders (ts,ticker,side,count,price_cents,dry,order_id,status) VALUES (?,?,?,?,?,?,?,?)", + (time.time(), ticker, opp_side, 1, opp_ask, 1 if cfg["dry_run"] else 0, str(oid2), "placed")) + conn.execute("UPDATE orders SET status='hedged' WHERE id=?", (oid,)) + conn.commit() + log_event(conn, "info", f"HEDGE {ticker}: {side}@{entry_px}¢ + {opp_side}@{opp_ask}¢ → locked {profit}¢") + return "hedged" + return None + + +# ───────── main loop ───────── +def daily_pnl(conn): + return conn.execute("SELECT COALESCE(SUM(pnl_cents),0) FROM orders WHERE date(ts,'unixepoch','localtime')=date('now','localtime') AND dry=0").fetchone()[0] + +_last_adapt_ts = 0 +def adapt_controls(conn, cfg): + """After bets resolve, ask qwen to self-tune: adjust thresholds, confidence, sizing.""" + global _last_adapt_ts + if time.time() - _last_adapt_ts < 600: # max every 10 min + return + resolved = conn.execute( + "SELECT side, pnl_cents, price_cents FROM orders WHERE status IN ('won','lost') ORDER BY id DESC LIMIT 20" + ).fetchall() + if len(resolved) < 5: + return + wins = sum(1 for r in resolved if r[1] and r[1] > 0) + wr = wins / len(resolved) + summary = {"recent_bets": len(resolved), "win_rate": round(wr, 2), + "wins": wins, "losses": len(resolved)-wins, + "avg_pnl": round(sum(r[1] for r in resolved if r[1])/len(resolved)) if resolved else 0} + prompt = ( + f"Bot trading performance: {json.dumps(summary)}. " + "Current settings: swing_threshold={cfg.get('swing_threshold_pct',0.005)}% " + "min_conf={cfg.get('min_conf',0.50)}. " + "Suggest adjustments to maximize net profit. Reply with ONLY JSON: " + '{"force_min_conf":0.50,"force_swing_threshold":0.005,"reason":"<10 words>"} ' + "or empty JSON {} if no changes needed." + ) + try: + fast_url = cfg.get("fast_llm_url", "http://localhost:11434") + r = requests.post(fast_url+"/api/generate", + json={"model": cfg.get("fast_llm_model","qwen3.5:4b"), "prompt": prompt, + "stream": False, "think": False, "options": {"temperature": 0.1, "num_predict": 80}}, + timeout=10) + txt = r.json().get("response","") + s, e = txt.find("{"), txt.rfind("}")+1 + ov = json.loads(txt[s:e]) if s >= 0 else {} + if ov and ov.get("reason"): + conn.execute("INSERT OR REPLACE INTO kv(k,v) VALUES ('control_override',?)", + (json.dumps(ov),)) + conn.commit() + LOG.info(f"🔧 self-adapt: {ov.get('reason')} — override={json.dumps({k:v for k,v in ov.items() if k!='reason'})}") + _last_adapt_ts = time.time() + except Exception: + pass # silently skip on failure + +# ───────── main loop ───────── + return conn.execute("SELECT COALESCE(SUM(pnl_cents),0) FROM orders WHERE date(ts,'unixepoch','localtime')=date('now','localtime') AND dry=0").fetchone()[0] + +def run(): + global HOME, CFG_PATH, DB_PATH + import argparse, fcntl + ap = argparse.ArgumentParser() + ap.add_argument("--config", default=str(HOME/"config.json"), help="config path") + ap.add_argument("--lock", default="bot", help="lock file name stem") + ap.add_argument("--db", default=None, help="db path (overrides config)") + args, _ = ap.parse_known_args() + CFG_PATH = Path(args.config) + HOME = CFG_PATH.parent + DB_PATH = Path(args.db) if args.db else (HOME / "state.db") + lock_fd = open(HOME / f"{args.lock}.lock", "w") + try: + fcntl.flock(lock_fd, fcntl.LOCK_EX | fcntl.LOCK_NB) + except OSError: + print("another bot instance is already running — exiting") + sys.exit(0) + cfg = load_cfg() + if cfg.get("proxy"): + os.environ["HTTP_PROXY"] = os.environ["HTTPS_PROXY"] = cfg["proxy"] + if cfg.get("db_path"): + DB_PATH = HOME / cfg["db_path"] + kx = Kalshi(cfg["api_key_id"], cfg["key_path"]) + conn = db() + log_event(conn, "info", f"K4LSH1_OPS online — mode={cfg['mode']} dry_run={cfg['dry_run']} stake={cfg['stake_cents']}¢ max_spend={cfg.get('max_spend_cents',100)}¢") + last_bet_market = None + last_decision_ts = None + # stagger startup to avoid simultaneous LLM calls + stagger = cfg.get("start_delay_sec", 0) + if stagger: + LOG.info(f"staggering start by {stagger}s") + time.sleep(stagger) + while True: + cfg = load_cfg() # hot reload (dashboard edits) + if cfg.get("kill"): + log_event(conn, "warning", "KILL switch engaged — bot halted") + break + try: + resolve_bets(kx, conn) + adapt_controls(conn, cfg) + p = btc_price(cfg.get("coin", "BTC")) + if p: + conn.execute("INSERT INTO ticks VALUES (?,?)", (time.time(), p)) + conn.execute("DELETE FROM ticks WHERE ts < ?", (time.time()-7200,)) + conn.commit() + coin = cfg.get("coin", "BTC") + if cfg["mode"] != "OFF" and p: + mkts = kx.markets(cfg["series"], "open", 3) + if mkts: + m = sorted(mkts, key=lambda x: x["close_time"])[-1] + ticker = m["ticker"] + 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 + book = kx.orderbook(ticker) + # hedge check: close profitable positions + if hedge_positions(conn, kx, ticker, cfg, book) == "hedged": + continue + 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] + ask = yes_ask if final == "UP" else (no_ask if final == "DOWN" else None) + side = "yes" if final == "UP" else "no" + conn.execute("INSERT INTO decisions (ts,ticker,mode,momentum,llm_vote,llm_conf,llm_why,final,price,reason) VALUES (?,?,?,?,?,?,?,?,?,?)", + (time.time(), ticker, cfg["mode"], mom, lv, lc, lw, final, p, why)) + conn.commit() + if final in ("UP","DOWN"): + if daily_pnl(conn) <= -cfg["daily_loss_cap_cents"]: + log_event(conn, "warning", "daily loss cap hit — sitting out") + continue + try: + verify = kx.req("GET", f"/markets/{ticker}") + st = verify.get("status", "open") + if st and st not in ("open", "active"): + log_event(conn, "info", f"skip {ticker}: market closed (status={st})") + continue + except Exception: + pass + # confidence-scaled contracts: max $1.00 total spend + max_spend = cfg.get("max_spend_cents", 100) + if ask and ask <= max_spend: + n = 1 if lc < 0.70 else (2 if lc < 0.80 else (3 if lc < 0.90 else 4)) + while n * ask > max_spend and n > 1: + n -= 1 + px = ask + maker = False + else: + n = 1 + px = min(cfg.get("post_price_cents", 50), max_spend) + maker = True + try: + res = kx.order(ticker, side, n, px, cfg["dry_run"]) + oid = res.get("order_id", res.get("order", {}).get("order_id", "sim")) + conn.execute("INSERT INTO orders (ts,ticker,side,count,price_cents,dry,order_id,status) VALUES (?,?,?,?,?,?,?,?)", + (time.time(), ticker, side, n, px, 1 if cfg["dry_run"] else 0, str(oid), "placed")) + conn.commit() + tag = "SIM" if cfg["dry_run"] else ("TAKER" if not maker else "POST") + log_event(conn, "info", f"{tag} {side.upper()} x{n} {ticker} @ {px}¢ — {why}") + except Exception as e: + log_event(conn, "warning", f"order failed: {e}") + else: + LOG.info(f"skip {ticker}: {why}") + except Exception as e: + log_event(conn, "error", f"loop error: {e}") + time.sleep(20) + +if __name__ == "__main__": + run() diff --git a/bot_console.log b/bot_console.log new file mode 100644 index 0000000..154d6fd --- /dev/null +++ b/bot_console.log @@ -0,0 +1,211 @@ +2026-08-01 21:32:22,951 K4LSH1_OPS online — mode=AUTO dry_run=True stake=50¢ +2026-08-01 21:32:27,370 skip KXBTC15M-26AUG020045-45: mom=FLAT llm=SKIP +2026-08-01 21:35:07,483 K4LSH1_OPS online — mode=AUTO dry_run=True stake=50¢ +2026-08-01 21:35:11,460 skip KXBTC15M-26AUG020045-45: mom=FLAT llm=SKIP +2026-08-01 21:35:46,925 K4LSH1_OPS online — mode=DOWN_SPAM dry_run=True stake=45¢ +2026-08-01 21:35:50,882 [SIM] MAKER-POST NO KXBTC15M-26AUG020045-45 @ 45¢ — spam-mode short +2026-08-01 21:36:36,636 K4LSH1_OPS online — mode=AUTO dry_run=True stake=50¢ +2026-08-01 21:36:39,490 skip KXBTC15M-26AUG020045-45: mom=FLAT llm=SKIP +2026-08-01 21:45:38,730 skip KXBTC15M-26AUG020100-00: mom=FLAT llm=SKIP +2026-08-01 21:45:40,622 skip KXBTC15M-26AUG020100-00: mom=FLAT llm=SKIP +2026-08-01 21:45:42,761 skip KXBTC15M-26AUG020100-00: mom=FLAT llm=SKIP +2026-08-01 21:45:45,645 skip KXBTC15M-26AUG020100-00: mom=FLAT llm=SKIP +2026-08-01 22:00:46,431 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-01 22:00:48,836 skip KXBTC15M-26AUG020115-15: ask None¢ > stake cap 20¢ +2026-08-01 22:00:56,705 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-01 22:00:58,206 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-01 22:01:07,999 skip KXBTC15M-26AUG020115-15: mom=UP llm=SKIP +2026-08-01 22:01:11,843 skip KXBTC15M-26AUG020115-15: ask None¢ > stake cap 20¢ +2026-08-01 22:01:24,692 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-01 22:01:26,687 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-01 22:01:35,077 skip KXBTC15M-26AUG020115-15: mom=UP llm=SKIP +2026-08-01 22:01:52,938 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-01 22:01:54,595 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-01 22:02:16,143 skip KXBTC15M-26AUG020115-15: mom=UP llm=SKIP +2026-08-01 22:02:23,023 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-01 22:02:46,485 skip KXBTC15M-26AUG020115-15: mom=FLAT llm=SKIP +2026-08-01 22:15:51,326 skip KXBTC15M-26AUG020130-30: mom=DOWN llm=SKIP +2026-08-01 22:15:53,252 skip KXBTC15M-26AUG020130-30: mom=DOWN llm=SKIP +2026-08-01 22:15:57,991 skip KXBTC15M-26AUG020130-30: mom=DOWN llm=SKIP +2026-08-01 22:16:00,178 skip KXBTC15M-26AUG020130-30: mom=DOWN llm=SKIP +2026-08-01 22:30:28,534 skip KXBTC15M-26AUG020145-45: mom=FLAT llm=SKIP +2026-08-01 22:30:30,798 skip KXBTC15M-26AUG020145-45: mom=FLAT llm=SKIP +2026-08-01 22:30:33,469 skip KXBTC15M-26AUG020145-45: mom=FLAT llm=SKIP +2026-08-01 22:30:35,447 skip KXBTC15M-26AUG020145-45: mom=FLAT llm=SKIP +2026-08-01 22:45:45,108 skip KXBTC15M-26AUG020200-00: mom=DOWN llm=SKIP +2026-08-01 22:45:46,902 skip KXBTC15M-26AUG020200-00: mom=DOWN llm=SKIP +2026-08-01 22:45:49,008 skip KXBTC15M-26AUG020200-00: mom=DOWN llm=SKIP +2026-08-01 22:45:50,847 skip KXBTC15M-26AUG020200-00: mom=DOWN llm=SKIP +2026-08-01 23:00:42,225 skip KXBTC15M-26AUG020215-15: mom=FLAT llm=SKIP +2026-08-01 23:00:44,082 skip KXBTC15M-26AUG020215-15: mom=FLAT llm=SKIP +2026-08-01 23:00:46,004 skip KXBTC15M-26AUG020215-15: mom=FLAT llm=SKIP +2026-08-01 23:00:55,206 skip KXBTC15M-26AUG020215-15: mom=FLAT llm=SKIP +2026-08-01 23:15:39,537 skip KXBTC15M-26AUG020230-30: mom=FLAT llm=SKIP +2026-08-01 23:15:41,592 skip KXBTC15M-26AUG020230-30: mom=FLAT llm=SKIP +2026-08-01 23:15:43,457 skip KXBTC15M-26AUG020230-30: mom=FLAT llm=SKIP +2026-08-01 23:15:47,287 skip KXBTC15M-26AUG020230-30: mom=FLAT llm=SKIP +2026-08-01 23:30:39,844 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-01 23:30:41,094 skip KXBTC15M-26AUG020245-45: mom=UP llm=SKIP +2026-08-01 23:30:43,887 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-01 23:30:47,443 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-01 23:31:02,912 skip KXBTC15M-26AUG020245-45: mom=UP llm=SKIP +2026-08-01 23:31:06,956 skip KXBTC15M-26AUG020245-45: mom=UP llm=SKIP +2026-08-01 23:31:15,212 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-01 23:31:38,420 skip KXBTC15M-26AUG020245-45: mom=UP llm=SKIP +2026-08-01 23:45:33,888 skip KXBTC15M-26AUG020300-00: mom=FLAT llm=SKIP +2026-08-01 23:45:35,575 skip KXBTC15M-26AUG020300-00: mom=FLAT llm=SKIP +2026-08-01 23:45:37,428 skip KXBTC15M-26AUG020300-00: mom=FLAT llm=SKIP +2026-08-01 23:45:42,154 skip KXBTC15M-26AUG020300-00: mom=FLAT llm=SKIP +2026-08-02 00:00:28,526 skip KXBTC15M-26AUG020315-15: mom=FLAT llm=SKIP +2026-08-02 00:00:30,216 skip KXBTC15M-26AUG020315-15: mom=FLAT llm=SKIP +2026-08-02 00:00:32,066 skip KXBTC15M-26AUG020315-15: mom=FLAT llm=SKIP +2026-08-02 00:00:35,709 skip KXBTC15M-26AUG020315-15: mom=FLAT llm=SKIP +2026-08-02 00:15:26,330 skip KXBTC15M-26AUG020330-30: mom=FLAT llm=SKIP +2026-08-02 00:15:28,171 skip KXBTC15M-26AUG020330-30: mom=FLAT llm=SKIP +2026-08-02 00:15:30,051 skip KXBTC15M-26AUG020330-30: mom=FLAT llm=SKIP +2026-08-02 00:15:31,894 skip KXBTC15M-26AUG020330-30: mom=FLAT llm=SKIP +2026-08-02 00:30:41,938 skip KXBTC15M-26AUG020345-45: mom=FLAT llm=SKIP +2026-08-02 00:30:43,537 skip KXBTC15M-26AUG020345-45: mom=FLAT llm=SKIP +2026-08-02 00:30:45,416 skip KXBTC15M-26AUG020345-45: mom=FLAT llm=SKIP +2026-08-02 00:30:47,247 skip KXBTC15M-26AUG020345-45: mom=FLAT llm=SKIP +2026-08-02 00:45:35,241 skip KXBTC15M-26AUG020400-00: mom=UP llm=SKIP +2026-08-02 00:45:38,670 skip KXBTC15M-26AUG020400-00: mom=UP llm=SKIP +2026-08-02 00:45:45,948 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-02 00:45:47,847 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-02 00:46:08,932 skip KXBTC15M-26AUG020400-00: mom=FLAT llm=SKIP +2026-08-02 00:46:11,559 skip KXBTC15M-26AUG020400-00: mom=FLAT llm=SKIP +2026-08-02 01:00:42,618 skip KXBTC15M-26AUG020415-15: mom=FLAT llm=SKIP +2026-08-02 01:00:44,309 skip KXBTC15M-26AUG020415-15: mom=FLAT llm=SKIP +2026-08-02 01:00:45,798 skip KXBTC15M-26AUG020415-15: mom=FLAT llm=SKIP +2026-08-02 01:00:49,527 skip KXBTC15M-26AUG020415-15: mom=FLAT llm=SKIP +2026-08-02 01:15:57,060 skip KXBTC15M-26AUG020430-30: mom=FLAT llm=SKIP +2026-08-02 01:15:58,723 skip KXBTC15M-26AUG020430-30: mom=FLAT llm=SKIP +2026-08-02 01:16:01,867 skip KXBTC15M-26AUG020430-30: mom=FLAT llm=SKIP +2026-08-02 01:16:03,992 skip KXBTC15M-26AUG020430-30: mom=FLAT llm=SKIP +2026-08-02 01:30:09,358 skip KXBTC15M-26AUG020445-45: mom=DOWN llm=SKIP +2026-08-02 01:30:12,000 skip KXBTC15M-26AUG020445-45: mom=DOWN llm=SKIP +2026-08-02 01:30:13,246 skip KXBTC15M-26AUG020445-45: mom=DOWN llm=SKIP +2026-08-02 01:30:14,406 skip KXBTC15M-26AUG020445-45: ask None¢ > stake cap 20¢ +2026-08-02 01:30:36,032 skip KXBTC15M-26AUG020445-45: mom=DOWN llm=SKIP +2026-08-02 01:45:43,435 skip KXBTC15M-26AUG020500-00: mom=DOWN llm=SKIP +2026-08-02 01:45:44,342 skip KXBTC15M-26AUG020500-00: mom=DOWN llm=SKIP +2026-08-02 01:45:45,943 skip KXBTC15M-26AUG020500-00: mom=DOWN llm=SKIP +2026-08-02 01:45:46,896 skip KXBTC15M-26AUG020500-00: mom=DOWN llm=SKIP +2026-08-02 02:00:37,677 skip KXBTC15M-26AUG020515-15: mom=FLAT llm=SKIP +2026-08-02 02:00:39,938 skip KXBTC15M-26AUG020515-15: mom=FLAT llm=SKIP +2026-08-02 02:00:40,906 skip KXBTC15M-26AUG020515-15: mom=FLAT llm=SKIP +2026-08-02 02:00:41,808 skip KXBTC15M-26AUG020515-15: mom=FLAT llm=SKIP +2026-08-02 02:15:30,670 skip KXBTC15M-26AUG020530-30: mom=UP llm=SKIP +2026-08-02 02:15:31,451 skip KXBTC15M-26AUG020530-30: mom=UP llm=SKIP +2026-08-02 02:15:32,257 skip KXBTC15M-26AUG020530-30: mom=UP llm=SKIP +2026-08-02 02:15:33,869 skip KXBTC15M-26AUG020530-30: ask None¢ > stake cap 20¢ +2026-08-02 02:15:55,453 skip KXBTC15M-26AUG020530-30: mom=UP llm=SKIP +2026-08-02 02:30:18,871 skip KXBTC15M-26AUG020545-45: mom=DOWN llm=SKIP +2026-08-02 02:30:19,876 skip KXBTC15M-26AUG020545-45: mom=DOWN llm=SKIP +2026-08-02 02:30:20,815 skip KXBTC15M-26AUG020545-45: mom=DOWN llm=SKIP +2026-08-02 02:30:22,225 skip KXBTC15M-26AUG020545-45: mom=DOWN llm=SKIP +2026-08-02 02:45:52,336 skip KXBTC15M-26AUG020600-00: mom=FLAT llm=SKIP +2026-08-02 02:45:53,166 skip KXBTC15M-26AUG020600-00: mom=FLAT llm=SKIP +2026-08-02 02:45:53,865 skip KXBTC15M-26AUG020600-00: mom=FLAT llm=SKIP +2026-08-02 02:45:54,729 skip KXBTC15M-26AUG020600-00: mom=FLAT llm=SKIP +2026-08-02 02:58:32,790 loop error: HTTPSConnectionPool(host='api.elections.kalshi.com', port=443): Read timed out. (read timeout=15) +2026-08-02 02:58:33,719 loop error: HTTPSConnectionPool(host='api.elections.kalshi.com', port=443): Read timed out. (read timeout=15) +2026-08-02 02:58:34,346 loop error: HTTPSConnectionPool(host='api.elections.kalshi.com', port=443): Read timed out. (read timeout=15) +2026-08-02 02:58:35,283 loop error: HTTPSConnectionPool(host='api.elections.kalshi.com', port=443): Read timed out. (read timeout=15) +2026-08-02 02:59:04,974 loop error: HTTPSConnectionPool(host='api.elections.kalshi.com', port=443): Max retries exceeded with url: /trade-api/v2/markets?series_ticker=KXBTC15M&status=open&limit=3 (Caused by SSLError(SSLEOFError(8, '[SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1016)'))) +2026-08-02 02:59:05,856 loop error: HTTPSConnectionPool(host='api.elections.kalshi.com', port=443): Max retries exceeded with url: /trade-api/v2/markets?series_ticker=KXBTC15M&status=open&limit=3 (Caused by SSLError(SSLEOFError(8, '[SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1016)'))) +2026-08-02 02:59:06,478 loop error: HTTPSConnectionPool(host='api.elections.kalshi.com', port=443): Max retries exceeded with url: /trade-api/v2/markets?series_ticker=KXBTC15M&status=open&limit=3 (Caused by SSLError(SSLEOFError(8, '[SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1016)'))) +2026-08-02 02:59:07,417 loop error: HTTPSConnectionPool(host='api.elections.kalshi.com', port=443): Max retries exceeded with url: /trade-api/v2/markets?series_ticker=KXBTC15M&status=open&limit=3 (Caused by SSLError(SSLEOFError(8, '[SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1016)'))) +2026-08-02 02:59:37,144 loop error: HTTPSConnectionPool(host='api.elections.kalshi.com', port=443): Max retries exceeded with url: /trade-api/v2/markets?series_ticker=KXBTC15M&status=open&limit=3 (Caused by SSLError(SSLEOFError(8, '[SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1016)'))) +2026-08-02 02:59:38,018 loop error: HTTPSConnectionPool(host='api.elections.kalshi.com', port=443): Max retries exceeded with url: /trade-api/v2/markets?series_ticker=KXBTC15M&status=open&limit=3 (Caused by SSLError(SSLEOFError(8, '[SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1016)'))) +2026-08-02 02:59:38,626 loop error: HTTPSConnectionPool(host='api.elections.kalshi.com', port=443): Max retries exceeded with url: /trade-api/v2/markets?series_ticker=KXBTC15M&status=open&limit=3 (Caused by SSLError(SSLEOFError(8, '[SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1016)'))) +2026-08-02 02:59:39,575 loop error: HTTPSConnectionPool(host='api.elections.kalshi.com', port=443): Max retries exceeded with url: /trade-api/v2/markets?series_ticker=KXBTC15M&status=open&limit=3 (Caused by SSLError(SSLEOFError(8, '[SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1016)'))) +2026-08-02 03:00:43,157 skip KXBTC15M-26AUG020615-15: mom=FLAT llm=SKIP +2026-08-02 03:00:45,057 skip KXBTC15M-26AUG020615-15: mom=FLAT llm=SKIP +2026-08-02 03:00:45,891 skip KXBTC15M-26AUG020615-15: mom=FLAT llm=SKIP +2026-08-02 03:00:46,736 skip KXBTC15M-26AUG020615-15: mom=FLAT llm=SKIP +2026-08-02 03:15:16,790 skip KXBTC15M-26AUG020630-30: mom=DOWN llm=SKIP +2026-08-02 03:15:18,273 skip KXBTC15M-26AUG020630-30: mom=DOWN llm=SKIP +2026-08-02 03:15:18,602 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-02 03:15:19,599 skip KXBTC15M-26AUG020630-30: mom=DOWN llm=SKIP +2026-08-02 03:16:12,711 skip KXBTC15M-26AUG020630-30: mom=DOWN llm=SKIP +2026-08-02 03:31:24,240 ollama vote failed: HTTPConnectionPool(host='localhost', port=11434): Read timed out. (read timeout=45) +2026-08-02 03:31:24,365 skip KXBTC15M-26AUG020645-45: mom=FLAT llm=SKIP +2026-08-02 03:31:25,838 skip KXBTC15M-26AUG020645-45: mom=FLAT llm=SKIP +2026-08-02 03:31:29,474 skip KXBTC15M-26AUG020645-45: mom=FLAT llm=SKIP +2026-08-02 03:31:30,958 skip KXBTC15M-26AUG020645-45: mom=FLAT llm=SKIP +2026-08-02 03:45:56,982 skip KXBTC15M-26AUG020700-00: mom=UP llm=SKIP +2026-08-02 03:45:59,371 skip KXBTC15M-26AUG020700-00: mom=UP llm=SKIP +2026-08-02 03:46:02,520 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-02 03:46:04,909 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-02 03:46:23,849 skip KXBTC15M-26AUG020700-00: mom=UP llm=SKIP +2026-08-02 03:46:26,271 skip KXBTC15M-26AUG020700-00: mom=UP llm=SKIP +2026-08-02 04:00:19,304 skip KXBTC15M-26AUG020715-15: mom=FLAT llm=SKIP +2026-08-02 04:00:26,091 skip KXBTC15M-26AUG020715-15: mom=FLAT llm=SKIP +2026-08-02 04:00:28,049 skip KXBTC15M-26AUG020715-15: mom=FLAT llm=SKIP +2026-08-02 04:00:31,611 skip KXBTC15M-26AUG020715-15: mom=FLAT llm=SKIP +2026-08-02 04:15:31,974 skip KXBTC15M-26AUG020730-30: mom=FLAT llm=SKIP +2026-08-02 04:15:34,753 skip KXBTC15M-26AUG020730-30: mom=FLAT llm=SKIP +2026-08-02 04:15:36,597 skip KXBTC15M-26AUG020730-30: mom=FLAT llm=SKIP +2026-08-02 04:15:39,965 skip KXBTC15M-26AUG020730-30: mom=FLAT llm=SKIP +2026-08-02 04:30:24,112 skip KXBTC15M-26AUG020745-45: mom=FLAT llm=SKIP +2026-08-02 04:30:25,736 skip KXBTC15M-26AUG020745-45: mom=FLAT llm=SKIP +2026-08-02 04:30:26,838 skip KXBTC15M-26AUG020745-45: mom=FLAT llm=SKIP +2026-08-02 04:30:27,694 skip KXBTC15M-26AUG020745-45: mom=FLAT llm=SKIP +2026-08-02 04:45:36,785 skip KXBTC15M-26AUG020800-00: mom=DOWN llm=SKIP +2026-08-02 04:45:37,654 skip KXBTC15M-26AUG020800-00: mom=DOWN llm=SKIP +2026-08-02 04:45:38,559 skip KXBTC15M-26AUG020800-00: mom=DOWN llm=SKIP +2026-08-02 04:45:40,349 skip KXBTC15M-26AUG020800-00: mom=DOWN llm=SKIP +2026-08-02 05:00:49,635 skip KXBTC15M-26AUG020815-15: mom=FLAT llm=SKIP +2026-08-02 05:00:50,833 skip KXBTC15M-26AUG020815-15: mom=FLAT llm=SKIP +2026-08-02 05:00:52,855 skip KXBTC15M-26AUG020815-15: mom=FLAT llm=SKIP +2026-08-02 05:00:53,719 skip KXBTC15M-26AUG020815-15: mom=FLAT llm=SKIP +2026-08-02 05:15:26,120 skip KXBTC15M-26AUG020830-30: ask None¢ > stake cap 20¢ +2026-08-02 05:15:28,115 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-02 05:15:28,866 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-02 05:15:30,023 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-02 05:15:47,650 skip KXBTC15M-26AUG020830-30: mom=UP llm=SKIP +2026-08-02 05:15:49,350 skip KXBTC15M-26AUG020830-30: mom=UP llm=SKIP +2026-08-02 05:15:50,158 skip KXBTC15M-26AUG020830-30: mom=UP llm=SKIP +2026-08-02 05:15:56,001 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-02 05:16:22,405 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-02 05:16:48,860 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-02 05:17:10,408 skip KXBTC15M-26AUG020830-30: mom=UP llm=SKIP +2026-08-02 05:30:35,693 skip KXBTC15M-26AUG020845-45: mom=FLAT llm=SKIP +2026-08-02 05:30:36,662 skip KXBTC15M-26AUG020845-45: mom=FLAT llm=SKIP +2026-08-02 05:30:37,971 skip KXBTC15M-26AUG020845-45: mom=FLAT llm=SKIP +2026-08-02 05:30:38,801 skip KXBTC15M-26AUG020845-45: mom=FLAT llm=SKIP +2026-08-02 05:45:26,802 skip KXBTC15M-26AUG020900-00: mom=FLAT llm=SKIP +2026-08-02 05:45:27,631 skip KXBTC15M-26AUG020900-00: mom=FLAT llm=SKIP +2026-08-02 05:45:28,427 skip KXBTC15M-26AUG020900-00: mom=FLAT llm=SKIP +2026-08-02 05:45:30,046 skip KXBTC15M-26AUG020900-00: mom=FLAT llm=SKIP +2026-08-02 06:01:18,133 ollama vote failed: HTTPConnectionPool(host='localhost', port=11434): Read timed out. (read timeout=45) +2026-08-02 06:01:18,224 skip KXBTC15M-26AUG020915-15: mom=DOWN llm=SKIP +2026-08-02 06:01:19,219 ollama vote failed: HTTPConnectionPool(host='localhost', port=11434): Read timed out. (read timeout=45) +2026-08-02 06:01:19,298 skip KXBTC15M-26AUG020915-15: mom=DOWN llm=SKIP +2026-08-02 06:01:19,397 ollama vote failed: HTTPConnectionPool(host='localhost', port=11434): Read timed out. (read timeout=45) +2026-08-02 06:01:19,526 skip KXBTC15M-26AUG020915-15: mom=DOWN llm=SKIP +2026-08-02 06:01:21,685 ollama vote failed: HTTPConnectionPool(host='localhost', port=11434): Read timed out. (read timeout=45) +2026-08-02 06:01:21,767 skip KXBTC15M-26AUG020915-15: mom=DOWN llm=SKIP +2026-08-02 06:15:47,149 skip KXBTC15M-26AUG020930-30: mom=FLAT llm=SKIP +2026-08-02 06:15:48,039 skip KXBTC15M-26AUG020930-30: mom=FLAT llm=SKIP +2026-08-02 06:15:49,804 skip KXBTC15M-26AUG020930-30: mom=FLAT llm=SKIP +2026-08-02 06:15:51,210 skip KXBTC15M-26AUG020930-30: mom=FLAT llm=SKIP +2026-08-02 06:30:39,593 skip KXBTC15M-26AUG020945-45: mom=FLAT llm=SKIP +2026-08-02 06:30:40,731 skip KXBTC15M-26AUG020945-45: mom=FLAT llm=SKIP +2026-08-02 06:30:41,544 skip KXBTC15M-26AUG020945-45: mom=FLAT llm=SKIP +2026-08-02 06:30:43,148 skip KXBTC15M-26AUG020945-45: mom=FLAT llm=SKIP +2026-08-02 06:45:31,886 skip KXBTC15M-26AUG021000-00: mom=UP llm=SKIP +2026-08-02 06:45:32,885 skip KXBTC15M-26AUG021000-00: mom=UP llm=SKIP +2026-08-02 06:45:33,761 skip KXBTC15M-26AUG021000-00: ask None¢ > stake cap 20¢ +2026-08-02 06:45:40,288 order failed: 410 Client Error: Gone for url: https://api.elections.kalshi.com/trade-api/v2/portfolio/orders +2026-08-02 06:45:55,288 skip KXBTC15M-26AUG021000-00: mom=UP llm=SKIP +2026-08-02 06:46:01,890 skip KXBTC15M-26AUG021000-00: mom=FLAT llm=SKIP +2026-08-02 07:00:24,822 skip KXBTC15M-26AUG021015-15: mom=FLAT llm=SKIP +2026-08-02 07:00:25,531 skip KXBTC15M-26AUG021015-15: mom=FLAT llm=SKIP +2026-08-02 07:00:26,365 skip KXBTC15M-26AUG021015-15: mom=FLAT llm=SKIP +2026-08-02 07:00:29,759 skip KXBTC15M-26AUG021015-15: mom=FLAT llm=SKIP +2026-08-02 07:15:34,740 skip KXBTC15M-26AUG021030-30: mom=FLAT llm=SKIP +2026-08-02 07:15:35,872 skip KXBTC15M-26AUG021030-30: mom=FLAT llm=SKIP +2026-08-02 07:15:36,714 skip KXBTC15M-26AUG021030-30: mom=FLAT llm=SKIP +2026-08-02 07:15:38,394 skip KXBTC15M-26AUG021030-30: mom=FLAT llm=SKIP diff --git a/config.json b/config.json new file mode 100644 index 0000000..c03e073 --- /dev/null +++ b/config.json @@ -0,0 +1,16 @@ +{ + "api_key_id": "28d5876b-2ece-4aa3-aa17-ec96e1e706eb", + "key_path": "/Users/drjones/kalshi-bot/kalshi_private_key.pem", + "mode": "AUTO", + "dry_run": false, + "stake_cents": 15, + "max_contracts": 1, + "daily_loss_cap_cents": 500, + "min_conf": 0.55, + "ollama_url": "http://10.30.20.186:11434", + "ollama_model": "ornith:latest", + "series": "KXDOGE15M", + "kill": false, + "swing_threshold_pct": 0.06, + "learning": true +} diff --git a/dash_console.log b/dash_console.log new file mode 100644 index 0000000..28bb8b3 --- /dev/null +++ b/dash_console.log @@ -0,0 +1,75 @@ + * Serving Flask app 'dashboard' + * Debug mode: off +WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5053 + * Running on http://10.5.0.2:5053 +Press CTRL+C to quit +127.0.0.1 - - [01/Aug/2026 21:32:48] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:32:48,554 127.0.0.1 - - [01/Aug/2026 21:32:48] "GET /api/state HTTP/1.1" 200 - + * Serving Flask app 'dashboard' + * Debug mode: off +Address already in use +Port 5053 is in use by another program. Either identify and stop that program, or start the server with a different port. +127.0.0.1 - - [01/Aug/2026 21:35:45] "POST /api/control HTTP/1.1" 200 - +2026-08-01 21:35:45,702 127.0.0.1 - - [01/Aug/2026 21:35:45] "POST /api/control HTTP/1.1" 200 - +127.0.0.1 - - [01/Aug/2026 21:36:35] "POST /api/control HTTP/1.1" 200 - +2026-08-01 21:36:35,412 127.0.0.1 - - [01/Aug/2026 21:36:35] "POST /api/control HTTP/1.1" 200 - +127.0.0.1 - - [01/Aug/2026 21:36:51] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:36:51,971 127.0.0.1 - - [01/Aug/2026 21:36:51] "GET /api/state HTTP/1.1" 200 - +127.0.0.1 - - [01/Aug/2026 21:37:51] "GET / HTTP/1.1" 200 - +2026-08-01 21:37:51,322 127.0.0.1 - - [01/Aug/2026 21:37:51] "GET / HTTP/1.1" 200 - +127.0.0.1 - - [01/Aug/2026 21:37:51] "GET /favicon.ico HTTP/1.1" 404 - +2026-08-01 21:37:51,475 127.0.0.1 - - [01/Aug/2026 21:37:51] "GET /favicon.ico HTTP/1.1" 404 - +127.0.0.1 - - [01/Aug/2026 21:37:51] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:37:51,931 127.0.0.1 - - [01/Aug/2026 21:37:51] "GET /api/state HTTP/1.1" 200 - +127.0.0.1 - - [01/Aug/2026 21:37:56] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:37:56,802 127.0.0.1 - - [01/Aug/2026 21:37:56] "GET /api/state HTTP/1.1" 200 - +127.0.0.1 - - [01/Aug/2026 21:38:01] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:38:01,781 127.0.0.1 - - [01/Aug/2026 21:38:01] "GET /api/state HTTP/1.1" 200 - +127.0.0.1 - - [01/Aug/2026 21:38:06] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:38:06,979 127.0.0.1 - - [01/Aug/2026 21:38:06] "GET /api/state HTTP/1.1" 200 - +127.0.0.1 - - [01/Aug/2026 21:38:11] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:38:11,858 127.0.0.1 - - [01/Aug/2026 21:38:11] "GET /api/state HTTP/1.1" 200 - +127.0.0.1 - - [01/Aug/2026 21:38:16] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:38:16,859 127.0.0.1 - - [01/Aug/2026 21:38:16] "GET /api/state HTTP/1.1" 200 - +127.0.0.1 - - [01/Aug/2026 21:38:21] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:38:21,861 127.0.0.1 - - [01/Aug/2026 21:38:21] "GET /api/state HTTP/1.1" 200 - +127.0.0.1 - - [01/Aug/2026 21:38:26] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:38:26,861 127.0.0.1 - - [01/Aug/2026 21:38:26] "GET /api/state HTTP/1.1" 200 - +127.0.0.1 - - [01/Aug/2026 21:38:31] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:38:31,775 127.0.0.1 - - [01/Aug/2026 21:38:31] "GET /api/state HTTP/1.1" 200 - +127.0.0.1 - - [01/Aug/2026 21:38:36] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:38:36,887 127.0.0.1 - - [01/Aug/2026 21:38:36] "GET /api/state HTTP/1.1" 200 - +127.0.0.1 - - [01/Aug/2026 21:38:41] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:38:41,957 127.0.0.1 - - [01/Aug/2026 21:38:41] "GET /api/state HTTP/1.1" 200 - +127.0.0.1 - - [01/Aug/2026 21:38:46] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:38:46,751 127.0.0.1 - - [01/Aug/2026 21:38:46] "GET /api/state HTTP/1.1" 200 - +127.0.0.1 - - [01/Aug/2026 21:38:51] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:38:51,850 127.0.0.1 - - [01/Aug/2026 21:38:51] "GET /api/state HTTP/1.1" 200 - +127.0.0.1 - - [01/Aug/2026 21:38:56] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:38:56,742 127.0.0.1 - - [01/Aug/2026 21:38:56] "GET /api/state HTTP/1.1" 200 - +127.0.0.1 - - [01/Aug/2026 21:39:01] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:39:01,740 127.0.0.1 - - [01/Aug/2026 21:39:01] "GET /api/state HTTP/1.1" 200 - +127.0.0.1 - - [01/Aug/2026 21:39:06] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:39:06,809 127.0.0.1 - - [01/Aug/2026 21:39:06] "GET /api/state HTTP/1.1" 200 - +127.0.0.1 - - [01/Aug/2026 21:39:11] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:39:11,751 127.0.0.1 - - [01/Aug/2026 21:39:11] "GET /api/state HTTP/1.1" 200 - +127.0.0.1 - - [01/Aug/2026 21:39:17] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:39:17,389 127.0.0.1 - - [01/Aug/2026 21:39:17] "GET /api/state HTTP/1.1" 200 - +127.0.0.1 - - [01/Aug/2026 21:39:21] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:39:21,827 127.0.0.1 - - [01/Aug/2026 21:39:21] "GET /api/state HTTP/1.1" 200 - +127.0.0.1 - - [01/Aug/2026 21:39:27] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:39:27,040 127.0.0.1 - - [01/Aug/2026 21:39:27] "GET /api/state HTTP/1.1" 200 - +127.0.0.1 - - [01/Aug/2026 21:39:31] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:39:31,777 127.0.0.1 - - [01/Aug/2026 21:39:31] "GET /api/state HTTP/1.1" 200 - +127.0.0.1 - - [01/Aug/2026 21:39:37] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:39:37,052 127.0.0.1 - - [01/Aug/2026 21:39:37] "GET /api/state HTTP/1.1" 200 - +127.0.0.1 - - [01/Aug/2026 21:39:41] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:39:41,781 127.0.0.1 - - [01/Aug/2026 21:39:41] "GET /api/state HTTP/1.1" 200 - +127.0.0.1 - - [01/Aug/2026 21:39:46] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:39:46,761 127.0.0.1 - - [01/Aug/2026 21:39:46] "GET /api/state HTTP/1.1" 200 - +127.0.0.1 - - [01/Aug/2026 21:39:51] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:39:51,853 127.0.0.1 - - [01/Aug/2026 21:39:51] "GET /api/state HTTP/1.1" 200 - +127.0.0.1 - - [01/Aug/2026 21:39:56] "GET /api/state HTTP/1.1" 200 - +2026-08-01 21:39:56,761 127.0.0.1 - - [01/Aug/2026 21:39:56] "GET /api/state HTTP/1.1" 200 - diff --git a/dashboard.py b/dashboard.py new file mode 100644 index 0000000..08afe8d --- /dev/null +++ b/dashboard.py @@ -0,0 +1,384 @@ +#!/usr/bin/env python3 +"""K4LSH1_OPS — dashboard. Hacker console on :5053. Controls write config.json (bot hot-reloads).""" +import json, sqlite3, time, threading +from pathlib import Path +from flask import Flask, jsonify, request + +HOME = Path(__file__).parent +CFG_PATH = HOME / "config.json" +DB_PATH = HOME / "state.db" +app = Flask(__name__) + +HTML = r"""K4LSH1_OPS + +
+

K4LSH1_OPS

+
+
+
+
+
+

BTC/USD — kraken

+
$—
+
+ +
+

active market

+
ticker
+
question
+
closes in
+
YES —¢NO —¢
+
+

account

+
balance
+
open positions
+
bets placed (session)
+
+
+
+

AI decision stream — ollama local

+

system events

+
+
+

controls

+
STRATEGY MODE
+ +
MAX STAKE / BET: 50¢
+ + + +
+

order blotter

+
+
+
+
+
MODE
+
BTC
+
24H
+
FEAR/GREED
+
OPEN BETS
+
RESOLVED P&L
+
WIN RATE
+
AI CONF GATE
+
NEXT MARKET
+
+""" + +FLEET_HTML = r"""K4LSH1 FLEET + + +

K4LSH1_FLEET

+
+
+""" + + +def cfg(): + return json.loads(CFG_PATH.read_text()) + +@app.route("/") +def index(): + return HTML + +@app.route("/api/state") +def state(): + c = cfg() + conn = sqlite3.connect(DB_PATH) + conn.row_factory = sqlite3.Row + now = time.time() + ticks = [r[0] for r in conn.execute("SELECT price FROM ticks WHERE ts > ? ORDER BY ts", (now-1800,)).fetchall()] + last_price = ticks[-1] if ticks else None + age = None + row = conn.execute("SELECT MAX(ts) FROM ticks").fetchone() + if row and row[0]: age = int(now - row[0]) + dec = [{"t": time.strftime("%H:%M:%S", time.localtime(r["ts"])), "ticker": r["ticker"], + "momentum": r["momentum"], "llm_vote": r["llm_vote"], "llm_conf": r["llm_conf"], + "llm_why": r["llm_why"], "final": r["final"], "reason": r["reason"]} + for r in conn.execute("SELECT * FROM decisions ORDER BY id DESC LIMIT 30")] + orders = [{"t": time.strftime("%H:%M:%S", time.localtime(r["ts"])), "ticker": r["ticker"], + "side": r["side"], "count": r["count"], "price_cents": r["price_cents"], "dry": r["dry"]} + for r in conn.execute("SELECT * FROM orders ORDER BY id DESC LIMIT 20")] + events = [{"t": time.strftime("%H:%M:%S", time.localtime(r[0])), "level": r[1], "msg": r[2]} + for r in conn.execute("SELECT * FROM events ORDER BY ts DESC LIMIT 12")] + bets = conn.execute("SELECT COUNT(*) FROM orders").fetchone()[0] + perf_rows = conn.execute("SELECT status, COALESCE(pnl_cents,0) FROM orders WHERE status IN ('won','lost')").fetchall() + won = sum(1 for s,p in perf_rows if s == 'won') + pnl = sum(p for s,p in perf_rows) + open_bets = conn.execute("SELECT COUNT(*) FROM orders WHERE status IN ('placed','posted')").fetchone()[0] + kv = {r[0]: r[1] for r in conn.execute("SELECT k, v FROM kv")} + conn.close() + # live market + balance (proxy through bot's client without importing heavy code) + market, balance, positions = {}, None, 0 + try: + import sys + sys.path.insert(0, str(HOME)) + from bot import Kalshi, btc_price, DEFAULT_CFG + kx = Kalshi(c["api_key_id"], c["key_path"]) + mkts = kx.markets(c.get("series", "KXBTC15M"), "open", 2) + if mkts: + m = sorted(mkts, key=lambda x: x["close_time"])[-1] + from datetime import datetime + close_ts = datetime.fromisoformat(m["close_time"].replace("Z","+00:00")).timestamp() + book = kx.orderbook(m["ticker"]) + market = {"ticker": m["ticker"], "title": m.get("title",""), + "mins_left": (close_ts-time.time())/60, + "yes_ask": (book.get("yes") or [[None]])[0][0], + "no_ask": (book.get("no") or [[None]])[0][0]} + b = kx.balance() + balance = b.get("balance", 0) # available cash (cents) + positions = len(kx.positions()) + except Exception as e: + market = {"error": str(e)[:80]} + if last_price is None: + try: + from bot import btc_price + last_price = btc_price() + except Exception: pass + try: + from bot import intel as bot_intel + ix = bot_intel() + except Exception: + ix = {} + # momentum label + mom = "FLAT" + if len(ticks) > 10: + r = (ticks[-1]-ticks[0])/ticks[0]*100 + mom = f"{'UP' if r>0 else 'DOWN'} {abs(r):.3f}%/30m" + return jsonify({"cfg": c, "btc": last_price, "price_age": age, "spark": ticks[-120:], + "momentum": mom, "market": market, "balance": balance, + "positions": positions, "bets_session": bets, + "decisions": dec, "orders": orders, "events": events, + "intel": ix, + "perf": {"open": open_bets, "resolved": len(perf_rows), "won": won, + "pnl": pnl, "min_conf": kv.get("min_conf", c.get("min_conf", 0.55))}}) + +@app.route("/api/control", methods=["POST"]) +def control(): + c = cfg() + d = request.get_json(force=True) + if d.get("mode") in ("AUTO","DOWN_SPAM","UP_SPAM","OFF"): c["mode"] = d["mode"] + if isinstance(d.get("stake_cents"), int): c["stake_cents"] = max(1, min(99, d["stake_cents"])) + c["kill"] = False + CFG_PATH.write_text(json.dumps(c, indent=1)) + return jsonify({"ok": True}) + +@app.route("/api/toggle-dry", methods=["POST"]) +def toggle_dry(): + c = cfg(); c["dry_run"] = not c["dry_run"]; c["kill"] = False + CFG_PATH.write_text(json.dumps(c, indent=1)) + return jsonify({"ok": True, "dry_run": c["dry_run"]}) + +@app.route("/api/fleet") +def fleet_api(): + """All active coins in one call — reads each coin's own DB.""" + COINS = {"🐶DOGE": "#c2a633", "🔮SOL": "#9945FF", "💎ETH": "#627EEA"} + result = {} + for label, color in COINS.items(): + coin = label[1:] # strip leading emoji + fpath = HOME / f"{coin.lower()}.json" + if not fpath.exists(): continue + c = json.loads(fpath.read_text()) + if c.get("mode","OFF") == "OFF": continue + db_path = HOME / c.get("db_path", f"{coin.lower()}.db") + if not db_path.exists(): continue + conn = sqlite3.connect(str(db_path)) + conn.row_factory = sqlite3.Row + now = time.time() + ticks = [r[0] for r in conn.execute("SELECT price FROM ticks WHERE ts > ? ORDER BY ts", (now-1800,)).fetchall()] + last_price = ticks[-1] if ticks else None + # enriched per-coin data + decs = [dict(r) for r in conn.execute("SELECT * FROM decisions ORDER BY id DESC LIMIT 3")] + ords = [dict(r) for r in conn.execute("SELECT * FROM orders ORDER BY id DESC LIMIT 5")] + live_bets = conn.execute("SELECT COUNT(*) FROM orders WHERE status IN ('placed','posted') AND dry=0").fetchone()[0] + total_bets = conn.execute("SELECT COUNT(*) FROM orders WHERE dry=0").fetchone()[0] + pnl = conn.execute("SELECT COALESCE(SUM(pnl_cents),0) FROM orders WHERE dry=0").fetchone()[0] + won = conn.execute("SELECT COUNT(*) FROM orders WHERE status='won' AND dry=0").fetchone()[0] + import sys; sys.path.insert(0, str(HOME)) + from bot import rsi as _rsi, momentum as _mom + c_rsi = _rsi(conn); c_mom, c_score = _mom(conn) + chg24 = c.get("chg24_cache", 0) + result[coin] = {"label": label, "color": color, "series": c["series"], + "price": last_price, "mode": c["mode"], + "live_bets": live_bets, "total_bets": total_bets, + "pnl": pnl, "won": won, "stake": c.get("stake_cents", 10), + "swing": c.get("swing_threshold_pct", 0.005), + "rsi": c_rsi, "mom": f"{c_mom} {c_score:.3f}%" if c_mom != "FLAT" else c_mom, + "chg24": chg24, "decisions": decs, "orders": ords} + conn.close() + return jsonify(result) + + +@app.route("/fleet") +def fleet_page(): + return FLEET_HTML +def kill(): + c = cfg(); c["kill"] = True + CFG_PATH.write_text(json.dumps(c, indent=1)) + return jsonify({"ok": True}) + +if __name__ == "__main__": + app.run(host="0.0.0.0", port=5053, debug=False) diff --git a/doge.db b/doge.db new file mode 100644 index 0000000..3508b68 Binary files /dev/null and b/doge.db differ diff --git a/doge.json b/doge.json new file mode 100644 index 0000000..5f7fe7f --- /dev/null +++ b/doge.json @@ -0,0 +1,28 @@ +{ + "api_key_id": "28d5876b-2ece-4aa3-aa17-ec96e1e706eb", + "key_path": "/Users/drjones/kalshi-bot/kalshi_private_key.pem", + "mode": "AUTO", + "dry_run": false, + "stake_cents": 10, + "max_contracts": 1, + "daily_loss_cap_cents": 500, + "min_conf": 0.5, + "ollama_url": "http://10.30.20.186:11434", + "ollama_model": "ornith:latest", + "swing_threshold_pct": 0.005, + "learning": true, + "kill": false, + "coin": "DOGE", + "series": "KXDOGE15M", + "start_delay": 0, + "db_path": "doge.db", + "post_price_cents": 50, + "proxy": "http://10.30.20.154:3128", + "max_spend_cents": 100, + "decision_interval_sec": 300, + "start_delay_sec": 0, + "fast_llm_url": "http://localhost:11434", + "fast_llm_model": "qwen3.5:4b", + "deep_llm_url": "http://10.30.20.186:11434", + "deep_llm_model": "ornith:latest" +} \ No newline at end of file diff --git a/doge.lock b/doge.lock new file mode 100644 index 0000000..e69de29 diff --git a/eth.db b/eth.db new file mode 100644 index 0000000..2679cef Binary files /dev/null and b/eth.db differ diff --git a/eth.json b/eth.json new file mode 100644 index 0000000..f7271f7 --- /dev/null +++ b/eth.json @@ -0,0 +1,28 @@ +{ + "api_key_id": "28d5876b-2ece-4aa3-aa17-ec96e1e706eb", + "key_path": "/Users/drjones/kalshi-bot/kalshi_private_key.pem", + "mode": "AUTO", + "dry_run": false, + "stake_cents": 10, + "max_contracts": 1, + "daily_loss_cap_cents": 500, + "min_conf": 0.5, + "ollama_url": "http://10.30.20.186:11434", + "ollama_model": "ornith:latest", + "swing_threshold_pct": 0.005, + "learning": true, + "kill": false, + "coin": "ETH", + "series": "KXETH15M", + "start_delay": 14, + "db_path": "eth.db", + "post_price_cents": 50, + "proxy": "http://10.30.20.189:3128", + "max_spend_cents": 100, + "decision_interval_sec": 300, + "start_delay_sec": 40, + "fast_llm_url": "http://localhost:11434", + "fast_llm_model": "qwen3.5:4b", + "deep_llm_url": "http://10.30.20.186:11434", + "deep_llm_model": "ornith:latest" +} \ No newline at end of file diff --git a/eth.lock b/eth.lock new file mode 100644 index 0000000..e69de29 diff --git a/kalshi_private_key.pem b/kalshi_private_key.pem new file mode 100644 index 0000000..8be54b7 --- /dev/null +++ b/kalshi_private_key.pem @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEAsiT6Qipbe9ntO7PScWfRdcSiZAuVie6RHJiO033kuinl34pj +L2kjnUSdUDez5DsVGgVfRH34lT8wnhLW/PhPScKJd1lmV5evxsPv1PZroNyOiS0j +vy5pFKgWG/hXmGoiQysufgsNOhANouxIoI7ubyKUVesUq6CEHDwTPNuC5gPliUnw +gXyB/1j6I21ghsIjifICm8UBYv1J5W3gQ1GYD5vF0Nc47Ugn3tq4mDFjvgIzulxF +HtcCdewVPH+BG3lNoTAlLK+WS3JXzrxq0rKYFIIoKyCjY4Aan2bUPfu7e74ODkX4 +EQCHKOVTgzyk3HfKkwgVmVGyavlh2zSrxlKUaQIDAQABAoIBACv6xAvcsCwx34cL +PGuB8WytKFghof/k9U9FfJFK9dJd8KHQ5O65+rBjVaENt2wjh/CeHehnXxzddk+4 +H/phBRYVIGHmIMWELcGY8tc1JNoYSVolWjtjJk8Sti6ej2WR4jaJ7Rbx/Ih2mR89 +TSrSTpwCQfO6Lya14Jel3yv5l2XYa/dlWDaiHNfbeymXEYVDTI4NEKMnzByZnour +jCsEhPIS3YEa0yLtS6FIhNftTya0q8AbghDtkXN1Pwm89XKLzRpkLZuE0v79mojB +miAifetImm6bZOwxr2C4vCmUvroIp0sCS40VTn7GHyCi6XYohGm/rk9difhVURzC +Q+AhpxkCgYEA0eaQXICA9qycos9es92rvvYgojumF9wFP5Hl+qNZv4g/KppoZGRq +7iICubJhoBSGZvHiZ34Lf8jH9v7I5JHaznqZmh60VCMm3GKUDtSWzkZcBI/FmlrM +QTrfkmiMQabWNXVw9RMgUEqnc8vHYu18Xaul1nOtXP7tuVvHxD4S7+UCgYEA2UT0 +toVdPZZ3dyuENcfnlb2CHFfawrFKWLzsSQtiUugGOubPFya35DdCjuQhyW/gcIiY +t4NCmbCSSkqHk4C7GfR3QxtMFFinm7HWdsjE4eYIXZvZTmP3B8UXWru7uDkmo+/q +7MVcMrirWezr7r7j10In6ocSQVBN3kb2/DS4ojUCgYBwUX08UnMwDEvA/1BA1UR6 +6f+qcFq/d7fDPZIf3VtAF2sdpARqfCWQCdkFf0OoQnNtENBC6vrCRTFjpRDg5n98 +b7RT+UwrnafE1Gc/zFhqRtIkir6Fi0KzQQqzsIgk9V64uoBYVAS9kkUqvIeUE1qy +URBrwfipw6x3vHoYM9M0VQKBgQDU/vzIUkXuMqw7b7XU43ztFzOOhbI4W4X/KHab +xUVG8Z/p7ovmrlZorKPbYVqeF8d3ivHsNgn8kVVY72ep+vFxqG+ioggbii4GPHl7 +Sad5rgFVg4utheKPA3C5yoFlQOHYpUMxiumv78pMBi/lhc3nITvwdyo2TXuJBRjs +duLqYQKBgDZ/a+mzI3SrA6iFYU8DuI0e5IgW92B4NHuav31ffyD5ah0gGTZ+o+H4 +Sp7xuVbg4Qr6DVY27Ky8kPL3eYDFPDPqpGFD9aNTzRxYdxqHi0jEph/MGiel4fKn +AzPZ6T8pf7rAxVhbcdChe9mvLWrb7Q1SOkVA9aXg9QuNW7zUd7Ip +-----END RSA PRIVATE KEY----- diff --git a/launch_all.sh b/launch_all.sh new file mode 100755 index 0000000..a71ce77 --- /dev/null +++ b/launch_all.sh @@ -0,0 +1,9 @@ +#!/bin/bash +# K4LSH1_OPS multi-coin launcher +cd /Users/drjones/kalshi-bot +for coin in doge sol eth; do + echo "=== launching bot: $coin ===" + nohup .venv/bin/python bot.py --config /Users/drjones/kalshi-bot/$coin.json --lock $coin > /dev/null 2>&1 & + sleep 1 +done +echo "all 3 bots launched" diff --git a/sol.db b/sol.db new file mode 100644 index 0000000..315ed0e Binary files /dev/null and b/sol.db differ diff --git a/sol.json b/sol.json new file mode 100644 index 0000000..e876ab3 --- /dev/null +++ b/sol.json @@ -0,0 +1,28 @@ +{ + "api_key_id": "28d5876b-2ece-4aa3-aa17-ec96e1e706eb", + "key_path": "/Users/drjones/kalshi-bot/kalshi_private_key.pem", + "mode": "AUTO", + "dry_run": false, + "stake_cents": 10, + "max_contracts": 1, + "daily_loss_cap_cents": 500, + "min_conf": 0.5, + "ollama_url": "http://10.30.20.186:11434", + "ollama_model": "ornith:latest", + "swing_threshold_pct": 0.005, + "learning": true, + "kill": false, + "coin": "SOL", + "series": "KXSOL15M", + "start_delay": 7, + "db_path": "sol.db", + "post_price_cents": 50, + "proxy": "http://10.30.20.71:3128", + "max_spend_cents": 100, + "decision_interval_sec": 300, + "start_delay_sec": 20, + "fast_llm_url": "http://localhost:11434", + "fast_llm_model": "qwen3.5:4b", + "deep_llm_url": "http://10.30.20.186:11434", + "deep_llm_model": "ornith:latest" +} \ No newline at end of file diff --git a/sol.lock b/sol.lock new file mode 100644 index 0000000..e69de29 diff --git a/state.db b/state.db new file mode 100644 index 0000000..05fc30e Binary files /dev/null and b/state.db differ diff --git a/test_bot.py b/test_bot.py new file mode 100644 index 0000000..7fad9c3 --- /dev/null +++ b/test_bot.py @@ -0,0 +1,279 @@ +#!/usr/bin/env python3 +"""K4LSH1_OPS unit tests — verify every decision-making component.""" +import json, sqlite3, sys, time, tempfile +from pathlib import Path +from unittest.mock import patch, MagicMock + +sys.path.insert(0, str(Path(__file__).parent)) +from bot import (momentum, decide, rsi, hedge_positions, llm_vote, + Kalshi, load_cfg, learned_min_conf, KRAKEN_PAIRS, + btc_price, intel) + +PASS = 0 +FAIL = 0 + +def check(name, condition, detail=""): + global PASS, FAIL + if condition: + PASS += 1 + print(f" ✓ {name}") + else: + FAIL += 1 + print(f" ✗ {name} — {detail}") + +def test_momentum(): + print("\n═══ MOMENTUM ═══") + conn = sqlite3.connect(":memory:") + conn.execute("CREATE TABLE ticks (ts REAL, price REAL)") + now = time.time() + # flat market + for i in range(20): + conn.execute("INSERT INTO ticks VALUES (?, 100.0)", (now - 300 + i*15,)) + mom, score = momentum(conn) + check("flat market → FLAT", mom == "FLAT", f"got {mom}/{score:.4f}") + check("flat score near 0", score < 0.01, f"score={score:.4f}") + + # up market + conn.execute("DELETE FROM ticks") + for i in range(20): + p = 100.0 + i * 0.5 + conn.execute("INSERT INTO ticks VALUES (?,?)", (now - 300 + i*15, p)) + mom, score = momentum(conn) + check("rising market → UP", mom == "UP", f"got {mom}/{score:.3f}%") + check("up score positive", score > 0.05, f"score={score:.3f}%") + + # down market + conn.execute("DELETE FROM ticks") + for i in range(20): + p = 200.0 - i * 0.3 + conn.execute("INSERT INTO ticks VALUES (?,?)", (now - 300 + i*15, p)) + mom, score = momentum(conn) + check("falling market → DOWN", mom == "DOWN", f"got {mom}/{score:.3f}%") + check("down score positive", score > 0.01, f"score={score:.3f}%") + + # too few ticks + conn.execute("DELETE FROM ticks") + conn.execute("INSERT INTO ticks VALUES (?, 100)", (now,)) + mom, score = momentum(conn) + check("1 tick → FLAT", mom == "FLAT", f"got {mom}") + check("1 tick score 0", score == 0.0, f"score={score}") + conn.close() + + +def test_rsi(): + print("\n═══ RSI ═══") + conn = sqlite3.connect(":memory:") + conn.execute("CREATE TABLE ticks (ts REAL, price REAL)") + now = time.time() + # oversold: steady decline + for i in range(30): + p = 100.0 - i * 0.5 + conn.execute("INSERT INTO ticks VALUES (?,?)", (now - 1800 + i*60, p)) + val = rsi(conn) + check("decline → RSI < 30", val is not None and val < 30, f"RSI={val}") + # overbought: steady climb + conn.execute("DELETE FROM ticks") + for i in range(30): + p = 100.0 + i * 0.8 + conn.execute("INSERT INTO ticks VALUES (?,?)", (now - 1800 + i*60, p)) + val = rsi(conn) + check("climb → RSI > 70", val is not None and val > 70, f"RSI={val}") + conn.close() + + +def test_learned_min_conf(): + print("\n═══ ADAPTIVE CONFIDENCE ═══") + conn = sqlite3.connect(":memory:") + conn.execute("CREATE TABLE orders (id INTEGER PRIMARY KEY, pnl_cents INT, status TEXT)") + conn.execute("CREATE TABLE IF NOT EXISTS kv (k TEXT PRIMARY KEY, v REAL)") + cfg = {"learning": True, "min_conf": 0.55} + # < 8 resolved bets → use default + for i in range(5): + conn.execute("INSERT INTO orders(pnl_cents,status) VALUES (?,?)", (10, "won")) + lc = learned_min_conf(conn, cfg) + check("<8 bets → default", lc == 0.55, f"got {lc}") + + # majority wins → relax confidence + for i in range(15): + conn.execute("INSERT INTO orders(pnl_cents,status) VALUES (?,?)", (15 if i < 10 else -10, "won" if i < 10 else "lost")) + lc = learned_min_conf(conn, cfg) + check("high WR → relax", lc < 0.55, f"got {lc}") + + # majority losses → tighten (need fresh conn, kv starts empty) + conn.execute("DELETE FROM orders") + conn.execute("DELETE FROM kv") + for i in range(15): + conn.execute("INSERT INTO orders(pnl_cents,status) VALUES (?,?)", + (-10 if i < 10 else 15, "lost" if i < 10 else "won")) + lc = learned_min_conf(conn, {"learning": True, "min_conf": 0.55}) + check("low WR → tighten", lc > 0.55, f"got {lc}") + conn.close() + + +def test_hedge(): + print("\n═══ HEDGE LOGIC ═══") + conn = sqlite3.connect(":memory:") + conn.execute("CREATE TABLE orders (id INTEGER PRIMARY KEY, ts REAL, ticker TEXT, " + "side TEXT, count INT, price_cents INT, dry INT, order_id TEXT, status TEXT, " + "settle_ts REAL, pnl_cents INT)") + conn.execute("CREATE TABLE events (ts REAL, level TEXT, msg TEXT)") + cfg = {"dry_run": True, "min_profit_cents": 8} + ticker = "KXBTC15M-TEST" + book = {"yes": [[42]], "no": [[48]]} + + # scenario: we bought NO at 45¢, YES ask is 42¢ → profit = 100-45-42=13¢ > 8¢ min + conn.execute("INSERT INTO orders VALUES (1,0,?,?,?,?,0,'sim','posted',NULL,NULL)", + (ticker, "no", 1, 45)) + result = hedge_positions(conn, MagicMock(), ticker, cfg, book) + check("NO@45 YES@42 → hedge fires", result == "hedged", f"got {result}") + hedged = conn.execute("SELECT status FROM orders WHERE id=1").fetchone()[0] + check("original marked hedged", hedged == "hedged", f"got {hedged}") + new_orders = conn.execute("SELECT COUNT(*) FROM orders WHERE side='yes'").fetchone()[0] + check("counter-order placed", new_orders == 1) + + # scenario: profit too small + conn.execute("DELETE FROM orders") + conn.execute("INSERT INTO orders VALUES (2,0,?,?,?,?,0,'sim','posted',NULL,NULL)", + (ticker, "no", 1, 48)) + book2 = {"yes": [[49]], "no": [[50]]} + result2 = hedge_positions(conn, MagicMock(), ticker, cfg, book2) + check("NO@48 YES@49 → no hedge (1¢ profit)", result2 is None) + conn.close() + + +def test_decision_logic(): + print("\n═══ DECISION LOGIC ═══") + conn = sqlite3.connect(":memory:") + conn.execute("CREATE TABLE ticks (ts REAL, price REAL)") + conn.execute("CREATE TABLE decisions (id INTEGER PRIMARY KEY, ts REAL, ticker TEXT, " + "mode TEXT, momentum TEXT, llm_vote TEXT, llm_conf REAL, llm_why TEXT, " + "final TEXT, price REAL, reason TEXT)") + conn.execute("CREATE TABLE orders (id INTEGER PRIMARY KEY, pnl_cents INT, status TEXT)") + conn.execute("CREATE TABLE events (ts REAL, level TEXT, msg TEXT)") + conn.execute("CREATE TABLE IF NOT EXISTS kv (k TEXT PRIMARY KEY, v REAL)") + now = time.time() + for i in range(20): + p = 100.0 + i * 0.3 + conn.execute("INSERT INTO ticks VALUES (?,?)", (now - 300 + i*15, p)) + + cfg = {"swing_threshold_pct": 0.005, "min_conf": 0.50, "learning": False, + "mode": "AUTO", "coin": "BTC", "ollama_url": "http://x", "ollama_model": "x"} + + # LLM confirms: UP spike, LLM votes DOWN (fade confirmed) + with patch("bot.intel", return_value={"chg24": 0.85, "fng": 45, "fee_fast": 8}), \ + patch("bot.llm_vote", return_value=("DOWN", 0.72, "strong fade signal")): + mom, lv, lc, lw, final, why = decide(cfg, conn, 63400) + check("LLM fade confirm → DOWN", final == "DOWN", f"got {final}") + check("confidence preserved", lc == 0.72, f"got {lc}") + + # LLM passes (not enough signal) + with patch("bot.intel", return_value={"chg24": 0.1}), \ + patch("bot.llm_vote", return_value=("SKIP", 0.30, "no clear signal")): + mom, lv, lc, lw, final, why = decide(cfg, conn, 63400) + check("LLM skip → SKIP", final == "SKIP", f"got {final}") + + # LLM goes against fade but high conf — should follow LLM + with patch("bot.intel", return_value={"chg24": 0.5}), \ + patch("bot.llm_vote", return_value=("UP", 0.82, "continuation strong")): + mom, lv, lc, lw, final, why = decide(cfg, conn, 63400) + check("LLM continuation with high conf → trust LLM", final == "UP", f"got {final}/{why}") + + # Low confidence → skip + with patch("bot.intel", return_value={"chg24": 0.3}), \ + patch("bot.llm_vote", return_value=("DOWN", 0.35, "weak")): + mom, lv, lc, lw, final, why = decide(cfg, conn, 63400) + check("low conf → SKIP", final == "SKIP", f"got {final}") + + conn.close() + + +def test_price_sources(): + print("\n═══ PRICE SOURCES ═══") + for coin, pair in [("BTC","XBTUSD"), ("DOGE","XDGUSD"), ("SOL","SOLUSD"), ("ETH","ETHUSD")]: + p = btc_price(coin) + check(f"{coin} price from Kraken", p is not None and p > 0, f"${p}" if p else "None") + # coinbase fallback + with patch("bot.requests.get") as mock_get: + mock_kraken = MagicMock() + mock_kraken.json.side_effect = Exception("kraken down") + mock_cb = MagicMock() + mock_cb.json.return_value = {"data": {"amount": "99999"}} + mock_get.side_effect = [mock_kraken, mock_cb] + p = btc_price("BTC") + check("coinbase fallback works", p == 99999.0, f"got {p}") + + +def test_llm_vote_parsing(): + print("\n═══ LLM VOTE PARSING ═══") + cfg = {"ollama_url": "http://x", "ollama_model": "x", "coin": "BTC"} + # ornith says DOWN with confidence + mock_resp = MagicMock() + mock_resp.text = json.dumps({"response": "DOWN|0.72|RSI oversold, fading up spike"}) + with patch("bot.requests.post", return_value=mock_resp): + with patch("bot.intel", return_value={"chg24": 0.5}): + with patch("bot.rsi", return_value=28): + lv, lc, lw = llm_vote(cfg, 63400, "UP", 0.12, sqlite3.connect(":memory:")) + check("parses DOWN", lv == "DOWN", f"got {lv}") + check("parses confidence", lc == 0.72, f"got {lc}") + check("parses why", len(lw) > 5, f"'{lw}'") + + # ornith says SKIP + mock_resp.text = json.dumps({"response": "SKIP|0.40|no clear direction"}) + with patch("bot.requests.post", return_value=mock_resp): + with patch("bot.intel", return_value={"chg24": 0.1}): + with patch("bot.rsi", return_value=55): + lv, lc, lw = llm_vote(cfg, 63400, "FLAT", 0.001, sqlite3.connect(":memory:")) + check("parses SKIP", lv == "SKIP", f"got {lv}") + + # malformed response + mock_resp.text = json.dumps({"response": "garbage noise no pipe"}) + with patch("bot.requests.post", return_value=mock_resp): + with patch("bot.intel", return_value={}): + with patch("bot.rsi", return_value=None): + lv, lc, lw = llm_vote(cfg, 63400, "UP", 0.10, sqlite3.connect(":memory:")) + check("malformed → SKIP", lv == "SKIP", f"got {lv}") + check("malformed → 0 conf", lc == 0.0, f"got {lc}") + + +def test_config(): + print("\n═══ CONFIG ═══") + with tempfile.NamedTemporaryFile(mode='w', suffix='.json', delete=False) as f: + json.dump({"mode": "AUTO", "stake_cents": 15, "coin": "TEST"}, f) + fpath = f.name + try: + from bot import HOME, CFG_PATH, load_cfg + old = str(CFG_PATH) + import bot + bot.CFG_PATH = Path(fpath) + c = load_cfg() + check("loads mode", c["mode"] == "AUTO") + check("loads stake", c["stake_cents"] == 15) + bot.CFG_PATH = Path(old) + finally: + Path(fpath).unlink(missing_ok=True) + + +def test_kraken_pairs(): + print("\n═══ KRAKEN PAIRS ═══") + check("BTC → XBTUSD", KRAKEN_PAIRS["BTC"] == "XBTUSD") + check("DOGE → XDGUSD", KRAKEN_PAIRS["DOGE"] == "XDGUSD") + check("SOL → SOLUSD", KRAKEN_PAIRS["SOL"] == "SOLUSD") + check("ETH → ETHUSD", KRAKEN_PAIRS["ETH"] == "ETHUSD") + check("XRP → XRPUSD", KRAKEN_PAIRS["XRP"] == "XRPUSD") + + +if __name__ == "__main__": + print("K4LSH1_OPS UNIT TESTS") + print("=" * 50) + tests = [test_momentum, test_rsi, test_learned_min_conf, test_hedge, + test_decision_logic, test_price_sources, test_llm_vote_parsing, + test_config, test_kraken_pairs] + for t in tests: + try: + t() + except Exception as e: + print(f" ✗ CRASH: {e}") + FAIL += 1 + print(f"\n{'='*50}") + print(f"PASS: {PASS} FAIL: {FAIL}") + sys.exit(0 if FAIL == 0 else 1)