diff --git a/frontend/components/ops/__tests__/opsMarketOpportunities.test.ts b/frontend/components/ops/__tests__/opsMarketOpportunities.test.ts index 766e27be..49a76c49 100644 --- a/frontend/components/ops/__tests__/opsMarketOpportunities.test.ts +++ b/frontend/components/ops/__tests__/opsMarketOpportunities.test.ts @@ -57,4 +57,10 @@ export function runTests() { client.includes("positive_edge_only") && client.includes("显示全部低价"), "market opportunities page must default to positive edge and allow showing every low-price option", ); + assert( + client.includes("最高买入价") && + client.includes("最小 Edge") && + client.includes('showAllLowPrice ? "-1" : minEdge'), + "market opportunities filters must label price versus edge and not edge-filter the show-all-low-price view", + ); } diff --git a/frontend/components/ops/market-opportunities/MarketOpportunitiesPageClient.tsx b/frontend/components/ops/market-opportunities/MarketOpportunitiesPageClient.tsx index 003ed816..04456182 100644 --- a/frontend/components/ops/market-opportunities/MarketOpportunitiesPageClient.tsx +++ b/frontend/components/ops/market-opportunities/MarketOpportunitiesPageClient.tsx @@ -112,7 +112,7 @@ export function MarketOpportunitiesPageClient() { q: query.trim(), side, max_price: maxPrice, - min_edge: minEdge, + min_edge: showAllLowPrice ? "-1" : minEdge, positive_edge_only, limit: 200, }); @@ -142,7 +142,7 @@ export function MarketOpportunitiesPageClient() { 市场机会

- 仅 Ops 内部使用,扫描低于 20¢ 的 Yes/No 选项,并按模型概率与市场价格差排序。 + 仅 Ops 内部使用,按价格上限扫描 Yes/No 选项,并按模型概率与市场价格差排序。

diff --git a/tests/test_ops_market_opportunities.py b/tests/test_ops_market_opportunities.py index bbd5f685..e3c17123 100644 --- a/tests/test_ops_market_opportunities.py +++ b/tests/test_ops_market_opportunities.py @@ -180,3 +180,28 @@ def test_ops_market_opportunities_degrades_when_quotes_fail(monkeypatch): assert payload["summary"]["quote_status"] == "unavailable" assert payload["summary"]["error"] == "polymarket down" assert payload["rows"] == [] + + +def test_ops_market_opportunities_reuses_prewarmed_terminal_snapshot(monkeypatch): + captured = {} + monkeypatch.setattr(market_opportunities, "_require_ops", lambda _request: {"email": "ops@example.com"}) + + def fake_scan(filters, *, force_refresh=False): + captured["filters"] = filters + captured["force_refresh"] = force_refresh + return {"rows": [_row()]} + + monkeypatch.setattr(market_opportunities, "build_scan_terminal_payload", fake_scan) + monkeypatch.setattr( + market_opportunities, + "_collect_events_and_prices", + lambda rows, _scanner: ({row["city"]: None for row in rows}, {}, "ready"), + ) + + payload = get_ops_market_opportunities(object(), max_price=0.90, min_edge=0.0) + + assert payload["summary"]["scanned_city_count"] == 1 + assert captured["force_refresh"] is False + assert captured["filters"]["limit"] == 180 + assert captured["filters"]["min_edge_pct"] == 2 + assert captured["filters"]["min_liquidity"] == 500 diff --git a/web/services/ops/market_opportunities.py b/web/services/ops/market_opportunities.py index 734d0fae..603d69b1 100644 --- a/web/services/ops/market_opportunities.py +++ b/web/services/ops/market_opportunities.py @@ -460,8 +460,8 @@ def get_ops_market_opportunities( "scan_mode": "tradable", "min_price": 0.05, "max_price": 0.95, - "min_edge_pct": 0, - "min_liquidity": 0, + "min_edge_pct": 2, + "min_liquidity": 500, "market_type": "maxtemp", "time_range": "today", "limit": 180,