Spaces:
Sleeping
Sleeping
| 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 | |