import re import requests import httpx #Извлечение UUID из строки def extract_portfolio_id(text: str) -> str | None: match = re.search( r"[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}", text ) return match.group(0) if match else None async def fetch_metrics_async(portfolio_id: str) -> dict | None: url = f"https://api.tradelink.pro/portfolio/get?portfolioId={portfolio_id}&extended=1" try: async with httpx.AsyncClient(timeout=10) as client: resp = await client.get(url) extended = resp.json().get("data", {}).get("extended", {}) result = {} for k, v in extended.items(): if not isinstance(v, (int, float)): continue if k in {"cagr", "alphaRatio", "volatility", "maxDD"}: result[k] = v * 100 # преобразуем в % else: result[k] = v # без изменений return result except Exception as e: # логирование ошибки опционально return None # print(f"[API ошибка]: {e}") # return None # # keys = [ # # 🔹 Доходность и риск # "alphaRatio", "betaRatio", "cagr", "sharpe", "sortino", "volatility", # "kSortino", "kCalmar", "kSharpe", # # # 🔹 Просадки # "maxDD", "mddDuration", "maxBalance", # # # 🔹 Поведение стратегии # "losingDays", "winningDays", "selfProfitRate", # # # 🔹 Актуальные показатели доходности # "lastWeekNetProfit", "lastMonthNetProfit", "lastQuarterGrowth", "lastYearNetGrowth" # ] # return {k: extended[k] for k in keys if isinstance(extended.get(k), (int, float))} # except: # return None