From 60b5929d0e56bd6704b896065bca34541ddaddfc Mon Sep 17 00:00:00 2001 From: hazeone <709547807@qq.com> Date: Fri, 21 Nov 2025 18:37:20 +0800 Subject: [PATCH 1/2] refine get data method by ip --- .../agents/common/trading/data/market.py | 15 ++++++++++- python/valuecell/utils/i18n_utils.py | 25 +++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/python/valuecell/agents/common/trading/data/market.py b/python/valuecell/agents/common/trading/data/market.py index 2e056b6d1..0ecef0f48 100644 --- a/python/valuecell/agents/common/trading/data/market.py +++ b/python/valuecell/agents/common/trading/data/market.py @@ -9,6 +9,7 @@ MarketSnapShotType, ) from valuecell.agents.common.trading.utils import get_exchange_cls, normalize_symbol +from valuecell.utils.i18n_utils import detect_user_region from .interfaces import BaseMarketDataSource @@ -24,7 +25,19 @@ class SimpleMarketDataSource(BaseMarketDataSource): """ def __init__(self, exchange_id: Optional[str] = None) -> None: - self._exchange_id = exchange_id or "binance" + if not exchange_id: + # Auto-detect region and select appropriate exchange + region = detect_user_region() + if region == "us": + # Use OKX for United States users (best support for USDT perpetuals) + self._exchange_id = "okx" + logger.info("Detected US region, using okx exchange (USDT perpetuals supported)") + else: + # Use regular Binance for other regions + self._exchange_id = "binance" + logger.info("Detected non-US region, using binance exchange") + else: + self._exchange_id = exchange_id def _normalize_symbol(self, symbol: str) -> str: """Normalize symbol format for specific exchanges. diff --git a/python/valuecell/utils/i18n_utils.py b/python/valuecell/utils/i18n_utils.py index 796ace120..6e6ab6b71 100644 --- a/python/valuecell/utils/i18n_utils.py +++ b/python/valuecell/utils/i18n_utils.py @@ -65,6 +65,31 @@ def detect_browser_language(accept_language_header: str) -> str: return DEFAULT_LANGUAGE +def detect_user_region() -> str: + """Detect user region based on IP geolocation. + + Returns: + Region code: 'us' for United States, 'default' for others + """ + try: + import httpx + + with httpx.Client(timeout=3.0) as client: + resp = client.get("https://ipapi.co/json/") + if resp.status_code == 200: + data = resp.json() + country_code = data.get("country_code", "").upper() + + if country_code == "US": + return "us" + + return "default" + return "default" + except Exception: + # If detection fails, return default + return "default" + + def get_timezone_for_language(language: str) -> str: """Get default timezone for a language. From 6abbc33f8e9f338fc10faf390ad71c3713def77b Mon Sep 17 00:00:00 2001 From: hazeone <709547807@qq.com> Date: Fri, 21 Nov 2025 18:40:06 +0800 Subject: [PATCH 2/2] lint --- python/valuecell/agents/common/trading/data/market.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/python/valuecell/agents/common/trading/data/market.py b/python/valuecell/agents/common/trading/data/market.py index 0ecef0f48..ace266183 100644 --- a/python/valuecell/agents/common/trading/data/market.py +++ b/python/valuecell/agents/common/trading/data/market.py @@ -31,7 +31,9 @@ def __init__(self, exchange_id: Optional[str] = None) -> None: if region == "us": # Use OKX for United States users (best support for USDT perpetuals) self._exchange_id = "okx" - logger.info("Detected US region, using okx exchange (USDT perpetuals supported)") + logger.info( + "Detected US region, using okx exchange (USDT perpetuals supported)" + ) else: # Use regular Binance for other regions self._exchange_id = "binance"