Bot / LEX 盤查
背景定期重新產生 CSV;按下載即得到最新版本。
🤖 Bot 賽事已訂閱但未掛單
它在檢查什麼?
每筆紀錄是 (某個 agent / bot, 某場 event) 的 pair。
⚠ 只處理 PG users.bots.status = 'active' 的 bot,inactive 的 bot 自動忽略。
檢查流程:
1. 透過 RiskCtrl gRPC GetSubscriptionList 取出該 agent 訂閱的所有 tournament
2. 透過 GetTournamentList 取出該 agent 對該 tournament 的 gate(trading_tournament_status,ON/OFF)
3. 透過 GetEventList 撈該 tournament 的所有 event
4. 對每場 event 從 Redis 檢查 has_odds / has_open_market / has_bot_quote
本表只列 has_bot_quote=N 的(bot 還沒掛單)。
欄位說明:
• bot_name:bot 名稱(例:bot_TONY01-TONY01),從 PG users.bots 查得;無 PG 連線時為空
• agent_id:訂閱該 tournament 的代理(一個 agent 對應一隻 bot)
• subscribed:該 agent 是否訂閱了這個 tournament(本表都是 Y,因已過濾)
• gate:trading_tournament_status。ON=該 agent 對該 tournament 開閘可以交易;OFF=即使訂閱了,gate 沒開,bot 也不會掛單
• has_odds:exchange_odds:{event_id} 中支援盤口、active=1、且 back_odds>0 或 lay_odds>0 至少一筆 → 源頭真的有掛 back/lay
• exchange_priced_outcomes / exchange_quoted_markets:源頭有報價的 outcome 數 / market 數(=0 表示交易所端沒掛 back/lay,bot 沒掛單就屬正常)
• has_open_market:至少一個 market_status=1 → 有盤口開放
• has_lex_snapshot:lex:{event_id} 有 snapshot → bot 已登錄這場(不代表實際掛單)
• has_bot_quote:Y=所有 OPEN 盤口都有 book 報價;PARTIAL=部分 OPEN 盤口空 book;N=全部 OPEN 都空 book,或根本沒 OPEN
• open_markets:LEX 中 state=OPEN 的支援盤口數
• quoted_markets:上述中 book.runners 有實際 back/lay 報價的數量
• unquoted_open:open_markets - quoted_markets,>0 代表有 OPEN 盤口卻沒掛單
• unwatched_open:unquoted_open 中、bot 連 assigned_market_names(botl:{bot_id}:event_actors)都沒納入的盤口數。代表 bot 根本沒在關注,比單純沒掛單更嚴重。
• assigned_markets_count:bot 對該 event 的 assigned_market_names 個數(=0 通常表示 actor 還沒建起來或抓不到 key)
列出條件:必須 has_odds=Y AND has_open_market=Y(即「該掛」的前提)AND has_bot_quote ≠ Y(包含 PARTIAL 和 N)。
若 odds 或 market 都沒,bot 沒掛是合理的,不列為異常。
• match_status:not_started / live / ended
• phase:PRE 賽前 / LIVE 進行中
• market_age_sec:market_status 最新更新距現在秒數(越大代表資料越舊)
常見原因:gate=OFF(agent 沒開閘)、bot 還沒處理到、bot 卡住、或盤口剛建立 LEX 還沒同步
🔍
|
顯示 0 / 0
點擊 row 查看具體未掛盤口
🚫 Bot 未關注盤口(assigned_market_names 沒包含)
它在檢查什麼?
每筆紀錄是 (bot, event, market) 三元組:該 event bot 已訂閱、該盤口是 LEX state=OPEN 的支援盤口、
bot 沒掛單,而且該盤口的 key {event_id}:{market_id}:{specifiers} 不在
botl:{bot_id}:event_actors 的 assigned_market_names 裡。
意思是 bot 連「該關注這個盤口」這件事都沒登記,跟「有登記但還沒下單」是不同問題。
常見原因:actor 還沒建起來、bot 卡在 commands/risk wait、或 event_actors key 過期沒更新。
本表為從「Bot 賽事已訂閱但未掛單」展開的盤口 flat 清單,方便定位具體 market。
🔍
|
顯示 0 / 0
🏆 Bot Outright 已訂閱但未掛單
它在檢查什麼?
跟 Bot 賽事已訂閱但未掛單 邏輯相同,只是檢查對象換成 outright(冠軍 / 期貨,sr:season:xxx)。
每筆 = (bot, season)。透過 RiskCtrl gRPC:
1. GetOutrightSubscriptions → 訂閱的 outright tournament
2. GetOutrightTournaments → 取 gate (trading_tournament_status) + active_seasons[](含 season_id == event_id)
3. 對每個 sr:season:xxx 從 Redis 看 has_odds / has_open_market / has_bot_quote
列出條件:has_odds=Y AND has_open_market=Y AND has_bot_quote ≠ Y
actor_state 共用 botl:{bot_id}:event_actors,sr:season:xxx 與 sr:match:xxx 同個 hash。
欄位差異:season_id 取代 match_id;start_time 是 season 的 start_date;
不過濾 SUPPORTED_MARKETS(outright market_id 範圍開放)。
🔍
|
顯示 0 / 0
點擊 row 查看具體未掛盤口
🚫 Bot Outright 未關注盤口(assigned_market_names 沒包含)
🔍
|
顯示 0 / 0
⚙ 設定
|
|
Status 每 5 秒自動更新
🔧 管理觀測中的 Bot Agent IDs
注意:這裡的設定是 runtime 暫存。Service 重啟後會回到啟動時的 AGENT_IDS env / --agent-id 參數。
按下「儲存並重抓」後會清掉現有 subscription tree 並立刻重新跑 bot_subscription。
目前觀測中(0)
尚未載入
範圍說明
這裡列的是「此 bot 在 RiskCtrl 內可看到的 tournament」。
• ✓ 已訂閱:此 bot 有訂這個 tournament
• ○ 可訂閱未訂:同 sport 下其他 tournament,此 bot 沒選
跟下面卡片裡的 ex_only(exchange 有開盤但沒任何 bot 訂閱)不是同一回事:那是 event 層級、跨所有 bot;這裡是 tournament 層級、限定此 bot。
Gate 狀態(RiskCtrl 預設 ON,只有手動 patch 才會 OFF)
• gate ON:未被 patch 關閉(包含明確 ON 與沒回傳 status 的情況——沒回傳通常只代表當下底下沒 event)
• gate OFF:明確被 patch 成 TRADING_TOURNAMENT_STATUS_OFF,即使有訂閱也不會掛單
操作:點 tournament 列可複製 tournament_id 到剪貼簿。