From 294e038f57512b29e91ebbfb3a6bee38a1c2b2ae Mon Sep 17 00:00:00 2001 From: "2569718930@qq.com" <2569718930@qq.com> Date: Thu, 12 Mar 2026 00:36:33 +0800 Subject: [PATCH] feat: Implement Polymarket wallet activity watcher and add related configuration options. --- .env.example | 3 +++ .../polymarket_wallet_activity_watcher.py | 22 ++++++++++++++----- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/.env.example b/.env.example index a95d6fa3..cb4b5b4b 100644 --- a/.env.example +++ b/.env.example @@ -67,8 +67,11 @@ POLYMARKET_WALLET_ACTIVITY_INTERVAL_SEC=20 POLYMARKET_WALLET_ACTIVITY_TIMEOUT_SEC=10 POLYMARKET_WALLET_ACTIVITY_MIN_SIZE_ABS=0.001 POLYMARKET_WALLET_ACTIVITY_MIN_SIZE_DELTA=0.001 +POLYMARKET_WALLET_ACTIVITY_MIN_AVG_PRICE_DELTA=0.002 POLYMARKET_WALLET_ACTIVITY_MAX_CHANGES_PER_MSG=5 POLYMARKET_WALLET_ACTIVITY_NOTIFY_CLOSED=false POLYMARKET_WALLET_ACTIVITY_BOOTSTRAP_ALERT=false +POLYMARKET_WALLET_ACTIVITY_UPDATE_DEBOUNCE_SEC=30 +POLYMARKET_WALLET_ACTIVITY_UPDATE_MAX_HOLD_SEC=120 POLYMARKET_WALLET_ACTIVITY_AVG_PRICE_SHOW_MIN=0.01 POLYMARKET_WALLET_ACTIVITY_AVG_PRICE_SHOW_MAX=0.99 diff --git a/src/onchain/polymarket_wallet_activity_watcher.py b/src/onchain/polymarket_wallet_activity_watcher.py index 93e2f5f9..112a4cef 100644 --- a/src/onchain/polymarket_wallet_activity_watcher.py +++ b/src/onchain/polymarket_wallet_activity_watcher.py @@ -204,8 +204,10 @@ def _diff_positions( notify_closed: bool, min_price: float = 0.0, max_price: float = 1.0, + min_avg_price_delta: float = 0.002, ) -> List[Tuple[str, Dict[str, Any]]]: changes: List[Tuple[str, Dict[str, Any]]] = [] + min_avg_price_delta = max(0.0, min_avg_price_delta) for key, now_pos in current.items(): # 价格过滤:如果设置了价格区间,不符合的直接跳过 @@ -222,7 +224,7 @@ def _diff_positions( size_delta = now_pos["size"] - old_pos.get("size", 0.0) avg_delta = now_pos["avg_price"] - old_pos.get("avg_price", 0.0) - if abs(size_delta) >= min_size_delta or abs(avg_delta) >= 1e-9: + if abs(size_delta) >= min_size_delta or abs(avg_delta) >= min_avg_price_delta: merged = {**now_pos} merged["size_delta"] = size_delta merged["old_size"] = old_pos.get("size", 0.0) @@ -475,16 +477,22 @@ def start_polymarket_wallet_activity_loop(bot: Any) -> Optional[threading.Thread timeout_sec = max(5, _env_int("POLYMARKET_WALLET_ACTIVITY_TIMEOUT_SEC", 10)) min_size_abs = max(0.0, _env_float("POLYMARKET_WALLET_ACTIVITY_MIN_SIZE_ABS", 0.001)) min_size_delta = max(0.0, _env_float("POLYMARKET_WALLET_ACTIVITY_MIN_SIZE_DELTA", 0.001)) + min_avg_price_delta = max( + 0.0, + _env_float("POLYMARKET_WALLET_ACTIVITY_MIN_AVG_PRICE_DELTA", 0.002), + ) max_changes = max(1, _env_int("POLYMARKET_WALLET_ACTIVITY_MAX_CHANGES_PER_MSG", 5)) notify_closed = _env_bool("POLYMARKET_WALLET_ACTIVITY_NOTIFY_CLOSED", False) bootstrap_alert = _env_bool("POLYMARKET_WALLET_ACTIVITY_BOOTSTRAP_ALERT", False) + default_debounce_sec = max(poll_sec, 30) update_debounce_sec = max( poll_sec, - _env_int("POLYMARKET_WALLET_ACTIVITY_UPDATE_DEBOUNCE_SEC", 90), + _env_int("POLYMARKET_WALLET_ACTIVITY_UPDATE_DEBOUNCE_SEC", default_debounce_sec), ) + default_update_max_hold_sec = max(update_debounce_sec, 120) update_max_hold_sec = max( update_debounce_sec, - _env_int("POLYMARKET_WALLET_ACTIVITY_UPDATE_MAX_HOLD_SEC", 240), + _env_int("POLYMARKET_WALLET_ACTIVITY_UPDATE_MAX_HOLD_SEC", default_update_max_hold_sec), ) # 价格过滤范围配置 @@ -501,10 +509,12 @@ def start_polymarket_wallet_activity_loop(bot: Any) -> Optional[threading.Thread logger.info( f"polymarket wallet activity watcher started users={len(users)} " f"poll={poll_sec}s data_api={data_api_url} price_filter={min_price}-{max_price} " + f"min_avg_price_delta={min_avg_price_delta} " f"update_debounce={update_debounce_sec}s update_max_hold={update_max_hold_sec}s" ) while True: + cycle_started = time.time() touched = False for user in users: try: @@ -548,6 +558,7 @@ def start_polymarket_wallet_activity_loop(bot: Any) -> Optional[threading.Thread notify_closed=notify_closed, min_price=min_price, max_price=max_price, + min_avg_price_delta=min_avg_price_delta, ) outgoing: List[Tuple[str, Dict[str, Any]]] = [] @@ -618,7 +629,9 @@ def start_polymarket_wallet_activity_loop(bot: Any) -> Optional[threading.Thread except Exception: logger.exception("failed to save wallet activity state") - time.sleep(poll_sec) + elapsed = time.time() - cycle_started + sleep_sec = max(0.0, poll_sec - elapsed) + time.sleep(sleep_sec) thread = threading.Thread( target=_runner, @@ -629,4 +642,3 @@ def start_polymarket_wallet_activity_loop(bot: Any) -> Optional[threading.Thread return thread -