diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..58ecfac --- /dev/null +++ b/.dockerignore @@ -0,0 +1,17 @@ +# Used when build context is the repo root (e.g. frontend image). +# Backend builds use backend_api_python/.dockerignore with its own context. + +.git +**/.git +.DS_Store + +# Do not send local node_modules / build outputs (Docker runs npm ci + build) +QuantDinger-Vue-src/node_modules +QuantDinger-Vue-src/dist + +# Pre-built copy used for local nginx tests only — image builds from source +frontend/dist + +# Backend & DB not needed for frontend stage +backend_api_python +docker-compose.override.yml diff --git a/backend_api_python/app/__init__.py b/backend_api_python/app/__init__.py index a3a7d20..41770c1 100644 --- a/backend_api_python/app/__init__.py +++ b/backend_api_python/app/__init__.py @@ -273,6 +273,12 @@ def create_app(config_name='default'): start_portfolio_monitor() start_usdt_order_worker() start_polymarket_worker() + # Offline calibration to make AI thresholds self-tuning. + try: + from app.services.ai_calibration import start_ai_calibration_worker + start_ai_calibration_worker() + except Exception: + pass restore_running_strategies() return app diff --git a/backend_api_python/app/routes/fast_analysis.py b/backend_api_python/app/routes/fast_analysis.py index 18435d8..f66035b 100644 --- a/backend_api_python/app/routes/fast_analysis.py +++ b/backend_api_python/app/routes/fast_analysis.py @@ -4,16 +4,45 @@ Fast Analysis API Routes New high-performance analysis endpoints that replace the slow multi-agent system. """ from flask import Blueprint, request, jsonify, g +import threading +import time from app.utils.auth import login_required from app.utils.logger import get_logger from app.services.fast_analysis import get_fast_analysis_service from app.services.analysis_memory import get_analysis_memory +from app.services.billing_service import get_billing_service logger = get_logger(__name__) fast_analysis_bp = Blueprint('fast_analysis', __name__) +# In-memory in-flight guard to avoid duplicate analysis charges caused by rapid repeated clicks. +_analysis_inflight_lock = threading.Lock() +_analysis_inflight = {} # key -> expire_ts + + +def _build_inflight_key(user_id: int, market: str, symbol: str, timeframe: str) -> str: + return f"{int(user_id)}|{str(market or '').strip().upper()}|{str(symbol or '').strip().upper()}|{str(timeframe or '').strip().upper()}" + + +def _acquire_inflight(key: str, ttl_sec: int = 90) -> bool: + now = time.time() + with _analysis_inflight_lock: + # Cleanup stale entries + stale = [k for k, exp in _analysis_inflight.items() if float(exp) <= now] + for k in stale[:1024]: + _analysis_inflight.pop(k, None) + if key in _analysis_inflight and float(_analysis_inflight.get(key) or 0) > now: + return False + _analysis_inflight[key] = now + int(ttl_sec) + return True + + +def _release_inflight(key: str): + with _analysis_inflight_lock: + _analysis_inflight.pop(key, None) + @fast_analysis_bp.route('/analyze', methods=['POST']) @login_required @@ -51,6 +80,58 @@ def analyze(): # Get current user's ID to associate analysis with user user_id = getattr(g, 'user_id', None) + if not user_id: + return jsonify({'code': 0, 'msg': 'Unauthorized', 'data': None}), 401 + + inflight_key = _build_inflight_key(user_id, market, symbol, timeframe) + if not _acquire_inflight(inflight_key, ttl_sec=90): + return jsonify({ + 'code': 0, + 'msg': 'Analysis already in progress for this symbol/timeframe. Please wait.', + 'data': {'in_progress': True} + }), 429 + + # Billing / credits (best-effort, consistent with polymarket deep analysis) + credits_charged = 0 + remaining_credits = None + billing_consumed = False + billing = None + try: + billing = get_billing_service() + if billing.is_billing_enabled(): + credits_charged = int(billing.get_feature_cost('ai_analysis') or 0) + if credits_charged > 0: + ok, msg = billing.check_and_consume( + user_id=int(user_id), + feature='ai_analysis', + reference_id=f"fast_analysis_{market}:{symbol}:{timeframe}" + ) + if not ok: + # Standardize insufficient credits message + if str(msg or "").startswith('insufficient_credits'): + # Format: insufficient_credits:: + parts = str(msg).split(':') + cur = float(parts[1]) if len(parts) >= 2 else 0.0 + req = float(parts[2]) if len(parts) >= 3 else float(credits_charged) + return jsonify({ + 'code': 0, + 'msg': 'Insufficient credits', + 'data': { + 'required': req, + 'current': cur, + 'shortage': max(0.0, req - cur), + } + }), 400 + return jsonify({'code': 0, 'msg': f'Failed to deduct credits: {msg}', 'data': None}), 500 + billing_consumed = True + # Query remaining credits after successful consumption + try: + remaining_credits = float(billing.get_user_credits(int(user_id))) + except Exception: + remaining_credits = None + except Exception as e: + # Billing failure should not crash analysis by default, but should be visible in logs. + logger.warning(f"Billing check failed (skipped): {e}", exc_info=True) service = get_fast_analysis_service() result = service.analyze( @@ -63,6 +144,18 @@ def analyze(): ) if result.get('error'): + # Best-effort refund if we already charged but analysis failed. + if billing_consumed and billing and credits_charged > 0: + try: + billing.add_credits( + user_id=int(user_id), + amount=int(credits_charged), + action='refund', + remark=f'Auto refund: fast-analysis failed ({market}:{symbol}:{timeframe})' + ) + remaining_credits = float(billing.get_user_credits(int(user_id))) + except Exception as re: + logger.error(f"Auto refund failed: {re}", exc_info=True) return jsonify({ 'code': 0, 'msg': result['error'], @@ -75,16 +168,37 @@ def analyze(): return jsonify({ 'code': 1, 'msg': 'success', - 'data': result + 'data': { + **(result or {}), + 'credits_charged': credits_charged, + 'remaining_credits': remaining_credits, + } }) except Exception as e: + # Best-effort refund on unexpected error after charge. + try: + if 'billing_consumed' in locals() and billing_consumed and 'billing' in locals() and billing and credits_charged > 0 and 'user_id' in locals() and user_id: + billing.add_credits( + user_id=int(user_id), + amount=int(credits_charged), + action='refund', + remark=f'Auto refund: fast-analysis exception ({market}:{symbol}:{timeframe})' + ) + except Exception: + pass logger.error(f"Fast analysis API failed: {e}", exc_info=True) return jsonify({ 'code': 0, 'msg': str(e), 'data': None }), 500 + finally: + try: + if 'inflight_key' in locals() and inflight_key: + _release_inflight(inflight_key) + except Exception: + pass @fast_analysis_bp.route('/analyze-legacy', methods=['POST']) @@ -115,6 +229,56 @@ def analyze_legacy(): 'msg': 'market and symbol are required', 'data': None }), 400 + + # Billing / credits (same behavior as /analyze) + user_id = getattr(g, 'user_id', None) + if not user_id: + return jsonify({'code': 0, 'msg': 'Unauthorized', 'data': None}), 401 + + inflight_key = _build_inflight_key(user_id, market, symbol, timeframe) + if not _acquire_inflight(inflight_key, ttl_sec=90): + return jsonify({ + 'code': 0, + 'msg': 'Analysis already in progress for this symbol/timeframe. Please wait.', + 'data': {'in_progress': True} + }), 429 + + credits_charged = 0 + remaining_credits = None + billing_consumed = False + billing = None + try: + billing = get_billing_service() + if billing.is_billing_enabled(): + credits_charged = int(billing.get_feature_cost('ai_analysis') or 0) + if credits_charged > 0: + ok, msg = billing.check_and_consume( + user_id=int(user_id), + feature='ai_analysis', + reference_id=f"fast_analysis_legacy_{market}:{symbol}:{timeframe}" + ) + if not ok: + if str(msg or "").startswith('insufficient_credits'): + parts = str(msg).split(':') + cur = float(parts[1]) if len(parts) >= 2 else 0.0 + req = float(parts[2]) if len(parts) >= 3 else float(credits_charged) + return jsonify({ + 'code': 0, + 'msg': 'Insufficient credits', + 'data': { + 'required': req, + 'current': cur, + 'shortage': max(0.0, req - cur), + } + }), 400 + return jsonify({'code': 0, 'msg': f'Failed to deduct credits: {msg}', 'data': None}), 500 + billing_consumed = True + try: + remaining_credits = float(billing.get_user_credits(int(user_id))) + except Exception: + remaining_credits = None + except Exception as e: + logger.warning(f"Billing check failed (skipped): {e}", exc_info=True) service = get_fast_analysis_service() result = service.analyze_legacy_format( @@ -126,6 +290,17 @@ def analyze_legacy(): ) if result.get('error'): + if billing_consumed and billing and credits_charged > 0: + try: + billing.add_credits( + user_id=int(user_id), + amount=int(credits_charged), + action='refund', + remark=f'Auto refund: fast-analysis-legacy failed ({market}:{symbol}:{timeframe})' + ) + remaining_credits = float(billing.get_user_credits(int(user_id))) + except Exception as re: + logger.error(f"Auto refund failed (legacy): {re}", exc_info=True) return jsonify({ 'code': 0, 'msg': result['error'], @@ -135,16 +310,36 @@ def analyze_legacy(): return jsonify({ 'code': 1, 'msg': 'success', - 'data': result + 'data': { + **(result or {}), + 'credits_charged': credits_charged, + 'remaining_credits': remaining_credits, + } }) except Exception as e: + try: + if 'billing_consumed' in locals() and billing_consumed and 'billing' in locals() and billing and credits_charged > 0 and 'user_id' in locals() and user_id: + billing.add_credits( + user_id=int(user_id), + amount=int(credits_charged), + action='refund', + remark=f'Auto refund: fast-analysis-legacy exception ({market}:{symbol}:{timeframe})' + ) + except Exception: + pass logger.error(f"Fast analysis legacy API failed: {e}", exc_info=True) return jsonify({ 'code': 0, 'msg': str(e), 'data': None }), 500 + finally: + try: + if 'inflight_key' in locals() and inflight_key: + _release_inflight(inflight_key) + except Exception: + pass @fast_analysis_bp.route('/history', methods=['GET']) diff --git a/backend_api_python/app/routes/settings.py b/backend_api_python/app/routes/settings.py index 1d9fefd..cb1e211 100644 --- a/backend_api_python/app/routes/settings.py +++ b/backend_api_python/app/routes/settings.py @@ -220,6 +220,14 @@ CONFIG_SCHEMA = { 'required': False, 'description': 'Custom model list in JSON format for model selector' }, + { + 'key': 'AI_ANALYSIS_CONSENSUS_TIMEFRAMES', + 'label': 'Consensus Timeframes', + 'type': 'text', + 'default': '1D,4H', + 'required': False, + 'description': 'Multi-timeframe consensus for fast AI analysis. Comma-separated, e.g. "1D,4H"' + }, ] }, diff --git a/backend_api_python/app/services/ai_calibration.py b/backend_api_python/app/services/ai_calibration.py new file mode 100644 index 0000000..7419f75 --- /dev/null +++ b/backend_api_python/app/services/ai_calibration.py @@ -0,0 +1,348 @@ +""" +AI Calibration Service (offline). + +Goal: +- Calibrate the objective-score -> decision thresholds using validated historical analysis outcomes. +- Make FastAnalysisService "self-tuning" based on performance. + +Approach (approx rules as requested): +- Use qd_analysis_memory.actual_return_pct and apply simple correctness rules: + BUY correct if return_pct > +2 + SELL correct if return_pct < -2 + HOLD correct if abs(return_pct) <= 5 +- Search candidate absolute thresholds for score mapping: + score >= +thr => BUY + score <= -thr => SELL + else => HOLD + +We calibrate on consensus_score because it's the main "objective" signal used for overriding decisions. +""" + +from __future__ import annotations + +import os +import time +from dataclasses import dataclass +from typing import Dict, Any, List, Optional, Tuple + +from app.utils.db import get_db_connection +from app.utils.logger import get_logger +from app.services.analysis_memory import get_analysis_memory, AnalysisMemory +from app.services.market_data_collector import MarketDataCollector + + +logger = get_logger(__name__) + + +DEFAULTS = { + "buy_threshold": 20.0, + "sell_threshold": -20.0, + "min_consensus_abs_override": 15.0, + "quality_hold_threshold": 0.7, +} + + +@dataclass +class CalibrationResult: + market: str + buy_threshold: float + sell_threshold: float + best_accuracy: float + coverage: Dict[str, int] + sample_count: int + validated_count: int + updated_at_ts: float + + +class AICalibrationService: + def __init__(self): + self._ensure_table() + + def _ensure_table(self) -> None: + try: + with get_db_connection() as db: + cur = db.cursor() + cur.execute( + """ + CREATE TABLE IF NOT EXISTS qd_ai_calibration ( + id SERIAL PRIMARY KEY, + market VARCHAR(50) NOT NULL, + buy_threshold DECIMAL(10,4) NOT NULL, + sell_threshold DECIMAL(10,4) NOT NULL, + min_consensus_abs_override DECIMAL(10,4) NOT NULL, + quality_hold_threshold DECIMAL(10,4) NOT NULL, + sample_count INT NOT NULL DEFAULT 0, + validated_at TIMESTAMP DEFAULT NOW(), + created_at TIMESTAMP DEFAULT NOW() + ); + """ + ) + # Index for latest lookup + cur.execute( + """ + CREATE INDEX IF NOT EXISTS idx_ai_calibration_market_validated_at + ON qd_ai_calibration(market, validated_at DESC); + """ + ) + db.commit() + cur.close() + except Exception as e: + logger.error(f"Failed to ensure qd_ai_calibration table: {e}", exc_info=True) + + def get_latest(self, market: str) -> Dict[str, Any]: + """ + Get latest calibration config for market. + Falls back to DEFAULTS if not found. + """ + market = (market or "").strip() + if not market: + return dict(DEFAULTS) + + try: + with get_db_connection() as db: + cur = db.cursor() + cur.execute( + """ + SELECT buy_threshold, sell_threshold, + min_consensus_abs_override, quality_hold_threshold + FROM qd_ai_calibration + WHERE market = %s + ORDER BY validated_at DESC + LIMIT 1 + """, + (market,), + ) + row = cur.fetchone() or {} + cur.close() + if not row: + return dict(DEFAULTS) + out = dict(DEFAULTS) + out["buy_threshold"] = float(row.get("buy_threshold") or DEFAULTS["buy_threshold"]) + out["sell_threshold"] = float(row.get("sell_threshold") or DEFAULTS["sell_threshold"]) + out["min_consensus_abs_override"] = float( + row.get("min_consensus_abs_override") or DEFAULTS["min_consensus_abs_override"] + ) + out["quality_hold_threshold"] = float( + row.get("quality_hold_threshold") or DEFAULTS["quality_hold_threshold"] + ) + return out + except Exception as e: + logger.warning(f"get_latest calibration failed: {e}", exc_info=True) + return dict(DEFAULTS) + + def _candidate_abs_thresholds(self) -> List[float]: + env = os.getenv("AI_CALIBRATION_CANDIDATE_ABS_THRESHOLDS", "").strip() + if env: + parts = [p.strip() for p in env.split(",") if p.strip()] + out = [] + for p in parts: + try: + out.append(float(p)) + except Exception: + continue + if out: + return sorted(set(out)) + # Default grid + return [10, 12, 14, 16, 18, 20, 22, 25, 30] + + def _correctness_for_return(self, decision: str, return_pct: float) -> bool: + # Approx correctness rules (as requested) + if decision == "BUY": + return return_pct > 2.0 + if decision == "SELL": + return return_pct < -2.0 + # HOLD + return abs(return_pct) <= 5.0 + + def _predict_decision_from_score(self, score: float, abs_thr: float) -> str: + if score >= abs_thr: + return "BUY" + if score <= -abs_thr: + return "SELL" + return "HOLD" + + def calibrate_market( + self, + market: str = "Crypto", + *, + lookback_days: int = 30, + min_samples: int = 80, + validate_before: bool = True, + ) -> Optional[CalibrationResult]: + market = (market or "").strip() + if not market: + return None + + abs_thresholds = self._candidate_abs_thresholds() + + validated_count = 0 + try: + # Best-effort: validate old unvalidated records first. + if validate_before: + memory: AnalysisMemory = get_analysis_memory() + # Validate anything older than ~7 days (matching your existing approx rules). + validated_stats = memory.validate_unvalidated_older_than( + min_age_days=7, limit=300 + ) + validated_count = int(validated_stats.get("validated", 0) or 0) + except Exception as e: + logger.warning(f"pre-validation failed (skipped): {e}", exc_info=True) + + # Fetch validated rows with consensus_score and actual_return_pct + rows: List[Dict[str, Any]] = [] + try: + with get_db_connection() as db: + cur = db.cursor() + # Use f-string for interval since Postgres doesn't allow placeholder in INTERVAL literal + cur.execute( + f""" + SELECT + decision, + consensus_score, + consensus_abs, + quality_multiplier, + agreement_ratio, + actual_return_pct + FROM qd_analysis_memory + WHERE market = %s + AND validated_at IS NOT NULL + AND actual_return_pct IS NOT NULL + AND consensus_score IS NOT NULL + AND created_at > NOW() - INTERVAL '{int(lookback_days)} days' + """, + (market,), + ) + rows = cur.fetchall() or [] + cur.close() + except Exception as e: + logger.error(f"Failed to fetch memory rows for calibration: {e}", exc_info=True) + return None + + sample_count = len(rows) + if sample_count < min_samples: + logger.warning( + f"[AI Calibration] Not enough samples for {market}: {sample_count} < min_samples={min_samples}" + ) + return None + + best_abs_thr = abs_thresholds[0] + best_accuracy = -1.0 + best_coverage: Dict[str, int] = {"BUY": 0, "SELL": 0, "HOLD": 0} + + # Evaluate each threshold + for thr in abs_thresholds: + correct = 0 + total = 0 + coverage = {"BUY": 0, "SELL": 0, "HOLD": 0} + + for r in rows: + try: + score = float(r.get("consensus_score") or 0.0) + return_pct = float(r.get("actual_return_pct") or 0.0) + except Exception: + continue + + pred = self._predict_decision_from_score(score, thr) + coverage[pred] += 1 + total += 1 + if self._correctness_for_return(pred, return_pct): + correct += 1 + + if total <= 0: + continue + acc = correct / total * 100.0 + + # Tie-break: prefer higher BUY+SELL coverage (avoid always HOLD) + # Secondary tie-break: higher accuracy + buy_sell_cov = coverage["BUY"] + coverage["SELL"] + best_buy_sell_cov = best_coverage["BUY"] + best_coverage["SELL"] + + if acc > best_accuracy: + best_accuracy = acc + best_abs_thr = thr + best_coverage = coverage + elif acc == best_accuracy: + if buy_sell_cov > best_buy_sell_cov: + best_abs_thr = thr + best_coverage = coverage + + # Write new calibration row + buy_threshold = float(best_abs_thr) + sell_threshold = float(-best_abs_thr) + cfg = self.get_latest(market) + min_consensus_abs_override = float(cfg.get("min_consensus_abs_override") or DEFAULTS["min_consensus_abs_override"]) + quality_hold_threshold = float(cfg.get("quality_hold_threshold") or DEFAULTS["quality_hold_threshold"]) + + try: + with get_db_connection() as db: + cur = db.cursor() + cur.execute( + """ + INSERT INTO qd_ai_calibration + (market, buy_threshold, sell_threshold, + min_consensus_abs_override, quality_hold_threshold, + sample_count, validated_at, created_at) + VALUES + (%s, %s, %s, %s, %s, %s, NOW(), NOW()) + """, + ( + market, + buy_threshold, + sell_threshold, + min_consensus_abs_override, + quality_hold_threshold, + sample_count, + ), + ) + db.commit() + cur.close() + except Exception as e: + logger.error(f"[AI Calibration] Failed to persist calibration: {e}", exc_info=True) + return None + + return CalibrationResult( + market=market, + buy_threshold=buy_threshold, + sell_threshold=sell_threshold, + best_accuracy=float(best_accuracy), + coverage=best_coverage, + sample_count=sample_count, + validated_count=int(validated_count), + updated_at_ts=time.time(), + ) + + +def start_ai_calibration_worker() -> None: + """ + Run offline calibration once on service startup (best-effort). + """ + is_demo_mode = os.getenv("IS_DEMO_MODE", "false").lower() == "true" + if is_demo_mode: + logger.info("AI calibration worker skipped in demo mode.") + return + + enabled = os.getenv("ENABLE_OFFLINE_AI_CALIBRATION", "true").lower() == "true" + if not enabled: + logger.info("AI calibration worker disabled (ENABLE_OFFLINE_AI_CALIBRATION=false).") + return + + try: + svc = AICalibrationService() + lookback_days = int(os.getenv("AI_CALIBRATION_LOOKBACK_DAYS", "30")) + min_samples = int(os.getenv("AI_CALIBRATION_MIN_SAMPLES", "80")) + market = os.getenv("AI_CALIBRATION_MARKET", "Crypto").strip() or "Crypto" + logger.info( + f"Starting offline AI calibration: market={market}, lookback_days={lookback_days}, min_samples={min_samples}" + ) + result = svc.calibrate_market(market=market, lookback_days=lookback_days, min_samples=min_samples) + if result: + logger.info( + f"[AI Calibration] market={result.market} best_thr=+{result.buy_threshold:.1f} " + f"accuracy={result.best_accuracy:.2f}% sample={result.sample_count} " + f"coverage={result.coverage} validated_new={result.validated_count}" + ) + else: + logger.info("[AI Calibration] No calibration update applied (not enough data).") + except Exception as e: + logger.error(f"start_ai_calibration_worker failed: {e}", exc_info=True) + diff --git a/backend_api_python/app/services/analysis_memory.py b/backend_api_python/app/services/analysis_memory.py index a7a3920..acae9f5 100644 --- a/backend_api_python/app/services/analysis_memory.py +++ b/backend_api_python/app/services/analysis_memory.py @@ -67,6 +67,11 @@ class AnalysisMemory: scores JSONB, indicators_snapshot JSONB, raw_result JSONB, + consensus_decision VARCHAR(10), + consensus_score DECIMAL(24, 8), + consensus_abs DECIMAL(24, 8), + agreement_ratio DECIMAL(10, 6), + quality_multiplier DECIMAL(10, 6), created_at TIMESTAMP DEFAULT NOW(), validated_at TIMESTAMP, actual_outcome VARCHAR(20), @@ -96,6 +101,42 @@ class AnalysisMemory: ) THEN ALTER TABLE qd_analysis_memory ADD COLUMN raw_result JSONB; END IF; + + -- 添加多周期共识列(如果不存在) + IF NOT EXISTS ( + SELECT 1 FROM information_schema.columns + WHERE table_name = 'qd_analysis_memory' AND column_name = 'consensus_decision' + ) THEN + ALTER TABLE qd_analysis_memory ADD COLUMN consensus_decision VARCHAR(10); + END IF; + + IF NOT EXISTS ( + SELECT 1 FROM information_schema.columns + WHERE table_name = 'qd_analysis_memory' AND column_name = 'consensus_score' + ) THEN + ALTER TABLE qd_analysis_memory ADD COLUMN consensus_score DECIMAL(24, 8); + END IF; + + IF NOT EXISTS ( + SELECT 1 FROM information_schema.columns + WHERE table_name = 'qd_analysis_memory' AND column_name = 'consensus_abs' + ) THEN + ALTER TABLE qd_analysis_memory ADD COLUMN consensus_abs DECIMAL(24, 8); + END IF; + + IF NOT EXISTS ( + SELECT 1 FROM information_schema.columns + WHERE table_name = 'qd_analysis_memory' AND column_name = 'agreement_ratio' + ) THEN + ALTER TABLE qd_analysis_memory ADD COLUMN agreement_ratio DECIMAL(10, 6); + END IF; + + IF NOT EXISTS ( + SELECT 1 FROM information_schema.columns + WHERE table_name = 'qd_analysis_memory' AND column_name = 'quality_multiplier' + ) THEN + ALTER TABLE qd_analysis_memory ADD COLUMN quality_multiplier DECIMAL(10, 6); + END IF; END $$; """) @@ -150,16 +191,26 @@ class AnalysisMemory: scores = json.dumps(analysis_result.get("scores", {})) indicators = json.dumps(analysis_result.get("indicators", {})) raw = json.dumps(analysis_result) + + consensus = analysis_result.get("consensus") or {} + consensus_decision = consensus.get("consensus_decision") + consensus_score = consensus.get("consensus_score") + consensus_abs = consensus.get("consensus_abs") + agreement_ratio = consensus.get("agreement_ratio") + quality_multiplier = consensus.get("quality_multiplier") cur.execute(""" INSERT INTO qd_analysis_memory ( user_id, market, symbol, decision, confidence, price_at_analysis, entry_price, stop_loss, take_profit, - summary, reasons, risks, scores, indicators_snapshot, raw_result - ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) + summary, reasons, risks, scores, indicators_snapshot, raw_result, + consensus_decision, consensus_score, consensus_abs, agreement_ratio, quality_multiplier + ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, + %s, %s, %s, %s, %s) RETURNING id - """, (user_id, market, symbol, decision, confidence, price, entry, stop, take, - summary, reasons, risks, scores, indicators, raw)) + """, (user_id, market, symbol, decision, confidence, price, entry, stop, take, + summary, reasons, risks, scores, indicators, raw, + consensus_decision, consensus_score, consensus_abs, agreement_ratio, quality_multiplier)) # 使用 lastrowid 属性获取 ID(execute 内部已经处理了 RETURNING) memory_id = cur.lastrowid @@ -512,6 +563,84 @@ class AnalysisMemory: logger.info(f"Validation completed: {stats}") return stats + + def validate_unvalidated_older_than(self, min_age_days: int = 7, limit: int = 200) -> Dict[str, Any]: + """ + Best-effort backfill: + Validate unvalidated decisions older than `min_age_days`. + + This is used by offline AI calibration so the system can tune itself automatically. + """ + from app.services.market_data_collector import MarketDataCollector + collector = MarketDataCollector() + + stats = { + "validated": 0, + "correct": 0, + "incorrect": 0, + "errors": 0, + } + + try: + with get_db_connection() as db: + cur = db.cursor() + cur.execute( + f""" + SELECT id, market, symbol, decision, price_at_analysis + FROM qd_analysis_memory + WHERE validated_at IS NULL + AND created_at < NOW() - INTERVAL '{int(min_age_days)} days' + LIMIT {int(limit)} + """ + ) + rows = cur.fetchall() or [] + + for row in rows: + try: + current_price = collector._get_price(row["market"], row["symbol"]) + if not current_price or current_price <= 0: + continue + analysis_price = float(row.get("price_at_analysis") or 0.0) + if analysis_price <= 0: + continue + + return_pct = ((float(current_price) - analysis_price) / analysis_price) * 100.0 + decision = str(row.get("decision") or "HOLD") + + was_correct = False + if decision == "BUY" and return_pct > 2: + was_correct = True + elif decision == "SELL" and return_pct < -2: + was_correct = True + elif decision == "HOLD" and abs(return_pct) <= 5: + was_correct = True + + cur.execute( + """ + UPDATE qd_analysis_memory + SET validated_at = NOW(), + actual_return_pct = %s, + was_correct = %s + WHERE id = %s + """, + (return_pct, was_correct, int(row["id"])), + ) + + stats["validated"] += 1 + if was_correct: + stats["correct"] += 1 + else: + stats["incorrect"] += 1 + except Exception as e: + logger.warning(f"Failed to validate memory {row.get('id')}: {e}", exc_info=True) + stats["errors"] += 1 + + db.commit() + cur.close() + except Exception as e: + logger.error(f"validate_unvalidated_older_than failed: {e}", exc_info=True) + + return stats def get_performance_stats(self, market: str = None, symbol: str = None, days: int = 30) -> Dict[str, Any]: diff --git a/backend_api_python/app/services/fast_analysis.py b/backend_api_python/app/services/fast_analysis.py index 25428ee..6b93841 100644 --- a/backend_api_python/app/services/fast_analysis.py +++ b/backend_api_python/app/services/fast_analysis.py @@ -9,6 +9,7 @@ Fast Analysis Service 3.0 4. 单次LLM调用 - 强约束prompt,输出结构化分析 """ import json +import os import time from typing import Dict, Any, Optional, List from decimal import Decimal, ROUND_HALF_UP @@ -37,7 +38,17 @@ class FastAnalysisService: # ==================== Data Collection Layer ==================== - def _collect_market_data(self, market: str, symbol: str, timeframe: str = "1D") -> Dict[str, Any]: + def _collect_market_data( + self, + market: str, + symbol: str, + timeframe: str = "1D", + *, + include_macro: bool = True, + include_news: bool = True, + include_polymarket: bool = True, + timeout: int = 45, + ) -> Dict[str, Any]: """ 使用统一的数据采集器收集市场数据 @@ -52,10 +63,10 @@ class FastAnalysisService: market=market, symbol=symbol, timeframe=timeframe, - include_macro=True, - include_news=True, - include_polymarket=True, # 包含预测市场数据 - timeout=45 # 增加超时时间,确保数据收集完成 + include_macro=include_macro, + include_news=include_news, + include_polymarket=include_polymarket, # 包含预测市场数据 + timeout=timeout, # 增加超时时间,确保数据收集完成 ) def _calculate_indicators(self, kline_data: List[Dict]) -> Dict[str, Any]: @@ -694,9 +705,148 @@ IMPORTANT: } try: - # Phase 1: Data collection (parallel) + # Phase 1: Data collection (multi-timeframe for consensus) logger.info(f"Fast analysis starting: {market}:{symbol}") - data = self._collect_market_data(market, symbol, timeframe) + + # Consensus timeframes: + # - 默认:用用户传入的 timeframe 作为主周期,再加一个上层周期(1D/4H)提升稳定性 + # - 也允许通过 env 覆盖(逗号分隔),例如 AI_ANALYSIS_CONSENSUS_TIMEFRAMES=1D,4H + env_tfs = os.getenv("AI_ANALYSIS_CONSENSUS_TIMEFRAMES", "").strip() + if env_tfs: + consensus_timeframes = [t.strip() for t in env_tfs.split(",") if t.strip()] + else: + # Heuristic defaults + tf0 = (timeframe or "").strip().upper() + # Primary first + consensus_timeframes = [tf0] if tf0 else [timeframe] + # Add 4H/1D depending on primary + if tf0 in ("1H", "1HOUR", "60M"): + consensus_timeframes += ["4H", "1D"] + elif tf0 in ("4H",): + consensus_timeframes += ["1D"] + elif tf0 in ("1D", "1DAY", "D"): + consensus_timeframes += ["4H"] + else: + # Generic fallback + consensus_timeframes += ["1D", "4H"] + # Dedup keep order + seen = set() + consensus_timeframes = [x for x in consensus_timeframes if not (x in seen or seen.add(x))] + + primary_tf = (timeframe or "").strip().upper() or "1D" + # Always include the primary timeframe in consensus, + # even when env overrides timeframes. + if primary_tf and primary_tf not in consensus_timeframes: + consensus_timeframes = [primary_tf] + list(consensus_timeframes) + # De-dup keep order + seen = set() + consensus_timeframes = [x for x in consensus_timeframes if not (x in seen or seen.add(x))] + # Collect primary data including macro/news/polymarket for prompt quality + primary_data = self._collect_market_data( + market, + symbol, + primary_tf, + include_macro=True, + include_news=True, + include_polymarket=True, + ) + + # Collect extra timeframes for objective consensus (technical-only for cost) + objective_by_tf: Dict[str, Dict[str, Any]] = {} + decision_votes: Dict[str, int] = {"BUY": 0, "SELL": 0, "HOLD": 0} + weighted_score_sum = 0.0 + weighted_score_w_sum = 0.0 + + def _extract_current_price(d: Dict[str, Any]) -> Optional[float]: + if d.get("price") and d["price"].get("price"): + try: + return float(d["price"]["price"]) + except Exception: + return None + ind = d.get("indicators") or {} + cp = ind.get("current_price") + try: + if cp: + return float(cp) + except Exception: + pass + # fallback to kline close + kl = d.get("kline") or [] + if kl: + try: + return float(kl[-1].get("close") or 0) + except Exception: + return None + return None + + logger.info(f"Consensus timeframes: {consensus_timeframes}") + for tf in consensus_timeframes: + tf_norm = (tf or "").strip().upper() + if not tf_norm: + continue + + if tf_norm == primary_tf: + d_tf = primary_data + else: + d_tf = self._collect_market_data( + market, + symbol, + tf_norm, + include_macro=False, + include_news=False, + include_polymarket=False, + timeout=25, + ) + + current_price_tf = _extract_current_price(d_tf) or 0.0 + objective = self._calculate_objective_score(d_tf, current_price_tf) + overall_score = float(objective.get("overall_score", 0.0) or 0.0) + decision = self._score_to_decision(overall_score, market=market) + abs_score = abs(overall_score) + + objective_by_tf[tf_norm] = { + "objective_score": objective, + "overall_score": overall_score, + "decision": decision, + "abs_score": abs_score, + } + decision_votes[decision] = decision_votes.get(decision, 0) + 1 + + # Weight by strength so strong cycles dominate + w = 1.0 + min(1.5, abs_score / 100.0) + weighted_score_sum += overall_score * w + weighted_score_w_sum += w + + consensus_score = weighted_score_sum / weighted_score_w_sum if weighted_score_w_sum > 0 else 0.0 + consensus_decision = self._score_to_decision(consensus_score, market=market) + consensus_abs = abs(consensus_score) + + # Agreement factor: how many timeframes support the consensus decision + tf_count = max(1, len(objective_by_tf)) + agreement_cnt = sum(1 for x in objective_by_tf.values() if str(x.get("decision") or "").upper() == consensus_decision) + agreement_ratio = agreement_cnt / tf_count + + # Data quality degradation: derive from primary_data meta + meta = primary_data.get("_meta") or {} + failed_items = set(meta.get("failed_items") or []) + quality_multiplier = 1.0 + if "macro" in failed_items: + quality_multiplier *= 0.85 + if "news" in failed_items: + quality_multiplier *= 0.8 + if "polymarket" in failed_items: + quality_multiplier *= 0.9 + # If indicators missing key sections, reduce confidence more + ind = primary_data.get("indicators") or {} + if not ind or not ind.get("rsi") or not ind.get("moving_averages"): + quality_multiplier *= 0.65 + + logger.info( + f"Consensus decision={consensus_decision}, score={consensus_score:.2f}, " + f"agreement_ratio={agreement_ratio:.2f}, quality_multiplier={quality_multiplier:.2f}" + ) + + data = primary_data # keep original variable usage for prompt/LLM input # Validate we have essential data - with fallback to indicators current_price = None @@ -771,35 +921,69 @@ IMPORTANT: llm_time = int((time.time() - llm_start) * 1000) logger.info(f"LLM call completed in {llm_time}ms") - # Phase 4: Calculate objective score and determine decision based on score + # Phase 4: Objective score (primary tf) + consensus calibration objective_score = self._calculate_objective_score(data, current_price) - logger.info(f"Objective score calculated: {objective_score['overall_score']:.1f} (Technical: {objective_score['technical_score']:.1f}, Fundamental: {objective_score['fundamental_score']:.1f}, Sentiment: {objective_score['sentiment_score']:.1f}, Macro: {objective_score['macro_score']:.1f})") - - # Determine decision based on objective score thresholds - score_based_decision = self._score_to_decision(objective_score['overall_score']) - logger.info(f"Score-based decision: {score_based_decision} (score: {objective_score['overall_score']:.1f})") - - # Override LLM decision with score-based decision if they differ significantly - llm_decision = analysis.get("decision", "HOLD") - if llm_decision != score_based_decision: - score_abs = abs(objective_score['overall_score']) - # 降低阈值,因为现在HOLD区间更小了(±20),±15以上的评分就应该覆盖 - if score_abs >= 15: # 如果评分达到±15以上,就覆盖LLM决策(因为阈值是±20) - logger.warning(f"LLM decision '{llm_decision}' conflicts with score-based decision '{score_based_decision}' (score: {objective_score['overall_score']:.1f}). Overriding to score-based decision.") - analysis["decision"] = score_based_decision - # Adjust confidence based on score strength - # 评分越高,置信度越高(最高95,最低60) - analysis["confidence"] = min(95, max(60, int(50 + score_abs * 0.45))) - # Update summary to mention score-based decision - original_summary = analysis.get("summary", "") - score_level = "强烈" if score_abs >= 70 else "明显" if score_abs >= 40 else "轻微" - analysis["summary"] = f"{original_summary} [基于客观评分系统:综合评分{objective_score['overall_score']:.1f}分({score_level}{'利多' if objective_score['overall_score'] > 0 else '利空'}),建议{score_based_decision}]" - else: - logger.info(f"LLM decision '{llm_decision}' differs from score-based '{score_based_decision}' but score is close to neutral ({objective_score['overall_score']:.1f}), keeping LLM decision") - - # Add objective scores to analysis + logger.info( + f"Primary objective score: {objective_score['overall_score']:.1f} " + f"(Technical: {objective_score['technical_score']:.1f}, Fundamental: {objective_score['fundamental_score']:.1f}, " + f"Sentiment: {objective_score['sentiment_score']:.1f}, Macro: {objective_score['macro_score']:.1f})" + ) + + score_based_decision = self._score_to_decision(objective_score["overall_score"], market=market) + llm_decision = str(analysis.get("decision", "HOLD") or "HOLD").upper() + + # Consensus confidence: + consensus_conf = int(max(40, min(98, 50 + consensus_abs * 0.35))) + # Agreement boosts, disagreement reduces + consensus_conf = int(max(35, min(98, consensus_conf * (0.85 + 0.3 * agreement_ratio)))) + consensus_conf = int(max(0, min(100, consensus_conf * quality_multiplier))) + + # Decide whether to enforce consensus over LLM / primary-score decision + cfg = self._get_ai_calibration(market=market) + min_abs_override = float(cfg.get("min_consensus_abs_override") or 15.0) + quality_hold_thr = float(cfg.get("quality_hold_threshold") or 0.7) + + if consensus_abs >= min_abs_override: + final_decision = consensus_decision + if llm_decision != final_decision: + logger.warning( + f"Override: llm_decision={llm_decision}, consensus_decision={final_decision}, " + f"consensus_score={consensus_score:.1f}, consensus_abs={consensus_abs:.1f}" + ) + analysis["decision"] = final_decision + analysis["confidence"] = consensus_conf + original_summary = analysis.get("summary", "") + level = "强烈" if consensus_abs >= 70 else "明显" if consensus_abs >= 40 else "轻微" + analysis["summary"] = ( + f"{original_summary} [多周期客观共识:综合评分{consensus_score:.1f}分(" + f"{level}{'利多' if consensus_score > 0 else '利空'}),建议{final_decision}]" + ) + else: + # Near-neutral: keep LLM but shrink confidence by quality and enforce HOLD if quality is poor + analysis["confidence"] = int(max(0, min(100, int(analysis.get("confidence", 50) or 50) * quality_multiplier))) + + if quality_multiplier < quality_hold_thr: + analysis["decision"] = "HOLD" + analysis["confidence"] = min(int(analysis.get("confidence", 50) or 50), 55) + + # Add objective scores and consensus to analysis analysis["objective_score"] = objective_score analysis["score_based_decision"] = score_based_decision + analysis["objective_scores_by_timeframe"] = { + k: { + "overall_score": v.get("overall_score"), + "decision": v.get("decision"), + "abs_score": v.get("abs_score"), + } + for k, v in objective_by_tf.items() + } + analysis["consensus"] = { + "consensus_score": consensus_score, + "consensus_decision": consensus_decision, + "consensus_abs": consensus_abs, + "agreement_ratio": agreement_ratio, + "quality_multiplier": quality_multiplier, + } # Phase 5: Validate and constrain output (pass indicators for decision validation) # Check for major news or macro events that could override technical indicators @@ -815,6 +999,21 @@ IMPORTANT: has_major_news=has_major_news, has_macro_event=has_macro_event ) + + # Post-validate: adjust position sizing based on quality + agreement + try: + ps = analysis.get("position_size_pct", 10) + ps = int(float(ps or 10)) + # Lower position size if data is incomplete or multi-timeframe disagreement exists + # agreement_ratio in [0..1] + agreement_scale = 0.6 + 0.4 * float(agreement_ratio) + ps_scaled = ps * float(quality_multiplier) * agreement_scale + if str(analysis.get("decision") or "").upper() == "HOLD": + ps_scaled *= 0.25 + analysis["position_size_pct"] = max(1, min(100, int(round(ps_scaled)))) + except Exception: + # Keep model-provided position_size_pct + pass # Build final result total_time = int((time.time() - start_time) * 1000) @@ -860,6 +1059,7 @@ IMPORTANT: "resistance": data["indicators"].get("levels", {}).get("resistance"), }, "indicators": data.get("indicators", {}), + "consensus": analysis.get("consensus", {}), "analysis_time_ms": total_time, "llm_time_ms": llm_time, "data_collection_time_ms": data.get("collection_time_ms", 0), @@ -1207,14 +1407,39 @@ IMPORTANT: macro_score = self._calculate_macro_score(macro, data.get("market", "")) # 5. 综合评分(加权平均) - # 优化权重:技术35%,基本面20%,情绪25%(包含地缘政治),宏观20%(提高宏观权重) - # 提高情绪和宏观权重,因为地缘政治和宏观经济因素对市场影响更大 - overall_score = ( - technical_score * 0.35 + - fundamental_score * 0.20 + - sentiment_score * 0.25 + # 提高情绪权重,包含地缘政治事件 - macro_score * 0.20 # 提高宏观权重 - ) + # 优化权重:默认技术35%,基本面20%,情绪25%(包含地缘政治),宏观20%(提高宏观权重) + # 但要做“可用信息重加权”:当某些模块缺失(如新闻/宏观没取到),不要用0分去稀释整体强度, + # 而是重新归一化权重,让技术信号在缺失时仍可发挥主导作用。 + market_type = str(data.get("market") or "") + fundamental_present = (market_type == "USStock") and bool(fundamental) + sentiment_present = bool(news) + macro_present = bool(macro) + # indicators 一旦成功计算通常就存在,但这里也做一次保护 + technical_present = bool(indicators) + + weights = { + "technical": 0.35, + "fundamental": 0.20, + "sentiment": 0.25, + "macro": 0.20, + } + present_flags = { + "technical": technical_present, + "fundamental": fundamental_present, + "sentiment": sentiment_present, + "macro": macro_present, + } + + total_w = sum(w for k, w in weights.items() if present_flags.get(k)) + if total_w <= 0: + overall_score = technical_score + else: + overall_score = ( + (technical_score * weights["technical"] if present_flags.get("technical") else 0.0) + + (fundamental_score * weights["fundamental"] if present_flags.get("fundamental") else 0.0) + + (sentiment_score * weights["sentiment"] if present_flags.get("sentiment") else 0.0) + + (macro_score * weights["macro"] if present_flags.get("macro") else 0.0) + ) / total_w return { "technical_score": technical_score, @@ -1223,6 +1448,34 @@ IMPORTANT: "macro_score": macro_score, "overall_score": overall_score } + + def _get_ai_calibration(self, market: str = "Crypto") -> Dict[str, Any]: + """ + Load latest offline calibration thresholds for the given market. + Cached briefly to avoid DB load on every request. + """ + # Simple per-process cache + now = time.time() + if not hasattr(self, "_calibration_cache"): + self._calibration_cache = {} + self._calibration_cache_ts = {} + ttl = int(os.getenv("AI_CALIBRATION_CACHE_TTL_SEC", "300")) + key = (market or "").strip() or "Crypto" + ts = self._calibration_cache_ts.get(key) or 0.0 + if ts and (now - float(ts)) < ttl: + return self._calibration_cache.get(key) or {} + + try: + from app.services.ai_calibration import AICalibrationService + svc = AICalibrationService() + cfg = svc.get_latest(key) + except Exception as e: + logger.warning(f"_get_ai_calibration failed (fallback): {e}", exc_info=True) + cfg = {} + + self._calibration_cache[key] = cfg + self._calibration_cache_ts[key] = now + return cfg def _calculate_technical_score(self, indicators: Dict, price_data: Dict) -> float: """计算技术指标评分 (-100 to +100)""" @@ -1288,6 +1541,94 @@ IMPORTANT: change_score = change_24h * 2 # 线性映射 score += change_score * 0.20 weight_sum += 0.20 + + # ========== 额外技术特征(轻量增强,不改变主体结构) ========== + # 这些特征来自 MarketDataCollector._calculate_indicators 的输出: + # - price_position: 过去20根K线区间位置 0~100 + # - volume_ratio: 最新成交量 / 20期均量 + # - bollinger: BB_upper/BB_lower/BB_width + # - volatility: atr, pct + extra_score = 0.0 + extra_weight = 0.0 + + # 1) 区间位置:接近区间顶部更偏利空,接近区间底部更偏利多 + try: + pp = float(indicators.get("price_position", 50.0)) + # 0~100 -> -15~+15 (线性映射,中心50为0) + pp_score = (50.0 - pp) * 0.3 + # 在极端区域增强信号 + if pp >= 85: + pp_score -= 5 + elif pp <= 15: + pp_score += 5 + extra_score += pp_score + extra_weight += 0.20 + except Exception: + pass + + # 2) 布林带触及:突破上轨偏利空,跌破下轨偏利多 + try: + cur_px = float(indicators.get("current_price") or price_data.get("price") or 0.0) + bb = indicators.get("bollinger") or {} + bb_u = float(bb.get("BB_upper") or 0.0) + bb_l = float(bb.get("BB_lower") or 0.0) + if cur_px > 0 and bb_u > 0 and bb_l > 0 and bb_u > bb_l: + if cur_px >= bb_u: + extra_score += -12 + extra_weight += 0.20 + elif cur_px <= bb_l: + extra_score += +12 + extra_weight += 0.20 + else: + # Within bands: small contribution by relative position + rel = (cur_px - bb_l) / (bb_u - bb_l) # 0..1 + extra_score += (0.5 - float(rel)) * 10 + extra_weight += 0.10 + except Exception: + pass + + # 3) 成交量放大:在趋势方向上加分,逆趋势减分(弱信号) + try: + vr = float(indicators.get("volume_ratio") or 1.0) + trend = str(indicators.get("trend") or indicators.get("moving_averages", {}).get("trend") or "").lower() + if vr >= 1.8: + if "uptrend" in trend: + extra_score += +8 + extra_weight += 0.15 + elif "downtrend" in trend: + extra_score += -8 + extra_weight += 0.15 + else: + # 放量但无趋势:更偏不确定,略微降低(当作偏利空风险) + extra_score += -3 + extra_weight += 0.10 + elif vr <= 0.6: + # 缩量:趋势信号可信度下降(轻微回归到0) + extra_score += 0 + extra_weight += 0.05 + except Exception: + pass + + # 4) 高波动:减少强方向自信(用“缩放”形式实现,避免硬反转) + try: + vol = indicators.get("volatility") or {} + vol_pct = float(vol.get("pct") or 0.0) + if vol_pct >= 6.0: + # 极高波动:把额外分数打折,并轻微把总体拉回0 + extra_score *= 0.6 + score *= 0.92 + elif vol_pct >= 3.5: + extra_score *= 0.8 + score *= 0.96 + except Exception: + pass + + # Combine extra into main score (treat as another component) + if extra_weight > 0: + # Normalize extra to roughly -100..+100 scale + extra_norm = max(-100.0, min(100.0, float(extra_score))) + score += extra_norm * 0.15 + weight_sum += 0.15 # 归一化到-100到+100 if weight_sum > 0: @@ -1536,17 +1877,38 @@ IMPORTANT: tnx_score = 0 score += tnx_score factors += 1 + + # 恐惧贪婪指数(更适合 Crypto):极端贪婪偏利空,极端恐惧偏利多(弱信号) + try: + fg = macro.get("FEAR_GREED", {}) or {} + fg_value = float(fg.get("price") or 0.0) + if fg_value > 0 and market in ["Crypto"]: + if fg_value >= 80: + score += -15 + factors += 1 + elif fg_value >= 65: + score += -8 + factors += 1 + elif fg_value <= 20: + score += +10 + factors += 1 + elif fg_value <= 35: + score += +5 + factors += 1 + except Exception: + pass # 归一化(考虑权重) if factors > 0: # 最大可能分数:VIX(-50~+20), DXY(-30~+30), TNX(-30~+30) = 约-110到+80 # 归一化到-100到+100 - max_possible = 110 # 最大绝对值 + # 加上 Fear&Greed 的幅度(约 15),给点 buffer + max_possible = 125 # 最大绝对值 score = score / max_possible * 100 return max(-100, min(100, score)) - def _score_to_decision(self, score: float) -> str: + def _score_to_decision(self, score: float, *, market: str = "Crypto") -> str: """ 根据客观评分转换为决策 @@ -1566,10 +1928,13 @@ IMPORTANT: - -70 < score <= -40: 明显SELL - score <= -70: 强烈SELL """ - # 使用±20作为主要阈值,大幅缩小HOLD区间 - if score >= 20: + cfg = self._get_ai_calibration(market=market) + buy_thr = float(cfg.get("buy_threshold") or 20.0) + sell_thr = float(cfg.get("sell_threshold") or -20.0) + + if score >= buy_thr: return "BUY" - elif score <= -20: + elif score <= sell_thr: return "SELL" else: return "HOLD" diff --git a/docker-compose.yml b/docker-compose.yml index 44132b6..4228415 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -8,11 +8,13 @@ # 3. docker-compose up -d --build # 4. Open http://localhost:8888 # +# Frontend image: multi-stage build from QuantDinger-Vue-src (context = repo root). +# To refresh static files without Docker: cd QuantDinger-Vue-src && npm run build +# && rm -rf ../frontend/dist && cp -R dist ../frontend/dist +# # Note: The container will NOT start if SECRET_KEY is using the default value. # This is a security measure to prevent insecure deployments. -version: '3.8' - services: # ======================== # PostgreSQL Database @@ -73,12 +75,12 @@ services: retries: 3 # ======================== - # Frontend (Nginx + Pre-built) + # Frontend (Nginx + Vue build from QuantDinger-Vue-src) # ======================== frontend: build: - context: ./frontend - dockerfile: Dockerfile + context: . + dockerfile: frontend/Dockerfile container_name: quantdinger-frontend restart: unless-stopped ports: diff --git a/frontend/Dockerfile b/frontend/Dockerfile index 8e1e3bc..1a91d54 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -1,12 +1,32 @@ -# QuantDinger Frontend - Pre-built Static Files -# No build step needed - dist/ is already compiled. +# QuantDinger Frontend — multi-stage build +# Build context: repository root (see docker-compose.yml) +# +# Stage 1: compile Vue app from QuantDinger-Vue-src +# Stage 2: nginx static + API reverse proxy (nginx.conf) + +FROM node:18-alpine AS builder + +WORKDIR /app + +# Layer cache: deps only +COPY QuantDinger-Vue-src/package.json QuantDinger-Vue-src/package-lock.json ./ +RUN npm ci + +COPY QuantDinger-Vue-src/ ./ + +# Match local production build (`npm run build` in QuantDinger-Vue-src) +ENV NODE_OPTIONS=--max_old_space_size=4096 +RUN npm run build + +# --- runtime --- + FROM nginx:1.25-alpine -# Copy pre-built frontend files -COPY dist/ /usr/share/nginx/html/ +# curl: docker-compose healthcheck +RUN apk add --no-cache curl -# Copy nginx configuration -COPY nginx.conf /etc/nginx/conf.d/default.conf +COPY --from=builder /app/dist /usr/share/nginx/html/ +COPY frontend/nginx.conf /etc/nginx/conf.d/default.conf EXPOSE 80 diff --git a/frontend/dist/css/268.37fb7134.css b/frontend/dist/css/268.37fb7134.css new file mode 100644 index 0000000..91cfae0 --- /dev/null +++ b/frontend/dist/css/268.37fb7134.css @@ -0,0 +1 @@ +.fast-analysis-report[data-v-693144f6]{height:100%;overflow-y:auto;padding:20px;background:linear-gradient(135deg,#f5f7fa,#e4e8ec);border-radius:12px}.fast-analysis-report .loading-container[data-v-693144f6]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;min-height:400px;background:#fff;border-radius:12px}.fast-analysis-report .loading-container .loading-content-pro[data-v-693144f6]{width:100%;max-width:400px;padding:40px}.fast-analysis-report .loading-container .loading-content-pro .loading-header[data-v-693144f6]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;gap:12px;margin-bottom:32px}.fast-analysis-report .loading-container .loading-content-pro .loading-header .loading-icon-pro[data-v-693144f6]{font-size:28px;color:#1890ff}.fast-analysis-report .loading-container .loading-content-pro .loading-header .loading-title[data-v-693144f6]{font-size:20px;font-weight:600;color:#1e293b}.fast-analysis-report .loading-container .loading-content-pro .progress-wrapper[data-v-693144f6]{margin-bottom:24px;position:relative}.fast-analysis-report .loading-container .loading-content-pro .progress-wrapper .progress-text[data-v-693144f6]{position:absolute;right:0;top:-24px;font-size:14px;font-weight:600;color:#1890ff}.fast-analysis-report .loading-container .loading-content-pro .current-step[data-v-693144f6]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;gap:8px;padding:12px 20px;background:#f0f5ff;border-radius:8px;margin-bottom:24px;color:#1890ff;font-size:14px;font-weight:500}.fast-analysis-report .loading-container .loading-content-pro .current-step .anticon[data-v-693144f6]{font-size:16px}.fast-analysis-report .loading-container .loading-content-pro .steps-list[data-v-693144f6]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;gap:12px}.fast-analysis-report .loading-container .loading-content-pro .steps-list .step-item[data-v-693144f6]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:12px;padding:10px 16px;background:#f8fafc;border-radius:8px;font-size:13px;color:#94a3b8;-webkit-transition:all .3s;transition:all .3s}.fast-analysis-report .loading-container .loading-content-pro .steps-list .step-item .step-dot[data-v-693144f6]{width:8px;height:8px;border-radius:50%;background:#e2e8f0;-webkit-transition:all .3s;transition:all .3s}.fast-analysis-report .loading-container .loading-content-pro .steps-list .step-item .step-text[data-v-693144f6]{-webkit-box-flex:1;-ms-flex:1;flex:1}.fast-analysis-report .loading-container .loading-content-pro .steps-list .step-item .step-check[data-v-693144f6]{color:#52c41a;font-size:14px}.fast-analysis-report .loading-container .loading-content-pro .steps-list .step-item.active[data-v-693144f6]{background:#e6f7ff;color:#1890ff;font-weight:500}.fast-analysis-report .loading-container .loading-content-pro .steps-list .step-item.active .step-dot[data-v-693144f6]{background:#1890ff;-webkit-box-shadow:0 0 0 3px rgba(24,144,255,.2);box-shadow:0 0 0 3px rgba(24,144,255,.2)}.fast-analysis-report .loading-container .loading-content-pro .steps-list .step-item.done[data-v-693144f6]{background:#f6ffed;color:#52c41a}.fast-analysis-report .loading-container .loading-content-pro .steps-list .step-item.done .step-dot[data-v-693144f6]{background:#52c41a}.fast-analysis-report .loading-container .loading-content-pro .loading-footer[data-v-693144f6]{margin-top:24px;text-align:center}.fast-analysis-report .loading-container .loading-content-pro .loading-footer .elapsed-time[data-v-693144f6]{font-size:13px;color:#94a3b8;font-family:SF Mono,Monaco,monospace}.fast-analysis-report .empty-container[data-v-693144f6]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;min-height:400px}.fast-analysis-report .empty-container .empty-content[data-v-693144f6]{text-align:center}.fast-analysis-report .empty-container .empty-content .empty-icon[data-v-693144f6]{font-size:64px;color:#d9d9d9}.fast-analysis-report .empty-container .empty-content .empty-title[data-v-693144f6]{margin-top:16px;font-size:18px;font-weight:600;color:#262626}.fast-analysis-report .empty-container .empty-content .empty-hint[data-v-693144f6]{margin-top:8px;color:#8c8c8c}.fast-analysis-report .result-container .decision-card[data-v-693144f6]{background:#fff;border-radius:16px;padding:24px;margin-bottom:20px;-webkit-box-shadow:0 4px 12px rgba(0,0,0,.08);box-shadow:0 4px 12px rgba(0,0,0,.08);border-left:6px solid #1890ff}.fast-analysis-report .result-container .decision-card.decision-buy[data-v-693144f6]{border-left-color:#52c41a;background:linear-gradient(135deg,#f6ffed,#fff)}.fast-analysis-report .result-container .decision-card.decision-sell[data-v-693144f6]{border-left-color:#ff4d4f;background:linear-gradient(135deg,#fff2f0,#fff)}.fast-analysis-report .result-container .decision-card.decision-hold[data-v-693144f6]{border-left-color:#faad14;background:linear-gradient(135deg,#fffbe6,#fff)}.fast-analysis-report .result-container .decision-card .decision-main[data-v-693144f6]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:16px}.fast-analysis-report .result-container .decision-card .decision-main .decision-badge[data-v-693144f6]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:12px}.fast-analysis-report .result-container .decision-card .decision-main .decision-badge .anticon[data-v-693144f6]{font-size:32px}.fast-analysis-report .result-container .decision-card .decision-main .decision-badge .decision-text[data-v-693144f6]{font-size:36px;font-weight:800;letter-spacing:2px}.fast-analysis-report .result-container .decision-card .decision-main .confidence-ring[data-v-693144f6]{text-align:center}.fast-analysis-report .result-container .decision-card .decision-main .confidence-ring .confidence-value[data-v-693144f6]{font-size:18px;font-weight:700}.fast-analysis-report .result-container .decision-card .decision-main .confidence-ring .confidence-label[data-v-693144f6]{font-size:12px;color:#8c8c8c;margin-top:4px}.fast-analysis-report .result-container .decision-card .decision-summary[data-v-693144f6]{font-size:16px;line-height:1.6;color:#595959;padding-top:16px;border-top:1px dashed #e8e8e8}.fast-analysis-report .result-container .decision-card .consensus-strip[data-v-693144f6]{margin-top:14px;padding:12px 14px;border-radius:8px;background:rgba(24,144,255,.06);border:1px solid rgba(24,144,255,.2);font-size:13px;color:#434343}.fast-analysis-report .result-container .decision-card .consensus-strip .consensus-strip-title[data-v-693144f6]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:8px;font-weight:600;margin-bottom:8px;color:#1890ff}.fast-analysis-report .result-container .decision-card .consensus-strip .consensus-strip-metrics[data-v-693144f6]{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;gap:12px 20px}.fast-analysis-report .result-container .decision-card .consensus-strip .consensus-strip-metrics .cm-item em[data-v-693144f6]{font-style:normal;color:#8c8c8c;margin-right:6px}.fast-analysis-report .result-container .price-info-row[data-v-693144f6]{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin-bottom:20px}.fast-analysis-report .result-container .price-info-row .price-card[data-v-693144f6]{background:#fff;border-radius:12px;padding:16px;text-align:center;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.06);box-shadow:0 2px 8px rgba(0,0,0,.06)}.fast-analysis-report .result-container .price-info-row .price-card .price-label[data-v-693144f6]{font-size:12px;color:#8c8c8c;margin-bottom:8px}.fast-analysis-report .result-container .price-info-row .price-card .price-value[data-v-693144f6]{font-size:18px;font-weight:700;color:#262626}.fast-analysis-report .result-container .price-info-row .price-card .price-value.positive[data-v-693144f6]{color:#52c41a}.fast-analysis-report .result-container .price-info-row .price-card .price-value.negative[data-v-693144f6]{color:#ff4d4f}.fast-analysis-report .result-container .price-info-row .price-card .price-hint[data-v-693144f6]{font-size:10px;color:#bfbfbf;margin-top:6px;cursor:help}.fast-analysis-report .result-container .price-info-row .price-card .price-hint .anticon[data-v-693144f6]{margin-right:2px}.fast-analysis-report .result-container .price-info-row .price-card .price-change[data-v-693144f6]{font-size:14px;margin-top:4px;font-weight:600}.fast-analysis-report .result-container .price-info-row .price-card .price-change.positive[data-v-693144f6]{color:#52c41a}.fast-analysis-report .result-container .price-info-row .price-card .price-change.negative[data-v-693144f6]{color:#ff4d4f}.fast-analysis-report .result-container .price-info-row .price-card.current[data-v-693144f6]{border-top:3px solid #1890ff}.fast-analysis-report .result-container .price-info-row .price-card.entry[data-v-693144f6]{border-top:3px solid #722ed1}.fast-analysis-report .result-container .price-info-row .price-card.stop[data-v-693144f6]{border-top:3px solid #ff4d4f}.fast-analysis-report .result-container .price-info-row .price-card.target[data-v-693144f6]{border-top:3px solid #52c41a}.fast-analysis-report .result-container .scores-row[data-v-693144f6]{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin-bottom:20px}.fast-analysis-report .result-container .scores-row .score-item[data-v-693144f6]{background:#fff;border-radius:12px;padding:16px;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.06);box-shadow:0 2px 8px rgba(0,0,0,.06)}.fast-analysis-report .result-container .scores-row .score-item .score-header[data-v-693144f6]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:8px;font-size:14px;color:#595959;margin-bottom:12px}.fast-analysis-report .result-container .scores-row .score-item .score-header .anticon[data-v-693144f6]{color:#1890ff}.fast-analysis-report .result-container .scores-row .score-item .score-value[data-v-693144f6]{text-align:right;font-size:20px;font-weight:700;color:#262626;margin-top:8px}.fast-analysis-report .result-container .scores-row .score-item.overall[data-v-693144f6]{background:linear-gradient(135deg,#e6f7ff,#fff);border:1px solid #91d5ff}.fast-analysis-report .result-container .detailed-analysis[data-v-693144f6]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;gap:16px;margin-bottom:20px}.fast-analysis-report .result-container .detailed-analysis .analysis-card[data-v-693144f6]{background:linear-gradient(135deg,#fff,#fafafa);border-radius:12px;padding:20px;-webkit-box-shadow:0 2px 12px rgba(0,0,0,.06);box-shadow:0 2px 12px rgba(0,0,0,.06);border-left:4px solid #1890ff}.fast-analysis-report .result-container .detailed-analysis .analysis-card.technical[data-v-693144f6]{border-left-color:#1890ff}.fast-analysis-report .result-container .detailed-analysis .analysis-card.fundamental[data-v-693144f6]{border-left-color:#722ed1}.fast-analysis-report .result-container .detailed-analysis .analysis-card.sentiment[data-v-693144f6]{border-left-color:#eb2f96}.fast-analysis-report .result-container .detailed-analysis .analysis-card .analysis-card-header[data-v-693144f6]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:10px;margin-bottom:14px;font-size:16px;font-weight:600;color:#262626}.fast-analysis-report .result-container .detailed-analysis .analysis-card .analysis-card-header .anticon[data-v-693144f6]{font-size:20px}.fast-analysis-report .result-container .detailed-analysis .analysis-card .analysis-card-header.technical .anticon[data-v-693144f6]{color:#1890ff}.fast-analysis-report .result-container .detailed-analysis .analysis-card .analysis-card-header.fundamental .anticon[data-v-693144f6]{color:#722ed1}.fast-analysis-report .result-container .detailed-analysis .analysis-card .analysis-card-header.sentiment .anticon[data-v-693144f6]{color:#eb2f96}.fast-analysis-report .result-container .detailed-analysis .analysis-card .analysis-card-content[data-v-693144f6]{font-size:14px;line-height:1.8;color:#595959;text-align:justify}.fast-analysis-report .result-container .analysis-details[data-v-693144f6]{display:grid;grid-template-columns:1fr 1fr;gap:20px;margin-bottom:20px}.fast-analysis-report .result-container .analysis-details .detail-section[data-v-693144f6]{background:#fff;border-radius:12px;padding:20px;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.06);box-shadow:0 2px 8px rgba(0,0,0,.06)}.fast-analysis-report .result-container .analysis-details .detail-section .section-title[data-v-693144f6]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:8px;font-size:16px;font-weight:600;margin-bottom:16px;color:#262626}.fast-analysis-report .result-container .analysis-details .detail-section .detail-list[data-v-693144f6]{list-style:none;padding:0;margin:0}.fast-analysis-report .result-container .analysis-details .detail-section .detail-list li[data-v-693144f6]{padding:10px 0;border-bottom:1px solid #f0f0f0;font-size:14px;line-height:1.6;color:#595959}.fast-analysis-report .result-container .analysis-details .detail-section .detail-list li[data-v-693144f6]:last-child{border-bottom:none}.fast-analysis-report .result-container .analysis-details .detail-section .detail-list li[data-v-693144f6]:before{content:"•";margin-right:8px;color:#1890ff}.fast-analysis-report .result-container .analysis-details .detail-section.reasons[data-v-693144f6]{border-left:4px solid #52c41a}.fast-analysis-report .result-container .analysis-details .detail-section.risks[data-v-693144f6]{border-left:4px solid #faad14}.fast-analysis-report .result-container .indicators-section[data-v-693144f6]{background:#fff;border-radius:12px;padding:20px;margin-bottom:20px;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.06);box-shadow:0 2px 8px rgba(0,0,0,.06)}.fast-analysis-report .result-container .indicators-section .section-title[data-v-693144f6]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:8px;font-size:16px;font-weight:600;margin-bottom:16px;color:#262626}.fast-analysis-report .result-container .indicators-section .section-title .anticon[data-v-693144f6]{color:#1890ff}.fast-analysis-report .result-container .indicators-section .indicators-grid[data-v-693144f6]{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:16px}.fast-analysis-report .result-container .indicators-section .indicators-grid .indicator-item[data-v-693144f6]{background:#fafafa;border-radius:8px;padding:12px;text-align:center}.fast-analysis-report .result-container .indicators-section .indicators-grid .indicator-item .indicator-name[data-v-693144f6]{font-size:12px;color:#8c8c8c;margin-bottom:8px}.fast-analysis-report .result-container .indicators-section .indicators-grid .indicator-item .indicator-value[data-v-693144f6]{font-size:16px;font-weight:600;color:#262626}.fast-analysis-report .result-container .indicators-section .indicators-grid .indicator-item .indicator-value.bullish[data-v-693144f6],.fast-analysis-report .result-container .indicators-section .indicators-grid .indicator-item .indicator-value.oversold[data-v-693144f6]{color:#52c41a}.fast-analysis-report .result-container .indicators-section .indicators-grid .indicator-item .indicator-value.bearish[data-v-693144f6],.fast-analysis-report .result-container .indicators-section .indicators-grid .indicator-item .indicator-value.high-volatility[data-v-693144f6],.fast-analysis-report .result-container .indicators-section .indicators-grid .indicator-item .indicator-value.overbought[data-v-693144f6]{color:#ff4d4f}.fast-analysis-report .result-container .indicators-section .indicators-grid .indicator-item .indicator-value.low-volatility[data-v-693144f6]{color:#52c41a}.fast-analysis-report .result-container .indicators-section .indicators-grid .indicator-item .indicator-signal[data-v-693144f6]{font-size:11px;color:#8c8c8c;margin-top:4px;text-transform:capitalize}.fast-analysis-report .result-container .feedback-section[data-v-693144f6]{background:#fff;border-radius:12px;padding:20px;text-align:center;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.06);box-shadow:0 2px 8px rgba(0,0,0,.06)}.fast-analysis-report .result-container .feedback-section .feedback-question[data-v-693144f6]{font-size:14px;color:#595959;margin-bottom:12px}.fast-analysis-report .result-container .feedback-section .feedback-buttons[data-v-693144f6]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;gap:16px;margin-bottom:16px}.fast-analysis-report .result-container .feedback-section .feedback-buttons .ant-btn[data-v-693144f6]{min-width:100px}.fast-analysis-report .result-container .feedback-section .analysis-meta[data-v-693144f6]{font-size:12px;color:#8c8c8c;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;gap:16px}@media (max-width:992px){.fast-analysis-report .price-info-row[data-v-693144f6],.fast-analysis-report .scores-row[data-v-693144f6]{grid-template-columns:repeat(2,1fr)}.fast-analysis-report .analysis-details[data-v-693144f6]{grid-template-columns:1fr}}@media (max-width:576px){.fast-analysis-report[data-v-693144f6]{padding:12px}.fast-analysis-report .price-info-row[data-v-693144f6],.fast-analysis-report .scores-row[data-v-693144f6]{grid-template-columns:1fr}.fast-analysis-report .decision-card[data-v-693144f6]{padding:16px}.fast-analysis-report .decision-card .decision-main[data-v-693144f6]{gap:16px;text-align:center}.fast-analysis-report .decision-card .decision-main .decision-badge[data-v-693144f6],.fast-analysis-report .decision-card .decision-main[data-v-693144f6]{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.fast-analysis-report .decision-card .decision-main .decision-badge .decision-text[data-v-693144f6]{font-size:28px}}.fast-analysis-report.theme-dark[data-v-693144f6]{background:linear-gradient(135deg,#1e222d,#131722)}.fast-analysis-report.theme-dark .loading-content .loading-text[data-v-693144f6]{color:#00e5ff}.fast-analysis-report.theme-dark .empty-content .empty-title[data-v-693144f6]{color:#d1d4dc}.fast-analysis-report.theme-dark .decision-card[data-v-693144f6]{background:#2a2e39;border-left-color:#1890ff}.fast-analysis-report.theme-dark .decision-card.decision-buy[data-v-693144f6]{background:linear-gradient(135deg,rgba(82,196,26,.1),#2a2e39)}.fast-analysis-report.theme-dark .decision-card.decision-sell[data-v-693144f6]{background:linear-gradient(135deg,rgba(255,77,79,.1),#2a2e39)}.fast-analysis-report.theme-dark .decision-card.decision-hold[data-v-693144f6]{background:linear-gradient(135deg,rgba(250,173,20,.1),#2a2e39)}.fast-analysis-report.theme-dark .decision-card .decision-summary[data-v-693144f6]{color:#868993;border-top-color:#363c4e}.fast-analysis-report.theme-dark .decision-card .consensus-strip[data-v-693144f6]{background:rgba(24,144,255,.12);border-color:rgba(24,144,255,.35);color:#d1d4dc}.fast-analysis-report.theme-dark .decision-card .consensus-strip .consensus-strip-title[data-v-693144f6]{color:#69c0ff}.fast-analysis-report.theme-dark .decision-card .consensus-strip .consensus-strip-metrics .cm-item em[data-v-693144f6]{color:#868993}.fast-analysis-report.theme-dark .detailed-analysis .analysis-card[data-v-693144f6]{background:linear-gradient(135deg,#2a2e39,#1e222d)}.fast-analysis-report.theme-dark .detailed-analysis .analysis-card.technical[data-v-693144f6]{border-left-color:#1890ff}.fast-analysis-report.theme-dark .detailed-analysis .analysis-card.fundamental[data-v-693144f6]{border-left-color:#722ed1}.fast-analysis-report.theme-dark .detailed-analysis .analysis-card.sentiment[data-v-693144f6]{border-left-color:#eb2f96}.fast-analysis-report.theme-dark .detailed-analysis .analysis-card .analysis-card-header[data-v-693144f6]{color:#d1d4dc}.fast-analysis-report.theme-dark .detailed-analysis .analysis-card .analysis-card-content[data-v-693144f6]{color:#868993}.fast-analysis-report.theme-dark .detail-section[data-v-693144f6],.fast-analysis-report.theme-dark .feedback-section[data-v-693144f6],.fast-analysis-report.theme-dark .indicators-section[data-v-693144f6],.fast-analysis-report.theme-dark .price-card[data-v-693144f6],.fast-analysis-report.theme-dark .score-item[data-v-693144f6]{background:#2a2e39;color:#d1d4dc}.fast-analysis-report.theme-dark .detail-section .analysis-meta[data-v-693144f6],.fast-analysis-report.theme-dark .detail-section .feedback-question[data-v-693144f6],.fast-analysis-report.theme-dark .detail-section .indicator-name[data-v-693144f6],.fast-analysis-report.theme-dark .detail-section .indicator-signal[data-v-693144f6],.fast-analysis-report.theme-dark .detail-section .price-label[data-v-693144f6],.fast-analysis-report.theme-dark .detail-section .score-header[data-v-693144f6],.fast-analysis-report.theme-dark .detail-section .section-title[data-v-693144f6],.fast-analysis-report.theme-dark .feedback-section .analysis-meta[data-v-693144f6],.fast-analysis-report.theme-dark .feedback-section .feedback-question[data-v-693144f6],.fast-analysis-report.theme-dark .feedback-section .indicator-name[data-v-693144f6],.fast-analysis-report.theme-dark .feedback-section .indicator-signal[data-v-693144f6],.fast-analysis-report.theme-dark .feedback-section .price-label[data-v-693144f6],.fast-analysis-report.theme-dark .feedback-section .score-header[data-v-693144f6],.fast-analysis-report.theme-dark .feedback-section .section-title[data-v-693144f6],.fast-analysis-report.theme-dark .indicators-section .analysis-meta[data-v-693144f6],.fast-analysis-report.theme-dark .indicators-section .feedback-question[data-v-693144f6],.fast-analysis-report.theme-dark .indicators-section .indicator-name[data-v-693144f6],.fast-analysis-report.theme-dark .indicators-section .indicator-signal[data-v-693144f6],.fast-analysis-report.theme-dark .indicators-section .price-label[data-v-693144f6],.fast-analysis-report.theme-dark .indicators-section .score-header[data-v-693144f6],.fast-analysis-report.theme-dark .indicators-section .section-title[data-v-693144f6],.fast-analysis-report.theme-dark .price-card .analysis-meta[data-v-693144f6],.fast-analysis-report.theme-dark .price-card .feedback-question[data-v-693144f6],.fast-analysis-report.theme-dark .price-card .indicator-name[data-v-693144f6],.fast-analysis-report.theme-dark .price-card .indicator-signal[data-v-693144f6],.fast-analysis-report.theme-dark .price-card .price-label[data-v-693144f6],.fast-analysis-report.theme-dark .price-card .score-header[data-v-693144f6],.fast-analysis-report.theme-dark .price-card .section-title[data-v-693144f6],.fast-analysis-report.theme-dark .score-item .analysis-meta[data-v-693144f6],.fast-analysis-report.theme-dark .score-item .feedback-question[data-v-693144f6],.fast-analysis-report.theme-dark .score-item .indicator-name[data-v-693144f6],.fast-analysis-report.theme-dark .score-item .indicator-signal[data-v-693144f6],.fast-analysis-report.theme-dark .score-item .price-label[data-v-693144f6],.fast-analysis-report.theme-dark .score-item .score-header[data-v-693144f6],.fast-analysis-report.theme-dark .score-item .section-title[data-v-693144f6]{color:#868993}.fast-analysis-report.theme-dark .detail-section .indicator-value[data-v-693144f6],.fast-analysis-report.theme-dark .detail-section .price-value[data-v-693144f6],.fast-analysis-report.theme-dark .detail-section .score-value[data-v-693144f6],.fast-analysis-report.theme-dark .feedback-section .indicator-value[data-v-693144f6],.fast-analysis-report.theme-dark .feedback-section .price-value[data-v-693144f6],.fast-analysis-report.theme-dark .feedback-section .score-value[data-v-693144f6],.fast-analysis-report.theme-dark .indicators-section .indicator-value[data-v-693144f6],.fast-analysis-report.theme-dark .indicators-section .price-value[data-v-693144f6],.fast-analysis-report.theme-dark .indicators-section .score-value[data-v-693144f6],.fast-analysis-report.theme-dark .price-card .indicator-value[data-v-693144f6],.fast-analysis-report.theme-dark .price-card .price-value[data-v-693144f6],.fast-analysis-report.theme-dark .price-card .score-value[data-v-693144f6],.fast-analysis-report.theme-dark .score-item .indicator-value[data-v-693144f6],.fast-analysis-report.theme-dark .score-item .price-value[data-v-693144f6],.fast-analysis-report.theme-dark .score-item .score-value[data-v-693144f6]{color:#d1d4dc}.fast-analysis-report.theme-dark .score-item.overall[data-v-693144f6]{background:linear-gradient(135deg,rgba(24,144,255,.1),#2a2e39);border-color:#1890ff}.fast-analysis-report.theme-dark .detail-list li[data-v-693144f6]{color:#868993;border-bottom-color:#363c4e}.fast-analysis-report.theme-dark .indicators-grid .indicator-item[data-v-693144f6]{background:#363c4e}.ai-analysis-container[data-v-41eda137]{display:-webkit-box;display:-ms-flexbox;display:flex;height:calc(100vh - 120px);background:#f0f2f5;overflow:hidden;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.ai-analysis-container.embedded[data-v-41eda137]{height:auto;min-height:700px;background:transparent}.ai-analysis-container.embedded .main-content-full[data-v-41eda137]{-webkit-box-shadow:none;box-shadow:none;border-radius:0}.main-content-full[data-v-41eda137]{-webkit-box-flex:1;-ms-flex:1;flex:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;overflow:hidden;background:#fff;border-radius:12px;height:100%;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.08);box-shadow:0 2px 8px rgba(0,0,0,.08);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.top-index-bar[data-v-41eda137]{gap:8px;padding:8px 16px;background:#f8fafc;border-bottom:1px solid #e2e8f0;font-family:SF Mono,Monaco,Consolas,monospace}.top-index-bar .indicator-box[data-v-41eda137],.top-index-bar[data-v-41eda137]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.top-index-bar .indicator-box[data-v-41eda137]{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding:4px 10px;background:#fff;border-radius:6px;border:1px solid #e2e8f0;min-width:50px}.top-index-bar .indicator-box .ind-label[data-v-41eda137]{font-size:9px;color:#94a3b8;text-transform:uppercase}.top-index-bar .indicator-box .ind-value[data-v-41eda137]{font-size:13px;font-weight:700;color:#1e293b}.top-index-bar .indicator-box.fear-greed.extreme-fear .ind-value[data-v-41eda137]{color:#dc2626}.top-index-bar .indicator-box.fear-greed.fear .ind-value[data-v-41eda137]{color:#ea580c}.top-index-bar .indicator-box.fear-greed.neutral .ind-value[data-v-41eda137]{color:#ca8a04}.top-index-bar .indicator-box.fear-greed.greed .ind-value[data-v-41eda137]{color:#65a30d}.top-index-bar .indicator-box.fear-greed.extreme-greed .ind-value[data-v-41eda137],.top-index-bar .indicator-box.vix.low .ind-value[data-v-41eda137]{color:#16a34a}.top-index-bar .indicator-box.vix.medium .ind-value[data-v-41eda137]{color:#ca8a04}.top-index-bar .indicator-box.vix.high .ind-value[data-v-41eda137]{color:#dc2626}.top-index-bar .indicator-box.dxy .ind-value[data-v-41eda137]{color:#2563eb}.top-index-bar .indices-marquee[data-v-41eda137]{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:hidden;min-width:0}.top-index-bar .indices-marquee .marquee-track[data-v-41eda137]{display:-webkit-box;display:-ms-flexbox;display:flex;gap:8px;-webkit-animation:marquee-41eda137 35s linear infinite;animation:marquee-41eda137 35s linear infinite;width:-webkit-max-content;width:-moz-max-content;width:max-content}.top-index-bar .indices-marquee .marquee-track[data-v-41eda137]:hover{-webkit-animation-play-state:paused;animation-play-state:paused}.top-index-bar .indices-marquee .index-item[data-v-41eda137]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:4px;padding:4px 8px;background:#fff;border-radius:4px;border:1px solid #e2e8f0;font-size:11px;white-space:nowrap}.top-index-bar .indices-marquee .index-item .idx-flag[data-v-41eda137]{font-size:11px}.top-index-bar .indices-marquee .index-item .idx-symbol[data-v-41eda137]{color:#64748b;font-weight:500}.top-index-bar .indices-marquee .index-item .idx-price[data-v-41eda137]{color:#1e293b;font-weight:600}.top-index-bar .indices-marquee .index-item .idx-change[data-v-41eda137]{font-weight:600;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:1px}.top-index-bar .indices-marquee .index-item .idx-change.up[data-v-41eda137]{color:#16a34a}.top-index-bar .indices-marquee .index-item .idx-change.down[data-v-41eda137]{color:#dc2626}@-webkit-keyframes marquee-41eda137{0%{-webkit-transform:translateX(0);transform:translateX(0)}to{-webkit-transform:translateX(-50%);transform:translateX(-50%)}}@keyframes marquee-41eda137{0%{-webkit-transform:translateX(0);transform:translateX(0)}to{-webkit-transform:translateX(-50%);transform:translateX(-50%)}}.top-index-bar .refresh-btn[data-v-41eda137]{color:#94a3b8;-ms-flex-negative:0;flex-shrink:0}.top-index-bar .refresh-btn[data-v-41eda137]:hover{color:#1e293b}.main-body[data-v-41eda137]{-webkit-box-flex:1;-ms-flex:1;flex:1;padding:12px;overflow:hidden;min-height:0}.left-panel[data-v-41eda137],.main-body[data-v-41eda137]{display:-webkit-box;display:-ms-flexbox;display:flex;gap:12px}.left-panel[data-v-41eda137]{width:280px;-ms-flex-negative:0;flex-shrink:0;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;overflow-y:auto}.left-panel .heatmap-box[data-v-41eda137]{background:#fff;border-radius:8px;padding:12px;border:1px solid #e2e8f0}.left-panel .heatmap-box .box-header[data-v-41eda137]{margin-bottom:10px}.left-panel .heatmap-box .box-header[data-v-41eda137] .ant-radio-group .ant-radio-button-wrapper{font-size:10px;padding:0 6px;height:22px;line-height:20px}.left-panel .heatmap-box .box-header[data-v-41eda137] .ant-radio-group .ant-radio-button-wrapper.ant-radio-button-wrapper-checked{background:var(--primary-color,#1890ff);border-color:var(--primary-color,#1890ff);color:#fff}.left-panel .heatmap-box .heatmap-grid[data-v-41eda137]{display:grid;grid-template-columns:repeat(3,1fr);gap:4px}.left-panel .heatmap-box .heatmap-grid .heat-cell[data-v-41eda137]{padding:6px 4px;border-radius:4px;text-align:center;font-size:9px}.left-panel .heatmap-box .heatmap-grid .heat-cell .heat-name[data-v-41eda137]{display:block;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-bottom:1px}.left-panel .heatmap-box .heatmap-grid .heat-cell .heat-price[data-v-41eda137]{display:block;font-size:9px;opacity:.8;margin-bottom:1px}.left-panel .heatmap-box .heatmap-grid .heat-cell .heat-val[data-v-41eda137]{font-weight:700;font-size:10px}.left-panel .calendar-box[data-v-41eda137]{-webkit-box-flex:1;-ms-flex:1;flex:1;background:#fff;border-radius:8px;padding:12px;border:1px solid #e2e8f0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;min-height:0;overflow:hidden}.left-panel .calendar-box .box-header[data-v-41eda137]{margin-bottom:8px}.left-panel .calendar-box .box-header .box-title[data-v-41eda137]{font-size:12px;color:#64748b;font-weight:600}.left-panel .calendar-box .box-header .box-title .anticon[data-v-41eda137]{margin-right:6px;color:var(--primary-color,#1890ff)}.left-panel .calendar-box .calendar-list[data-v-41eda137]{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow-y:auto}.left-panel .calendar-box .calendar-list[data-v-41eda137]::-webkit-scrollbar{width:4px}.left-panel .calendar-box .calendar-list[data-v-41eda137]::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:2px}.left-panel .calendar-box .calendar-list .cal-item[data-v-41eda137]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:6px;padding:6px 0;border-bottom:1px solid #f1f5f9;font-size:10px}.left-panel .calendar-box .calendar-list .cal-item[data-v-41eda137]:last-child{border-bottom:none}.left-panel .calendar-box .calendar-list .cal-item.high[data-v-41eda137]{border-left:3px solid #dc2626;padding-left:8px;margin-left:-4px}.left-panel .calendar-box .calendar-list .cal-item.medium[data-v-41eda137]{border-left:3px solid #ca8a04;padding-left:8px;margin-left:-4px}.left-panel .calendar-box .calendar-list .cal-item.low[data-v-41eda137]{border-left:3px solid #16a34a;padding-left:8px;margin-left:-4px}.left-panel .calendar-box .calendar-list .cal-item .cal-date[data-v-41eda137]{font-size:9px;color:#94a3b8;min-width:32px;font-weight:500}.left-panel .calendar-box .calendar-list .cal-item .cal-time[data-v-41eda137]{color:#64748b;min-width:36px;font-weight:500}.left-panel .calendar-box .calendar-list .cal-item .cal-flag[data-v-41eda137]{font-size:12px}.left-panel .calendar-box .calendar-list .cal-item .cal-name[data-v-41eda137]{-webkit-box-flex:1;-ms-flex:1;flex:1;color:#334155;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.left-panel .calendar-box .calendar-list .cal-item .cal-impact[data-v-41eda137]{font-weight:600;font-size:10px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:2px}.left-panel .calendar-box .calendar-list .cal-item .cal-impact.bullish[data-v-41eda137]{color:#16a34a}.left-panel .calendar-box .calendar-list .cal-item .cal-impact.bearish[data-v-41eda137]{color:#dc2626}.left-panel .calendar-box .calendar-list .cal-item .cal-impact.neutral[data-v-41eda137]{color:#94a3b8}.left-panel .calendar-box .calendar-list .cal-empty[data-v-41eda137]{text-align:center;color:#94a3b8;padding:20px 0;font-size:12px}.right-panel[data-v-41eda137]{-webkit-box-flex:1;-ms-flex:1;flex:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;min-width:0;overflow:hidden;background:#fff;border-radius:8px;border:1px solid #e2e8f0}.right-panel .analysis-toolbar[data-v-41eda137]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:12px;padding:12px 16px;border-bottom:1px solid #f1f5f9;background:#fafafa;border-radius:8px 8px 0 0}.right-panel .analysis-toolbar .symbol-selector[data-v-41eda137]{-webkit-box-flex:1;-ms-flex:1;flex:1;max-width:320px}.right-panel .analysis-toolbar .analyze-button[data-v-41eda137]{background:var(--primary-color,#1890ff);border-color:var(--primary-color,#1890ff)}.right-panel .analysis-toolbar .history-button[data-v-41eda137]{border-color:#d9d9d9}.right-panel .analysis-main[data-v-41eda137]{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:auto;padding:16px;min-height:0}.right-panel .analysis-main .analysis-placeholder[data-v-41eda137]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;height:100%;min-height:300px}.right-panel .analysis-main .analysis-placeholder .placeholder-content[data-v-41eda137]{text-align:center}.right-panel .analysis-main .analysis-placeholder .placeholder-content .placeholder-icon[data-v-41eda137]{font-size:72px;color:var(--primary-color,#1890ff);opacity:.5;margin-bottom:20px}.right-panel .analysis-main .analysis-placeholder .placeholder-content h3[data-v-41eda137]{font-size:18px;color:#1e293b;margin-bottom:8px}.right-panel .analysis-main .analysis-placeholder .placeholder-content p[data-v-41eda137]{font-size:14px;color:#64748b}.watchlist-panel[data-v-41eda137]{width:200px;-ms-flex-negative:0;flex-shrink:0;background:#fff;border-radius:8px;border:1px solid #e2e8f0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;overflow:hidden}.watchlist-panel .panel-header[data-v-41eda137]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:10px 12px;border-bottom:1px solid #f1f5f9;background:#fafafa}.watchlist-panel .panel-header .panel-title[data-v-41eda137]{font-size:12px;font-weight:600;color:#64748b}.watchlist-panel .panel-header .panel-title .anticon[data-v-41eda137]{color:#facc15;margin-right:6px}.watchlist-panel .watchlist-list[data-v-41eda137]{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow-y:auto;padding:8px}.watchlist-panel .watchlist-list[data-v-41eda137]::-webkit-scrollbar{width:4px}.watchlist-panel .watchlist-list[data-v-41eda137]::-webkit-scrollbar-thumb{background:#e2e8f0;border-radius:2px}.watchlist-panel .watchlist-list .watchlist-item[data-v-41eda137]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:8px 10px;border-radius:6px;cursor:pointer;-webkit-transition:all .2s;transition:all .2s;margin-bottom:4px}.watchlist-panel .watchlist-list .watchlist-item[data-v-41eda137]:hover{background:#f8fafc}.watchlist-panel .watchlist-list .watchlist-item.active[data-v-41eda137]{background:#e6f7ff;border:1px solid #91d5ff}.watchlist-panel .watchlist-list .watchlist-item .item-main[data-v-41eda137]{-webkit-box-flex:1;-ms-flex:1;flex:1;min-width:0}.watchlist-panel .watchlist-list .watchlist-item .item-main .item-symbol[data-v-41eda137]{display:block;font-size:12px;font-weight:600;color:#1e293b}.watchlist-panel .watchlist-list .watchlist-item .item-main .item-name[data-v-41eda137]{display:block;font-size:10px;color:#94a3b8;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.watchlist-panel .watchlist-list .watchlist-item .item-price[data-v-41eda137]{text-align:right;margin-right:8px;font-family:SF Mono,Monaco,monospace}.watchlist-panel .watchlist-list .watchlist-item .item-price .price-value[data-v-41eda137]{display:block;font-size:11px;font-weight:600;color:#1e293b}.watchlist-panel .watchlist-list .watchlist-item .item-price .price-change[data-v-41eda137]{display:block;font-size:10px;font-weight:600}.watchlist-panel .watchlist-list .watchlist-item .item-price .price-change.up[data-v-41eda137]{color:#16a34a}.watchlist-panel .watchlist-list .watchlist-item .item-price .price-change.down[data-v-41eda137]{color:#dc2626}.watchlist-panel .watchlist-list .watchlist-item .item-remove[data-v-41eda137]{color:#cbd5e1;font-size:12px;opacity:0;-webkit-transition:opacity .2s;transition:opacity .2s}.watchlist-panel .watchlist-list .watchlist-item .item-remove[data-v-41eda137]:hover{color:#dc2626}.watchlist-panel .watchlist-list .watchlist-item:hover .item-remove[data-v-41eda137]{opacity:1}.watchlist-panel .watchlist-list .watchlist-empty[data-v-41eda137]{text-align:center;padding:24px 12px;color:#94a3b8}.watchlist-panel .watchlist-list .watchlist-empty .anticon[data-v-41eda137]{font-size:32px;margin-bottom:8px;display:block}.watchlist-panel .watchlist-list .watchlist-empty p[data-v-41eda137]{font-size:12px;margin-bottom:12px}@-webkit-keyframes pulse-41eda137{0%,to{opacity:1}50%{opacity:.5}}@keyframes pulse-41eda137{0%,to{opacity:1}50%{opacity:.5}}@media (max-width:992px){.ai-analysis-container[data-v-41eda137]{height:auto;min-height:calc(100vh - 64px);overflow-y:auto}.main-content-full[data-v-41eda137]{height:auto;min-height:auto}.top-index-bar[data-v-41eda137]{-ms-flex-wrap:wrap;flex-wrap:wrap;padding:8px}.top-index-bar .indicator-box[data-v-41eda137]{min-width:45px;padding:3px 6px}.top-index-bar .indices-marquee[data-v-41eda137]{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10;width:100%;margin-top:8px}.main-body[data-v-41eda137]{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding:12px}.left-panel[data-v-41eda137]{width:100%;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;gap:12px}.left-panel .calendar-box[data-v-41eda137],.left-panel .heatmap-box[data-v-41eda137]{-webkit-box-flex:1;-ms-flex:1;flex:1;min-width:0}.left-panel .calendar-box[data-v-41eda137]{max-height:200px}.right-panel .analysis-toolbar[data-v-41eda137]{-ms-flex-wrap:wrap;flex-wrap:wrap}.right-panel .analysis-toolbar .symbol-selector[data-v-41eda137]{width:100%!important;max-width:none!important}.right-panel .analysis-toolbar .analyze-button[data-v-41eda137],.right-panel .analysis-toolbar .history-button[data-v-41eda137]{-webkit-box-flex:1;-ms-flex:1;flex:1}.watchlist-panel[data-v-41eda137]{width:100%;max-height:200px;-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}}.ai-analysis-container.theme-dark[data-v-41eda137]{background:#131722;color:#d1d4dc}.ai-analysis-container.theme-dark .main-content-full[data-v-41eda137]{background:#1e222d;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.3);box-shadow:0 2px 8px rgba(0,0,0,.3)}.ai-analysis-container.theme-dark .top-index-bar[data-v-41eda137]{background:#1e222d;border-bottom-color:#363c4e}.ai-analysis-container.theme-dark .top-index-bar .indicator-box[data-v-41eda137]{background:#2a2e39;border-color:#363c4e}.ai-analysis-container.theme-dark .top-index-bar .indicator-box .ind-label[data-v-41eda137]{color:#868993}.ai-analysis-container.theme-dark .top-index-bar .indicator-box .ind-value[data-v-41eda137]{color:#d1d4dc}.ai-analysis-container.theme-dark .top-index-bar .indices-marquee .index-item[data-v-41eda137]{background:#2a2e39;border-color:#363c4e}.ai-analysis-container.theme-dark .top-index-bar .indices-marquee .index-item .idx-symbol[data-v-41eda137]{color:#868993}.ai-analysis-container.theme-dark .top-index-bar .indices-marquee .index-item .idx-price[data-v-41eda137]{color:#d1d4dc}.ai-analysis-container.theme-dark .top-index-bar .refresh-btn[data-v-41eda137]{color:#868993}.ai-analysis-container.theme-dark .top-index-bar .refresh-btn[data-v-41eda137]:hover{color:#d1d4dc}.ai-analysis-container.theme-dark .watchlist-panel[data-v-41eda137]{background:#2a2e39;border-color:#363c4e}.ai-analysis-container.theme-dark .watchlist-panel .panel-header[data-v-41eda137]{background:#1e222d;border-bottom-color:#363c4e}.ai-analysis-container.theme-dark .watchlist-panel .panel-header .panel-title[data-v-41eda137]{color:#868993}.ai-analysis-container.theme-dark .watchlist-panel .watchlist-list .watchlist-item[data-v-41eda137]:hover{background:#363c4e}.ai-analysis-container.theme-dark .watchlist-panel .watchlist-list .watchlist-item.active[data-v-41eda137]{background:rgba(24,144,255,.1);border-color:#1890ff}.ai-analysis-container.theme-dark .watchlist-panel .watchlist-list .watchlist-item .item-main .item-symbol[data-v-41eda137]{color:#d1d4dc}.ai-analysis-container.theme-dark .watchlist-panel .watchlist-list .watchlist-item .item-main .item-name[data-v-41eda137]{color:#64748b}.ai-analysis-container.theme-dark .watchlist-panel .watchlist-list .watchlist-item .item-price .price-value[data-v-41eda137]{color:#d1d4dc}.ai-analysis-container.theme-dark .watchlist-panel .watchlist-list .watchlist-empty[data-v-41eda137]{color:#64748b}.ai-analysis-container.theme-dark .watchlist-bar-legacy[data-v-41eda137]{background:#1e222d;border-bottom-color:#363c4e}.ai-analysis-container.theme-dark .watchlist-bar-legacy .stock-chip[data-v-41eda137]{background:#2a2e39;border-color:#363c4e}.ai-analysis-container.theme-dark .watchlist-bar-legacy .stock-chip.active[data-v-41eda137],.ai-analysis-container.theme-dark .watchlist-bar-legacy .stock-chip[data-v-41eda137]:hover{border-color:var(--primary-color,#1890ff);background:rgba(24,144,255,.1)}.ai-analysis-container.theme-dark .watchlist-bar-legacy .stock-chip .chip-symbol[data-v-41eda137]{color:#d1d4dc}.ai-analysis-container.theme-dark .watchlist-bar-legacy .stock-chip .chip-price[data-v-41eda137]{color:#868993}.ai-analysis-container.theme-dark .left-panel .heatmap-box[data-v-41eda137]{background:#2a2e39;border-color:#363c4e}.ai-analysis-container.theme-dark .left-panel .heatmap-box[data-v-41eda137] .ant-radio-group .ant-radio-button-wrapper{background:#1e222d;border-color:#363c4e;color:#868993}.ai-analysis-container.theme-dark .left-panel .heatmap-box[data-v-41eda137] .ant-radio-group .ant-radio-button-wrapper:hover{color:#d1d4dc}.ai-analysis-container.theme-dark .left-panel .calendar-box[data-v-41eda137]{background:#2a2e39;border-color:#363c4e}.ai-analysis-container.theme-dark .left-panel .calendar-box .box-title[data-v-41eda137]{color:#868993}.ai-analysis-container.theme-dark .left-panel .calendar-box .cal-item[data-v-41eda137]{border-bottom-color:#363c4e}.ai-analysis-container.theme-dark .left-panel .calendar-box .cal-item .cal-date[data-v-41eda137]{color:#64748b}.ai-analysis-container.theme-dark .left-panel .calendar-box .cal-item .cal-time[data-v-41eda137]{color:#868993}.ai-analysis-container.theme-dark .left-panel .calendar-box .cal-item .cal-name[data-v-41eda137]{color:#d1d4dc}.ai-analysis-container.theme-dark .left-panel .calendar-box .cal-empty[data-v-41eda137]{color:#64748b}.ai-analysis-container.theme-dark .right-panel[data-v-41eda137]{background:#2a2e39;border-color:#363c4e}.ai-analysis-container.theme-dark .right-panel .analysis-toolbar[data-v-41eda137]{background:#1e222d;border-bottom-color:#363c4e}.ai-analysis-container.theme-dark .right-panel .analysis-toolbar .history-button[data-v-41eda137]{background:#2a2e39;border-color:#363c4e;color:#d1d4dc}.ai-analysis-container.theme-dark .right-panel .analysis-main .analysis-placeholder .placeholder-content h3[data-v-41eda137]{color:#d1d4dc}.ai-analysis-container.theme-dark .right-panel .analysis-main .analysis-placeholder .placeholder-content p[data-v-41eda137]{color:#868993}.ai-analysis-container.theme-dark .watchlist-bar-compat[data-v-41eda137]{background:#1e222d;border-top-color:#363c4e}.ai-analysis-container.theme-dark .watchlist-bar-compat .bar-label[data-v-41eda137]{color:#868993}.ai-analysis-container.theme-dark .watchlist-bar-compat .stock-chip[data-v-41eda137]{background:#2a2e39;border-color:#363c4e}.ai-analysis-container.theme-dark .watchlist-bar-compat .stock-chip.active[data-v-41eda137],.ai-analysis-container.theme-dark .watchlist-bar-compat .stock-chip[data-v-41eda137]:hover{border-color:var(--primary-color,#1890ff);background:rgba(24,144,255,.1)}.ai-analysis-container.theme-dark .watchlist-bar-compat .stock-chip .chip-symbol[data-v-41eda137]{color:#d1d4dc}.ai-analysis-container.theme-dark .watchlist-bar-compat .stock-chip .chip-price[data-v-41eda137]{color:#868993}.ai-analysis-container.theme-dark .watchlist-bar-compat .stock-chip .chip-remove[data-v-41eda137]{color:#64748b}.ai-analysis-container.theme-dark[data-v-41eda137] .symbol-selector .ant-select-selection{background-color:#2a2e39;border-color:#363c4e;color:#d1d4dc}.add-stock-modal-content .market-tabs[data-v-41eda137]{margin-bottom:16px}.add-stock-modal-content .hot-symbols-section[data-v-41eda137],.add-stock-modal-content .search-results-section[data-v-41eda137],.add-stock-modal-content .symbol-search-section[data-v-41eda137]{margin-bottom:24px}.add-stock-modal-content .hot-symbols-section .section-title[data-v-41eda137],.add-stock-modal-content .search-results-section .section-title[data-v-41eda137]{font-size:14px;font-weight:600;color:#262626;margin-bottom:12px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.add-stock-modal-content .symbol-list[data-v-41eda137]{max-height:200px;overflow-y:auto;border:1px solid #e8e8e8;border-radius:4px}.add-stock-modal-content .symbol-list .symbol-list-item[data-v-41eda137]{cursor:pointer;padding:8px 12px;-webkit-transition:background-color .3s;transition:background-color .3s}.add-stock-modal-content .symbol-list .symbol-list-item[data-v-41eda137]:hover{background-color:#f5f5f5}.add-stock-modal-content .symbol-list .symbol-list-item .symbol-item-content[data-v-41eda137]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:8px}.add-stock-modal-content .symbol-list .symbol-list-item .symbol-item-content .symbol-code[data-v-41eda137]{font-weight:600;color:#262626;min-width:80px}.add-stock-modal-content .symbol-list .symbol-list-item .symbol-item-content .symbol-name[data-v-41eda137]{color:#595959;-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.add-stock-modal-content .selected-symbol-section[data-v-41eda137]{margin-top:16px}.add-stock-modal-content .selected-symbol-section .selected-symbol-info[data-v-41eda137]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.skeleton-box .skeleton-text[data-v-41eda137]{display:block;height:12px;background:-webkit-gradient(linear,left top,right top,color-stop(25%,#e2e8f0),color-stop(50%,#f1f5f9),color-stop(75%,#e2e8f0));background:linear-gradient(90deg,#e2e8f0 25%,#f1f5f9 50%,#e2e8f0 75%);background-size:200% 100%;-webkit-animation:skeleton-pulse-41eda137 1.5s ease-in-out infinite;animation:skeleton-pulse-41eda137 1.5s ease-in-out infinite;border-radius:4px;margin:3px 0}.skeleton-box .skeleton-text.short[data-v-41eda137]{width:40px;height:9px}.skeleton-cell[data-v-41eda137]{background:#f8fafc!important;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding:8px 4px}.skeleton-cell .skeleton-text[data-v-41eda137]{width:80%;height:10px;background:-webkit-gradient(linear,left top,right top,color-stop(25%,#e2e8f0),color-stop(50%,#f1f5f9),color-stop(75%,#e2e8f0));background:linear-gradient(90deg,#e2e8f0 25%,#f1f5f9 50%,#e2e8f0 75%);background-size:200% 100%;-webkit-animation:skeleton-pulse-41eda137 1.5s ease-in-out infinite;animation:skeleton-pulse-41eda137 1.5s ease-in-out infinite;border-radius:3px;margin:2px 0}.skeleton-cell .skeleton-text.short[data-v-41eda137]{width:50%;height:8px}.skeleton-item[data-v-41eda137]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:8px;padding:6px 0}.skeleton-item .skeleton-text[data-v-41eda137]{height:12px;background:-webkit-gradient(linear,left top,right top,color-stop(25%,#e2e8f0),color-stop(50%,#f1f5f9),color-stop(75%,#e2e8f0));background:linear-gradient(90deg,#e2e8f0 25%,#f1f5f9 50%,#e2e8f0 75%);background-size:200% 100%;-webkit-animation:skeleton-pulse-41eda137 1.5s ease-in-out infinite;animation:skeleton-pulse-41eda137 1.5s ease-in-out infinite;border-radius:4px;-webkit-box-flex:1;-ms-flex:1;flex:1}.skeleton-item .skeleton-text.short[data-v-41eda137]{-webkit-box-flex:0;-ms-flex:none;flex:none;width:40px}.indices-empty[data-v-41eda137],.indices-loading[data-v-41eda137]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;height:100%;font-size:11px;color:#94a3b8;padding:4px 16px}.indices-loading .anticon[data-v-41eda137]{margin-right:6px}.heatmap-empty[data-v-41eda137]{grid-column:-1;text-align:center;padding:20px;color:#94a3b8;font-size:12px}@-webkit-keyframes skeleton-pulse-41eda137{0%{background-position:200% 0}to{background-position:-200% 0}}@keyframes skeleton-pulse-41eda137{0%{background-position:200% 0}to{background-position:-200% 0}}.theme-dark .skeleton-box .skeleton-text[data-v-41eda137],.theme-dark .skeleton-cell .skeleton-text[data-v-41eda137],.theme-dark .skeleton-item .skeleton-text[data-v-41eda137]{background:-webkit-gradient(linear,left top,right top,color-stop(25%,#363c4e),color-stop(50%,#424857),color-stop(75%,#363c4e));background:linear-gradient(90deg,#363c4e 25%,#424857 50%,#363c4e 75%);background-size:200% 100%}.theme-dark .skeleton-cell[data-v-41eda137]{background:#2a2e39!important}.theme-dark .heatmap-empty[data-v-41eda137],.theme-dark .indices-empty[data-v-41eda137],.theme-dark .indices-loading[data-v-41eda137]{color:#64748b} \ No newline at end of file diff --git a/frontend/dist/css/576.37fb7134.css b/frontend/dist/css/576.37fb7134.css new file mode 100644 index 0000000..91cfae0 --- /dev/null +++ b/frontend/dist/css/576.37fb7134.css @@ -0,0 +1 @@ +.fast-analysis-report[data-v-693144f6]{height:100%;overflow-y:auto;padding:20px;background:linear-gradient(135deg,#f5f7fa,#e4e8ec);border-radius:12px}.fast-analysis-report .loading-container[data-v-693144f6]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;min-height:400px;background:#fff;border-radius:12px}.fast-analysis-report .loading-container .loading-content-pro[data-v-693144f6]{width:100%;max-width:400px;padding:40px}.fast-analysis-report .loading-container .loading-content-pro .loading-header[data-v-693144f6]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;gap:12px;margin-bottom:32px}.fast-analysis-report .loading-container .loading-content-pro .loading-header .loading-icon-pro[data-v-693144f6]{font-size:28px;color:#1890ff}.fast-analysis-report .loading-container .loading-content-pro .loading-header .loading-title[data-v-693144f6]{font-size:20px;font-weight:600;color:#1e293b}.fast-analysis-report .loading-container .loading-content-pro .progress-wrapper[data-v-693144f6]{margin-bottom:24px;position:relative}.fast-analysis-report .loading-container .loading-content-pro .progress-wrapper .progress-text[data-v-693144f6]{position:absolute;right:0;top:-24px;font-size:14px;font-weight:600;color:#1890ff}.fast-analysis-report .loading-container .loading-content-pro .current-step[data-v-693144f6]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;gap:8px;padding:12px 20px;background:#f0f5ff;border-radius:8px;margin-bottom:24px;color:#1890ff;font-size:14px;font-weight:500}.fast-analysis-report .loading-container .loading-content-pro .current-step .anticon[data-v-693144f6]{font-size:16px}.fast-analysis-report .loading-container .loading-content-pro .steps-list[data-v-693144f6]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;gap:12px}.fast-analysis-report .loading-container .loading-content-pro .steps-list .step-item[data-v-693144f6]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:12px;padding:10px 16px;background:#f8fafc;border-radius:8px;font-size:13px;color:#94a3b8;-webkit-transition:all .3s;transition:all .3s}.fast-analysis-report .loading-container .loading-content-pro .steps-list .step-item .step-dot[data-v-693144f6]{width:8px;height:8px;border-radius:50%;background:#e2e8f0;-webkit-transition:all .3s;transition:all .3s}.fast-analysis-report .loading-container .loading-content-pro .steps-list .step-item .step-text[data-v-693144f6]{-webkit-box-flex:1;-ms-flex:1;flex:1}.fast-analysis-report .loading-container .loading-content-pro .steps-list .step-item .step-check[data-v-693144f6]{color:#52c41a;font-size:14px}.fast-analysis-report .loading-container .loading-content-pro .steps-list .step-item.active[data-v-693144f6]{background:#e6f7ff;color:#1890ff;font-weight:500}.fast-analysis-report .loading-container .loading-content-pro .steps-list .step-item.active .step-dot[data-v-693144f6]{background:#1890ff;-webkit-box-shadow:0 0 0 3px rgba(24,144,255,.2);box-shadow:0 0 0 3px rgba(24,144,255,.2)}.fast-analysis-report .loading-container .loading-content-pro .steps-list .step-item.done[data-v-693144f6]{background:#f6ffed;color:#52c41a}.fast-analysis-report .loading-container .loading-content-pro .steps-list .step-item.done .step-dot[data-v-693144f6]{background:#52c41a}.fast-analysis-report .loading-container .loading-content-pro .loading-footer[data-v-693144f6]{margin-top:24px;text-align:center}.fast-analysis-report .loading-container .loading-content-pro .loading-footer .elapsed-time[data-v-693144f6]{font-size:13px;color:#94a3b8;font-family:SF Mono,Monaco,monospace}.fast-analysis-report .empty-container[data-v-693144f6]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;min-height:400px}.fast-analysis-report .empty-container .empty-content[data-v-693144f6]{text-align:center}.fast-analysis-report .empty-container .empty-content .empty-icon[data-v-693144f6]{font-size:64px;color:#d9d9d9}.fast-analysis-report .empty-container .empty-content .empty-title[data-v-693144f6]{margin-top:16px;font-size:18px;font-weight:600;color:#262626}.fast-analysis-report .empty-container .empty-content .empty-hint[data-v-693144f6]{margin-top:8px;color:#8c8c8c}.fast-analysis-report .result-container .decision-card[data-v-693144f6]{background:#fff;border-radius:16px;padding:24px;margin-bottom:20px;-webkit-box-shadow:0 4px 12px rgba(0,0,0,.08);box-shadow:0 4px 12px rgba(0,0,0,.08);border-left:6px solid #1890ff}.fast-analysis-report .result-container .decision-card.decision-buy[data-v-693144f6]{border-left-color:#52c41a;background:linear-gradient(135deg,#f6ffed,#fff)}.fast-analysis-report .result-container .decision-card.decision-sell[data-v-693144f6]{border-left-color:#ff4d4f;background:linear-gradient(135deg,#fff2f0,#fff)}.fast-analysis-report .result-container .decision-card.decision-hold[data-v-693144f6]{border-left-color:#faad14;background:linear-gradient(135deg,#fffbe6,#fff)}.fast-analysis-report .result-container .decision-card .decision-main[data-v-693144f6]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:16px}.fast-analysis-report .result-container .decision-card .decision-main .decision-badge[data-v-693144f6]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:12px}.fast-analysis-report .result-container .decision-card .decision-main .decision-badge .anticon[data-v-693144f6]{font-size:32px}.fast-analysis-report .result-container .decision-card .decision-main .decision-badge .decision-text[data-v-693144f6]{font-size:36px;font-weight:800;letter-spacing:2px}.fast-analysis-report .result-container .decision-card .decision-main .confidence-ring[data-v-693144f6]{text-align:center}.fast-analysis-report .result-container .decision-card .decision-main .confidence-ring .confidence-value[data-v-693144f6]{font-size:18px;font-weight:700}.fast-analysis-report .result-container .decision-card .decision-main .confidence-ring .confidence-label[data-v-693144f6]{font-size:12px;color:#8c8c8c;margin-top:4px}.fast-analysis-report .result-container .decision-card .decision-summary[data-v-693144f6]{font-size:16px;line-height:1.6;color:#595959;padding-top:16px;border-top:1px dashed #e8e8e8}.fast-analysis-report .result-container .decision-card .consensus-strip[data-v-693144f6]{margin-top:14px;padding:12px 14px;border-radius:8px;background:rgba(24,144,255,.06);border:1px solid rgba(24,144,255,.2);font-size:13px;color:#434343}.fast-analysis-report .result-container .decision-card .consensus-strip .consensus-strip-title[data-v-693144f6]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:8px;font-weight:600;margin-bottom:8px;color:#1890ff}.fast-analysis-report .result-container .decision-card .consensus-strip .consensus-strip-metrics[data-v-693144f6]{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;gap:12px 20px}.fast-analysis-report .result-container .decision-card .consensus-strip .consensus-strip-metrics .cm-item em[data-v-693144f6]{font-style:normal;color:#8c8c8c;margin-right:6px}.fast-analysis-report .result-container .price-info-row[data-v-693144f6]{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin-bottom:20px}.fast-analysis-report .result-container .price-info-row .price-card[data-v-693144f6]{background:#fff;border-radius:12px;padding:16px;text-align:center;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.06);box-shadow:0 2px 8px rgba(0,0,0,.06)}.fast-analysis-report .result-container .price-info-row .price-card .price-label[data-v-693144f6]{font-size:12px;color:#8c8c8c;margin-bottom:8px}.fast-analysis-report .result-container .price-info-row .price-card .price-value[data-v-693144f6]{font-size:18px;font-weight:700;color:#262626}.fast-analysis-report .result-container .price-info-row .price-card .price-value.positive[data-v-693144f6]{color:#52c41a}.fast-analysis-report .result-container .price-info-row .price-card .price-value.negative[data-v-693144f6]{color:#ff4d4f}.fast-analysis-report .result-container .price-info-row .price-card .price-hint[data-v-693144f6]{font-size:10px;color:#bfbfbf;margin-top:6px;cursor:help}.fast-analysis-report .result-container .price-info-row .price-card .price-hint .anticon[data-v-693144f6]{margin-right:2px}.fast-analysis-report .result-container .price-info-row .price-card .price-change[data-v-693144f6]{font-size:14px;margin-top:4px;font-weight:600}.fast-analysis-report .result-container .price-info-row .price-card .price-change.positive[data-v-693144f6]{color:#52c41a}.fast-analysis-report .result-container .price-info-row .price-card .price-change.negative[data-v-693144f6]{color:#ff4d4f}.fast-analysis-report .result-container .price-info-row .price-card.current[data-v-693144f6]{border-top:3px solid #1890ff}.fast-analysis-report .result-container .price-info-row .price-card.entry[data-v-693144f6]{border-top:3px solid #722ed1}.fast-analysis-report .result-container .price-info-row .price-card.stop[data-v-693144f6]{border-top:3px solid #ff4d4f}.fast-analysis-report .result-container .price-info-row .price-card.target[data-v-693144f6]{border-top:3px solid #52c41a}.fast-analysis-report .result-container .scores-row[data-v-693144f6]{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin-bottom:20px}.fast-analysis-report .result-container .scores-row .score-item[data-v-693144f6]{background:#fff;border-radius:12px;padding:16px;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.06);box-shadow:0 2px 8px rgba(0,0,0,.06)}.fast-analysis-report .result-container .scores-row .score-item .score-header[data-v-693144f6]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:8px;font-size:14px;color:#595959;margin-bottom:12px}.fast-analysis-report .result-container .scores-row .score-item .score-header .anticon[data-v-693144f6]{color:#1890ff}.fast-analysis-report .result-container .scores-row .score-item .score-value[data-v-693144f6]{text-align:right;font-size:20px;font-weight:700;color:#262626;margin-top:8px}.fast-analysis-report .result-container .scores-row .score-item.overall[data-v-693144f6]{background:linear-gradient(135deg,#e6f7ff,#fff);border:1px solid #91d5ff}.fast-analysis-report .result-container .detailed-analysis[data-v-693144f6]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;gap:16px;margin-bottom:20px}.fast-analysis-report .result-container .detailed-analysis .analysis-card[data-v-693144f6]{background:linear-gradient(135deg,#fff,#fafafa);border-radius:12px;padding:20px;-webkit-box-shadow:0 2px 12px rgba(0,0,0,.06);box-shadow:0 2px 12px rgba(0,0,0,.06);border-left:4px solid #1890ff}.fast-analysis-report .result-container .detailed-analysis .analysis-card.technical[data-v-693144f6]{border-left-color:#1890ff}.fast-analysis-report .result-container .detailed-analysis .analysis-card.fundamental[data-v-693144f6]{border-left-color:#722ed1}.fast-analysis-report .result-container .detailed-analysis .analysis-card.sentiment[data-v-693144f6]{border-left-color:#eb2f96}.fast-analysis-report .result-container .detailed-analysis .analysis-card .analysis-card-header[data-v-693144f6]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:10px;margin-bottom:14px;font-size:16px;font-weight:600;color:#262626}.fast-analysis-report .result-container .detailed-analysis .analysis-card .analysis-card-header .anticon[data-v-693144f6]{font-size:20px}.fast-analysis-report .result-container .detailed-analysis .analysis-card .analysis-card-header.technical .anticon[data-v-693144f6]{color:#1890ff}.fast-analysis-report .result-container .detailed-analysis .analysis-card .analysis-card-header.fundamental .anticon[data-v-693144f6]{color:#722ed1}.fast-analysis-report .result-container .detailed-analysis .analysis-card .analysis-card-header.sentiment .anticon[data-v-693144f6]{color:#eb2f96}.fast-analysis-report .result-container .detailed-analysis .analysis-card .analysis-card-content[data-v-693144f6]{font-size:14px;line-height:1.8;color:#595959;text-align:justify}.fast-analysis-report .result-container .analysis-details[data-v-693144f6]{display:grid;grid-template-columns:1fr 1fr;gap:20px;margin-bottom:20px}.fast-analysis-report .result-container .analysis-details .detail-section[data-v-693144f6]{background:#fff;border-radius:12px;padding:20px;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.06);box-shadow:0 2px 8px rgba(0,0,0,.06)}.fast-analysis-report .result-container .analysis-details .detail-section .section-title[data-v-693144f6]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:8px;font-size:16px;font-weight:600;margin-bottom:16px;color:#262626}.fast-analysis-report .result-container .analysis-details .detail-section .detail-list[data-v-693144f6]{list-style:none;padding:0;margin:0}.fast-analysis-report .result-container .analysis-details .detail-section .detail-list li[data-v-693144f6]{padding:10px 0;border-bottom:1px solid #f0f0f0;font-size:14px;line-height:1.6;color:#595959}.fast-analysis-report .result-container .analysis-details .detail-section .detail-list li[data-v-693144f6]:last-child{border-bottom:none}.fast-analysis-report .result-container .analysis-details .detail-section .detail-list li[data-v-693144f6]:before{content:"•";margin-right:8px;color:#1890ff}.fast-analysis-report .result-container .analysis-details .detail-section.reasons[data-v-693144f6]{border-left:4px solid #52c41a}.fast-analysis-report .result-container .analysis-details .detail-section.risks[data-v-693144f6]{border-left:4px solid #faad14}.fast-analysis-report .result-container .indicators-section[data-v-693144f6]{background:#fff;border-radius:12px;padding:20px;margin-bottom:20px;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.06);box-shadow:0 2px 8px rgba(0,0,0,.06)}.fast-analysis-report .result-container .indicators-section .section-title[data-v-693144f6]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:8px;font-size:16px;font-weight:600;margin-bottom:16px;color:#262626}.fast-analysis-report .result-container .indicators-section .section-title .anticon[data-v-693144f6]{color:#1890ff}.fast-analysis-report .result-container .indicators-section .indicators-grid[data-v-693144f6]{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:16px}.fast-analysis-report .result-container .indicators-section .indicators-grid .indicator-item[data-v-693144f6]{background:#fafafa;border-radius:8px;padding:12px;text-align:center}.fast-analysis-report .result-container .indicators-section .indicators-grid .indicator-item .indicator-name[data-v-693144f6]{font-size:12px;color:#8c8c8c;margin-bottom:8px}.fast-analysis-report .result-container .indicators-section .indicators-grid .indicator-item .indicator-value[data-v-693144f6]{font-size:16px;font-weight:600;color:#262626}.fast-analysis-report .result-container .indicators-section .indicators-grid .indicator-item .indicator-value.bullish[data-v-693144f6],.fast-analysis-report .result-container .indicators-section .indicators-grid .indicator-item .indicator-value.oversold[data-v-693144f6]{color:#52c41a}.fast-analysis-report .result-container .indicators-section .indicators-grid .indicator-item .indicator-value.bearish[data-v-693144f6],.fast-analysis-report .result-container .indicators-section .indicators-grid .indicator-item .indicator-value.high-volatility[data-v-693144f6],.fast-analysis-report .result-container .indicators-section .indicators-grid .indicator-item .indicator-value.overbought[data-v-693144f6]{color:#ff4d4f}.fast-analysis-report .result-container .indicators-section .indicators-grid .indicator-item .indicator-value.low-volatility[data-v-693144f6]{color:#52c41a}.fast-analysis-report .result-container .indicators-section .indicators-grid .indicator-item .indicator-signal[data-v-693144f6]{font-size:11px;color:#8c8c8c;margin-top:4px;text-transform:capitalize}.fast-analysis-report .result-container .feedback-section[data-v-693144f6]{background:#fff;border-radius:12px;padding:20px;text-align:center;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.06);box-shadow:0 2px 8px rgba(0,0,0,.06)}.fast-analysis-report .result-container .feedback-section .feedback-question[data-v-693144f6]{font-size:14px;color:#595959;margin-bottom:12px}.fast-analysis-report .result-container .feedback-section .feedback-buttons[data-v-693144f6]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;gap:16px;margin-bottom:16px}.fast-analysis-report .result-container .feedback-section .feedback-buttons .ant-btn[data-v-693144f6]{min-width:100px}.fast-analysis-report .result-container .feedback-section .analysis-meta[data-v-693144f6]{font-size:12px;color:#8c8c8c;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;gap:16px}@media (max-width:992px){.fast-analysis-report .price-info-row[data-v-693144f6],.fast-analysis-report .scores-row[data-v-693144f6]{grid-template-columns:repeat(2,1fr)}.fast-analysis-report .analysis-details[data-v-693144f6]{grid-template-columns:1fr}}@media (max-width:576px){.fast-analysis-report[data-v-693144f6]{padding:12px}.fast-analysis-report .price-info-row[data-v-693144f6],.fast-analysis-report .scores-row[data-v-693144f6]{grid-template-columns:1fr}.fast-analysis-report .decision-card[data-v-693144f6]{padding:16px}.fast-analysis-report .decision-card .decision-main[data-v-693144f6]{gap:16px;text-align:center}.fast-analysis-report .decision-card .decision-main .decision-badge[data-v-693144f6],.fast-analysis-report .decision-card .decision-main[data-v-693144f6]{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.fast-analysis-report .decision-card .decision-main .decision-badge .decision-text[data-v-693144f6]{font-size:28px}}.fast-analysis-report.theme-dark[data-v-693144f6]{background:linear-gradient(135deg,#1e222d,#131722)}.fast-analysis-report.theme-dark .loading-content .loading-text[data-v-693144f6]{color:#00e5ff}.fast-analysis-report.theme-dark .empty-content .empty-title[data-v-693144f6]{color:#d1d4dc}.fast-analysis-report.theme-dark .decision-card[data-v-693144f6]{background:#2a2e39;border-left-color:#1890ff}.fast-analysis-report.theme-dark .decision-card.decision-buy[data-v-693144f6]{background:linear-gradient(135deg,rgba(82,196,26,.1),#2a2e39)}.fast-analysis-report.theme-dark .decision-card.decision-sell[data-v-693144f6]{background:linear-gradient(135deg,rgba(255,77,79,.1),#2a2e39)}.fast-analysis-report.theme-dark .decision-card.decision-hold[data-v-693144f6]{background:linear-gradient(135deg,rgba(250,173,20,.1),#2a2e39)}.fast-analysis-report.theme-dark .decision-card .decision-summary[data-v-693144f6]{color:#868993;border-top-color:#363c4e}.fast-analysis-report.theme-dark .decision-card .consensus-strip[data-v-693144f6]{background:rgba(24,144,255,.12);border-color:rgba(24,144,255,.35);color:#d1d4dc}.fast-analysis-report.theme-dark .decision-card .consensus-strip .consensus-strip-title[data-v-693144f6]{color:#69c0ff}.fast-analysis-report.theme-dark .decision-card .consensus-strip .consensus-strip-metrics .cm-item em[data-v-693144f6]{color:#868993}.fast-analysis-report.theme-dark .detailed-analysis .analysis-card[data-v-693144f6]{background:linear-gradient(135deg,#2a2e39,#1e222d)}.fast-analysis-report.theme-dark .detailed-analysis .analysis-card.technical[data-v-693144f6]{border-left-color:#1890ff}.fast-analysis-report.theme-dark .detailed-analysis .analysis-card.fundamental[data-v-693144f6]{border-left-color:#722ed1}.fast-analysis-report.theme-dark .detailed-analysis .analysis-card.sentiment[data-v-693144f6]{border-left-color:#eb2f96}.fast-analysis-report.theme-dark .detailed-analysis .analysis-card .analysis-card-header[data-v-693144f6]{color:#d1d4dc}.fast-analysis-report.theme-dark .detailed-analysis .analysis-card .analysis-card-content[data-v-693144f6]{color:#868993}.fast-analysis-report.theme-dark .detail-section[data-v-693144f6],.fast-analysis-report.theme-dark .feedback-section[data-v-693144f6],.fast-analysis-report.theme-dark .indicators-section[data-v-693144f6],.fast-analysis-report.theme-dark .price-card[data-v-693144f6],.fast-analysis-report.theme-dark .score-item[data-v-693144f6]{background:#2a2e39;color:#d1d4dc}.fast-analysis-report.theme-dark .detail-section .analysis-meta[data-v-693144f6],.fast-analysis-report.theme-dark .detail-section .feedback-question[data-v-693144f6],.fast-analysis-report.theme-dark .detail-section .indicator-name[data-v-693144f6],.fast-analysis-report.theme-dark .detail-section .indicator-signal[data-v-693144f6],.fast-analysis-report.theme-dark .detail-section .price-label[data-v-693144f6],.fast-analysis-report.theme-dark .detail-section .score-header[data-v-693144f6],.fast-analysis-report.theme-dark .detail-section .section-title[data-v-693144f6],.fast-analysis-report.theme-dark .feedback-section .analysis-meta[data-v-693144f6],.fast-analysis-report.theme-dark .feedback-section .feedback-question[data-v-693144f6],.fast-analysis-report.theme-dark .feedback-section .indicator-name[data-v-693144f6],.fast-analysis-report.theme-dark .feedback-section .indicator-signal[data-v-693144f6],.fast-analysis-report.theme-dark .feedback-section .price-label[data-v-693144f6],.fast-analysis-report.theme-dark .feedback-section .score-header[data-v-693144f6],.fast-analysis-report.theme-dark .feedback-section .section-title[data-v-693144f6],.fast-analysis-report.theme-dark .indicators-section .analysis-meta[data-v-693144f6],.fast-analysis-report.theme-dark .indicators-section .feedback-question[data-v-693144f6],.fast-analysis-report.theme-dark .indicators-section .indicator-name[data-v-693144f6],.fast-analysis-report.theme-dark .indicators-section .indicator-signal[data-v-693144f6],.fast-analysis-report.theme-dark .indicators-section .price-label[data-v-693144f6],.fast-analysis-report.theme-dark .indicators-section .score-header[data-v-693144f6],.fast-analysis-report.theme-dark .indicators-section .section-title[data-v-693144f6],.fast-analysis-report.theme-dark .price-card .analysis-meta[data-v-693144f6],.fast-analysis-report.theme-dark .price-card .feedback-question[data-v-693144f6],.fast-analysis-report.theme-dark .price-card .indicator-name[data-v-693144f6],.fast-analysis-report.theme-dark .price-card .indicator-signal[data-v-693144f6],.fast-analysis-report.theme-dark .price-card .price-label[data-v-693144f6],.fast-analysis-report.theme-dark .price-card .score-header[data-v-693144f6],.fast-analysis-report.theme-dark .price-card .section-title[data-v-693144f6],.fast-analysis-report.theme-dark .score-item .analysis-meta[data-v-693144f6],.fast-analysis-report.theme-dark .score-item .feedback-question[data-v-693144f6],.fast-analysis-report.theme-dark .score-item .indicator-name[data-v-693144f6],.fast-analysis-report.theme-dark .score-item .indicator-signal[data-v-693144f6],.fast-analysis-report.theme-dark .score-item .price-label[data-v-693144f6],.fast-analysis-report.theme-dark .score-item .score-header[data-v-693144f6],.fast-analysis-report.theme-dark .score-item .section-title[data-v-693144f6]{color:#868993}.fast-analysis-report.theme-dark .detail-section .indicator-value[data-v-693144f6],.fast-analysis-report.theme-dark .detail-section .price-value[data-v-693144f6],.fast-analysis-report.theme-dark .detail-section .score-value[data-v-693144f6],.fast-analysis-report.theme-dark .feedback-section .indicator-value[data-v-693144f6],.fast-analysis-report.theme-dark .feedback-section .price-value[data-v-693144f6],.fast-analysis-report.theme-dark .feedback-section .score-value[data-v-693144f6],.fast-analysis-report.theme-dark .indicators-section .indicator-value[data-v-693144f6],.fast-analysis-report.theme-dark .indicators-section .price-value[data-v-693144f6],.fast-analysis-report.theme-dark .indicators-section .score-value[data-v-693144f6],.fast-analysis-report.theme-dark .price-card .indicator-value[data-v-693144f6],.fast-analysis-report.theme-dark .price-card .price-value[data-v-693144f6],.fast-analysis-report.theme-dark .price-card .score-value[data-v-693144f6],.fast-analysis-report.theme-dark .score-item .indicator-value[data-v-693144f6],.fast-analysis-report.theme-dark .score-item .price-value[data-v-693144f6],.fast-analysis-report.theme-dark .score-item .score-value[data-v-693144f6]{color:#d1d4dc}.fast-analysis-report.theme-dark .score-item.overall[data-v-693144f6]{background:linear-gradient(135deg,rgba(24,144,255,.1),#2a2e39);border-color:#1890ff}.fast-analysis-report.theme-dark .detail-list li[data-v-693144f6]{color:#868993;border-bottom-color:#363c4e}.fast-analysis-report.theme-dark .indicators-grid .indicator-item[data-v-693144f6]{background:#363c4e}.ai-analysis-container[data-v-41eda137]{display:-webkit-box;display:-ms-flexbox;display:flex;height:calc(100vh - 120px);background:#f0f2f5;overflow:hidden;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.ai-analysis-container.embedded[data-v-41eda137]{height:auto;min-height:700px;background:transparent}.ai-analysis-container.embedded .main-content-full[data-v-41eda137]{-webkit-box-shadow:none;box-shadow:none;border-radius:0}.main-content-full[data-v-41eda137]{-webkit-box-flex:1;-ms-flex:1;flex:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;overflow:hidden;background:#fff;border-radius:12px;height:100%;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.08);box-shadow:0 2px 8px rgba(0,0,0,.08);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.top-index-bar[data-v-41eda137]{gap:8px;padding:8px 16px;background:#f8fafc;border-bottom:1px solid #e2e8f0;font-family:SF Mono,Monaco,Consolas,monospace}.top-index-bar .indicator-box[data-v-41eda137],.top-index-bar[data-v-41eda137]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.top-index-bar .indicator-box[data-v-41eda137]{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding:4px 10px;background:#fff;border-radius:6px;border:1px solid #e2e8f0;min-width:50px}.top-index-bar .indicator-box .ind-label[data-v-41eda137]{font-size:9px;color:#94a3b8;text-transform:uppercase}.top-index-bar .indicator-box .ind-value[data-v-41eda137]{font-size:13px;font-weight:700;color:#1e293b}.top-index-bar .indicator-box.fear-greed.extreme-fear .ind-value[data-v-41eda137]{color:#dc2626}.top-index-bar .indicator-box.fear-greed.fear .ind-value[data-v-41eda137]{color:#ea580c}.top-index-bar .indicator-box.fear-greed.neutral .ind-value[data-v-41eda137]{color:#ca8a04}.top-index-bar .indicator-box.fear-greed.greed .ind-value[data-v-41eda137]{color:#65a30d}.top-index-bar .indicator-box.fear-greed.extreme-greed .ind-value[data-v-41eda137],.top-index-bar .indicator-box.vix.low .ind-value[data-v-41eda137]{color:#16a34a}.top-index-bar .indicator-box.vix.medium .ind-value[data-v-41eda137]{color:#ca8a04}.top-index-bar .indicator-box.vix.high .ind-value[data-v-41eda137]{color:#dc2626}.top-index-bar .indicator-box.dxy .ind-value[data-v-41eda137]{color:#2563eb}.top-index-bar .indices-marquee[data-v-41eda137]{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:hidden;min-width:0}.top-index-bar .indices-marquee .marquee-track[data-v-41eda137]{display:-webkit-box;display:-ms-flexbox;display:flex;gap:8px;-webkit-animation:marquee-41eda137 35s linear infinite;animation:marquee-41eda137 35s linear infinite;width:-webkit-max-content;width:-moz-max-content;width:max-content}.top-index-bar .indices-marquee .marquee-track[data-v-41eda137]:hover{-webkit-animation-play-state:paused;animation-play-state:paused}.top-index-bar .indices-marquee .index-item[data-v-41eda137]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:4px;padding:4px 8px;background:#fff;border-radius:4px;border:1px solid #e2e8f0;font-size:11px;white-space:nowrap}.top-index-bar .indices-marquee .index-item .idx-flag[data-v-41eda137]{font-size:11px}.top-index-bar .indices-marquee .index-item .idx-symbol[data-v-41eda137]{color:#64748b;font-weight:500}.top-index-bar .indices-marquee .index-item .idx-price[data-v-41eda137]{color:#1e293b;font-weight:600}.top-index-bar .indices-marquee .index-item .idx-change[data-v-41eda137]{font-weight:600;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:1px}.top-index-bar .indices-marquee .index-item .idx-change.up[data-v-41eda137]{color:#16a34a}.top-index-bar .indices-marquee .index-item .idx-change.down[data-v-41eda137]{color:#dc2626}@-webkit-keyframes marquee-41eda137{0%{-webkit-transform:translateX(0);transform:translateX(0)}to{-webkit-transform:translateX(-50%);transform:translateX(-50%)}}@keyframes marquee-41eda137{0%{-webkit-transform:translateX(0);transform:translateX(0)}to{-webkit-transform:translateX(-50%);transform:translateX(-50%)}}.top-index-bar .refresh-btn[data-v-41eda137]{color:#94a3b8;-ms-flex-negative:0;flex-shrink:0}.top-index-bar .refresh-btn[data-v-41eda137]:hover{color:#1e293b}.main-body[data-v-41eda137]{-webkit-box-flex:1;-ms-flex:1;flex:1;padding:12px;overflow:hidden;min-height:0}.left-panel[data-v-41eda137],.main-body[data-v-41eda137]{display:-webkit-box;display:-ms-flexbox;display:flex;gap:12px}.left-panel[data-v-41eda137]{width:280px;-ms-flex-negative:0;flex-shrink:0;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;overflow-y:auto}.left-panel .heatmap-box[data-v-41eda137]{background:#fff;border-radius:8px;padding:12px;border:1px solid #e2e8f0}.left-panel .heatmap-box .box-header[data-v-41eda137]{margin-bottom:10px}.left-panel .heatmap-box .box-header[data-v-41eda137] .ant-radio-group .ant-radio-button-wrapper{font-size:10px;padding:0 6px;height:22px;line-height:20px}.left-panel .heatmap-box .box-header[data-v-41eda137] .ant-radio-group .ant-radio-button-wrapper.ant-radio-button-wrapper-checked{background:var(--primary-color,#1890ff);border-color:var(--primary-color,#1890ff);color:#fff}.left-panel .heatmap-box .heatmap-grid[data-v-41eda137]{display:grid;grid-template-columns:repeat(3,1fr);gap:4px}.left-panel .heatmap-box .heatmap-grid .heat-cell[data-v-41eda137]{padding:6px 4px;border-radius:4px;text-align:center;font-size:9px}.left-panel .heatmap-box .heatmap-grid .heat-cell .heat-name[data-v-41eda137]{display:block;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-bottom:1px}.left-panel .heatmap-box .heatmap-grid .heat-cell .heat-price[data-v-41eda137]{display:block;font-size:9px;opacity:.8;margin-bottom:1px}.left-panel .heatmap-box .heatmap-grid .heat-cell .heat-val[data-v-41eda137]{font-weight:700;font-size:10px}.left-panel .calendar-box[data-v-41eda137]{-webkit-box-flex:1;-ms-flex:1;flex:1;background:#fff;border-radius:8px;padding:12px;border:1px solid #e2e8f0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;min-height:0;overflow:hidden}.left-panel .calendar-box .box-header[data-v-41eda137]{margin-bottom:8px}.left-panel .calendar-box .box-header .box-title[data-v-41eda137]{font-size:12px;color:#64748b;font-weight:600}.left-panel .calendar-box .box-header .box-title .anticon[data-v-41eda137]{margin-right:6px;color:var(--primary-color,#1890ff)}.left-panel .calendar-box .calendar-list[data-v-41eda137]{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow-y:auto}.left-panel .calendar-box .calendar-list[data-v-41eda137]::-webkit-scrollbar{width:4px}.left-panel .calendar-box .calendar-list[data-v-41eda137]::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:2px}.left-panel .calendar-box .calendar-list .cal-item[data-v-41eda137]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:6px;padding:6px 0;border-bottom:1px solid #f1f5f9;font-size:10px}.left-panel .calendar-box .calendar-list .cal-item[data-v-41eda137]:last-child{border-bottom:none}.left-panel .calendar-box .calendar-list .cal-item.high[data-v-41eda137]{border-left:3px solid #dc2626;padding-left:8px;margin-left:-4px}.left-panel .calendar-box .calendar-list .cal-item.medium[data-v-41eda137]{border-left:3px solid #ca8a04;padding-left:8px;margin-left:-4px}.left-panel .calendar-box .calendar-list .cal-item.low[data-v-41eda137]{border-left:3px solid #16a34a;padding-left:8px;margin-left:-4px}.left-panel .calendar-box .calendar-list .cal-item .cal-date[data-v-41eda137]{font-size:9px;color:#94a3b8;min-width:32px;font-weight:500}.left-panel .calendar-box .calendar-list .cal-item .cal-time[data-v-41eda137]{color:#64748b;min-width:36px;font-weight:500}.left-panel .calendar-box .calendar-list .cal-item .cal-flag[data-v-41eda137]{font-size:12px}.left-panel .calendar-box .calendar-list .cal-item .cal-name[data-v-41eda137]{-webkit-box-flex:1;-ms-flex:1;flex:1;color:#334155;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.left-panel .calendar-box .calendar-list .cal-item .cal-impact[data-v-41eda137]{font-weight:600;font-size:10px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:2px}.left-panel .calendar-box .calendar-list .cal-item .cal-impact.bullish[data-v-41eda137]{color:#16a34a}.left-panel .calendar-box .calendar-list .cal-item .cal-impact.bearish[data-v-41eda137]{color:#dc2626}.left-panel .calendar-box .calendar-list .cal-item .cal-impact.neutral[data-v-41eda137]{color:#94a3b8}.left-panel .calendar-box .calendar-list .cal-empty[data-v-41eda137]{text-align:center;color:#94a3b8;padding:20px 0;font-size:12px}.right-panel[data-v-41eda137]{-webkit-box-flex:1;-ms-flex:1;flex:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;min-width:0;overflow:hidden;background:#fff;border-radius:8px;border:1px solid #e2e8f0}.right-panel .analysis-toolbar[data-v-41eda137]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:12px;padding:12px 16px;border-bottom:1px solid #f1f5f9;background:#fafafa;border-radius:8px 8px 0 0}.right-panel .analysis-toolbar .symbol-selector[data-v-41eda137]{-webkit-box-flex:1;-ms-flex:1;flex:1;max-width:320px}.right-panel .analysis-toolbar .analyze-button[data-v-41eda137]{background:var(--primary-color,#1890ff);border-color:var(--primary-color,#1890ff)}.right-panel .analysis-toolbar .history-button[data-v-41eda137]{border-color:#d9d9d9}.right-panel .analysis-main[data-v-41eda137]{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:auto;padding:16px;min-height:0}.right-panel .analysis-main .analysis-placeholder[data-v-41eda137]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;height:100%;min-height:300px}.right-panel .analysis-main .analysis-placeholder .placeholder-content[data-v-41eda137]{text-align:center}.right-panel .analysis-main .analysis-placeholder .placeholder-content .placeholder-icon[data-v-41eda137]{font-size:72px;color:var(--primary-color,#1890ff);opacity:.5;margin-bottom:20px}.right-panel .analysis-main .analysis-placeholder .placeholder-content h3[data-v-41eda137]{font-size:18px;color:#1e293b;margin-bottom:8px}.right-panel .analysis-main .analysis-placeholder .placeholder-content p[data-v-41eda137]{font-size:14px;color:#64748b}.watchlist-panel[data-v-41eda137]{width:200px;-ms-flex-negative:0;flex-shrink:0;background:#fff;border-radius:8px;border:1px solid #e2e8f0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;overflow:hidden}.watchlist-panel .panel-header[data-v-41eda137]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:10px 12px;border-bottom:1px solid #f1f5f9;background:#fafafa}.watchlist-panel .panel-header .panel-title[data-v-41eda137]{font-size:12px;font-weight:600;color:#64748b}.watchlist-panel .panel-header .panel-title .anticon[data-v-41eda137]{color:#facc15;margin-right:6px}.watchlist-panel .watchlist-list[data-v-41eda137]{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow-y:auto;padding:8px}.watchlist-panel .watchlist-list[data-v-41eda137]::-webkit-scrollbar{width:4px}.watchlist-panel .watchlist-list[data-v-41eda137]::-webkit-scrollbar-thumb{background:#e2e8f0;border-radius:2px}.watchlist-panel .watchlist-list .watchlist-item[data-v-41eda137]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:8px 10px;border-radius:6px;cursor:pointer;-webkit-transition:all .2s;transition:all .2s;margin-bottom:4px}.watchlist-panel .watchlist-list .watchlist-item[data-v-41eda137]:hover{background:#f8fafc}.watchlist-panel .watchlist-list .watchlist-item.active[data-v-41eda137]{background:#e6f7ff;border:1px solid #91d5ff}.watchlist-panel .watchlist-list .watchlist-item .item-main[data-v-41eda137]{-webkit-box-flex:1;-ms-flex:1;flex:1;min-width:0}.watchlist-panel .watchlist-list .watchlist-item .item-main .item-symbol[data-v-41eda137]{display:block;font-size:12px;font-weight:600;color:#1e293b}.watchlist-panel .watchlist-list .watchlist-item .item-main .item-name[data-v-41eda137]{display:block;font-size:10px;color:#94a3b8;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.watchlist-panel .watchlist-list .watchlist-item .item-price[data-v-41eda137]{text-align:right;margin-right:8px;font-family:SF Mono,Monaco,monospace}.watchlist-panel .watchlist-list .watchlist-item .item-price .price-value[data-v-41eda137]{display:block;font-size:11px;font-weight:600;color:#1e293b}.watchlist-panel .watchlist-list .watchlist-item .item-price .price-change[data-v-41eda137]{display:block;font-size:10px;font-weight:600}.watchlist-panel .watchlist-list .watchlist-item .item-price .price-change.up[data-v-41eda137]{color:#16a34a}.watchlist-panel .watchlist-list .watchlist-item .item-price .price-change.down[data-v-41eda137]{color:#dc2626}.watchlist-panel .watchlist-list .watchlist-item .item-remove[data-v-41eda137]{color:#cbd5e1;font-size:12px;opacity:0;-webkit-transition:opacity .2s;transition:opacity .2s}.watchlist-panel .watchlist-list .watchlist-item .item-remove[data-v-41eda137]:hover{color:#dc2626}.watchlist-panel .watchlist-list .watchlist-item:hover .item-remove[data-v-41eda137]{opacity:1}.watchlist-panel .watchlist-list .watchlist-empty[data-v-41eda137]{text-align:center;padding:24px 12px;color:#94a3b8}.watchlist-panel .watchlist-list .watchlist-empty .anticon[data-v-41eda137]{font-size:32px;margin-bottom:8px;display:block}.watchlist-panel .watchlist-list .watchlist-empty p[data-v-41eda137]{font-size:12px;margin-bottom:12px}@-webkit-keyframes pulse-41eda137{0%,to{opacity:1}50%{opacity:.5}}@keyframes pulse-41eda137{0%,to{opacity:1}50%{opacity:.5}}@media (max-width:992px){.ai-analysis-container[data-v-41eda137]{height:auto;min-height:calc(100vh - 64px);overflow-y:auto}.main-content-full[data-v-41eda137]{height:auto;min-height:auto}.top-index-bar[data-v-41eda137]{-ms-flex-wrap:wrap;flex-wrap:wrap;padding:8px}.top-index-bar .indicator-box[data-v-41eda137]{min-width:45px;padding:3px 6px}.top-index-bar .indices-marquee[data-v-41eda137]{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10;width:100%;margin-top:8px}.main-body[data-v-41eda137]{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding:12px}.left-panel[data-v-41eda137]{width:100%;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;gap:12px}.left-panel .calendar-box[data-v-41eda137],.left-panel .heatmap-box[data-v-41eda137]{-webkit-box-flex:1;-ms-flex:1;flex:1;min-width:0}.left-panel .calendar-box[data-v-41eda137]{max-height:200px}.right-panel .analysis-toolbar[data-v-41eda137]{-ms-flex-wrap:wrap;flex-wrap:wrap}.right-panel .analysis-toolbar .symbol-selector[data-v-41eda137]{width:100%!important;max-width:none!important}.right-panel .analysis-toolbar .analyze-button[data-v-41eda137],.right-panel .analysis-toolbar .history-button[data-v-41eda137]{-webkit-box-flex:1;-ms-flex:1;flex:1}.watchlist-panel[data-v-41eda137]{width:100%;max-height:200px;-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}}.ai-analysis-container.theme-dark[data-v-41eda137]{background:#131722;color:#d1d4dc}.ai-analysis-container.theme-dark .main-content-full[data-v-41eda137]{background:#1e222d;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.3);box-shadow:0 2px 8px rgba(0,0,0,.3)}.ai-analysis-container.theme-dark .top-index-bar[data-v-41eda137]{background:#1e222d;border-bottom-color:#363c4e}.ai-analysis-container.theme-dark .top-index-bar .indicator-box[data-v-41eda137]{background:#2a2e39;border-color:#363c4e}.ai-analysis-container.theme-dark .top-index-bar .indicator-box .ind-label[data-v-41eda137]{color:#868993}.ai-analysis-container.theme-dark .top-index-bar .indicator-box .ind-value[data-v-41eda137]{color:#d1d4dc}.ai-analysis-container.theme-dark .top-index-bar .indices-marquee .index-item[data-v-41eda137]{background:#2a2e39;border-color:#363c4e}.ai-analysis-container.theme-dark .top-index-bar .indices-marquee .index-item .idx-symbol[data-v-41eda137]{color:#868993}.ai-analysis-container.theme-dark .top-index-bar .indices-marquee .index-item .idx-price[data-v-41eda137]{color:#d1d4dc}.ai-analysis-container.theme-dark .top-index-bar .refresh-btn[data-v-41eda137]{color:#868993}.ai-analysis-container.theme-dark .top-index-bar .refresh-btn[data-v-41eda137]:hover{color:#d1d4dc}.ai-analysis-container.theme-dark .watchlist-panel[data-v-41eda137]{background:#2a2e39;border-color:#363c4e}.ai-analysis-container.theme-dark .watchlist-panel .panel-header[data-v-41eda137]{background:#1e222d;border-bottom-color:#363c4e}.ai-analysis-container.theme-dark .watchlist-panel .panel-header .panel-title[data-v-41eda137]{color:#868993}.ai-analysis-container.theme-dark .watchlist-panel .watchlist-list .watchlist-item[data-v-41eda137]:hover{background:#363c4e}.ai-analysis-container.theme-dark .watchlist-panel .watchlist-list .watchlist-item.active[data-v-41eda137]{background:rgba(24,144,255,.1);border-color:#1890ff}.ai-analysis-container.theme-dark .watchlist-panel .watchlist-list .watchlist-item .item-main .item-symbol[data-v-41eda137]{color:#d1d4dc}.ai-analysis-container.theme-dark .watchlist-panel .watchlist-list .watchlist-item .item-main .item-name[data-v-41eda137]{color:#64748b}.ai-analysis-container.theme-dark .watchlist-panel .watchlist-list .watchlist-item .item-price .price-value[data-v-41eda137]{color:#d1d4dc}.ai-analysis-container.theme-dark .watchlist-panel .watchlist-list .watchlist-empty[data-v-41eda137]{color:#64748b}.ai-analysis-container.theme-dark .watchlist-bar-legacy[data-v-41eda137]{background:#1e222d;border-bottom-color:#363c4e}.ai-analysis-container.theme-dark .watchlist-bar-legacy .stock-chip[data-v-41eda137]{background:#2a2e39;border-color:#363c4e}.ai-analysis-container.theme-dark .watchlist-bar-legacy .stock-chip.active[data-v-41eda137],.ai-analysis-container.theme-dark .watchlist-bar-legacy .stock-chip[data-v-41eda137]:hover{border-color:var(--primary-color,#1890ff);background:rgba(24,144,255,.1)}.ai-analysis-container.theme-dark .watchlist-bar-legacy .stock-chip .chip-symbol[data-v-41eda137]{color:#d1d4dc}.ai-analysis-container.theme-dark .watchlist-bar-legacy .stock-chip .chip-price[data-v-41eda137]{color:#868993}.ai-analysis-container.theme-dark .left-panel .heatmap-box[data-v-41eda137]{background:#2a2e39;border-color:#363c4e}.ai-analysis-container.theme-dark .left-panel .heatmap-box[data-v-41eda137] .ant-radio-group .ant-radio-button-wrapper{background:#1e222d;border-color:#363c4e;color:#868993}.ai-analysis-container.theme-dark .left-panel .heatmap-box[data-v-41eda137] .ant-radio-group .ant-radio-button-wrapper:hover{color:#d1d4dc}.ai-analysis-container.theme-dark .left-panel .calendar-box[data-v-41eda137]{background:#2a2e39;border-color:#363c4e}.ai-analysis-container.theme-dark .left-panel .calendar-box .box-title[data-v-41eda137]{color:#868993}.ai-analysis-container.theme-dark .left-panel .calendar-box .cal-item[data-v-41eda137]{border-bottom-color:#363c4e}.ai-analysis-container.theme-dark .left-panel .calendar-box .cal-item .cal-date[data-v-41eda137]{color:#64748b}.ai-analysis-container.theme-dark .left-panel .calendar-box .cal-item .cal-time[data-v-41eda137]{color:#868993}.ai-analysis-container.theme-dark .left-panel .calendar-box .cal-item .cal-name[data-v-41eda137]{color:#d1d4dc}.ai-analysis-container.theme-dark .left-panel .calendar-box .cal-empty[data-v-41eda137]{color:#64748b}.ai-analysis-container.theme-dark .right-panel[data-v-41eda137]{background:#2a2e39;border-color:#363c4e}.ai-analysis-container.theme-dark .right-panel .analysis-toolbar[data-v-41eda137]{background:#1e222d;border-bottom-color:#363c4e}.ai-analysis-container.theme-dark .right-panel .analysis-toolbar .history-button[data-v-41eda137]{background:#2a2e39;border-color:#363c4e;color:#d1d4dc}.ai-analysis-container.theme-dark .right-panel .analysis-main .analysis-placeholder .placeholder-content h3[data-v-41eda137]{color:#d1d4dc}.ai-analysis-container.theme-dark .right-panel .analysis-main .analysis-placeholder .placeholder-content p[data-v-41eda137]{color:#868993}.ai-analysis-container.theme-dark .watchlist-bar-compat[data-v-41eda137]{background:#1e222d;border-top-color:#363c4e}.ai-analysis-container.theme-dark .watchlist-bar-compat .bar-label[data-v-41eda137]{color:#868993}.ai-analysis-container.theme-dark .watchlist-bar-compat .stock-chip[data-v-41eda137]{background:#2a2e39;border-color:#363c4e}.ai-analysis-container.theme-dark .watchlist-bar-compat .stock-chip.active[data-v-41eda137],.ai-analysis-container.theme-dark .watchlist-bar-compat .stock-chip[data-v-41eda137]:hover{border-color:var(--primary-color,#1890ff);background:rgba(24,144,255,.1)}.ai-analysis-container.theme-dark .watchlist-bar-compat .stock-chip .chip-symbol[data-v-41eda137]{color:#d1d4dc}.ai-analysis-container.theme-dark .watchlist-bar-compat .stock-chip .chip-price[data-v-41eda137]{color:#868993}.ai-analysis-container.theme-dark .watchlist-bar-compat .stock-chip .chip-remove[data-v-41eda137]{color:#64748b}.ai-analysis-container.theme-dark[data-v-41eda137] .symbol-selector .ant-select-selection{background-color:#2a2e39;border-color:#363c4e;color:#d1d4dc}.add-stock-modal-content .market-tabs[data-v-41eda137]{margin-bottom:16px}.add-stock-modal-content .hot-symbols-section[data-v-41eda137],.add-stock-modal-content .search-results-section[data-v-41eda137],.add-stock-modal-content .symbol-search-section[data-v-41eda137]{margin-bottom:24px}.add-stock-modal-content .hot-symbols-section .section-title[data-v-41eda137],.add-stock-modal-content .search-results-section .section-title[data-v-41eda137]{font-size:14px;font-weight:600;color:#262626;margin-bottom:12px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.add-stock-modal-content .symbol-list[data-v-41eda137]{max-height:200px;overflow-y:auto;border:1px solid #e8e8e8;border-radius:4px}.add-stock-modal-content .symbol-list .symbol-list-item[data-v-41eda137]{cursor:pointer;padding:8px 12px;-webkit-transition:background-color .3s;transition:background-color .3s}.add-stock-modal-content .symbol-list .symbol-list-item[data-v-41eda137]:hover{background-color:#f5f5f5}.add-stock-modal-content .symbol-list .symbol-list-item .symbol-item-content[data-v-41eda137]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:8px}.add-stock-modal-content .symbol-list .symbol-list-item .symbol-item-content .symbol-code[data-v-41eda137]{font-weight:600;color:#262626;min-width:80px}.add-stock-modal-content .symbol-list .symbol-list-item .symbol-item-content .symbol-name[data-v-41eda137]{color:#595959;-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.add-stock-modal-content .selected-symbol-section[data-v-41eda137]{margin-top:16px}.add-stock-modal-content .selected-symbol-section .selected-symbol-info[data-v-41eda137]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.skeleton-box .skeleton-text[data-v-41eda137]{display:block;height:12px;background:-webkit-gradient(linear,left top,right top,color-stop(25%,#e2e8f0),color-stop(50%,#f1f5f9),color-stop(75%,#e2e8f0));background:linear-gradient(90deg,#e2e8f0 25%,#f1f5f9 50%,#e2e8f0 75%);background-size:200% 100%;-webkit-animation:skeleton-pulse-41eda137 1.5s ease-in-out infinite;animation:skeleton-pulse-41eda137 1.5s ease-in-out infinite;border-radius:4px;margin:3px 0}.skeleton-box .skeleton-text.short[data-v-41eda137]{width:40px;height:9px}.skeleton-cell[data-v-41eda137]{background:#f8fafc!important;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding:8px 4px}.skeleton-cell .skeleton-text[data-v-41eda137]{width:80%;height:10px;background:-webkit-gradient(linear,left top,right top,color-stop(25%,#e2e8f0),color-stop(50%,#f1f5f9),color-stop(75%,#e2e8f0));background:linear-gradient(90deg,#e2e8f0 25%,#f1f5f9 50%,#e2e8f0 75%);background-size:200% 100%;-webkit-animation:skeleton-pulse-41eda137 1.5s ease-in-out infinite;animation:skeleton-pulse-41eda137 1.5s ease-in-out infinite;border-radius:3px;margin:2px 0}.skeleton-cell .skeleton-text.short[data-v-41eda137]{width:50%;height:8px}.skeleton-item[data-v-41eda137]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:8px;padding:6px 0}.skeleton-item .skeleton-text[data-v-41eda137]{height:12px;background:-webkit-gradient(linear,left top,right top,color-stop(25%,#e2e8f0),color-stop(50%,#f1f5f9),color-stop(75%,#e2e8f0));background:linear-gradient(90deg,#e2e8f0 25%,#f1f5f9 50%,#e2e8f0 75%);background-size:200% 100%;-webkit-animation:skeleton-pulse-41eda137 1.5s ease-in-out infinite;animation:skeleton-pulse-41eda137 1.5s ease-in-out infinite;border-radius:4px;-webkit-box-flex:1;-ms-flex:1;flex:1}.skeleton-item .skeleton-text.short[data-v-41eda137]{-webkit-box-flex:0;-ms-flex:none;flex:none;width:40px}.indices-empty[data-v-41eda137],.indices-loading[data-v-41eda137]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;height:100%;font-size:11px;color:#94a3b8;padding:4px 16px}.indices-loading .anticon[data-v-41eda137]{margin-right:6px}.heatmap-empty[data-v-41eda137]{grid-column:-1;text-align:center;padding:20px;color:#94a3b8;font-size:12px}@-webkit-keyframes skeleton-pulse-41eda137{0%{background-position:200% 0}to{background-position:-200% 0}}@keyframes skeleton-pulse-41eda137{0%{background-position:200% 0}to{background-position:-200% 0}}.theme-dark .skeleton-box .skeleton-text[data-v-41eda137],.theme-dark .skeleton-cell .skeleton-text[data-v-41eda137],.theme-dark .skeleton-item .skeleton-text[data-v-41eda137]{background:-webkit-gradient(linear,left top,right top,color-stop(25%,#363c4e),color-stop(50%,#424857),color-stop(75%,#363c4e));background:linear-gradient(90deg,#363c4e 25%,#424857 50%,#363c4e 75%);background-size:200% 100%}.theme-dark .skeleton-cell[data-v-41eda137]{background:#2a2e39!important}.theme-dark .heatmap-empty[data-v-41eda137],.theme-dark .indices-empty[data-v-41eda137],.theme-dark .indices-loading[data-v-41eda137]{color:#64748b} \ No newline at end of file diff --git a/frontend/dist/css/785.23a4bc42.css b/frontend/dist/css/785.23a4bc42.css deleted file mode 100644 index 83b92f5..0000000 --- a/frontend/dist/css/785.23a4bc42.css +++ /dev/null @@ -1 +0,0 @@ -.fast-analysis-report[data-v-110dde64]{height:100%;overflow-y:auto;padding:20px;background:linear-gradient(135deg,#f5f7fa,#e4e8ec);border-radius:12px}.fast-analysis-report .loading-container[data-v-110dde64]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;min-height:400px;background:#fff;border-radius:12px}.fast-analysis-report .loading-container .loading-content-pro[data-v-110dde64]{width:100%;max-width:400px;padding:40px}.fast-analysis-report .loading-container .loading-content-pro .loading-header[data-v-110dde64]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;gap:12px;margin-bottom:32px}.fast-analysis-report .loading-container .loading-content-pro .loading-header .loading-icon-pro[data-v-110dde64]{font-size:28px;color:#1890ff}.fast-analysis-report .loading-container .loading-content-pro .loading-header .loading-title[data-v-110dde64]{font-size:20px;font-weight:600;color:#1e293b}.fast-analysis-report .loading-container .loading-content-pro .progress-wrapper[data-v-110dde64]{margin-bottom:24px;position:relative}.fast-analysis-report .loading-container .loading-content-pro .progress-wrapper .progress-text[data-v-110dde64]{position:absolute;right:0;top:-24px;font-size:14px;font-weight:600;color:#1890ff}.fast-analysis-report .loading-container .loading-content-pro .current-step[data-v-110dde64]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;gap:8px;padding:12px 20px;background:#f0f5ff;border-radius:8px;margin-bottom:24px;color:#1890ff;font-size:14px;font-weight:500}.fast-analysis-report .loading-container .loading-content-pro .current-step .anticon[data-v-110dde64]{font-size:16px}.fast-analysis-report .loading-container .loading-content-pro .steps-list[data-v-110dde64]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;gap:12px}.fast-analysis-report .loading-container .loading-content-pro .steps-list .step-item[data-v-110dde64]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:12px;padding:10px 16px;background:#f8fafc;border-radius:8px;font-size:13px;color:#94a3b8;-webkit-transition:all .3s;transition:all .3s}.fast-analysis-report .loading-container .loading-content-pro .steps-list .step-item .step-dot[data-v-110dde64]{width:8px;height:8px;border-radius:50%;background:#e2e8f0;-webkit-transition:all .3s;transition:all .3s}.fast-analysis-report .loading-container .loading-content-pro .steps-list .step-item .step-text[data-v-110dde64]{-webkit-box-flex:1;-ms-flex:1;flex:1}.fast-analysis-report .loading-container .loading-content-pro .steps-list .step-item .step-check[data-v-110dde64]{color:#52c41a;font-size:14px}.fast-analysis-report .loading-container .loading-content-pro .steps-list .step-item.active[data-v-110dde64]{background:#e6f7ff;color:#1890ff;font-weight:500}.fast-analysis-report .loading-container .loading-content-pro .steps-list .step-item.active .step-dot[data-v-110dde64]{background:#1890ff;-webkit-box-shadow:0 0 0 3px rgba(24,144,255,.2);box-shadow:0 0 0 3px rgba(24,144,255,.2)}.fast-analysis-report .loading-container .loading-content-pro .steps-list .step-item.done[data-v-110dde64]{background:#f6ffed;color:#52c41a}.fast-analysis-report .loading-container .loading-content-pro .steps-list .step-item.done .step-dot[data-v-110dde64]{background:#52c41a}.fast-analysis-report .loading-container .loading-content-pro .loading-footer[data-v-110dde64]{margin-top:24px;text-align:center}.fast-analysis-report .loading-container .loading-content-pro .loading-footer .elapsed-time[data-v-110dde64]{font-size:13px;color:#94a3b8;font-family:SF Mono,Monaco,monospace}.fast-analysis-report .empty-container[data-v-110dde64]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;min-height:400px}.fast-analysis-report .empty-container .empty-content[data-v-110dde64]{text-align:center}.fast-analysis-report .empty-container .empty-content .empty-icon[data-v-110dde64]{font-size:64px;color:#d9d9d9}.fast-analysis-report .empty-container .empty-content .empty-title[data-v-110dde64]{margin-top:16px;font-size:18px;font-weight:600;color:#262626}.fast-analysis-report .empty-container .empty-content .empty-hint[data-v-110dde64]{margin-top:8px;color:#8c8c8c}.fast-analysis-report .result-container .decision-card[data-v-110dde64]{background:#fff;border-radius:16px;padding:24px;margin-bottom:20px;-webkit-box-shadow:0 4px 12px rgba(0,0,0,.08);box-shadow:0 4px 12px rgba(0,0,0,.08);border-left:6px solid #1890ff}.fast-analysis-report .result-container .decision-card.decision-buy[data-v-110dde64]{border-left-color:#52c41a;background:linear-gradient(135deg,#f6ffed,#fff)}.fast-analysis-report .result-container .decision-card.decision-sell[data-v-110dde64]{border-left-color:#ff4d4f;background:linear-gradient(135deg,#fff2f0,#fff)}.fast-analysis-report .result-container .decision-card.decision-hold[data-v-110dde64]{border-left-color:#faad14;background:linear-gradient(135deg,#fffbe6,#fff)}.fast-analysis-report .result-container .decision-card .decision-main[data-v-110dde64]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:16px}.fast-analysis-report .result-container .decision-card .decision-main .decision-badge[data-v-110dde64]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:12px}.fast-analysis-report .result-container .decision-card .decision-main .decision-badge .anticon[data-v-110dde64]{font-size:32px}.fast-analysis-report .result-container .decision-card .decision-main .decision-badge .decision-text[data-v-110dde64]{font-size:36px;font-weight:800;letter-spacing:2px}.fast-analysis-report .result-container .decision-card .decision-main .confidence-ring[data-v-110dde64]{text-align:center}.fast-analysis-report .result-container .decision-card .decision-main .confidence-ring .confidence-value[data-v-110dde64]{font-size:18px;font-weight:700}.fast-analysis-report .result-container .decision-card .decision-main .confidence-ring .confidence-label[data-v-110dde64]{font-size:12px;color:#8c8c8c;margin-top:4px}.fast-analysis-report .result-container .decision-card .decision-summary[data-v-110dde64]{font-size:16px;line-height:1.6;color:#595959;padding-top:16px;border-top:1px dashed #e8e8e8}.fast-analysis-report .result-container .price-info-row[data-v-110dde64]{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin-bottom:20px}.fast-analysis-report .result-container .price-info-row .price-card[data-v-110dde64]{background:#fff;border-radius:12px;padding:16px;text-align:center;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.06);box-shadow:0 2px 8px rgba(0,0,0,.06)}.fast-analysis-report .result-container .price-info-row .price-card .price-label[data-v-110dde64]{font-size:12px;color:#8c8c8c;margin-bottom:8px}.fast-analysis-report .result-container .price-info-row .price-card .price-value[data-v-110dde64]{font-size:18px;font-weight:700;color:#262626}.fast-analysis-report .result-container .price-info-row .price-card .price-value.positive[data-v-110dde64]{color:#52c41a}.fast-analysis-report .result-container .price-info-row .price-card .price-value.negative[data-v-110dde64]{color:#ff4d4f}.fast-analysis-report .result-container .price-info-row .price-card .price-hint[data-v-110dde64]{font-size:10px;color:#bfbfbf;margin-top:6px;cursor:help}.fast-analysis-report .result-container .price-info-row .price-card .price-hint .anticon[data-v-110dde64]{margin-right:2px}.fast-analysis-report .result-container .price-info-row .price-card .price-change[data-v-110dde64]{font-size:14px;margin-top:4px;font-weight:600}.fast-analysis-report .result-container .price-info-row .price-card .price-change.positive[data-v-110dde64]{color:#52c41a}.fast-analysis-report .result-container .price-info-row .price-card .price-change.negative[data-v-110dde64]{color:#ff4d4f}.fast-analysis-report .result-container .price-info-row .price-card.current[data-v-110dde64]{border-top:3px solid #1890ff}.fast-analysis-report .result-container .price-info-row .price-card.entry[data-v-110dde64]{border-top:3px solid #722ed1}.fast-analysis-report .result-container .price-info-row .price-card.stop[data-v-110dde64]{border-top:3px solid #ff4d4f}.fast-analysis-report .result-container .price-info-row .price-card.target[data-v-110dde64]{border-top:3px solid #52c41a}.fast-analysis-report .result-container .scores-row[data-v-110dde64]{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin-bottom:20px}.fast-analysis-report .result-container .scores-row .score-item[data-v-110dde64]{background:#fff;border-radius:12px;padding:16px;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.06);box-shadow:0 2px 8px rgba(0,0,0,.06)}.fast-analysis-report .result-container .scores-row .score-item .score-header[data-v-110dde64]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:8px;font-size:14px;color:#595959;margin-bottom:12px}.fast-analysis-report .result-container .scores-row .score-item .score-header .anticon[data-v-110dde64]{color:#1890ff}.fast-analysis-report .result-container .scores-row .score-item .score-value[data-v-110dde64]{text-align:right;font-size:20px;font-weight:700;color:#262626;margin-top:8px}.fast-analysis-report .result-container .scores-row .score-item.overall[data-v-110dde64]{background:linear-gradient(135deg,#e6f7ff,#fff);border:1px solid #91d5ff}.fast-analysis-report .result-container .detailed-analysis[data-v-110dde64]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;gap:16px;margin-bottom:20px}.fast-analysis-report .result-container .detailed-analysis .analysis-card[data-v-110dde64]{background:linear-gradient(135deg,#fff,#fafafa);border-radius:12px;padding:20px;-webkit-box-shadow:0 2px 12px rgba(0,0,0,.06);box-shadow:0 2px 12px rgba(0,0,0,.06);border-left:4px solid #1890ff}.fast-analysis-report .result-container .detailed-analysis .analysis-card.technical[data-v-110dde64]{border-left-color:#1890ff}.fast-analysis-report .result-container .detailed-analysis .analysis-card.fundamental[data-v-110dde64]{border-left-color:#722ed1}.fast-analysis-report .result-container .detailed-analysis .analysis-card.sentiment[data-v-110dde64]{border-left-color:#eb2f96}.fast-analysis-report .result-container .detailed-analysis .analysis-card .analysis-card-header[data-v-110dde64]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:10px;margin-bottom:14px;font-size:16px;font-weight:600;color:#262626}.fast-analysis-report .result-container .detailed-analysis .analysis-card .analysis-card-header .anticon[data-v-110dde64]{font-size:20px}.fast-analysis-report .result-container .detailed-analysis .analysis-card .analysis-card-header.technical .anticon[data-v-110dde64]{color:#1890ff}.fast-analysis-report .result-container .detailed-analysis .analysis-card .analysis-card-header.fundamental .anticon[data-v-110dde64]{color:#722ed1}.fast-analysis-report .result-container .detailed-analysis .analysis-card .analysis-card-header.sentiment .anticon[data-v-110dde64]{color:#eb2f96}.fast-analysis-report .result-container .detailed-analysis .analysis-card .analysis-card-content[data-v-110dde64]{font-size:14px;line-height:1.8;color:#595959;text-align:justify}.fast-analysis-report .result-container .analysis-details[data-v-110dde64]{display:grid;grid-template-columns:1fr 1fr;gap:20px;margin-bottom:20px}.fast-analysis-report .result-container .analysis-details .detail-section[data-v-110dde64]{background:#fff;border-radius:12px;padding:20px;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.06);box-shadow:0 2px 8px rgba(0,0,0,.06)}.fast-analysis-report .result-container .analysis-details .detail-section .section-title[data-v-110dde64]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:8px;font-size:16px;font-weight:600;margin-bottom:16px;color:#262626}.fast-analysis-report .result-container .analysis-details .detail-section .detail-list[data-v-110dde64]{list-style:none;padding:0;margin:0}.fast-analysis-report .result-container .analysis-details .detail-section .detail-list li[data-v-110dde64]{padding:10px 0;border-bottom:1px solid #f0f0f0;font-size:14px;line-height:1.6;color:#595959}.fast-analysis-report .result-container .analysis-details .detail-section .detail-list li[data-v-110dde64]:last-child{border-bottom:none}.fast-analysis-report .result-container .analysis-details .detail-section .detail-list li[data-v-110dde64]:before{content:"•";margin-right:8px;color:#1890ff}.fast-analysis-report .result-container .analysis-details .detail-section.reasons[data-v-110dde64]{border-left:4px solid #52c41a}.fast-analysis-report .result-container .analysis-details .detail-section.risks[data-v-110dde64]{border-left:4px solid #faad14}.fast-analysis-report .result-container .indicators-section[data-v-110dde64]{background:#fff;border-radius:12px;padding:20px;margin-bottom:20px;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.06);box-shadow:0 2px 8px rgba(0,0,0,.06)}.fast-analysis-report .result-container .indicators-section .section-title[data-v-110dde64]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:8px;font-size:16px;font-weight:600;margin-bottom:16px;color:#262626}.fast-analysis-report .result-container .indicators-section .section-title .anticon[data-v-110dde64]{color:#1890ff}.fast-analysis-report .result-container .indicators-section .indicators-grid[data-v-110dde64]{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:16px}.fast-analysis-report .result-container .indicators-section .indicators-grid .indicator-item[data-v-110dde64]{background:#fafafa;border-radius:8px;padding:12px;text-align:center}.fast-analysis-report .result-container .indicators-section .indicators-grid .indicator-item .indicator-name[data-v-110dde64]{font-size:12px;color:#8c8c8c;margin-bottom:8px}.fast-analysis-report .result-container .indicators-section .indicators-grid .indicator-item .indicator-value[data-v-110dde64]{font-size:16px;font-weight:600;color:#262626}.fast-analysis-report .result-container .indicators-section .indicators-grid .indicator-item .indicator-value.bullish[data-v-110dde64],.fast-analysis-report .result-container .indicators-section .indicators-grid .indicator-item .indicator-value.oversold[data-v-110dde64]{color:#52c41a}.fast-analysis-report .result-container .indicators-section .indicators-grid .indicator-item .indicator-value.bearish[data-v-110dde64],.fast-analysis-report .result-container .indicators-section .indicators-grid .indicator-item .indicator-value.high-volatility[data-v-110dde64],.fast-analysis-report .result-container .indicators-section .indicators-grid .indicator-item .indicator-value.overbought[data-v-110dde64]{color:#ff4d4f}.fast-analysis-report .result-container .indicators-section .indicators-grid .indicator-item .indicator-value.low-volatility[data-v-110dde64]{color:#52c41a}.fast-analysis-report .result-container .indicators-section .indicators-grid .indicator-item .indicator-signal[data-v-110dde64]{font-size:11px;color:#8c8c8c;margin-top:4px;text-transform:capitalize}.fast-analysis-report .result-container .feedback-section[data-v-110dde64]{background:#fff;border-radius:12px;padding:20px;text-align:center;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.06);box-shadow:0 2px 8px rgba(0,0,0,.06)}.fast-analysis-report .result-container .feedback-section .feedback-question[data-v-110dde64]{font-size:14px;color:#595959;margin-bottom:12px}.fast-analysis-report .result-container .feedback-section .feedback-buttons[data-v-110dde64]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;gap:16px;margin-bottom:16px}.fast-analysis-report .result-container .feedback-section .feedback-buttons .ant-btn[data-v-110dde64]{min-width:100px}.fast-analysis-report .result-container .feedback-section .analysis-meta[data-v-110dde64]{font-size:12px;color:#8c8c8c;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;gap:16px}@media (max-width:992px){.fast-analysis-report .price-info-row[data-v-110dde64],.fast-analysis-report .scores-row[data-v-110dde64]{grid-template-columns:repeat(2,1fr)}.fast-analysis-report .analysis-details[data-v-110dde64]{grid-template-columns:1fr}}@media (max-width:576px){.fast-analysis-report[data-v-110dde64]{padding:12px}.fast-analysis-report .price-info-row[data-v-110dde64],.fast-analysis-report .scores-row[data-v-110dde64]{grid-template-columns:1fr}.fast-analysis-report .decision-card[data-v-110dde64]{padding:16px}.fast-analysis-report .decision-card .decision-main[data-v-110dde64]{gap:16px;text-align:center}.fast-analysis-report .decision-card .decision-main .decision-badge[data-v-110dde64],.fast-analysis-report .decision-card .decision-main[data-v-110dde64]{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.fast-analysis-report .decision-card .decision-main .decision-badge .decision-text[data-v-110dde64]{font-size:28px}}.fast-analysis-report.theme-dark[data-v-110dde64]{background:linear-gradient(135deg,#1e222d,#131722)}.fast-analysis-report.theme-dark .loading-content .loading-text[data-v-110dde64]{color:#00e5ff}.fast-analysis-report.theme-dark .empty-content .empty-title[data-v-110dde64]{color:#d1d4dc}.fast-analysis-report.theme-dark .decision-card[data-v-110dde64]{background:#2a2e39;border-left-color:#1890ff}.fast-analysis-report.theme-dark .decision-card.decision-buy[data-v-110dde64]{background:linear-gradient(135deg,rgba(82,196,26,.1),#2a2e39)}.fast-analysis-report.theme-dark .decision-card.decision-sell[data-v-110dde64]{background:linear-gradient(135deg,rgba(255,77,79,.1),#2a2e39)}.fast-analysis-report.theme-dark .decision-card.decision-hold[data-v-110dde64]{background:linear-gradient(135deg,rgba(250,173,20,.1),#2a2e39)}.fast-analysis-report.theme-dark .decision-card .decision-summary[data-v-110dde64]{color:#868993;border-top-color:#363c4e}.fast-analysis-report.theme-dark .detailed-analysis .analysis-card[data-v-110dde64]{background:linear-gradient(135deg,#2a2e39,#1e222d)}.fast-analysis-report.theme-dark .detailed-analysis .analysis-card.technical[data-v-110dde64]{border-left-color:#1890ff}.fast-analysis-report.theme-dark .detailed-analysis .analysis-card.fundamental[data-v-110dde64]{border-left-color:#722ed1}.fast-analysis-report.theme-dark .detailed-analysis .analysis-card.sentiment[data-v-110dde64]{border-left-color:#eb2f96}.fast-analysis-report.theme-dark .detailed-analysis .analysis-card .analysis-card-header[data-v-110dde64]{color:#d1d4dc}.fast-analysis-report.theme-dark .detailed-analysis .analysis-card .analysis-card-content[data-v-110dde64]{color:#868993}.fast-analysis-report.theme-dark .detail-section[data-v-110dde64],.fast-analysis-report.theme-dark .feedback-section[data-v-110dde64],.fast-analysis-report.theme-dark .indicators-section[data-v-110dde64],.fast-analysis-report.theme-dark .price-card[data-v-110dde64],.fast-analysis-report.theme-dark .score-item[data-v-110dde64]{background:#2a2e39;color:#d1d4dc}.fast-analysis-report.theme-dark .detail-section .analysis-meta[data-v-110dde64],.fast-analysis-report.theme-dark .detail-section .feedback-question[data-v-110dde64],.fast-analysis-report.theme-dark .detail-section .indicator-name[data-v-110dde64],.fast-analysis-report.theme-dark .detail-section .indicator-signal[data-v-110dde64],.fast-analysis-report.theme-dark .detail-section .price-label[data-v-110dde64],.fast-analysis-report.theme-dark .detail-section .score-header[data-v-110dde64],.fast-analysis-report.theme-dark .detail-section .section-title[data-v-110dde64],.fast-analysis-report.theme-dark .feedback-section .analysis-meta[data-v-110dde64],.fast-analysis-report.theme-dark .feedback-section .feedback-question[data-v-110dde64],.fast-analysis-report.theme-dark .feedback-section .indicator-name[data-v-110dde64],.fast-analysis-report.theme-dark .feedback-section .indicator-signal[data-v-110dde64],.fast-analysis-report.theme-dark .feedback-section .price-label[data-v-110dde64],.fast-analysis-report.theme-dark .feedback-section .score-header[data-v-110dde64],.fast-analysis-report.theme-dark .feedback-section .section-title[data-v-110dde64],.fast-analysis-report.theme-dark .indicators-section .analysis-meta[data-v-110dde64],.fast-analysis-report.theme-dark .indicators-section .feedback-question[data-v-110dde64],.fast-analysis-report.theme-dark .indicators-section .indicator-name[data-v-110dde64],.fast-analysis-report.theme-dark .indicators-section .indicator-signal[data-v-110dde64],.fast-analysis-report.theme-dark .indicators-section .price-label[data-v-110dde64],.fast-analysis-report.theme-dark .indicators-section .score-header[data-v-110dde64],.fast-analysis-report.theme-dark .indicators-section .section-title[data-v-110dde64],.fast-analysis-report.theme-dark .price-card .analysis-meta[data-v-110dde64],.fast-analysis-report.theme-dark .price-card .feedback-question[data-v-110dde64],.fast-analysis-report.theme-dark .price-card .indicator-name[data-v-110dde64],.fast-analysis-report.theme-dark .price-card .indicator-signal[data-v-110dde64],.fast-analysis-report.theme-dark .price-card .price-label[data-v-110dde64],.fast-analysis-report.theme-dark .price-card .score-header[data-v-110dde64],.fast-analysis-report.theme-dark .price-card .section-title[data-v-110dde64],.fast-analysis-report.theme-dark .score-item .analysis-meta[data-v-110dde64],.fast-analysis-report.theme-dark .score-item .feedback-question[data-v-110dde64],.fast-analysis-report.theme-dark .score-item .indicator-name[data-v-110dde64],.fast-analysis-report.theme-dark .score-item .indicator-signal[data-v-110dde64],.fast-analysis-report.theme-dark .score-item .price-label[data-v-110dde64],.fast-analysis-report.theme-dark .score-item .score-header[data-v-110dde64],.fast-analysis-report.theme-dark .score-item .section-title[data-v-110dde64]{color:#868993}.fast-analysis-report.theme-dark .detail-section .indicator-value[data-v-110dde64],.fast-analysis-report.theme-dark .detail-section .price-value[data-v-110dde64],.fast-analysis-report.theme-dark .detail-section .score-value[data-v-110dde64],.fast-analysis-report.theme-dark .feedback-section .indicator-value[data-v-110dde64],.fast-analysis-report.theme-dark .feedback-section .price-value[data-v-110dde64],.fast-analysis-report.theme-dark .feedback-section .score-value[data-v-110dde64],.fast-analysis-report.theme-dark .indicators-section .indicator-value[data-v-110dde64],.fast-analysis-report.theme-dark .indicators-section .price-value[data-v-110dde64],.fast-analysis-report.theme-dark .indicators-section .score-value[data-v-110dde64],.fast-analysis-report.theme-dark .price-card .indicator-value[data-v-110dde64],.fast-analysis-report.theme-dark .price-card .price-value[data-v-110dde64],.fast-analysis-report.theme-dark .price-card .score-value[data-v-110dde64],.fast-analysis-report.theme-dark .score-item .indicator-value[data-v-110dde64],.fast-analysis-report.theme-dark .score-item .price-value[data-v-110dde64],.fast-analysis-report.theme-dark .score-item .score-value[data-v-110dde64]{color:#d1d4dc}.fast-analysis-report.theme-dark .score-item.overall[data-v-110dde64]{background:linear-gradient(135deg,rgba(24,144,255,.1),#2a2e39);border-color:#1890ff}.fast-analysis-report.theme-dark .detail-list li[data-v-110dde64]{color:#868993;border-bottom-color:#363c4e}.fast-analysis-report.theme-dark .indicators-grid .indicator-item[data-v-110dde64]{background:#363c4e}.ai-analysis-container[data-v-76a3e064]{display:-webkit-box;display:-ms-flexbox;display:flex;height:calc(100vh - 120px);background:#f0f2f5;overflow:hidden;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.ai-analysis-container.embedded[data-v-76a3e064]{height:auto;min-height:700px;background:transparent}.ai-analysis-container.embedded .main-content-full[data-v-76a3e064]{-webkit-box-shadow:none;box-shadow:none;border-radius:0}.main-content-full[data-v-76a3e064]{-webkit-box-flex:1;-ms-flex:1;flex:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;overflow:hidden;background:#fff;border-radius:12px;height:100%;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.08);box-shadow:0 2px 8px rgba(0,0,0,.08);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.top-index-bar[data-v-76a3e064]{gap:8px;padding:8px 16px;background:#f8fafc;border-bottom:1px solid #e2e8f0;font-family:SF Mono,Monaco,Consolas,monospace}.top-index-bar .indicator-box[data-v-76a3e064],.top-index-bar[data-v-76a3e064]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.top-index-bar .indicator-box[data-v-76a3e064]{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding:4px 10px;background:#fff;border-radius:6px;border:1px solid #e2e8f0;min-width:50px}.top-index-bar .indicator-box .ind-label[data-v-76a3e064]{font-size:9px;color:#94a3b8;text-transform:uppercase}.top-index-bar .indicator-box .ind-value[data-v-76a3e064]{font-size:13px;font-weight:700;color:#1e293b}.top-index-bar .indicator-box.fear-greed.extreme-fear .ind-value[data-v-76a3e064]{color:#dc2626}.top-index-bar .indicator-box.fear-greed.fear .ind-value[data-v-76a3e064]{color:#ea580c}.top-index-bar .indicator-box.fear-greed.neutral .ind-value[data-v-76a3e064]{color:#ca8a04}.top-index-bar .indicator-box.fear-greed.greed .ind-value[data-v-76a3e064]{color:#65a30d}.top-index-bar .indicator-box.fear-greed.extreme-greed .ind-value[data-v-76a3e064],.top-index-bar .indicator-box.vix.low .ind-value[data-v-76a3e064]{color:#16a34a}.top-index-bar .indicator-box.vix.medium .ind-value[data-v-76a3e064]{color:#ca8a04}.top-index-bar .indicator-box.vix.high .ind-value[data-v-76a3e064]{color:#dc2626}.top-index-bar .indicator-box.dxy .ind-value[data-v-76a3e064]{color:#2563eb}.top-index-bar .indices-marquee[data-v-76a3e064]{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:hidden;min-width:0}.top-index-bar .indices-marquee .marquee-track[data-v-76a3e064]{display:-webkit-box;display:-ms-flexbox;display:flex;gap:8px;-webkit-animation:marquee-76a3e064 35s linear infinite;animation:marquee-76a3e064 35s linear infinite;width:-webkit-max-content;width:-moz-max-content;width:max-content}.top-index-bar .indices-marquee .marquee-track[data-v-76a3e064]:hover{-webkit-animation-play-state:paused;animation-play-state:paused}.top-index-bar .indices-marquee .index-item[data-v-76a3e064]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:4px;padding:4px 8px;background:#fff;border-radius:4px;border:1px solid #e2e8f0;font-size:11px;white-space:nowrap}.top-index-bar .indices-marquee .index-item .idx-flag[data-v-76a3e064]{font-size:11px}.top-index-bar .indices-marquee .index-item .idx-symbol[data-v-76a3e064]{color:#64748b;font-weight:500}.top-index-bar .indices-marquee .index-item .idx-price[data-v-76a3e064]{color:#1e293b;font-weight:600}.top-index-bar .indices-marquee .index-item .idx-change[data-v-76a3e064]{font-weight:600;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:1px}.top-index-bar .indices-marquee .index-item .idx-change.up[data-v-76a3e064]{color:#16a34a}.top-index-bar .indices-marquee .index-item .idx-change.down[data-v-76a3e064]{color:#dc2626}@-webkit-keyframes marquee-76a3e064{0%{-webkit-transform:translateX(0);transform:translateX(0)}to{-webkit-transform:translateX(-50%);transform:translateX(-50%)}}@keyframes marquee-76a3e064{0%{-webkit-transform:translateX(0);transform:translateX(0)}to{-webkit-transform:translateX(-50%);transform:translateX(-50%)}}.top-index-bar .refresh-btn[data-v-76a3e064]{color:#94a3b8;-ms-flex-negative:0;flex-shrink:0}.top-index-bar .refresh-btn[data-v-76a3e064]:hover{color:#1e293b}.main-body[data-v-76a3e064]{-webkit-box-flex:1;-ms-flex:1;flex:1;padding:12px;overflow:hidden;min-height:0}.left-panel[data-v-76a3e064],.main-body[data-v-76a3e064]{display:-webkit-box;display:-ms-flexbox;display:flex;gap:12px}.left-panel[data-v-76a3e064]{width:280px;-ms-flex-negative:0;flex-shrink:0;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;overflow-y:auto}.left-panel .heatmap-box[data-v-76a3e064]{background:#fff;border-radius:8px;padding:12px;border:1px solid #e2e8f0}.left-panel .heatmap-box .box-header[data-v-76a3e064]{margin-bottom:10px}.left-panel .heatmap-box .box-header[data-v-76a3e064] .ant-radio-group .ant-radio-button-wrapper{font-size:10px;padding:0 6px;height:22px;line-height:20px}.left-panel .heatmap-box .box-header[data-v-76a3e064] .ant-radio-group .ant-radio-button-wrapper.ant-radio-button-wrapper-checked{background:var(--primary-color,#1890ff);border-color:var(--primary-color,#1890ff);color:#fff}.left-panel .heatmap-box .heatmap-grid[data-v-76a3e064]{display:grid;grid-template-columns:repeat(3,1fr);gap:4px}.left-panel .heatmap-box .heatmap-grid .heat-cell[data-v-76a3e064]{padding:6px 4px;border-radius:4px;text-align:center;font-size:9px}.left-panel .heatmap-box .heatmap-grid .heat-cell .heat-name[data-v-76a3e064]{display:block;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-bottom:1px}.left-panel .heatmap-box .heatmap-grid .heat-cell .heat-price[data-v-76a3e064]{display:block;font-size:9px;opacity:.8;margin-bottom:1px}.left-panel .heatmap-box .heatmap-grid .heat-cell .heat-val[data-v-76a3e064]{font-weight:700;font-size:10px}.left-panel .calendar-box[data-v-76a3e064]{-webkit-box-flex:1;-ms-flex:1;flex:1;background:#fff;border-radius:8px;padding:12px;border:1px solid #e2e8f0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;min-height:0;overflow:hidden}.left-panel .calendar-box .box-header[data-v-76a3e064]{margin-bottom:8px}.left-panel .calendar-box .box-header .box-title[data-v-76a3e064]{font-size:12px;color:#64748b;font-weight:600}.left-panel .calendar-box .box-header .box-title .anticon[data-v-76a3e064]{margin-right:6px;color:var(--primary-color,#1890ff)}.left-panel .calendar-box .calendar-list[data-v-76a3e064]{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow-y:auto}.left-panel .calendar-box .calendar-list[data-v-76a3e064]::-webkit-scrollbar{width:4px}.left-panel .calendar-box .calendar-list[data-v-76a3e064]::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:2px}.left-panel .calendar-box .calendar-list .cal-item[data-v-76a3e064]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:6px;padding:6px 0;border-bottom:1px solid #f1f5f9;font-size:10px}.left-panel .calendar-box .calendar-list .cal-item[data-v-76a3e064]:last-child{border-bottom:none}.left-panel .calendar-box .calendar-list .cal-item.high[data-v-76a3e064]{border-left:3px solid #dc2626;padding-left:8px;margin-left:-4px}.left-panel .calendar-box .calendar-list .cal-item.medium[data-v-76a3e064]{border-left:3px solid #ca8a04;padding-left:8px;margin-left:-4px}.left-panel .calendar-box .calendar-list .cal-item.low[data-v-76a3e064]{border-left:3px solid #16a34a;padding-left:8px;margin-left:-4px}.left-panel .calendar-box .calendar-list .cal-item .cal-date[data-v-76a3e064]{font-size:9px;color:#94a3b8;min-width:32px;font-weight:500}.left-panel .calendar-box .calendar-list .cal-item .cal-time[data-v-76a3e064]{color:#64748b;min-width:36px;font-weight:500}.left-panel .calendar-box .calendar-list .cal-item .cal-flag[data-v-76a3e064]{font-size:12px}.left-panel .calendar-box .calendar-list .cal-item .cal-name[data-v-76a3e064]{-webkit-box-flex:1;-ms-flex:1;flex:1;color:#334155;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.left-panel .calendar-box .calendar-list .cal-item .cal-impact[data-v-76a3e064]{font-weight:600;font-size:10px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:2px}.left-panel .calendar-box .calendar-list .cal-item .cal-impact.bullish[data-v-76a3e064]{color:#16a34a}.left-panel .calendar-box .calendar-list .cal-item .cal-impact.bearish[data-v-76a3e064]{color:#dc2626}.left-panel .calendar-box .calendar-list .cal-item .cal-impact.neutral[data-v-76a3e064]{color:#94a3b8}.left-panel .calendar-box .calendar-list .cal-empty[data-v-76a3e064]{text-align:center;color:#94a3b8;padding:20px 0;font-size:12px}.right-panel[data-v-76a3e064]{-webkit-box-flex:1;-ms-flex:1;flex:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;min-width:0;overflow:hidden;background:#fff;border-radius:8px;border:1px solid #e2e8f0}.right-panel .analysis-toolbar[data-v-76a3e064]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:12px;padding:12px 16px;border-bottom:1px solid #f1f5f9;background:#fafafa;border-radius:8px 8px 0 0}.right-panel .analysis-toolbar .symbol-selector[data-v-76a3e064]{-webkit-box-flex:1;-ms-flex:1;flex:1;max-width:320px}.right-panel .analysis-toolbar .analyze-button[data-v-76a3e064]{background:var(--primary-color,#1890ff);border-color:var(--primary-color,#1890ff)}.right-panel .analysis-toolbar .history-button[data-v-76a3e064]{border-color:#d9d9d9}.right-panel .analysis-main[data-v-76a3e064]{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:auto;padding:16px;min-height:0}.right-panel .analysis-main .analysis-placeholder[data-v-76a3e064]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;height:100%;min-height:300px}.right-panel .analysis-main .analysis-placeholder .placeholder-content[data-v-76a3e064]{text-align:center}.right-panel .analysis-main .analysis-placeholder .placeholder-content .placeholder-icon[data-v-76a3e064]{font-size:72px;color:var(--primary-color,#1890ff);opacity:.5;margin-bottom:20px}.right-panel .analysis-main .analysis-placeholder .placeholder-content h3[data-v-76a3e064]{font-size:18px;color:#1e293b;margin-bottom:8px}.right-panel .analysis-main .analysis-placeholder .placeholder-content p[data-v-76a3e064]{font-size:14px;color:#64748b}.watchlist-panel[data-v-76a3e064]{width:200px;-ms-flex-negative:0;flex-shrink:0;background:#fff;border-radius:8px;border:1px solid #e2e8f0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;overflow:hidden}.watchlist-panel .panel-header[data-v-76a3e064]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:10px 12px;border-bottom:1px solid #f1f5f9;background:#fafafa}.watchlist-panel .panel-header .panel-title[data-v-76a3e064]{font-size:12px;font-weight:600;color:#64748b}.watchlist-panel .panel-header .panel-title .anticon[data-v-76a3e064]{color:#facc15;margin-right:6px}.watchlist-panel .watchlist-list[data-v-76a3e064]{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow-y:auto;padding:8px}.watchlist-panel .watchlist-list[data-v-76a3e064]::-webkit-scrollbar{width:4px}.watchlist-panel .watchlist-list[data-v-76a3e064]::-webkit-scrollbar-thumb{background:#e2e8f0;border-radius:2px}.watchlist-panel .watchlist-list .watchlist-item[data-v-76a3e064]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:8px 10px;border-radius:6px;cursor:pointer;-webkit-transition:all .2s;transition:all .2s;margin-bottom:4px}.watchlist-panel .watchlist-list .watchlist-item[data-v-76a3e064]:hover{background:#f8fafc}.watchlist-panel .watchlist-list .watchlist-item.active[data-v-76a3e064]{background:#e6f7ff;border:1px solid #91d5ff}.watchlist-panel .watchlist-list .watchlist-item .item-main[data-v-76a3e064]{-webkit-box-flex:1;-ms-flex:1;flex:1;min-width:0}.watchlist-panel .watchlist-list .watchlist-item .item-main .item-symbol[data-v-76a3e064]{display:block;font-size:12px;font-weight:600;color:#1e293b}.watchlist-panel .watchlist-list .watchlist-item .item-main .item-name[data-v-76a3e064]{display:block;font-size:10px;color:#94a3b8;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.watchlist-panel .watchlist-list .watchlist-item .item-price[data-v-76a3e064]{text-align:right;margin-right:8px;font-family:SF Mono,Monaco,monospace}.watchlist-panel .watchlist-list .watchlist-item .item-price .price-value[data-v-76a3e064]{display:block;font-size:11px;font-weight:600;color:#1e293b}.watchlist-panel .watchlist-list .watchlist-item .item-price .price-change[data-v-76a3e064]{display:block;font-size:10px;font-weight:600}.watchlist-panel .watchlist-list .watchlist-item .item-price .price-change.up[data-v-76a3e064]{color:#16a34a}.watchlist-panel .watchlist-list .watchlist-item .item-price .price-change.down[data-v-76a3e064]{color:#dc2626}.watchlist-panel .watchlist-list .watchlist-item .item-remove[data-v-76a3e064]{color:#cbd5e1;font-size:12px;opacity:0;-webkit-transition:opacity .2s;transition:opacity .2s}.watchlist-panel .watchlist-list .watchlist-item .item-remove[data-v-76a3e064]:hover{color:#dc2626}.watchlist-panel .watchlist-list .watchlist-item:hover .item-remove[data-v-76a3e064]{opacity:1}.watchlist-panel .watchlist-list .watchlist-empty[data-v-76a3e064]{text-align:center;padding:24px 12px;color:#94a3b8}.watchlist-panel .watchlist-list .watchlist-empty .anticon[data-v-76a3e064]{font-size:32px;margin-bottom:8px;display:block}.watchlist-panel .watchlist-list .watchlist-empty p[data-v-76a3e064]{font-size:12px;margin-bottom:12px}@-webkit-keyframes pulse-76a3e064{0%,to{opacity:1}50%{opacity:.5}}@keyframes pulse-76a3e064{0%,to{opacity:1}50%{opacity:.5}}@media (max-width:992px){.ai-analysis-container[data-v-76a3e064]{height:auto;min-height:calc(100vh - 64px);overflow-y:auto}.main-content-full[data-v-76a3e064]{height:auto;min-height:auto}.top-index-bar[data-v-76a3e064]{-ms-flex-wrap:wrap;flex-wrap:wrap;padding:8px}.top-index-bar .indicator-box[data-v-76a3e064]{min-width:45px;padding:3px 6px}.top-index-bar .indices-marquee[data-v-76a3e064]{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10;width:100%;margin-top:8px}.main-body[data-v-76a3e064]{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding:12px}.left-panel[data-v-76a3e064]{width:100%;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;gap:12px}.left-panel .calendar-box[data-v-76a3e064],.left-panel .heatmap-box[data-v-76a3e064]{-webkit-box-flex:1;-ms-flex:1;flex:1;min-width:0}.left-panel .calendar-box[data-v-76a3e064]{max-height:200px}.right-panel .analysis-toolbar[data-v-76a3e064]{-ms-flex-wrap:wrap;flex-wrap:wrap}.right-panel .analysis-toolbar .symbol-selector[data-v-76a3e064]{width:100%!important;max-width:none!important}.right-panel .analysis-toolbar .analyze-button[data-v-76a3e064],.right-panel .analysis-toolbar .history-button[data-v-76a3e064]{-webkit-box-flex:1;-ms-flex:1;flex:1}.watchlist-panel[data-v-76a3e064]{width:100%;max-height:200px;-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}}.ai-analysis-container.theme-dark[data-v-76a3e064]{background:#131722;color:#d1d4dc}.ai-analysis-container.theme-dark .main-content-full[data-v-76a3e064]{background:#1e222d;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.3);box-shadow:0 2px 8px rgba(0,0,0,.3)}.ai-analysis-container.theme-dark .top-index-bar[data-v-76a3e064]{background:#1e222d;border-bottom-color:#363c4e}.ai-analysis-container.theme-dark .top-index-bar .indicator-box[data-v-76a3e064]{background:#2a2e39;border-color:#363c4e}.ai-analysis-container.theme-dark .top-index-bar .indicator-box .ind-label[data-v-76a3e064]{color:#868993}.ai-analysis-container.theme-dark .top-index-bar .indicator-box .ind-value[data-v-76a3e064]{color:#d1d4dc}.ai-analysis-container.theme-dark .top-index-bar .indices-marquee .index-item[data-v-76a3e064]{background:#2a2e39;border-color:#363c4e}.ai-analysis-container.theme-dark .top-index-bar .indices-marquee .index-item .idx-symbol[data-v-76a3e064]{color:#868993}.ai-analysis-container.theme-dark .top-index-bar .indices-marquee .index-item .idx-price[data-v-76a3e064]{color:#d1d4dc}.ai-analysis-container.theme-dark .top-index-bar .refresh-btn[data-v-76a3e064]{color:#868993}.ai-analysis-container.theme-dark .top-index-bar .refresh-btn[data-v-76a3e064]:hover{color:#d1d4dc}.ai-analysis-container.theme-dark .watchlist-panel[data-v-76a3e064]{background:#2a2e39;border-color:#363c4e}.ai-analysis-container.theme-dark .watchlist-panel .panel-header[data-v-76a3e064]{background:#1e222d;border-bottom-color:#363c4e}.ai-analysis-container.theme-dark .watchlist-panel .panel-header .panel-title[data-v-76a3e064]{color:#868993}.ai-analysis-container.theme-dark .watchlist-panel .watchlist-list .watchlist-item[data-v-76a3e064]:hover{background:#363c4e}.ai-analysis-container.theme-dark .watchlist-panel .watchlist-list .watchlist-item.active[data-v-76a3e064]{background:rgba(24,144,255,.1);border-color:#1890ff}.ai-analysis-container.theme-dark .watchlist-panel .watchlist-list .watchlist-item .item-main .item-symbol[data-v-76a3e064]{color:#d1d4dc}.ai-analysis-container.theme-dark .watchlist-panel .watchlist-list .watchlist-item .item-main .item-name[data-v-76a3e064]{color:#64748b}.ai-analysis-container.theme-dark .watchlist-panel .watchlist-list .watchlist-item .item-price .price-value[data-v-76a3e064]{color:#d1d4dc}.ai-analysis-container.theme-dark .watchlist-panel .watchlist-list .watchlist-empty[data-v-76a3e064]{color:#64748b}.ai-analysis-container.theme-dark .watchlist-bar-legacy[data-v-76a3e064]{background:#1e222d;border-bottom-color:#363c4e}.ai-analysis-container.theme-dark .watchlist-bar-legacy .stock-chip[data-v-76a3e064]{background:#2a2e39;border-color:#363c4e}.ai-analysis-container.theme-dark .watchlist-bar-legacy .stock-chip.active[data-v-76a3e064],.ai-analysis-container.theme-dark .watchlist-bar-legacy .stock-chip[data-v-76a3e064]:hover{border-color:var(--primary-color,#1890ff);background:rgba(24,144,255,.1)}.ai-analysis-container.theme-dark .watchlist-bar-legacy .stock-chip .chip-symbol[data-v-76a3e064]{color:#d1d4dc}.ai-analysis-container.theme-dark .watchlist-bar-legacy .stock-chip .chip-price[data-v-76a3e064]{color:#868993}.ai-analysis-container.theme-dark .left-panel .heatmap-box[data-v-76a3e064]{background:#2a2e39;border-color:#363c4e}.ai-analysis-container.theme-dark .left-panel .heatmap-box[data-v-76a3e064] .ant-radio-group .ant-radio-button-wrapper{background:#1e222d;border-color:#363c4e;color:#868993}.ai-analysis-container.theme-dark .left-panel .heatmap-box[data-v-76a3e064] .ant-radio-group .ant-radio-button-wrapper:hover{color:#d1d4dc}.ai-analysis-container.theme-dark .left-panel .calendar-box[data-v-76a3e064]{background:#2a2e39;border-color:#363c4e}.ai-analysis-container.theme-dark .left-panel .calendar-box .box-title[data-v-76a3e064]{color:#868993}.ai-analysis-container.theme-dark .left-panel .calendar-box .cal-item[data-v-76a3e064]{border-bottom-color:#363c4e}.ai-analysis-container.theme-dark .left-panel .calendar-box .cal-item .cal-date[data-v-76a3e064]{color:#64748b}.ai-analysis-container.theme-dark .left-panel .calendar-box .cal-item .cal-time[data-v-76a3e064]{color:#868993}.ai-analysis-container.theme-dark .left-panel .calendar-box .cal-item .cal-name[data-v-76a3e064]{color:#d1d4dc}.ai-analysis-container.theme-dark .left-panel .calendar-box .cal-empty[data-v-76a3e064]{color:#64748b}.ai-analysis-container.theme-dark .right-panel[data-v-76a3e064]{background:#2a2e39;border-color:#363c4e}.ai-analysis-container.theme-dark .right-panel .analysis-toolbar[data-v-76a3e064]{background:#1e222d;border-bottom-color:#363c4e}.ai-analysis-container.theme-dark .right-panel .analysis-toolbar .history-button[data-v-76a3e064]{background:#2a2e39;border-color:#363c4e;color:#d1d4dc}.ai-analysis-container.theme-dark .right-panel .analysis-main .analysis-placeholder .placeholder-content h3[data-v-76a3e064]{color:#d1d4dc}.ai-analysis-container.theme-dark .right-panel .analysis-main .analysis-placeholder .placeholder-content p[data-v-76a3e064]{color:#868993}.ai-analysis-container.theme-dark .watchlist-bar-compat[data-v-76a3e064]{background:#1e222d;border-top-color:#363c4e}.ai-analysis-container.theme-dark .watchlist-bar-compat .bar-label[data-v-76a3e064]{color:#868993}.ai-analysis-container.theme-dark .watchlist-bar-compat .stock-chip[data-v-76a3e064]{background:#2a2e39;border-color:#363c4e}.ai-analysis-container.theme-dark .watchlist-bar-compat .stock-chip.active[data-v-76a3e064],.ai-analysis-container.theme-dark .watchlist-bar-compat .stock-chip[data-v-76a3e064]:hover{border-color:var(--primary-color,#1890ff);background:rgba(24,144,255,.1)}.ai-analysis-container.theme-dark .watchlist-bar-compat .stock-chip .chip-symbol[data-v-76a3e064]{color:#d1d4dc}.ai-analysis-container.theme-dark .watchlist-bar-compat .stock-chip .chip-price[data-v-76a3e064]{color:#868993}.ai-analysis-container.theme-dark .watchlist-bar-compat .stock-chip .chip-remove[data-v-76a3e064]{color:#64748b}.ai-analysis-container.theme-dark[data-v-76a3e064] .symbol-selector .ant-select-selection{background-color:#2a2e39;border-color:#363c4e;color:#d1d4dc}.add-stock-modal-content .market-tabs[data-v-76a3e064]{margin-bottom:16px}.add-stock-modal-content .hot-symbols-section[data-v-76a3e064],.add-stock-modal-content .search-results-section[data-v-76a3e064],.add-stock-modal-content .symbol-search-section[data-v-76a3e064]{margin-bottom:24px}.add-stock-modal-content .hot-symbols-section .section-title[data-v-76a3e064],.add-stock-modal-content .search-results-section .section-title[data-v-76a3e064]{font-size:14px;font-weight:600;color:#262626;margin-bottom:12px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.add-stock-modal-content .symbol-list[data-v-76a3e064]{max-height:200px;overflow-y:auto;border:1px solid #e8e8e8;border-radius:4px}.add-stock-modal-content .symbol-list .symbol-list-item[data-v-76a3e064]{cursor:pointer;padding:8px 12px;-webkit-transition:background-color .3s;transition:background-color .3s}.add-stock-modal-content .symbol-list .symbol-list-item[data-v-76a3e064]:hover{background-color:#f5f5f5}.add-stock-modal-content .symbol-list .symbol-list-item .symbol-item-content[data-v-76a3e064]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:8px}.add-stock-modal-content .symbol-list .symbol-list-item .symbol-item-content .symbol-code[data-v-76a3e064]{font-weight:600;color:#262626;min-width:80px}.add-stock-modal-content .symbol-list .symbol-list-item .symbol-item-content .symbol-name[data-v-76a3e064]{color:#595959;-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.add-stock-modal-content .selected-symbol-section[data-v-76a3e064]{margin-top:16px}.add-stock-modal-content .selected-symbol-section .selected-symbol-info[data-v-76a3e064]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.skeleton-box .skeleton-text[data-v-76a3e064]{display:block;height:12px;background:-webkit-gradient(linear,left top,right top,color-stop(25%,#e2e8f0),color-stop(50%,#f1f5f9),color-stop(75%,#e2e8f0));background:linear-gradient(90deg,#e2e8f0 25%,#f1f5f9 50%,#e2e8f0 75%);background-size:200% 100%;-webkit-animation:skeleton-pulse-76a3e064 1.5s ease-in-out infinite;animation:skeleton-pulse-76a3e064 1.5s ease-in-out infinite;border-radius:4px;margin:3px 0}.skeleton-box .skeleton-text.short[data-v-76a3e064]{width:40px;height:9px}.skeleton-cell[data-v-76a3e064]{background:#f8fafc!important;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding:8px 4px}.skeleton-cell .skeleton-text[data-v-76a3e064]{width:80%;height:10px;background:-webkit-gradient(linear,left top,right top,color-stop(25%,#e2e8f0),color-stop(50%,#f1f5f9),color-stop(75%,#e2e8f0));background:linear-gradient(90deg,#e2e8f0 25%,#f1f5f9 50%,#e2e8f0 75%);background-size:200% 100%;-webkit-animation:skeleton-pulse-76a3e064 1.5s ease-in-out infinite;animation:skeleton-pulse-76a3e064 1.5s ease-in-out infinite;border-radius:3px;margin:2px 0}.skeleton-cell .skeleton-text.short[data-v-76a3e064]{width:50%;height:8px}.skeleton-item[data-v-76a3e064]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:8px;padding:6px 0}.skeleton-item .skeleton-text[data-v-76a3e064]{height:12px;background:-webkit-gradient(linear,left top,right top,color-stop(25%,#e2e8f0),color-stop(50%,#f1f5f9),color-stop(75%,#e2e8f0));background:linear-gradient(90deg,#e2e8f0 25%,#f1f5f9 50%,#e2e8f0 75%);background-size:200% 100%;-webkit-animation:skeleton-pulse-76a3e064 1.5s ease-in-out infinite;animation:skeleton-pulse-76a3e064 1.5s ease-in-out infinite;border-radius:4px;-webkit-box-flex:1;-ms-flex:1;flex:1}.skeleton-item .skeleton-text.short[data-v-76a3e064]{-webkit-box-flex:0;-ms-flex:none;flex:none;width:40px}.indices-empty[data-v-76a3e064],.indices-loading[data-v-76a3e064]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;height:100%;font-size:11px;color:#94a3b8;padding:4px 16px}.indices-loading .anticon[data-v-76a3e064]{margin-right:6px}.heatmap-empty[data-v-76a3e064]{grid-column:-1;text-align:center;padding:20px;color:#94a3b8;font-size:12px}@-webkit-keyframes skeleton-pulse-76a3e064{0%{background-position:200% 0}to{background-position:-200% 0}}@keyframes skeleton-pulse-76a3e064{0%{background-position:200% 0}to{background-position:-200% 0}}.theme-dark .skeleton-box .skeleton-text[data-v-76a3e064],.theme-dark .skeleton-cell .skeleton-text[data-v-76a3e064],.theme-dark .skeleton-item .skeleton-text[data-v-76a3e064]{background:-webkit-gradient(linear,left top,right top,color-stop(25%,#363c4e),color-stop(50%,#424857),color-stop(75%,#363c4e));background:linear-gradient(90deg,#363c4e 25%,#424857 50%,#363c4e 75%);background-size:200% 100%}.theme-dark .skeleton-cell[data-v-76a3e064]{background:#2a2e39!important}.theme-dark .heatmap-empty[data-v-76a3e064],.theme-dark .indices-empty[data-v-76a3e064],.theme-dark .indices-loading[data-v-76a3e064]{color:#64748b} \ No newline at end of file diff --git a/frontend/dist/css/893.23a4bc42.css b/frontend/dist/css/893.23a4bc42.css deleted file mode 100644 index 83b92f5..0000000 --- a/frontend/dist/css/893.23a4bc42.css +++ /dev/null @@ -1 +0,0 @@ -.fast-analysis-report[data-v-110dde64]{height:100%;overflow-y:auto;padding:20px;background:linear-gradient(135deg,#f5f7fa,#e4e8ec);border-radius:12px}.fast-analysis-report .loading-container[data-v-110dde64]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;min-height:400px;background:#fff;border-radius:12px}.fast-analysis-report .loading-container .loading-content-pro[data-v-110dde64]{width:100%;max-width:400px;padding:40px}.fast-analysis-report .loading-container .loading-content-pro .loading-header[data-v-110dde64]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;gap:12px;margin-bottom:32px}.fast-analysis-report .loading-container .loading-content-pro .loading-header .loading-icon-pro[data-v-110dde64]{font-size:28px;color:#1890ff}.fast-analysis-report .loading-container .loading-content-pro .loading-header .loading-title[data-v-110dde64]{font-size:20px;font-weight:600;color:#1e293b}.fast-analysis-report .loading-container .loading-content-pro .progress-wrapper[data-v-110dde64]{margin-bottom:24px;position:relative}.fast-analysis-report .loading-container .loading-content-pro .progress-wrapper .progress-text[data-v-110dde64]{position:absolute;right:0;top:-24px;font-size:14px;font-weight:600;color:#1890ff}.fast-analysis-report .loading-container .loading-content-pro .current-step[data-v-110dde64]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;gap:8px;padding:12px 20px;background:#f0f5ff;border-radius:8px;margin-bottom:24px;color:#1890ff;font-size:14px;font-weight:500}.fast-analysis-report .loading-container .loading-content-pro .current-step .anticon[data-v-110dde64]{font-size:16px}.fast-analysis-report .loading-container .loading-content-pro .steps-list[data-v-110dde64]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;gap:12px}.fast-analysis-report .loading-container .loading-content-pro .steps-list .step-item[data-v-110dde64]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:12px;padding:10px 16px;background:#f8fafc;border-radius:8px;font-size:13px;color:#94a3b8;-webkit-transition:all .3s;transition:all .3s}.fast-analysis-report .loading-container .loading-content-pro .steps-list .step-item .step-dot[data-v-110dde64]{width:8px;height:8px;border-radius:50%;background:#e2e8f0;-webkit-transition:all .3s;transition:all .3s}.fast-analysis-report .loading-container .loading-content-pro .steps-list .step-item .step-text[data-v-110dde64]{-webkit-box-flex:1;-ms-flex:1;flex:1}.fast-analysis-report .loading-container .loading-content-pro .steps-list .step-item .step-check[data-v-110dde64]{color:#52c41a;font-size:14px}.fast-analysis-report .loading-container .loading-content-pro .steps-list .step-item.active[data-v-110dde64]{background:#e6f7ff;color:#1890ff;font-weight:500}.fast-analysis-report .loading-container .loading-content-pro .steps-list .step-item.active .step-dot[data-v-110dde64]{background:#1890ff;-webkit-box-shadow:0 0 0 3px rgba(24,144,255,.2);box-shadow:0 0 0 3px rgba(24,144,255,.2)}.fast-analysis-report .loading-container .loading-content-pro .steps-list .step-item.done[data-v-110dde64]{background:#f6ffed;color:#52c41a}.fast-analysis-report .loading-container .loading-content-pro .steps-list .step-item.done .step-dot[data-v-110dde64]{background:#52c41a}.fast-analysis-report .loading-container .loading-content-pro .loading-footer[data-v-110dde64]{margin-top:24px;text-align:center}.fast-analysis-report .loading-container .loading-content-pro .loading-footer .elapsed-time[data-v-110dde64]{font-size:13px;color:#94a3b8;font-family:SF Mono,Monaco,monospace}.fast-analysis-report .empty-container[data-v-110dde64]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;min-height:400px}.fast-analysis-report .empty-container .empty-content[data-v-110dde64]{text-align:center}.fast-analysis-report .empty-container .empty-content .empty-icon[data-v-110dde64]{font-size:64px;color:#d9d9d9}.fast-analysis-report .empty-container .empty-content .empty-title[data-v-110dde64]{margin-top:16px;font-size:18px;font-weight:600;color:#262626}.fast-analysis-report .empty-container .empty-content .empty-hint[data-v-110dde64]{margin-top:8px;color:#8c8c8c}.fast-analysis-report .result-container .decision-card[data-v-110dde64]{background:#fff;border-radius:16px;padding:24px;margin-bottom:20px;-webkit-box-shadow:0 4px 12px rgba(0,0,0,.08);box-shadow:0 4px 12px rgba(0,0,0,.08);border-left:6px solid #1890ff}.fast-analysis-report .result-container .decision-card.decision-buy[data-v-110dde64]{border-left-color:#52c41a;background:linear-gradient(135deg,#f6ffed,#fff)}.fast-analysis-report .result-container .decision-card.decision-sell[data-v-110dde64]{border-left-color:#ff4d4f;background:linear-gradient(135deg,#fff2f0,#fff)}.fast-analysis-report .result-container .decision-card.decision-hold[data-v-110dde64]{border-left-color:#faad14;background:linear-gradient(135deg,#fffbe6,#fff)}.fast-analysis-report .result-container .decision-card .decision-main[data-v-110dde64]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:16px}.fast-analysis-report .result-container .decision-card .decision-main .decision-badge[data-v-110dde64]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:12px}.fast-analysis-report .result-container .decision-card .decision-main .decision-badge .anticon[data-v-110dde64]{font-size:32px}.fast-analysis-report .result-container .decision-card .decision-main .decision-badge .decision-text[data-v-110dde64]{font-size:36px;font-weight:800;letter-spacing:2px}.fast-analysis-report .result-container .decision-card .decision-main .confidence-ring[data-v-110dde64]{text-align:center}.fast-analysis-report .result-container .decision-card .decision-main .confidence-ring .confidence-value[data-v-110dde64]{font-size:18px;font-weight:700}.fast-analysis-report .result-container .decision-card .decision-main .confidence-ring .confidence-label[data-v-110dde64]{font-size:12px;color:#8c8c8c;margin-top:4px}.fast-analysis-report .result-container .decision-card .decision-summary[data-v-110dde64]{font-size:16px;line-height:1.6;color:#595959;padding-top:16px;border-top:1px dashed #e8e8e8}.fast-analysis-report .result-container .price-info-row[data-v-110dde64]{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin-bottom:20px}.fast-analysis-report .result-container .price-info-row .price-card[data-v-110dde64]{background:#fff;border-radius:12px;padding:16px;text-align:center;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.06);box-shadow:0 2px 8px rgba(0,0,0,.06)}.fast-analysis-report .result-container .price-info-row .price-card .price-label[data-v-110dde64]{font-size:12px;color:#8c8c8c;margin-bottom:8px}.fast-analysis-report .result-container .price-info-row .price-card .price-value[data-v-110dde64]{font-size:18px;font-weight:700;color:#262626}.fast-analysis-report .result-container .price-info-row .price-card .price-value.positive[data-v-110dde64]{color:#52c41a}.fast-analysis-report .result-container .price-info-row .price-card .price-value.negative[data-v-110dde64]{color:#ff4d4f}.fast-analysis-report .result-container .price-info-row .price-card .price-hint[data-v-110dde64]{font-size:10px;color:#bfbfbf;margin-top:6px;cursor:help}.fast-analysis-report .result-container .price-info-row .price-card .price-hint .anticon[data-v-110dde64]{margin-right:2px}.fast-analysis-report .result-container .price-info-row .price-card .price-change[data-v-110dde64]{font-size:14px;margin-top:4px;font-weight:600}.fast-analysis-report .result-container .price-info-row .price-card .price-change.positive[data-v-110dde64]{color:#52c41a}.fast-analysis-report .result-container .price-info-row .price-card .price-change.negative[data-v-110dde64]{color:#ff4d4f}.fast-analysis-report .result-container .price-info-row .price-card.current[data-v-110dde64]{border-top:3px solid #1890ff}.fast-analysis-report .result-container .price-info-row .price-card.entry[data-v-110dde64]{border-top:3px solid #722ed1}.fast-analysis-report .result-container .price-info-row .price-card.stop[data-v-110dde64]{border-top:3px solid #ff4d4f}.fast-analysis-report .result-container .price-info-row .price-card.target[data-v-110dde64]{border-top:3px solid #52c41a}.fast-analysis-report .result-container .scores-row[data-v-110dde64]{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin-bottom:20px}.fast-analysis-report .result-container .scores-row .score-item[data-v-110dde64]{background:#fff;border-radius:12px;padding:16px;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.06);box-shadow:0 2px 8px rgba(0,0,0,.06)}.fast-analysis-report .result-container .scores-row .score-item .score-header[data-v-110dde64]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:8px;font-size:14px;color:#595959;margin-bottom:12px}.fast-analysis-report .result-container .scores-row .score-item .score-header .anticon[data-v-110dde64]{color:#1890ff}.fast-analysis-report .result-container .scores-row .score-item .score-value[data-v-110dde64]{text-align:right;font-size:20px;font-weight:700;color:#262626;margin-top:8px}.fast-analysis-report .result-container .scores-row .score-item.overall[data-v-110dde64]{background:linear-gradient(135deg,#e6f7ff,#fff);border:1px solid #91d5ff}.fast-analysis-report .result-container .detailed-analysis[data-v-110dde64]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;gap:16px;margin-bottom:20px}.fast-analysis-report .result-container .detailed-analysis .analysis-card[data-v-110dde64]{background:linear-gradient(135deg,#fff,#fafafa);border-radius:12px;padding:20px;-webkit-box-shadow:0 2px 12px rgba(0,0,0,.06);box-shadow:0 2px 12px rgba(0,0,0,.06);border-left:4px solid #1890ff}.fast-analysis-report .result-container .detailed-analysis .analysis-card.technical[data-v-110dde64]{border-left-color:#1890ff}.fast-analysis-report .result-container .detailed-analysis .analysis-card.fundamental[data-v-110dde64]{border-left-color:#722ed1}.fast-analysis-report .result-container .detailed-analysis .analysis-card.sentiment[data-v-110dde64]{border-left-color:#eb2f96}.fast-analysis-report .result-container .detailed-analysis .analysis-card .analysis-card-header[data-v-110dde64]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:10px;margin-bottom:14px;font-size:16px;font-weight:600;color:#262626}.fast-analysis-report .result-container .detailed-analysis .analysis-card .analysis-card-header .anticon[data-v-110dde64]{font-size:20px}.fast-analysis-report .result-container .detailed-analysis .analysis-card .analysis-card-header.technical .anticon[data-v-110dde64]{color:#1890ff}.fast-analysis-report .result-container .detailed-analysis .analysis-card .analysis-card-header.fundamental .anticon[data-v-110dde64]{color:#722ed1}.fast-analysis-report .result-container .detailed-analysis .analysis-card .analysis-card-header.sentiment .anticon[data-v-110dde64]{color:#eb2f96}.fast-analysis-report .result-container .detailed-analysis .analysis-card .analysis-card-content[data-v-110dde64]{font-size:14px;line-height:1.8;color:#595959;text-align:justify}.fast-analysis-report .result-container .analysis-details[data-v-110dde64]{display:grid;grid-template-columns:1fr 1fr;gap:20px;margin-bottom:20px}.fast-analysis-report .result-container .analysis-details .detail-section[data-v-110dde64]{background:#fff;border-radius:12px;padding:20px;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.06);box-shadow:0 2px 8px rgba(0,0,0,.06)}.fast-analysis-report .result-container .analysis-details .detail-section .section-title[data-v-110dde64]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:8px;font-size:16px;font-weight:600;margin-bottom:16px;color:#262626}.fast-analysis-report .result-container .analysis-details .detail-section .detail-list[data-v-110dde64]{list-style:none;padding:0;margin:0}.fast-analysis-report .result-container .analysis-details .detail-section .detail-list li[data-v-110dde64]{padding:10px 0;border-bottom:1px solid #f0f0f0;font-size:14px;line-height:1.6;color:#595959}.fast-analysis-report .result-container .analysis-details .detail-section .detail-list li[data-v-110dde64]:last-child{border-bottom:none}.fast-analysis-report .result-container .analysis-details .detail-section .detail-list li[data-v-110dde64]:before{content:"•";margin-right:8px;color:#1890ff}.fast-analysis-report .result-container .analysis-details .detail-section.reasons[data-v-110dde64]{border-left:4px solid #52c41a}.fast-analysis-report .result-container .analysis-details .detail-section.risks[data-v-110dde64]{border-left:4px solid #faad14}.fast-analysis-report .result-container .indicators-section[data-v-110dde64]{background:#fff;border-radius:12px;padding:20px;margin-bottom:20px;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.06);box-shadow:0 2px 8px rgba(0,0,0,.06)}.fast-analysis-report .result-container .indicators-section .section-title[data-v-110dde64]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:8px;font-size:16px;font-weight:600;margin-bottom:16px;color:#262626}.fast-analysis-report .result-container .indicators-section .section-title .anticon[data-v-110dde64]{color:#1890ff}.fast-analysis-report .result-container .indicators-section .indicators-grid[data-v-110dde64]{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:16px}.fast-analysis-report .result-container .indicators-section .indicators-grid .indicator-item[data-v-110dde64]{background:#fafafa;border-radius:8px;padding:12px;text-align:center}.fast-analysis-report .result-container .indicators-section .indicators-grid .indicator-item .indicator-name[data-v-110dde64]{font-size:12px;color:#8c8c8c;margin-bottom:8px}.fast-analysis-report .result-container .indicators-section .indicators-grid .indicator-item .indicator-value[data-v-110dde64]{font-size:16px;font-weight:600;color:#262626}.fast-analysis-report .result-container .indicators-section .indicators-grid .indicator-item .indicator-value.bullish[data-v-110dde64],.fast-analysis-report .result-container .indicators-section .indicators-grid .indicator-item .indicator-value.oversold[data-v-110dde64]{color:#52c41a}.fast-analysis-report .result-container .indicators-section .indicators-grid .indicator-item .indicator-value.bearish[data-v-110dde64],.fast-analysis-report .result-container .indicators-section .indicators-grid .indicator-item .indicator-value.high-volatility[data-v-110dde64],.fast-analysis-report .result-container .indicators-section .indicators-grid .indicator-item .indicator-value.overbought[data-v-110dde64]{color:#ff4d4f}.fast-analysis-report .result-container .indicators-section .indicators-grid .indicator-item .indicator-value.low-volatility[data-v-110dde64]{color:#52c41a}.fast-analysis-report .result-container .indicators-section .indicators-grid .indicator-item .indicator-signal[data-v-110dde64]{font-size:11px;color:#8c8c8c;margin-top:4px;text-transform:capitalize}.fast-analysis-report .result-container .feedback-section[data-v-110dde64]{background:#fff;border-radius:12px;padding:20px;text-align:center;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.06);box-shadow:0 2px 8px rgba(0,0,0,.06)}.fast-analysis-report .result-container .feedback-section .feedback-question[data-v-110dde64]{font-size:14px;color:#595959;margin-bottom:12px}.fast-analysis-report .result-container .feedback-section .feedback-buttons[data-v-110dde64]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;gap:16px;margin-bottom:16px}.fast-analysis-report .result-container .feedback-section .feedback-buttons .ant-btn[data-v-110dde64]{min-width:100px}.fast-analysis-report .result-container .feedback-section .analysis-meta[data-v-110dde64]{font-size:12px;color:#8c8c8c;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;gap:16px}@media (max-width:992px){.fast-analysis-report .price-info-row[data-v-110dde64],.fast-analysis-report .scores-row[data-v-110dde64]{grid-template-columns:repeat(2,1fr)}.fast-analysis-report .analysis-details[data-v-110dde64]{grid-template-columns:1fr}}@media (max-width:576px){.fast-analysis-report[data-v-110dde64]{padding:12px}.fast-analysis-report .price-info-row[data-v-110dde64],.fast-analysis-report .scores-row[data-v-110dde64]{grid-template-columns:1fr}.fast-analysis-report .decision-card[data-v-110dde64]{padding:16px}.fast-analysis-report .decision-card .decision-main[data-v-110dde64]{gap:16px;text-align:center}.fast-analysis-report .decision-card .decision-main .decision-badge[data-v-110dde64],.fast-analysis-report .decision-card .decision-main[data-v-110dde64]{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.fast-analysis-report .decision-card .decision-main .decision-badge .decision-text[data-v-110dde64]{font-size:28px}}.fast-analysis-report.theme-dark[data-v-110dde64]{background:linear-gradient(135deg,#1e222d,#131722)}.fast-analysis-report.theme-dark .loading-content .loading-text[data-v-110dde64]{color:#00e5ff}.fast-analysis-report.theme-dark .empty-content .empty-title[data-v-110dde64]{color:#d1d4dc}.fast-analysis-report.theme-dark .decision-card[data-v-110dde64]{background:#2a2e39;border-left-color:#1890ff}.fast-analysis-report.theme-dark .decision-card.decision-buy[data-v-110dde64]{background:linear-gradient(135deg,rgba(82,196,26,.1),#2a2e39)}.fast-analysis-report.theme-dark .decision-card.decision-sell[data-v-110dde64]{background:linear-gradient(135deg,rgba(255,77,79,.1),#2a2e39)}.fast-analysis-report.theme-dark .decision-card.decision-hold[data-v-110dde64]{background:linear-gradient(135deg,rgba(250,173,20,.1),#2a2e39)}.fast-analysis-report.theme-dark .decision-card .decision-summary[data-v-110dde64]{color:#868993;border-top-color:#363c4e}.fast-analysis-report.theme-dark .detailed-analysis .analysis-card[data-v-110dde64]{background:linear-gradient(135deg,#2a2e39,#1e222d)}.fast-analysis-report.theme-dark .detailed-analysis .analysis-card.technical[data-v-110dde64]{border-left-color:#1890ff}.fast-analysis-report.theme-dark .detailed-analysis .analysis-card.fundamental[data-v-110dde64]{border-left-color:#722ed1}.fast-analysis-report.theme-dark .detailed-analysis .analysis-card.sentiment[data-v-110dde64]{border-left-color:#eb2f96}.fast-analysis-report.theme-dark .detailed-analysis .analysis-card .analysis-card-header[data-v-110dde64]{color:#d1d4dc}.fast-analysis-report.theme-dark .detailed-analysis .analysis-card .analysis-card-content[data-v-110dde64]{color:#868993}.fast-analysis-report.theme-dark .detail-section[data-v-110dde64],.fast-analysis-report.theme-dark .feedback-section[data-v-110dde64],.fast-analysis-report.theme-dark .indicators-section[data-v-110dde64],.fast-analysis-report.theme-dark .price-card[data-v-110dde64],.fast-analysis-report.theme-dark .score-item[data-v-110dde64]{background:#2a2e39;color:#d1d4dc}.fast-analysis-report.theme-dark .detail-section .analysis-meta[data-v-110dde64],.fast-analysis-report.theme-dark .detail-section .feedback-question[data-v-110dde64],.fast-analysis-report.theme-dark .detail-section .indicator-name[data-v-110dde64],.fast-analysis-report.theme-dark .detail-section .indicator-signal[data-v-110dde64],.fast-analysis-report.theme-dark .detail-section .price-label[data-v-110dde64],.fast-analysis-report.theme-dark .detail-section .score-header[data-v-110dde64],.fast-analysis-report.theme-dark .detail-section .section-title[data-v-110dde64],.fast-analysis-report.theme-dark .feedback-section .analysis-meta[data-v-110dde64],.fast-analysis-report.theme-dark .feedback-section .feedback-question[data-v-110dde64],.fast-analysis-report.theme-dark .feedback-section .indicator-name[data-v-110dde64],.fast-analysis-report.theme-dark .feedback-section .indicator-signal[data-v-110dde64],.fast-analysis-report.theme-dark .feedback-section .price-label[data-v-110dde64],.fast-analysis-report.theme-dark .feedback-section .score-header[data-v-110dde64],.fast-analysis-report.theme-dark .feedback-section .section-title[data-v-110dde64],.fast-analysis-report.theme-dark .indicators-section .analysis-meta[data-v-110dde64],.fast-analysis-report.theme-dark .indicators-section .feedback-question[data-v-110dde64],.fast-analysis-report.theme-dark .indicators-section .indicator-name[data-v-110dde64],.fast-analysis-report.theme-dark .indicators-section .indicator-signal[data-v-110dde64],.fast-analysis-report.theme-dark .indicators-section .price-label[data-v-110dde64],.fast-analysis-report.theme-dark .indicators-section .score-header[data-v-110dde64],.fast-analysis-report.theme-dark .indicators-section .section-title[data-v-110dde64],.fast-analysis-report.theme-dark .price-card .analysis-meta[data-v-110dde64],.fast-analysis-report.theme-dark .price-card .feedback-question[data-v-110dde64],.fast-analysis-report.theme-dark .price-card .indicator-name[data-v-110dde64],.fast-analysis-report.theme-dark .price-card .indicator-signal[data-v-110dde64],.fast-analysis-report.theme-dark .price-card .price-label[data-v-110dde64],.fast-analysis-report.theme-dark .price-card .score-header[data-v-110dde64],.fast-analysis-report.theme-dark .price-card .section-title[data-v-110dde64],.fast-analysis-report.theme-dark .score-item .analysis-meta[data-v-110dde64],.fast-analysis-report.theme-dark .score-item .feedback-question[data-v-110dde64],.fast-analysis-report.theme-dark .score-item .indicator-name[data-v-110dde64],.fast-analysis-report.theme-dark .score-item .indicator-signal[data-v-110dde64],.fast-analysis-report.theme-dark .score-item .price-label[data-v-110dde64],.fast-analysis-report.theme-dark .score-item .score-header[data-v-110dde64],.fast-analysis-report.theme-dark .score-item .section-title[data-v-110dde64]{color:#868993}.fast-analysis-report.theme-dark .detail-section .indicator-value[data-v-110dde64],.fast-analysis-report.theme-dark .detail-section .price-value[data-v-110dde64],.fast-analysis-report.theme-dark .detail-section .score-value[data-v-110dde64],.fast-analysis-report.theme-dark .feedback-section .indicator-value[data-v-110dde64],.fast-analysis-report.theme-dark .feedback-section .price-value[data-v-110dde64],.fast-analysis-report.theme-dark .feedback-section .score-value[data-v-110dde64],.fast-analysis-report.theme-dark .indicators-section .indicator-value[data-v-110dde64],.fast-analysis-report.theme-dark .indicators-section .price-value[data-v-110dde64],.fast-analysis-report.theme-dark .indicators-section .score-value[data-v-110dde64],.fast-analysis-report.theme-dark .price-card .indicator-value[data-v-110dde64],.fast-analysis-report.theme-dark .price-card .price-value[data-v-110dde64],.fast-analysis-report.theme-dark .price-card .score-value[data-v-110dde64],.fast-analysis-report.theme-dark .score-item .indicator-value[data-v-110dde64],.fast-analysis-report.theme-dark .score-item .price-value[data-v-110dde64],.fast-analysis-report.theme-dark .score-item .score-value[data-v-110dde64]{color:#d1d4dc}.fast-analysis-report.theme-dark .score-item.overall[data-v-110dde64]{background:linear-gradient(135deg,rgba(24,144,255,.1),#2a2e39);border-color:#1890ff}.fast-analysis-report.theme-dark .detail-list li[data-v-110dde64]{color:#868993;border-bottom-color:#363c4e}.fast-analysis-report.theme-dark .indicators-grid .indicator-item[data-v-110dde64]{background:#363c4e}.ai-analysis-container[data-v-76a3e064]{display:-webkit-box;display:-ms-flexbox;display:flex;height:calc(100vh - 120px);background:#f0f2f5;overflow:hidden;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.ai-analysis-container.embedded[data-v-76a3e064]{height:auto;min-height:700px;background:transparent}.ai-analysis-container.embedded .main-content-full[data-v-76a3e064]{-webkit-box-shadow:none;box-shadow:none;border-radius:0}.main-content-full[data-v-76a3e064]{-webkit-box-flex:1;-ms-flex:1;flex:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;overflow:hidden;background:#fff;border-radius:12px;height:100%;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.08);box-shadow:0 2px 8px rgba(0,0,0,.08);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.top-index-bar[data-v-76a3e064]{gap:8px;padding:8px 16px;background:#f8fafc;border-bottom:1px solid #e2e8f0;font-family:SF Mono,Monaco,Consolas,monospace}.top-index-bar .indicator-box[data-v-76a3e064],.top-index-bar[data-v-76a3e064]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.top-index-bar .indicator-box[data-v-76a3e064]{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding:4px 10px;background:#fff;border-radius:6px;border:1px solid #e2e8f0;min-width:50px}.top-index-bar .indicator-box .ind-label[data-v-76a3e064]{font-size:9px;color:#94a3b8;text-transform:uppercase}.top-index-bar .indicator-box .ind-value[data-v-76a3e064]{font-size:13px;font-weight:700;color:#1e293b}.top-index-bar .indicator-box.fear-greed.extreme-fear .ind-value[data-v-76a3e064]{color:#dc2626}.top-index-bar .indicator-box.fear-greed.fear .ind-value[data-v-76a3e064]{color:#ea580c}.top-index-bar .indicator-box.fear-greed.neutral .ind-value[data-v-76a3e064]{color:#ca8a04}.top-index-bar .indicator-box.fear-greed.greed .ind-value[data-v-76a3e064]{color:#65a30d}.top-index-bar .indicator-box.fear-greed.extreme-greed .ind-value[data-v-76a3e064],.top-index-bar .indicator-box.vix.low .ind-value[data-v-76a3e064]{color:#16a34a}.top-index-bar .indicator-box.vix.medium .ind-value[data-v-76a3e064]{color:#ca8a04}.top-index-bar .indicator-box.vix.high .ind-value[data-v-76a3e064]{color:#dc2626}.top-index-bar .indicator-box.dxy .ind-value[data-v-76a3e064]{color:#2563eb}.top-index-bar .indices-marquee[data-v-76a3e064]{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:hidden;min-width:0}.top-index-bar .indices-marquee .marquee-track[data-v-76a3e064]{display:-webkit-box;display:-ms-flexbox;display:flex;gap:8px;-webkit-animation:marquee-76a3e064 35s linear infinite;animation:marquee-76a3e064 35s linear infinite;width:-webkit-max-content;width:-moz-max-content;width:max-content}.top-index-bar .indices-marquee .marquee-track[data-v-76a3e064]:hover{-webkit-animation-play-state:paused;animation-play-state:paused}.top-index-bar .indices-marquee .index-item[data-v-76a3e064]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:4px;padding:4px 8px;background:#fff;border-radius:4px;border:1px solid #e2e8f0;font-size:11px;white-space:nowrap}.top-index-bar .indices-marquee .index-item .idx-flag[data-v-76a3e064]{font-size:11px}.top-index-bar .indices-marquee .index-item .idx-symbol[data-v-76a3e064]{color:#64748b;font-weight:500}.top-index-bar .indices-marquee .index-item .idx-price[data-v-76a3e064]{color:#1e293b;font-weight:600}.top-index-bar .indices-marquee .index-item .idx-change[data-v-76a3e064]{font-weight:600;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:1px}.top-index-bar .indices-marquee .index-item .idx-change.up[data-v-76a3e064]{color:#16a34a}.top-index-bar .indices-marquee .index-item .idx-change.down[data-v-76a3e064]{color:#dc2626}@-webkit-keyframes marquee-76a3e064{0%{-webkit-transform:translateX(0);transform:translateX(0)}to{-webkit-transform:translateX(-50%);transform:translateX(-50%)}}@keyframes marquee-76a3e064{0%{-webkit-transform:translateX(0);transform:translateX(0)}to{-webkit-transform:translateX(-50%);transform:translateX(-50%)}}.top-index-bar .refresh-btn[data-v-76a3e064]{color:#94a3b8;-ms-flex-negative:0;flex-shrink:0}.top-index-bar .refresh-btn[data-v-76a3e064]:hover{color:#1e293b}.main-body[data-v-76a3e064]{-webkit-box-flex:1;-ms-flex:1;flex:1;padding:12px;overflow:hidden;min-height:0}.left-panel[data-v-76a3e064],.main-body[data-v-76a3e064]{display:-webkit-box;display:-ms-flexbox;display:flex;gap:12px}.left-panel[data-v-76a3e064]{width:280px;-ms-flex-negative:0;flex-shrink:0;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;overflow-y:auto}.left-panel .heatmap-box[data-v-76a3e064]{background:#fff;border-radius:8px;padding:12px;border:1px solid #e2e8f0}.left-panel .heatmap-box .box-header[data-v-76a3e064]{margin-bottom:10px}.left-panel .heatmap-box .box-header[data-v-76a3e064] .ant-radio-group .ant-radio-button-wrapper{font-size:10px;padding:0 6px;height:22px;line-height:20px}.left-panel .heatmap-box .box-header[data-v-76a3e064] .ant-radio-group .ant-radio-button-wrapper.ant-radio-button-wrapper-checked{background:var(--primary-color,#1890ff);border-color:var(--primary-color,#1890ff);color:#fff}.left-panel .heatmap-box .heatmap-grid[data-v-76a3e064]{display:grid;grid-template-columns:repeat(3,1fr);gap:4px}.left-panel .heatmap-box .heatmap-grid .heat-cell[data-v-76a3e064]{padding:6px 4px;border-radius:4px;text-align:center;font-size:9px}.left-panel .heatmap-box .heatmap-grid .heat-cell .heat-name[data-v-76a3e064]{display:block;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-bottom:1px}.left-panel .heatmap-box .heatmap-grid .heat-cell .heat-price[data-v-76a3e064]{display:block;font-size:9px;opacity:.8;margin-bottom:1px}.left-panel .heatmap-box .heatmap-grid .heat-cell .heat-val[data-v-76a3e064]{font-weight:700;font-size:10px}.left-panel .calendar-box[data-v-76a3e064]{-webkit-box-flex:1;-ms-flex:1;flex:1;background:#fff;border-radius:8px;padding:12px;border:1px solid #e2e8f0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;min-height:0;overflow:hidden}.left-panel .calendar-box .box-header[data-v-76a3e064]{margin-bottom:8px}.left-panel .calendar-box .box-header .box-title[data-v-76a3e064]{font-size:12px;color:#64748b;font-weight:600}.left-panel .calendar-box .box-header .box-title .anticon[data-v-76a3e064]{margin-right:6px;color:var(--primary-color,#1890ff)}.left-panel .calendar-box .calendar-list[data-v-76a3e064]{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow-y:auto}.left-panel .calendar-box .calendar-list[data-v-76a3e064]::-webkit-scrollbar{width:4px}.left-panel .calendar-box .calendar-list[data-v-76a3e064]::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:2px}.left-panel .calendar-box .calendar-list .cal-item[data-v-76a3e064]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:6px;padding:6px 0;border-bottom:1px solid #f1f5f9;font-size:10px}.left-panel .calendar-box .calendar-list .cal-item[data-v-76a3e064]:last-child{border-bottom:none}.left-panel .calendar-box .calendar-list .cal-item.high[data-v-76a3e064]{border-left:3px solid #dc2626;padding-left:8px;margin-left:-4px}.left-panel .calendar-box .calendar-list .cal-item.medium[data-v-76a3e064]{border-left:3px solid #ca8a04;padding-left:8px;margin-left:-4px}.left-panel .calendar-box .calendar-list .cal-item.low[data-v-76a3e064]{border-left:3px solid #16a34a;padding-left:8px;margin-left:-4px}.left-panel .calendar-box .calendar-list .cal-item .cal-date[data-v-76a3e064]{font-size:9px;color:#94a3b8;min-width:32px;font-weight:500}.left-panel .calendar-box .calendar-list .cal-item .cal-time[data-v-76a3e064]{color:#64748b;min-width:36px;font-weight:500}.left-panel .calendar-box .calendar-list .cal-item .cal-flag[data-v-76a3e064]{font-size:12px}.left-panel .calendar-box .calendar-list .cal-item .cal-name[data-v-76a3e064]{-webkit-box-flex:1;-ms-flex:1;flex:1;color:#334155;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.left-panel .calendar-box .calendar-list .cal-item .cal-impact[data-v-76a3e064]{font-weight:600;font-size:10px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:2px}.left-panel .calendar-box .calendar-list .cal-item .cal-impact.bullish[data-v-76a3e064]{color:#16a34a}.left-panel .calendar-box .calendar-list .cal-item .cal-impact.bearish[data-v-76a3e064]{color:#dc2626}.left-panel .calendar-box .calendar-list .cal-item .cal-impact.neutral[data-v-76a3e064]{color:#94a3b8}.left-panel .calendar-box .calendar-list .cal-empty[data-v-76a3e064]{text-align:center;color:#94a3b8;padding:20px 0;font-size:12px}.right-panel[data-v-76a3e064]{-webkit-box-flex:1;-ms-flex:1;flex:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;min-width:0;overflow:hidden;background:#fff;border-radius:8px;border:1px solid #e2e8f0}.right-panel .analysis-toolbar[data-v-76a3e064]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:12px;padding:12px 16px;border-bottom:1px solid #f1f5f9;background:#fafafa;border-radius:8px 8px 0 0}.right-panel .analysis-toolbar .symbol-selector[data-v-76a3e064]{-webkit-box-flex:1;-ms-flex:1;flex:1;max-width:320px}.right-panel .analysis-toolbar .analyze-button[data-v-76a3e064]{background:var(--primary-color,#1890ff);border-color:var(--primary-color,#1890ff)}.right-panel .analysis-toolbar .history-button[data-v-76a3e064]{border-color:#d9d9d9}.right-panel .analysis-main[data-v-76a3e064]{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:auto;padding:16px;min-height:0}.right-panel .analysis-main .analysis-placeholder[data-v-76a3e064]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;height:100%;min-height:300px}.right-panel .analysis-main .analysis-placeholder .placeholder-content[data-v-76a3e064]{text-align:center}.right-panel .analysis-main .analysis-placeholder .placeholder-content .placeholder-icon[data-v-76a3e064]{font-size:72px;color:var(--primary-color,#1890ff);opacity:.5;margin-bottom:20px}.right-panel .analysis-main .analysis-placeholder .placeholder-content h3[data-v-76a3e064]{font-size:18px;color:#1e293b;margin-bottom:8px}.right-panel .analysis-main .analysis-placeholder .placeholder-content p[data-v-76a3e064]{font-size:14px;color:#64748b}.watchlist-panel[data-v-76a3e064]{width:200px;-ms-flex-negative:0;flex-shrink:0;background:#fff;border-radius:8px;border:1px solid #e2e8f0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;overflow:hidden}.watchlist-panel .panel-header[data-v-76a3e064]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:10px 12px;border-bottom:1px solid #f1f5f9;background:#fafafa}.watchlist-panel .panel-header .panel-title[data-v-76a3e064]{font-size:12px;font-weight:600;color:#64748b}.watchlist-panel .panel-header .panel-title .anticon[data-v-76a3e064]{color:#facc15;margin-right:6px}.watchlist-panel .watchlist-list[data-v-76a3e064]{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow-y:auto;padding:8px}.watchlist-panel .watchlist-list[data-v-76a3e064]::-webkit-scrollbar{width:4px}.watchlist-panel .watchlist-list[data-v-76a3e064]::-webkit-scrollbar-thumb{background:#e2e8f0;border-radius:2px}.watchlist-panel .watchlist-list .watchlist-item[data-v-76a3e064]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:8px 10px;border-radius:6px;cursor:pointer;-webkit-transition:all .2s;transition:all .2s;margin-bottom:4px}.watchlist-panel .watchlist-list .watchlist-item[data-v-76a3e064]:hover{background:#f8fafc}.watchlist-panel .watchlist-list .watchlist-item.active[data-v-76a3e064]{background:#e6f7ff;border:1px solid #91d5ff}.watchlist-panel .watchlist-list .watchlist-item .item-main[data-v-76a3e064]{-webkit-box-flex:1;-ms-flex:1;flex:1;min-width:0}.watchlist-panel .watchlist-list .watchlist-item .item-main .item-symbol[data-v-76a3e064]{display:block;font-size:12px;font-weight:600;color:#1e293b}.watchlist-panel .watchlist-list .watchlist-item .item-main .item-name[data-v-76a3e064]{display:block;font-size:10px;color:#94a3b8;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.watchlist-panel .watchlist-list .watchlist-item .item-price[data-v-76a3e064]{text-align:right;margin-right:8px;font-family:SF Mono,Monaco,monospace}.watchlist-panel .watchlist-list .watchlist-item .item-price .price-value[data-v-76a3e064]{display:block;font-size:11px;font-weight:600;color:#1e293b}.watchlist-panel .watchlist-list .watchlist-item .item-price .price-change[data-v-76a3e064]{display:block;font-size:10px;font-weight:600}.watchlist-panel .watchlist-list .watchlist-item .item-price .price-change.up[data-v-76a3e064]{color:#16a34a}.watchlist-panel .watchlist-list .watchlist-item .item-price .price-change.down[data-v-76a3e064]{color:#dc2626}.watchlist-panel .watchlist-list .watchlist-item .item-remove[data-v-76a3e064]{color:#cbd5e1;font-size:12px;opacity:0;-webkit-transition:opacity .2s;transition:opacity .2s}.watchlist-panel .watchlist-list .watchlist-item .item-remove[data-v-76a3e064]:hover{color:#dc2626}.watchlist-panel .watchlist-list .watchlist-item:hover .item-remove[data-v-76a3e064]{opacity:1}.watchlist-panel .watchlist-list .watchlist-empty[data-v-76a3e064]{text-align:center;padding:24px 12px;color:#94a3b8}.watchlist-panel .watchlist-list .watchlist-empty .anticon[data-v-76a3e064]{font-size:32px;margin-bottom:8px;display:block}.watchlist-panel .watchlist-list .watchlist-empty p[data-v-76a3e064]{font-size:12px;margin-bottom:12px}@-webkit-keyframes pulse-76a3e064{0%,to{opacity:1}50%{opacity:.5}}@keyframes pulse-76a3e064{0%,to{opacity:1}50%{opacity:.5}}@media (max-width:992px){.ai-analysis-container[data-v-76a3e064]{height:auto;min-height:calc(100vh - 64px);overflow-y:auto}.main-content-full[data-v-76a3e064]{height:auto;min-height:auto}.top-index-bar[data-v-76a3e064]{-ms-flex-wrap:wrap;flex-wrap:wrap;padding:8px}.top-index-bar .indicator-box[data-v-76a3e064]{min-width:45px;padding:3px 6px}.top-index-bar .indices-marquee[data-v-76a3e064]{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10;width:100%;margin-top:8px}.main-body[data-v-76a3e064]{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding:12px}.left-panel[data-v-76a3e064]{width:100%;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;gap:12px}.left-panel .calendar-box[data-v-76a3e064],.left-panel .heatmap-box[data-v-76a3e064]{-webkit-box-flex:1;-ms-flex:1;flex:1;min-width:0}.left-panel .calendar-box[data-v-76a3e064]{max-height:200px}.right-panel .analysis-toolbar[data-v-76a3e064]{-ms-flex-wrap:wrap;flex-wrap:wrap}.right-panel .analysis-toolbar .symbol-selector[data-v-76a3e064]{width:100%!important;max-width:none!important}.right-panel .analysis-toolbar .analyze-button[data-v-76a3e064],.right-panel .analysis-toolbar .history-button[data-v-76a3e064]{-webkit-box-flex:1;-ms-flex:1;flex:1}.watchlist-panel[data-v-76a3e064]{width:100%;max-height:200px;-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}}.ai-analysis-container.theme-dark[data-v-76a3e064]{background:#131722;color:#d1d4dc}.ai-analysis-container.theme-dark .main-content-full[data-v-76a3e064]{background:#1e222d;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.3);box-shadow:0 2px 8px rgba(0,0,0,.3)}.ai-analysis-container.theme-dark .top-index-bar[data-v-76a3e064]{background:#1e222d;border-bottom-color:#363c4e}.ai-analysis-container.theme-dark .top-index-bar .indicator-box[data-v-76a3e064]{background:#2a2e39;border-color:#363c4e}.ai-analysis-container.theme-dark .top-index-bar .indicator-box .ind-label[data-v-76a3e064]{color:#868993}.ai-analysis-container.theme-dark .top-index-bar .indicator-box .ind-value[data-v-76a3e064]{color:#d1d4dc}.ai-analysis-container.theme-dark .top-index-bar .indices-marquee .index-item[data-v-76a3e064]{background:#2a2e39;border-color:#363c4e}.ai-analysis-container.theme-dark .top-index-bar .indices-marquee .index-item .idx-symbol[data-v-76a3e064]{color:#868993}.ai-analysis-container.theme-dark .top-index-bar .indices-marquee .index-item .idx-price[data-v-76a3e064]{color:#d1d4dc}.ai-analysis-container.theme-dark .top-index-bar .refresh-btn[data-v-76a3e064]{color:#868993}.ai-analysis-container.theme-dark .top-index-bar .refresh-btn[data-v-76a3e064]:hover{color:#d1d4dc}.ai-analysis-container.theme-dark .watchlist-panel[data-v-76a3e064]{background:#2a2e39;border-color:#363c4e}.ai-analysis-container.theme-dark .watchlist-panel .panel-header[data-v-76a3e064]{background:#1e222d;border-bottom-color:#363c4e}.ai-analysis-container.theme-dark .watchlist-panel .panel-header .panel-title[data-v-76a3e064]{color:#868993}.ai-analysis-container.theme-dark .watchlist-panel .watchlist-list .watchlist-item[data-v-76a3e064]:hover{background:#363c4e}.ai-analysis-container.theme-dark .watchlist-panel .watchlist-list .watchlist-item.active[data-v-76a3e064]{background:rgba(24,144,255,.1);border-color:#1890ff}.ai-analysis-container.theme-dark .watchlist-panel .watchlist-list .watchlist-item .item-main .item-symbol[data-v-76a3e064]{color:#d1d4dc}.ai-analysis-container.theme-dark .watchlist-panel .watchlist-list .watchlist-item .item-main .item-name[data-v-76a3e064]{color:#64748b}.ai-analysis-container.theme-dark .watchlist-panel .watchlist-list .watchlist-item .item-price .price-value[data-v-76a3e064]{color:#d1d4dc}.ai-analysis-container.theme-dark .watchlist-panel .watchlist-list .watchlist-empty[data-v-76a3e064]{color:#64748b}.ai-analysis-container.theme-dark .watchlist-bar-legacy[data-v-76a3e064]{background:#1e222d;border-bottom-color:#363c4e}.ai-analysis-container.theme-dark .watchlist-bar-legacy .stock-chip[data-v-76a3e064]{background:#2a2e39;border-color:#363c4e}.ai-analysis-container.theme-dark .watchlist-bar-legacy .stock-chip.active[data-v-76a3e064],.ai-analysis-container.theme-dark .watchlist-bar-legacy .stock-chip[data-v-76a3e064]:hover{border-color:var(--primary-color,#1890ff);background:rgba(24,144,255,.1)}.ai-analysis-container.theme-dark .watchlist-bar-legacy .stock-chip .chip-symbol[data-v-76a3e064]{color:#d1d4dc}.ai-analysis-container.theme-dark .watchlist-bar-legacy .stock-chip .chip-price[data-v-76a3e064]{color:#868993}.ai-analysis-container.theme-dark .left-panel .heatmap-box[data-v-76a3e064]{background:#2a2e39;border-color:#363c4e}.ai-analysis-container.theme-dark .left-panel .heatmap-box[data-v-76a3e064] .ant-radio-group .ant-radio-button-wrapper{background:#1e222d;border-color:#363c4e;color:#868993}.ai-analysis-container.theme-dark .left-panel .heatmap-box[data-v-76a3e064] .ant-radio-group .ant-radio-button-wrapper:hover{color:#d1d4dc}.ai-analysis-container.theme-dark .left-panel .calendar-box[data-v-76a3e064]{background:#2a2e39;border-color:#363c4e}.ai-analysis-container.theme-dark .left-panel .calendar-box .box-title[data-v-76a3e064]{color:#868993}.ai-analysis-container.theme-dark .left-panel .calendar-box .cal-item[data-v-76a3e064]{border-bottom-color:#363c4e}.ai-analysis-container.theme-dark .left-panel .calendar-box .cal-item .cal-date[data-v-76a3e064]{color:#64748b}.ai-analysis-container.theme-dark .left-panel .calendar-box .cal-item .cal-time[data-v-76a3e064]{color:#868993}.ai-analysis-container.theme-dark .left-panel .calendar-box .cal-item .cal-name[data-v-76a3e064]{color:#d1d4dc}.ai-analysis-container.theme-dark .left-panel .calendar-box .cal-empty[data-v-76a3e064]{color:#64748b}.ai-analysis-container.theme-dark .right-panel[data-v-76a3e064]{background:#2a2e39;border-color:#363c4e}.ai-analysis-container.theme-dark .right-panel .analysis-toolbar[data-v-76a3e064]{background:#1e222d;border-bottom-color:#363c4e}.ai-analysis-container.theme-dark .right-panel .analysis-toolbar .history-button[data-v-76a3e064]{background:#2a2e39;border-color:#363c4e;color:#d1d4dc}.ai-analysis-container.theme-dark .right-panel .analysis-main .analysis-placeholder .placeholder-content h3[data-v-76a3e064]{color:#d1d4dc}.ai-analysis-container.theme-dark .right-panel .analysis-main .analysis-placeholder .placeholder-content p[data-v-76a3e064]{color:#868993}.ai-analysis-container.theme-dark .watchlist-bar-compat[data-v-76a3e064]{background:#1e222d;border-top-color:#363c4e}.ai-analysis-container.theme-dark .watchlist-bar-compat .bar-label[data-v-76a3e064]{color:#868993}.ai-analysis-container.theme-dark .watchlist-bar-compat .stock-chip[data-v-76a3e064]{background:#2a2e39;border-color:#363c4e}.ai-analysis-container.theme-dark .watchlist-bar-compat .stock-chip.active[data-v-76a3e064],.ai-analysis-container.theme-dark .watchlist-bar-compat .stock-chip[data-v-76a3e064]:hover{border-color:var(--primary-color,#1890ff);background:rgba(24,144,255,.1)}.ai-analysis-container.theme-dark .watchlist-bar-compat .stock-chip .chip-symbol[data-v-76a3e064]{color:#d1d4dc}.ai-analysis-container.theme-dark .watchlist-bar-compat .stock-chip .chip-price[data-v-76a3e064]{color:#868993}.ai-analysis-container.theme-dark .watchlist-bar-compat .stock-chip .chip-remove[data-v-76a3e064]{color:#64748b}.ai-analysis-container.theme-dark[data-v-76a3e064] .symbol-selector .ant-select-selection{background-color:#2a2e39;border-color:#363c4e;color:#d1d4dc}.add-stock-modal-content .market-tabs[data-v-76a3e064]{margin-bottom:16px}.add-stock-modal-content .hot-symbols-section[data-v-76a3e064],.add-stock-modal-content .search-results-section[data-v-76a3e064],.add-stock-modal-content .symbol-search-section[data-v-76a3e064]{margin-bottom:24px}.add-stock-modal-content .hot-symbols-section .section-title[data-v-76a3e064],.add-stock-modal-content .search-results-section .section-title[data-v-76a3e064]{font-size:14px;font-weight:600;color:#262626;margin-bottom:12px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.add-stock-modal-content .symbol-list[data-v-76a3e064]{max-height:200px;overflow-y:auto;border:1px solid #e8e8e8;border-radius:4px}.add-stock-modal-content .symbol-list .symbol-list-item[data-v-76a3e064]{cursor:pointer;padding:8px 12px;-webkit-transition:background-color .3s;transition:background-color .3s}.add-stock-modal-content .symbol-list .symbol-list-item[data-v-76a3e064]:hover{background-color:#f5f5f5}.add-stock-modal-content .symbol-list .symbol-list-item .symbol-item-content[data-v-76a3e064]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:8px}.add-stock-modal-content .symbol-list .symbol-list-item .symbol-item-content .symbol-code[data-v-76a3e064]{font-weight:600;color:#262626;min-width:80px}.add-stock-modal-content .symbol-list .symbol-list-item .symbol-item-content .symbol-name[data-v-76a3e064]{color:#595959;-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.add-stock-modal-content .selected-symbol-section[data-v-76a3e064]{margin-top:16px}.add-stock-modal-content .selected-symbol-section .selected-symbol-info[data-v-76a3e064]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.skeleton-box .skeleton-text[data-v-76a3e064]{display:block;height:12px;background:-webkit-gradient(linear,left top,right top,color-stop(25%,#e2e8f0),color-stop(50%,#f1f5f9),color-stop(75%,#e2e8f0));background:linear-gradient(90deg,#e2e8f0 25%,#f1f5f9 50%,#e2e8f0 75%);background-size:200% 100%;-webkit-animation:skeleton-pulse-76a3e064 1.5s ease-in-out infinite;animation:skeleton-pulse-76a3e064 1.5s ease-in-out infinite;border-radius:4px;margin:3px 0}.skeleton-box .skeleton-text.short[data-v-76a3e064]{width:40px;height:9px}.skeleton-cell[data-v-76a3e064]{background:#f8fafc!important;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding:8px 4px}.skeleton-cell .skeleton-text[data-v-76a3e064]{width:80%;height:10px;background:-webkit-gradient(linear,left top,right top,color-stop(25%,#e2e8f0),color-stop(50%,#f1f5f9),color-stop(75%,#e2e8f0));background:linear-gradient(90deg,#e2e8f0 25%,#f1f5f9 50%,#e2e8f0 75%);background-size:200% 100%;-webkit-animation:skeleton-pulse-76a3e064 1.5s ease-in-out infinite;animation:skeleton-pulse-76a3e064 1.5s ease-in-out infinite;border-radius:3px;margin:2px 0}.skeleton-cell .skeleton-text.short[data-v-76a3e064]{width:50%;height:8px}.skeleton-item[data-v-76a3e064]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:8px;padding:6px 0}.skeleton-item .skeleton-text[data-v-76a3e064]{height:12px;background:-webkit-gradient(linear,left top,right top,color-stop(25%,#e2e8f0),color-stop(50%,#f1f5f9),color-stop(75%,#e2e8f0));background:linear-gradient(90deg,#e2e8f0 25%,#f1f5f9 50%,#e2e8f0 75%);background-size:200% 100%;-webkit-animation:skeleton-pulse-76a3e064 1.5s ease-in-out infinite;animation:skeleton-pulse-76a3e064 1.5s ease-in-out infinite;border-radius:4px;-webkit-box-flex:1;-ms-flex:1;flex:1}.skeleton-item .skeleton-text.short[data-v-76a3e064]{-webkit-box-flex:0;-ms-flex:none;flex:none;width:40px}.indices-empty[data-v-76a3e064],.indices-loading[data-v-76a3e064]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;height:100%;font-size:11px;color:#94a3b8;padding:4px 16px}.indices-loading .anticon[data-v-76a3e064]{margin-right:6px}.heatmap-empty[data-v-76a3e064]{grid-column:-1;text-align:center;padding:20px;color:#94a3b8;font-size:12px}@-webkit-keyframes skeleton-pulse-76a3e064{0%{background-position:200% 0}to{background-position:-200% 0}}@keyframes skeleton-pulse-76a3e064{0%{background-position:200% 0}to{background-position:-200% 0}}.theme-dark .skeleton-box .skeleton-text[data-v-76a3e064],.theme-dark .skeleton-cell .skeleton-text[data-v-76a3e064],.theme-dark .skeleton-item .skeleton-text[data-v-76a3e064]{background:-webkit-gradient(linear,left top,right top,color-stop(25%,#363c4e),color-stop(50%,#424857),color-stop(75%,#363c4e));background:linear-gradient(90deg,#363c4e 25%,#424857 50%,#363c4e 75%);background-size:200% 100%}.theme-dark .skeleton-cell[data-v-76a3e064]{background:#2a2e39!important}.theme-dark .heatmap-empty[data-v-76a3e064],.theme-dark .indices-empty[data-v-76a3e064],.theme-dark .indices-loading[data-v-76a3e064]{color:#64748b} \ No newline at end of file diff --git a/frontend/dist/css/theme-colors-c34f1238.css b/frontend/dist/css/theme-colors-de962665.css similarity index 95% rename from frontend/dist/css/theme-colors-c34f1238.css rename to frontend/dist/css/theme-colors-de962665.css index 367aa43..055b759 100644 --- a/frontend/dist/css/theme-colors-c34f1238.css +++ b/frontend/dist/css/theme-colors-de962665.css @@ -33,31 +33,35 @@ html{--antd-wave-shadow-color:#1890ff} #nprogress .bar{background:#1890ff} #nprogress .peg{-webkit-box-shadow:0 0 10px #1890ff,0 0 5px #1890ff;box-shadow:0 0 10px #1890ff,0 0 5px #1890ff} #nprogress .spinner-icon{border-top-color:#1890ff;border-left-color:#1890ff} -.fast-analysis-report .loading-container .loading-content-pro .loading-header .loading-icon-pro[data-v-110dde64]{color:#1890ff} -.fast-analysis-report .loading-container .loading-content-pro .progress-wrapper .progress-text[data-v-110dde64]{color:#1890ff} -.fast-analysis-report .loading-container .loading-content-pro .current-step[data-v-110dde64]{color:#1890ff} -.fast-analysis-report .loading-container .loading-content-pro .steps-list .step-item.active[data-v-110dde64]{background:#e6f7ff;color:#1890ff} -.fast-analysis-report .loading-container .loading-content-pro .steps-list .step-item.active .step-dot[data-v-110dde64]{background:#1890ff;-webkit-box-shadow:0 0 0 3px rgba(24,144,255,.2);box-shadow:0 0 0 3px rgba(24,144,255,.2)} -.fast-analysis-report .result-container .decision-card[data-v-110dde64]{border-left:6px solid #1890ff} -.fast-analysis-report .result-container .price-info-row .price-card.current[data-v-110dde64]{border-top:3px solid #1890ff} -.fast-analysis-report .result-container .scores-row .score-item .score-header .anticon[data-v-110dde64]{color:#1890ff} -.fast-analysis-report .result-container .scores-row .score-item.overall[data-v-110dde64]{background:linear-gradient(135deg,#e6f7ff,#fff);border:1px solid #91d5ff} -.fast-analysis-report .result-container .detailed-analysis .analysis-card[data-v-110dde64]{border-left:4px solid #1890ff} -.fast-analysis-report .result-container .detailed-analysis .analysis-card.technical[data-v-110dde64]{border-left-color:#1890ff} -.fast-analysis-report .result-container .detailed-analysis .analysis-card .analysis-card-header.technical .anticon[data-v-110dde64]{color:#1890ff} -.fast-analysis-report .result-container .analysis-details .detail-section .detail-list li[data-v-110dde64]:before{color:#1890ff} -.fast-analysis-report .result-container .indicators-section .section-title .anticon[data-v-110dde64]{color:#1890ff} -.fast-analysis-report.theme-dark .decision-card[data-v-110dde64]{border-left-color:#1890ff} -.fast-analysis-report.theme-dark .detailed-analysis .analysis-card.technical[data-v-110dde64]{border-left-color:#1890ff} -.fast-analysis-report.theme-dark .score-item.overall[data-v-110dde64]{background:linear-gradient(135deg,rgba(24,144,255,.1),#2a2e39);border-color:#1890ff} -.left-panel .heatmap-box .box-header[data-v-76a3e064] .ant-radio-group .ant-radio-button-wrapper.ant-radio-button-wrapper-checked{background:var(--primary-color,#1890ff);border-color:var(--primary-color,#1890ff)} -.left-panel .calendar-box .box-header .box-title .anticon[data-v-76a3e064]{color:var(--primary-color,#1890ff)} -.right-panel .analysis-toolbar .analyze-button[data-v-76a3e064]{background:var(--primary-color,#1890ff);border-color:var(--primary-color,#1890ff)} -.right-panel .analysis-main .analysis-placeholder .placeholder-content .placeholder-icon[data-v-76a3e064]{color:var(--primary-color,#1890ff)} -.watchlist-panel .watchlist-list .watchlist-item.active[data-v-76a3e064]{background:#e6f7ff;border:1px solid #91d5ff} -.ai-analysis-container.theme-dark .watchlist-panel .watchlist-list .watchlist-item.active[data-v-76a3e064]{background:rgba(24,144,255,.1);border-color:#1890ff} -.ai-analysis-container.theme-dark .watchlist-bar-legacy .stock-chip.active[data-v-76a3e064],.ai-analysis-container.theme-dark .watchlist-bar-legacy .stock-chip[data-v-76a3e064]:hover{border-color:var(--primary-color,#1890ff);background:rgba(24,144,255,.1)} -.ai-analysis-container.theme-dark .watchlist-bar-compat .stock-chip.active[data-v-76a3e064],.ai-analysis-container.theme-dark .watchlist-bar-compat .stock-chip[data-v-76a3e064]:hover{border-color:var(--primary-color,#1890ff);background:rgba(24,144,255,.1)} +.fast-analysis-report .loading-container .loading-content-pro .loading-header .loading-icon-pro[data-v-693144f6]{color:#1890ff} +.fast-analysis-report .loading-container .loading-content-pro .progress-wrapper .progress-text[data-v-693144f6]{color:#1890ff} +.fast-analysis-report .loading-container .loading-content-pro .current-step[data-v-693144f6]{color:#1890ff} +.fast-analysis-report .loading-container .loading-content-pro .steps-list .step-item.active[data-v-693144f6]{background:#e6f7ff;color:#1890ff} +.fast-analysis-report .loading-container .loading-content-pro .steps-list .step-item.active .step-dot[data-v-693144f6]{background:#1890ff;-webkit-box-shadow:0 0 0 3px rgba(24,144,255,.2);box-shadow:0 0 0 3px rgba(24,144,255,.2)} +.fast-analysis-report .result-container .decision-card[data-v-693144f6]{border-left:6px solid #1890ff} +.fast-analysis-report .result-container .decision-card .consensus-strip[data-v-693144f6]{background:rgba(24,144,255,.06);border:1px solid rgba(24,144,255,.2)} +.fast-analysis-report .result-container .decision-card .consensus-strip .consensus-strip-title[data-v-693144f6]{color:#1890ff} +.fast-analysis-report .result-container .price-info-row .price-card.current[data-v-693144f6]{border-top:3px solid #1890ff} +.fast-analysis-report .result-container .scores-row .score-item .score-header .anticon[data-v-693144f6]{color:#1890ff} +.fast-analysis-report .result-container .scores-row .score-item.overall[data-v-693144f6]{background:linear-gradient(135deg,#e6f7ff,#fff);border:1px solid #91d5ff} +.fast-analysis-report .result-container .detailed-analysis .analysis-card[data-v-693144f6]{border-left:4px solid #1890ff} +.fast-analysis-report .result-container .detailed-analysis .analysis-card.technical[data-v-693144f6]{border-left-color:#1890ff} +.fast-analysis-report .result-container .detailed-analysis .analysis-card .analysis-card-header.technical .anticon[data-v-693144f6]{color:#1890ff} +.fast-analysis-report .result-container .analysis-details .detail-section .detail-list li[data-v-693144f6]:before{color:#1890ff} +.fast-analysis-report .result-container .indicators-section .section-title .anticon[data-v-693144f6]{color:#1890ff} +.fast-analysis-report.theme-dark .decision-card[data-v-693144f6]{border-left-color:#1890ff} +.fast-analysis-report.theme-dark .decision-card .consensus-strip[data-v-693144f6]{background:rgba(24,144,255,.12);border-color:rgba(24,144,255,.35)} +.fast-analysis-report.theme-dark .decision-card .consensus-strip .consensus-strip-title[data-v-693144f6]{color:#69c0ff} +.fast-analysis-report.theme-dark .detailed-analysis .analysis-card.technical[data-v-693144f6]{border-left-color:#1890ff} +.fast-analysis-report.theme-dark .score-item.overall[data-v-693144f6]{background:linear-gradient(135deg,rgba(24,144,255,.1),#2a2e39);border-color:#1890ff} +.left-panel .heatmap-box .box-header[data-v-41eda137] .ant-radio-group .ant-radio-button-wrapper.ant-radio-button-wrapper-checked{background:var(--primary-color,#1890ff);border-color:var(--primary-color,#1890ff)} +.left-panel .calendar-box .box-header .box-title .anticon[data-v-41eda137]{color:var(--primary-color,#1890ff)} +.right-panel .analysis-toolbar .analyze-button[data-v-41eda137]{background:var(--primary-color,#1890ff);border-color:var(--primary-color,#1890ff)} +.right-panel .analysis-main .analysis-placeholder .placeholder-content .placeholder-icon[data-v-41eda137]{color:var(--primary-color,#1890ff)} +.watchlist-panel .watchlist-list .watchlist-item.active[data-v-41eda137]{background:#e6f7ff;border:1px solid #91d5ff} +.ai-analysis-container.theme-dark .watchlist-panel .watchlist-list .watchlist-item.active[data-v-41eda137]{background:rgba(24,144,255,.1);border-color:#1890ff} +.ai-analysis-container.theme-dark .watchlist-bar-legacy .stock-chip.active[data-v-41eda137],.ai-analysis-container.theme-dark .watchlist-bar-legacy .stock-chip[data-v-41eda137]:hover{border-color:var(--primary-color,#1890ff);background:rgba(24,144,255,.1)} +.ai-analysis-container.theme-dark .watchlist-bar-compat .stock-chip.active[data-v-41eda137],.ai-analysis-container.theme-dark .watchlist-bar-compat .stock-chip[data-v-41eda137]:hover{border-color:var(--primary-color,#1890ff);background:rgba(24,144,255,.1)} .qt-header .qt-header-left .qt-icon[data-v-0d547552]{color:#1890ff} .theme-dark[data-v-0d547552] .ant-radio-group .ant-radio-button-wrapper.ant-radio-button-wrapper-checked{background:#1890ff;border-color:#1890ff} .theme-dark[data-v-0d547552] .ant-slider-track{background:#1890ff} diff --git a/frontend/dist/index.html b/frontend/dist/index.html index f1fa225..c93762a 100644 --- a/frontend/dist/index.html +++ b/frontend/dist/index.html @@ -421,4 +421,4 @@ .brand-text { font-size: 20px; } - }

Landing

QuantDinger
\ No newline at end of file + }

Landing

QuantDinger
\ No newline at end of file diff --git a/frontend/dist/js/268-legacy.a4c6490d.js b/frontend/dist/js/268-legacy.a4c6490d.js new file mode 100644 index 0000000..1dc3153 --- /dev/null +++ b/frontend/dist/js/268-legacy.a4c6490d.js @@ -0,0 +1 @@ +"use strict";(self["webpackChunkvue_antd_pro"]=self["webpackChunkvue_antd_pro"]||[]).push([[268],{90268:function(t,s,a){a.r(s),a.d(s,{default:function(){return M}});a(28706),a(34782),a(62010),a(9868);var e=function(){var t=this,s=t._self._c;return s("div",{staticClass:"ai-analysis-container",class:{"theme-dark":t.isDarkTheme,embedded:t.embedded},style:{"--primary-color":t.primaryColor}},[s("div",{staticClass:"main-content-full"},[s("div",{staticClass:"top-index-bar"},[t.loadingSentiment?[t._m(0),t._m(1),t._m(2)]:[s("div",{staticClass:"indicator-box fear-greed",class:t.getFearGreedClass(t.marketData.fearGreed)},[s("span",{staticClass:"ind-label"},[t._v(t._s(t.$t("globalMarket.fearGreedShort")))]),s("span",{staticClass:"ind-value"},[t._v(t._s(t.marketData.fearGreed||"--"))])]),s("div",{staticClass:"indicator-box vix",class:t.getVixLevel(t.marketData.vix)},[s("span",{staticClass:"ind-label"},[t._v("VIX")]),s("span",{staticClass:"ind-value"},[t._v(t._s(t.marketData.vix||"--"))])]),s("div",{staticClass:"indicator-box dxy"},[s("span",{staticClass:"ind-label"},[t._v("DXY")]),s("span",{staticClass:"ind-value"},[t._v(t._s(t.marketData.dxy||"--"))])])],s("div",{staticClass:"indices-marquee"},[t.loadingIndices?[s("div",{staticClass:"indices-loading"},[s("a-icon",{attrs:{type:"loading"}}),t._v(" "+t._s(t.$t("common.loading")||"加载中...")+" ")],1)]:t.marketData.indices.length>0?[s("div",{staticClass:"marquee-track"},[t._l(t.marketData.indices,function(a){return s("div",{key:"a-"+a.symbol,staticClass:"index-item"},[s("span",{staticClass:"idx-flag"},[t._v(t._s(a.flag))]),s("span",{staticClass:"idx-symbol"},[t._v(t._s(a.symbol))]),s("span",{staticClass:"idx-price"},[t._v(t._s(t.formatPrice(a.price)))]),s("span",{staticClass:"idx-change",class:a.change>=0?"up":"down"},[s("a-icon",{attrs:{type:a.change>=0?"caret-up":"caret-down"}}),t._v(" "+t._s(Math.abs(a.change).toFixed(2))+"% ")],1)])}),t._l(t.marketData.indices,function(a){return s("div",{key:"b-"+a.symbol,staticClass:"index-item"},[s("span",{staticClass:"idx-flag"},[t._v(t._s(a.flag))]),s("span",{staticClass:"idx-symbol"},[t._v(t._s(a.symbol))]),s("span",{staticClass:"idx-price"},[t._v(t._s(t.formatPrice(a.price)))]),s("span",{staticClass:"idx-change",class:a.change>=0?"up":"down"},[s("a-icon",{attrs:{type:a.change>=0?"caret-up":"caret-down"}}),t._v(" "+t._s(Math.abs(a.change).toFixed(2))+"% ")],1)])})],2)]:[s("div",{staticClass:"indices-empty"},[t._v("--")])]],2),s("a-button",{staticClass:"refresh-btn",attrs:{type:"link",size:"small",loading:t.loadingMarket},on:{click:t.loadMarketData}},[s("a-icon",{attrs:{type:"sync",spin:t.loadingMarket}})],1)],2),s("div",{staticClass:"main-body"},[s("div",{staticClass:"left-panel"},[s("div",{staticClass:"heatmap-box"},[s("div",{staticClass:"box-header"},[s("a-radio-group",{attrs:{size:"small","button-style":"solid"},model:{value:t.heatmapType,callback:function(s){t.heatmapType=s},expression:"heatmapType"}},[s("a-radio-button",{attrs:{value:"crypto"}},[t._v(t._s(t.$t("globalMarket.cryptoHeatmap")))]),s("a-radio-button",{attrs:{value:"commodities"}},[t._v(t._s(t.$t("globalMarket.commoditiesHeatmap")))]),s("a-radio-button",{attrs:{value:"sectors"}},[t._v(t._s(t.$t("globalMarket.sectorHeatmap")))]),s("a-radio-button",{attrs:{value:"forex"}},[t._v(t._s(t.$t("globalMarket.forexHeatmap")))])],1)],1),s("div",{staticClass:"heatmap-grid"},[t.loadingHeatmap?t._l(12,function(t){return s("div",{key:"skel-"+t,staticClass:"heat-cell skeleton-cell"},[s("span",{staticClass:"skeleton-text short"}),s("span",{staticClass:"skeleton-text"})])}):t.currentHeatmap.length>0?t._l(t.currentHeatmap.slice(0,12),function(a,e){return s("div",{key:e,staticClass:"heat-cell",style:t.getHeatmapStyle(a.value)},[s("span",{staticClass:"heat-name"},[t._v(t._s(t.getHeatmapName(a)))]),a.price?s("span",{staticClass:"heat-price"},[t._v(t._s(t.formatHeatmapPrice(a.price)))]):t._e(),s("span",{staticClass:"heat-val"},[t._v(t._s(a.value>=0?"+":"")+t._s(t.formatNum(a.value))+"%")])])}):[s("div",{staticClass:"heatmap-empty"},[t._v(t._s(t.$t("common.noData")||"暂无数据"))])]],2)]),s("div",{staticClass:"calendar-box"},[s("div",{staticClass:"box-header"},[s("span",{staticClass:"box-title"},[s("a-icon",{attrs:{type:"calendar"}}),t._v(" "+t._s(t.$t("globalMarket.calendar")))],1)]),s("div",{staticClass:"calendar-list"},[t.loadingCalendar?t._l(5,function(t){return s("div",{key:"cal-skel-"+t,staticClass:"cal-item skeleton-item"},[s("span",{staticClass:"skeleton-text short"}),s("span",{staticClass:"skeleton-text short"}),s("span",{staticClass:"skeleton-text"})])}):t.marketData.calendar.length>0?t._l(t.marketData.calendar.slice(0,10),function(a){return s("div",{key:a.id,staticClass:"cal-item",class:a.importance},[s("span",{staticClass:"cal-date"},[t._v(t._s(t.formatCalendarDate(a.date)))]),s("span",{staticClass:"cal-time"},[t._v(t._s(a.time||"--:--"))]),s("span",{staticClass:"cal-flag"},[t._v(t._s(t.getCountryFlag(a.country)))]),s("span",{staticClass:"cal-name"},[t._v(t._s(t.isZhLocale?a.name:a.name_en))]),s("span",{staticClass:"cal-impact",class:t.getImpactClass(a)},["bullish"===t.getImpactClass(a)?s("a-icon",{attrs:{type:"arrow-up"}}):"bearish"===t.getImpactClass(a)?s("a-icon",{attrs:{type:"arrow-down"}}):s("a-icon",{attrs:{type:"minus"}}),t._v(" "+t._s(a.actual||a.forecast||"--")+" ")],1)])}):[s("div",{staticClass:"cal-empty"},[t._v(t._s(t.$t("globalMarket.noEvents")))])]],2)])]),s("div",{staticClass:"right-panel"},[s("div",{staticClass:"analysis-toolbar"},[s("a-select",{staticClass:"symbol-selector",attrs:{placeholder:t.$t("dashboard.analysis.empty.selectSymbol"),size:"large","show-search":"","allow-clear":"","filter-option":t.filterSymbolOption},on:{change:t.handleSymbolChange},model:{value:t.selectedSymbol,callback:function(s){t.selectedSymbol=s},expression:"selectedSymbol"}},[t._l(t.watchlist||[],function(a){return s("a-select-option",{key:"".concat(a.market,"-").concat(a.symbol),attrs:{value:"".concat(a.market,":").concat(a.symbol)}},[s("span",{staticClass:"symbol-option"},[s("a-tag",{attrs:{color:t.getMarketColor(a.market),size:"small"}},[t._v(t._s(t.getMarketName(a.market)))]),s("strong",{staticStyle:{"margin-left":"6px"}},[t._v(t._s(a.symbol))]),a.name?s("span",{staticClass:"symbol-name"},[t._v(t._s(a.name))]):t._e()],1)])}),s("a-select-option",{key:"add-stock-option",staticClass:"add-stock-option",attrs:{value:"__add_stock_option__"}},[s("div",{staticStyle:{"text-align":"center",padding:"4px 0",color:"#1890ff"}},[s("a-icon",{staticStyle:{"margin-right":"4px"},attrs:{type:"plus"}}),t._v(t._s(t.$t("dashboard.analysis.watchlist.add"))+" ")],1)])],2),s("a-button",{staticClass:"analyze-button",attrs:{type:"primary",size:"large",icon:"thunderbolt",loading:t.analyzing,disabled:!t.selectedSymbol||t.analyzing},on:{click:t.startFastAnalysis}},[t._v(" "+t._s(t.$t("fastAnalysis.startAnalysis"))+" ")]),s("a-button",{staticClass:"history-button",attrs:{size:"large",icon:"history"},on:{click:function(s){t.showHistoryModal=!0,t.loadHistoryList()}}},[t._v(" "+t._s(t.$t("fastAnalysis.history"))+" ")])],1),s("div",{staticClass:"analysis-main"},[t.analysisResult||t.analyzing||t.analysisError?t._e():s("div",{staticClass:"analysis-placeholder"},[s("div",{staticClass:"placeholder-content"},[s("div",{staticClass:"placeholder-icon"},[s("a-icon",{attrs:{type:"robot"}})],1),s("h3",[t._v(t._s(t.$t("fastAnalysis.selectTip")))]),s("p",[t._v(t._s(t.$t("fastAnalysis.selectHint")))])])]),t.analysisResult||t.analyzing||t.analysisError?s("FastAnalysisReport",{attrs:{result:t.analysisResult,loading:t.analyzing,error:t.analysisError,"error-tone":t.analysisErrorTone},on:{retry:t.startFastAnalysis}}):t._e()],1)]),s("div",{staticClass:"watchlist-panel"},[s("div",{staticClass:"panel-header"},[s("span",{staticClass:"panel-title"},[s("a-icon",{attrs:{type:"star",theme:"filled"}}),t._v(" "+t._s(t.$t("dashboard.analysis.watchlist.title")))],1),s("a-button",{attrs:{type:"link",size:"small"},on:{click:function(s){t.showAddStockModal=!0}}},[s("a-icon",{attrs:{type:"plus"}})],1)],1),s("div",{staticClass:"watchlist-list"},[t._l(t.watchlist||[],function(a){var e,i,r;return s("div",{key:"".concat(a.market,"-").concat(a.symbol),staticClass:"watchlist-item",class:{active:t.selectedSymbol==="".concat(a.market,":").concat(a.symbol)},on:{click:function(s){return t.selectWatchlistItem(a)}}},[s("div",{staticClass:"item-main"},[s("span",{staticClass:"item-symbol"},[t._v(t._s(a.symbol))]),s("span",{staticClass:"item-name"},[t._v(t._s(a.name||t.getMarketName(a.market)))])]),t.watchlistPrices["".concat(a.market,":").concat(a.symbol)]?s("div",{staticClass:"item-price"},[s("span",{staticClass:"price-value"},[t._v(t._s(t.formatPrice(t.watchlistPrices["".concat(a.market,":").concat(a.symbol)].price)))]),s("span",{staticClass:"price-change",class:((null===(e=t.watchlistPrices["".concat(a.market,":").concat(a.symbol)])||void 0===e?void 0:e.change)||0)>=0?"up":"down"},[t._v(" "+t._s(((null===(i=t.watchlistPrices["".concat(a.market,":").concat(a.symbol)])||void 0===i?void 0:i.change)||0)>=0?"+":"")+t._s(t.formatNum(null===(r=t.watchlistPrices["".concat(a.market,":").concat(a.symbol)])||void 0===r?void 0:r.change))+"% ")])]):t._e(),s("a-icon",{staticClass:"item-remove",attrs:{type:"close"},on:{click:function(s){return s.stopPropagation(),t.removeFromWatchlist(a)}}})],1)}),t.watchlist&&0!==t.watchlist.length?t._e():s("div",{staticClass:"watchlist-empty"},[s("a-icon",{attrs:{type:"inbox"}}),s("p",[t._v(t._s(t.$t("dashboard.analysis.empty.noWatchlist")))]),s("a-button",{attrs:{type:"primary",size:"small"},on:{click:function(s){t.showAddStockModal=!0}}},[s("a-icon",{attrs:{type:"plus"}}),t._v(" "+t._s(t.$t("dashboard.analysis.watchlist.add"))+" ")],1)],1)],2)])])]),s("a-modal",{attrs:{title:t.$t("dashboard.analysis.modal.addStock.title"),visible:t.showAddStockModal,confirmLoading:t.addingStock,width:"600px",okText:t.$t("dashboard.analysis.modal.addStock.confirm"),cancelText:t.$t("dashboard.analysis.modal.addStock.cancel")},on:{ok:t.handleAddStock,cancel:t.handleCloseAddStockModal}},[s("div",{staticClass:"add-stock-modal-content"},[s("a-tabs",{staticClass:"market-tabs",on:{change:t.handleMarketTabChange},model:{value:t.selectedMarketTab,callback:function(s){t.selectedMarketTab=s},expression:"selectedMarketTab"}},t._l(t.marketTypes,function(a){return s("a-tab-pane",{key:a.value,attrs:{tab:t.$t(a.i18nKey||"dashboard.analysis.market.".concat(a.value))}})}),1),s("div",{staticClass:"symbol-search-section"},[s("a-input-search",{attrs:{placeholder:t.$t("dashboard.analysis.modal.addStock.searchOrInputPlaceholder"),loading:t.searchingSymbols,size:"large","allow-clear":""},on:{search:t.handleSearchOrInput,change:t.handleSymbolSearchInput},model:{value:t.symbolSearchKeyword,callback:function(s){t.symbolSearchKeyword=s},expression:"symbolSearchKeyword"}},[s("a-button",{attrs:{slot:"enterButton",type:"primary",icon:"search"},slot:"enterButton"},[t._v(" "+t._s(t.$t("dashboard.analysis.modal.addStock.search"))+" ")])],1)],1),t.symbolSearchResults.length>0?s("div",{staticClass:"search-results-section"},[s("div",{staticClass:"section-title"},[s("a-icon",{staticStyle:{"margin-right":"4px"},attrs:{type:"search"}}),t._v(" "+t._s(t.$t("dashboard.analysis.modal.addStock.searchResults"))+" ")],1),s("a-list",{staticClass:"symbol-list",attrs:{"data-source":t.symbolSearchResults,loading:t.searchingSymbols,size:"small"},scopedSlots:t._u([{key:"renderItem",fn:function(a){return s("a-list-item",{staticClass:"symbol-list-item",on:{click:function(s){return t.selectSymbol(a)}}},[s("a-list-item-meta",[s("template",{slot:"title"},[s("div",{staticClass:"symbol-item-content"},[s("span",{staticClass:"symbol-code"},[t._v(t._s(a.symbol))]),s("span",{staticClass:"symbol-name"},[t._v(t._s(a.name))]),a.exchange?s("a-tag",{staticStyle:{"margin-left":"8px"},attrs:{size:"small",color:"blue"}},[t._v(" "+t._s(a.exchange)+" ")]):t._e()],1)])],2)],1)}}],null,!1,1074844145)})],1):t._e(),s("div",{staticClass:"hot-symbols-section"},[s("div",{staticClass:"section-title"},[s("a-icon",{staticStyle:{color:"#ff4d4f","margin-right":"4px"},attrs:{type:"fire"}}),t._v(" "+t._s(t.$t("dashboard.analysis.modal.addStock.hotSymbols"))+" ")],1),s("a-spin",{attrs:{spinning:t.loadingHotSymbols}},[t.hotSymbols.length>0?s("a-list",{staticClass:"symbol-list",attrs:{"data-source":t.hotSymbols,size:"small"},scopedSlots:t._u([{key:"renderItem",fn:function(a){return s("a-list-item",{staticClass:"symbol-list-item",on:{click:function(s){return t.selectSymbol(a)}}},[s("a-list-item-meta",[s("template",{slot:"title"},[s("div",{staticClass:"symbol-item-content"},[s("span",{staticClass:"symbol-code"},[t._v(t._s(a.symbol))]),s("span",{staticClass:"symbol-name"},[t._v(t._s(a.name))]),a.exchange?s("a-tag",{staticStyle:{"margin-left":"8px"},attrs:{size:"small",color:"orange"}},[t._v(" "+t._s(a.exchange)+" ")]):t._e()],1)])],2)],1)}}],null,!1,2177647935)}):s("a-empty",{attrs:{description:t.$t("dashboard.analysis.modal.addStock.noHotSymbols"),image:!1}})],1)],1),t.selectedSymbolForAdd?s("div",{staticClass:"selected-symbol-section"},[s("a-alert",{attrs:{message:t.$t("dashboard.analysis.modal.addStock.selectedSymbol"),type:"info","show-icon":"",closable:""},on:{close:function(s){t.selectedSymbolForAdd=null}}},[s("template",{slot:"description"},[s("div",{staticClass:"selected-symbol-info"},[s("a-tag",{staticStyle:{"margin-right":"8px"},attrs:{color:t.getMarketColor(t.selectedSymbolForAdd.market)}},[t._v(" "+t._s(t.$t("dashboard.analysis.market.".concat(t.selectedSymbolForAdd.market)))+" ")]),s("strong",[t._v(t._s(t.selectedSymbolForAdd.symbol))]),t.selectedSymbolForAdd.name?s("span",{staticStyle:{color:"#999","margin-left":"8px"}},[t._v(t._s(t.selectedSymbolForAdd.name))]):t._e()],1)])],2)],1):t._e()],1)]),s("a-modal",{attrs:{title:t.$t("dashboard.analysis.modal.history.title"),visible:t.showHistoryModal,footer:null,width:"800px",bodyStyle:{maxHeight:"60vh",overflowY:"auto"}},on:{cancel:function(s){t.showHistoryModal=!1}}},[s("a-spin",{attrs:{spinning:t.historyLoading}},[s("a-list",{attrs:{"data-source":t.historyList,pagination:{current:t.historyPage,pageSize:t.historyPageSize,total:t.historyTotal,onChange:function(s){t.historyPage=s,t.loadHistoryList()},showSizeChanger:!0,pageSizeOptions:["10","20","50"],onShowSizeChange:function(s,a){t.historyPageSize=a,t.historyPage=1,t.loadHistoryList()}}},scopedSlots:t._u([{key:"renderItem",fn:function(a){return s("a-list-item",{},[s("a-list-item-meta",[s("template",{slot:"title"},[s("div",{staticStyle:{display:"flex","align-items":"center","justify-content":"space-between"}},[s("div",[s("a-tag",{staticStyle:{"margin-right":"8px"},attrs:{color:t.getMarketColor(a.market)}},[t._v(" "+t._s(t.getMarketName(a.market))+" ")]),s("strong",[t._v(t._s(a.symbol))]),s("a-tag",{staticStyle:{"margin-left":"12px"},attrs:{color:"BUY"===a.decision?"green":"SELL"===a.decision?"red":"blue"}},[t._v(" "+t._s(a.decision)+" ")]),s("span",{staticStyle:{color:"#999","margin-left":"8px","font-size":"12px"}},[t._v(" "+t._s(t.$t("fastAnalysis.confidence"))+": "+t._s(a.confidence)+"% ")])],1),s("div",[s("a-button",{attrs:{type:"link",size:"small",icon:"eye"},on:{click:function(s){return t.viewHistoryResult(a)}}},[t._v(" "+t._s(t.$t("dashboard.analysis.modal.history.viewResult"))+" ")]),s("a-popconfirm",{attrs:{title:t.$t("dashboard.analysis.modal.history.deleteConfirm"),"ok-text":t.$t("common.confirm"),"cancel-text":t.$t("common.cancel")},on:{confirm:function(s){return t.deleteHistoryItem(a)}}},[s("a-button",{staticStyle:{color:"#ff4d4f"},attrs:{type:"link",size:"small",icon:"delete"}},[t._v(" "+t._s(t.$t("dashboard.analysis.modal.history.delete"))+" ")])],1)],1)])]),s("template",{slot:"description"},[s("div",{staticStyle:{color:"#666","font-size":"12px"}},[a.price?s("span",[t._v("$"+t._s(t.formatNumber(a.price)))]):t._e(),a.summary?s("span",{staticStyle:{"margin-left":"8px"}},[t._v(t._s(a.summary.substring(0,80))+t._s(a.summary.length>80?"...":""))]):t._e()]),a.created_at?s("div",{staticStyle:{color:"#999","font-size":"12px","margin-top":"4px"}},[t._v(" "+t._s(t.formatIsoTime(a.created_at))+" ")]):t._e()])],2)],1)}}])}),t.historyLoading||0!==t.historyList.length?t._e():s("a-empty",{attrs:{description:t.$t("dashboard.analysis.empty.noHistory")}})],1)],1)],1)},i=[function(){var t=this,s=t._self._c;return s("div",{staticClass:"indicator-box skeleton-box"},[s("span",{staticClass:"skeleton-text short"}),s("span",{staticClass:"skeleton-text"})])},function(){var t=this,s=t._self._c;return s("div",{staticClass:"indicator-box skeleton-box"},[s("span",{staticClass:"skeleton-text short"}),s("span",{staticClass:"skeleton-text"})])},function(){var t=this,s=t._self._c;return s("div",{staticClass:"indicator-box skeleton-box"},[s("span",{staticClass:"skeleton-text short"}),s("span",{staticClass:"skeleton-text"})])}],r=a(68285),n=a(21092),l=a(76959),o=a(17654),c=a(57888),d=(a(74423),a(62062),a(2892),a(32637),a(40150),a(26099),a(21699),a(42762),a(23500),a(95353)),u=a(55585),m=a(64118),h=a(76471),y="/api/fast-analysis";function p(t){return(0,h.Ay)({url:"".concat(y,"/analyze"),method:"post",data:t,timeout:3e5})}function v(t){return(0,h.Ay)({url:"".concat(y,"/history/all"),method:"get",params:t})}function f(t){return(0,h.Ay)({url:"".concat(y,"/history/").concat(t),method:"delete"})}function g(t){return(0,h.Ay)({url:"".concat(y,"/feedback"),method:"post",data:t})}var b=a(62618),_=(a(79432),function(){var t,s,a,e,i,r,n,l,o,c,d,u,m,h,y,p,v,f,g,b,_,k,C,S,A,w=this,$=w._self._c;return $("div",{staticClass:"fast-analysis-report",class:{"theme-dark":w.isDarkTheme}},[w.loading?$("div",{staticClass:"loading-container"},[$("div",{staticClass:"loading-content-pro"},[$("div",{staticClass:"loading-header"},[$("a-icon",{staticClass:"loading-icon-pro",attrs:{type:"thunderbolt"}}),$("span",{staticClass:"loading-title"},[w._v(w._s(w.$t("fastAnalysis.analyzing")))])],1),$("div",{staticClass:"progress-wrapper"},[$("a-progress",{attrs:{percent:w.progressPercent,showInfo:!1,strokeColor:"#1890ff",strokeWidth:8}}),$("span",{staticClass:"progress-text"},[w._v(w._s(w.formatProgress(w.progressPercent))+"%")])],1),$("div",{staticClass:"current-step"},[$("a-icon",{attrs:{type:"loading",spin:""}}),$("span",[w._v(w._s(w.currentStepText))])],1),$("div",{staticClass:"steps-list"},[$("div",{staticClass:"step-item",class:{done:w.step>1,active:1===w.step}},[$("span",{staticClass:"step-dot"}),$("span",{staticClass:"step-text"},[w._v(w._s(w.$t("fastAnalysis.step1")||"获取实时数据"))]),w.step>1?$("a-icon",{staticClass:"step-check",attrs:{type:"check"}}):w._e()],1),$("div",{staticClass:"step-item",class:{done:w.step>2,active:2===w.step}},[$("span",{staticClass:"step-dot"}),$("span",{staticClass:"step-text"},[w._v(w._s(w.$t("fastAnalysis.step2")||"计算技术指标"))]),w.step>2?$("a-icon",{staticClass:"step-check",attrs:{type:"check"}}):w._e()],1),$("div",{staticClass:"step-item",class:{done:w.step>3,active:3===w.step}},[$("span",{staticClass:"step-dot"}),$("span",{staticClass:"step-text"},[w._v(w._s(w.$t("fastAnalysis.step3")||"AI深度分析"))]),w.step>3?$("a-icon",{staticClass:"step-check",attrs:{type:"check"}}):w._e()],1),$("div",{staticClass:"step-item",class:{done:w.step>4,active:4===w.step}},[$("span",{staticClass:"step-dot"}),$("span",{staticClass:"step-text"},[w._v(w._s(w.$t("fastAnalysis.step4")||"生成报告"))]),w.step>4?$("a-icon",{staticClass:"step-check",attrs:{type:"check"}}):w._e()],1)]),$("div",{staticClass:"loading-footer"},[$("span",{staticClass:"elapsed-time"},[w._v(w._s(w.elapsedTimeText))])])])]):w.error?$("div",{staticClass:"error-container"},[$("a-result",{attrs:{status:"warning"===w.errorTone?"warning":"error",title:w.errorTitle,"sub-title":w.error},scopedSlots:w._u([{key:"extra",fn:function(){return[$("a-button",{attrs:{type:"primary"},on:{click:function(t){return w.$emit("retry")}}},[w._v(" "+w._s(w.$t("fastAnalysis.retry"))+" ")])]},proxy:!0}])})],1):w.result?$("div",{staticClass:"result-container"},[$("div",{staticClass:"decision-card",class:w.decisionClass},[$("div",{staticClass:"decision-main"},[$("div",{staticClass:"decision-badge"},[$("a-icon",{attrs:{type:w.decisionIcon}}),$("span",{staticClass:"decision-text"},[w._v(w._s(w.result.decision))])],1),$("div",{staticClass:"confidence-ring"},[$("a-progress",{attrs:{type:"circle",percent:w.result.confidence,width:80,strokeColor:w.confidenceColor},scopedSlots:w._u([{key:"format",fn:function(t){return[$("span",{staticClass:"confidence-value"},[w._v(w._s(t)+"%")])]}}])}),$("div",{staticClass:"confidence-label"},[w._v(w._s(w.$t("fastAnalysis.confidence")))])],1)]),$("div",{staticClass:"decision-summary"},[w._v(" "+w._s(w.result.summary)+" ")]),w.consensusBlock?$("div",{staticClass:"consensus-strip"},[$("div",{staticClass:"consensus-strip-title"},[$("a-icon",{attrs:{type:"cluster"}}),w._v(" "+w._s(w.$t("fastAnalysis.consensusTitle"))+" ")],1),$("div",{staticClass:"consensus-strip-metrics"},[$("span",{staticClass:"cm-item"},[$("em",[w._v(w._s(w.$t("fastAnalysis.consensusDecision")))]),w._v(" "+w._s(w.consensusBlock.consensus_decision)+" ")]),$("span",{staticClass:"cm-item"},[$("em",[w._v(w._s(w.$t("fastAnalysis.consensusScore")))]),w._v(" "+w._s(w.formatConsensusNum(w.consensusBlock.consensus_score))+" ")]),null!=w.consensusBlock.agreement_ratio?$("span",{staticClass:"cm-item"},[$("em",[w._v(w._s(w.$t("fastAnalysis.consensusAgreement")))]),w._v(" "+w._s(w.formatAgreementPct(w.consensusBlock.agreement_ratio))+" ")]):w._e()])]):w._e()]),$("div",{staticClass:"price-info-row"},[$("div",{staticClass:"price-card current"},[$("div",{staticClass:"price-label"},[w._v(w._s(w.$t("fastAnalysis.currentPrice")))]),$("div",{staticClass:"price-value"},[w._v("$"+w._s(w.formatPrice(null===(t=w.result.market_data)||void 0===t?void 0:t.current_price)))]),$("div",{staticClass:"price-change",class:(null===(s=w.result.market_data)||void 0===s?void 0:s.change_24h)>=0?"positive":"negative"},[w._v(" "+w._s((null===(a=w.result.market_data)||void 0===a?void 0:a.change_24h)>=0?"+":"")+w._s(w.formatNumber(null===(e=w.result.market_data)||void 0===e?void 0:e.change_24h,2))+"% ")])]),$("div",{staticClass:"price-card entry"},[$("div",{staticClass:"price-label"},[w._v(w._s(w.$t("fastAnalysis.entryPrice")))]),$("div",{staticClass:"price-value"},[w._v("$"+w._s(w.formatPrice(null===(i=w.result.trading_plan)||void 0===i?void 0:i.entry_price)))])]),$("div",{staticClass:"price-card stop"},[$("div",{staticClass:"price-label"},[w._v(w._s(w.$t("fastAnalysis.stopLoss")))]),$("div",{staticClass:"price-value negative"},[w._v("$"+w._s(w.formatPrice(null===(r=w.result.trading_plan)||void 0===r?void 0:r.stop_loss)))]),$("div",{staticClass:"price-hint"},[$("a-tooltip",{attrs:{title:w.$t("fastAnalysis.stopLossHint")}},[$("a-icon",{attrs:{type:"info-circle"}}),w._v(" "+w._s(w.$t("fastAnalysis.atrBased"))+" ")],1)],1)]),$("div",{staticClass:"price-card target"},[$("div",{staticClass:"price-label"},[w._v(w._s(w.$t("fastAnalysis.takeProfit")))]),$("div",{staticClass:"price-value positive"},[w._v("$"+w._s(w.formatPrice(null===(n=w.result.trading_plan)||void 0===n?void 0:n.take_profit)))]),$("div",{staticClass:"price-hint"},[$("a-tooltip",{attrs:{title:w.$t("fastAnalysis.takeProfitHint")}},[$("a-icon",{attrs:{type:"info-circle"}}),w._v(" "+w._s(w.$t("fastAnalysis.atrBased"))+" ")],1)],1)])]),$("div",{staticClass:"scores-row"},[$("div",{staticClass:"score-item"},[$("div",{staticClass:"score-header"},[$("a-icon",{attrs:{type:"line-chart"}}),$("span",[w._v(w._s(w.$t("fastAnalysis.technical")))])],1),$("a-progress",{attrs:{percent:(null===(l=w.result.scores)||void 0===l?void 0:l.technical)||50,strokeColor:w.getScoreColor(null===(o=w.result.scores)||void 0===o?void 0:o.technical),showInfo:!1}}),$("div",{staticClass:"score-value"},[w._v(w._s((null===(c=w.result.scores)||void 0===c?void 0:c.technical)||50))])],1),$("div",{staticClass:"score-item"},[$("div",{staticClass:"score-header"},[$("a-icon",{attrs:{type:"bank"}}),$("span",[w._v(w._s(w.$t("fastAnalysis.fundamental")))])],1),$("a-progress",{attrs:{percent:(null===(d=w.result.scores)||void 0===d?void 0:d.fundamental)||50,strokeColor:w.getScoreColor(null===(u=w.result.scores)||void 0===u?void 0:u.fundamental),showInfo:!1}}),$("div",{staticClass:"score-value"},[w._v(w._s((null===(m=w.result.scores)||void 0===m?void 0:m.fundamental)||50))])],1),$("div",{staticClass:"score-item"},[$("div",{staticClass:"score-header"},[$("a-icon",{attrs:{type:"heart"}}),$("span",[w._v(w._s(w.$t("fastAnalysis.sentiment")))])],1),$("a-progress",{attrs:{percent:(null===(h=w.result.scores)||void 0===h?void 0:h.sentiment)||50,strokeColor:w.getScoreColor(null===(y=w.result.scores)||void 0===y?void 0:y.sentiment),showInfo:!1}}),$("div",{staticClass:"score-value"},[w._v(w._s((null===(p=w.result.scores)||void 0===p?void 0:p.sentiment)||50))])],1),$("div",{staticClass:"score-item overall"},[$("div",{staticClass:"score-header"},[$("a-icon",{attrs:{type:"dashboard"}}),$("span",[w._v(w._s(w.$t("fastAnalysis.overall")))])],1),$("a-progress",{attrs:{percent:(null===(v=w.result.scores)||void 0===v?void 0:v.overall)||50,strokeColor:w.getScoreColor(null===(f=w.result.scores)||void 0===f?void 0:f.overall),showInfo:!1}}),$("div",{staticClass:"score-value"},[w._v(w._s((null===(g=w.result.scores)||void 0===g?void 0:g.overall)||50))])],1)]),w.result.detailed_analysis?$("div",{staticClass:"detailed-analysis"},[w.result.detailed_analysis.technical?$("div",{staticClass:"analysis-card technical"},[$("div",{staticClass:"analysis-card-header"},[$("a-icon",{attrs:{type:"line-chart"}}),$("span",[w._v(w._s(w.$t("fastAnalysis.technicalAnalysis")))]),$("a-tag",{attrs:{color:w.getScoreTagColor(null===(b=w.result.scores)||void 0===b?void 0:b.technical)}},[w._v(" "+w._s((null===(_=w.result.scores)||void 0===_?void 0:_.technical)||50)+"分 ")])],1),$("div",{staticClass:"analysis-card-content"},[w._v(" "+w._s(w.result.detailed_analysis.technical)+" ")])]):w._e(),w.result.detailed_analysis.fundamental?$("div",{staticClass:"analysis-card fundamental"},[$("div",{staticClass:"analysis-card-header"},[$("a-icon",{attrs:{type:"bank"}}),$("span",[w._v(w._s(w.$t("fastAnalysis.fundamentalAnalysis")))]),$("a-tag",{attrs:{color:w.getScoreTagColor(null===(k=w.result.scores)||void 0===k?void 0:k.fundamental)}},[w._v(" "+w._s((null===(C=w.result.scores)||void 0===C?void 0:C.fundamental)||50)+"分 ")])],1),$("div",{staticClass:"analysis-card-content"},[w._v(" "+w._s(w.result.detailed_analysis.fundamental)+" ")])]):w._e(),w.result.detailed_analysis.sentiment?$("div",{staticClass:"analysis-card sentiment"},[$("div",{staticClass:"analysis-card-header"},[$("a-icon",{attrs:{type:"heart"}}),$("span",[w._v(w._s(w.$t("fastAnalysis.sentimentAnalysis")))]),$("a-tag",{attrs:{color:w.getScoreTagColor(null===(S=w.result.scores)||void 0===S?void 0:S.sentiment)}},[w._v(" "+w._s((null===(A=w.result.scores)||void 0===A?void 0:A.sentiment)||50)+"分 ")])],1),$("div",{staticClass:"analysis-card-content"},[w._v(" "+w._s(w.result.detailed_analysis.sentiment)+" ")])]):w._e()]):w._e(),$("div",{staticClass:"analysis-details"},[$("div",{staticClass:"detail-section reasons"},[$("div",{staticClass:"section-title"},[$("a-icon",{attrs:{type:"bulb",theme:"twoTone",twoToneColor:"#52c41a"}}),$("span",[w._v(w._s(w.$t("fastAnalysis.keyReasons")))])],1),$("ul",{staticClass:"detail-list"},w._l(w.result.reasons,function(t,s){return $("li",{key:"r-"+s},[w._v(" "+w._s(t)+" ")])}),0)]),$("div",{staticClass:"detail-section risks"},[$("div",{staticClass:"section-title"},[$("a-icon",{attrs:{type:"warning",theme:"twoTone",twoToneColor:"#faad14"}}),$("span",[w._v(w._s(w.$t("fastAnalysis.risks")))])],1),$("ul",{staticClass:"detail-list"},w._l(w.result.risks,function(t,s){return $("li",{key:"k-"+s},[w._v(" "+w._s(t)+" ")])}),0)])]),w.result.indicators&&Object.keys(w.result.indicators).length>0?$("div",{staticClass:"indicators-section"},[$("div",{staticClass:"section-title"},[$("a-icon",{attrs:{type:"stock"}}),$("span",[w._v(w._s(w.$t("fastAnalysis.indicators")))])],1),$("div",{staticClass:"indicators-grid"},[w.result.indicators.rsi?$("div",{staticClass:"indicator-item"},[$("div",{staticClass:"indicator-name"},[w._v("RSI (14)")]),$("div",{staticClass:"indicator-value",class:w.getRsiClass(w.result.indicators.rsi.value)},[w._v(" "+w._s(w.formatNumber(w.result.indicators.rsi.value,1))+" ")]),$("div",{staticClass:"indicator-signal"},[w._v(w._s(w.translateSignal(w.result.indicators.rsi.signal)))])]):w._e(),w.result.indicators.macd?$("div",{staticClass:"indicator-item"},[$("div",{staticClass:"indicator-name"},[w._v("MACD")]),$("div",{staticClass:"indicator-value",class:"bullish"===w.result.indicators.macd.signal?"bullish":"bearish"===w.result.indicators.macd.signal?"bearish":""},[w._v(" "+w._s(w.translateTrend(w.result.indicators.macd.trend))+" ")]),$("div",{staticClass:"indicator-signal"},[w._v(w._s(w.translateSignal(w.result.indicators.macd.signal)))])]):w._e(),w.result.indicators.moving_averages?$("div",{staticClass:"indicator-item"},[$("div",{staticClass:"indicator-name"},[w._v(w._s(w.$t("fastAnalysis.maTrend")))]),$("div",{staticClass:"indicator-value",class:w.getMaTrendClass(w.result.indicators.moving_averages.trend)},[w._v(" "+w._s(w.translateTrend(w.result.indicators.moving_averages.trend))+" ")])]):w._e(),w.result.indicators.levels?$("div",{staticClass:"indicator-item"},[$("div",{staticClass:"indicator-name"},[w._v(w._s(w.$t("fastAnalysis.support")))]),$("div",{staticClass:"indicator-value"},[w._v("$"+w._s(w.formatPrice(w.result.indicators.levels.support)))])]):w._e(),w.result.indicators.levels?$("div",{staticClass:"indicator-item"},[$("div",{staticClass:"indicator-name"},[w._v(w._s(w.$t("fastAnalysis.resistance")))]),$("div",{staticClass:"indicator-value"},[w._v("$"+w._s(w.formatPrice(w.result.indicators.levels.resistance)))])]):w._e(),w.result.indicators.volatility?$("div",{staticClass:"indicator-item"},[$("div",{staticClass:"indicator-name"},[w._v(w._s(w.$t("fastAnalysis.volatility")))]),$("div",{staticClass:"indicator-value",class:w.getVolatilityClass(w.result.indicators.volatility.level)},[w._v(" "+w._s(w.translateVolatility(w.result.indicators.volatility.level))+" ("+w._s(w.result.indicators.volatility.pct)+"%) ")])]):w._e()])]):w._e(),$("div",{staticClass:"feedback-section"},[$("div",{staticClass:"feedback-question"},[w._v(w._s(w.$t("fastAnalysis.wasHelpful")))]),$("div",{staticClass:"feedback-buttons"},[$("a-button",{attrs:{type:"helpful"===w.userFeedback?"primary":"default",size:"small",loading:"helpful"===w.feedbackLoading},on:{click:function(t){return w.submitFeedback("helpful")}}},[$("a-icon",{attrs:{type:"like"}}),w._v(" "+w._s(w.$t("fastAnalysis.helpful"))+" ")],1),$("a-button",{attrs:{type:"not_helpful"===w.userFeedback?"danger":"default",size:"small",loading:"not_helpful"===w.feedbackLoading},on:{click:function(t){return w.submitFeedback("not_helpful")}}},[$("a-icon",{attrs:{type:"dislike"}}),w._v(" "+w._s(w.$t("fastAnalysis.notHelpful"))+" ")],1)],1),$("div",{staticClass:"analysis-meta"},[$("span",[w._v(w._s(w.$t("fastAnalysis.analysisTime"))+": "+w._s(w.result.analysis_time_ms)+"ms")]),w.result.memory_id?$("span",[w._v("ID: #"+w._s(w.result.memory_id))]):w._e()])])]):$("div",{staticClass:"empty-container"},[$("div",{staticClass:"empty-content"},[$("a-icon",{staticClass:"empty-icon",attrs:{type:"radar-chart"}}),$("div",{staticClass:"empty-title"},[w._v(w._s(w.$t("fastAnalysis.selectSymbol")))]),$("div",{staticClass:"empty-hint"},[w._v(w._s(w.$t("fastAnalysis.selectHint")))])],1)])])}),k=[],C={name:"FastAnalysisReport",props:{result:{type:Object,default:null},loading:{type:Boolean,default:!1},error:{type:String,default:null},errorTone:{type:String,default:"error",validator:function(t){return["error","warning","info"].includes(t)}}},data:function(){return{userFeedback:null,feedbackLoading:null,progress:0,elapsedSeconds:0,mainTimer:null}},computed:(0,c.A)((0,c.A)({},(0,d.aH)({navTheme:function(t){return t.app.theme}})),{},{isDarkTheme:function(){return"dark"===this.navTheme||"realdark"===this.navTheme},progressPercent:function(){return Math.round(10*this.progress)/10},step:function(){return this.progress<25?1:this.progress<50?2:this.progress<75?3:4},currentStepText:function(){var t={1:this.$t("fastAnalysis.step1")||"获取实时数据",2:this.$t("fastAnalysis.step2")||"计算技术指标",3:this.$t("fastAnalysis.step3")||"AI深度分析",4:this.$t("fastAnalysis.step4")||"生成报告"};return t[this.step]||this.$t("fastAnalysis.preparing")||"准备中..."},elapsedTimeText:function(){if(this.elapsedSeconds<60)return"".concat(this.elapsedSeconds,"s");var t=Math.floor(this.elapsedSeconds/60),s=this.elapsedSeconds%60;return"".concat(t,"m ").concat(s,"s")},decisionClass:function(){if(!this.result)return"";var t=this.result.decision;return"BUY"===t?"decision-buy":"SELL"===t?"decision-sell":"decision-hold"},decisionIcon:function(){if(!this.result)return"question";var t=this.result.decision;return"BUY"===t?"arrow-up":"SELL"===t?"arrow-down":"pause"},confidenceColor:function(){var t,s=(null===(t=this.result)||void 0===t?void 0:t.confidence)||50;return s>=70?"#52c41a":s>=50?"#1890ff":"#faad14"},consensusBlock:function(){var t,s=null===(t=this.result)||void 0===t?void 0:t.consensus;return s&&"object"===(0,r.A)(s)?null==s.consensus_decision&&null==s.consensus_score?null:s:null},insufficientCreditsError:function(){if(!this.error)return!1;var t=String(this.error);return t.includes("积分不足")||t.toLowerCase().includes("insufficient credits")},errorTitle:function(){return"warning"===this.errorTone?this.$t("fastAnalysis.analysisInProgressTitle"):this.insufficientCreditsError?this.$t("fastAnalysis.insufficientCredits"):this.$t("fastAnalysis.error")}}),watch:{result:function(){this.userFeedback=null},loading:{handler:function(t){t?this.startProgressTimer():this.stopProgressTimer()},immediate:!0}},mounted:function(){this.loading&&this.startProgressTimer()},beforeDestroy:function(){this.stopProgressTimer()},methods:{formatPrice:function(t){if(void 0===t||null===t)return"--";var s=parseFloat(t);return isNaN(s)?"--":s<1?s.toFixed(6):s<100?s.toFixed(4):s<1e4?s.toFixed(2):s.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})},formatNumber:function(t){var s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:2;if(void 0===t||null===t)return"--";var a=parseFloat(t);return isNaN(a)?"--":a.toFixed(s)},formatConsensusNum:function(t){if(void 0===t||null===t||""===t)return"--";var s=Number(t);return Number.isNaN(s)?"--":s.toFixed(1)},formatAgreementPct:function(t){var s=Number(t);return Number.isNaN(s)?"--":"".concat(Math.round(100*s),"%")},formatProgress:function(t){var s=parseFloat(t)||0;return s%1===0?s.toFixed(0):s.toFixed(1)},getScoreColor:function(t){return t>=70?"#52c41a":t>=50?"#1890ff":t>=30?"#faad14":"#ff4d4f"},getScoreTagColor:function(t){return t>=70?"green":t>=50?"blue":t>=30?"orange":"red"},getRsiClass:function(t){return t<30?"oversold":t>70?"overbought":""},getMaTrendClass:function(t){return t?t.includes("uptrend")||t.includes("strong_uptrend")?"bullish":t.includes("downtrend")||t.includes("strong_downtrend")?"bearish":"":""},getVolatilityClass:function(t){return"high"===t?"high-volatility":"low"===t?"low-volatility":""},translateSignal:function(t){if(!t)return"--";var s="fastAnalysis.signal.".concat(t),a=this.$t(s);return a===s?t:a},translateTrend:function(t){if(!t)return"--";var s="fastAnalysis.trend.".concat(t),a=this.$t(s);return a===s?t:a},translateVolatility:function(t){if(!t)return"--";var s="fastAnalysis.volatilityLevel.".concat(t),a=this.$t(s);return a===s?t:a},submitFeedback:function(t){var s=this;return(0,o.A)((0,l.A)().m(function a(){var e;return(0,l.A)().w(function(a){while(1)switch(a.p=a.n){case 0:if(null!==(e=s.result)&&void 0!==e&&e.memory_id){a.n=1;break}return s.$message.warning(s.$t("fastAnalysis.feedbackUnavailable")||"反馈功能暂不可用,请刷新后重试"),a.a(2);case 1:return s.feedbackLoading=t,a.p=2,a.n=3,g({memory_id:s.result.memory_id,feedback:t});case 3:s.userFeedback=t,s.$message.success(s.$t("fastAnalysis.feedbackThanks")),a.n=5;break;case 4:a.p=4,a.v,s.$message.error(s.$t("fastAnalysis.feedbackFailed"));case 5:return a.p=5,s.feedbackLoading=null,a.f(5);case 6:return a.a(2)}},a,null,[[2,4,5,6]])}))()},startProgressTimer:function(){var t=this;this.stopProgressTimer(),this.progress=0,this.elapsedSeconds=0;var s=Date.now();this.mainTimer=window.setInterval(function(){t.elapsedSeconds=Math.floor((Date.now()-s)/1e3),t.progress<75?t.progress=Math.min(t.progress+1,75):t.progress<90?t.progress=Math.min(t.progress+.5,90):t.progress<95&&(t.progress=Math.min(t.progress+.2,95))},100)},stopProgressTimer:function(){this.mainTimer&&(window.clearInterval(this.mainTimer),this.mainTimer=null),this.progress=0,this.elapsedSeconds=0}}},S=C,A=a(845),w=(0,A.A)(S,_,k,!1,null,"693144f6",null),$=w.exports,T={name:"Analysis",props:{embedded:{type:Boolean,default:!1},presetSymbol:{type:String,default:""},autoAnalyzeSignal:{type:Number,default:0}},components:{FastAnalysisReport:$},data:function(){return{loadingMarket:!1,heatmapType:"crypto",marketData:{fearGreed:null,vix:null,dxy:null,indices:[],heatmap:{crypto:[],commodities:[],sectors:[],forex:[]},calendar:[]},loadingSentiment:!1,loadingIndices:!1,loadingHeatmap:!1,loadingCalendar:!1,watchlistPriceTimer:null,watchlistPrices:{},localUserInfo:{},loadingUserInfo:!1,userId:1,watchlist:[],loadingWatchlist:!1,showAddStockModal:!1,addingStock:!1,selectedSymbol:void 0,analyzing:!1,analysisResult:null,analysisError:null,analysisErrorTone:"error",showHistoryModal:!1,historyList:[],historyLoading:!1,historyPage:1,historyPageSize:20,historyTotal:0,marketTypes:[],selectedMarketTab:"",symbolSearchKeyword:"",symbolSearchResults:[],searchingSymbols:!1,hotSymbols:[],loadingHotSymbols:!1,selectedSymbolForAdd:null,searchTimer:null,hasSearched:!1}},computed:(0,c.A)((0,c.A)((0,c.A)({},(0,d.L8)(["userInfo"])),(0,d.aH)({navTheme:function(t){return t.app.theme},primaryColor:function(t){return t.app.color||"#1890ff"}})),{},{isDarkTheme:function(){return"dark"===this.navTheme||"realdark"===this.navTheme},isZhLocale:function(){return"zh-CN"===this.$i18n.locale},currentHeatmap:function(){return this.marketData.heatmap[this.heatmapType]||[]},storeUserInfo:function(){return this.userInfo||{}},mergedUserInfo:function(){return this.localUserInfo&&this.localUserInfo.email?this.localUserInfo:this.storeUserInfo}}),created:function(){this.loadUserInfo(),this.loadMarketTypes(),this.loadWatchlist(),this.loadMarketData()},mounted:function(){this.startWatchlistPriceRefresh()},beforeDestroy:function(){this.watchlistPriceTimer&&clearInterval(this.watchlistPriceTimer)},methods:{filterSymbolOption:function(t,s){var a,e=(null===(a=s.componentOptions)||void 0===a||null===(a=a.propsData)||void 0===a?void 0:a.value)||"";return"__add_stock_option__"===e||e.toLowerCase().includes(t.toLowerCase())},handleSymbolChange:function(t){var s=this;if("__add_stock_option__"===t)return this.showAddStockModal=!0,void this.$nextTick(function(){s.selectedSymbol=void 0});this.selectedSymbol=t,this.analysisResult=null,this.analysisError=null,this.analysisErrorTone="error",this.$emit("symbol-change",t)},selectWatchlistItem:function(t){this.selectedSymbol="".concat(t.market,":").concat(t.symbol),this.analysisResult=null,this.analysisError=null,this.analysisErrorTone="error",this.$emit("symbol-change",this.selectedSymbol)},loadMarketData:function(){var t=this;return(0,o.A)((0,l.A)().m(function s(){return(0,l.A)().w(function(s){while(1)switch(s.n){case 0:t.loadingMarket=!0,t.loadSentimentData(),t.loadIndicesData(),t.loadHeatmapData(),t.loadCalendarData();case 1:return s.a(2)}},s)}))()},loadSentimentData:function(){var t=this;return(0,o.A)((0,l.A)().m(function s(){var a,e,i,r;return(0,l.A)().w(function(s){while(1)switch(s.p=s.n){case 0:return t.loadingSentiment=!0,s.p=1,s.n=2,(0,b.EF)();case 2:a=s.v,1===(null===a||void 0===a?void 0:a.code)&&null!==a&&void 0!==a&&a.data&&(t.marketData.fearGreed=(null===(e=a.data.fear_greed)||void 0===e?void 0:e.value)||null,t.marketData.vix=(null===(i=a.data.vix)||void 0===i?void 0:i.value)||null,t.marketData.dxy=(null===(r=a.data.dxy)||void 0===r?void 0:r.value)||null),s.n=4;break;case 3:s.p=3,s.v;case 4:return s.p=4,t.loadingSentiment=!1,t.checkAllLoaded(),s.f(4);case 5:return s.a(2)}},s,null,[[1,3,4,5]])}))()},loadIndicesData:function(){var t=this;return(0,o.A)((0,l.A)().m(function s(){var a;return(0,l.A)().w(function(s){while(1)switch(s.p=s.n){case 0:return t.loadingIndices=!0,s.p=1,s.n=2,(0,b.yI)();case 2:a=s.v,1===(null===a||void 0===a?void 0:a.code)&&null!==a&&void 0!==a&&a.data&&(t.marketData.indices=a.data.indices||[]),s.n=4;break;case 3:s.p=3,s.v;case 4:return s.p=4,t.loadingIndices=!1,t.checkAllLoaded(),s.f(4);case 5:return s.a(2)}},s,null,[[1,3,4,5]])}))()},loadHeatmapData:function(){var t=this;return(0,o.A)((0,l.A)().m(function s(){var a;return(0,l.A)().w(function(s){while(1)switch(s.p=s.n){case 0:return t.loadingHeatmap=!0,s.p=1,s.n=2,(0,b.f$)();case 2:a=s.v,1===(null===a||void 0===a?void 0:a.code)&&null!==a&&void 0!==a&&a.data&&(t.marketData.heatmap={crypto:a.data.crypto||[],commodities:a.data.commodities||[],sectors:a.data.sectors||[],forex:a.data.forex||[]}),s.n=4;break;case 3:s.p=3,s.v;case 4:return s.p=4,t.loadingHeatmap=!1,t.checkAllLoaded(),s.f(4);case 5:return s.a(2)}},s,null,[[1,3,4,5]])}))()},loadCalendarData:function(){var t=this;return(0,o.A)((0,l.A)().m(function s(){var a;return(0,l.A)().w(function(s){while(1)switch(s.p=s.n){case 0:return t.loadingCalendar=!0,s.p=1,s.n=2,(0,b.kF)();case 2:a=s.v,1===(null===a||void 0===a?void 0:a.code)&&(t.marketData.calendar=a.data||[]),s.n=4;break;case 3:s.p=3,s.v;case 4:return s.p=4,t.loadingCalendar=!1,t.checkAllLoaded(),s.f(4);case 5:return s.a(2)}},s,null,[[1,3,4,5]])}))()},checkAllLoaded:function(){this.loadingSentiment||this.loadingIndices||this.loadingHeatmap||this.loadingCalendar||(this.loadingMarket=!1)},getFearGreedClass:function(t){return t?t<=25?"extreme-fear":t<=45?"fear":t<=55?"neutral":t<=75?"greed":"extreme-greed":""},getVixLevel:function(t){return t?t<15?"low":t<25?"medium":"high":""},formatNum:function(t){var s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:2;return void 0===t||null===t||isNaN(t)?"--":Number(t).toFixed(s)},getHeatmapStyle:function(t){var s=parseFloat(t)||0,a=Math.min(Math.abs(s)/5,1);return s>=0?{background:"rgba(34, 197, 94, ".concat(.15+.6*a,")"),color:s>2?"#fff":"#166534"}:{background:"rgba(239, 68, 68, ".concat(.15+.6*a,")"),color:s<-2?"#fff":"#991b1b"}},getCountryFlag:function(t){var s={US:"🇺🇸",CN:"🇨🇳",EU:"🇪🇺",JP:"🇯🇵",UK:"🇬🇧",DE:"🇩🇪",AU:"🇦🇺",CA:"🇨🇦"};return s[t]||"🌍"},formatCalendarDate:function(t){if(!t)return"";try{var s=new Date(t),a=new Date,e=new Date(a);if(e.setDate(e.getDate()+1),s.toDateString()===a.toDateString())return this.isZhLocale?"今天":"Today";if(s.toDateString()===e.toDateString())return this.isZhLocale?"明天":"Tmrw";var i=s.getMonth()+1,r=s.getDate();return"".concat(i,"/").concat(r)}catch(n){return t}},formatPrice:function(t){return t?t>=1e4?(t/1e3).toFixed(1)+"K":t>=1e3?t.toFixed(0):t.toFixed(2):"--"},formatHeatmapPrice:function(t){return t?t>=1e4?"$"+(t/1e3).toFixed(1)+"K":t>=1e3?"$"+t.toFixed(0):t>=1?"$"+t.toFixed(2):"$"+t.toFixed(4):""},getHeatmapName:function(t){return"sectors"===this.heatmapType||"commodities"===this.heatmapType||"forex"===this.heatmapType?this.isZhLocale?t.name_cn||t.name:t.name_en||t.name:t.name},getImpactClass:function(t){return t.actual_impact||t.expected_impact||"neutral"},getMarketColor:function(t){var s={USStock:"green",Crypto:"purple",Forex:"gold",Futures:"cyan"};return s[t]||"default"},getCurrencySymbol:function(t){return"$"},formatCreditNum:function(t){if(void 0===t||null===t||""===t)return"--";var s=Number(t);return Number.isNaN(s)?String(t):Number.isInteger(s)?String(s):s.toFixed(2)},refreshUserInfoFromServer:function(){var t=this;return(0,o.A)((0,l.A)().m(function s(){var a;return(0,l.A)().w(function(s){while(1)switch(s.p=s.n){case 0:return s.p=0,s.n=1,(0,u.ug)();case 1:a=s.v,a&&1===a.code&&a.data&&(t.localUserInfo=a.data,t.userId=a.data.id,t.$store.commit("SET_INFO",a.data)),s.n=3;break;case 2:s.p=2,s.v;case 3:return s.a(2)}},s,null,[[0,2]])}))()},startFastAnalysis:function(){var t=this;return(0,o.A)((0,l.A)().m(function s(){var a,e,i,r,o,d,u,m,h,y,v,f,g,b,_;return(0,l.A)().w(function(s){while(1)switch(s.p=s.n){case 0:if(!t.analyzing){s.n=1;break}return s.a(2);case 1:if(t.selectedSymbol){s.n=2;break}return t.$message.warning(t.$t("dashboard.analysis.message.selectSymbol")),s.a(2);case 2:return t.analyzing=!0,t.analysisError=null,t.analysisErrorTone="error",a=t.selectedSymbol.split(":"),e=(0,n.A)(a,2),i=e[0],r=e[1],o=t.$store.getters.lang||"zh-CN",s.p=3,s.n=4,p({market:i,symbol:r,language:o,timeframe:"1D"});case 4:if(d=s.v,!d||1!==d.code||!d.data){s.n=6;break}return u=(0,c.A)({},d.data),delete u.credits_charged,delete u.remaining_credits,t.analysisResult=u,m=d.data.remaining_credits,void 0!==m&&null!==m?t.$message.success(t.$t("fastAnalysis.analysisCompleteWithCredits",{remaining:t.formatCreditNum(m)})):t.$message.success(t.$t("dashboard.analysis.message.analysisComplete")),s.n=5,t.refreshUserInfoFromServer();case 5:s.n=7;break;case 6:throw new Error((null===d||void 0===d?void 0:d.msg)||"分析失败");case 7:s.n=9;break;case 8:s.p=8,_=s.v,v=null===_||void 0===_||null===(h=_.response)||void 0===h?void 0:h.status,f=(null===_||void 0===_||null===(y=_.response)||void 0===y?void 0:y.data)||{},g=f.msg,b=f.data,429===v&&b&&b.in_progress?(t.analysisErrorTone="warning",t.analysisError=t.$t("fastAnalysis.analysisInProgress"),t.$message.warning(t.analysisError)):400===v&&"Insufficient credits"===g?(t.analysisError=t.$t("fastAnalysis.insufficientCreditsDetail",{required:t.formatCreditNum(null===b||void 0===b?void 0:b.required),current:t.formatCreditNum(null===b||void 0===b?void 0:b.current),shortage:t.formatCreditNum(null===b||void 0===b?void 0:b.shortage)}),t.$message.error(t.analysisError)):(t.analysisError=g||(null===_||void 0===_?void 0:_.message)||t.$t("dashboard.analysis.message.analysisFailed"),t.$message.error(t.analysisError));case 9:return s.p=9,t.analyzing=!1,s.f(9);case 10:return s.a(2)}},s,null,[[3,8,9,10]])}))()},loadHistoryList:function(){var t=this;return(0,o.A)((0,l.A)().m(function s(){var a;return(0,l.A)().w(function(s){while(1)switch(s.p=s.n){case 0:return t.historyLoading=!0,s.p=1,s.n=2,v({page:t.historyPage,pagesize:t.historyPageSize});case 2:a=s.v,a&&1===a.code&&a.data&&(t.historyList=a.data.list||[],t.historyTotal=a.data.total||0),s.n=4;break;case 3:s.p=3,s.v,t.$message.error(t.$t("dashboard.analysis.message.loadHistoryFailed")||"加载历史记录失败");case 4:return s.p=4,t.historyLoading=!1,s.f(4);case 5:return s.a(2)}},s,null,[[1,3,4,5]])}))()},viewHistoryResult:function(t){var s=this;return(0,o.A)((0,l.A)().m(function a(){return(0,l.A)().w(function(a){while(1)switch(a.n){case 0:if(!t.full_result){a.n=1;break}return s.analysisResult=t.full_result,s.selectedSymbol="".concat(t.market,":").concat(t.symbol),s.showHistoryModal=!1,a.a(2);case 1:s.analysisResult={decision:t.decision,confidence:t.confidence,summary:t.summary,market_data:{current_price:t.price,change_24h:0},trading_plan:{entry_price:t.price,stop_loss:.95*t.price,take_profit:1.05*t.price},scores:t.scores||{},reasons:t.reasons||[],risks:[],indicators:t.indicators||{},memory_id:t.id,analysis_time_ms:0},s.selectedSymbol="".concat(t.market,":").concat(t.symbol),s.showHistoryModal=!1;case 2:return a.a(2)}},a)}))()},deleteHistoryItem:function(t){var s=this;return(0,o.A)((0,l.A)().m(function a(){var e;return(0,l.A)().w(function(a){while(1)switch(a.p=a.n){case 0:return a.p=0,a.n=1,f(t.id);case 1:e=a.v,e&&1===e.code?(s.$message.success(s.$t("dashboard.analysis.message.deleteSuccess")),s.loadHistoryList()):s.$message.error((null===e||void 0===e?void 0:e.msg)||s.$t("dashboard.analysis.message.deleteFailed")),a.n=3;break;case 2:a.p=2,a.v,s.$message.error(s.$t("dashboard.analysis.message.deleteFailed"));case 3:return a.a(2)}},a,null,[[0,2]])}))()},formatTime:function(t){if(!t)return"-";var s=new Date(1e3*t);return s.toLocaleString("zh-CN")},formatIsoTime:function(t){if(!t)return"-";var s=new Date(t);return s.toLocaleString("zh-CN")},getStatusColor:function(t){var s={pending:"orange",processing:"blue",completed:"green",failed:"red"};return s[t]||"default"},getStatusText:function(t){var s={pending:"dashboard.analysis.status.pending",processing:"dashboard.analysis.status.processing",completed:"dashboard.analysis.status.completed",failed:"dashboard.analysis.status.failed"},a=s[t];return a?this.$t(a):t},loadUserInfo:function(){var t=this;return(0,o.A)((0,l.A)().m(function s(){var a;return(0,l.A)().w(function(s){while(1)switch(s.p=s.n){case 0:if(t.loadingUserInfo=!0,s.p=1,!t.storeUserInfo||!t.storeUserInfo.email){s.n=2;break}return t.localUserInfo=t.storeUserInfo,t.userId=t.storeUserInfo.id,t.loadingUserInfo=!1,t.loadWatchlist(),s.a(2);case 2:return s.n=3,(0,u.ug)();case 3:a=s.v,a&&1===a.code&&a.data&&(t.localUserInfo=a.data,t.userId=a.data.id,t.$store.commit("SET_INFO",a.data),t.loadWatchlist()),s.n=5;break;case 4:s.p=4,s.v;case 5:return s.p=5,t.loadingUserInfo=!1,s.f(5);case 6:return s.a(2)}},s,null,[[1,4,5,6]])}))()},loadWatchlist:function(){var t=this;return(0,o.A)((0,l.A)().m(function s(){var a;return(0,l.A)().w(function(s){while(1)switch(s.p=s.n){case 0:if(t.userId){s.n=1;break}return s.a(2);case 1:return t.loadingWatchlist=!0,s.p=2,s.n=3,(0,m.Qo)({userid:t.userId});case 3:if(a=s.v,!a||1!==a.code||!a.data){s.n=4;break}return t.watchlist=a.data.map(function(t){return(0,c.A)((0,c.A)({},t),{},{price:0,change:0,changePercent:0})}),s.n=4,t.loadWatchlistPrices();case 4:s.n=6;break;case 5:s.p=5,s.v;case 6:return s.p=6,t.loadingWatchlist=!1,s.f(6);case 7:return s.a(2)}},s,null,[[2,5,6,7]])}))()},loadWatchlistPrices:function(){var t=this;return(0,o.A)((0,l.A)().m(function s(){var a,e,i,r;return(0,l.A)().w(function(s){while(1)switch(s.p=s.n){case 0:if(t.watchlist&&0!==t.watchlist.length){s.n=1;break}return s.a(2);case 1:return s.p=1,a=t.watchlist.map(function(t){return{market:t.market,symbol:t.symbol}}),s.n=2,(0,m.ms)({watchlist:a});case 2:e=s.v,e&&1===e.code&&e.data&&(i={},r={},e.data.forEach(function(t){i["".concat(t.market,"-").concat(t.symbol)]=t,r["".concat(t.market,":").concat(t.symbol)]={price:t.price||0,change:t.changePercent||0}}),t.watchlistPrices=r,t.watchlist=t.watchlist.map(function(t){var s="".concat(t.market,"-").concat(t.symbol),a=i[s];return a?(0,c.A)((0,c.A)({},t),{},{price:a.price||0,change:a.change||0,changePercent:a.changePercent||0}):t})),s.n=4;break;case 3:s.p=3,s.v;case 4:return s.a(2)}},s,null,[[1,3]])}))()},startWatchlistPriceRefresh:function(){var t=this;this.watchlistPriceTimer=setInterval(function(){t.watchlist&&t.watchlist.length>0&&t.loadWatchlistPrices()},3e4),this.watchlist&&this.watchlist.length>0&&this.loadWatchlistPrices()},handleAddStock:function(){var t=this;return(0,o.A)((0,l.A)().m(function s(){var a,e,i,r,n,o,c;return(0,l.A)().w(function(s){while(1)switch(s.p=s.n){case 0:if(a="",e="",i="",!t.selectedSymbolForAdd){s.n=1;break}a=t.selectedSymbolForAdd.market,e=t.selectedSymbolForAdd.symbol.toUpperCase(),i=t.selectedSymbolForAdd.name||"",s.n=4;break;case 1:if(!t.symbolSearchKeyword||!t.symbolSearchKeyword.trim()){s.n=3;break}if(t.selectedMarketTab){s.n=2;break}return t.$message.warning(t.$t("dashboard.analysis.modal.addStock.pleaseSelectMarket")),s.a(2);case 2:a=t.selectedMarketTab,e=t.symbolSearchKeyword.trim().toUpperCase(),i="",s.n=4;break;case 3:return t.$message.warning(t.$t("dashboard.analysis.modal.addStock.pleaseSelectOrEnterSymbol")),s.a(2);case 4:return t.addingStock=!0,s.p=5,s.n=6,(0,m.dp)({userid:t.userId,market:a,symbol:e,name:i});case 6:if(r=s.v,!r||1!==r.code){s.n=8;break}return t.$message.success(t.$t("dashboard.analysis.message.addStockSuccess")),t.handleCloseAddStockModal(),s.n=7,t.loadWatchlist();case 7:s.n=9;break;case 8:t.$message.error((null===r||void 0===r?void 0:r.msg)||t.$t("dashboard.analysis.message.addStockFailed"));case 9:s.n=11;break;case 10:s.p=10,c=s.v,o=(null===c||void 0===c||null===(n=c.response)||void 0===n||null===(n=n.data)||void 0===n?void 0:n.msg)||(null===c||void 0===c?void 0:c.message)||t.$t("dashboard.analysis.message.addStockFailed"),t.$message.error(o);case 11:return s.p=11,t.addingStock=!1,s.f(11);case 12:return s.a(2)}},s,null,[[5,10,11,12]])}))()},handleCloseAddStockModal:function(){this.showAddStockModal=!1,this.selectedSymbolForAdd=null,this.symbolSearchKeyword="",this.symbolSearchResults=[],this.hasSearched=!1,this.selectedMarketTab=this.marketTypes.length>0?this.marketTypes[0].value:""},handleMarketTabChange:function(t){this.selectedMarketTab=t,this.symbolSearchKeyword="",this.symbolSearchResults=[],this.selectedSymbolForAdd=null,this.hasSearched=!1,this.loadHotSymbols(t)},handleSymbolSearchInput:function(t){var s=this,a=t.target.value;if(this.symbolSearchKeyword=a,this.searchTimer&&clearTimeout(this.searchTimer),!a||""===a.trim())return this.symbolSearchResults=[],this.hasSearched=!1,void(this.selectedSymbolForAdd=null);this.searchTimer=setTimeout(function(){s.searchSymbolsInModal(a)},500)},handleSearchOrInput:function(t){t&&t.trim()&&(this.selectedMarketTab?this.symbolSearchResults.length>0||(this.hasSearched&&0===this.symbolSearchResults.length?this.handleDirectAdd():this.searchSymbolsInModal(t)):this.$message.warning(this.$t("dashboard.analysis.modal.addStock.pleaseSelectMarket")))},searchSymbolsInModal:function(t){var s=this;return(0,o.A)((0,l.A)().m(function a(){var e;return(0,l.A)().w(function(a){while(1)switch(a.p=a.n){case 0:if(t&&""!==t.trim()){a.n=1;break}return s.symbolSearchResults=[],s.hasSearched=!1,a.a(2);case 1:if(s.selectedMarketTab){a.n=2;break}return s.$message.warning(s.$t("dashboard.analysis.modal.addStock.pleaseSelectMarket")),a.a(2);case 2:return s.searchingSymbols=!0,s.hasSearched=!0,a.p=3,a.n=4,(0,m._3)({market:s.selectedMarketTab,keyword:t.trim(),limit:20});case 4:e=a.v,e&&1===e.code&&e.data&&e.data.length>0?s.symbolSearchResults=e.data:(s.symbolSearchResults=[],s.selectedSymbolForAdd={market:s.selectedMarketTab,symbol:t.trim().toUpperCase(),name:""}),a.n=6;break;case 5:a.p=5,a.v,s.symbolSearchResults=[],s.selectedSymbolForAdd={market:s.selectedMarketTab,symbol:t.trim().toUpperCase(),name:""};case 6:return a.p=6,s.searchingSymbols=!1,a.f(6);case 7:return a.a(2)}},a,null,[[3,5,6,7]])}))()},handleDirectAdd:function(){this.symbolSearchKeyword&&this.symbolSearchKeyword.trim()?this.selectedMarketTab?this.selectedSymbolForAdd={market:this.selectedMarketTab,symbol:this.symbolSearchKeyword.trim().toUpperCase(),name:""}:this.$message.warning(this.$t("dashboard.analysis.modal.addStock.pleaseSelectMarket")):this.$message.warning(this.$t("dashboard.analysis.modal.addStock.pleaseEnterSymbol"))},selectSymbol:function(t){this.selectedSymbolForAdd={market:t.market,symbol:t.symbol,name:t.name||t.symbol}},loadHotSymbols:function(t){var s=this;return(0,o.A)((0,l.A)().m(function a(){var e;return(0,l.A)().w(function(a){while(1)switch(a.p=a.n){case 0:if(t||(t=s.selectedMarketTab||(s.marketTypes.length>0?s.marketTypes[0].value:"")),t){a.n=1;break}return a.a(2);case 1:return s.loadingHotSymbols=!0,a.p=2,a.n=3,(0,m.z6)({market:t,limit:10});case 3:e=a.v,e&&1===e.code&&e.data?s.hotSymbols=e.data:s.hotSymbols=[],a.n=5;break;case 4:a.p=4,a.v,s.hotSymbols=[];case 5:return a.p=5,s.loadingHotSymbols=!1,a.f(5);case 6:return a.a(2)}},a,null,[[2,4,5,6]])}))()},removeFromWatchlist:function(t){var s=arguments,a=this;return(0,o.A)((0,l.A)().m(function e(){var i,n,o;return(0,l.A)().w(function(e){while(1)switch(e.p=e.n){case 0:if(a.userId){e.n=1;break}return e.a(2);case 1:return i="object"===(0,r.A)(t)?t.symbol:t,n="object"===(0,r.A)(t)?t.market:s[1],e.p=2,e.n=3,(0,m.mk)({userid:a.userId,symbol:i,market:n});case 3:if(o=e.v,!o||1!==o.code){e.n=5;break}return a.$message.success(a.$t("dashboard.analysis.message.removeStockSuccess")),e.n=4,a.loadWatchlist();case 4:e.n=6;break;case 5:a.$message.error((null===o||void 0===o?void 0:o.msg)||a.$t("dashboard.analysis.message.removeStockFailed"));case 6:e.n=8;break;case 7:e.p=7,e.v,a.$message.error(a.$t("dashboard.analysis.message.removeStockFailed"));case 8:return e.a(2)}},e,null,[[2,7]])}))()},getMarketName:function(t){return this.$t("dashboard.analysis.market.".concat(t))||t},formatNumber:function(t){return"string"===typeof t?t:t.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})},loadMarketTypes:function(){var t=this;return(0,o.A)((0,l.A)().m(function s(){var a;return(0,l.A)().w(function(s){while(1)switch(s.p=s.n){case 0:return s.p=0,s.n=1,(0,m.iO)();case 1:a=s.v,a&&1===a.code&&a.data&&Array.isArray(a.data)?t.marketTypes=a.data.map(function(t){return{value:t.value,i18nKey:t.i18nKey||"dashboard.analysis.market.".concat(t.value)}}):t.marketTypes=[{value:"USStock",i18nKey:"dashboard.analysis.market.USStock"},{value:"Crypto",i18nKey:"dashboard.analysis.market.Crypto"},{value:"Forex",i18nKey:"dashboard.analysis.market.Forex"},{value:"Futures",i18nKey:"dashboard.analysis.market.Futures"}],s.n=3;break;case 2:s.p=2,s.v,t.marketTypes=[{value:"USStock",i18nKey:"dashboard.analysis.market.USStock"},{value:"Crypto",i18nKey:"dashboard.analysis.market.Crypto"},{value:"Forex",i18nKey:"dashboard.analysis.market.Forex"},{value:"Futures",i18nKey:"dashboard.analysis.market.Futures"}];case 3:t.marketTypes.length>0&&!t.selectedMarketTab&&(t.selectedMarketTab=t.marketTypes[0].value);case 4:return s.a(2)}},s,null,[[0,2]])}))()}},watch:{presetSymbol:function(t){t&&t!==this.selectedSymbol&&(this.selectedSymbol=t,this.analysisResult=null,this.analysisError=null,this.analysisErrorTone="error")},autoAnalyzeSignal:function(t){var s=this;t&&(this.presetSymbol&&this.presetSymbol!==this.selectedSymbol&&(this.selectedSymbol=this.presetSymbol),this.$nextTick(function(){s.startFastAnalysis()}))},showAddStockModal:function(t){t?(this.marketTypes.length>0&&!this.selectedMarketTab&&(this.selectedMarketTab=this.marketTypes[0].value),this.selectedMarketTab&&this.loadHotSymbols(this.selectedMarketTab)):(this.selectedSymbolForAdd=null,this.symbolSearchKeyword="",this.symbolSearchResults=[],this.hasSearched=!1,this.searchTimer&&(clearTimeout(this.searchTimer),this.searchTimer=null))}}},x=T,F=(0,A.A)(x,e,i,!1,null,"41eda137",null),M=F.exports},62618:function(t,s,a){a.d(s,{EF:function(){return o},f$:function(){return n},kF:function(){return l},r9:function(){return c},yI:function(){return r}});var e=a(76471),i="/api/global-market";function r(){return(0,e.Ay)({url:"".concat(i,"/overview"),method:"get"})}function n(){return(0,e.Ay)({url:"".concat(i,"/heatmap"),method:"get"})}function l(){return(0,e.Ay)({url:"".concat(i,"/calendar"),method:"get"})}function o(){return(0,e.Ay)({url:"".concat(i,"/sentiment"),method:"get"})}function c(t){return(0,e.Ay)({url:"".concat(i,"/opportunities"),method:"get",params:t})}},64118:function(t,s,a){a.d(s,{Qo:function(){return r},_3:function(){return d},dp:function(){return n},iO:function(){return c},mk:function(){return l},ms:function(){return o},z6:function(){return u}});var e=a(76471),i={GetWatchlist:"/api/market/watchlist/get",AddWatchlist:"/api/market/watchlist/add",RemoveWatchlist:"/api/market/watchlist/remove",GetWatchlistPrices:"/api/market/watchlist/prices",MultiAnalysis:"/api/analysis/multiAnalysis",CreateAnalysisTask:"/api/analysis/createTask",GetAnalysisTaskStatus:"/api/analysis/getTaskStatus",GetAnalysisHistoryList:"/api/analysis/getHistoryList",DeleteAnalysisTask:"/api/analysis/deleteTask",ReflectAnalysis:"/api/analysis/reflect",ChatMessage:"/api/ai/chat/message",GetChatHistory:"/api/ai/chat/history",SaveChatHistory:"/api/ai/chat/history/save",GetConfig:"/api/market/config",GetMenuFooterConfig:"/api/market/menuFooterConfig",GetMarketTypes:"/api/market/types",SearchSymbols:"/api/market/symbols/search",GetHotSymbols:"/api/market/symbols/hot"};function r(t){return(0,e.Ay)({url:i.GetWatchlist,method:"get",params:t})}function n(t){return(0,e.Ay)({url:i.AddWatchlist,method:"post",data:t})}function l(t){return(0,e.Ay)({url:i.RemoveWatchlist,method:"post",data:t})}function o(t){return(0,e.Ay)({url:i.GetWatchlistPrices,method:"get",params:{watchlist:JSON.stringify(t.watchlist||[])}})}function c(){return(0,e.Ay)({url:i.GetMarketTypes,method:"get"})}function d(t){return(0,e.Ay)({url:i.SearchSymbols,method:"get",params:t})}function u(t){return(0,e.Ay)({url:i.GetHotSymbols,method:"get",params:t})}}}]); \ No newline at end of file diff --git a/frontend/dist/js/576.8b80412c.js b/frontend/dist/js/576.8b80412c.js new file mode 100644 index 0000000..aea4b8c --- /dev/null +++ b/frontend/dist/js/576.8b80412c.js @@ -0,0 +1 @@ +"use strict";(self["webpackChunkvue_antd_pro"]=self["webpackChunkvue_antd_pro"]||[]).push([[576],{53576:function(t,s,a){a.r(s),a.d(s,{default:function(){return M}});var e=function(){var t=this,s=t._self._c;return s("div",{staticClass:"ai-analysis-container",class:{"theme-dark":t.isDarkTheme,embedded:t.embedded},style:{"--primary-color":t.primaryColor}},[s("div",{staticClass:"main-content-full"},[s("div",{staticClass:"top-index-bar"},[t.loadingSentiment?[t._m(0),t._m(1),t._m(2)]:[s("div",{staticClass:"indicator-box fear-greed",class:t.getFearGreedClass(t.marketData.fearGreed)},[s("span",{staticClass:"ind-label"},[t._v(t._s(t.$t("globalMarket.fearGreedShort")))]),s("span",{staticClass:"ind-value"},[t._v(t._s(t.marketData.fearGreed||"--"))])]),s("div",{staticClass:"indicator-box vix",class:t.getVixLevel(t.marketData.vix)},[s("span",{staticClass:"ind-label"},[t._v("VIX")]),s("span",{staticClass:"ind-value"},[t._v(t._s(t.marketData.vix||"--"))])]),s("div",{staticClass:"indicator-box dxy"},[s("span",{staticClass:"ind-label"},[t._v("DXY")]),s("span",{staticClass:"ind-value"},[t._v(t._s(t.marketData.dxy||"--"))])])],s("div",{staticClass:"indices-marquee"},[t.loadingIndices?[s("div",{staticClass:"indices-loading"},[s("a-icon",{attrs:{type:"loading"}}),t._v(" "+t._s(t.$t("common.loading")||"加载中...")+" ")],1)]:t.marketData.indices.length>0?[s("div",{staticClass:"marquee-track"},[t._l(t.marketData.indices,function(a){return s("div",{key:"a-"+a.symbol,staticClass:"index-item"},[s("span",{staticClass:"idx-flag"},[t._v(t._s(a.flag))]),s("span",{staticClass:"idx-symbol"},[t._v(t._s(a.symbol))]),s("span",{staticClass:"idx-price"},[t._v(t._s(t.formatPrice(a.price)))]),s("span",{staticClass:"idx-change",class:a.change>=0?"up":"down"},[s("a-icon",{attrs:{type:a.change>=0?"caret-up":"caret-down"}}),t._v(" "+t._s(Math.abs(a.change).toFixed(2))+"% ")],1)])}),t._l(t.marketData.indices,function(a){return s("div",{key:"b-"+a.symbol,staticClass:"index-item"},[s("span",{staticClass:"idx-flag"},[t._v(t._s(a.flag))]),s("span",{staticClass:"idx-symbol"},[t._v(t._s(a.symbol))]),s("span",{staticClass:"idx-price"},[t._v(t._s(t.formatPrice(a.price)))]),s("span",{staticClass:"idx-change",class:a.change>=0?"up":"down"},[s("a-icon",{attrs:{type:a.change>=0?"caret-up":"caret-down"}}),t._v(" "+t._s(Math.abs(a.change).toFixed(2))+"% ")],1)])})],2)]:[s("div",{staticClass:"indices-empty"},[t._v("--")])]],2),s("a-button",{staticClass:"refresh-btn",attrs:{type:"link",size:"small",loading:t.loadingMarket},on:{click:t.loadMarketData}},[s("a-icon",{attrs:{type:"sync",spin:t.loadingMarket}})],1)],2),s("div",{staticClass:"main-body"},[s("div",{staticClass:"left-panel"},[s("div",{staticClass:"heatmap-box"},[s("div",{staticClass:"box-header"},[s("a-radio-group",{attrs:{size:"small","button-style":"solid"},model:{value:t.heatmapType,callback:function(s){t.heatmapType=s},expression:"heatmapType"}},[s("a-radio-button",{attrs:{value:"crypto"}},[t._v(t._s(t.$t("globalMarket.cryptoHeatmap")))]),s("a-radio-button",{attrs:{value:"commodities"}},[t._v(t._s(t.$t("globalMarket.commoditiesHeatmap")))]),s("a-radio-button",{attrs:{value:"sectors"}},[t._v(t._s(t.$t("globalMarket.sectorHeatmap")))]),s("a-radio-button",{attrs:{value:"forex"}},[t._v(t._s(t.$t("globalMarket.forexHeatmap")))])],1)],1),s("div",{staticClass:"heatmap-grid"},[t.loadingHeatmap?t._l(12,function(t){return s("div",{key:"skel-"+t,staticClass:"heat-cell skeleton-cell"},[s("span",{staticClass:"skeleton-text short"}),s("span",{staticClass:"skeleton-text"})])}):t.currentHeatmap.length>0?t._l(t.currentHeatmap.slice(0,12),function(a,e){return s("div",{key:e,staticClass:"heat-cell",style:t.getHeatmapStyle(a.value)},[s("span",{staticClass:"heat-name"},[t._v(t._s(t.getHeatmapName(a)))]),a.price?s("span",{staticClass:"heat-price"},[t._v(t._s(t.formatHeatmapPrice(a.price)))]):t._e(),s("span",{staticClass:"heat-val"},[t._v(t._s(a.value>=0?"+":"")+t._s(t.formatNum(a.value))+"%")])])}):[s("div",{staticClass:"heatmap-empty"},[t._v(t._s(t.$t("common.noData")||"暂无数据"))])]],2)]),s("div",{staticClass:"calendar-box"},[s("div",{staticClass:"box-header"},[s("span",{staticClass:"box-title"},[s("a-icon",{attrs:{type:"calendar"}}),t._v(" "+t._s(t.$t("globalMarket.calendar")))],1)]),s("div",{staticClass:"calendar-list"},[t.loadingCalendar?t._l(5,function(t){return s("div",{key:"cal-skel-"+t,staticClass:"cal-item skeleton-item"},[s("span",{staticClass:"skeleton-text short"}),s("span",{staticClass:"skeleton-text short"}),s("span",{staticClass:"skeleton-text"})])}):t.marketData.calendar.length>0?t._l(t.marketData.calendar.slice(0,10),function(a){return s("div",{key:a.id,staticClass:"cal-item",class:a.importance},[s("span",{staticClass:"cal-date"},[t._v(t._s(t.formatCalendarDate(a.date)))]),s("span",{staticClass:"cal-time"},[t._v(t._s(a.time||"--:--"))]),s("span",{staticClass:"cal-flag"},[t._v(t._s(t.getCountryFlag(a.country)))]),s("span",{staticClass:"cal-name"},[t._v(t._s(t.isZhLocale?a.name:a.name_en))]),s("span",{staticClass:"cal-impact",class:t.getImpactClass(a)},["bullish"===t.getImpactClass(a)?s("a-icon",{attrs:{type:"arrow-up"}}):"bearish"===t.getImpactClass(a)?s("a-icon",{attrs:{type:"arrow-down"}}):s("a-icon",{attrs:{type:"minus"}}),t._v(" "+t._s(a.actual||a.forecast||"--")+" ")],1)])}):[s("div",{staticClass:"cal-empty"},[t._v(t._s(t.$t("globalMarket.noEvents")))])]],2)])]),s("div",{staticClass:"right-panel"},[s("div",{staticClass:"analysis-toolbar"},[s("a-select",{staticClass:"symbol-selector",attrs:{placeholder:t.$t("dashboard.analysis.empty.selectSymbol"),size:"large","show-search":"","allow-clear":"","filter-option":t.filterSymbolOption},on:{change:t.handleSymbolChange},model:{value:t.selectedSymbol,callback:function(s){t.selectedSymbol=s},expression:"selectedSymbol"}},[t._l(t.watchlist||[],function(a){return s("a-select-option",{key:"".concat(a.market,"-").concat(a.symbol),attrs:{value:"".concat(a.market,":").concat(a.symbol)}},[s("span",{staticClass:"symbol-option"},[s("a-tag",{attrs:{color:t.getMarketColor(a.market),size:"small"}},[t._v(t._s(t.getMarketName(a.market)))]),s("strong",{staticStyle:{"margin-left":"6px"}},[t._v(t._s(a.symbol))]),a.name?s("span",{staticClass:"symbol-name"},[t._v(t._s(a.name))]):t._e()],1)])}),s("a-select-option",{key:"add-stock-option",staticClass:"add-stock-option",attrs:{value:"__add_stock_option__"}},[s("div",{staticStyle:{"text-align":"center",padding:"4px 0",color:"#1890ff"}},[s("a-icon",{staticStyle:{"margin-right":"4px"},attrs:{type:"plus"}}),t._v(t._s(t.$t("dashboard.analysis.watchlist.add"))+" ")],1)])],2),s("a-button",{staticClass:"analyze-button",attrs:{type:"primary",size:"large",icon:"thunderbolt",loading:t.analyzing,disabled:!t.selectedSymbol||t.analyzing},on:{click:t.startFastAnalysis}},[t._v(" "+t._s(t.$t("fastAnalysis.startAnalysis"))+" ")]),s("a-button",{staticClass:"history-button",attrs:{size:"large",icon:"history"},on:{click:function(s){t.showHistoryModal=!0,t.loadHistoryList()}}},[t._v(" "+t._s(t.$t("fastAnalysis.history"))+" ")])],1),s("div",{staticClass:"analysis-main"},[t.analysisResult||t.analyzing||t.analysisError?t._e():s("div",{staticClass:"analysis-placeholder"},[s("div",{staticClass:"placeholder-content"},[s("div",{staticClass:"placeholder-icon"},[s("a-icon",{attrs:{type:"robot"}})],1),s("h3",[t._v(t._s(t.$t("fastAnalysis.selectTip")))]),s("p",[t._v(t._s(t.$t("fastAnalysis.selectHint")))])])]),t.analysisResult||t.analyzing||t.analysisError?s("FastAnalysisReport",{attrs:{result:t.analysisResult,loading:t.analyzing,error:t.analysisError,"error-tone":t.analysisErrorTone},on:{retry:t.startFastAnalysis}}):t._e()],1)]),s("div",{staticClass:"watchlist-panel"},[s("div",{staticClass:"panel-header"},[s("span",{staticClass:"panel-title"},[s("a-icon",{attrs:{type:"star",theme:"filled"}}),t._v(" "+t._s(t.$t("dashboard.analysis.watchlist.title")))],1),s("a-button",{attrs:{type:"link",size:"small"},on:{click:function(s){t.showAddStockModal=!0}}},[s("a-icon",{attrs:{type:"plus"}})],1)],1),s("div",{staticClass:"watchlist-list"},[t._l(t.watchlist||[],function(a){var e,i,r;return s("div",{key:"".concat(a.market,"-").concat(a.symbol),staticClass:"watchlist-item",class:{active:t.selectedSymbol==="".concat(a.market,":").concat(a.symbol)},on:{click:function(s){return t.selectWatchlistItem(a)}}},[s("div",{staticClass:"item-main"},[s("span",{staticClass:"item-symbol"},[t._v(t._s(a.symbol))]),s("span",{staticClass:"item-name"},[t._v(t._s(a.name||t.getMarketName(a.market)))])]),t.watchlistPrices["".concat(a.market,":").concat(a.symbol)]?s("div",{staticClass:"item-price"},[s("span",{staticClass:"price-value"},[t._v(t._s(t.formatPrice(t.watchlistPrices["".concat(a.market,":").concat(a.symbol)].price)))]),s("span",{staticClass:"price-change",class:((null===(e=t.watchlistPrices["".concat(a.market,":").concat(a.symbol)])||void 0===e?void 0:e.change)||0)>=0?"up":"down"},[t._v(" "+t._s(((null===(i=t.watchlistPrices["".concat(a.market,":").concat(a.symbol)])||void 0===i?void 0:i.change)||0)>=0?"+":"")+t._s(t.formatNum(null===(r=t.watchlistPrices["".concat(a.market,":").concat(a.symbol)])||void 0===r?void 0:r.change))+"% ")])]):t._e(),s("a-icon",{staticClass:"item-remove",attrs:{type:"close"},on:{click:function(s){return s.stopPropagation(),t.removeFromWatchlist(a)}}})],1)}),t.watchlist&&0!==t.watchlist.length?t._e():s("div",{staticClass:"watchlist-empty"},[s("a-icon",{attrs:{type:"inbox"}}),s("p",[t._v(t._s(t.$t("dashboard.analysis.empty.noWatchlist")))]),s("a-button",{attrs:{type:"primary",size:"small"},on:{click:function(s){t.showAddStockModal=!0}}},[s("a-icon",{attrs:{type:"plus"}}),t._v(" "+t._s(t.$t("dashboard.analysis.watchlist.add"))+" ")],1)],1)],2)])])]),s("a-modal",{attrs:{title:t.$t("dashboard.analysis.modal.addStock.title"),visible:t.showAddStockModal,confirmLoading:t.addingStock,width:"600px",okText:t.$t("dashboard.analysis.modal.addStock.confirm"),cancelText:t.$t("dashboard.analysis.modal.addStock.cancel")},on:{ok:t.handleAddStock,cancel:t.handleCloseAddStockModal}},[s("div",{staticClass:"add-stock-modal-content"},[s("a-tabs",{staticClass:"market-tabs",on:{change:t.handleMarketTabChange},model:{value:t.selectedMarketTab,callback:function(s){t.selectedMarketTab=s},expression:"selectedMarketTab"}},t._l(t.marketTypes,function(a){return s("a-tab-pane",{key:a.value,attrs:{tab:t.$t(a.i18nKey||"dashboard.analysis.market.".concat(a.value))}})}),1),s("div",{staticClass:"symbol-search-section"},[s("a-input-search",{attrs:{placeholder:t.$t("dashboard.analysis.modal.addStock.searchOrInputPlaceholder"),loading:t.searchingSymbols,size:"large","allow-clear":""},on:{search:t.handleSearchOrInput,change:t.handleSymbolSearchInput},model:{value:t.symbolSearchKeyword,callback:function(s){t.symbolSearchKeyword=s},expression:"symbolSearchKeyword"}},[s("a-button",{attrs:{slot:"enterButton",type:"primary",icon:"search"},slot:"enterButton"},[t._v(" "+t._s(t.$t("dashboard.analysis.modal.addStock.search"))+" ")])],1)],1),t.symbolSearchResults.length>0?s("div",{staticClass:"search-results-section"},[s("div",{staticClass:"section-title"},[s("a-icon",{staticStyle:{"margin-right":"4px"},attrs:{type:"search"}}),t._v(" "+t._s(t.$t("dashboard.analysis.modal.addStock.searchResults"))+" ")],1),s("a-list",{staticClass:"symbol-list",attrs:{"data-source":t.symbolSearchResults,loading:t.searchingSymbols,size:"small"},scopedSlots:t._u([{key:"renderItem",fn:function(a){return s("a-list-item",{staticClass:"symbol-list-item",on:{click:function(s){return t.selectSymbol(a)}}},[s("a-list-item-meta",[s("template",{slot:"title"},[s("div",{staticClass:"symbol-item-content"},[s("span",{staticClass:"symbol-code"},[t._v(t._s(a.symbol))]),s("span",{staticClass:"symbol-name"},[t._v(t._s(a.name))]),a.exchange?s("a-tag",{staticStyle:{"margin-left":"8px"},attrs:{size:"small",color:"blue"}},[t._v(" "+t._s(a.exchange)+" ")]):t._e()],1)])],2)],1)}}],null,!1,1074844145)})],1):t._e(),s("div",{staticClass:"hot-symbols-section"},[s("div",{staticClass:"section-title"},[s("a-icon",{staticStyle:{color:"#ff4d4f","margin-right":"4px"},attrs:{type:"fire"}}),t._v(" "+t._s(t.$t("dashboard.analysis.modal.addStock.hotSymbols"))+" ")],1),s("a-spin",{attrs:{spinning:t.loadingHotSymbols}},[t.hotSymbols.length>0?s("a-list",{staticClass:"symbol-list",attrs:{"data-source":t.hotSymbols,size:"small"},scopedSlots:t._u([{key:"renderItem",fn:function(a){return s("a-list-item",{staticClass:"symbol-list-item",on:{click:function(s){return t.selectSymbol(a)}}},[s("a-list-item-meta",[s("template",{slot:"title"},[s("div",{staticClass:"symbol-item-content"},[s("span",{staticClass:"symbol-code"},[t._v(t._s(a.symbol))]),s("span",{staticClass:"symbol-name"},[t._v(t._s(a.name))]),a.exchange?s("a-tag",{staticStyle:{"margin-left":"8px"},attrs:{size:"small",color:"orange"}},[t._v(" "+t._s(a.exchange)+" ")]):t._e()],1)])],2)],1)}}],null,!1,2177647935)}):s("a-empty",{attrs:{description:t.$t("dashboard.analysis.modal.addStock.noHotSymbols"),image:!1}})],1)],1),t.selectedSymbolForAdd?s("div",{staticClass:"selected-symbol-section"},[s("a-alert",{attrs:{message:t.$t("dashboard.analysis.modal.addStock.selectedSymbol"),type:"info","show-icon":"",closable:""},on:{close:function(s){t.selectedSymbolForAdd=null}}},[s("template",{slot:"description"},[s("div",{staticClass:"selected-symbol-info"},[s("a-tag",{staticStyle:{"margin-right":"8px"},attrs:{color:t.getMarketColor(t.selectedSymbolForAdd.market)}},[t._v(" "+t._s(t.$t("dashboard.analysis.market.".concat(t.selectedSymbolForAdd.market)))+" ")]),s("strong",[t._v(t._s(t.selectedSymbolForAdd.symbol))]),t.selectedSymbolForAdd.name?s("span",{staticStyle:{color:"#999","margin-left":"8px"}},[t._v(t._s(t.selectedSymbolForAdd.name))]):t._e()],1)])],2)],1):t._e()],1)]),s("a-modal",{attrs:{title:t.$t("dashboard.analysis.modal.history.title"),visible:t.showHistoryModal,footer:null,width:"800px",bodyStyle:{maxHeight:"60vh",overflowY:"auto"}},on:{cancel:function(s){t.showHistoryModal=!1}}},[s("a-spin",{attrs:{spinning:t.historyLoading}},[s("a-list",{attrs:{"data-source":t.historyList,pagination:{current:t.historyPage,pageSize:t.historyPageSize,total:t.historyTotal,onChange:function(s){t.historyPage=s,t.loadHistoryList()},showSizeChanger:!0,pageSizeOptions:["10","20","50"],onShowSizeChange:function(s,a){t.historyPageSize=a,t.historyPage=1,t.loadHistoryList()}}},scopedSlots:t._u([{key:"renderItem",fn:function(a){return s("a-list-item",{},[s("a-list-item-meta",[s("template",{slot:"title"},[s("div",{staticStyle:{display:"flex","align-items":"center","justify-content":"space-between"}},[s("div",[s("a-tag",{staticStyle:{"margin-right":"8px"},attrs:{color:t.getMarketColor(a.market)}},[t._v(" "+t._s(t.getMarketName(a.market))+" ")]),s("strong",[t._v(t._s(a.symbol))]),s("a-tag",{staticStyle:{"margin-left":"12px"},attrs:{color:"BUY"===a.decision?"green":"SELL"===a.decision?"red":"blue"}},[t._v(" "+t._s(a.decision)+" ")]),s("span",{staticStyle:{color:"#999","margin-left":"8px","font-size":"12px"}},[t._v(" "+t._s(t.$t("fastAnalysis.confidence"))+": "+t._s(a.confidence)+"% ")])],1),s("div",[s("a-button",{attrs:{type:"link",size:"small",icon:"eye"},on:{click:function(s){return t.viewHistoryResult(a)}}},[t._v(" "+t._s(t.$t("dashboard.analysis.modal.history.viewResult"))+" ")]),s("a-popconfirm",{attrs:{title:t.$t("dashboard.analysis.modal.history.deleteConfirm"),"ok-text":t.$t("common.confirm"),"cancel-text":t.$t("common.cancel")},on:{confirm:function(s){return t.deleteHistoryItem(a)}}},[s("a-button",{staticStyle:{color:"#ff4d4f"},attrs:{type:"link",size:"small",icon:"delete"}},[t._v(" "+t._s(t.$t("dashboard.analysis.modal.history.delete"))+" ")])],1)],1)])]),s("template",{slot:"description"},[s("div",{staticStyle:{color:"#666","font-size":"12px"}},[a.price?s("span",[t._v("$"+t._s(t.formatNumber(a.price)))]):t._e(),a.summary?s("span",{staticStyle:{"margin-left":"8px"}},[t._v(t._s(a.summary.substring(0,80))+t._s(a.summary.length>80?"...":""))]):t._e()]),a.created_at?s("div",{staticStyle:{color:"#999","font-size":"12px","margin-top":"4px"}},[t._v(" "+t._s(t.formatIsoTime(a.created_at))+" ")]):t._e()])],2)],1)}}])}),t.historyLoading||0!==t.historyList.length?t._e():s("a-empty",{attrs:{description:t.$t("dashboard.analysis.empty.noHistory")}})],1)],1)],1)},i=[function(){var t=this,s=t._self._c;return s("div",{staticClass:"indicator-box skeleton-box"},[s("span",{staticClass:"skeleton-text short"}),s("span",{staticClass:"skeleton-text"})])},function(){var t=this,s=t._self._c;return s("div",{staticClass:"indicator-box skeleton-box"},[s("span",{staticClass:"skeleton-text short"}),s("span",{staticClass:"skeleton-text"})])},function(){var t=this,s=t._self._c;return s("div",{staticClass:"indicator-box skeleton-box"},[s("span",{staticClass:"skeleton-text short"}),s("span",{staticClass:"skeleton-text"})])}],r=a(68285),n=a(21092),l=a(76959),o=a(17654),c=a(57888),d=(a(74423),a(95353)),u=a(55585),m=a(64118),h=a(76471),y="/api/fast-analysis";function p(t){return(0,h.Ay)({url:"".concat(y,"/analyze"),method:"post",data:t,timeout:3e5})}function v(t){return(0,h.Ay)({url:"".concat(y,"/history/all"),method:"get",params:t})}function f(t){return(0,h.Ay)({url:"".concat(y,"/history/").concat(t),method:"delete"})}function g(t){return(0,h.Ay)({url:"".concat(y,"/feedback"),method:"post",data:t})}var b=a(62618),_=function(){var t,s,a,e,i,r,n,l,o,c,d,u,m,h,y,p,v,f,g,b,_,k,C,S,A,w=this,$=w._self._c;return $("div",{staticClass:"fast-analysis-report",class:{"theme-dark":w.isDarkTheme}},[w.loading?$("div",{staticClass:"loading-container"},[$("div",{staticClass:"loading-content-pro"},[$("div",{staticClass:"loading-header"},[$("a-icon",{staticClass:"loading-icon-pro",attrs:{type:"thunderbolt"}}),$("span",{staticClass:"loading-title"},[w._v(w._s(w.$t("fastAnalysis.analyzing")))])],1),$("div",{staticClass:"progress-wrapper"},[$("a-progress",{attrs:{percent:w.progressPercent,showInfo:!1,strokeColor:"#1890ff",strokeWidth:8}}),$("span",{staticClass:"progress-text"},[w._v(w._s(w.formatProgress(w.progressPercent))+"%")])],1),$("div",{staticClass:"current-step"},[$("a-icon",{attrs:{type:"loading",spin:""}}),$("span",[w._v(w._s(w.currentStepText))])],1),$("div",{staticClass:"steps-list"},[$("div",{staticClass:"step-item",class:{done:w.step>1,active:1===w.step}},[$("span",{staticClass:"step-dot"}),$("span",{staticClass:"step-text"},[w._v(w._s(w.$t("fastAnalysis.step1")||"获取实时数据"))]),w.step>1?$("a-icon",{staticClass:"step-check",attrs:{type:"check"}}):w._e()],1),$("div",{staticClass:"step-item",class:{done:w.step>2,active:2===w.step}},[$("span",{staticClass:"step-dot"}),$("span",{staticClass:"step-text"},[w._v(w._s(w.$t("fastAnalysis.step2")||"计算技术指标"))]),w.step>2?$("a-icon",{staticClass:"step-check",attrs:{type:"check"}}):w._e()],1),$("div",{staticClass:"step-item",class:{done:w.step>3,active:3===w.step}},[$("span",{staticClass:"step-dot"}),$("span",{staticClass:"step-text"},[w._v(w._s(w.$t("fastAnalysis.step3")||"AI深度分析"))]),w.step>3?$("a-icon",{staticClass:"step-check",attrs:{type:"check"}}):w._e()],1),$("div",{staticClass:"step-item",class:{done:w.step>4,active:4===w.step}},[$("span",{staticClass:"step-dot"}),$("span",{staticClass:"step-text"},[w._v(w._s(w.$t("fastAnalysis.step4")||"生成报告"))]),w.step>4?$("a-icon",{staticClass:"step-check",attrs:{type:"check"}}):w._e()],1)]),$("div",{staticClass:"loading-footer"},[$("span",{staticClass:"elapsed-time"},[w._v(w._s(w.elapsedTimeText))])])])]):w.error?$("div",{staticClass:"error-container"},[$("a-result",{attrs:{status:"warning"===w.errorTone?"warning":"error",title:w.errorTitle,"sub-title":w.error},scopedSlots:w._u([{key:"extra",fn:function(){return[$("a-button",{attrs:{type:"primary"},on:{click:function(t){return w.$emit("retry")}}},[w._v(" "+w._s(w.$t("fastAnalysis.retry"))+" ")])]},proxy:!0}])})],1):w.result?$("div",{staticClass:"result-container"},[$("div",{staticClass:"decision-card",class:w.decisionClass},[$("div",{staticClass:"decision-main"},[$("div",{staticClass:"decision-badge"},[$("a-icon",{attrs:{type:w.decisionIcon}}),$("span",{staticClass:"decision-text"},[w._v(w._s(w.result.decision))])],1),$("div",{staticClass:"confidence-ring"},[$("a-progress",{attrs:{type:"circle",percent:w.result.confidence,width:80,strokeColor:w.confidenceColor},scopedSlots:w._u([{key:"format",fn:function(t){return[$("span",{staticClass:"confidence-value"},[w._v(w._s(t)+"%")])]}}])}),$("div",{staticClass:"confidence-label"},[w._v(w._s(w.$t("fastAnalysis.confidence")))])],1)]),$("div",{staticClass:"decision-summary"},[w._v(" "+w._s(w.result.summary)+" ")]),w.consensusBlock?$("div",{staticClass:"consensus-strip"},[$("div",{staticClass:"consensus-strip-title"},[$("a-icon",{attrs:{type:"cluster"}}),w._v(" "+w._s(w.$t("fastAnalysis.consensusTitle"))+" ")],1),$("div",{staticClass:"consensus-strip-metrics"},[$("span",{staticClass:"cm-item"},[$("em",[w._v(w._s(w.$t("fastAnalysis.consensusDecision")))]),w._v(" "+w._s(w.consensusBlock.consensus_decision)+" ")]),$("span",{staticClass:"cm-item"},[$("em",[w._v(w._s(w.$t("fastAnalysis.consensusScore")))]),w._v(" "+w._s(w.formatConsensusNum(w.consensusBlock.consensus_score))+" ")]),null!=w.consensusBlock.agreement_ratio?$("span",{staticClass:"cm-item"},[$("em",[w._v(w._s(w.$t("fastAnalysis.consensusAgreement")))]),w._v(" "+w._s(w.formatAgreementPct(w.consensusBlock.agreement_ratio))+" ")]):w._e()])]):w._e()]),$("div",{staticClass:"price-info-row"},[$("div",{staticClass:"price-card current"},[$("div",{staticClass:"price-label"},[w._v(w._s(w.$t("fastAnalysis.currentPrice")))]),$("div",{staticClass:"price-value"},[w._v("$"+w._s(w.formatPrice(null===(t=w.result.market_data)||void 0===t?void 0:t.current_price)))]),$("div",{staticClass:"price-change",class:(null===(s=w.result.market_data)||void 0===s?void 0:s.change_24h)>=0?"positive":"negative"},[w._v(" "+w._s((null===(a=w.result.market_data)||void 0===a?void 0:a.change_24h)>=0?"+":"")+w._s(w.formatNumber(null===(e=w.result.market_data)||void 0===e?void 0:e.change_24h,2))+"% ")])]),$("div",{staticClass:"price-card entry"},[$("div",{staticClass:"price-label"},[w._v(w._s(w.$t("fastAnalysis.entryPrice")))]),$("div",{staticClass:"price-value"},[w._v("$"+w._s(w.formatPrice(null===(i=w.result.trading_plan)||void 0===i?void 0:i.entry_price)))])]),$("div",{staticClass:"price-card stop"},[$("div",{staticClass:"price-label"},[w._v(w._s(w.$t("fastAnalysis.stopLoss")))]),$("div",{staticClass:"price-value negative"},[w._v("$"+w._s(w.formatPrice(null===(r=w.result.trading_plan)||void 0===r?void 0:r.stop_loss)))]),$("div",{staticClass:"price-hint"},[$("a-tooltip",{attrs:{title:w.$t("fastAnalysis.stopLossHint")}},[$("a-icon",{attrs:{type:"info-circle"}}),w._v(" "+w._s(w.$t("fastAnalysis.atrBased"))+" ")],1)],1)]),$("div",{staticClass:"price-card target"},[$("div",{staticClass:"price-label"},[w._v(w._s(w.$t("fastAnalysis.takeProfit")))]),$("div",{staticClass:"price-value positive"},[w._v("$"+w._s(w.formatPrice(null===(n=w.result.trading_plan)||void 0===n?void 0:n.take_profit)))]),$("div",{staticClass:"price-hint"},[$("a-tooltip",{attrs:{title:w.$t("fastAnalysis.takeProfitHint")}},[$("a-icon",{attrs:{type:"info-circle"}}),w._v(" "+w._s(w.$t("fastAnalysis.atrBased"))+" ")],1)],1)])]),$("div",{staticClass:"scores-row"},[$("div",{staticClass:"score-item"},[$("div",{staticClass:"score-header"},[$("a-icon",{attrs:{type:"line-chart"}}),$("span",[w._v(w._s(w.$t("fastAnalysis.technical")))])],1),$("a-progress",{attrs:{percent:(null===(l=w.result.scores)||void 0===l?void 0:l.technical)||50,strokeColor:w.getScoreColor(null===(o=w.result.scores)||void 0===o?void 0:o.technical),showInfo:!1}}),$("div",{staticClass:"score-value"},[w._v(w._s((null===(c=w.result.scores)||void 0===c?void 0:c.technical)||50))])],1),$("div",{staticClass:"score-item"},[$("div",{staticClass:"score-header"},[$("a-icon",{attrs:{type:"bank"}}),$("span",[w._v(w._s(w.$t("fastAnalysis.fundamental")))])],1),$("a-progress",{attrs:{percent:(null===(d=w.result.scores)||void 0===d?void 0:d.fundamental)||50,strokeColor:w.getScoreColor(null===(u=w.result.scores)||void 0===u?void 0:u.fundamental),showInfo:!1}}),$("div",{staticClass:"score-value"},[w._v(w._s((null===(m=w.result.scores)||void 0===m?void 0:m.fundamental)||50))])],1),$("div",{staticClass:"score-item"},[$("div",{staticClass:"score-header"},[$("a-icon",{attrs:{type:"heart"}}),$("span",[w._v(w._s(w.$t("fastAnalysis.sentiment")))])],1),$("a-progress",{attrs:{percent:(null===(h=w.result.scores)||void 0===h?void 0:h.sentiment)||50,strokeColor:w.getScoreColor(null===(y=w.result.scores)||void 0===y?void 0:y.sentiment),showInfo:!1}}),$("div",{staticClass:"score-value"},[w._v(w._s((null===(p=w.result.scores)||void 0===p?void 0:p.sentiment)||50))])],1),$("div",{staticClass:"score-item overall"},[$("div",{staticClass:"score-header"},[$("a-icon",{attrs:{type:"dashboard"}}),$("span",[w._v(w._s(w.$t("fastAnalysis.overall")))])],1),$("a-progress",{attrs:{percent:(null===(v=w.result.scores)||void 0===v?void 0:v.overall)||50,strokeColor:w.getScoreColor(null===(f=w.result.scores)||void 0===f?void 0:f.overall),showInfo:!1}}),$("div",{staticClass:"score-value"},[w._v(w._s((null===(g=w.result.scores)||void 0===g?void 0:g.overall)||50))])],1)]),w.result.detailed_analysis?$("div",{staticClass:"detailed-analysis"},[w.result.detailed_analysis.technical?$("div",{staticClass:"analysis-card technical"},[$("div",{staticClass:"analysis-card-header"},[$("a-icon",{attrs:{type:"line-chart"}}),$("span",[w._v(w._s(w.$t("fastAnalysis.technicalAnalysis")))]),$("a-tag",{attrs:{color:w.getScoreTagColor(null===(b=w.result.scores)||void 0===b?void 0:b.technical)}},[w._v(" "+w._s((null===(_=w.result.scores)||void 0===_?void 0:_.technical)||50)+"分 ")])],1),$("div",{staticClass:"analysis-card-content"},[w._v(" "+w._s(w.result.detailed_analysis.technical)+" ")])]):w._e(),w.result.detailed_analysis.fundamental?$("div",{staticClass:"analysis-card fundamental"},[$("div",{staticClass:"analysis-card-header"},[$("a-icon",{attrs:{type:"bank"}}),$("span",[w._v(w._s(w.$t("fastAnalysis.fundamentalAnalysis")))]),$("a-tag",{attrs:{color:w.getScoreTagColor(null===(k=w.result.scores)||void 0===k?void 0:k.fundamental)}},[w._v(" "+w._s((null===(C=w.result.scores)||void 0===C?void 0:C.fundamental)||50)+"分 ")])],1),$("div",{staticClass:"analysis-card-content"},[w._v(" "+w._s(w.result.detailed_analysis.fundamental)+" ")])]):w._e(),w.result.detailed_analysis.sentiment?$("div",{staticClass:"analysis-card sentiment"},[$("div",{staticClass:"analysis-card-header"},[$("a-icon",{attrs:{type:"heart"}}),$("span",[w._v(w._s(w.$t("fastAnalysis.sentimentAnalysis")))]),$("a-tag",{attrs:{color:w.getScoreTagColor(null===(S=w.result.scores)||void 0===S?void 0:S.sentiment)}},[w._v(" "+w._s((null===(A=w.result.scores)||void 0===A?void 0:A.sentiment)||50)+"分 ")])],1),$("div",{staticClass:"analysis-card-content"},[w._v(" "+w._s(w.result.detailed_analysis.sentiment)+" ")])]):w._e()]):w._e(),$("div",{staticClass:"analysis-details"},[$("div",{staticClass:"detail-section reasons"},[$("div",{staticClass:"section-title"},[$("a-icon",{attrs:{type:"bulb",theme:"twoTone",twoToneColor:"#52c41a"}}),$("span",[w._v(w._s(w.$t("fastAnalysis.keyReasons")))])],1),$("ul",{staticClass:"detail-list"},w._l(w.result.reasons,function(t,s){return $("li",{key:"r-"+s},[w._v(" "+w._s(t)+" ")])}),0)]),$("div",{staticClass:"detail-section risks"},[$("div",{staticClass:"section-title"},[$("a-icon",{attrs:{type:"warning",theme:"twoTone",twoToneColor:"#faad14"}}),$("span",[w._v(w._s(w.$t("fastAnalysis.risks")))])],1),$("ul",{staticClass:"detail-list"},w._l(w.result.risks,function(t,s){return $("li",{key:"k-"+s},[w._v(" "+w._s(t)+" ")])}),0)])]),w.result.indicators&&Object.keys(w.result.indicators).length>0?$("div",{staticClass:"indicators-section"},[$("div",{staticClass:"section-title"},[$("a-icon",{attrs:{type:"stock"}}),$("span",[w._v(w._s(w.$t("fastAnalysis.indicators")))])],1),$("div",{staticClass:"indicators-grid"},[w.result.indicators.rsi?$("div",{staticClass:"indicator-item"},[$("div",{staticClass:"indicator-name"},[w._v("RSI (14)")]),$("div",{staticClass:"indicator-value",class:w.getRsiClass(w.result.indicators.rsi.value)},[w._v(" "+w._s(w.formatNumber(w.result.indicators.rsi.value,1))+" ")]),$("div",{staticClass:"indicator-signal"},[w._v(w._s(w.translateSignal(w.result.indicators.rsi.signal)))])]):w._e(),w.result.indicators.macd?$("div",{staticClass:"indicator-item"},[$("div",{staticClass:"indicator-name"},[w._v("MACD")]),$("div",{staticClass:"indicator-value",class:"bullish"===w.result.indicators.macd.signal?"bullish":"bearish"===w.result.indicators.macd.signal?"bearish":""},[w._v(" "+w._s(w.translateTrend(w.result.indicators.macd.trend))+" ")]),$("div",{staticClass:"indicator-signal"},[w._v(w._s(w.translateSignal(w.result.indicators.macd.signal)))])]):w._e(),w.result.indicators.moving_averages?$("div",{staticClass:"indicator-item"},[$("div",{staticClass:"indicator-name"},[w._v(w._s(w.$t("fastAnalysis.maTrend")))]),$("div",{staticClass:"indicator-value",class:w.getMaTrendClass(w.result.indicators.moving_averages.trend)},[w._v(" "+w._s(w.translateTrend(w.result.indicators.moving_averages.trend))+" ")])]):w._e(),w.result.indicators.levels?$("div",{staticClass:"indicator-item"},[$("div",{staticClass:"indicator-name"},[w._v(w._s(w.$t("fastAnalysis.support")))]),$("div",{staticClass:"indicator-value"},[w._v("$"+w._s(w.formatPrice(w.result.indicators.levels.support)))])]):w._e(),w.result.indicators.levels?$("div",{staticClass:"indicator-item"},[$("div",{staticClass:"indicator-name"},[w._v(w._s(w.$t("fastAnalysis.resistance")))]),$("div",{staticClass:"indicator-value"},[w._v("$"+w._s(w.formatPrice(w.result.indicators.levels.resistance)))])]):w._e(),w.result.indicators.volatility?$("div",{staticClass:"indicator-item"},[$("div",{staticClass:"indicator-name"},[w._v(w._s(w.$t("fastAnalysis.volatility")))]),$("div",{staticClass:"indicator-value",class:w.getVolatilityClass(w.result.indicators.volatility.level)},[w._v(" "+w._s(w.translateVolatility(w.result.indicators.volatility.level))+" ("+w._s(w.result.indicators.volatility.pct)+"%) ")])]):w._e()])]):w._e(),$("div",{staticClass:"feedback-section"},[$("div",{staticClass:"feedback-question"},[w._v(w._s(w.$t("fastAnalysis.wasHelpful")))]),$("div",{staticClass:"feedback-buttons"},[$("a-button",{attrs:{type:"helpful"===w.userFeedback?"primary":"default",size:"small",loading:"helpful"===w.feedbackLoading},on:{click:function(t){return w.submitFeedback("helpful")}}},[$("a-icon",{attrs:{type:"like"}}),w._v(" "+w._s(w.$t("fastAnalysis.helpful"))+" ")],1),$("a-button",{attrs:{type:"not_helpful"===w.userFeedback?"danger":"default",size:"small",loading:"not_helpful"===w.feedbackLoading},on:{click:function(t){return w.submitFeedback("not_helpful")}}},[$("a-icon",{attrs:{type:"dislike"}}),w._v(" "+w._s(w.$t("fastAnalysis.notHelpful"))+" ")],1)],1),$("div",{staticClass:"analysis-meta"},[$("span",[w._v(w._s(w.$t("fastAnalysis.analysisTime"))+": "+w._s(w.result.analysis_time_ms)+"ms")]),w.result.memory_id?$("span",[w._v("ID: #"+w._s(w.result.memory_id))]):w._e()])])]):$("div",{staticClass:"empty-container"},[$("div",{staticClass:"empty-content"},[$("a-icon",{staticClass:"empty-icon",attrs:{type:"radar-chart"}}),$("div",{staticClass:"empty-title"},[w._v(w._s(w.$t("fastAnalysis.selectSymbol")))]),$("div",{staticClass:"empty-hint"},[w._v(w._s(w.$t("fastAnalysis.selectHint")))])],1)])])},k=[],C={name:"FastAnalysisReport",props:{result:{type:Object,default:null},loading:{type:Boolean,default:!1},error:{type:String,default:null},errorTone:{type:String,default:"error",validator:function(t){return["error","warning","info"].includes(t)}}},data:function(){return{userFeedback:null,feedbackLoading:null,progress:0,elapsedSeconds:0,mainTimer:null}},computed:(0,c.A)((0,c.A)({},(0,d.aH)({navTheme:function(t){return t.app.theme}})),{},{isDarkTheme:function(){return"dark"===this.navTheme||"realdark"===this.navTheme},progressPercent:function(){return Math.round(10*this.progress)/10},step:function(){return this.progress<25?1:this.progress<50?2:this.progress<75?3:4},currentStepText:function(){var t={1:this.$t("fastAnalysis.step1")||"获取实时数据",2:this.$t("fastAnalysis.step2")||"计算技术指标",3:this.$t("fastAnalysis.step3")||"AI深度分析",4:this.$t("fastAnalysis.step4")||"生成报告"};return t[this.step]||this.$t("fastAnalysis.preparing")||"准备中..."},elapsedTimeText:function(){if(this.elapsedSeconds<60)return"".concat(this.elapsedSeconds,"s");var t=Math.floor(this.elapsedSeconds/60),s=this.elapsedSeconds%60;return"".concat(t,"m ").concat(s,"s")},decisionClass:function(){if(!this.result)return"";var t=this.result.decision;return"BUY"===t?"decision-buy":"SELL"===t?"decision-sell":"decision-hold"},decisionIcon:function(){if(!this.result)return"question";var t=this.result.decision;return"BUY"===t?"arrow-up":"SELL"===t?"arrow-down":"pause"},confidenceColor:function(){var t,s=(null===(t=this.result)||void 0===t?void 0:t.confidence)||50;return s>=70?"#52c41a":s>=50?"#1890ff":"#faad14"},consensusBlock:function(){var t,s=null===(t=this.result)||void 0===t?void 0:t.consensus;return s&&"object"===(0,r.A)(s)?null==s.consensus_decision&&null==s.consensus_score?null:s:null},insufficientCreditsError:function(){if(!this.error)return!1;var t=String(this.error);return t.includes("积分不足")||t.toLowerCase().includes("insufficient credits")},errorTitle:function(){return"warning"===this.errorTone?this.$t("fastAnalysis.analysisInProgressTitle"):this.insufficientCreditsError?this.$t("fastAnalysis.insufficientCredits"):this.$t("fastAnalysis.error")}}),watch:{result:function(){this.userFeedback=null},loading:{handler:function(t){t?this.startProgressTimer():this.stopProgressTimer()},immediate:!0}},mounted:function(){this.loading&&this.startProgressTimer()},beforeDestroy:function(){this.stopProgressTimer()},methods:{formatPrice:function(t){if(void 0===t||null===t)return"--";var s=parseFloat(t);return isNaN(s)?"--":s<1?s.toFixed(6):s<100?s.toFixed(4):s<1e4?s.toFixed(2):s.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})},formatNumber:function(t){var s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:2;if(void 0===t||null===t)return"--";var a=parseFloat(t);return isNaN(a)?"--":a.toFixed(s)},formatConsensusNum:function(t){if(void 0===t||null===t||""===t)return"--";var s=Number(t);return Number.isNaN(s)?"--":s.toFixed(1)},formatAgreementPct:function(t){var s=Number(t);return Number.isNaN(s)?"--":"".concat(Math.round(100*s),"%")},formatProgress:function(t){var s=parseFloat(t)||0;return s%1===0?s.toFixed(0):s.toFixed(1)},getScoreColor:function(t){return t>=70?"#52c41a":t>=50?"#1890ff":t>=30?"#faad14":"#ff4d4f"},getScoreTagColor:function(t){return t>=70?"green":t>=50?"blue":t>=30?"orange":"red"},getRsiClass:function(t){return t<30?"oversold":t>70?"overbought":""},getMaTrendClass:function(t){return t?t.includes("uptrend")||t.includes("strong_uptrend")?"bullish":t.includes("downtrend")||t.includes("strong_downtrend")?"bearish":"":""},getVolatilityClass:function(t){return"high"===t?"high-volatility":"low"===t?"low-volatility":""},translateSignal:function(t){if(!t)return"--";var s="fastAnalysis.signal.".concat(t),a=this.$t(s);return a===s?t:a},translateTrend:function(t){if(!t)return"--";var s="fastAnalysis.trend.".concat(t),a=this.$t(s);return a===s?t:a},translateVolatility:function(t){if(!t)return"--";var s="fastAnalysis.volatilityLevel.".concat(t),a=this.$t(s);return a===s?t:a},submitFeedback:function(t){var s=this;return(0,o.A)((0,l.A)().m(function a(){var e;return(0,l.A)().w(function(a){while(1)switch(a.p=a.n){case 0:if(null!==(e=s.result)&&void 0!==e&&e.memory_id){a.n=1;break}return s.$message.warning(s.$t("fastAnalysis.feedbackUnavailable")||"反馈功能暂不可用,请刷新后重试"),a.a(2);case 1:return s.feedbackLoading=t,a.p=2,a.n=3,g({memory_id:s.result.memory_id,feedback:t});case 3:s.userFeedback=t,s.$message.success(s.$t("fastAnalysis.feedbackThanks")),a.n=5;break;case 4:a.p=4,a.v,s.$message.error(s.$t("fastAnalysis.feedbackFailed"));case 5:return a.p=5,s.feedbackLoading=null,a.f(5);case 6:return a.a(2)}},a,null,[[2,4,5,6]])}))()},startProgressTimer:function(){var t=this;this.stopProgressTimer(),this.progress=0,this.elapsedSeconds=0;var s=Date.now();this.mainTimer=window.setInterval(function(){t.elapsedSeconds=Math.floor((Date.now()-s)/1e3),t.progress<75?t.progress=Math.min(t.progress+1,75):t.progress<90?t.progress=Math.min(t.progress+.5,90):t.progress<95&&(t.progress=Math.min(t.progress+.2,95))},100)},stopProgressTimer:function(){this.mainTimer&&(window.clearInterval(this.mainTimer),this.mainTimer=null),this.progress=0,this.elapsedSeconds=0}}},S=C,A=a(845),w=(0,A.A)(S,_,k,!1,null,"693144f6",null),$=w.exports,T={name:"Analysis",props:{embedded:{type:Boolean,default:!1},presetSymbol:{type:String,default:""},autoAnalyzeSignal:{type:Number,default:0}},components:{FastAnalysisReport:$},data:function(){return{loadingMarket:!1,heatmapType:"crypto",marketData:{fearGreed:null,vix:null,dxy:null,indices:[],heatmap:{crypto:[],commodities:[],sectors:[],forex:[]},calendar:[]},loadingSentiment:!1,loadingIndices:!1,loadingHeatmap:!1,loadingCalendar:!1,watchlistPriceTimer:null,watchlistPrices:{},localUserInfo:{},loadingUserInfo:!1,userId:1,watchlist:[],loadingWatchlist:!1,showAddStockModal:!1,addingStock:!1,selectedSymbol:void 0,analyzing:!1,analysisResult:null,analysisError:null,analysisErrorTone:"error",showHistoryModal:!1,historyList:[],historyLoading:!1,historyPage:1,historyPageSize:20,historyTotal:0,marketTypes:[],selectedMarketTab:"",symbolSearchKeyword:"",symbolSearchResults:[],searchingSymbols:!1,hotSymbols:[],loadingHotSymbols:!1,selectedSymbolForAdd:null,searchTimer:null,hasSearched:!1}},computed:(0,c.A)((0,c.A)((0,c.A)({},(0,d.L8)(["userInfo"])),(0,d.aH)({navTheme:function(t){return t.app.theme},primaryColor:function(t){return t.app.color||"#1890ff"}})),{},{isDarkTheme:function(){return"dark"===this.navTheme||"realdark"===this.navTheme},isZhLocale:function(){return"zh-CN"===this.$i18n.locale},currentHeatmap:function(){return this.marketData.heatmap[this.heatmapType]||[]},storeUserInfo:function(){return this.userInfo||{}},mergedUserInfo:function(){return this.localUserInfo&&this.localUserInfo.email?this.localUserInfo:this.storeUserInfo}}),created:function(){this.loadUserInfo(),this.loadMarketTypes(),this.loadWatchlist(),this.loadMarketData()},mounted:function(){this.startWatchlistPriceRefresh()},beforeDestroy:function(){this.watchlistPriceTimer&&clearInterval(this.watchlistPriceTimer)},methods:{filterSymbolOption:function(t,s){var a,e=(null===(a=s.componentOptions)||void 0===a||null===(a=a.propsData)||void 0===a?void 0:a.value)||"";return"__add_stock_option__"===e||e.toLowerCase().includes(t.toLowerCase())},handleSymbolChange:function(t){var s=this;if("__add_stock_option__"===t)return this.showAddStockModal=!0,void this.$nextTick(function(){s.selectedSymbol=void 0});this.selectedSymbol=t,this.analysisResult=null,this.analysisError=null,this.analysisErrorTone="error",this.$emit("symbol-change",t)},selectWatchlistItem:function(t){this.selectedSymbol="".concat(t.market,":").concat(t.symbol),this.analysisResult=null,this.analysisError=null,this.analysisErrorTone="error",this.$emit("symbol-change",this.selectedSymbol)},loadMarketData:function(){var t=this;return(0,o.A)((0,l.A)().m(function s(){return(0,l.A)().w(function(s){while(1)switch(s.n){case 0:t.loadingMarket=!0,t.loadSentimentData(),t.loadIndicesData(),t.loadHeatmapData(),t.loadCalendarData();case 1:return s.a(2)}},s)}))()},loadSentimentData:function(){var t=this;return(0,o.A)((0,l.A)().m(function s(){var a,e,i,r;return(0,l.A)().w(function(s){while(1)switch(s.p=s.n){case 0:return t.loadingSentiment=!0,s.p=1,s.n=2,(0,b.EF)();case 2:a=s.v,1===(null===a||void 0===a?void 0:a.code)&&null!==a&&void 0!==a&&a.data&&(t.marketData.fearGreed=(null===(e=a.data.fear_greed)||void 0===e?void 0:e.value)||null,t.marketData.vix=(null===(i=a.data.vix)||void 0===i?void 0:i.value)||null,t.marketData.dxy=(null===(r=a.data.dxy)||void 0===r?void 0:r.value)||null),s.n=4;break;case 3:s.p=3,s.v;case 4:return s.p=4,t.loadingSentiment=!1,t.checkAllLoaded(),s.f(4);case 5:return s.a(2)}},s,null,[[1,3,4,5]])}))()},loadIndicesData:function(){var t=this;return(0,o.A)((0,l.A)().m(function s(){var a;return(0,l.A)().w(function(s){while(1)switch(s.p=s.n){case 0:return t.loadingIndices=!0,s.p=1,s.n=2,(0,b.yI)();case 2:a=s.v,1===(null===a||void 0===a?void 0:a.code)&&null!==a&&void 0!==a&&a.data&&(t.marketData.indices=a.data.indices||[]),s.n=4;break;case 3:s.p=3,s.v;case 4:return s.p=4,t.loadingIndices=!1,t.checkAllLoaded(),s.f(4);case 5:return s.a(2)}},s,null,[[1,3,4,5]])}))()},loadHeatmapData:function(){var t=this;return(0,o.A)((0,l.A)().m(function s(){var a;return(0,l.A)().w(function(s){while(1)switch(s.p=s.n){case 0:return t.loadingHeatmap=!0,s.p=1,s.n=2,(0,b.f$)();case 2:a=s.v,1===(null===a||void 0===a?void 0:a.code)&&null!==a&&void 0!==a&&a.data&&(t.marketData.heatmap={crypto:a.data.crypto||[],commodities:a.data.commodities||[],sectors:a.data.sectors||[],forex:a.data.forex||[]}),s.n=4;break;case 3:s.p=3,s.v;case 4:return s.p=4,t.loadingHeatmap=!1,t.checkAllLoaded(),s.f(4);case 5:return s.a(2)}},s,null,[[1,3,4,5]])}))()},loadCalendarData:function(){var t=this;return(0,o.A)((0,l.A)().m(function s(){var a;return(0,l.A)().w(function(s){while(1)switch(s.p=s.n){case 0:return t.loadingCalendar=!0,s.p=1,s.n=2,(0,b.kF)();case 2:a=s.v,1===(null===a||void 0===a?void 0:a.code)&&(t.marketData.calendar=a.data||[]),s.n=4;break;case 3:s.p=3,s.v;case 4:return s.p=4,t.loadingCalendar=!1,t.checkAllLoaded(),s.f(4);case 5:return s.a(2)}},s,null,[[1,3,4,5]])}))()},checkAllLoaded:function(){this.loadingSentiment||this.loadingIndices||this.loadingHeatmap||this.loadingCalendar||(this.loadingMarket=!1)},getFearGreedClass:function(t){return t?t<=25?"extreme-fear":t<=45?"fear":t<=55?"neutral":t<=75?"greed":"extreme-greed":""},getVixLevel:function(t){return t?t<15?"low":t<25?"medium":"high":""},formatNum:function(t){var s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:2;return void 0===t||null===t||isNaN(t)?"--":Number(t).toFixed(s)},getHeatmapStyle:function(t){var s=parseFloat(t)||0,a=Math.min(Math.abs(s)/5,1);return s>=0?{background:"rgba(34, 197, 94, ".concat(.15+.6*a,")"),color:s>2?"#fff":"#166534"}:{background:"rgba(239, 68, 68, ".concat(.15+.6*a,")"),color:s<-2?"#fff":"#991b1b"}},getCountryFlag:function(t){var s={US:"🇺🇸",CN:"🇨🇳",EU:"🇪🇺",JP:"🇯🇵",UK:"🇬🇧",DE:"🇩🇪",AU:"🇦🇺",CA:"🇨🇦"};return s[t]||"🌍"},formatCalendarDate:function(t){if(!t)return"";try{var s=new Date(t),a=new Date,e=new Date(a);if(e.setDate(e.getDate()+1),s.toDateString()===a.toDateString())return this.isZhLocale?"今天":"Today";if(s.toDateString()===e.toDateString())return this.isZhLocale?"明天":"Tmrw";var i=s.getMonth()+1,r=s.getDate();return"".concat(i,"/").concat(r)}catch(n){return t}},formatPrice:function(t){return t?t>=1e4?(t/1e3).toFixed(1)+"K":t>=1e3?t.toFixed(0):t.toFixed(2):"--"},formatHeatmapPrice:function(t){return t?t>=1e4?"$"+(t/1e3).toFixed(1)+"K":t>=1e3?"$"+t.toFixed(0):t>=1?"$"+t.toFixed(2):"$"+t.toFixed(4):""},getHeatmapName:function(t){return"sectors"===this.heatmapType||"commodities"===this.heatmapType||"forex"===this.heatmapType?this.isZhLocale?t.name_cn||t.name:t.name_en||t.name:t.name},getImpactClass:function(t){return t.actual_impact||t.expected_impact||"neutral"},getMarketColor:function(t){var s={USStock:"green",Crypto:"purple",Forex:"gold",Futures:"cyan"};return s[t]||"default"},getCurrencySymbol:function(t){return"$"},formatCreditNum:function(t){if(void 0===t||null===t||""===t)return"--";var s=Number(t);return Number.isNaN(s)?String(t):Number.isInteger(s)?String(s):s.toFixed(2)},refreshUserInfoFromServer:function(){var t=this;return(0,o.A)((0,l.A)().m(function s(){var a;return(0,l.A)().w(function(s){while(1)switch(s.p=s.n){case 0:return s.p=0,s.n=1,(0,u.ug)();case 1:a=s.v,a&&1===a.code&&a.data&&(t.localUserInfo=a.data,t.userId=a.data.id,t.$store.commit("SET_INFO",a.data)),s.n=3;break;case 2:s.p=2,s.v;case 3:return s.a(2)}},s,null,[[0,2]])}))()},startFastAnalysis:function(){var t=this;return(0,o.A)((0,l.A)().m(function s(){var a,e,i,r,o,d,u,m,h,y,v,f,g,b,_;return(0,l.A)().w(function(s){while(1)switch(s.p=s.n){case 0:if(!t.analyzing){s.n=1;break}return s.a(2);case 1:if(t.selectedSymbol){s.n=2;break}return t.$message.warning(t.$t("dashboard.analysis.message.selectSymbol")),s.a(2);case 2:return t.analyzing=!0,t.analysisError=null,t.analysisErrorTone="error",a=t.selectedSymbol.split(":"),e=(0,n.A)(a,2),i=e[0],r=e[1],o=t.$store.getters.lang||"zh-CN",s.p=3,s.n=4,p({market:i,symbol:r,language:o,timeframe:"1D"});case 4:if(d=s.v,!d||1!==d.code||!d.data){s.n=6;break}return u=(0,c.A)({},d.data),delete u.credits_charged,delete u.remaining_credits,t.analysisResult=u,m=d.data.remaining_credits,void 0!==m&&null!==m?t.$message.success(t.$t("fastAnalysis.analysisCompleteWithCredits",{remaining:t.formatCreditNum(m)})):t.$message.success(t.$t("dashboard.analysis.message.analysisComplete")),s.n=5,t.refreshUserInfoFromServer();case 5:s.n=7;break;case 6:throw new Error((null===d||void 0===d?void 0:d.msg)||"分析失败");case 7:s.n=9;break;case 8:s.p=8,_=s.v,v=null===_||void 0===_||null===(h=_.response)||void 0===h?void 0:h.status,f=(null===_||void 0===_||null===(y=_.response)||void 0===y?void 0:y.data)||{},g=f.msg,b=f.data,429===v&&b&&b.in_progress?(t.analysisErrorTone="warning",t.analysisError=t.$t("fastAnalysis.analysisInProgress"),t.$message.warning(t.analysisError)):400===v&&"Insufficient credits"===g?(t.analysisError=t.$t("fastAnalysis.insufficientCreditsDetail",{required:t.formatCreditNum(null===b||void 0===b?void 0:b.required),current:t.formatCreditNum(null===b||void 0===b?void 0:b.current),shortage:t.formatCreditNum(null===b||void 0===b?void 0:b.shortage)}),t.$message.error(t.analysisError)):(t.analysisError=g||(null===_||void 0===_?void 0:_.message)||t.$t("dashboard.analysis.message.analysisFailed"),t.$message.error(t.analysisError));case 9:return s.p=9,t.analyzing=!1,s.f(9);case 10:return s.a(2)}},s,null,[[3,8,9,10]])}))()},loadHistoryList:function(){var t=this;return(0,o.A)((0,l.A)().m(function s(){var a;return(0,l.A)().w(function(s){while(1)switch(s.p=s.n){case 0:return t.historyLoading=!0,s.p=1,s.n=2,v({page:t.historyPage,pagesize:t.historyPageSize});case 2:a=s.v,a&&1===a.code&&a.data&&(t.historyList=a.data.list||[],t.historyTotal=a.data.total||0),s.n=4;break;case 3:s.p=3,s.v,t.$message.error(t.$t("dashboard.analysis.message.loadHistoryFailed")||"加载历史记录失败");case 4:return s.p=4,t.historyLoading=!1,s.f(4);case 5:return s.a(2)}},s,null,[[1,3,4,5]])}))()},viewHistoryResult:function(t){var s=this;return(0,o.A)((0,l.A)().m(function a(){return(0,l.A)().w(function(a){while(1)switch(a.n){case 0:if(!t.full_result){a.n=1;break}return s.analysisResult=t.full_result,s.selectedSymbol="".concat(t.market,":").concat(t.symbol),s.showHistoryModal=!1,a.a(2);case 1:s.analysisResult={decision:t.decision,confidence:t.confidence,summary:t.summary,market_data:{current_price:t.price,change_24h:0},trading_plan:{entry_price:t.price,stop_loss:.95*t.price,take_profit:1.05*t.price},scores:t.scores||{},reasons:t.reasons||[],risks:[],indicators:t.indicators||{},memory_id:t.id,analysis_time_ms:0},s.selectedSymbol="".concat(t.market,":").concat(t.symbol),s.showHistoryModal=!1;case 2:return a.a(2)}},a)}))()},deleteHistoryItem:function(t){var s=this;return(0,o.A)((0,l.A)().m(function a(){var e;return(0,l.A)().w(function(a){while(1)switch(a.p=a.n){case 0:return a.p=0,a.n=1,f(t.id);case 1:e=a.v,e&&1===e.code?(s.$message.success(s.$t("dashboard.analysis.message.deleteSuccess")),s.loadHistoryList()):s.$message.error((null===e||void 0===e?void 0:e.msg)||s.$t("dashboard.analysis.message.deleteFailed")),a.n=3;break;case 2:a.p=2,a.v,s.$message.error(s.$t("dashboard.analysis.message.deleteFailed"));case 3:return a.a(2)}},a,null,[[0,2]])}))()},formatTime:function(t){if(!t)return"-";var s=new Date(1e3*t);return s.toLocaleString("zh-CN")},formatIsoTime:function(t){if(!t)return"-";var s=new Date(t);return s.toLocaleString("zh-CN")},getStatusColor:function(t){var s={pending:"orange",processing:"blue",completed:"green",failed:"red"};return s[t]||"default"},getStatusText:function(t){var s={pending:"dashboard.analysis.status.pending",processing:"dashboard.analysis.status.processing",completed:"dashboard.analysis.status.completed",failed:"dashboard.analysis.status.failed"},a=s[t];return a?this.$t(a):t},loadUserInfo:function(){var t=this;return(0,o.A)((0,l.A)().m(function s(){var a;return(0,l.A)().w(function(s){while(1)switch(s.p=s.n){case 0:if(t.loadingUserInfo=!0,s.p=1,!t.storeUserInfo||!t.storeUserInfo.email){s.n=2;break}return t.localUserInfo=t.storeUserInfo,t.userId=t.storeUserInfo.id,t.loadingUserInfo=!1,t.loadWatchlist(),s.a(2);case 2:return s.n=3,(0,u.ug)();case 3:a=s.v,a&&1===a.code&&a.data&&(t.localUserInfo=a.data,t.userId=a.data.id,t.$store.commit("SET_INFO",a.data),t.loadWatchlist()),s.n=5;break;case 4:s.p=4,s.v;case 5:return s.p=5,t.loadingUserInfo=!1,s.f(5);case 6:return s.a(2)}},s,null,[[1,4,5,6]])}))()},loadWatchlist:function(){var t=this;return(0,o.A)((0,l.A)().m(function s(){var a;return(0,l.A)().w(function(s){while(1)switch(s.p=s.n){case 0:if(t.userId){s.n=1;break}return s.a(2);case 1:return t.loadingWatchlist=!0,s.p=2,s.n=3,(0,m.Qo)({userid:t.userId});case 3:if(a=s.v,!a||1!==a.code||!a.data){s.n=4;break}return t.watchlist=a.data.map(function(t){return(0,c.A)((0,c.A)({},t),{},{price:0,change:0,changePercent:0})}),s.n=4,t.loadWatchlistPrices();case 4:s.n=6;break;case 5:s.p=5,s.v;case 6:return s.p=6,t.loadingWatchlist=!1,s.f(6);case 7:return s.a(2)}},s,null,[[2,5,6,7]])}))()},loadWatchlistPrices:function(){var t=this;return(0,o.A)((0,l.A)().m(function s(){var a,e,i,r;return(0,l.A)().w(function(s){while(1)switch(s.p=s.n){case 0:if(t.watchlist&&0!==t.watchlist.length){s.n=1;break}return s.a(2);case 1:return s.p=1,a=t.watchlist.map(function(t){return{market:t.market,symbol:t.symbol}}),s.n=2,(0,m.ms)({watchlist:a});case 2:e=s.v,e&&1===e.code&&e.data&&(i={},r={},e.data.forEach(function(t){i["".concat(t.market,"-").concat(t.symbol)]=t,r["".concat(t.market,":").concat(t.symbol)]={price:t.price||0,change:t.changePercent||0}}),t.watchlistPrices=r,t.watchlist=t.watchlist.map(function(t){var s="".concat(t.market,"-").concat(t.symbol),a=i[s];return a?(0,c.A)((0,c.A)({},t),{},{price:a.price||0,change:a.change||0,changePercent:a.changePercent||0}):t})),s.n=4;break;case 3:s.p=3,s.v;case 4:return s.a(2)}},s,null,[[1,3]])}))()},startWatchlistPriceRefresh:function(){var t=this;this.watchlistPriceTimer=setInterval(function(){t.watchlist&&t.watchlist.length>0&&t.loadWatchlistPrices()},3e4),this.watchlist&&this.watchlist.length>0&&this.loadWatchlistPrices()},handleAddStock:function(){var t=this;return(0,o.A)((0,l.A)().m(function s(){var a,e,i,r,n,o,c;return(0,l.A)().w(function(s){while(1)switch(s.p=s.n){case 0:if(a="",e="",i="",!t.selectedSymbolForAdd){s.n=1;break}a=t.selectedSymbolForAdd.market,e=t.selectedSymbolForAdd.symbol.toUpperCase(),i=t.selectedSymbolForAdd.name||"",s.n=4;break;case 1:if(!t.symbolSearchKeyword||!t.symbolSearchKeyword.trim()){s.n=3;break}if(t.selectedMarketTab){s.n=2;break}return t.$message.warning(t.$t("dashboard.analysis.modal.addStock.pleaseSelectMarket")),s.a(2);case 2:a=t.selectedMarketTab,e=t.symbolSearchKeyword.trim().toUpperCase(),i="",s.n=4;break;case 3:return t.$message.warning(t.$t("dashboard.analysis.modal.addStock.pleaseSelectOrEnterSymbol")),s.a(2);case 4:return t.addingStock=!0,s.p=5,s.n=6,(0,m.dp)({userid:t.userId,market:a,symbol:e,name:i});case 6:if(r=s.v,!r||1!==r.code){s.n=8;break}return t.$message.success(t.$t("dashboard.analysis.message.addStockSuccess")),t.handleCloseAddStockModal(),s.n=7,t.loadWatchlist();case 7:s.n=9;break;case 8:t.$message.error((null===r||void 0===r?void 0:r.msg)||t.$t("dashboard.analysis.message.addStockFailed"));case 9:s.n=11;break;case 10:s.p=10,c=s.v,o=(null===c||void 0===c||null===(n=c.response)||void 0===n||null===(n=n.data)||void 0===n?void 0:n.msg)||(null===c||void 0===c?void 0:c.message)||t.$t("dashboard.analysis.message.addStockFailed"),t.$message.error(o);case 11:return s.p=11,t.addingStock=!1,s.f(11);case 12:return s.a(2)}},s,null,[[5,10,11,12]])}))()},handleCloseAddStockModal:function(){this.showAddStockModal=!1,this.selectedSymbolForAdd=null,this.symbolSearchKeyword="",this.symbolSearchResults=[],this.hasSearched=!1,this.selectedMarketTab=this.marketTypes.length>0?this.marketTypes[0].value:""},handleMarketTabChange:function(t){this.selectedMarketTab=t,this.symbolSearchKeyword="",this.symbolSearchResults=[],this.selectedSymbolForAdd=null,this.hasSearched=!1,this.loadHotSymbols(t)},handleSymbolSearchInput:function(t){var s=this,a=t.target.value;if(this.symbolSearchKeyword=a,this.searchTimer&&clearTimeout(this.searchTimer),!a||""===a.trim())return this.symbolSearchResults=[],this.hasSearched=!1,void(this.selectedSymbolForAdd=null);this.searchTimer=setTimeout(function(){s.searchSymbolsInModal(a)},500)},handleSearchOrInput:function(t){t&&t.trim()&&(this.selectedMarketTab?this.symbolSearchResults.length>0||(this.hasSearched&&0===this.symbolSearchResults.length?this.handleDirectAdd():this.searchSymbolsInModal(t)):this.$message.warning(this.$t("dashboard.analysis.modal.addStock.pleaseSelectMarket")))},searchSymbolsInModal:function(t){var s=this;return(0,o.A)((0,l.A)().m(function a(){var e;return(0,l.A)().w(function(a){while(1)switch(a.p=a.n){case 0:if(t&&""!==t.trim()){a.n=1;break}return s.symbolSearchResults=[],s.hasSearched=!1,a.a(2);case 1:if(s.selectedMarketTab){a.n=2;break}return s.$message.warning(s.$t("dashboard.analysis.modal.addStock.pleaseSelectMarket")),a.a(2);case 2:return s.searchingSymbols=!0,s.hasSearched=!0,a.p=3,a.n=4,(0,m._3)({market:s.selectedMarketTab,keyword:t.trim(),limit:20});case 4:e=a.v,e&&1===e.code&&e.data&&e.data.length>0?s.symbolSearchResults=e.data:(s.symbolSearchResults=[],s.selectedSymbolForAdd={market:s.selectedMarketTab,symbol:t.trim().toUpperCase(),name:""}),a.n=6;break;case 5:a.p=5,a.v,s.symbolSearchResults=[],s.selectedSymbolForAdd={market:s.selectedMarketTab,symbol:t.trim().toUpperCase(),name:""};case 6:return a.p=6,s.searchingSymbols=!1,a.f(6);case 7:return a.a(2)}},a,null,[[3,5,6,7]])}))()},handleDirectAdd:function(){this.symbolSearchKeyword&&this.symbolSearchKeyword.trim()?this.selectedMarketTab?this.selectedSymbolForAdd={market:this.selectedMarketTab,symbol:this.symbolSearchKeyword.trim().toUpperCase(),name:""}:this.$message.warning(this.$t("dashboard.analysis.modal.addStock.pleaseSelectMarket")):this.$message.warning(this.$t("dashboard.analysis.modal.addStock.pleaseEnterSymbol"))},selectSymbol:function(t){this.selectedSymbolForAdd={market:t.market,symbol:t.symbol,name:t.name||t.symbol}},loadHotSymbols:function(t){var s=this;return(0,o.A)((0,l.A)().m(function a(){var e;return(0,l.A)().w(function(a){while(1)switch(a.p=a.n){case 0:if(t||(t=s.selectedMarketTab||(s.marketTypes.length>0?s.marketTypes[0].value:"")),t){a.n=1;break}return a.a(2);case 1:return s.loadingHotSymbols=!0,a.p=2,a.n=3,(0,m.z6)({market:t,limit:10});case 3:e=a.v,e&&1===e.code&&e.data?s.hotSymbols=e.data:s.hotSymbols=[],a.n=5;break;case 4:a.p=4,a.v,s.hotSymbols=[];case 5:return a.p=5,s.loadingHotSymbols=!1,a.f(5);case 6:return a.a(2)}},a,null,[[2,4,5,6]])}))()},removeFromWatchlist:function(t){var s=arguments,a=this;return(0,o.A)((0,l.A)().m(function e(){var i,n,o;return(0,l.A)().w(function(e){while(1)switch(e.p=e.n){case 0:if(a.userId){e.n=1;break}return e.a(2);case 1:return i="object"===(0,r.A)(t)?t.symbol:t,n="object"===(0,r.A)(t)?t.market:s[1],e.p=2,e.n=3,(0,m.mk)({userid:a.userId,symbol:i,market:n});case 3:if(o=e.v,!o||1!==o.code){e.n=5;break}return a.$message.success(a.$t("dashboard.analysis.message.removeStockSuccess")),e.n=4,a.loadWatchlist();case 4:e.n=6;break;case 5:a.$message.error((null===o||void 0===o?void 0:o.msg)||a.$t("dashboard.analysis.message.removeStockFailed"));case 6:e.n=8;break;case 7:e.p=7,e.v,a.$message.error(a.$t("dashboard.analysis.message.removeStockFailed"));case 8:return e.a(2)}},e,null,[[2,7]])}))()},getMarketName:function(t){return this.$t("dashboard.analysis.market.".concat(t))||t},formatNumber:function(t){return"string"===typeof t?t:t.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})},loadMarketTypes:function(){var t=this;return(0,o.A)((0,l.A)().m(function s(){var a;return(0,l.A)().w(function(s){while(1)switch(s.p=s.n){case 0:return s.p=0,s.n=1,(0,m.iO)();case 1:a=s.v,a&&1===a.code&&a.data&&Array.isArray(a.data)?t.marketTypes=a.data.map(function(t){return{value:t.value,i18nKey:t.i18nKey||"dashboard.analysis.market.".concat(t.value)}}):t.marketTypes=[{value:"USStock",i18nKey:"dashboard.analysis.market.USStock"},{value:"Crypto",i18nKey:"dashboard.analysis.market.Crypto"},{value:"Forex",i18nKey:"dashboard.analysis.market.Forex"},{value:"Futures",i18nKey:"dashboard.analysis.market.Futures"}],s.n=3;break;case 2:s.p=2,s.v,t.marketTypes=[{value:"USStock",i18nKey:"dashboard.analysis.market.USStock"},{value:"Crypto",i18nKey:"dashboard.analysis.market.Crypto"},{value:"Forex",i18nKey:"dashboard.analysis.market.Forex"},{value:"Futures",i18nKey:"dashboard.analysis.market.Futures"}];case 3:t.marketTypes.length>0&&!t.selectedMarketTab&&(t.selectedMarketTab=t.marketTypes[0].value);case 4:return s.a(2)}},s,null,[[0,2]])}))()}},watch:{presetSymbol:function(t){t&&t!==this.selectedSymbol&&(this.selectedSymbol=t,this.analysisResult=null,this.analysisError=null,this.analysisErrorTone="error")},autoAnalyzeSignal:function(t){var s=this;t&&(this.presetSymbol&&this.presetSymbol!==this.selectedSymbol&&(this.selectedSymbol=this.presetSymbol),this.$nextTick(function(){s.startFastAnalysis()}))},showAddStockModal:function(t){t?(this.marketTypes.length>0&&!this.selectedMarketTab&&(this.selectedMarketTab=this.marketTypes[0].value),this.selectedMarketTab&&this.loadHotSymbols(this.selectedMarketTab)):(this.selectedSymbolForAdd=null,this.symbolSearchKeyword="",this.symbolSearchResults=[],this.hasSearched=!1,this.searchTimer&&(clearTimeout(this.searchTimer),this.searchTimer=null))}}},x=T,F=(0,A.A)(x,e,i,!1,null,"41eda137",null),M=F.exports},62618:function(t,s,a){a.d(s,{EF:function(){return o},f$:function(){return n},kF:function(){return l},r9:function(){return c},yI:function(){return r}});var e=a(76471),i="/api/global-market";function r(){return(0,e.Ay)({url:"".concat(i,"/overview"),method:"get"})}function n(){return(0,e.Ay)({url:"".concat(i,"/heatmap"),method:"get"})}function l(){return(0,e.Ay)({url:"".concat(i,"/calendar"),method:"get"})}function o(){return(0,e.Ay)({url:"".concat(i,"/sentiment"),method:"get"})}function c(t){return(0,e.Ay)({url:"".concat(i,"/opportunities"),method:"get",params:t})}},64118:function(t,s,a){a.d(s,{Qo:function(){return r},_3:function(){return d},dp:function(){return n},iO:function(){return c},mk:function(){return l},ms:function(){return o},z6:function(){return u}});var e=a(76471),i={GetWatchlist:"/api/market/watchlist/get",AddWatchlist:"/api/market/watchlist/add",RemoveWatchlist:"/api/market/watchlist/remove",GetWatchlistPrices:"/api/market/watchlist/prices",MultiAnalysis:"/api/analysis/multiAnalysis",CreateAnalysisTask:"/api/analysis/createTask",GetAnalysisTaskStatus:"/api/analysis/getTaskStatus",GetAnalysisHistoryList:"/api/analysis/getHistoryList",DeleteAnalysisTask:"/api/analysis/deleteTask",ReflectAnalysis:"/api/analysis/reflect",ChatMessage:"/api/ai/chat/message",GetChatHistory:"/api/ai/chat/history",SaveChatHistory:"/api/ai/chat/history/save",GetConfig:"/api/market/config",GetMenuFooterConfig:"/api/market/menuFooterConfig",GetMarketTypes:"/api/market/types",SearchSymbols:"/api/market/symbols/search",GetHotSymbols:"/api/market/symbols/hot"};function r(t){return(0,e.Ay)({url:i.GetWatchlist,method:"get",params:t})}function n(t){return(0,e.Ay)({url:i.AddWatchlist,method:"post",data:t})}function l(t){return(0,e.Ay)({url:i.RemoveWatchlist,method:"post",data:t})}function o(t){return(0,e.Ay)({url:i.GetWatchlistPrices,method:"get",params:{watchlist:JSON.stringify(t.watchlist||[])}})}function c(){return(0,e.Ay)({url:i.GetMarketTypes,method:"get"})}function d(t){return(0,e.Ay)({url:i.SearchSymbols,method:"get",params:t})}function u(t){return(0,e.Ay)({url:i.GetHotSymbols,method:"get",params:t})}}}]); \ No newline at end of file diff --git a/frontend/dist/js/59.542d1c7f.js b/frontend/dist/js/59.538b1612.js similarity index 99% rename from frontend/dist/js/59.542d1c7f.js rename to frontend/dist/js/59.538b1612.js index 5434257..e397cea 100644 --- a/frontend/dist/js/59.542d1c7f.js +++ b/frontend/dist/js/59.538b1612.js @@ -1 +1 @@ -"use strict";(self["webpackChunkvue_antd_pro"]=self["webpackChunkvue_antd_pro"]||[]).push([[59],{50992:function(t,a,e){e.r(a),e.d(a,{default:function(){return x}});var s=function(){var t=this,a=t._self._c;return a("div",{staticClass:"ai-asset-analysis-page",class:{"theme-dark":t.isDarkTheme}},[t.opportunities.length>0?a("div",{staticClass:"opp-section"},[a("div",{staticClass:"opp-header"},[a("span",{staticClass:"opp-title"},[a("a-icon",{attrs:{type:"radar-chart"}}),t._v(" "+t._s(t.$t("aiAssetAnalysis.opportunities.title")))],1),a("span",{staticClass:"opp-header-right"},[a("span",{staticClass:"opp-update-hint"},[a("a-icon",{attrs:{type:"clock-circle"}}),t._v(" "+t._s(t.$t("aiAssetAnalysis.opportunities.updateHint"))+" ")],1),a("a-button",{attrs:{type:"link",size:"small",icon:"reload",loading:t.oppLoading},on:{click:function(a){return t.loadOpportunities(!0)}}},[t._v(" "+t._s(t.$t("common.refresh")||"刷新")+" ")])],1)]),a("div",{staticClass:"opp-carousel-wrapper",on:{mouseenter:function(a){t.oppHover=!0},mouseleave:function(a){t.oppHover=!1}}},[a("div",{staticClass:"opp-track",class:{paused:t.oppHover},style:t.oppTrackStyle},t._l(t.carouselItems,function(e,s){return a("div",{key:"opp-"+s,staticClass:"opp-card",class:[e.impact,"market-"+(e.market||"").toLowerCase(),{"is-prediction-market":"PredictionMarket"===e.market}],on:{click:function(a){return t.analyzeOpportunity(e)}}},[a("div",{staticClass:"opp-top"},[a("span",{staticClass:"opp-symbol",class:{"prediction-title":"PredictionMarket"===e.market}},[t._v(" "+t._s("PredictionMarket"===e.market&&e.name||e.symbol)+" ")]),a("a-tag",{staticClass:"opp-market-tag",attrs:{color:t.getMarketTagColor(e.market),size:"small"}},[t._v(" "+t._s(t.getMarketLabel(e.market))+" ")])],1),"PredictionMarket"!==e.market?a("div",{staticClass:"opp-price"},[t._v("$"+t._s(t.formatOppPrice(e.price)))]):a("div",{staticClass:"opp-price"},[t._v(t._s((e.price||0).toFixed(1))+"%")]),"PredictionMarket"!==e.market?a("div",{staticClass:"opp-change",class:e.change_24h>=0?"up":"down"},[t._v(" "+t._s(e.change_24h>=0?"+":"")+t._s((e.change_24h||0).toFixed(1))+"% ")]):e.ai_analysis?a("div",{staticClass:"opp-change"},[a("a-tag",{attrs:{color:t.getRecommendationColor(e.ai_analysis.recommendation),size:"small"}},[t._v(" "+t._s(t.getRecommendationLabel(e.ai_analysis.recommendation))+" ")]),a("span",{staticStyle:{"margin-left":"8px","font-size":"12px",color:"rgba(0,0,0,0.65)"}},[t._v(" 机会评分: "+t._s(e.ai_analysis.opportunity_score.toFixed(0))+" ")])],1):t._e(),"PredictionMarket"!==e.market?a("div",{staticClass:"opp-signal"},[a("a-tag",{attrs:{color:t.getSignalColor(e.signal),size:"small"}},[t._v(t._s(t.getSignalLabel(e.signal)))])],1):t._e(),a("div",{staticClass:"opp-reason"},[t._v(t._s(t.getReasonText(e)))]),a("div",{staticClass:"opp-actions"},["PredictionMarket"!==e.market?a("span",{staticClass:"opp-action",on:{click:function(a){return a.stopPropagation(),t.analyzeOpportunity(e)}}},[a("a-icon",{attrs:{type:"thunderbolt"}}),t._v(" "+t._s(t.$t("aiAssetAnalysis.opportunities.analyze"))+" ")],1):a("span",{staticClass:"opp-action",on:{click:function(a){return a.stopPropagation(),t.analyzeOpportunity(e)}}},[a("a-icon",{attrs:{type:"link"}}),t._v(" "+t._s(t.$t("polymarket.action.viewDetail"))+" ")],1),"Crypto"===e.market?a("span",{staticClass:"opp-trade-btn",on:{click:function(a){return a.stopPropagation(),t.openQuickTradeFromOpp(e)}}},[a("a-icon",{attrs:{type:"transaction"}}),t._v(" "+t._s(t.$t("quickTrade.tradeNow"))+" ")],1):t._e()])])}),0)])]):t._e(),a("a-tooltip",{attrs:{title:t.$t("quickTrade.openPanel"),placement:"left"}},[!t.showQuickTrade&&t.currentAnalysisSymbol?a("div",{staticClass:"qt-floating-btn",on:{click:t.openQuickTradeFromCurrent}},[a("a-icon",{attrs:{type:"thunderbolt",theme:"filled"}})],1):t._e()]),a("quick-trade-panel",{attrs:{visible:t.showQuickTrade,symbol:t.qtSymbol,"preset-side":t.qtSide,"preset-price":t.qtPrice,source:t.qtSource,"market-type":"swap"},on:{close:function(a){t.showQuickTrade=!1},"order-success":t.onQuickTradeSuccess,"update:symbol":t.handleQuickTradeSymbolChange}}),a("a-card",{staticClass:"workspace-card",attrs:{bordered:!1}},[a("a-tabs",{staticClass:"workspace-tabs",attrs:{size:"large"},model:{value:t.activeTab,callback:function(a){t.activeTab=a},expression:"activeTab"}},[a("a-tab-pane",{key:"quick"},[a("span",{attrs:{slot:"tab"},slot:"tab"},[a("a-icon",{attrs:{type:"thunderbolt"}}),t._v(" "+t._s(t.$t("aiAssetAnalysis.tabs.quick"))+" ")],1),a("div",{staticClass:"tab-body"},["quick"===t.activeTab?a("AnalysisView",{attrs:{embedded:!0,"preset-symbol":t.presetSymbol,"auto-analyze-signal":t.autoAnalyzeSignal},on:{"symbol-change":t.onAnalysisSymbolChange}}):t._e()],1)]),a("a-tab-pane",{key:"monitor"},[a("span",{attrs:{slot:"tab"},slot:"tab"},[a("a-icon",{attrs:{type:"eye"}}),t._v(" "+t._s(t.$t("aiAssetAnalysis.tabs.monitor"))+" ")],1),a("div",{staticClass:"tab-body"},["monitor"===t.activeTab?a("PortfolioView",{attrs:{embedded:!0}}):t._e()],1)]),a("a-tab-pane",{key:"polymarket"},[a("span",{attrs:{slot:"tab"},slot:"tab"},[a("a-icon",{attrs:{type:"radar-chart"}}),t._v(" "+t._s(t.$t("aiAssetAnalysis.tabs.polymarket"))+" ")],1),a("div",{staticClass:"tab-body"},[a("div",{staticClass:"polymarket-tab-content"},[a("div",{staticClass:"polymarket-placeholder"},[a("div",{staticClass:"placeholder-icon"},[a("a-icon",{attrs:{type:"radar-chart"}})],1),a("h3",[t._v(t._s(t.$t("polymarket.analysis.title")))]),a("p",[t._v(t._s(t.$t("polymarket.analysis.description")))]),a("a-button",{staticStyle:{"margin-top":"16px"},attrs:{type:"primary",size:"large",icon:"thunderbolt"},on:{click:function(a){t.showPolymarketModal=!0}}},[t._v(" "+t._s(t.$t("polymarket.analysis.startAnalysis"))+" ")])],1)])])])],1)],1),a("PolymarketAnalysisModal",{attrs:{visible:t.showPolymarketModal},on:{close:function(a){t.showPolymarketModal=!1}}})],1)},i=[],n=e(76959),o=e(17654),r=e(9133),l=e(57888),c=(e(74423),e(95353)),p=e(47785),u=e(4103),y=e(62618),d=e(38250),m=function(){var t=this,a=t._self._c;return a("a-modal",{attrs:{visible:t.visible,title:t.$t("polymarket.analysis.title"),width:900,footer:null,maskClosable:!1},on:{cancel:t.handleClose}},[a("div",{staticClass:"polymarket-analysis-modal"},[a("a-tabs",{attrs:{"default-active-key":"analyze"},on:{change:t.handleTabChange}},[a("a-tab-pane",{key:"analyze",attrs:{tab:t.$t("polymarket.analysis.tabAnalyze")}},[t.analysisResult?t._e():a("div",{staticClass:"input-section"},[a("a-alert",{staticStyle:{"margin-bottom":"16px"},attrs:{message:t.$t("polymarket.analysis.inputHint"),type:"info","show-icon":""}}),a("a-textarea",{attrs:{placeholder:t.$t("polymarket.analysis.inputPlaceholder"),rows:3,disabled:t.analyzing},on:{pressEnter:t.handleAnalyze},model:{value:t.inputText,callback:function(a){t.inputText=a},expression:"inputText"}}),a("div",{staticClass:"input-actions"},[a("a-button",{staticStyle:{width:"100%","margin-top":"12px"},attrs:{type:"primary",size:"large",icon:"thunderbolt",loading:t.analyzing,disabled:!t.inputText.trim()},on:{click:t.handleAnalyze}},[t._v(" "+t._s(t.$t("polymarket.analysis.analyzeButton"))+" ")])],1)],1),t.analysisResult?a("div",{staticClass:"result-section"},[a("div",{staticClass:"market-info"},[a("h3",[t._v(t._s(t.analysisResult.market.question))]),a("div",{staticClass:"market-meta"},[a("a-tag",{attrs:{color:t.getStatusColor(t.analysisResult.market.status)}},[t._v(" "+t._s(t.analysisResult.market.status)+" ")]),a("span",{staticClass:"meta-item"},[a("a-icon",{attrs:{type:"percentage"}}),t._v(" "+t._s(t.analysisResult.market.current_probability)+"% ")],1),t.analysisResult.market.volume_24h?a("span",{staticClass:"meta-item"},[a("a-icon",{attrs:{type:"dollar"}}),t._v(" "+t._s(t.formatVolume(t.analysisResult.market.volume_24h))+" ")],1):t._e(),t.analysisResult.market.polymarket_url?a("a-button",{attrs:{type:"link",size:"small",icon:"link",href:t.analysisResult.market.polymarket_url,target:"_blank"}},[t._v(" "+t._s(t.$t("polymarket.analysis.viewOnPolymarket"))+" ")]):t._e()],1)]),a("div",{staticClass:"analysis-result"},[a("a-divider",[t._v(t._s(t.$t("polymarket.analysis.aiAnalysis")))]),a("div",{staticClass:"probability-comparison"},[a("div",{staticClass:"prob-item"},[a("div",{staticClass:"prob-label"},[t._v(t._s(t.$t("polymarket.analysis.marketProbability")))]),a("div",{staticClass:"prob-value"},[t._v(t._s(t.analysisResult.analysis.market_probability)+"%")])]),a("div",{staticClass:"prob-item"},[a("div",{staticClass:"prob-label"},[t._v(t._s(t.$t("polymarket.analysis.aiPredictedProbability")))]),a("div",{staticClass:"prob-value ai-prob"},[t._v(t._s(t.analysisResult.analysis.ai_predicted_probability)+"%")])]),a("div",{staticClass:"prob-item"},[a("div",{staticClass:"prob-label"},[t._v(t._s(t.$t("polymarket.analysis.divergence")))]),a("div",{staticClass:"prob-value",class:t.getDivergenceClass(t.analysisResult.analysis.divergence)},[t._v(" "+t._s(t.analysisResult.analysis.divergence>=0?"+":"")+t._s(t.analysisResult.analysis.divergence.toFixed(2))+"% ")])])]),a("div",{staticClass:"recommendation-section"},[a("a-row",{attrs:{gutter:16}},[a("a-col",{attrs:{span:8}},[a("div",{staticClass:"rec-card"},[a("div",{staticClass:"rec-label"},[t._v(t._s(t.$t("polymarket.analysis.recommendation")))]),a("a-tag",{staticStyle:{"font-size":"16px",padding:"4px 12px"},attrs:{color:t.getRecommendationColor(t.analysisResult.analysis.recommendation)}},[t._v(" "+t._s(t.getRecommendationLabel(t.analysisResult.analysis.recommendation))+" ")])],1)]),a("a-col",{attrs:{span:8}},[a("div",{staticClass:"rec-card"},[a("div",{staticClass:"rec-label"},[t._v(t._s(t.$t("polymarket.analysis.confidenceScore")))]),a("div",{staticClass:"rec-value"},[t._v(t._s(t.analysisResult.analysis.confidence_score.toFixed(0)))])])]),a("a-col",{attrs:{span:8}},[a("div",{staticClass:"rec-card"},[a("div",{staticClass:"rec-label"},[t._v(t._s(t.$t("polymarket.analysis.opportunityScore")))]),a("div",{staticClass:"rec-value"},[t._v(t._s(t.analysisResult.analysis.opportunity_score.toFixed(0)))])])])],1)],1),t.analysisResult.analysis.reasoning?a("div",{staticClass:"reasoning-section"},[a("h4",[t._v(t._s(t.$t("polymarket.analysis.reasoning")))]),a("p",{staticClass:"reasoning-text"},[t._v(t._s(t.analysisResult.analysis.reasoning))])]):t._e(),t.analysisResult.analysis.key_factors&&t.analysisResult.analysis.key_factors.length>0?a("div",{staticClass:"key-factors-section"},[a("h4",[t._v(t._s(t.$t("polymarket.analysis.keyFactors")))]),t._l(t.analysisResult.analysis.key_factors,function(e,s){return a("a-tag",{key:s,staticStyle:{margin:"4px"},attrs:{color:"blue"}},[t._v(" "+t._s(e)+" ")])})],2):t._e(),t.analysisResult.credits_charged>0?a("div",{staticClass:"billing-info"},[a("a-alert",{staticStyle:{"margin-top":"16px"},attrs:{message:t.$t("polymarket.analysis.creditsCharged",{credits:t.analysisResult.credits_charged}),type:"success","show-icon":""}}),void 0!==t.analysisResult.remaining_credits?a("div",{staticStyle:{"margin-top":"8px","text-align":"right",color:"rgba(0,0,0,0.65)"}},[t._v(" "+t._s(t.$t("polymarket.analysis.remainingCredits",{credits:t.analysisResult.remaining_credits.toFixed(0)}))+" ")]):t._e()],1):t._e()],1),a("div",{staticClass:"result-actions"},[a("a-button",{staticStyle:{"margin-right":"8px"},on:{click:t.handleNewAnalysis}},[t._v(" "+t._s(t.$t("polymarket.analysis.newAnalysis"))+" ")]),a("a-button",{attrs:{type:"primary"},on:{click:t.handleClose}},[t._v(" "+t._s(t.$t("common.close"))+" ")])],1)]):t._e(),t.analyzing?a("div",{staticClass:"loading-section"},[a("a-spin",{attrs:{size:"large"}}),a("p",{staticStyle:{"margin-top":"16px",color:"rgba(0,0,0,0.65)"}},[t._v(" "+t._s(t.$t("polymarket.analysis.analyzing"))+" ")])],1):t._e()]),a("a-tab-pane",{key:"history",attrs:{tab:t.$t("polymarket.analysis.tabHistory")}},[a("div",{staticClass:"history-section"},[a("a-spin",{attrs:{spinning:t.historyLoading}},[a("a-table",{attrs:{columns:t.historyColumns,"data-source":t.historyList,pagination:t.historyPagination,"row-key":function(t){return t.id},size:"small"},on:{change:t.handleHistoryTableChange},scopedSlots:t._u([{key:"market_title",fn:function(e,s){return[a("a-button",{staticStyle:{padding:"0"},attrs:{type:"link"},on:{click:function(a){return t.viewHistoryItem(s)}}},[t._v(" "+t._s(e)+" ")])]}},{key:"recommendation",fn:function(e){return[a("a-tag",{attrs:{color:t.getRecommendationColor(e)}},[t._v(" "+t._s(t.getRecommendationLabel(e))+" ")])]}},{key:"created_at",fn:function(a){return[t._v(" "+t._s(t.formatDateTime(a))+" ")]}}])})],1)],1)])],1)],1)])},h=[],k=e(76471),v="/api/polymarket";function g(t){return(0,k.Ay)({url:"".concat(v,"/analyze"),method:"post",data:t,timeout:12e4})}function _(t){return(0,k.Ay)({url:"".concat(v,"/history"),method:"get",params:t})}var b={name:"PolymarketAnalysisModal",props:{visible:{type:Boolean,default:!1}},data:function(){var t=this;return{inputText:"",analyzing:!1,analysisResult:null,activeTab:"analyze",historyLoading:!1,historyList:[],historyPagination:{current:1,pageSize:20,total:0,showSizeChanger:!0,showTotal:function(a){return t.$t("polymarket.analysis.historyTotal",{total:a})}},historyColumns:[]}},methods:{handleAnalyze:function(){var t=this;this.inputText.trim()?(this.analyzing=!0,this.analysisResult=null,g({input:this.inputText.trim(),language:this.$i18n.locale||"zh-CN"}).then(function(a){1===a.code?(t.analysisResult=a.data,t.$message.success(t.$t("polymarket.analysis.success"))):"Insufficient credits"===a.msg?(t.$message.error(t.$t("polymarket.analysis.insufficientCredits")),t.$router.push("/billing")):t.$message.error(a.msg||t.$t("polymarket.analysis.failed"))}).catch(function(a){a.response&&a.response.data&&"Insufficient credits"===a.response.data.msg?(t.$message.error(t.$t("polymarket.analysis.insufficientCredits")),t.$router.push("/billing")):t.$message.error(t.$t("polymarket.analysis.failed"))}).finally(function(){t.analyzing=!1})):this.$message.warning(this.$t("polymarket.analysis.inputRequired"))},handleNewAnalysis:function(){this.inputText="",this.analysisResult=null},handleClose:function(){var t=this;this.$emit("close"),setTimeout(function(){t.inputText="",t.analysisResult=null,t.analyzing=!1},300)},getStatusColor:function(t){var a={active:"green",closed:"default",resolved:"blue"};return a[t]||"default"},getRecommendationColor:function(t){var a={YES:"green",NO:"red",HOLD:"orange"};return a[t]||"default"},getRecommendationLabel:function(t){var a={YES:this.$t("polymarket.analysis.recommendationYes"),NO:this.$t("polymarket.analysis.recommendationNo"),HOLD:this.$t("polymarket.analysis.recommendationHold")};return a[t]||t},getDivergenceClass:function(t){return t>5?"divergence-positive":t<-5?"divergence-negative":"divergence-neutral"},formatVolume:function(t){return t>=1e6?"$".concat((t/1e6).toFixed(2),"M"):t>=1e3?"$".concat((t/1e3).toFixed(2),"K"):"$".concat(t.toFixed(2))},handleTabChange:function(t){this.activeTab=t,"history"===t&&0===this.historyList.length&&this.loadHistory()},loadHistory:function(){var t=this;return(0,o.A)((0,n.A)().m(function a(){var e;return(0,n.A)().w(function(a){while(1)switch(a.p=a.n){case 0:return t.historyLoading=!0,a.p=1,a.n=2,_({page:t.historyPagination.current,page_size:t.historyPagination.pageSize});case 2:e=a.v,1===e.code&&e.data&&(t.historyList=e.data.items||[],t.historyPagination.total=e.data.total||0),a.n=4;break;case 3:a.p=3,a.v,t.$message.error(t.$t("polymarket.analysis.loadHistoryFailed"));case 4:return a.p=4,t.historyLoading=!1,a.f(4);case 5:return a.a(2)}},a,null,[[1,3,4,5]])}))()},handleHistoryTableChange:function(t){this.historyPagination.current=t.current,this.historyPagination.pageSize=t.pageSize,this.loadHistory()},viewHistoryItem:function(t){this.activeTab="analyze",this.analysisResult={market:{question:t.market_title,market_id:t.market_id,polymarket_url:t.market_url,current_probability:t.market_probability,status:"active"},analysis:{ai_predicted_probability:t.ai_predicted_probability,market_probability:t.market_probability,recommendation:t.recommendation,opportunity_score:t.opportunity_score,confidence_score:t.confidence_score}}},formatDateTime:function(t){if(!t)return"";var a=new Date(t);return a.toLocaleString("zh-CN"===this.$i18n.locale?"zh-CN":"en-US")}},mounted:function(){this.historyColumns=[{title:this.$t("polymarket.analysis.historyMarket"),dataIndex:"market_title",key:"market_title",scopedSlots:{customRender:"market_title"}},{title:this.$t("polymarket.analysis.historyRecommendation"),dataIndex:"recommendation",key:"recommendation",width:120,scopedSlots:{customRender:"recommendation"}},{title:this.$t("polymarket.analysis.historyOpportunityScore"),dataIndex:"opportunity_score",key:"opportunity_score",width:120,align:"right"},{title:this.$t("polymarket.analysis.historyCreatedAt"),dataIndex:"created_at",key:"created_at",width:180,scopedSlots:{customRender:"created_at"}}]}},f=b,C=e(845),S=(0,C.A)(f,m,h,!1,null,"41dfa054",null),$=S.exports,A={name:"AIAssetAnalysis",components:{AnalysisView:p["default"],PortfolioView:u["default"],QuickTradePanel:d.A,PolymarketAnalysisModal:$},data:function(){return{activeTab:"quick",opportunities:[],oppLoading:!1,oppHover:!1,presetSymbol:"",autoAnalyzeSignal:0,showQuickTrade:!1,qtSymbol:"",qtSide:"",qtPrice:0,qtSource:"ai_radar",currentAnalysisSymbol:"",currentAnalysisMarket:"",showPolymarketModal:!1}},computed:(0,l.A)((0,l.A)({},(0,c.aH)({navTheme:function(t){return t.app.theme}})),{},{isDarkTheme:function(){return"dark"===this.navTheme||"realdark"===this.navTheme},carouselItems:function(){return 0===this.opportunities.length?[]:[].concat((0,r.A)(this.opportunities),(0,r.A)(this.opportunities))},oppTrackStyle:function(){var t=3*this.opportunities.length;return{animationDuration:t+"s"}}}),created:function(){this.loadOpportunities()},methods:{loadOpportunities:function(){var t=arguments,a=this;return(0,o.A)((0,n.A)().m(function e(){var s,i,o;return(0,n.A)().w(function(e){while(1)switch(e.p=e.n){case 0:return s=t.length>0&&void 0!==t[0]&&t[0],a.oppLoading=!0,e.p=1,i=s?{force:!0}:{},e.n=2,(0,y.r9)(i);case 2:o=e.v,o&&1===o.code&&Array.isArray(o.data)&&(a.opportunities=o.data.slice(0,20)),e.n=4;break;case 3:e.p=3,e.v;case 4:return e.p=4,a.oppLoading=!1,e.f(4);case 5:return e.a(2)}},e,null,[[1,3,4,5]])}))()},getSignalColor:function(t){var a={overbought:"volcano",oversold:"green",bullish_momentum:"cyan",bearish_momentum:"red"};return a[t]||"default"},getSignalLabel:function(t){var a="aiAssetAnalysis.opportunities.signal.".concat(t),e=this.$t(a);return e!==a?e:t},getMarketTagColor:function(t){var a={Crypto:"purple",USStock:"green",Forex:"gold",PredictionMarket:"cyan"};return a[t]||"default"},getMarketLabel:function(t){var a="aiAssetAnalysis.opportunities.market.".concat(t),e=this.$t(a);return e!==a?e:t},getReasonText:function(t){var a=(t.market||"Crypto").toLowerCase(),e=t.signal||"",s="aiAssetAnalysis.opportunities.reason.".concat(a,".").concat(e),i=this.$t(s);if(i===s)return t.reason||"";var n=Math.abs(t.change_24h||0).toFixed(1),o=Math.abs(t.change_7d||0).toFixed(1);return i.replace("{change}",n).replace("{change7d}",o)},formatOppPrice:function(t){return t?t>=1e4?(t/1e3).toFixed(1)+"K":t>=1?t.toFixed(2):t.toFixed(4):"--"},analyzeOpportunity:function(t){var a=this;if("PredictionMarket"===t.market)return this.activeTab="polymarket",void(this.showPolymarketModal=!0);this.activeTab="quick";var e=t.market||"Crypto";this.presetSymbol="".concat(e,":").concat(t.symbol),this.$nextTick(function(){a.autoAnalyzeSignal++})},getRecommendationColor:function(t){var a={YES:"green",NO:"red",HOLD:"default"};return a[t]||"default"},getRecommendationLabel:function(t){return this.$t("polymarket.recommendation.".concat(t))||t},onAnalysisSymbolChange:function(t){if(!t)return this.currentAnalysisSymbol="",void(this.currentAnalysisMarket="");var a=t.split(":"),e=a.length>1?a[0]:"Crypto",s=a.length>1?a[1]:a[0];this.currentAnalysisMarket=e,this.currentAnalysisSymbol="Crypto"===e?s:""},openQuickTradeFromCurrent:function(){this.currentAnalysisSymbol&&(this.qtSymbol=this.currentAnalysisSymbol,this.qtSide="",this.qtPrice=0,this.qtSource="ai_analysis",this.showQuickTrade=!0)},openQuickTradeFromOpp:function(t){if("Crypto"===t.market){this.qtSymbol=t.symbol||"";var a=(t.signal||"").toLowerCase();a.includes("oversold")||a.includes("bullish")?this.qtSide="buy":a.includes("overbought")||a.includes("bearish")?this.qtSide="sell":this.qtSide="",this.qtPrice=t.price||0,this.qtSource="ai_radar",this.showQuickTrade=!0}},onQuickTradeSuccess:function(){this.$message.success(this.$t("quickTrade.orderSuccess"))},handleQuickTradeSymbolChange:function(t){t&&(this.qtSymbol=t)}}},T=A,w=(0,C.A)(T,s,i,!1,null,"20b827f5",null),x=w.exports}}]); \ No newline at end of file +"use strict";(self["webpackChunkvue_antd_pro"]=self["webpackChunkvue_antd_pro"]||[]).push([[59],{50992:function(t,a,e){e.r(a),e.d(a,{default:function(){return x}});var s=function(){var t=this,a=t._self._c;return a("div",{staticClass:"ai-asset-analysis-page",class:{"theme-dark":t.isDarkTheme}},[t.opportunities.length>0?a("div",{staticClass:"opp-section"},[a("div",{staticClass:"opp-header"},[a("span",{staticClass:"opp-title"},[a("a-icon",{attrs:{type:"radar-chart"}}),t._v(" "+t._s(t.$t("aiAssetAnalysis.opportunities.title")))],1),a("span",{staticClass:"opp-header-right"},[a("span",{staticClass:"opp-update-hint"},[a("a-icon",{attrs:{type:"clock-circle"}}),t._v(" "+t._s(t.$t("aiAssetAnalysis.opportunities.updateHint"))+" ")],1),a("a-button",{attrs:{type:"link",size:"small",icon:"reload",loading:t.oppLoading},on:{click:function(a){return t.loadOpportunities(!0)}}},[t._v(" "+t._s(t.$t("common.refresh")||"刷新")+" ")])],1)]),a("div",{staticClass:"opp-carousel-wrapper",on:{mouseenter:function(a){t.oppHover=!0},mouseleave:function(a){t.oppHover=!1}}},[a("div",{staticClass:"opp-track",class:{paused:t.oppHover},style:t.oppTrackStyle},t._l(t.carouselItems,function(e,s){return a("div",{key:"opp-"+s,staticClass:"opp-card",class:[e.impact,"market-"+(e.market||"").toLowerCase(),{"is-prediction-market":"PredictionMarket"===e.market}],on:{click:function(a){return t.analyzeOpportunity(e)}}},[a("div",{staticClass:"opp-top"},[a("span",{staticClass:"opp-symbol",class:{"prediction-title":"PredictionMarket"===e.market}},[t._v(" "+t._s("PredictionMarket"===e.market&&e.name||e.symbol)+" ")]),a("a-tag",{staticClass:"opp-market-tag",attrs:{color:t.getMarketTagColor(e.market),size:"small"}},[t._v(" "+t._s(t.getMarketLabel(e.market))+" ")])],1),"PredictionMarket"!==e.market?a("div",{staticClass:"opp-price"},[t._v("$"+t._s(t.formatOppPrice(e.price)))]):a("div",{staticClass:"opp-price"},[t._v(t._s((e.price||0).toFixed(1))+"%")]),"PredictionMarket"!==e.market?a("div",{staticClass:"opp-change",class:e.change_24h>=0?"up":"down"},[t._v(" "+t._s(e.change_24h>=0?"+":"")+t._s((e.change_24h||0).toFixed(1))+"% ")]):e.ai_analysis?a("div",{staticClass:"opp-change"},[a("a-tag",{attrs:{color:t.getRecommendationColor(e.ai_analysis.recommendation),size:"small"}},[t._v(" "+t._s(t.getRecommendationLabel(e.ai_analysis.recommendation))+" ")]),a("span",{staticStyle:{"margin-left":"8px","font-size":"12px",color:"rgba(0,0,0,0.65)"}},[t._v(" 机会评分: "+t._s(e.ai_analysis.opportunity_score.toFixed(0))+" ")])],1):t._e(),"PredictionMarket"!==e.market?a("div",{staticClass:"opp-signal"},[a("a-tag",{attrs:{color:t.getSignalColor(e.signal),size:"small"}},[t._v(t._s(t.getSignalLabel(e.signal)))])],1):t._e(),a("div",{staticClass:"opp-reason"},[t._v(t._s(t.getReasonText(e)))]),a("div",{staticClass:"opp-actions"},["PredictionMarket"!==e.market?a("span",{staticClass:"opp-action",on:{click:function(a){return a.stopPropagation(),t.analyzeOpportunity(e)}}},[a("a-icon",{attrs:{type:"thunderbolt"}}),t._v(" "+t._s(t.$t("aiAssetAnalysis.opportunities.analyze"))+" ")],1):a("span",{staticClass:"opp-action",on:{click:function(a){return a.stopPropagation(),t.analyzeOpportunity(e)}}},[a("a-icon",{attrs:{type:"link"}}),t._v(" "+t._s(t.$t("polymarket.action.viewDetail"))+" ")],1),"Crypto"===e.market?a("span",{staticClass:"opp-trade-btn",on:{click:function(a){return a.stopPropagation(),t.openQuickTradeFromOpp(e)}}},[a("a-icon",{attrs:{type:"transaction"}}),t._v(" "+t._s(t.$t("quickTrade.tradeNow"))+" ")],1):t._e()])])}),0)])]):t._e(),a("a-tooltip",{attrs:{title:t.$t("quickTrade.openPanel"),placement:"left"}},[!t.showQuickTrade&&t.currentAnalysisSymbol?a("div",{staticClass:"qt-floating-btn",on:{click:t.openQuickTradeFromCurrent}},[a("a-icon",{attrs:{type:"thunderbolt",theme:"filled"}})],1):t._e()]),a("quick-trade-panel",{attrs:{visible:t.showQuickTrade,symbol:t.qtSymbol,"preset-side":t.qtSide,"preset-price":t.qtPrice,source:t.qtSource,"market-type":"swap"},on:{close:function(a){t.showQuickTrade=!1},"order-success":t.onQuickTradeSuccess,"update:symbol":t.handleQuickTradeSymbolChange}}),a("a-card",{staticClass:"workspace-card",attrs:{bordered:!1}},[a("a-tabs",{staticClass:"workspace-tabs",attrs:{size:"large"},model:{value:t.activeTab,callback:function(a){t.activeTab=a},expression:"activeTab"}},[a("a-tab-pane",{key:"quick"},[a("span",{attrs:{slot:"tab"},slot:"tab"},[a("a-icon",{attrs:{type:"thunderbolt"}}),t._v(" "+t._s(t.$t("aiAssetAnalysis.tabs.quick"))+" ")],1),a("div",{staticClass:"tab-body"},["quick"===t.activeTab?a("AnalysisView",{attrs:{embedded:!0,"preset-symbol":t.presetSymbol,"auto-analyze-signal":t.autoAnalyzeSignal},on:{"symbol-change":t.onAnalysisSymbolChange}}):t._e()],1)]),a("a-tab-pane",{key:"monitor"},[a("span",{attrs:{slot:"tab"},slot:"tab"},[a("a-icon",{attrs:{type:"eye"}}),t._v(" "+t._s(t.$t("aiAssetAnalysis.tabs.monitor"))+" ")],1),a("div",{staticClass:"tab-body"},["monitor"===t.activeTab?a("PortfolioView",{attrs:{embedded:!0}}):t._e()],1)]),a("a-tab-pane",{key:"polymarket"},[a("span",{attrs:{slot:"tab"},slot:"tab"},[a("a-icon",{attrs:{type:"radar-chart"}}),t._v(" "+t._s(t.$t("aiAssetAnalysis.tabs.polymarket"))+" ")],1),a("div",{staticClass:"tab-body"},[a("div",{staticClass:"polymarket-tab-content"},[a("div",{staticClass:"polymarket-placeholder"},[a("div",{staticClass:"placeholder-icon"},[a("a-icon",{attrs:{type:"radar-chart"}})],1),a("h3",[t._v(t._s(t.$t("polymarket.analysis.title")))]),a("p",[t._v(t._s(t.$t("polymarket.analysis.description")))]),a("a-button",{staticStyle:{"margin-top":"16px"},attrs:{type:"primary",size:"large",icon:"thunderbolt"},on:{click:function(a){t.showPolymarketModal=!0}}},[t._v(" "+t._s(t.$t("polymarket.analysis.startAnalysis"))+" ")])],1)])])])],1)],1),a("PolymarketAnalysisModal",{attrs:{visible:t.showPolymarketModal},on:{close:function(a){t.showPolymarketModal=!1}}})],1)},i=[],n=e(76959),o=e(17654),r=e(9133),l=e(57888),c=(e(74423),e(95353)),p=e(53576),u=e(4103),y=e(62618),d=e(38250),m=function(){var t=this,a=t._self._c;return a("a-modal",{attrs:{visible:t.visible,title:t.$t("polymarket.analysis.title"),width:900,footer:null,maskClosable:!1},on:{cancel:t.handleClose}},[a("div",{staticClass:"polymarket-analysis-modal"},[a("a-tabs",{attrs:{"default-active-key":"analyze"},on:{change:t.handleTabChange}},[a("a-tab-pane",{key:"analyze",attrs:{tab:t.$t("polymarket.analysis.tabAnalyze")}},[t.analysisResult?t._e():a("div",{staticClass:"input-section"},[a("a-alert",{staticStyle:{"margin-bottom":"16px"},attrs:{message:t.$t("polymarket.analysis.inputHint"),type:"info","show-icon":""}}),a("a-textarea",{attrs:{placeholder:t.$t("polymarket.analysis.inputPlaceholder"),rows:3,disabled:t.analyzing},on:{pressEnter:t.handleAnalyze},model:{value:t.inputText,callback:function(a){t.inputText=a},expression:"inputText"}}),a("div",{staticClass:"input-actions"},[a("a-button",{staticStyle:{width:"100%","margin-top":"12px"},attrs:{type:"primary",size:"large",icon:"thunderbolt",loading:t.analyzing,disabled:!t.inputText.trim()},on:{click:t.handleAnalyze}},[t._v(" "+t._s(t.$t("polymarket.analysis.analyzeButton"))+" ")])],1)],1),t.analysisResult?a("div",{staticClass:"result-section"},[a("div",{staticClass:"market-info"},[a("h3",[t._v(t._s(t.analysisResult.market.question))]),a("div",{staticClass:"market-meta"},[a("a-tag",{attrs:{color:t.getStatusColor(t.analysisResult.market.status)}},[t._v(" "+t._s(t.analysisResult.market.status)+" ")]),a("span",{staticClass:"meta-item"},[a("a-icon",{attrs:{type:"percentage"}}),t._v(" "+t._s(t.analysisResult.market.current_probability)+"% ")],1),t.analysisResult.market.volume_24h?a("span",{staticClass:"meta-item"},[a("a-icon",{attrs:{type:"dollar"}}),t._v(" "+t._s(t.formatVolume(t.analysisResult.market.volume_24h))+" ")],1):t._e(),t.analysisResult.market.polymarket_url?a("a-button",{attrs:{type:"link",size:"small",icon:"link",href:t.analysisResult.market.polymarket_url,target:"_blank"}},[t._v(" "+t._s(t.$t("polymarket.analysis.viewOnPolymarket"))+" ")]):t._e()],1)]),a("div",{staticClass:"analysis-result"},[a("a-divider",[t._v(t._s(t.$t("polymarket.analysis.aiAnalysis")))]),a("div",{staticClass:"probability-comparison"},[a("div",{staticClass:"prob-item"},[a("div",{staticClass:"prob-label"},[t._v(t._s(t.$t("polymarket.analysis.marketProbability")))]),a("div",{staticClass:"prob-value"},[t._v(t._s(t.analysisResult.analysis.market_probability)+"%")])]),a("div",{staticClass:"prob-item"},[a("div",{staticClass:"prob-label"},[t._v(t._s(t.$t("polymarket.analysis.aiPredictedProbability")))]),a("div",{staticClass:"prob-value ai-prob"},[t._v(t._s(t.analysisResult.analysis.ai_predicted_probability)+"%")])]),a("div",{staticClass:"prob-item"},[a("div",{staticClass:"prob-label"},[t._v(t._s(t.$t("polymarket.analysis.divergence")))]),a("div",{staticClass:"prob-value",class:t.getDivergenceClass(t.analysisResult.analysis.divergence)},[t._v(" "+t._s(t.analysisResult.analysis.divergence>=0?"+":"")+t._s(t.analysisResult.analysis.divergence.toFixed(2))+"% ")])])]),a("div",{staticClass:"recommendation-section"},[a("a-row",{attrs:{gutter:16}},[a("a-col",{attrs:{span:8}},[a("div",{staticClass:"rec-card"},[a("div",{staticClass:"rec-label"},[t._v(t._s(t.$t("polymarket.analysis.recommendation")))]),a("a-tag",{staticStyle:{"font-size":"16px",padding:"4px 12px"},attrs:{color:t.getRecommendationColor(t.analysisResult.analysis.recommendation)}},[t._v(" "+t._s(t.getRecommendationLabel(t.analysisResult.analysis.recommendation))+" ")])],1)]),a("a-col",{attrs:{span:8}},[a("div",{staticClass:"rec-card"},[a("div",{staticClass:"rec-label"},[t._v(t._s(t.$t("polymarket.analysis.confidenceScore")))]),a("div",{staticClass:"rec-value"},[t._v(t._s(t.analysisResult.analysis.confidence_score.toFixed(0)))])])]),a("a-col",{attrs:{span:8}},[a("div",{staticClass:"rec-card"},[a("div",{staticClass:"rec-label"},[t._v(t._s(t.$t("polymarket.analysis.opportunityScore")))]),a("div",{staticClass:"rec-value"},[t._v(t._s(t.analysisResult.analysis.opportunity_score.toFixed(0)))])])])],1)],1),t.analysisResult.analysis.reasoning?a("div",{staticClass:"reasoning-section"},[a("h4",[t._v(t._s(t.$t("polymarket.analysis.reasoning")))]),a("p",{staticClass:"reasoning-text"},[t._v(t._s(t.analysisResult.analysis.reasoning))])]):t._e(),t.analysisResult.analysis.key_factors&&t.analysisResult.analysis.key_factors.length>0?a("div",{staticClass:"key-factors-section"},[a("h4",[t._v(t._s(t.$t("polymarket.analysis.keyFactors")))]),t._l(t.analysisResult.analysis.key_factors,function(e,s){return a("a-tag",{key:s,staticStyle:{margin:"4px"},attrs:{color:"blue"}},[t._v(" "+t._s(e)+" ")])})],2):t._e(),t.analysisResult.credits_charged>0?a("div",{staticClass:"billing-info"},[a("a-alert",{staticStyle:{"margin-top":"16px"},attrs:{message:t.$t("polymarket.analysis.creditsCharged",{credits:t.analysisResult.credits_charged}),type:"success","show-icon":""}}),void 0!==t.analysisResult.remaining_credits?a("div",{staticStyle:{"margin-top":"8px","text-align":"right",color:"rgba(0,0,0,0.65)"}},[t._v(" "+t._s(t.$t("polymarket.analysis.remainingCredits",{credits:t.analysisResult.remaining_credits.toFixed(0)}))+" ")]):t._e()],1):t._e()],1),a("div",{staticClass:"result-actions"},[a("a-button",{staticStyle:{"margin-right":"8px"},on:{click:t.handleNewAnalysis}},[t._v(" "+t._s(t.$t("polymarket.analysis.newAnalysis"))+" ")]),a("a-button",{attrs:{type:"primary"},on:{click:t.handleClose}},[t._v(" "+t._s(t.$t("common.close"))+" ")])],1)]):t._e(),t.analyzing?a("div",{staticClass:"loading-section"},[a("a-spin",{attrs:{size:"large"}}),a("p",{staticStyle:{"margin-top":"16px",color:"rgba(0,0,0,0.65)"}},[t._v(" "+t._s(t.$t("polymarket.analysis.analyzing"))+" ")])],1):t._e()]),a("a-tab-pane",{key:"history",attrs:{tab:t.$t("polymarket.analysis.tabHistory")}},[a("div",{staticClass:"history-section"},[a("a-spin",{attrs:{spinning:t.historyLoading}},[a("a-table",{attrs:{columns:t.historyColumns,"data-source":t.historyList,pagination:t.historyPagination,"row-key":function(t){return t.id},size:"small"},on:{change:t.handleHistoryTableChange},scopedSlots:t._u([{key:"market_title",fn:function(e,s){return[a("a-button",{staticStyle:{padding:"0"},attrs:{type:"link"},on:{click:function(a){return t.viewHistoryItem(s)}}},[t._v(" "+t._s(e)+" ")])]}},{key:"recommendation",fn:function(e){return[a("a-tag",{attrs:{color:t.getRecommendationColor(e)}},[t._v(" "+t._s(t.getRecommendationLabel(e))+" ")])]}},{key:"created_at",fn:function(a){return[t._v(" "+t._s(t.formatDateTime(a))+" ")]}}])})],1)],1)])],1)],1)])},h=[],k=e(76471),v="/api/polymarket";function g(t){return(0,k.Ay)({url:"".concat(v,"/analyze"),method:"post",data:t,timeout:12e4})}function _(t){return(0,k.Ay)({url:"".concat(v,"/history"),method:"get",params:t})}var b={name:"PolymarketAnalysisModal",props:{visible:{type:Boolean,default:!1}},data:function(){var t=this;return{inputText:"",analyzing:!1,analysisResult:null,activeTab:"analyze",historyLoading:!1,historyList:[],historyPagination:{current:1,pageSize:20,total:0,showSizeChanger:!0,showTotal:function(a){return t.$t("polymarket.analysis.historyTotal",{total:a})}},historyColumns:[]}},methods:{handleAnalyze:function(){var t=this;this.inputText.trim()?(this.analyzing=!0,this.analysisResult=null,g({input:this.inputText.trim(),language:this.$i18n.locale||"zh-CN"}).then(function(a){1===a.code?(t.analysisResult=a.data,t.$message.success(t.$t("polymarket.analysis.success"))):"Insufficient credits"===a.msg?(t.$message.error(t.$t("polymarket.analysis.insufficientCredits")),t.$router.push("/billing")):t.$message.error(a.msg||t.$t("polymarket.analysis.failed"))}).catch(function(a){a.response&&a.response.data&&"Insufficient credits"===a.response.data.msg?(t.$message.error(t.$t("polymarket.analysis.insufficientCredits")),t.$router.push("/billing")):t.$message.error(t.$t("polymarket.analysis.failed"))}).finally(function(){t.analyzing=!1})):this.$message.warning(this.$t("polymarket.analysis.inputRequired"))},handleNewAnalysis:function(){this.inputText="",this.analysisResult=null},handleClose:function(){var t=this;this.$emit("close"),setTimeout(function(){t.inputText="",t.analysisResult=null,t.analyzing=!1},300)},getStatusColor:function(t){var a={active:"green",closed:"default",resolved:"blue"};return a[t]||"default"},getRecommendationColor:function(t){var a={YES:"green",NO:"red",HOLD:"orange"};return a[t]||"default"},getRecommendationLabel:function(t){var a={YES:this.$t("polymarket.analysis.recommendationYes"),NO:this.$t("polymarket.analysis.recommendationNo"),HOLD:this.$t("polymarket.analysis.recommendationHold")};return a[t]||t},getDivergenceClass:function(t){return t>5?"divergence-positive":t<-5?"divergence-negative":"divergence-neutral"},formatVolume:function(t){return t>=1e6?"$".concat((t/1e6).toFixed(2),"M"):t>=1e3?"$".concat((t/1e3).toFixed(2),"K"):"$".concat(t.toFixed(2))},handleTabChange:function(t){this.activeTab=t,"history"===t&&0===this.historyList.length&&this.loadHistory()},loadHistory:function(){var t=this;return(0,o.A)((0,n.A)().m(function a(){var e;return(0,n.A)().w(function(a){while(1)switch(a.p=a.n){case 0:return t.historyLoading=!0,a.p=1,a.n=2,_({page:t.historyPagination.current,page_size:t.historyPagination.pageSize});case 2:e=a.v,1===e.code&&e.data&&(t.historyList=e.data.items||[],t.historyPagination.total=e.data.total||0),a.n=4;break;case 3:a.p=3,a.v,t.$message.error(t.$t("polymarket.analysis.loadHistoryFailed"));case 4:return a.p=4,t.historyLoading=!1,a.f(4);case 5:return a.a(2)}},a,null,[[1,3,4,5]])}))()},handleHistoryTableChange:function(t){this.historyPagination.current=t.current,this.historyPagination.pageSize=t.pageSize,this.loadHistory()},viewHistoryItem:function(t){this.activeTab="analyze",this.analysisResult={market:{question:t.market_title,market_id:t.market_id,polymarket_url:t.market_url,current_probability:t.market_probability,status:"active"},analysis:{ai_predicted_probability:t.ai_predicted_probability,market_probability:t.market_probability,recommendation:t.recommendation,opportunity_score:t.opportunity_score,confidence_score:t.confidence_score}}},formatDateTime:function(t){if(!t)return"";var a=new Date(t);return a.toLocaleString("zh-CN"===this.$i18n.locale?"zh-CN":"en-US")}},mounted:function(){this.historyColumns=[{title:this.$t("polymarket.analysis.historyMarket"),dataIndex:"market_title",key:"market_title",scopedSlots:{customRender:"market_title"}},{title:this.$t("polymarket.analysis.historyRecommendation"),dataIndex:"recommendation",key:"recommendation",width:120,scopedSlots:{customRender:"recommendation"}},{title:this.$t("polymarket.analysis.historyOpportunityScore"),dataIndex:"opportunity_score",key:"opportunity_score",width:120,align:"right"},{title:this.$t("polymarket.analysis.historyCreatedAt"),dataIndex:"created_at",key:"created_at",width:180,scopedSlots:{customRender:"created_at"}}]}},f=b,C=e(845),S=(0,C.A)(f,m,h,!1,null,"41dfa054",null),$=S.exports,A={name:"AIAssetAnalysis",components:{AnalysisView:p["default"],PortfolioView:u["default"],QuickTradePanel:d.A,PolymarketAnalysisModal:$},data:function(){return{activeTab:"quick",opportunities:[],oppLoading:!1,oppHover:!1,presetSymbol:"",autoAnalyzeSignal:0,showQuickTrade:!1,qtSymbol:"",qtSide:"",qtPrice:0,qtSource:"ai_radar",currentAnalysisSymbol:"",currentAnalysisMarket:"",showPolymarketModal:!1}},computed:(0,l.A)((0,l.A)({},(0,c.aH)({navTheme:function(t){return t.app.theme}})),{},{isDarkTheme:function(){return"dark"===this.navTheme||"realdark"===this.navTheme},carouselItems:function(){return 0===this.opportunities.length?[]:[].concat((0,r.A)(this.opportunities),(0,r.A)(this.opportunities))},oppTrackStyle:function(){var t=3*this.opportunities.length;return{animationDuration:t+"s"}}}),created:function(){this.loadOpportunities()},methods:{loadOpportunities:function(){var t=arguments,a=this;return(0,o.A)((0,n.A)().m(function e(){var s,i,o;return(0,n.A)().w(function(e){while(1)switch(e.p=e.n){case 0:return s=t.length>0&&void 0!==t[0]&&t[0],a.oppLoading=!0,e.p=1,i=s?{force:!0}:{},e.n=2,(0,y.r9)(i);case 2:o=e.v,o&&1===o.code&&Array.isArray(o.data)&&(a.opportunities=o.data.slice(0,20)),e.n=4;break;case 3:e.p=3,e.v;case 4:return e.p=4,a.oppLoading=!1,e.f(4);case 5:return e.a(2)}},e,null,[[1,3,4,5]])}))()},getSignalColor:function(t){var a={overbought:"volcano",oversold:"green",bullish_momentum:"cyan",bearish_momentum:"red"};return a[t]||"default"},getSignalLabel:function(t){var a="aiAssetAnalysis.opportunities.signal.".concat(t),e=this.$t(a);return e!==a?e:t},getMarketTagColor:function(t){var a={Crypto:"purple",USStock:"green",Forex:"gold",PredictionMarket:"cyan"};return a[t]||"default"},getMarketLabel:function(t){var a="aiAssetAnalysis.opportunities.market.".concat(t),e=this.$t(a);return e!==a?e:t},getReasonText:function(t){var a=(t.market||"Crypto").toLowerCase(),e=t.signal||"",s="aiAssetAnalysis.opportunities.reason.".concat(a,".").concat(e),i=this.$t(s);if(i===s)return t.reason||"";var n=Math.abs(t.change_24h||0).toFixed(1),o=Math.abs(t.change_7d||0).toFixed(1);return i.replace("{change}",n).replace("{change7d}",o)},formatOppPrice:function(t){return t?t>=1e4?(t/1e3).toFixed(1)+"K":t>=1?t.toFixed(2):t.toFixed(4):"--"},analyzeOpportunity:function(t){var a=this;if("PredictionMarket"===t.market)return this.activeTab="polymarket",void(this.showPolymarketModal=!0);this.activeTab="quick";var e=t.market||"Crypto";this.presetSymbol="".concat(e,":").concat(t.symbol),this.$nextTick(function(){a.autoAnalyzeSignal++})},getRecommendationColor:function(t){var a={YES:"green",NO:"red",HOLD:"default"};return a[t]||"default"},getRecommendationLabel:function(t){return this.$t("polymarket.recommendation.".concat(t))||t},onAnalysisSymbolChange:function(t){if(!t)return this.currentAnalysisSymbol="",void(this.currentAnalysisMarket="");var a=t.split(":"),e=a.length>1?a[0]:"Crypto",s=a.length>1?a[1]:a[0];this.currentAnalysisMarket=e,this.currentAnalysisSymbol="Crypto"===e?s:""},openQuickTradeFromCurrent:function(){this.currentAnalysisSymbol&&(this.qtSymbol=this.currentAnalysisSymbol,this.qtSide="",this.qtPrice=0,this.qtSource="ai_analysis",this.showQuickTrade=!0)},openQuickTradeFromOpp:function(t){if("Crypto"===t.market){this.qtSymbol=t.symbol||"";var a=(t.signal||"").toLowerCase();a.includes("oversold")||a.includes("bullish")?this.qtSide="buy":a.includes("overbought")||a.includes("bearish")?this.qtSide="sell":this.qtSide="",this.qtPrice=t.price||0,this.qtSource="ai_radar",this.showQuickTrade=!0}},onQuickTradeSuccess:function(){this.$message.success(this.$t("quickTrade.orderSuccess"))},handleQuickTradeSymbolChange:function(t){t&&(this.qtSymbol=t)}}},T=A,w=(0,C.A)(T,s,i,!1,null,"20b827f5",null),x=w.exports}}]); \ No newline at end of file diff --git a/frontend/dist/js/785.5801a946.js b/frontend/dist/js/785.5801a946.js deleted file mode 100644 index 93a4d41..0000000 --- a/frontend/dist/js/785.5801a946.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self["webpackChunkvue_antd_pro"]=self["webpackChunkvue_antd_pro"]||[]).push([[785],{47785:function(t,a,s){s.r(a),s.d(a,{default:function(){return M}});var e=function(){var t=this,a=t._self._c;return a("div",{staticClass:"ai-analysis-container",class:{"theme-dark":t.isDarkTheme,embedded:t.embedded},style:{"--primary-color":t.primaryColor}},[a("div",{staticClass:"main-content-full"},[a("div",{staticClass:"top-index-bar"},[t.loadingSentiment?[t._m(0),t._m(1),t._m(2)]:[a("div",{staticClass:"indicator-box fear-greed",class:t.getFearGreedClass(t.marketData.fearGreed)},[a("span",{staticClass:"ind-label"},[t._v(t._s(t.$t("globalMarket.fearGreedShort")))]),a("span",{staticClass:"ind-value"},[t._v(t._s(t.marketData.fearGreed||"--"))])]),a("div",{staticClass:"indicator-box vix",class:t.getVixLevel(t.marketData.vix)},[a("span",{staticClass:"ind-label"},[t._v("VIX")]),a("span",{staticClass:"ind-value"},[t._v(t._s(t.marketData.vix||"--"))])]),a("div",{staticClass:"indicator-box dxy"},[a("span",{staticClass:"ind-label"},[t._v("DXY")]),a("span",{staticClass:"ind-value"},[t._v(t._s(t.marketData.dxy||"--"))])])],a("div",{staticClass:"indices-marquee"},[t.loadingIndices?[a("div",{staticClass:"indices-loading"},[a("a-icon",{attrs:{type:"loading"}}),t._v(" "+t._s(t.$t("common.loading")||"加载中...")+" ")],1)]:t.marketData.indices.length>0?[a("div",{staticClass:"marquee-track"},[t._l(t.marketData.indices,function(s){return a("div",{key:"a-"+s.symbol,staticClass:"index-item"},[a("span",{staticClass:"idx-flag"},[t._v(t._s(s.flag))]),a("span",{staticClass:"idx-symbol"},[t._v(t._s(s.symbol))]),a("span",{staticClass:"idx-price"},[t._v(t._s(t.formatPrice(s.price)))]),a("span",{staticClass:"idx-change",class:s.change>=0?"up":"down"},[a("a-icon",{attrs:{type:s.change>=0?"caret-up":"caret-down"}}),t._v(" "+t._s(Math.abs(s.change).toFixed(2))+"% ")],1)])}),t._l(t.marketData.indices,function(s){return a("div",{key:"b-"+s.symbol,staticClass:"index-item"},[a("span",{staticClass:"idx-flag"},[t._v(t._s(s.flag))]),a("span",{staticClass:"idx-symbol"},[t._v(t._s(s.symbol))]),a("span",{staticClass:"idx-price"},[t._v(t._s(t.formatPrice(s.price)))]),a("span",{staticClass:"idx-change",class:s.change>=0?"up":"down"},[a("a-icon",{attrs:{type:s.change>=0?"caret-up":"caret-down"}}),t._v(" "+t._s(Math.abs(s.change).toFixed(2))+"% ")],1)])})],2)]:[a("div",{staticClass:"indices-empty"},[t._v("--")])]],2),a("a-button",{staticClass:"refresh-btn",attrs:{type:"link",size:"small",loading:t.loadingMarket},on:{click:t.loadMarketData}},[a("a-icon",{attrs:{type:"sync",spin:t.loadingMarket}})],1)],2),a("div",{staticClass:"main-body"},[a("div",{staticClass:"left-panel"},[a("div",{staticClass:"heatmap-box"},[a("div",{staticClass:"box-header"},[a("a-radio-group",{attrs:{size:"small","button-style":"solid"},model:{value:t.heatmapType,callback:function(a){t.heatmapType=a},expression:"heatmapType"}},[a("a-radio-button",{attrs:{value:"crypto"}},[t._v(t._s(t.$t("globalMarket.cryptoHeatmap")))]),a("a-radio-button",{attrs:{value:"commodities"}},[t._v(t._s(t.$t("globalMarket.commoditiesHeatmap")))]),a("a-radio-button",{attrs:{value:"sectors"}},[t._v(t._s(t.$t("globalMarket.sectorHeatmap")))]),a("a-radio-button",{attrs:{value:"forex"}},[t._v(t._s(t.$t("globalMarket.forexHeatmap")))])],1)],1),a("div",{staticClass:"heatmap-grid"},[t.loadingHeatmap?t._l(12,function(t){return a("div",{key:"skel-"+t,staticClass:"heat-cell skeleton-cell"},[a("span",{staticClass:"skeleton-text short"}),a("span",{staticClass:"skeleton-text"})])}):t.currentHeatmap.length>0?t._l(t.currentHeatmap.slice(0,12),function(s,e){return a("div",{key:e,staticClass:"heat-cell",style:t.getHeatmapStyle(s.value)},[a("span",{staticClass:"heat-name"},[t._v(t._s(t.getHeatmapName(s)))]),s.price?a("span",{staticClass:"heat-price"},[t._v(t._s(t.formatHeatmapPrice(s.price)))]):t._e(),a("span",{staticClass:"heat-val"},[t._v(t._s(s.value>=0?"+":"")+t._s(t.formatNum(s.value))+"%")])])}):[a("div",{staticClass:"heatmap-empty"},[t._v(t._s(t.$t("common.noData")||"暂无数据"))])]],2)]),a("div",{staticClass:"calendar-box"},[a("div",{staticClass:"box-header"},[a("span",{staticClass:"box-title"},[a("a-icon",{attrs:{type:"calendar"}}),t._v(" "+t._s(t.$t("globalMarket.calendar")))],1)]),a("div",{staticClass:"calendar-list"},[t.loadingCalendar?t._l(5,function(t){return a("div",{key:"cal-skel-"+t,staticClass:"cal-item skeleton-item"},[a("span",{staticClass:"skeleton-text short"}),a("span",{staticClass:"skeleton-text short"}),a("span",{staticClass:"skeleton-text"})])}):t.marketData.calendar.length>0?t._l(t.marketData.calendar.slice(0,10),function(s){return a("div",{key:s.id,staticClass:"cal-item",class:s.importance},[a("span",{staticClass:"cal-date"},[t._v(t._s(t.formatCalendarDate(s.date)))]),a("span",{staticClass:"cal-time"},[t._v(t._s(s.time||"--:--"))]),a("span",{staticClass:"cal-flag"},[t._v(t._s(t.getCountryFlag(s.country)))]),a("span",{staticClass:"cal-name"},[t._v(t._s(t.isZhLocale?s.name:s.name_en))]),a("span",{staticClass:"cal-impact",class:t.getImpactClass(s)},["bullish"===t.getImpactClass(s)?a("a-icon",{attrs:{type:"arrow-up"}}):"bearish"===t.getImpactClass(s)?a("a-icon",{attrs:{type:"arrow-down"}}):a("a-icon",{attrs:{type:"minus"}}),t._v(" "+t._s(s.actual||s.forecast||"--")+" ")],1)])}):[a("div",{staticClass:"cal-empty"},[t._v(t._s(t.$t("globalMarket.noEvents")))])]],2)])]),a("div",{staticClass:"right-panel"},[a("div",{staticClass:"analysis-toolbar"},[a("a-select",{staticClass:"symbol-selector",attrs:{placeholder:t.$t("dashboard.analysis.empty.selectSymbol"),size:"large","show-search":"","allow-clear":"","filter-option":t.filterSymbolOption},on:{change:t.handleSymbolChange},model:{value:t.selectedSymbol,callback:function(a){t.selectedSymbol=a},expression:"selectedSymbol"}},[t._l(t.watchlist||[],function(s){return a("a-select-option",{key:"".concat(s.market,"-").concat(s.symbol),attrs:{value:"".concat(s.market,":").concat(s.symbol)}},[a("span",{staticClass:"symbol-option"},[a("a-tag",{attrs:{color:t.getMarketColor(s.market),size:"small"}},[t._v(t._s(t.getMarketName(s.market)))]),a("strong",{staticStyle:{"margin-left":"6px"}},[t._v(t._s(s.symbol))]),s.name?a("span",{staticClass:"symbol-name"},[t._v(t._s(s.name))]):t._e()],1)])}),a("a-select-option",{key:"add-stock-option",staticClass:"add-stock-option",attrs:{value:"__add_stock_option__"}},[a("div",{staticStyle:{"text-align":"center",padding:"4px 0",color:"#1890ff"}},[a("a-icon",{staticStyle:{"margin-right":"4px"},attrs:{type:"plus"}}),t._v(t._s(t.$t("dashboard.analysis.watchlist.add"))+" ")],1)])],2),a("a-button",{staticClass:"analyze-button",attrs:{type:"primary",size:"large",icon:"thunderbolt",loading:t.analyzing,disabled:!t.selectedSymbol},on:{click:t.startFastAnalysis}},[t._v(" "+t._s(t.$t("fastAnalysis.startAnalysis"))+" ")]),a("a-button",{staticClass:"history-button",attrs:{size:"large",icon:"history"},on:{click:function(a){t.showHistoryModal=!0,t.loadHistoryList()}}},[t._v(" "+t._s(t.$t("fastAnalysis.history"))+" ")])],1),a("div",{staticClass:"analysis-main"},[t.analysisResult||t.analyzing?t._e():a("div",{staticClass:"analysis-placeholder"},[a("div",{staticClass:"placeholder-content"},[a("div",{staticClass:"placeholder-icon"},[a("a-icon",{attrs:{type:"robot"}})],1),a("h3",[t._v(t._s(t.$t("fastAnalysis.selectTip")))]),a("p",[t._v(t._s(t.$t("fastAnalysis.selectHint")))])])]),t.analysisResult||t.analyzing?a("FastAnalysisReport",{attrs:{result:t.analysisResult,loading:t.analyzing,error:t.analysisError},on:{retry:t.startFastAnalysis}}):t._e()],1)]),a("div",{staticClass:"watchlist-panel"},[a("div",{staticClass:"panel-header"},[a("span",{staticClass:"panel-title"},[a("a-icon",{attrs:{type:"star",theme:"filled"}}),t._v(" "+t._s(t.$t("dashboard.analysis.watchlist.title")))],1),a("a-button",{attrs:{type:"link",size:"small"},on:{click:function(a){t.showAddStockModal=!0}}},[a("a-icon",{attrs:{type:"plus"}})],1)],1),a("div",{staticClass:"watchlist-list"},[t._l(t.watchlist||[],function(s){var e,i,r;return a("div",{key:"".concat(s.market,"-").concat(s.symbol),staticClass:"watchlist-item",class:{active:t.selectedSymbol==="".concat(s.market,":").concat(s.symbol)},on:{click:function(a){return t.selectWatchlistItem(s)}}},[a("div",{staticClass:"item-main"},[a("span",{staticClass:"item-symbol"},[t._v(t._s(s.symbol))]),a("span",{staticClass:"item-name"},[t._v(t._s(s.name||t.getMarketName(s.market)))])]),t.watchlistPrices["".concat(s.market,":").concat(s.symbol)]?a("div",{staticClass:"item-price"},[a("span",{staticClass:"price-value"},[t._v(t._s(t.formatPrice(t.watchlistPrices["".concat(s.market,":").concat(s.symbol)].price)))]),a("span",{staticClass:"price-change",class:((null===(e=t.watchlistPrices["".concat(s.market,":").concat(s.symbol)])||void 0===e?void 0:e.change)||0)>=0?"up":"down"},[t._v(" "+t._s(((null===(i=t.watchlistPrices["".concat(s.market,":").concat(s.symbol)])||void 0===i?void 0:i.change)||0)>=0?"+":"")+t._s(t.formatNum(null===(r=t.watchlistPrices["".concat(s.market,":").concat(s.symbol)])||void 0===r?void 0:r.change))+"% ")])]):t._e(),a("a-icon",{staticClass:"item-remove",attrs:{type:"close"},on:{click:function(a){return a.stopPropagation(),t.removeFromWatchlist(s)}}})],1)}),t.watchlist&&0!==t.watchlist.length?t._e():a("div",{staticClass:"watchlist-empty"},[a("a-icon",{attrs:{type:"inbox"}}),a("p",[t._v(t._s(t.$t("dashboard.analysis.empty.noWatchlist")))]),a("a-button",{attrs:{type:"primary",size:"small"},on:{click:function(a){t.showAddStockModal=!0}}},[a("a-icon",{attrs:{type:"plus"}}),t._v(" "+t._s(t.$t("dashboard.analysis.watchlist.add"))+" ")],1)],1)],2)])])]),a("a-modal",{attrs:{title:t.$t("dashboard.analysis.modal.addStock.title"),visible:t.showAddStockModal,confirmLoading:t.addingStock,width:"600px",okText:t.$t("dashboard.analysis.modal.addStock.confirm"),cancelText:t.$t("dashboard.analysis.modal.addStock.cancel")},on:{ok:t.handleAddStock,cancel:t.handleCloseAddStockModal}},[a("div",{staticClass:"add-stock-modal-content"},[a("a-tabs",{staticClass:"market-tabs",on:{change:t.handleMarketTabChange},model:{value:t.selectedMarketTab,callback:function(a){t.selectedMarketTab=a},expression:"selectedMarketTab"}},t._l(t.marketTypes,function(s){return a("a-tab-pane",{key:s.value,attrs:{tab:t.$t(s.i18nKey||"dashboard.analysis.market.".concat(s.value))}})}),1),a("div",{staticClass:"symbol-search-section"},[a("a-input-search",{attrs:{placeholder:t.$t("dashboard.analysis.modal.addStock.searchOrInputPlaceholder"),loading:t.searchingSymbols,size:"large","allow-clear":""},on:{search:t.handleSearchOrInput,change:t.handleSymbolSearchInput},model:{value:t.symbolSearchKeyword,callback:function(a){t.symbolSearchKeyword=a},expression:"symbolSearchKeyword"}},[a("a-button",{attrs:{slot:"enterButton",type:"primary",icon:"search"},slot:"enterButton"},[t._v(" "+t._s(t.$t("dashboard.analysis.modal.addStock.search"))+" ")])],1)],1),t.symbolSearchResults.length>0?a("div",{staticClass:"search-results-section"},[a("div",{staticClass:"section-title"},[a("a-icon",{staticStyle:{"margin-right":"4px"},attrs:{type:"search"}}),t._v(" "+t._s(t.$t("dashboard.analysis.modal.addStock.searchResults"))+" ")],1),a("a-list",{staticClass:"symbol-list",attrs:{"data-source":t.symbolSearchResults,loading:t.searchingSymbols,size:"small"},scopedSlots:t._u([{key:"renderItem",fn:function(s){return a("a-list-item",{staticClass:"symbol-list-item",on:{click:function(a){return t.selectSymbol(s)}}},[a("a-list-item-meta",[a("template",{slot:"title"},[a("div",{staticClass:"symbol-item-content"},[a("span",{staticClass:"symbol-code"},[t._v(t._s(s.symbol))]),a("span",{staticClass:"symbol-name"},[t._v(t._s(s.name))]),s.exchange?a("a-tag",{staticStyle:{"margin-left":"8px"},attrs:{size:"small",color:"blue"}},[t._v(" "+t._s(s.exchange)+" ")]):t._e()],1)])],2)],1)}}],null,!1,1074844145)})],1):t._e(),a("div",{staticClass:"hot-symbols-section"},[a("div",{staticClass:"section-title"},[a("a-icon",{staticStyle:{color:"#ff4d4f","margin-right":"4px"},attrs:{type:"fire"}}),t._v(" "+t._s(t.$t("dashboard.analysis.modal.addStock.hotSymbols"))+" ")],1),a("a-spin",{attrs:{spinning:t.loadingHotSymbols}},[t.hotSymbols.length>0?a("a-list",{staticClass:"symbol-list",attrs:{"data-source":t.hotSymbols,size:"small"},scopedSlots:t._u([{key:"renderItem",fn:function(s){return a("a-list-item",{staticClass:"symbol-list-item",on:{click:function(a){return t.selectSymbol(s)}}},[a("a-list-item-meta",[a("template",{slot:"title"},[a("div",{staticClass:"symbol-item-content"},[a("span",{staticClass:"symbol-code"},[t._v(t._s(s.symbol))]),a("span",{staticClass:"symbol-name"},[t._v(t._s(s.name))]),s.exchange?a("a-tag",{staticStyle:{"margin-left":"8px"},attrs:{size:"small",color:"orange"}},[t._v(" "+t._s(s.exchange)+" ")]):t._e()],1)])],2)],1)}}],null,!1,2177647935)}):a("a-empty",{attrs:{description:t.$t("dashboard.analysis.modal.addStock.noHotSymbols"),image:!1}})],1)],1),t.selectedSymbolForAdd?a("div",{staticClass:"selected-symbol-section"},[a("a-alert",{attrs:{message:t.$t("dashboard.analysis.modal.addStock.selectedSymbol"),type:"info","show-icon":"",closable:""},on:{close:function(a){t.selectedSymbolForAdd=null}}},[a("template",{slot:"description"},[a("div",{staticClass:"selected-symbol-info"},[a("a-tag",{staticStyle:{"margin-right":"8px"},attrs:{color:t.getMarketColor(t.selectedSymbolForAdd.market)}},[t._v(" "+t._s(t.$t("dashboard.analysis.market.".concat(t.selectedSymbolForAdd.market)))+" ")]),a("strong",[t._v(t._s(t.selectedSymbolForAdd.symbol))]),t.selectedSymbolForAdd.name?a("span",{staticStyle:{color:"#999","margin-left":"8px"}},[t._v(t._s(t.selectedSymbolForAdd.name))]):t._e()],1)])],2)],1):t._e()],1)]),a("a-modal",{attrs:{title:t.$t("dashboard.analysis.modal.history.title"),visible:t.showHistoryModal,footer:null,width:"800px",bodyStyle:{maxHeight:"60vh",overflowY:"auto"}},on:{cancel:function(a){t.showHistoryModal=!1}}},[a("a-spin",{attrs:{spinning:t.historyLoading}},[a("a-list",{attrs:{"data-source":t.historyList,pagination:{current:t.historyPage,pageSize:t.historyPageSize,total:t.historyTotal,onChange:function(a){t.historyPage=a,t.loadHistoryList()},showSizeChanger:!0,pageSizeOptions:["10","20","50"],onShowSizeChange:function(a,s){t.historyPageSize=s,t.historyPage=1,t.loadHistoryList()}}},scopedSlots:t._u([{key:"renderItem",fn:function(s){return a("a-list-item",{},[a("a-list-item-meta",[a("template",{slot:"title"},[a("div",{staticStyle:{display:"flex","align-items":"center","justify-content":"space-between"}},[a("div",[a("a-tag",{staticStyle:{"margin-right":"8px"},attrs:{color:t.getMarketColor(s.market)}},[t._v(" "+t._s(t.getMarketName(s.market))+" ")]),a("strong",[t._v(t._s(s.symbol))]),a("a-tag",{staticStyle:{"margin-left":"12px"},attrs:{color:"BUY"===s.decision?"green":"SELL"===s.decision?"red":"blue"}},[t._v(" "+t._s(s.decision)+" ")]),a("span",{staticStyle:{color:"#999","margin-left":"8px","font-size":"12px"}},[t._v(" "+t._s(t.$t("fastAnalysis.confidence"))+": "+t._s(s.confidence)+"% ")])],1),a("div",[a("a-button",{attrs:{type:"link",size:"small",icon:"eye"},on:{click:function(a){return t.viewHistoryResult(s)}}},[t._v(" "+t._s(t.$t("dashboard.analysis.modal.history.viewResult"))+" ")]),a("a-popconfirm",{attrs:{title:t.$t("dashboard.analysis.modal.history.deleteConfirm"),"ok-text":t.$t("common.confirm"),"cancel-text":t.$t("common.cancel")},on:{confirm:function(a){return t.deleteHistoryItem(s)}}},[a("a-button",{staticStyle:{color:"#ff4d4f"},attrs:{type:"link",size:"small",icon:"delete"}},[t._v(" "+t._s(t.$t("dashboard.analysis.modal.history.delete"))+" ")])],1)],1)])]),a("template",{slot:"description"},[a("div",{staticStyle:{color:"#666","font-size":"12px"}},[s.price?a("span",[t._v("$"+t._s(t.formatNumber(s.price)))]):t._e(),s.summary?a("span",{staticStyle:{"margin-left":"8px"}},[t._v(t._s(s.summary.substring(0,80))+t._s(s.summary.length>80?"...":""))]):t._e()]),s.created_at?a("div",{staticStyle:{color:"#999","font-size":"12px","margin-top":"4px"}},[t._v(" "+t._s(t.formatIsoTime(s.created_at))+" ")]):t._e()])],2)],1)}}])}),t.historyLoading||0!==t.historyList.length?t._e():a("a-empty",{attrs:{description:t.$t("dashboard.analysis.empty.noHistory")}})],1)],1)],1)},i=[function(){var t=this,a=t._self._c;return a("div",{staticClass:"indicator-box skeleton-box"},[a("span",{staticClass:"skeleton-text short"}),a("span",{staticClass:"skeleton-text"})])},function(){var t=this,a=t._self._c;return a("div",{staticClass:"indicator-box skeleton-box"},[a("span",{staticClass:"skeleton-text short"}),a("span",{staticClass:"skeleton-text"})])},function(){var t=this,a=t._self._c;return a("div",{staticClass:"indicator-box skeleton-box"},[a("span",{staticClass:"skeleton-text short"}),a("span",{staticClass:"skeleton-text"})])}],r=s(68285),n=s(21092),l=s(76959),o=s(17654),c=s(57888),d=(s(74423),s(95353)),u=s(55585),m=s(64118),h=s(76471),y="/api/fast-analysis";function p(t){return(0,h.Ay)({url:"".concat(y,"/analyze"),method:"post",data:t,timeout:3e5})}function v(t){return(0,h.Ay)({url:"".concat(y,"/history/all"),method:"get",params:t})}function f(t){return(0,h.Ay)({url:"".concat(y,"/history/").concat(t),method:"delete"})}function g(t){return(0,h.Ay)({url:"".concat(y,"/feedback"),method:"post",data:t})}var b=s(62618),_=function(){var t,a,s,e,i,r,n,l,o,c,d,u,m,h,y,p,v,f,g,b,_,k,C,S,A,w=this,$=w._self._c;return $("div",{staticClass:"fast-analysis-report",class:{"theme-dark":w.isDarkTheme}},[w.loading?$("div",{staticClass:"loading-container"},[$("div",{staticClass:"loading-content-pro"},[$("div",{staticClass:"loading-header"},[$("a-icon",{staticClass:"loading-icon-pro",attrs:{type:"thunderbolt"}}),$("span",{staticClass:"loading-title"},[w._v(w._s(w.$t("fastAnalysis.analyzing")))])],1),$("div",{staticClass:"progress-wrapper"},[$("a-progress",{attrs:{percent:w.progressPercent,showInfo:!1,strokeColor:"#1890ff",strokeWidth:8}}),$("span",{staticClass:"progress-text"},[w._v(w._s(w.formatProgress(w.progressPercent))+"%")])],1),$("div",{staticClass:"current-step"},[$("a-icon",{attrs:{type:"loading",spin:""}}),$("span",[w._v(w._s(w.currentStepText))])],1),$("div",{staticClass:"steps-list"},[$("div",{staticClass:"step-item",class:{done:w.step>1,active:1===w.step}},[$("span",{staticClass:"step-dot"}),$("span",{staticClass:"step-text"},[w._v(w._s(w.$t("fastAnalysis.step1")||"获取实时数据"))]),w.step>1?$("a-icon",{staticClass:"step-check",attrs:{type:"check"}}):w._e()],1),$("div",{staticClass:"step-item",class:{done:w.step>2,active:2===w.step}},[$("span",{staticClass:"step-dot"}),$("span",{staticClass:"step-text"},[w._v(w._s(w.$t("fastAnalysis.step2")||"计算技术指标"))]),w.step>2?$("a-icon",{staticClass:"step-check",attrs:{type:"check"}}):w._e()],1),$("div",{staticClass:"step-item",class:{done:w.step>3,active:3===w.step}},[$("span",{staticClass:"step-dot"}),$("span",{staticClass:"step-text"},[w._v(w._s(w.$t("fastAnalysis.step3")||"AI深度分析"))]),w.step>3?$("a-icon",{staticClass:"step-check",attrs:{type:"check"}}):w._e()],1),$("div",{staticClass:"step-item",class:{done:w.step>4,active:4===w.step}},[$("span",{staticClass:"step-dot"}),$("span",{staticClass:"step-text"},[w._v(w._s(w.$t("fastAnalysis.step4")||"生成报告"))]),w.step>4?$("a-icon",{staticClass:"step-check",attrs:{type:"check"}}):w._e()],1)]),$("div",{staticClass:"loading-footer"},[$("span",{staticClass:"elapsed-time"},[w._v(w._s(w.elapsedTimeText))])])])]):w.error?$("div",{staticClass:"error-container"},[$("a-result",{attrs:{status:"error",title:w.$t("fastAnalysis.error"),"sub-title":w.error},scopedSlots:w._u([{key:"extra",fn:function(){return[$("a-button",{attrs:{type:"primary"},on:{click:function(t){return w.$emit("retry")}}},[w._v(" "+w._s(w.$t("fastAnalysis.retry"))+" ")])]},proxy:!0}])})],1):w.result?$("div",{staticClass:"result-container"},[$("div",{staticClass:"decision-card",class:w.decisionClass},[$("div",{staticClass:"decision-main"},[$("div",{staticClass:"decision-badge"},[$("a-icon",{attrs:{type:w.decisionIcon}}),$("span",{staticClass:"decision-text"},[w._v(w._s(w.result.decision))])],1),$("div",{staticClass:"confidence-ring"},[$("a-progress",{attrs:{type:"circle",percent:w.result.confidence,width:80,strokeColor:w.confidenceColor},scopedSlots:w._u([{key:"format",fn:function(t){return[$("span",{staticClass:"confidence-value"},[w._v(w._s(t)+"%")])]}}])}),$("div",{staticClass:"confidence-label"},[w._v(w._s(w.$t("fastAnalysis.confidence")))])],1)]),$("div",{staticClass:"decision-summary"},[w._v(" "+w._s(w.result.summary)+" ")])]),$("div",{staticClass:"price-info-row"},[$("div",{staticClass:"price-card current"},[$("div",{staticClass:"price-label"},[w._v(w._s(w.$t("fastAnalysis.currentPrice")))]),$("div",{staticClass:"price-value"},[w._v("$"+w._s(w.formatPrice(null===(t=w.result.market_data)||void 0===t?void 0:t.current_price)))]),$("div",{staticClass:"price-change",class:(null===(a=w.result.market_data)||void 0===a?void 0:a.change_24h)>=0?"positive":"negative"},[w._v(" "+w._s((null===(s=w.result.market_data)||void 0===s?void 0:s.change_24h)>=0?"+":"")+w._s(w.formatNumber(null===(e=w.result.market_data)||void 0===e?void 0:e.change_24h,2))+"% ")])]),$("div",{staticClass:"price-card entry"},[$("div",{staticClass:"price-label"},[w._v(w._s(w.$t("fastAnalysis.entryPrice")))]),$("div",{staticClass:"price-value"},[w._v("$"+w._s(w.formatPrice(null===(i=w.result.trading_plan)||void 0===i?void 0:i.entry_price)))])]),$("div",{staticClass:"price-card stop"},[$("div",{staticClass:"price-label"},[w._v(w._s(w.$t("fastAnalysis.stopLoss")))]),$("div",{staticClass:"price-value negative"},[w._v("$"+w._s(w.formatPrice(null===(r=w.result.trading_plan)||void 0===r?void 0:r.stop_loss)))]),$("div",{staticClass:"price-hint"},[$("a-tooltip",{attrs:{title:w.$t("fastAnalysis.stopLossHint")}},[$("a-icon",{attrs:{type:"info-circle"}}),w._v(" "+w._s(w.$t("fastAnalysis.atrBased"))+" ")],1)],1)]),$("div",{staticClass:"price-card target"},[$("div",{staticClass:"price-label"},[w._v(w._s(w.$t("fastAnalysis.takeProfit")))]),$("div",{staticClass:"price-value positive"},[w._v("$"+w._s(w.formatPrice(null===(n=w.result.trading_plan)||void 0===n?void 0:n.take_profit)))]),$("div",{staticClass:"price-hint"},[$("a-tooltip",{attrs:{title:w.$t("fastAnalysis.takeProfitHint")}},[$("a-icon",{attrs:{type:"info-circle"}}),w._v(" "+w._s(w.$t("fastAnalysis.atrBased"))+" ")],1)],1)])]),$("div",{staticClass:"scores-row"},[$("div",{staticClass:"score-item"},[$("div",{staticClass:"score-header"},[$("a-icon",{attrs:{type:"line-chart"}}),$("span",[w._v(w._s(w.$t("fastAnalysis.technical")))])],1),$("a-progress",{attrs:{percent:(null===(l=w.result.scores)||void 0===l?void 0:l.technical)||50,strokeColor:w.getScoreColor(null===(o=w.result.scores)||void 0===o?void 0:o.technical),showInfo:!1}}),$("div",{staticClass:"score-value"},[w._v(w._s((null===(c=w.result.scores)||void 0===c?void 0:c.technical)||50))])],1),$("div",{staticClass:"score-item"},[$("div",{staticClass:"score-header"},[$("a-icon",{attrs:{type:"bank"}}),$("span",[w._v(w._s(w.$t("fastAnalysis.fundamental")))])],1),$("a-progress",{attrs:{percent:(null===(d=w.result.scores)||void 0===d?void 0:d.fundamental)||50,strokeColor:w.getScoreColor(null===(u=w.result.scores)||void 0===u?void 0:u.fundamental),showInfo:!1}}),$("div",{staticClass:"score-value"},[w._v(w._s((null===(m=w.result.scores)||void 0===m?void 0:m.fundamental)||50))])],1),$("div",{staticClass:"score-item"},[$("div",{staticClass:"score-header"},[$("a-icon",{attrs:{type:"heart"}}),$("span",[w._v(w._s(w.$t("fastAnalysis.sentiment")))])],1),$("a-progress",{attrs:{percent:(null===(h=w.result.scores)||void 0===h?void 0:h.sentiment)||50,strokeColor:w.getScoreColor(null===(y=w.result.scores)||void 0===y?void 0:y.sentiment),showInfo:!1}}),$("div",{staticClass:"score-value"},[w._v(w._s((null===(p=w.result.scores)||void 0===p?void 0:p.sentiment)||50))])],1),$("div",{staticClass:"score-item overall"},[$("div",{staticClass:"score-header"},[$("a-icon",{attrs:{type:"dashboard"}}),$("span",[w._v(w._s(w.$t("fastAnalysis.overall")))])],1),$("a-progress",{attrs:{percent:(null===(v=w.result.scores)||void 0===v?void 0:v.overall)||50,strokeColor:w.getScoreColor(null===(f=w.result.scores)||void 0===f?void 0:f.overall),showInfo:!1}}),$("div",{staticClass:"score-value"},[w._v(w._s((null===(g=w.result.scores)||void 0===g?void 0:g.overall)||50))])],1)]),w.result.detailed_analysis?$("div",{staticClass:"detailed-analysis"},[w.result.detailed_analysis.technical?$("div",{staticClass:"analysis-card technical"},[$("div",{staticClass:"analysis-card-header"},[$("a-icon",{attrs:{type:"line-chart"}}),$("span",[w._v(w._s(w.$t("fastAnalysis.technicalAnalysis")))]),$("a-tag",{attrs:{color:w.getScoreTagColor(null===(b=w.result.scores)||void 0===b?void 0:b.technical)}},[w._v(" "+w._s((null===(_=w.result.scores)||void 0===_?void 0:_.technical)||50)+"分 ")])],1),$("div",{staticClass:"analysis-card-content"},[w._v(" "+w._s(w.result.detailed_analysis.technical)+" ")])]):w._e(),w.result.detailed_analysis.fundamental?$("div",{staticClass:"analysis-card fundamental"},[$("div",{staticClass:"analysis-card-header"},[$("a-icon",{attrs:{type:"bank"}}),$("span",[w._v(w._s(w.$t("fastAnalysis.fundamentalAnalysis")))]),$("a-tag",{attrs:{color:w.getScoreTagColor(null===(k=w.result.scores)||void 0===k?void 0:k.fundamental)}},[w._v(" "+w._s((null===(C=w.result.scores)||void 0===C?void 0:C.fundamental)||50)+"分 ")])],1),$("div",{staticClass:"analysis-card-content"},[w._v(" "+w._s(w.result.detailed_analysis.fundamental)+" ")])]):w._e(),w.result.detailed_analysis.sentiment?$("div",{staticClass:"analysis-card sentiment"},[$("div",{staticClass:"analysis-card-header"},[$("a-icon",{attrs:{type:"heart"}}),$("span",[w._v(w._s(w.$t("fastAnalysis.sentimentAnalysis")))]),$("a-tag",{attrs:{color:w.getScoreTagColor(null===(S=w.result.scores)||void 0===S?void 0:S.sentiment)}},[w._v(" "+w._s((null===(A=w.result.scores)||void 0===A?void 0:A.sentiment)||50)+"分 ")])],1),$("div",{staticClass:"analysis-card-content"},[w._v(" "+w._s(w.result.detailed_analysis.sentiment)+" ")])]):w._e()]):w._e(),$("div",{staticClass:"analysis-details"},[$("div",{staticClass:"detail-section reasons"},[$("div",{staticClass:"section-title"},[$("a-icon",{attrs:{type:"bulb",theme:"twoTone",twoToneColor:"#52c41a"}}),$("span",[w._v(w._s(w.$t("fastAnalysis.keyReasons")))])],1),$("ul",{staticClass:"detail-list"},w._l(w.result.reasons,function(t,a){return $("li",{key:"r-"+a},[w._v(" "+w._s(t)+" ")])}),0)]),$("div",{staticClass:"detail-section risks"},[$("div",{staticClass:"section-title"},[$("a-icon",{attrs:{type:"warning",theme:"twoTone",twoToneColor:"#faad14"}}),$("span",[w._v(w._s(w.$t("fastAnalysis.risks")))])],1),$("ul",{staticClass:"detail-list"},w._l(w.result.risks,function(t,a){return $("li",{key:"k-"+a},[w._v(" "+w._s(t)+" ")])}),0)])]),w.result.indicators&&Object.keys(w.result.indicators).length>0?$("div",{staticClass:"indicators-section"},[$("div",{staticClass:"section-title"},[$("a-icon",{attrs:{type:"stock"}}),$("span",[w._v(w._s(w.$t("fastAnalysis.indicators")))])],1),$("div",{staticClass:"indicators-grid"},[w.result.indicators.rsi?$("div",{staticClass:"indicator-item"},[$("div",{staticClass:"indicator-name"},[w._v("RSI (14)")]),$("div",{staticClass:"indicator-value",class:w.getRsiClass(w.result.indicators.rsi.value)},[w._v(" "+w._s(w.formatNumber(w.result.indicators.rsi.value,1))+" ")]),$("div",{staticClass:"indicator-signal"},[w._v(w._s(w.translateSignal(w.result.indicators.rsi.signal)))])]):w._e(),w.result.indicators.macd?$("div",{staticClass:"indicator-item"},[$("div",{staticClass:"indicator-name"},[w._v("MACD")]),$("div",{staticClass:"indicator-value",class:"bullish"===w.result.indicators.macd.signal?"bullish":"bearish"===w.result.indicators.macd.signal?"bearish":""},[w._v(" "+w._s(w.translateTrend(w.result.indicators.macd.trend))+" ")]),$("div",{staticClass:"indicator-signal"},[w._v(w._s(w.translateSignal(w.result.indicators.macd.signal)))])]):w._e(),w.result.indicators.moving_averages?$("div",{staticClass:"indicator-item"},[$("div",{staticClass:"indicator-name"},[w._v(w._s(w.$t("fastAnalysis.maTrend")))]),$("div",{staticClass:"indicator-value",class:w.getMaTrendClass(w.result.indicators.moving_averages.trend)},[w._v(" "+w._s(w.translateTrend(w.result.indicators.moving_averages.trend))+" ")])]):w._e(),w.result.indicators.levels?$("div",{staticClass:"indicator-item"},[$("div",{staticClass:"indicator-name"},[w._v(w._s(w.$t("fastAnalysis.support")))]),$("div",{staticClass:"indicator-value"},[w._v("$"+w._s(w.formatPrice(w.result.indicators.levels.support)))])]):w._e(),w.result.indicators.levels?$("div",{staticClass:"indicator-item"},[$("div",{staticClass:"indicator-name"},[w._v(w._s(w.$t("fastAnalysis.resistance")))]),$("div",{staticClass:"indicator-value"},[w._v("$"+w._s(w.formatPrice(w.result.indicators.levels.resistance)))])]):w._e(),w.result.indicators.volatility?$("div",{staticClass:"indicator-item"},[$("div",{staticClass:"indicator-name"},[w._v(w._s(w.$t("fastAnalysis.volatility")))]),$("div",{staticClass:"indicator-value",class:w.getVolatilityClass(w.result.indicators.volatility.level)},[w._v(" "+w._s(w.translateVolatility(w.result.indicators.volatility.level))+" ("+w._s(w.result.indicators.volatility.pct)+"%) ")])]):w._e()])]):w._e(),$("div",{staticClass:"feedback-section"},[$("div",{staticClass:"feedback-question"},[w._v(w._s(w.$t("fastAnalysis.wasHelpful")))]),$("div",{staticClass:"feedback-buttons"},[$("a-button",{attrs:{type:"helpful"===w.userFeedback?"primary":"default",size:"small",loading:"helpful"===w.feedbackLoading},on:{click:function(t){return w.submitFeedback("helpful")}}},[$("a-icon",{attrs:{type:"like"}}),w._v(" "+w._s(w.$t("fastAnalysis.helpful"))+" ")],1),$("a-button",{attrs:{type:"not_helpful"===w.userFeedback?"danger":"default",size:"small",loading:"not_helpful"===w.feedbackLoading},on:{click:function(t){return w.submitFeedback("not_helpful")}}},[$("a-icon",{attrs:{type:"dislike"}}),w._v(" "+w._s(w.$t("fastAnalysis.notHelpful"))+" ")],1)],1),$("div",{staticClass:"analysis-meta"},[$("span",[w._v(w._s(w.$t("fastAnalysis.analysisTime"))+": "+w._s(w.result.analysis_time_ms)+"ms")]),w.result.memory_id?$("span",[w._v("ID: #"+w._s(w.result.memory_id))]):w._e()])])]):$("div",{staticClass:"empty-container"},[$("div",{staticClass:"empty-content"},[$("a-icon",{staticClass:"empty-icon",attrs:{type:"radar-chart"}}),$("div",{staticClass:"empty-title"},[w._v(w._s(w.$t("fastAnalysis.selectSymbol")))]),$("div",{staticClass:"empty-hint"},[w._v(w._s(w.$t("fastAnalysis.selectHint")))])],1)])])},k=[],C={name:"FastAnalysisReport",props:{result:{type:Object,default:null},loading:{type:Boolean,default:!1},error:{type:String,default:null}},data:function(){return{userFeedback:null,feedbackLoading:null,progress:0,elapsedSeconds:0,mainTimer:null}},computed:(0,c.A)((0,c.A)({},(0,d.aH)({navTheme:function(t){return t.app.theme}})),{},{isDarkTheme:function(){return"dark"===this.navTheme||"realdark"===this.navTheme},progressPercent:function(){return Math.round(10*this.progress)/10},step:function(){return this.progress<25?1:this.progress<50?2:this.progress<75?3:4},currentStepText:function(){var t={1:this.$t("fastAnalysis.step1")||"获取实时数据",2:this.$t("fastAnalysis.step2")||"计算技术指标",3:this.$t("fastAnalysis.step3")||"AI深度分析",4:this.$t("fastAnalysis.step4")||"生成报告"};return t[this.step]||this.$t("fastAnalysis.preparing")||"准备中..."},elapsedTimeText:function(){if(this.elapsedSeconds<60)return"".concat(this.elapsedSeconds,"s");var t=Math.floor(this.elapsedSeconds/60),a=this.elapsedSeconds%60;return"".concat(t,"m ").concat(a,"s")},decisionClass:function(){if(!this.result)return"";var t=this.result.decision;return"BUY"===t?"decision-buy":"SELL"===t?"decision-sell":"decision-hold"},decisionIcon:function(){if(!this.result)return"question";var t=this.result.decision;return"BUY"===t?"arrow-up":"SELL"===t?"arrow-down":"pause"},confidenceColor:function(){var t,a=(null===(t=this.result)||void 0===t?void 0:t.confidence)||50;return a>=70?"#52c41a":a>=50?"#1890ff":"#faad14"}}),watch:{result:function(){this.userFeedback=null},loading:{handler:function(t){t?this.startProgressTimer():this.stopProgressTimer()},immediate:!0}},mounted:function(){this.loading&&this.startProgressTimer()},beforeDestroy:function(){this.stopProgressTimer()},methods:{formatPrice:function(t){if(void 0===t||null===t)return"--";var a=parseFloat(t);return isNaN(a)?"--":a<1?a.toFixed(6):a<100?a.toFixed(4):a<1e4?a.toFixed(2):a.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})},formatNumber:function(t){var a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:2;if(void 0===t||null===t)return"--";var s=parseFloat(t);return isNaN(s)?"--":s.toFixed(a)},formatProgress:function(t){var a=parseFloat(t)||0;return a%1===0?a.toFixed(0):a.toFixed(1)},getScoreColor:function(t){return t>=70?"#52c41a":t>=50?"#1890ff":t>=30?"#faad14":"#ff4d4f"},getScoreTagColor:function(t){return t>=70?"green":t>=50?"blue":t>=30?"orange":"red"},getRsiClass:function(t){return t<30?"oversold":t>70?"overbought":""},getMaTrendClass:function(t){return t?t.includes("uptrend")||t.includes("strong_uptrend")?"bullish":t.includes("downtrend")||t.includes("strong_downtrend")?"bearish":"":""},getVolatilityClass:function(t){return"high"===t?"high-volatility":"low"===t?"low-volatility":""},translateSignal:function(t){if(!t)return"--";var a="fastAnalysis.signal.".concat(t),s=this.$t(a);return s===a?t:s},translateTrend:function(t){if(!t)return"--";var a="fastAnalysis.trend.".concat(t),s=this.$t(a);return s===a?t:s},translateVolatility:function(t){if(!t)return"--";var a="fastAnalysis.volatilityLevel.".concat(t),s=this.$t(a);return s===a?t:s},submitFeedback:function(t){var a=this;return(0,o.A)((0,l.A)().m(function s(){var e;return(0,l.A)().w(function(s){while(1)switch(s.p=s.n){case 0:if(null!==(e=a.result)&&void 0!==e&&e.memory_id){s.n=1;break}return a.$message.warning(a.$t("fastAnalysis.feedbackUnavailable")||"反馈功能暂不可用,请刷新后重试"),s.a(2);case 1:return a.feedbackLoading=t,s.p=2,s.n=3,g({memory_id:a.result.memory_id,feedback:t});case 3:a.userFeedback=t,a.$message.success(a.$t("fastAnalysis.feedbackThanks")),s.n=5;break;case 4:s.p=4,s.v,a.$message.error(a.$t("fastAnalysis.feedbackFailed"));case 5:return s.p=5,a.feedbackLoading=null,s.f(5);case 6:return s.a(2)}},s,null,[[2,4,5,6]])}))()},startProgressTimer:function(){var t=this;this.stopProgressTimer(),this.progress=0,this.elapsedSeconds=0;var a=Date.now();this.mainTimer=window.setInterval(function(){t.elapsedSeconds=Math.floor((Date.now()-a)/1e3),t.progress<75?t.progress=Math.min(t.progress+1,75):t.progress<90?t.progress=Math.min(t.progress+.5,90):t.progress<95&&(t.progress=Math.min(t.progress+.2,95))},100)},stopProgressTimer:function(){this.mainTimer&&(window.clearInterval(this.mainTimer),this.mainTimer=null),this.progress=0,this.elapsedSeconds=0}}},S=C,A=s(845),w=(0,A.A)(S,_,k,!1,null,"110dde64",null),$=w.exports,x={name:"Analysis",props:{embedded:{type:Boolean,default:!1},presetSymbol:{type:String,default:""},autoAnalyzeSignal:{type:Number,default:0}},components:{FastAnalysisReport:$},data:function(){return{loadingMarket:!1,heatmapType:"crypto",marketData:{fearGreed:null,vix:null,dxy:null,indices:[],heatmap:{crypto:[],commodities:[],sectors:[],forex:[]},calendar:[]},loadingSentiment:!1,loadingIndices:!1,loadingHeatmap:!1,loadingCalendar:!1,watchlistPriceTimer:null,watchlistPrices:{},localUserInfo:{},loadingUserInfo:!1,userId:1,watchlist:[],loadingWatchlist:!1,showAddStockModal:!1,addingStock:!1,selectedSymbol:void 0,analyzing:!1,analysisResult:null,analysisError:null,showHistoryModal:!1,historyList:[],historyLoading:!1,historyPage:1,historyPageSize:20,historyTotal:0,marketTypes:[],selectedMarketTab:"",symbolSearchKeyword:"",symbolSearchResults:[],searchingSymbols:!1,hotSymbols:[],loadingHotSymbols:!1,selectedSymbolForAdd:null,searchTimer:null,hasSearched:!1}},computed:(0,c.A)((0,c.A)((0,c.A)({},(0,d.L8)(["userInfo"])),(0,d.aH)({navTheme:function(t){return t.app.theme},primaryColor:function(t){return t.app.color||"#1890ff"}})),{},{isDarkTheme:function(){return"dark"===this.navTheme||"realdark"===this.navTheme},isZhLocale:function(){return"zh-CN"===this.$i18n.locale},currentHeatmap:function(){return this.marketData.heatmap[this.heatmapType]||[]},storeUserInfo:function(){return this.userInfo||{}},mergedUserInfo:function(){return this.localUserInfo&&this.localUserInfo.email?this.localUserInfo:this.storeUserInfo}}),created:function(){this.loadUserInfo(),this.loadMarketTypes(),this.loadWatchlist(),this.loadMarketData()},mounted:function(){this.startWatchlistPriceRefresh()},beforeDestroy:function(){this.watchlistPriceTimer&&clearInterval(this.watchlistPriceTimer)},methods:{filterSymbolOption:function(t,a){var s,e=(null===(s=a.componentOptions)||void 0===s||null===(s=s.propsData)||void 0===s?void 0:s.value)||"";return"__add_stock_option__"===e||e.toLowerCase().includes(t.toLowerCase())},handleSymbolChange:function(t){var a=this;if("__add_stock_option__"===t)return this.showAddStockModal=!0,void this.$nextTick(function(){a.selectedSymbol=void 0});this.selectedSymbol=t,this.analysisResult=null,this.analysisError=null,this.$emit("symbol-change",t)},selectWatchlistItem:function(t){this.selectedSymbol="".concat(t.market,":").concat(t.symbol),this.analysisResult=null,this.analysisError=null,this.$emit("symbol-change",this.selectedSymbol)},loadMarketData:function(){var t=this;return(0,o.A)((0,l.A)().m(function a(){return(0,l.A)().w(function(a){while(1)switch(a.n){case 0:t.loadingMarket=!0,t.loadSentimentData(),t.loadIndicesData(),t.loadHeatmapData(),t.loadCalendarData();case 1:return a.a(2)}},a)}))()},loadSentimentData:function(){var t=this;return(0,o.A)((0,l.A)().m(function a(){var s,e,i,r;return(0,l.A)().w(function(a){while(1)switch(a.p=a.n){case 0:return t.loadingSentiment=!0,a.p=1,a.n=2,(0,b.EF)();case 2:s=a.v,1===(null===s||void 0===s?void 0:s.code)&&null!==s&&void 0!==s&&s.data&&(t.marketData.fearGreed=(null===(e=s.data.fear_greed)||void 0===e?void 0:e.value)||null,t.marketData.vix=(null===(i=s.data.vix)||void 0===i?void 0:i.value)||null,t.marketData.dxy=(null===(r=s.data.dxy)||void 0===r?void 0:r.value)||null),a.n=4;break;case 3:a.p=3,a.v;case 4:return a.p=4,t.loadingSentiment=!1,t.checkAllLoaded(),a.f(4);case 5:return a.a(2)}},a,null,[[1,3,4,5]])}))()},loadIndicesData:function(){var t=this;return(0,o.A)((0,l.A)().m(function a(){var s;return(0,l.A)().w(function(a){while(1)switch(a.p=a.n){case 0:return t.loadingIndices=!0,a.p=1,a.n=2,(0,b.yI)();case 2:s=a.v,1===(null===s||void 0===s?void 0:s.code)&&null!==s&&void 0!==s&&s.data&&(t.marketData.indices=s.data.indices||[]),a.n=4;break;case 3:a.p=3,a.v;case 4:return a.p=4,t.loadingIndices=!1,t.checkAllLoaded(),a.f(4);case 5:return a.a(2)}},a,null,[[1,3,4,5]])}))()},loadHeatmapData:function(){var t=this;return(0,o.A)((0,l.A)().m(function a(){var s;return(0,l.A)().w(function(a){while(1)switch(a.p=a.n){case 0:return t.loadingHeatmap=!0,a.p=1,a.n=2,(0,b.f$)();case 2:s=a.v,1===(null===s||void 0===s?void 0:s.code)&&null!==s&&void 0!==s&&s.data&&(t.marketData.heatmap={crypto:s.data.crypto||[],commodities:s.data.commodities||[],sectors:s.data.sectors||[],forex:s.data.forex||[]}),a.n=4;break;case 3:a.p=3,a.v;case 4:return a.p=4,t.loadingHeatmap=!1,t.checkAllLoaded(),a.f(4);case 5:return a.a(2)}},a,null,[[1,3,4,5]])}))()},loadCalendarData:function(){var t=this;return(0,o.A)((0,l.A)().m(function a(){var s;return(0,l.A)().w(function(a){while(1)switch(a.p=a.n){case 0:return t.loadingCalendar=!0,a.p=1,a.n=2,(0,b.kF)();case 2:s=a.v,1===(null===s||void 0===s?void 0:s.code)&&(t.marketData.calendar=s.data||[]),a.n=4;break;case 3:a.p=3,a.v;case 4:return a.p=4,t.loadingCalendar=!1,t.checkAllLoaded(),a.f(4);case 5:return a.a(2)}},a,null,[[1,3,4,5]])}))()},checkAllLoaded:function(){this.loadingSentiment||this.loadingIndices||this.loadingHeatmap||this.loadingCalendar||(this.loadingMarket=!1)},getFearGreedClass:function(t){return t?t<=25?"extreme-fear":t<=45?"fear":t<=55?"neutral":t<=75?"greed":"extreme-greed":""},getVixLevel:function(t){return t?t<15?"low":t<25?"medium":"high":""},formatNum:function(t){var a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:2;return void 0===t||null===t||isNaN(t)?"--":Number(t).toFixed(a)},getHeatmapStyle:function(t){var a=parseFloat(t)||0,s=Math.min(Math.abs(a)/5,1);return a>=0?{background:"rgba(34, 197, 94, ".concat(.15+.6*s,")"),color:a>2?"#fff":"#166534"}:{background:"rgba(239, 68, 68, ".concat(.15+.6*s,")"),color:a<-2?"#fff":"#991b1b"}},getCountryFlag:function(t){var a={US:"🇺🇸",CN:"🇨🇳",EU:"🇪🇺",JP:"🇯🇵",UK:"🇬🇧",DE:"🇩🇪",AU:"🇦🇺",CA:"🇨🇦"};return a[t]||"🌍"},formatCalendarDate:function(t){if(!t)return"";try{var a=new Date(t),s=new Date,e=new Date(s);if(e.setDate(e.getDate()+1),a.toDateString()===s.toDateString())return this.isZhLocale?"今天":"Today";if(a.toDateString()===e.toDateString())return this.isZhLocale?"明天":"Tmrw";var i=a.getMonth()+1,r=a.getDate();return"".concat(i,"/").concat(r)}catch(n){return t}},formatPrice:function(t){return t?t>=1e4?(t/1e3).toFixed(1)+"K":t>=1e3?t.toFixed(0):t.toFixed(2):"--"},formatHeatmapPrice:function(t){return t?t>=1e4?"$"+(t/1e3).toFixed(1)+"K":t>=1e3?"$"+t.toFixed(0):t>=1?"$"+t.toFixed(2):"$"+t.toFixed(4):""},getHeatmapName:function(t){return"sectors"===this.heatmapType||"commodities"===this.heatmapType||"forex"===this.heatmapType?this.isZhLocale?t.name_cn||t.name:t.name_en||t.name:t.name},getImpactClass:function(t){return t.actual_impact||t.expected_impact||"neutral"},getMarketColor:function(t){var a={USStock:"green",Crypto:"purple",Forex:"gold",Futures:"cyan"};return a[t]||"default"},getCurrencySymbol:function(t){return"$"},startFastAnalysis:function(){var t=this;return(0,o.A)((0,l.A)().m(function a(){var s,e,i,r,o,c,d,u;return(0,l.A)().w(function(a){while(1)switch(a.p=a.n){case 0:if(!t.analyzing){a.n=1;break}return a.a(2);case 1:if(t.selectedSymbol){a.n=2;break}return t.$message.warning(t.$t("dashboard.analysis.message.selectSymbol")),a.a(2);case 2:return t.analyzing=!0,t.analysisError=null,s=t.selectedSymbol.split(":"),e=(0,n.A)(s,2),i=e[0],r=e[1],o=t.$store.getters.lang||"zh-CN",a.p=3,a.n=4,p({market:i,symbol:r,language:o,timeframe:"1D"});case 4:if(c=a.v,!c||1!==c.code||!c.data){a.n=5;break}t.analysisResult=c.data,t.$message.success(t.$t("dashboard.analysis.message.analysisComplete")),a.n=6;break;case 5:throw new Error((null===c||void 0===c?void 0:c.msg)||"分析失败");case 6:a.n=8;break;case 7:a.p=7,u=a.v,t.analysisError=(null===u||void 0===u||null===(d=u.response)||void 0===d||null===(d=d.data)||void 0===d?void 0:d.msg)||(null===u||void 0===u?void 0:u.message)||t.$t("dashboard.analysis.message.analysisFailed"),t.$message.error(t.analysisError);case 8:return a.p=8,t.analyzing=!1,a.f(8);case 9:return a.a(2)}},a,null,[[3,7,8,9]])}))()},loadHistoryList:function(){var t=this;return(0,o.A)((0,l.A)().m(function a(){var s;return(0,l.A)().w(function(a){while(1)switch(a.p=a.n){case 0:return t.historyLoading=!0,a.p=1,a.n=2,v({page:t.historyPage,pagesize:t.historyPageSize});case 2:s=a.v,s&&1===s.code&&s.data&&(t.historyList=s.data.list||[],t.historyTotal=s.data.total||0),a.n=4;break;case 3:a.p=3,a.v,t.$message.error(t.$t("dashboard.analysis.message.loadHistoryFailed")||"加载历史记录失败");case 4:return a.p=4,t.historyLoading=!1,a.f(4);case 5:return a.a(2)}},a,null,[[1,3,4,5]])}))()},viewHistoryResult:function(t){var a=this;return(0,o.A)((0,l.A)().m(function s(){return(0,l.A)().w(function(s){while(1)switch(s.n){case 0:if(!t.full_result){s.n=1;break}return a.analysisResult=t.full_result,a.selectedSymbol="".concat(t.market,":").concat(t.symbol),a.showHistoryModal=!1,s.a(2);case 1:a.analysisResult={decision:t.decision,confidence:t.confidence,summary:t.summary,market_data:{current_price:t.price,change_24h:0},trading_plan:{entry_price:t.price,stop_loss:.95*t.price,take_profit:1.05*t.price},scores:t.scores||{},reasons:t.reasons||[],risks:[],indicators:t.indicators||{},memory_id:t.id,analysis_time_ms:0},a.selectedSymbol="".concat(t.market,":").concat(t.symbol),a.showHistoryModal=!1;case 2:return s.a(2)}},s)}))()},deleteHistoryItem:function(t){var a=this;return(0,o.A)((0,l.A)().m(function s(){var e;return(0,l.A)().w(function(s){while(1)switch(s.p=s.n){case 0:return s.p=0,s.n=1,f(t.id);case 1:e=s.v,e&&1===e.code?(a.$message.success(a.$t("dashboard.analysis.message.deleteSuccess")),a.loadHistoryList()):a.$message.error((null===e||void 0===e?void 0:e.msg)||a.$t("dashboard.analysis.message.deleteFailed")),s.n=3;break;case 2:s.p=2,s.v,a.$message.error(a.$t("dashboard.analysis.message.deleteFailed"));case 3:return s.a(2)}},s,null,[[0,2]])}))()},formatTime:function(t){if(!t)return"-";var a=new Date(1e3*t);return a.toLocaleString("zh-CN")},formatIsoTime:function(t){if(!t)return"-";var a=new Date(t);return a.toLocaleString("zh-CN")},getStatusColor:function(t){var a={pending:"orange",processing:"blue",completed:"green",failed:"red"};return a[t]||"default"},getStatusText:function(t){var a={pending:"dashboard.analysis.status.pending",processing:"dashboard.analysis.status.processing",completed:"dashboard.analysis.status.completed",failed:"dashboard.analysis.status.failed"},s=a[t];return s?this.$t(s):t},loadUserInfo:function(){var t=this;return(0,o.A)((0,l.A)().m(function a(){var s;return(0,l.A)().w(function(a){while(1)switch(a.p=a.n){case 0:if(t.loadingUserInfo=!0,a.p=1,!t.storeUserInfo||!t.storeUserInfo.email){a.n=2;break}return t.localUserInfo=t.storeUserInfo,t.userId=t.storeUserInfo.id,t.loadingUserInfo=!1,t.loadWatchlist(),a.a(2);case 2:return a.n=3,(0,u.ug)();case 3:s=a.v,s&&1===s.code&&s.data&&(t.localUserInfo=s.data,t.userId=s.data.id,t.$store.commit("SET_INFO",s.data),t.loadWatchlist()),a.n=5;break;case 4:a.p=4,a.v;case 5:return a.p=5,t.loadingUserInfo=!1,a.f(5);case 6:return a.a(2)}},a,null,[[1,4,5,6]])}))()},loadWatchlist:function(){var t=this;return(0,o.A)((0,l.A)().m(function a(){var s;return(0,l.A)().w(function(a){while(1)switch(a.p=a.n){case 0:if(t.userId){a.n=1;break}return a.a(2);case 1:return t.loadingWatchlist=!0,a.p=2,a.n=3,(0,m.Qo)({userid:t.userId});case 3:if(s=a.v,!s||1!==s.code||!s.data){a.n=4;break}return t.watchlist=s.data.map(function(t){return(0,c.A)((0,c.A)({},t),{},{price:0,change:0,changePercent:0})}),a.n=4,t.loadWatchlistPrices();case 4:a.n=6;break;case 5:a.p=5,a.v;case 6:return a.p=6,t.loadingWatchlist=!1,a.f(6);case 7:return a.a(2)}},a,null,[[2,5,6,7]])}))()},loadWatchlistPrices:function(){var t=this;return(0,o.A)((0,l.A)().m(function a(){var s,e,i,r;return(0,l.A)().w(function(a){while(1)switch(a.p=a.n){case 0:if(t.watchlist&&0!==t.watchlist.length){a.n=1;break}return a.a(2);case 1:return a.p=1,s=t.watchlist.map(function(t){return{market:t.market,symbol:t.symbol}}),a.n=2,(0,m.ms)({watchlist:s});case 2:e=a.v,e&&1===e.code&&e.data&&(i={},r={},e.data.forEach(function(t){i["".concat(t.market,"-").concat(t.symbol)]=t,r["".concat(t.market,":").concat(t.symbol)]={price:t.price||0,change:t.changePercent||0}}),t.watchlistPrices=r,t.watchlist=t.watchlist.map(function(t){var a="".concat(t.market,"-").concat(t.symbol),s=i[a];return s?(0,c.A)((0,c.A)({},t),{},{price:s.price||0,change:s.change||0,changePercent:s.changePercent||0}):t})),a.n=4;break;case 3:a.p=3,a.v;case 4:return a.a(2)}},a,null,[[1,3]])}))()},startWatchlistPriceRefresh:function(){var t=this;this.watchlistPriceTimer=setInterval(function(){t.watchlist&&t.watchlist.length>0&&t.loadWatchlistPrices()},3e4),this.watchlist&&this.watchlist.length>0&&this.loadWatchlistPrices()},handleAddStock:function(){var t=this;return(0,o.A)((0,l.A)().m(function a(){var s,e,i,r,n,o,c;return(0,l.A)().w(function(a){while(1)switch(a.p=a.n){case 0:if(s="",e="",i="",!t.selectedSymbolForAdd){a.n=1;break}s=t.selectedSymbolForAdd.market,e=t.selectedSymbolForAdd.symbol.toUpperCase(),i=t.selectedSymbolForAdd.name||"",a.n=4;break;case 1:if(!t.symbolSearchKeyword||!t.symbolSearchKeyword.trim()){a.n=3;break}if(t.selectedMarketTab){a.n=2;break}return t.$message.warning(t.$t("dashboard.analysis.modal.addStock.pleaseSelectMarket")),a.a(2);case 2:s=t.selectedMarketTab,e=t.symbolSearchKeyword.trim().toUpperCase(),i="",a.n=4;break;case 3:return t.$message.warning(t.$t("dashboard.analysis.modal.addStock.pleaseSelectOrEnterSymbol")),a.a(2);case 4:return t.addingStock=!0,a.p=5,a.n=6,(0,m.dp)({userid:t.userId,market:s,symbol:e,name:i});case 6:if(r=a.v,!r||1!==r.code){a.n=8;break}return t.$message.success(t.$t("dashboard.analysis.message.addStockSuccess")),t.handleCloseAddStockModal(),a.n=7,t.loadWatchlist();case 7:a.n=9;break;case 8:t.$message.error((null===r||void 0===r?void 0:r.msg)||t.$t("dashboard.analysis.message.addStockFailed"));case 9:a.n=11;break;case 10:a.p=10,c=a.v,o=(null===c||void 0===c||null===(n=c.response)||void 0===n||null===(n=n.data)||void 0===n?void 0:n.msg)||(null===c||void 0===c?void 0:c.message)||t.$t("dashboard.analysis.message.addStockFailed"),t.$message.error(o);case 11:return a.p=11,t.addingStock=!1,a.f(11);case 12:return a.a(2)}},a,null,[[5,10,11,12]])}))()},handleCloseAddStockModal:function(){this.showAddStockModal=!1,this.selectedSymbolForAdd=null,this.symbolSearchKeyword="",this.symbolSearchResults=[],this.hasSearched=!1,this.selectedMarketTab=this.marketTypes.length>0?this.marketTypes[0].value:""},handleMarketTabChange:function(t){this.selectedMarketTab=t,this.symbolSearchKeyword="",this.symbolSearchResults=[],this.selectedSymbolForAdd=null,this.hasSearched=!1,this.loadHotSymbols(t)},handleSymbolSearchInput:function(t){var a=this,s=t.target.value;if(this.symbolSearchKeyword=s,this.searchTimer&&clearTimeout(this.searchTimer),!s||""===s.trim())return this.symbolSearchResults=[],this.hasSearched=!1,void(this.selectedSymbolForAdd=null);this.searchTimer=setTimeout(function(){a.searchSymbolsInModal(s)},500)},handleSearchOrInput:function(t){t&&t.trim()&&(this.selectedMarketTab?this.symbolSearchResults.length>0||(this.hasSearched&&0===this.symbolSearchResults.length?this.handleDirectAdd():this.searchSymbolsInModal(t)):this.$message.warning(this.$t("dashboard.analysis.modal.addStock.pleaseSelectMarket")))},searchSymbolsInModal:function(t){var a=this;return(0,o.A)((0,l.A)().m(function s(){var e;return(0,l.A)().w(function(s){while(1)switch(s.p=s.n){case 0:if(t&&""!==t.trim()){s.n=1;break}return a.symbolSearchResults=[],a.hasSearched=!1,s.a(2);case 1:if(a.selectedMarketTab){s.n=2;break}return a.$message.warning(a.$t("dashboard.analysis.modal.addStock.pleaseSelectMarket")),s.a(2);case 2:return a.searchingSymbols=!0,a.hasSearched=!0,s.p=3,s.n=4,(0,m._3)({market:a.selectedMarketTab,keyword:t.trim(),limit:20});case 4:e=s.v,e&&1===e.code&&e.data&&e.data.length>0?a.symbolSearchResults=e.data:(a.symbolSearchResults=[],a.selectedSymbolForAdd={market:a.selectedMarketTab,symbol:t.trim().toUpperCase(),name:""}),s.n=6;break;case 5:s.p=5,s.v,a.symbolSearchResults=[],a.selectedSymbolForAdd={market:a.selectedMarketTab,symbol:t.trim().toUpperCase(),name:""};case 6:return s.p=6,a.searchingSymbols=!1,s.f(6);case 7:return s.a(2)}},s,null,[[3,5,6,7]])}))()},handleDirectAdd:function(){this.symbolSearchKeyword&&this.symbolSearchKeyword.trim()?this.selectedMarketTab?this.selectedSymbolForAdd={market:this.selectedMarketTab,symbol:this.symbolSearchKeyword.trim().toUpperCase(),name:""}:this.$message.warning(this.$t("dashboard.analysis.modal.addStock.pleaseSelectMarket")):this.$message.warning(this.$t("dashboard.analysis.modal.addStock.pleaseEnterSymbol"))},selectSymbol:function(t){this.selectedSymbolForAdd={market:t.market,symbol:t.symbol,name:t.name||t.symbol}},loadHotSymbols:function(t){var a=this;return(0,o.A)((0,l.A)().m(function s(){var e;return(0,l.A)().w(function(s){while(1)switch(s.p=s.n){case 0:if(t||(t=a.selectedMarketTab||(a.marketTypes.length>0?a.marketTypes[0].value:"")),t){s.n=1;break}return s.a(2);case 1:return a.loadingHotSymbols=!0,s.p=2,s.n=3,(0,m.z6)({market:t,limit:10});case 3:e=s.v,e&&1===e.code&&e.data?a.hotSymbols=e.data:a.hotSymbols=[],s.n=5;break;case 4:s.p=4,s.v,a.hotSymbols=[];case 5:return s.p=5,a.loadingHotSymbols=!1,s.f(5);case 6:return s.a(2)}},s,null,[[2,4,5,6]])}))()},removeFromWatchlist:function(t){var a=arguments,s=this;return(0,o.A)((0,l.A)().m(function e(){var i,n,o;return(0,l.A)().w(function(e){while(1)switch(e.p=e.n){case 0:if(s.userId){e.n=1;break}return e.a(2);case 1:return i="object"===(0,r.A)(t)?t.symbol:t,n="object"===(0,r.A)(t)?t.market:a[1],e.p=2,e.n=3,(0,m.mk)({userid:s.userId,symbol:i,market:n});case 3:if(o=e.v,!o||1!==o.code){e.n=5;break}return s.$message.success(s.$t("dashboard.analysis.message.removeStockSuccess")),e.n=4,s.loadWatchlist();case 4:e.n=6;break;case 5:s.$message.error((null===o||void 0===o?void 0:o.msg)||s.$t("dashboard.analysis.message.removeStockFailed"));case 6:e.n=8;break;case 7:e.p=7,e.v,s.$message.error(s.$t("dashboard.analysis.message.removeStockFailed"));case 8:return e.a(2)}},e,null,[[2,7]])}))()},getMarketName:function(t){return this.$t("dashboard.analysis.market.".concat(t))||t},formatNumber:function(t){return"string"===typeof t?t:t.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})},loadMarketTypes:function(){var t=this;return(0,o.A)((0,l.A)().m(function a(){var s;return(0,l.A)().w(function(a){while(1)switch(a.p=a.n){case 0:return a.p=0,a.n=1,(0,m.iO)();case 1:s=a.v,s&&1===s.code&&s.data&&Array.isArray(s.data)?t.marketTypes=s.data.map(function(t){return{value:t.value,i18nKey:t.i18nKey||"dashboard.analysis.market.".concat(t.value)}}):t.marketTypes=[{value:"USStock",i18nKey:"dashboard.analysis.market.USStock"},{value:"Crypto",i18nKey:"dashboard.analysis.market.Crypto"},{value:"Forex",i18nKey:"dashboard.analysis.market.Forex"},{value:"Futures",i18nKey:"dashboard.analysis.market.Futures"}],a.n=3;break;case 2:a.p=2,a.v,t.marketTypes=[{value:"USStock",i18nKey:"dashboard.analysis.market.USStock"},{value:"Crypto",i18nKey:"dashboard.analysis.market.Crypto"},{value:"Forex",i18nKey:"dashboard.analysis.market.Forex"},{value:"Futures",i18nKey:"dashboard.analysis.market.Futures"}];case 3:t.marketTypes.length>0&&!t.selectedMarketTab&&(t.selectedMarketTab=t.marketTypes[0].value);case 4:return a.a(2)}},a,null,[[0,2]])}))()}},watch:{presetSymbol:function(t){t&&t!==this.selectedSymbol&&(this.selectedSymbol=t,this.analysisResult=null,this.analysisError=null)},autoAnalyzeSignal:function(t){var a=this;t&&(this.presetSymbol&&this.presetSymbol!==this.selectedSymbol&&(this.selectedSymbol=this.presetSymbol),this.$nextTick(function(){a.startFastAnalysis()}))},showAddStockModal:function(t){t?(this.marketTypes.length>0&&!this.selectedMarketTab&&(this.selectedMarketTab=this.marketTypes[0].value),this.selectedMarketTab&&this.loadHotSymbols(this.selectedMarketTab)):(this.selectedSymbolForAdd=null,this.symbolSearchKeyword="",this.symbolSearchResults=[],this.hasSearched=!1,this.searchTimer&&(clearTimeout(this.searchTimer),this.searchTimer=null))}}},T=x,F=(0,A.A)(T,e,i,!1,null,"76a3e064",null),M=F.exports},62618:function(t,a,s){s.d(a,{EF:function(){return o},f$:function(){return n},kF:function(){return l},r9:function(){return c},yI:function(){return r}});var e=s(76471),i="/api/global-market";function r(){return(0,e.Ay)({url:"".concat(i,"/overview"),method:"get"})}function n(){return(0,e.Ay)({url:"".concat(i,"/heatmap"),method:"get"})}function l(){return(0,e.Ay)({url:"".concat(i,"/calendar"),method:"get"})}function o(){return(0,e.Ay)({url:"".concat(i,"/sentiment"),method:"get"})}function c(t){return(0,e.Ay)({url:"".concat(i,"/opportunities"),method:"get",params:t})}},64118:function(t,a,s){s.d(a,{Qo:function(){return r},_3:function(){return d},dp:function(){return n},iO:function(){return c},mk:function(){return l},ms:function(){return o},z6:function(){return u}});var e=s(76471),i={GetWatchlist:"/api/market/watchlist/get",AddWatchlist:"/api/market/watchlist/add",RemoveWatchlist:"/api/market/watchlist/remove",GetWatchlistPrices:"/api/market/watchlist/prices",MultiAnalysis:"/api/analysis/multiAnalysis",CreateAnalysisTask:"/api/analysis/createTask",GetAnalysisTaskStatus:"/api/analysis/getTaskStatus",GetAnalysisHistoryList:"/api/analysis/getHistoryList",DeleteAnalysisTask:"/api/analysis/deleteTask",ReflectAnalysis:"/api/analysis/reflect",ChatMessage:"/api/ai/chat/message",GetChatHistory:"/api/ai/chat/history",SaveChatHistory:"/api/ai/chat/history/save",GetConfig:"/api/market/config",GetMenuFooterConfig:"/api/market/menuFooterConfig",GetMarketTypes:"/api/market/types",SearchSymbols:"/api/market/symbols/search",GetHotSymbols:"/api/market/symbols/hot"};function r(t){return(0,e.Ay)({url:i.GetWatchlist,method:"get",params:t})}function n(t){return(0,e.Ay)({url:i.AddWatchlist,method:"post",data:t})}function l(t){return(0,e.Ay)({url:i.RemoveWatchlist,method:"post",data:t})}function o(t){return(0,e.Ay)({url:i.GetWatchlistPrices,method:"get",params:{watchlist:JSON.stringify(t.watchlist||[])}})}function c(){return(0,e.Ay)({url:i.GetMarketTypes,method:"get"})}function d(t){return(0,e.Ay)({url:i.SearchSymbols,method:"get",params:t})}function u(t){return(0,e.Ay)({url:i.GetHotSymbols,method:"get",params:t})}}}]); \ No newline at end of file diff --git a/frontend/dist/js/798-legacy.35aaa373.js b/frontend/dist/js/798-legacy.92e6d7c7.js similarity index 99% rename from frontend/dist/js/798-legacy.35aaa373.js rename to frontend/dist/js/798-legacy.92e6d7c7.js index 04c0fbb..700351d 100644 --- a/frontend/dist/js/798-legacy.35aaa373.js +++ b/frontend/dist/js/798-legacy.92e6d7c7.js @@ -1 +1 @@ -"use strict";(self["webpackChunkvue_antd_pro"]=self["webpackChunkvue_antd_pro"]||[]).push([[798],{5517:function(t,a,e){e.r(a),e.d(a,{default:function(){return x}});e(62010),e(9868);var s=function(){var t=this,a=t._self._c;return a("div",{staticClass:"ai-asset-analysis-page",class:{"theme-dark":t.isDarkTheme}},[t.opportunities.length>0?a("div",{staticClass:"opp-section"},[a("div",{staticClass:"opp-header"},[a("span",{staticClass:"opp-title"},[a("a-icon",{attrs:{type:"radar-chart"}}),t._v(" "+t._s(t.$t("aiAssetAnalysis.opportunities.title")))],1),a("span",{staticClass:"opp-header-right"},[a("span",{staticClass:"opp-update-hint"},[a("a-icon",{attrs:{type:"clock-circle"}}),t._v(" "+t._s(t.$t("aiAssetAnalysis.opportunities.updateHint"))+" ")],1),a("a-button",{attrs:{type:"link",size:"small",icon:"reload",loading:t.oppLoading},on:{click:function(a){return t.loadOpportunities(!0)}}},[t._v(" "+t._s(t.$t("common.refresh")||"刷新")+" ")])],1)]),a("div",{staticClass:"opp-carousel-wrapper",on:{mouseenter:function(a){t.oppHover=!0},mouseleave:function(a){t.oppHover=!1}}},[a("div",{staticClass:"opp-track",class:{paused:t.oppHover},style:t.oppTrackStyle},t._l(t.carouselItems,function(e,s){return a("div",{key:"opp-"+s,staticClass:"opp-card",class:[e.impact,"market-"+(e.market||"").toLowerCase(),{"is-prediction-market":"PredictionMarket"===e.market}],on:{click:function(a){return t.analyzeOpportunity(e)}}},[a("div",{staticClass:"opp-top"},[a("span",{staticClass:"opp-symbol",class:{"prediction-title":"PredictionMarket"===e.market}},[t._v(" "+t._s("PredictionMarket"===e.market&&e.name||e.symbol)+" ")]),a("a-tag",{staticClass:"opp-market-tag",attrs:{color:t.getMarketTagColor(e.market),size:"small"}},[t._v(" "+t._s(t.getMarketLabel(e.market))+" ")])],1),"PredictionMarket"!==e.market?a("div",{staticClass:"opp-price"},[t._v("$"+t._s(t.formatOppPrice(e.price)))]):a("div",{staticClass:"opp-price"},[t._v(t._s((e.price||0).toFixed(1))+"%")]),"PredictionMarket"!==e.market?a("div",{staticClass:"opp-change",class:e.change_24h>=0?"up":"down"},[t._v(" "+t._s(e.change_24h>=0?"+":"")+t._s((e.change_24h||0).toFixed(1))+"% ")]):e.ai_analysis?a("div",{staticClass:"opp-change"},[a("a-tag",{attrs:{color:t.getRecommendationColor(e.ai_analysis.recommendation),size:"small"}},[t._v(" "+t._s(t.getRecommendationLabel(e.ai_analysis.recommendation))+" ")]),a("span",{staticStyle:{"margin-left":"8px","font-size":"12px",color:"rgba(0,0,0,0.65)"}},[t._v(" 机会评分: "+t._s(e.ai_analysis.opportunity_score.toFixed(0))+" ")])],1):t._e(),"PredictionMarket"!==e.market?a("div",{staticClass:"opp-signal"},[a("a-tag",{attrs:{color:t.getSignalColor(e.signal),size:"small"}},[t._v(t._s(t.getSignalLabel(e.signal)))])],1):t._e(),a("div",{staticClass:"opp-reason"},[t._v(t._s(t.getReasonText(e)))]),a("div",{staticClass:"opp-actions"},["PredictionMarket"!==e.market?a("span",{staticClass:"opp-action",on:{click:function(a){return a.stopPropagation(),t.analyzeOpportunity(e)}}},[a("a-icon",{attrs:{type:"thunderbolt"}}),t._v(" "+t._s(t.$t("aiAssetAnalysis.opportunities.analyze"))+" ")],1):a("span",{staticClass:"opp-action",on:{click:function(a){return a.stopPropagation(),t.analyzeOpportunity(e)}}},[a("a-icon",{attrs:{type:"link"}}),t._v(" "+t._s(t.$t("polymarket.action.viewDetail"))+" ")],1),"Crypto"===e.market?a("span",{staticClass:"opp-trade-btn",on:{click:function(a){return a.stopPropagation(),t.openQuickTradeFromOpp(e)}}},[a("a-icon",{attrs:{type:"transaction"}}),t._v(" "+t._s(t.$t("quickTrade.tradeNow"))+" ")],1):t._e()])])}),0)])]):t._e(),a("a-tooltip",{attrs:{title:t.$t("quickTrade.openPanel"),placement:"left"}},[!t.showQuickTrade&&t.currentAnalysisSymbol?a("div",{staticClass:"qt-floating-btn",on:{click:t.openQuickTradeFromCurrent}},[a("a-icon",{attrs:{type:"thunderbolt",theme:"filled"}})],1):t._e()]),a("quick-trade-panel",{attrs:{visible:t.showQuickTrade,symbol:t.qtSymbol,"preset-side":t.qtSide,"preset-price":t.qtPrice,source:t.qtSource,"market-type":"swap"},on:{close:function(a){t.showQuickTrade=!1},"order-success":t.onQuickTradeSuccess,"update:symbol":t.handleQuickTradeSymbolChange}}),a("a-card",{staticClass:"workspace-card",attrs:{bordered:!1}},[a("a-tabs",{staticClass:"workspace-tabs",attrs:{size:"large"},model:{value:t.activeTab,callback:function(a){t.activeTab=a},expression:"activeTab"}},[a("a-tab-pane",{key:"quick"},[a("span",{attrs:{slot:"tab"},slot:"tab"},[a("a-icon",{attrs:{type:"thunderbolt"}}),t._v(" "+t._s(t.$t("aiAssetAnalysis.tabs.quick"))+" ")],1),a("div",{staticClass:"tab-body"},["quick"===t.activeTab?a("AnalysisView",{attrs:{embedded:!0,"preset-symbol":t.presetSymbol,"auto-analyze-signal":t.autoAnalyzeSignal},on:{"symbol-change":t.onAnalysisSymbolChange}}):t._e()],1)]),a("a-tab-pane",{key:"monitor"},[a("span",{attrs:{slot:"tab"},slot:"tab"},[a("a-icon",{attrs:{type:"eye"}}),t._v(" "+t._s(t.$t("aiAssetAnalysis.tabs.monitor"))+" ")],1),a("div",{staticClass:"tab-body"},["monitor"===t.activeTab?a("PortfolioView",{attrs:{embedded:!0}}):t._e()],1)]),a("a-tab-pane",{key:"polymarket"},[a("span",{attrs:{slot:"tab"},slot:"tab"},[a("a-icon",{attrs:{type:"radar-chart"}}),t._v(" "+t._s(t.$t("aiAssetAnalysis.tabs.polymarket"))+" ")],1),a("div",{staticClass:"tab-body"},[a("div",{staticClass:"polymarket-tab-content"},[a("div",{staticClass:"polymarket-placeholder"},[a("div",{staticClass:"placeholder-icon"},[a("a-icon",{attrs:{type:"radar-chart"}})],1),a("h3",[t._v(t._s(t.$t("polymarket.analysis.title")))]),a("p",[t._v(t._s(t.$t("polymarket.analysis.description")))]),a("a-button",{staticStyle:{"margin-top":"16px"},attrs:{type:"primary",size:"large",icon:"thunderbolt"},on:{click:function(a){t.showPolymarketModal=!0}}},[t._v(" "+t._s(t.$t("polymarket.analysis.startAnalysis"))+" ")])],1)])])])],1)],1),a("PolymarketAnalysisModal",{attrs:{visible:t.showPolymarketModal},on:{close:function(a){t.showPolymarketModal=!1}}})],1)},i=[],n=e(76959),o=e(17654),r=e(9133),l=e(57888),c=(e(28706),e(74423),e(34782),e(27495),e(21699),e(25440),e(95353)),p=e(80893),u=e(4103),y=e(62618),d=e(89523),m=(e(42762),function(){var t=this,a=t._self._c;return a("a-modal",{attrs:{visible:t.visible,title:t.$t("polymarket.analysis.title"),width:900,footer:null,maskClosable:!1},on:{cancel:t.handleClose}},[a("div",{staticClass:"polymarket-analysis-modal"},[a("a-tabs",{attrs:{"default-active-key":"analyze"},on:{change:t.handleTabChange}},[a("a-tab-pane",{key:"analyze",attrs:{tab:t.$t("polymarket.analysis.tabAnalyze")}},[t.analysisResult?t._e():a("div",{staticClass:"input-section"},[a("a-alert",{staticStyle:{"margin-bottom":"16px"},attrs:{message:t.$t("polymarket.analysis.inputHint"),type:"info","show-icon":""}}),a("a-textarea",{attrs:{placeholder:t.$t("polymarket.analysis.inputPlaceholder"),rows:3,disabled:t.analyzing},on:{pressEnter:t.handleAnalyze},model:{value:t.inputText,callback:function(a){t.inputText=a},expression:"inputText"}}),a("div",{staticClass:"input-actions"},[a("a-button",{staticStyle:{width:"100%","margin-top":"12px"},attrs:{type:"primary",size:"large",icon:"thunderbolt",loading:t.analyzing,disabled:!t.inputText.trim()},on:{click:t.handleAnalyze}},[t._v(" "+t._s(t.$t("polymarket.analysis.analyzeButton"))+" ")])],1)],1),t.analysisResult?a("div",{staticClass:"result-section"},[a("div",{staticClass:"market-info"},[a("h3",[t._v(t._s(t.analysisResult.market.question))]),a("div",{staticClass:"market-meta"},[a("a-tag",{attrs:{color:t.getStatusColor(t.analysisResult.market.status)}},[t._v(" "+t._s(t.analysisResult.market.status)+" ")]),a("span",{staticClass:"meta-item"},[a("a-icon",{attrs:{type:"percentage"}}),t._v(" "+t._s(t.analysisResult.market.current_probability)+"% ")],1),t.analysisResult.market.volume_24h?a("span",{staticClass:"meta-item"},[a("a-icon",{attrs:{type:"dollar"}}),t._v(" "+t._s(t.formatVolume(t.analysisResult.market.volume_24h))+" ")],1):t._e(),t.analysisResult.market.polymarket_url?a("a-button",{attrs:{type:"link",size:"small",icon:"link",href:t.analysisResult.market.polymarket_url,target:"_blank"}},[t._v(" "+t._s(t.$t("polymarket.analysis.viewOnPolymarket"))+" ")]):t._e()],1)]),a("div",{staticClass:"analysis-result"},[a("a-divider",[t._v(t._s(t.$t("polymarket.analysis.aiAnalysis")))]),a("div",{staticClass:"probability-comparison"},[a("div",{staticClass:"prob-item"},[a("div",{staticClass:"prob-label"},[t._v(t._s(t.$t("polymarket.analysis.marketProbability")))]),a("div",{staticClass:"prob-value"},[t._v(t._s(t.analysisResult.analysis.market_probability)+"%")])]),a("div",{staticClass:"prob-item"},[a("div",{staticClass:"prob-label"},[t._v(t._s(t.$t("polymarket.analysis.aiPredictedProbability")))]),a("div",{staticClass:"prob-value ai-prob"},[t._v(t._s(t.analysisResult.analysis.ai_predicted_probability)+"%")])]),a("div",{staticClass:"prob-item"},[a("div",{staticClass:"prob-label"},[t._v(t._s(t.$t("polymarket.analysis.divergence")))]),a("div",{staticClass:"prob-value",class:t.getDivergenceClass(t.analysisResult.analysis.divergence)},[t._v(" "+t._s(t.analysisResult.analysis.divergence>=0?"+":"")+t._s(t.analysisResult.analysis.divergence.toFixed(2))+"% ")])])]),a("div",{staticClass:"recommendation-section"},[a("a-row",{attrs:{gutter:16}},[a("a-col",{attrs:{span:8}},[a("div",{staticClass:"rec-card"},[a("div",{staticClass:"rec-label"},[t._v(t._s(t.$t("polymarket.analysis.recommendation")))]),a("a-tag",{staticStyle:{"font-size":"16px",padding:"4px 12px"},attrs:{color:t.getRecommendationColor(t.analysisResult.analysis.recommendation)}},[t._v(" "+t._s(t.getRecommendationLabel(t.analysisResult.analysis.recommendation))+" ")])],1)]),a("a-col",{attrs:{span:8}},[a("div",{staticClass:"rec-card"},[a("div",{staticClass:"rec-label"},[t._v(t._s(t.$t("polymarket.analysis.confidenceScore")))]),a("div",{staticClass:"rec-value"},[t._v(t._s(t.analysisResult.analysis.confidence_score.toFixed(0)))])])]),a("a-col",{attrs:{span:8}},[a("div",{staticClass:"rec-card"},[a("div",{staticClass:"rec-label"},[t._v(t._s(t.$t("polymarket.analysis.opportunityScore")))]),a("div",{staticClass:"rec-value"},[t._v(t._s(t.analysisResult.analysis.opportunity_score.toFixed(0)))])])])],1)],1),t.analysisResult.analysis.reasoning?a("div",{staticClass:"reasoning-section"},[a("h4",[t._v(t._s(t.$t("polymarket.analysis.reasoning")))]),a("p",{staticClass:"reasoning-text"},[t._v(t._s(t.analysisResult.analysis.reasoning))])]):t._e(),t.analysisResult.analysis.key_factors&&t.analysisResult.analysis.key_factors.length>0?a("div",{staticClass:"key-factors-section"},[a("h4",[t._v(t._s(t.$t("polymarket.analysis.keyFactors")))]),t._l(t.analysisResult.analysis.key_factors,function(e,s){return a("a-tag",{key:s,staticStyle:{margin:"4px"},attrs:{color:"blue"}},[t._v(" "+t._s(e)+" ")])})],2):t._e(),t.analysisResult.credits_charged>0?a("div",{staticClass:"billing-info"},[a("a-alert",{staticStyle:{"margin-top":"16px"},attrs:{message:t.$t("polymarket.analysis.creditsCharged",{credits:t.analysisResult.credits_charged}),type:"success","show-icon":""}}),void 0!==t.analysisResult.remaining_credits?a("div",{staticStyle:{"margin-top":"8px","text-align":"right",color:"rgba(0,0,0,0.65)"}},[t._v(" "+t._s(t.$t("polymarket.analysis.remainingCredits",{credits:t.analysisResult.remaining_credits.toFixed(0)}))+" ")]):t._e()],1):t._e()],1),a("div",{staticClass:"result-actions"},[a("a-button",{staticStyle:{"margin-right":"8px"},on:{click:t.handleNewAnalysis}},[t._v(" "+t._s(t.$t("polymarket.analysis.newAnalysis"))+" ")]),a("a-button",{attrs:{type:"primary"},on:{click:t.handleClose}},[t._v(" "+t._s(t.$t("common.close"))+" ")])],1)]):t._e(),t.analyzing?a("div",{staticClass:"loading-section"},[a("a-spin",{attrs:{size:"large"}}),a("p",{staticStyle:{"margin-top":"16px",color:"rgba(0,0,0,0.65)"}},[t._v(" "+t._s(t.$t("polymarket.analysis.analyzing"))+" ")])],1):t._e()]),a("a-tab-pane",{key:"history",attrs:{tab:t.$t("polymarket.analysis.tabHistory")}},[a("div",{staticClass:"history-section"},[a("a-spin",{attrs:{spinning:t.historyLoading}},[a("a-table",{attrs:{columns:t.historyColumns,"data-source":t.historyList,pagination:t.historyPagination,"row-key":function(t){return t.id},size:"small"},on:{change:t.handleHistoryTableChange},scopedSlots:t._u([{key:"market_title",fn:function(e,s){return[a("a-button",{staticStyle:{padding:"0"},attrs:{type:"link"},on:{click:function(a){return t.viewHistoryItem(s)}}},[t._v(" "+t._s(e)+" ")])]}},{key:"recommendation",fn:function(e){return[a("a-tag",{attrs:{color:t.getRecommendationColor(e)}},[t._v(" "+t._s(t.getRecommendationLabel(e))+" ")])]}},{key:"created_at",fn:function(a){return[t._v(" "+t._s(t.formatDateTime(a))+" ")]}}])})],1)],1)])],1)],1)])}),h=[],k=(e(26099),e(76471)),v="/api/polymarket";function g(t){return(0,k.Ay)({url:"".concat(v,"/analyze"),method:"post",data:t,timeout:12e4})}function _(t){return(0,k.Ay)({url:"".concat(v,"/history"),method:"get",params:t})}var b={name:"PolymarketAnalysisModal",props:{visible:{type:Boolean,default:!1}},data:function(){var t=this;return{inputText:"",analyzing:!1,analysisResult:null,activeTab:"analyze",historyLoading:!1,historyList:[],historyPagination:{current:1,pageSize:20,total:0,showSizeChanger:!0,showTotal:function(a){return t.$t("polymarket.analysis.historyTotal",{total:a})}},historyColumns:[]}},methods:{handleAnalyze:function(){var t=this;this.inputText.trim()?(this.analyzing=!0,this.analysisResult=null,g({input:this.inputText.trim(),language:this.$i18n.locale||"zh-CN"}).then(function(a){1===a.code?(t.analysisResult=a.data,t.$message.success(t.$t("polymarket.analysis.success"))):"Insufficient credits"===a.msg?(t.$message.error(t.$t("polymarket.analysis.insufficientCredits")),t.$router.push("/billing")):t.$message.error(a.msg||t.$t("polymarket.analysis.failed"))}).catch(function(a){a.response&&a.response.data&&"Insufficient credits"===a.response.data.msg?(t.$message.error(t.$t("polymarket.analysis.insufficientCredits")),t.$router.push("/billing")):t.$message.error(t.$t("polymarket.analysis.failed"))}).finally(function(){t.analyzing=!1})):this.$message.warning(this.$t("polymarket.analysis.inputRequired"))},handleNewAnalysis:function(){this.inputText="",this.analysisResult=null},handleClose:function(){var t=this;this.$emit("close"),setTimeout(function(){t.inputText="",t.analysisResult=null,t.analyzing=!1},300)},getStatusColor:function(t){var a={active:"green",closed:"default",resolved:"blue"};return a[t]||"default"},getRecommendationColor:function(t){var a={YES:"green",NO:"red",HOLD:"orange"};return a[t]||"default"},getRecommendationLabel:function(t){var a={YES:this.$t("polymarket.analysis.recommendationYes"),NO:this.$t("polymarket.analysis.recommendationNo"),HOLD:this.$t("polymarket.analysis.recommendationHold")};return a[t]||t},getDivergenceClass:function(t){return t>5?"divergence-positive":t<-5?"divergence-negative":"divergence-neutral"},formatVolume:function(t){return t>=1e6?"$".concat((t/1e6).toFixed(2),"M"):t>=1e3?"$".concat((t/1e3).toFixed(2),"K"):"$".concat(t.toFixed(2))},handleTabChange:function(t){this.activeTab=t,"history"===t&&0===this.historyList.length&&this.loadHistory()},loadHistory:function(){var t=this;return(0,o.A)((0,n.A)().m(function a(){var e;return(0,n.A)().w(function(a){while(1)switch(a.p=a.n){case 0:return t.historyLoading=!0,a.p=1,a.n=2,_({page:t.historyPagination.current,page_size:t.historyPagination.pageSize});case 2:e=a.v,1===e.code&&e.data&&(t.historyList=e.data.items||[],t.historyPagination.total=e.data.total||0),a.n=4;break;case 3:a.p=3,a.v,t.$message.error(t.$t("polymarket.analysis.loadHistoryFailed"));case 4:return a.p=4,t.historyLoading=!1,a.f(4);case 5:return a.a(2)}},a,null,[[1,3,4,5]])}))()},handleHistoryTableChange:function(t){this.historyPagination.current=t.current,this.historyPagination.pageSize=t.pageSize,this.loadHistory()},viewHistoryItem:function(t){this.activeTab="analyze",this.analysisResult={market:{question:t.market_title,market_id:t.market_id,polymarket_url:t.market_url,current_probability:t.market_probability,status:"active"},analysis:{ai_predicted_probability:t.ai_predicted_probability,market_probability:t.market_probability,recommendation:t.recommendation,opportunity_score:t.opportunity_score,confidence_score:t.confidence_score}}},formatDateTime:function(t){if(!t)return"";var a=new Date(t);return a.toLocaleString("zh-CN"===this.$i18n.locale?"zh-CN":"en-US")}},mounted:function(){this.historyColumns=[{title:this.$t("polymarket.analysis.historyMarket"),dataIndex:"market_title",key:"market_title",scopedSlots:{customRender:"market_title"}},{title:this.$t("polymarket.analysis.historyRecommendation"),dataIndex:"recommendation",key:"recommendation",width:120,scopedSlots:{customRender:"recommendation"}},{title:this.$t("polymarket.analysis.historyOpportunityScore"),dataIndex:"opportunity_score",key:"opportunity_score",width:120,align:"right"},{title:this.$t("polymarket.analysis.historyCreatedAt"),dataIndex:"created_at",key:"created_at",width:180,scopedSlots:{customRender:"created_at"}}]}},f=b,C=e(845),S=(0,C.A)(f,m,h,!1,null,"41dfa054",null),$=S.exports,A={name:"AIAssetAnalysis",components:{AnalysisView:p["default"],PortfolioView:u["default"],QuickTradePanel:d.A,PolymarketAnalysisModal:$},data:function(){return{activeTab:"quick",opportunities:[],oppLoading:!1,oppHover:!1,presetSymbol:"",autoAnalyzeSignal:0,showQuickTrade:!1,qtSymbol:"",qtSide:"",qtPrice:0,qtSource:"ai_radar",currentAnalysisSymbol:"",currentAnalysisMarket:"",showPolymarketModal:!1}},computed:(0,l.A)((0,l.A)({},(0,c.aH)({navTheme:function(t){return t.app.theme}})),{},{isDarkTheme:function(){return"dark"===this.navTheme||"realdark"===this.navTheme},carouselItems:function(){return 0===this.opportunities.length?[]:[].concat((0,r.A)(this.opportunities),(0,r.A)(this.opportunities))},oppTrackStyle:function(){var t=3*this.opportunities.length;return{animationDuration:t+"s"}}}),created:function(){this.loadOpportunities()},methods:{loadOpportunities:function(){var t=arguments,a=this;return(0,o.A)((0,n.A)().m(function e(){var s,i,o;return(0,n.A)().w(function(e){while(1)switch(e.p=e.n){case 0:return s=t.length>0&&void 0!==t[0]&&t[0],a.oppLoading=!0,e.p=1,i=s?{force:!0}:{},e.n=2,(0,y.r9)(i);case 2:o=e.v,o&&1===o.code&&Array.isArray(o.data)&&(a.opportunities=o.data.slice(0,20)),e.n=4;break;case 3:e.p=3,e.v;case 4:return e.p=4,a.oppLoading=!1,e.f(4);case 5:return e.a(2)}},e,null,[[1,3,4,5]])}))()},getSignalColor:function(t){var a={overbought:"volcano",oversold:"green",bullish_momentum:"cyan",bearish_momentum:"red"};return a[t]||"default"},getSignalLabel:function(t){var a="aiAssetAnalysis.opportunities.signal.".concat(t),e=this.$t(a);return e!==a?e:t},getMarketTagColor:function(t){var a={Crypto:"purple",USStock:"green",Forex:"gold",PredictionMarket:"cyan"};return a[t]||"default"},getMarketLabel:function(t){var a="aiAssetAnalysis.opportunities.market.".concat(t),e=this.$t(a);return e!==a?e:t},getReasonText:function(t){var a=(t.market||"Crypto").toLowerCase(),e=t.signal||"",s="aiAssetAnalysis.opportunities.reason.".concat(a,".").concat(e),i=this.$t(s);if(i===s)return t.reason||"";var n=Math.abs(t.change_24h||0).toFixed(1),o=Math.abs(t.change_7d||0).toFixed(1);return i.replace("{change}",n).replace("{change7d}",o)},formatOppPrice:function(t){return t?t>=1e4?(t/1e3).toFixed(1)+"K":t>=1?t.toFixed(2):t.toFixed(4):"--"},analyzeOpportunity:function(t){var a=this;if("PredictionMarket"===t.market)return this.activeTab="polymarket",void(this.showPolymarketModal=!0);this.activeTab="quick";var e=t.market||"Crypto";this.presetSymbol="".concat(e,":").concat(t.symbol),this.$nextTick(function(){a.autoAnalyzeSignal++})},getRecommendationColor:function(t){var a={YES:"green",NO:"red",HOLD:"default"};return a[t]||"default"},getRecommendationLabel:function(t){return this.$t("polymarket.recommendation.".concat(t))||t},onAnalysisSymbolChange:function(t){if(!t)return this.currentAnalysisSymbol="",void(this.currentAnalysisMarket="");var a=t.split(":"),e=a.length>1?a[0]:"Crypto",s=a.length>1?a[1]:a[0];this.currentAnalysisMarket=e,this.currentAnalysisSymbol="Crypto"===e?s:""},openQuickTradeFromCurrent:function(){this.currentAnalysisSymbol&&(this.qtSymbol=this.currentAnalysisSymbol,this.qtSide="",this.qtPrice=0,this.qtSource="ai_analysis",this.showQuickTrade=!0)},openQuickTradeFromOpp:function(t){if("Crypto"===t.market){this.qtSymbol=t.symbol||"";var a=(t.signal||"").toLowerCase();a.includes("oversold")||a.includes("bullish")?this.qtSide="buy":a.includes("overbought")||a.includes("bearish")?this.qtSide="sell":this.qtSide="",this.qtPrice=t.price||0,this.qtSource="ai_radar",this.showQuickTrade=!0}},onQuickTradeSuccess:function(){this.$message.success(this.$t("quickTrade.orderSuccess"))},handleQuickTradeSymbolChange:function(t){t&&(this.qtSymbol=t)}}},T=A,w=(0,C.A)(T,s,i,!1,null,"20b827f5",null),x=w.exports}}]); \ No newline at end of file +"use strict";(self["webpackChunkvue_antd_pro"]=self["webpackChunkvue_antd_pro"]||[]).push([[798],{5517:function(t,a,e){e.r(a),e.d(a,{default:function(){return x}});e(62010),e(9868);var s=function(){var t=this,a=t._self._c;return a("div",{staticClass:"ai-asset-analysis-page",class:{"theme-dark":t.isDarkTheme}},[t.opportunities.length>0?a("div",{staticClass:"opp-section"},[a("div",{staticClass:"opp-header"},[a("span",{staticClass:"opp-title"},[a("a-icon",{attrs:{type:"radar-chart"}}),t._v(" "+t._s(t.$t("aiAssetAnalysis.opportunities.title")))],1),a("span",{staticClass:"opp-header-right"},[a("span",{staticClass:"opp-update-hint"},[a("a-icon",{attrs:{type:"clock-circle"}}),t._v(" "+t._s(t.$t("aiAssetAnalysis.opportunities.updateHint"))+" ")],1),a("a-button",{attrs:{type:"link",size:"small",icon:"reload",loading:t.oppLoading},on:{click:function(a){return t.loadOpportunities(!0)}}},[t._v(" "+t._s(t.$t("common.refresh")||"刷新")+" ")])],1)]),a("div",{staticClass:"opp-carousel-wrapper",on:{mouseenter:function(a){t.oppHover=!0},mouseleave:function(a){t.oppHover=!1}}},[a("div",{staticClass:"opp-track",class:{paused:t.oppHover},style:t.oppTrackStyle},t._l(t.carouselItems,function(e,s){return a("div",{key:"opp-"+s,staticClass:"opp-card",class:[e.impact,"market-"+(e.market||"").toLowerCase(),{"is-prediction-market":"PredictionMarket"===e.market}],on:{click:function(a){return t.analyzeOpportunity(e)}}},[a("div",{staticClass:"opp-top"},[a("span",{staticClass:"opp-symbol",class:{"prediction-title":"PredictionMarket"===e.market}},[t._v(" "+t._s("PredictionMarket"===e.market&&e.name||e.symbol)+" ")]),a("a-tag",{staticClass:"opp-market-tag",attrs:{color:t.getMarketTagColor(e.market),size:"small"}},[t._v(" "+t._s(t.getMarketLabel(e.market))+" ")])],1),"PredictionMarket"!==e.market?a("div",{staticClass:"opp-price"},[t._v("$"+t._s(t.formatOppPrice(e.price)))]):a("div",{staticClass:"opp-price"},[t._v(t._s((e.price||0).toFixed(1))+"%")]),"PredictionMarket"!==e.market?a("div",{staticClass:"opp-change",class:e.change_24h>=0?"up":"down"},[t._v(" "+t._s(e.change_24h>=0?"+":"")+t._s((e.change_24h||0).toFixed(1))+"% ")]):e.ai_analysis?a("div",{staticClass:"opp-change"},[a("a-tag",{attrs:{color:t.getRecommendationColor(e.ai_analysis.recommendation),size:"small"}},[t._v(" "+t._s(t.getRecommendationLabel(e.ai_analysis.recommendation))+" ")]),a("span",{staticStyle:{"margin-left":"8px","font-size":"12px",color:"rgba(0,0,0,0.65)"}},[t._v(" 机会评分: "+t._s(e.ai_analysis.opportunity_score.toFixed(0))+" ")])],1):t._e(),"PredictionMarket"!==e.market?a("div",{staticClass:"opp-signal"},[a("a-tag",{attrs:{color:t.getSignalColor(e.signal),size:"small"}},[t._v(t._s(t.getSignalLabel(e.signal)))])],1):t._e(),a("div",{staticClass:"opp-reason"},[t._v(t._s(t.getReasonText(e)))]),a("div",{staticClass:"opp-actions"},["PredictionMarket"!==e.market?a("span",{staticClass:"opp-action",on:{click:function(a){return a.stopPropagation(),t.analyzeOpportunity(e)}}},[a("a-icon",{attrs:{type:"thunderbolt"}}),t._v(" "+t._s(t.$t("aiAssetAnalysis.opportunities.analyze"))+" ")],1):a("span",{staticClass:"opp-action",on:{click:function(a){return a.stopPropagation(),t.analyzeOpportunity(e)}}},[a("a-icon",{attrs:{type:"link"}}),t._v(" "+t._s(t.$t("polymarket.action.viewDetail"))+" ")],1),"Crypto"===e.market?a("span",{staticClass:"opp-trade-btn",on:{click:function(a){return a.stopPropagation(),t.openQuickTradeFromOpp(e)}}},[a("a-icon",{attrs:{type:"transaction"}}),t._v(" "+t._s(t.$t("quickTrade.tradeNow"))+" ")],1):t._e()])])}),0)])]):t._e(),a("a-tooltip",{attrs:{title:t.$t("quickTrade.openPanel"),placement:"left"}},[!t.showQuickTrade&&t.currentAnalysisSymbol?a("div",{staticClass:"qt-floating-btn",on:{click:t.openQuickTradeFromCurrent}},[a("a-icon",{attrs:{type:"thunderbolt",theme:"filled"}})],1):t._e()]),a("quick-trade-panel",{attrs:{visible:t.showQuickTrade,symbol:t.qtSymbol,"preset-side":t.qtSide,"preset-price":t.qtPrice,source:t.qtSource,"market-type":"swap"},on:{close:function(a){t.showQuickTrade=!1},"order-success":t.onQuickTradeSuccess,"update:symbol":t.handleQuickTradeSymbolChange}}),a("a-card",{staticClass:"workspace-card",attrs:{bordered:!1}},[a("a-tabs",{staticClass:"workspace-tabs",attrs:{size:"large"},model:{value:t.activeTab,callback:function(a){t.activeTab=a},expression:"activeTab"}},[a("a-tab-pane",{key:"quick"},[a("span",{attrs:{slot:"tab"},slot:"tab"},[a("a-icon",{attrs:{type:"thunderbolt"}}),t._v(" "+t._s(t.$t("aiAssetAnalysis.tabs.quick"))+" ")],1),a("div",{staticClass:"tab-body"},["quick"===t.activeTab?a("AnalysisView",{attrs:{embedded:!0,"preset-symbol":t.presetSymbol,"auto-analyze-signal":t.autoAnalyzeSignal},on:{"symbol-change":t.onAnalysisSymbolChange}}):t._e()],1)]),a("a-tab-pane",{key:"monitor"},[a("span",{attrs:{slot:"tab"},slot:"tab"},[a("a-icon",{attrs:{type:"eye"}}),t._v(" "+t._s(t.$t("aiAssetAnalysis.tabs.monitor"))+" ")],1),a("div",{staticClass:"tab-body"},["monitor"===t.activeTab?a("PortfolioView",{attrs:{embedded:!0}}):t._e()],1)]),a("a-tab-pane",{key:"polymarket"},[a("span",{attrs:{slot:"tab"},slot:"tab"},[a("a-icon",{attrs:{type:"radar-chart"}}),t._v(" "+t._s(t.$t("aiAssetAnalysis.tabs.polymarket"))+" ")],1),a("div",{staticClass:"tab-body"},[a("div",{staticClass:"polymarket-tab-content"},[a("div",{staticClass:"polymarket-placeholder"},[a("div",{staticClass:"placeholder-icon"},[a("a-icon",{attrs:{type:"radar-chart"}})],1),a("h3",[t._v(t._s(t.$t("polymarket.analysis.title")))]),a("p",[t._v(t._s(t.$t("polymarket.analysis.description")))]),a("a-button",{staticStyle:{"margin-top":"16px"},attrs:{type:"primary",size:"large",icon:"thunderbolt"},on:{click:function(a){t.showPolymarketModal=!0}}},[t._v(" "+t._s(t.$t("polymarket.analysis.startAnalysis"))+" ")])],1)])])])],1)],1),a("PolymarketAnalysisModal",{attrs:{visible:t.showPolymarketModal},on:{close:function(a){t.showPolymarketModal=!1}}})],1)},i=[],n=e(76959),o=e(17654),r=e(9133),l=e(57888),c=(e(28706),e(74423),e(34782),e(27495),e(21699),e(25440),e(95353)),p=e(90268),u=e(4103),y=e(62618),d=e(89523),m=(e(42762),function(){var t=this,a=t._self._c;return a("a-modal",{attrs:{visible:t.visible,title:t.$t("polymarket.analysis.title"),width:900,footer:null,maskClosable:!1},on:{cancel:t.handleClose}},[a("div",{staticClass:"polymarket-analysis-modal"},[a("a-tabs",{attrs:{"default-active-key":"analyze"},on:{change:t.handleTabChange}},[a("a-tab-pane",{key:"analyze",attrs:{tab:t.$t("polymarket.analysis.tabAnalyze")}},[t.analysisResult?t._e():a("div",{staticClass:"input-section"},[a("a-alert",{staticStyle:{"margin-bottom":"16px"},attrs:{message:t.$t("polymarket.analysis.inputHint"),type:"info","show-icon":""}}),a("a-textarea",{attrs:{placeholder:t.$t("polymarket.analysis.inputPlaceholder"),rows:3,disabled:t.analyzing},on:{pressEnter:t.handleAnalyze},model:{value:t.inputText,callback:function(a){t.inputText=a},expression:"inputText"}}),a("div",{staticClass:"input-actions"},[a("a-button",{staticStyle:{width:"100%","margin-top":"12px"},attrs:{type:"primary",size:"large",icon:"thunderbolt",loading:t.analyzing,disabled:!t.inputText.trim()},on:{click:t.handleAnalyze}},[t._v(" "+t._s(t.$t("polymarket.analysis.analyzeButton"))+" ")])],1)],1),t.analysisResult?a("div",{staticClass:"result-section"},[a("div",{staticClass:"market-info"},[a("h3",[t._v(t._s(t.analysisResult.market.question))]),a("div",{staticClass:"market-meta"},[a("a-tag",{attrs:{color:t.getStatusColor(t.analysisResult.market.status)}},[t._v(" "+t._s(t.analysisResult.market.status)+" ")]),a("span",{staticClass:"meta-item"},[a("a-icon",{attrs:{type:"percentage"}}),t._v(" "+t._s(t.analysisResult.market.current_probability)+"% ")],1),t.analysisResult.market.volume_24h?a("span",{staticClass:"meta-item"},[a("a-icon",{attrs:{type:"dollar"}}),t._v(" "+t._s(t.formatVolume(t.analysisResult.market.volume_24h))+" ")],1):t._e(),t.analysisResult.market.polymarket_url?a("a-button",{attrs:{type:"link",size:"small",icon:"link",href:t.analysisResult.market.polymarket_url,target:"_blank"}},[t._v(" "+t._s(t.$t("polymarket.analysis.viewOnPolymarket"))+" ")]):t._e()],1)]),a("div",{staticClass:"analysis-result"},[a("a-divider",[t._v(t._s(t.$t("polymarket.analysis.aiAnalysis")))]),a("div",{staticClass:"probability-comparison"},[a("div",{staticClass:"prob-item"},[a("div",{staticClass:"prob-label"},[t._v(t._s(t.$t("polymarket.analysis.marketProbability")))]),a("div",{staticClass:"prob-value"},[t._v(t._s(t.analysisResult.analysis.market_probability)+"%")])]),a("div",{staticClass:"prob-item"},[a("div",{staticClass:"prob-label"},[t._v(t._s(t.$t("polymarket.analysis.aiPredictedProbability")))]),a("div",{staticClass:"prob-value ai-prob"},[t._v(t._s(t.analysisResult.analysis.ai_predicted_probability)+"%")])]),a("div",{staticClass:"prob-item"},[a("div",{staticClass:"prob-label"},[t._v(t._s(t.$t("polymarket.analysis.divergence")))]),a("div",{staticClass:"prob-value",class:t.getDivergenceClass(t.analysisResult.analysis.divergence)},[t._v(" "+t._s(t.analysisResult.analysis.divergence>=0?"+":"")+t._s(t.analysisResult.analysis.divergence.toFixed(2))+"% ")])])]),a("div",{staticClass:"recommendation-section"},[a("a-row",{attrs:{gutter:16}},[a("a-col",{attrs:{span:8}},[a("div",{staticClass:"rec-card"},[a("div",{staticClass:"rec-label"},[t._v(t._s(t.$t("polymarket.analysis.recommendation")))]),a("a-tag",{staticStyle:{"font-size":"16px",padding:"4px 12px"},attrs:{color:t.getRecommendationColor(t.analysisResult.analysis.recommendation)}},[t._v(" "+t._s(t.getRecommendationLabel(t.analysisResult.analysis.recommendation))+" ")])],1)]),a("a-col",{attrs:{span:8}},[a("div",{staticClass:"rec-card"},[a("div",{staticClass:"rec-label"},[t._v(t._s(t.$t("polymarket.analysis.confidenceScore")))]),a("div",{staticClass:"rec-value"},[t._v(t._s(t.analysisResult.analysis.confidence_score.toFixed(0)))])])]),a("a-col",{attrs:{span:8}},[a("div",{staticClass:"rec-card"},[a("div",{staticClass:"rec-label"},[t._v(t._s(t.$t("polymarket.analysis.opportunityScore")))]),a("div",{staticClass:"rec-value"},[t._v(t._s(t.analysisResult.analysis.opportunity_score.toFixed(0)))])])])],1)],1),t.analysisResult.analysis.reasoning?a("div",{staticClass:"reasoning-section"},[a("h4",[t._v(t._s(t.$t("polymarket.analysis.reasoning")))]),a("p",{staticClass:"reasoning-text"},[t._v(t._s(t.analysisResult.analysis.reasoning))])]):t._e(),t.analysisResult.analysis.key_factors&&t.analysisResult.analysis.key_factors.length>0?a("div",{staticClass:"key-factors-section"},[a("h4",[t._v(t._s(t.$t("polymarket.analysis.keyFactors")))]),t._l(t.analysisResult.analysis.key_factors,function(e,s){return a("a-tag",{key:s,staticStyle:{margin:"4px"},attrs:{color:"blue"}},[t._v(" "+t._s(e)+" ")])})],2):t._e(),t.analysisResult.credits_charged>0?a("div",{staticClass:"billing-info"},[a("a-alert",{staticStyle:{"margin-top":"16px"},attrs:{message:t.$t("polymarket.analysis.creditsCharged",{credits:t.analysisResult.credits_charged}),type:"success","show-icon":""}}),void 0!==t.analysisResult.remaining_credits?a("div",{staticStyle:{"margin-top":"8px","text-align":"right",color:"rgba(0,0,0,0.65)"}},[t._v(" "+t._s(t.$t("polymarket.analysis.remainingCredits",{credits:t.analysisResult.remaining_credits.toFixed(0)}))+" ")]):t._e()],1):t._e()],1),a("div",{staticClass:"result-actions"},[a("a-button",{staticStyle:{"margin-right":"8px"},on:{click:t.handleNewAnalysis}},[t._v(" "+t._s(t.$t("polymarket.analysis.newAnalysis"))+" ")]),a("a-button",{attrs:{type:"primary"},on:{click:t.handleClose}},[t._v(" "+t._s(t.$t("common.close"))+" ")])],1)]):t._e(),t.analyzing?a("div",{staticClass:"loading-section"},[a("a-spin",{attrs:{size:"large"}}),a("p",{staticStyle:{"margin-top":"16px",color:"rgba(0,0,0,0.65)"}},[t._v(" "+t._s(t.$t("polymarket.analysis.analyzing"))+" ")])],1):t._e()]),a("a-tab-pane",{key:"history",attrs:{tab:t.$t("polymarket.analysis.tabHistory")}},[a("div",{staticClass:"history-section"},[a("a-spin",{attrs:{spinning:t.historyLoading}},[a("a-table",{attrs:{columns:t.historyColumns,"data-source":t.historyList,pagination:t.historyPagination,"row-key":function(t){return t.id},size:"small"},on:{change:t.handleHistoryTableChange},scopedSlots:t._u([{key:"market_title",fn:function(e,s){return[a("a-button",{staticStyle:{padding:"0"},attrs:{type:"link"},on:{click:function(a){return t.viewHistoryItem(s)}}},[t._v(" "+t._s(e)+" ")])]}},{key:"recommendation",fn:function(e){return[a("a-tag",{attrs:{color:t.getRecommendationColor(e)}},[t._v(" "+t._s(t.getRecommendationLabel(e))+" ")])]}},{key:"created_at",fn:function(a){return[t._v(" "+t._s(t.formatDateTime(a))+" ")]}}])})],1)],1)])],1)],1)])}),h=[],k=(e(26099),e(76471)),v="/api/polymarket";function g(t){return(0,k.Ay)({url:"".concat(v,"/analyze"),method:"post",data:t,timeout:12e4})}function _(t){return(0,k.Ay)({url:"".concat(v,"/history"),method:"get",params:t})}var b={name:"PolymarketAnalysisModal",props:{visible:{type:Boolean,default:!1}},data:function(){var t=this;return{inputText:"",analyzing:!1,analysisResult:null,activeTab:"analyze",historyLoading:!1,historyList:[],historyPagination:{current:1,pageSize:20,total:0,showSizeChanger:!0,showTotal:function(a){return t.$t("polymarket.analysis.historyTotal",{total:a})}},historyColumns:[]}},methods:{handleAnalyze:function(){var t=this;this.inputText.trim()?(this.analyzing=!0,this.analysisResult=null,g({input:this.inputText.trim(),language:this.$i18n.locale||"zh-CN"}).then(function(a){1===a.code?(t.analysisResult=a.data,t.$message.success(t.$t("polymarket.analysis.success"))):"Insufficient credits"===a.msg?(t.$message.error(t.$t("polymarket.analysis.insufficientCredits")),t.$router.push("/billing")):t.$message.error(a.msg||t.$t("polymarket.analysis.failed"))}).catch(function(a){a.response&&a.response.data&&"Insufficient credits"===a.response.data.msg?(t.$message.error(t.$t("polymarket.analysis.insufficientCredits")),t.$router.push("/billing")):t.$message.error(t.$t("polymarket.analysis.failed"))}).finally(function(){t.analyzing=!1})):this.$message.warning(this.$t("polymarket.analysis.inputRequired"))},handleNewAnalysis:function(){this.inputText="",this.analysisResult=null},handleClose:function(){var t=this;this.$emit("close"),setTimeout(function(){t.inputText="",t.analysisResult=null,t.analyzing=!1},300)},getStatusColor:function(t){var a={active:"green",closed:"default",resolved:"blue"};return a[t]||"default"},getRecommendationColor:function(t){var a={YES:"green",NO:"red",HOLD:"orange"};return a[t]||"default"},getRecommendationLabel:function(t){var a={YES:this.$t("polymarket.analysis.recommendationYes"),NO:this.$t("polymarket.analysis.recommendationNo"),HOLD:this.$t("polymarket.analysis.recommendationHold")};return a[t]||t},getDivergenceClass:function(t){return t>5?"divergence-positive":t<-5?"divergence-negative":"divergence-neutral"},formatVolume:function(t){return t>=1e6?"$".concat((t/1e6).toFixed(2),"M"):t>=1e3?"$".concat((t/1e3).toFixed(2),"K"):"$".concat(t.toFixed(2))},handleTabChange:function(t){this.activeTab=t,"history"===t&&0===this.historyList.length&&this.loadHistory()},loadHistory:function(){var t=this;return(0,o.A)((0,n.A)().m(function a(){var e;return(0,n.A)().w(function(a){while(1)switch(a.p=a.n){case 0:return t.historyLoading=!0,a.p=1,a.n=2,_({page:t.historyPagination.current,page_size:t.historyPagination.pageSize});case 2:e=a.v,1===e.code&&e.data&&(t.historyList=e.data.items||[],t.historyPagination.total=e.data.total||0),a.n=4;break;case 3:a.p=3,a.v,t.$message.error(t.$t("polymarket.analysis.loadHistoryFailed"));case 4:return a.p=4,t.historyLoading=!1,a.f(4);case 5:return a.a(2)}},a,null,[[1,3,4,5]])}))()},handleHistoryTableChange:function(t){this.historyPagination.current=t.current,this.historyPagination.pageSize=t.pageSize,this.loadHistory()},viewHistoryItem:function(t){this.activeTab="analyze",this.analysisResult={market:{question:t.market_title,market_id:t.market_id,polymarket_url:t.market_url,current_probability:t.market_probability,status:"active"},analysis:{ai_predicted_probability:t.ai_predicted_probability,market_probability:t.market_probability,recommendation:t.recommendation,opportunity_score:t.opportunity_score,confidence_score:t.confidence_score}}},formatDateTime:function(t){if(!t)return"";var a=new Date(t);return a.toLocaleString("zh-CN"===this.$i18n.locale?"zh-CN":"en-US")}},mounted:function(){this.historyColumns=[{title:this.$t("polymarket.analysis.historyMarket"),dataIndex:"market_title",key:"market_title",scopedSlots:{customRender:"market_title"}},{title:this.$t("polymarket.analysis.historyRecommendation"),dataIndex:"recommendation",key:"recommendation",width:120,scopedSlots:{customRender:"recommendation"}},{title:this.$t("polymarket.analysis.historyOpportunityScore"),dataIndex:"opportunity_score",key:"opportunity_score",width:120,align:"right"},{title:this.$t("polymarket.analysis.historyCreatedAt"),dataIndex:"created_at",key:"created_at",width:180,scopedSlots:{customRender:"created_at"}}]}},f=b,C=e(845),S=(0,C.A)(f,m,h,!1,null,"41dfa054",null),$=S.exports,A={name:"AIAssetAnalysis",components:{AnalysisView:p["default"],PortfolioView:u["default"],QuickTradePanel:d.A,PolymarketAnalysisModal:$},data:function(){return{activeTab:"quick",opportunities:[],oppLoading:!1,oppHover:!1,presetSymbol:"",autoAnalyzeSignal:0,showQuickTrade:!1,qtSymbol:"",qtSide:"",qtPrice:0,qtSource:"ai_radar",currentAnalysisSymbol:"",currentAnalysisMarket:"",showPolymarketModal:!1}},computed:(0,l.A)((0,l.A)({},(0,c.aH)({navTheme:function(t){return t.app.theme}})),{},{isDarkTheme:function(){return"dark"===this.navTheme||"realdark"===this.navTheme},carouselItems:function(){return 0===this.opportunities.length?[]:[].concat((0,r.A)(this.opportunities),(0,r.A)(this.opportunities))},oppTrackStyle:function(){var t=3*this.opportunities.length;return{animationDuration:t+"s"}}}),created:function(){this.loadOpportunities()},methods:{loadOpportunities:function(){var t=arguments,a=this;return(0,o.A)((0,n.A)().m(function e(){var s,i,o;return(0,n.A)().w(function(e){while(1)switch(e.p=e.n){case 0:return s=t.length>0&&void 0!==t[0]&&t[0],a.oppLoading=!0,e.p=1,i=s?{force:!0}:{},e.n=2,(0,y.r9)(i);case 2:o=e.v,o&&1===o.code&&Array.isArray(o.data)&&(a.opportunities=o.data.slice(0,20)),e.n=4;break;case 3:e.p=3,e.v;case 4:return e.p=4,a.oppLoading=!1,e.f(4);case 5:return e.a(2)}},e,null,[[1,3,4,5]])}))()},getSignalColor:function(t){var a={overbought:"volcano",oversold:"green",bullish_momentum:"cyan",bearish_momentum:"red"};return a[t]||"default"},getSignalLabel:function(t){var a="aiAssetAnalysis.opportunities.signal.".concat(t),e=this.$t(a);return e!==a?e:t},getMarketTagColor:function(t){var a={Crypto:"purple",USStock:"green",Forex:"gold",PredictionMarket:"cyan"};return a[t]||"default"},getMarketLabel:function(t){var a="aiAssetAnalysis.opportunities.market.".concat(t),e=this.$t(a);return e!==a?e:t},getReasonText:function(t){var a=(t.market||"Crypto").toLowerCase(),e=t.signal||"",s="aiAssetAnalysis.opportunities.reason.".concat(a,".").concat(e),i=this.$t(s);if(i===s)return t.reason||"";var n=Math.abs(t.change_24h||0).toFixed(1),o=Math.abs(t.change_7d||0).toFixed(1);return i.replace("{change}",n).replace("{change7d}",o)},formatOppPrice:function(t){return t?t>=1e4?(t/1e3).toFixed(1)+"K":t>=1?t.toFixed(2):t.toFixed(4):"--"},analyzeOpportunity:function(t){var a=this;if("PredictionMarket"===t.market)return this.activeTab="polymarket",void(this.showPolymarketModal=!0);this.activeTab="quick";var e=t.market||"Crypto";this.presetSymbol="".concat(e,":").concat(t.symbol),this.$nextTick(function(){a.autoAnalyzeSignal++})},getRecommendationColor:function(t){var a={YES:"green",NO:"red",HOLD:"default"};return a[t]||"default"},getRecommendationLabel:function(t){return this.$t("polymarket.recommendation.".concat(t))||t},onAnalysisSymbolChange:function(t){if(!t)return this.currentAnalysisSymbol="",void(this.currentAnalysisMarket="");var a=t.split(":"),e=a.length>1?a[0]:"Crypto",s=a.length>1?a[1]:a[0];this.currentAnalysisMarket=e,this.currentAnalysisSymbol="Crypto"===e?s:""},openQuickTradeFromCurrent:function(){this.currentAnalysisSymbol&&(this.qtSymbol=this.currentAnalysisSymbol,this.qtSide="",this.qtPrice=0,this.qtSource="ai_analysis",this.showQuickTrade=!0)},openQuickTradeFromOpp:function(t){if("Crypto"===t.market){this.qtSymbol=t.symbol||"";var a=(t.signal||"").toLowerCase();a.includes("oversold")||a.includes("bullish")?this.qtSide="buy":a.includes("overbought")||a.includes("bearish")?this.qtSide="sell":this.qtSide="",this.qtPrice=t.price||0,this.qtSource="ai_radar",this.showQuickTrade=!0}},onQuickTradeSuccess:function(){this.$message.success(this.$t("quickTrade.orderSuccess"))},handleQuickTradeSymbolChange:function(t){t&&(this.qtSymbol=t)}}},T=A,w=(0,C.A)(T,s,i,!1,null,"20b827f5",null),x=w.exports}}]); \ No newline at end of file diff --git a/frontend/dist/js/893-legacy.4f5de492.js b/frontend/dist/js/893-legacy.4f5de492.js deleted file mode 100644 index 4b50d5f..0000000 --- a/frontend/dist/js/893-legacy.4f5de492.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self["webpackChunkvue_antd_pro"]=self["webpackChunkvue_antd_pro"]||[]).push([[893],{80893:function(t,a,s){s.r(a),s.d(a,{default:function(){return M}});s(28706),s(34782),s(62010),s(9868);var e=function(){var t=this,a=t._self._c;return a("div",{staticClass:"ai-analysis-container",class:{"theme-dark":t.isDarkTheme,embedded:t.embedded},style:{"--primary-color":t.primaryColor}},[a("div",{staticClass:"main-content-full"},[a("div",{staticClass:"top-index-bar"},[t.loadingSentiment?[t._m(0),t._m(1),t._m(2)]:[a("div",{staticClass:"indicator-box fear-greed",class:t.getFearGreedClass(t.marketData.fearGreed)},[a("span",{staticClass:"ind-label"},[t._v(t._s(t.$t("globalMarket.fearGreedShort")))]),a("span",{staticClass:"ind-value"},[t._v(t._s(t.marketData.fearGreed||"--"))])]),a("div",{staticClass:"indicator-box vix",class:t.getVixLevel(t.marketData.vix)},[a("span",{staticClass:"ind-label"},[t._v("VIX")]),a("span",{staticClass:"ind-value"},[t._v(t._s(t.marketData.vix||"--"))])]),a("div",{staticClass:"indicator-box dxy"},[a("span",{staticClass:"ind-label"},[t._v("DXY")]),a("span",{staticClass:"ind-value"},[t._v(t._s(t.marketData.dxy||"--"))])])],a("div",{staticClass:"indices-marquee"},[t.loadingIndices?[a("div",{staticClass:"indices-loading"},[a("a-icon",{attrs:{type:"loading"}}),t._v(" "+t._s(t.$t("common.loading")||"加载中...")+" ")],1)]:t.marketData.indices.length>0?[a("div",{staticClass:"marquee-track"},[t._l(t.marketData.indices,function(s){return a("div",{key:"a-"+s.symbol,staticClass:"index-item"},[a("span",{staticClass:"idx-flag"},[t._v(t._s(s.flag))]),a("span",{staticClass:"idx-symbol"},[t._v(t._s(s.symbol))]),a("span",{staticClass:"idx-price"},[t._v(t._s(t.formatPrice(s.price)))]),a("span",{staticClass:"idx-change",class:s.change>=0?"up":"down"},[a("a-icon",{attrs:{type:s.change>=0?"caret-up":"caret-down"}}),t._v(" "+t._s(Math.abs(s.change).toFixed(2))+"% ")],1)])}),t._l(t.marketData.indices,function(s){return a("div",{key:"b-"+s.symbol,staticClass:"index-item"},[a("span",{staticClass:"idx-flag"},[t._v(t._s(s.flag))]),a("span",{staticClass:"idx-symbol"},[t._v(t._s(s.symbol))]),a("span",{staticClass:"idx-price"},[t._v(t._s(t.formatPrice(s.price)))]),a("span",{staticClass:"idx-change",class:s.change>=0?"up":"down"},[a("a-icon",{attrs:{type:s.change>=0?"caret-up":"caret-down"}}),t._v(" "+t._s(Math.abs(s.change).toFixed(2))+"% ")],1)])})],2)]:[a("div",{staticClass:"indices-empty"},[t._v("--")])]],2),a("a-button",{staticClass:"refresh-btn",attrs:{type:"link",size:"small",loading:t.loadingMarket},on:{click:t.loadMarketData}},[a("a-icon",{attrs:{type:"sync",spin:t.loadingMarket}})],1)],2),a("div",{staticClass:"main-body"},[a("div",{staticClass:"left-panel"},[a("div",{staticClass:"heatmap-box"},[a("div",{staticClass:"box-header"},[a("a-radio-group",{attrs:{size:"small","button-style":"solid"},model:{value:t.heatmapType,callback:function(a){t.heatmapType=a},expression:"heatmapType"}},[a("a-radio-button",{attrs:{value:"crypto"}},[t._v(t._s(t.$t("globalMarket.cryptoHeatmap")))]),a("a-radio-button",{attrs:{value:"commodities"}},[t._v(t._s(t.$t("globalMarket.commoditiesHeatmap")))]),a("a-radio-button",{attrs:{value:"sectors"}},[t._v(t._s(t.$t("globalMarket.sectorHeatmap")))]),a("a-radio-button",{attrs:{value:"forex"}},[t._v(t._s(t.$t("globalMarket.forexHeatmap")))])],1)],1),a("div",{staticClass:"heatmap-grid"},[t.loadingHeatmap?t._l(12,function(t){return a("div",{key:"skel-"+t,staticClass:"heat-cell skeleton-cell"},[a("span",{staticClass:"skeleton-text short"}),a("span",{staticClass:"skeleton-text"})])}):t.currentHeatmap.length>0?t._l(t.currentHeatmap.slice(0,12),function(s,e){return a("div",{key:e,staticClass:"heat-cell",style:t.getHeatmapStyle(s.value)},[a("span",{staticClass:"heat-name"},[t._v(t._s(t.getHeatmapName(s)))]),s.price?a("span",{staticClass:"heat-price"},[t._v(t._s(t.formatHeatmapPrice(s.price)))]):t._e(),a("span",{staticClass:"heat-val"},[t._v(t._s(s.value>=0?"+":"")+t._s(t.formatNum(s.value))+"%")])])}):[a("div",{staticClass:"heatmap-empty"},[t._v(t._s(t.$t("common.noData")||"暂无数据"))])]],2)]),a("div",{staticClass:"calendar-box"},[a("div",{staticClass:"box-header"},[a("span",{staticClass:"box-title"},[a("a-icon",{attrs:{type:"calendar"}}),t._v(" "+t._s(t.$t("globalMarket.calendar")))],1)]),a("div",{staticClass:"calendar-list"},[t.loadingCalendar?t._l(5,function(t){return a("div",{key:"cal-skel-"+t,staticClass:"cal-item skeleton-item"},[a("span",{staticClass:"skeleton-text short"}),a("span",{staticClass:"skeleton-text short"}),a("span",{staticClass:"skeleton-text"})])}):t.marketData.calendar.length>0?t._l(t.marketData.calendar.slice(0,10),function(s){return a("div",{key:s.id,staticClass:"cal-item",class:s.importance},[a("span",{staticClass:"cal-date"},[t._v(t._s(t.formatCalendarDate(s.date)))]),a("span",{staticClass:"cal-time"},[t._v(t._s(s.time||"--:--"))]),a("span",{staticClass:"cal-flag"},[t._v(t._s(t.getCountryFlag(s.country)))]),a("span",{staticClass:"cal-name"},[t._v(t._s(t.isZhLocale?s.name:s.name_en))]),a("span",{staticClass:"cal-impact",class:t.getImpactClass(s)},["bullish"===t.getImpactClass(s)?a("a-icon",{attrs:{type:"arrow-up"}}):"bearish"===t.getImpactClass(s)?a("a-icon",{attrs:{type:"arrow-down"}}):a("a-icon",{attrs:{type:"minus"}}),t._v(" "+t._s(s.actual||s.forecast||"--")+" ")],1)])}):[a("div",{staticClass:"cal-empty"},[t._v(t._s(t.$t("globalMarket.noEvents")))])]],2)])]),a("div",{staticClass:"right-panel"},[a("div",{staticClass:"analysis-toolbar"},[a("a-select",{staticClass:"symbol-selector",attrs:{placeholder:t.$t("dashboard.analysis.empty.selectSymbol"),size:"large","show-search":"","allow-clear":"","filter-option":t.filterSymbolOption},on:{change:t.handleSymbolChange},model:{value:t.selectedSymbol,callback:function(a){t.selectedSymbol=a},expression:"selectedSymbol"}},[t._l(t.watchlist||[],function(s){return a("a-select-option",{key:"".concat(s.market,"-").concat(s.symbol),attrs:{value:"".concat(s.market,":").concat(s.symbol)}},[a("span",{staticClass:"symbol-option"},[a("a-tag",{attrs:{color:t.getMarketColor(s.market),size:"small"}},[t._v(t._s(t.getMarketName(s.market)))]),a("strong",{staticStyle:{"margin-left":"6px"}},[t._v(t._s(s.symbol))]),s.name?a("span",{staticClass:"symbol-name"},[t._v(t._s(s.name))]):t._e()],1)])}),a("a-select-option",{key:"add-stock-option",staticClass:"add-stock-option",attrs:{value:"__add_stock_option__"}},[a("div",{staticStyle:{"text-align":"center",padding:"4px 0",color:"#1890ff"}},[a("a-icon",{staticStyle:{"margin-right":"4px"},attrs:{type:"plus"}}),t._v(t._s(t.$t("dashboard.analysis.watchlist.add"))+" ")],1)])],2),a("a-button",{staticClass:"analyze-button",attrs:{type:"primary",size:"large",icon:"thunderbolt",loading:t.analyzing,disabled:!t.selectedSymbol},on:{click:t.startFastAnalysis}},[t._v(" "+t._s(t.$t("fastAnalysis.startAnalysis"))+" ")]),a("a-button",{staticClass:"history-button",attrs:{size:"large",icon:"history"},on:{click:function(a){t.showHistoryModal=!0,t.loadHistoryList()}}},[t._v(" "+t._s(t.$t("fastAnalysis.history"))+" ")])],1),a("div",{staticClass:"analysis-main"},[t.analysisResult||t.analyzing?t._e():a("div",{staticClass:"analysis-placeholder"},[a("div",{staticClass:"placeholder-content"},[a("div",{staticClass:"placeholder-icon"},[a("a-icon",{attrs:{type:"robot"}})],1),a("h3",[t._v(t._s(t.$t("fastAnalysis.selectTip")))]),a("p",[t._v(t._s(t.$t("fastAnalysis.selectHint")))])])]),t.analysisResult||t.analyzing?a("FastAnalysisReport",{attrs:{result:t.analysisResult,loading:t.analyzing,error:t.analysisError},on:{retry:t.startFastAnalysis}}):t._e()],1)]),a("div",{staticClass:"watchlist-panel"},[a("div",{staticClass:"panel-header"},[a("span",{staticClass:"panel-title"},[a("a-icon",{attrs:{type:"star",theme:"filled"}}),t._v(" "+t._s(t.$t("dashboard.analysis.watchlist.title")))],1),a("a-button",{attrs:{type:"link",size:"small"},on:{click:function(a){t.showAddStockModal=!0}}},[a("a-icon",{attrs:{type:"plus"}})],1)],1),a("div",{staticClass:"watchlist-list"},[t._l(t.watchlist||[],function(s){var e,i,r;return a("div",{key:"".concat(s.market,"-").concat(s.symbol),staticClass:"watchlist-item",class:{active:t.selectedSymbol==="".concat(s.market,":").concat(s.symbol)},on:{click:function(a){return t.selectWatchlistItem(s)}}},[a("div",{staticClass:"item-main"},[a("span",{staticClass:"item-symbol"},[t._v(t._s(s.symbol))]),a("span",{staticClass:"item-name"},[t._v(t._s(s.name||t.getMarketName(s.market)))])]),t.watchlistPrices["".concat(s.market,":").concat(s.symbol)]?a("div",{staticClass:"item-price"},[a("span",{staticClass:"price-value"},[t._v(t._s(t.formatPrice(t.watchlistPrices["".concat(s.market,":").concat(s.symbol)].price)))]),a("span",{staticClass:"price-change",class:((null===(e=t.watchlistPrices["".concat(s.market,":").concat(s.symbol)])||void 0===e?void 0:e.change)||0)>=0?"up":"down"},[t._v(" "+t._s(((null===(i=t.watchlistPrices["".concat(s.market,":").concat(s.symbol)])||void 0===i?void 0:i.change)||0)>=0?"+":"")+t._s(t.formatNum(null===(r=t.watchlistPrices["".concat(s.market,":").concat(s.symbol)])||void 0===r?void 0:r.change))+"% ")])]):t._e(),a("a-icon",{staticClass:"item-remove",attrs:{type:"close"},on:{click:function(a){return a.stopPropagation(),t.removeFromWatchlist(s)}}})],1)}),t.watchlist&&0!==t.watchlist.length?t._e():a("div",{staticClass:"watchlist-empty"},[a("a-icon",{attrs:{type:"inbox"}}),a("p",[t._v(t._s(t.$t("dashboard.analysis.empty.noWatchlist")))]),a("a-button",{attrs:{type:"primary",size:"small"},on:{click:function(a){t.showAddStockModal=!0}}},[a("a-icon",{attrs:{type:"plus"}}),t._v(" "+t._s(t.$t("dashboard.analysis.watchlist.add"))+" ")],1)],1)],2)])])]),a("a-modal",{attrs:{title:t.$t("dashboard.analysis.modal.addStock.title"),visible:t.showAddStockModal,confirmLoading:t.addingStock,width:"600px",okText:t.$t("dashboard.analysis.modal.addStock.confirm"),cancelText:t.$t("dashboard.analysis.modal.addStock.cancel")},on:{ok:t.handleAddStock,cancel:t.handleCloseAddStockModal}},[a("div",{staticClass:"add-stock-modal-content"},[a("a-tabs",{staticClass:"market-tabs",on:{change:t.handleMarketTabChange},model:{value:t.selectedMarketTab,callback:function(a){t.selectedMarketTab=a},expression:"selectedMarketTab"}},t._l(t.marketTypes,function(s){return a("a-tab-pane",{key:s.value,attrs:{tab:t.$t(s.i18nKey||"dashboard.analysis.market.".concat(s.value))}})}),1),a("div",{staticClass:"symbol-search-section"},[a("a-input-search",{attrs:{placeholder:t.$t("dashboard.analysis.modal.addStock.searchOrInputPlaceholder"),loading:t.searchingSymbols,size:"large","allow-clear":""},on:{search:t.handleSearchOrInput,change:t.handleSymbolSearchInput},model:{value:t.symbolSearchKeyword,callback:function(a){t.symbolSearchKeyword=a},expression:"symbolSearchKeyword"}},[a("a-button",{attrs:{slot:"enterButton",type:"primary",icon:"search"},slot:"enterButton"},[t._v(" "+t._s(t.$t("dashboard.analysis.modal.addStock.search"))+" ")])],1)],1),t.symbolSearchResults.length>0?a("div",{staticClass:"search-results-section"},[a("div",{staticClass:"section-title"},[a("a-icon",{staticStyle:{"margin-right":"4px"},attrs:{type:"search"}}),t._v(" "+t._s(t.$t("dashboard.analysis.modal.addStock.searchResults"))+" ")],1),a("a-list",{staticClass:"symbol-list",attrs:{"data-source":t.symbolSearchResults,loading:t.searchingSymbols,size:"small"},scopedSlots:t._u([{key:"renderItem",fn:function(s){return a("a-list-item",{staticClass:"symbol-list-item",on:{click:function(a){return t.selectSymbol(s)}}},[a("a-list-item-meta",[a("template",{slot:"title"},[a("div",{staticClass:"symbol-item-content"},[a("span",{staticClass:"symbol-code"},[t._v(t._s(s.symbol))]),a("span",{staticClass:"symbol-name"},[t._v(t._s(s.name))]),s.exchange?a("a-tag",{staticStyle:{"margin-left":"8px"},attrs:{size:"small",color:"blue"}},[t._v(" "+t._s(s.exchange)+" ")]):t._e()],1)])],2)],1)}}],null,!1,1074844145)})],1):t._e(),a("div",{staticClass:"hot-symbols-section"},[a("div",{staticClass:"section-title"},[a("a-icon",{staticStyle:{color:"#ff4d4f","margin-right":"4px"},attrs:{type:"fire"}}),t._v(" "+t._s(t.$t("dashboard.analysis.modal.addStock.hotSymbols"))+" ")],1),a("a-spin",{attrs:{spinning:t.loadingHotSymbols}},[t.hotSymbols.length>0?a("a-list",{staticClass:"symbol-list",attrs:{"data-source":t.hotSymbols,size:"small"},scopedSlots:t._u([{key:"renderItem",fn:function(s){return a("a-list-item",{staticClass:"symbol-list-item",on:{click:function(a){return t.selectSymbol(s)}}},[a("a-list-item-meta",[a("template",{slot:"title"},[a("div",{staticClass:"symbol-item-content"},[a("span",{staticClass:"symbol-code"},[t._v(t._s(s.symbol))]),a("span",{staticClass:"symbol-name"},[t._v(t._s(s.name))]),s.exchange?a("a-tag",{staticStyle:{"margin-left":"8px"},attrs:{size:"small",color:"orange"}},[t._v(" "+t._s(s.exchange)+" ")]):t._e()],1)])],2)],1)}}],null,!1,2177647935)}):a("a-empty",{attrs:{description:t.$t("dashboard.analysis.modal.addStock.noHotSymbols"),image:!1}})],1)],1),t.selectedSymbolForAdd?a("div",{staticClass:"selected-symbol-section"},[a("a-alert",{attrs:{message:t.$t("dashboard.analysis.modal.addStock.selectedSymbol"),type:"info","show-icon":"",closable:""},on:{close:function(a){t.selectedSymbolForAdd=null}}},[a("template",{slot:"description"},[a("div",{staticClass:"selected-symbol-info"},[a("a-tag",{staticStyle:{"margin-right":"8px"},attrs:{color:t.getMarketColor(t.selectedSymbolForAdd.market)}},[t._v(" "+t._s(t.$t("dashboard.analysis.market.".concat(t.selectedSymbolForAdd.market)))+" ")]),a("strong",[t._v(t._s(t.selectedSymbolForAdd.symbol))]),t.selectedSymbolForAdd.name?a("span",{staticStyle:{color:"#999","margin-left":"8px"}},[t._v(t._s(t.selectedSymbolForAdd.name))]):t._e()],1)])],2)],1):t._e()],1)]),a("a-modal",{attrs:{title:t.$t("dashboard.analysis.modal.history.title"),visible:t.showHistoryModal,footer:null,width:"800px",bodyStyle:{maxHeight:"60vh",overflowY:"auto"}},on:{cancel:function(a){t.showHistoryModal=!1}}},[a("a-spin",{attrs:{spinning:t.historyLoading}},[a("a-list",{attrs:{"data-source":t.historyList,pagination:{current:t.historyPage,pageSize:t.historyPageSize,total:t.historyTotal,onChange:function(a){t.historyPage=a,t.loadHistoryList()},showSizeChanger:!0,pageSizeOptions:["10","20","50"],onShowSizeChange:function(a,s){t.historyPageSize=s,t.historyPage=1,t.loadHistoryList()}}},scopedSlots:t._u([{key:"renderItem",fn:function(s){return a("a-list-item",{},[a("a-list-item-meta",[a("template",{slot:"title"},[a("div",{staticStyle:{display:"flex","align-items":"center","justify-content":"space-between"}},[a("div",[a("a-tag",{staticStyle:{"margin-right":"8px"},attrs:{color:t.getMarketColor(s.market)}},[t._v(" "+t._s(t.getMarketName(s.market))+" ")]),a("strong",[t._v(t._s(s.symbol))]),a("a-tag",{staticStyle:{"margin-left":"12px"},attrs:{color:"BUY"===s.decision?"green":"SELL"===s.decision?"red":"blue"}},[t._v(" "+t._s(s.decision)+" ")]),a("span",{staticStyle:{color:"#999","margin-left":"8px","font-size":"12px"}},[t._v(" "+t._s(t.$t("fastAnalysis.confidence"))+": "+t._s(s.confidence)+"% ")])],1),a("div",[a("a-button",{attrs:{type:"link",size:"small",icon:"eye"},on:{click:function(a){return t.viewHistoryResult(s)}}},[t._v(" "+t._s(t.$t("dashboard.analysis.modal.history.viewResult"))+" ")]),a("a-popconfirm",{attrs:{title:t.$t("dashboard.analysis.modal.history.deleteConfirm"),"ok-text":t.$t("common.confirm"),"cancel-text":t.$t("common.cancel")},on:{confirm:function(a){return t.deleteHistoryItem(s)}}},[a("a-button",{staticStyle:{color:"#ff4d4f"},attrs:{type:"link",size:"small",icon:"delete"}},[t._v(" "+t._s(t.$t("dashboard.analysis.modal.history.delete"))+" ")])],1)],1)])]),a("template",{slot:"description"},[a("div",{staticStyle:{color:"#666","font-size":"12px"}},[s.price?a("span",[t._v("$"+t._s(t.formatNumber(s.price)))]):t._e(),s.summary?a("span",{staticStyle:{"margin-left":"8px"}},[t._v(t._s(s.summary.substring(0,80))+t._s(s.summary.length>80?"...":""))]):t._e()]),s.created_at?a("div",{staticStyle:{color:"#999","font-size":"12px","margin-top":"4px"}},[t._v(" "+t._s(t.formatIsoTime(s.created_at))+" ")]):t._e()])],2)],1)}}])}),t.historyLoading||0!==t.historyList.length?t._e():a("a-empty",{attrs:{description:t.$t("dashboard.analysis.empty.noHistory")}})],1)],1)],1)},i=[function(){var t=this,a=t._self._c;return a("div",{staticClass:"indicator-box skeleton-box"},[a("span",{staticClass:"skeleton-text short"}),a("span",{staticClass:"skeleton-text"})])},function(){var t=this,a=t._self._c;return a("div",{staticClass:"indicator-box skeleton-box"},[a("span",{staticClass:"skeleton-text short"}),a("span",{staticClass:"skeleton-text"})])},function(){var t=this,a=t._self._c;return a("div",{staticClass:"indicator-box skeleton-box"},[a("span",{staticClass:"skeleton-text short"}),a("span",{staticClass:"skeleton-text"})])}],r=s(68285),n=s(21092),l=s(76959),o=s(17654),c=s(57888),d=(s(74423),s(62062),s(2892),s(26099),s(21699),s(42762),s(23500),s(95353)),u=s(55585),m=s(64118),h=s(76471),y="/api/fast-analysis";function p(t){return(0,h.Ay)({url:"".concat(y,"/analyze"),method:"post",data:t,timeout:3e5})}function v(t){return(0,h.Ay)({url:"".concat(y,"/history/all"),method:"get",params:t})}function f(t){return(0,h.Ay)({url:"".concat(y,"/history/").concat(t),method:"delete"})}function g(t){return(0,h.Ay)({url:"".concat(y,"/feedback"),method:"post",data:t})}var b=s(62618),_=(s(79432),function(){var t,a,s,e,i,r,n,l,o,c,d,u,m,h,y,p,v,f,g,b,_,k,C,S,A,w=this,$=w._self._c;return $("div",{staticClass:"fast-analysis-report",class:{"theme-dark":w.isDarkTheme}},[w.loading?$("div",{staticClass:"loading-container"},[$("div",{staticClass:"loading-content-pro"},[$("div",{staticClass:"loading-header"},[$("a-icon",{staticClass:"loading-icon-pro",attrs:{type:"thunderbolt"}}),$("span",{staticClass:"loading-title"},[w._v(w._s(w.$t("fastAnalysis.analyzing")))])],1),$("div",{staticClass:"progress-wrapper"},[$("a-progress",{attrs:{percent:w.progressPercent,showInfo:!1,strokeColor:"#1890ff",strokeWidth:8}}),$("span",{staticClass:"progress-text"},[w._v(w._s(w.formatProgress(w.progressPercent))+"%")])],1),$("div",{staticClass:"current-step"},[$("a-icon",{attrs:{type:"loading",spin:""}}),$("span",[w._v(w._s(w.currentStepText))])],1),$("div",{staticClass:"steps-list"},[$("div",{staticClass:"step-item",class:{done:w.step>1,active:1===w.step}},[$("span",{staticClass:"step-dot"}),$("span",{staticClass:"step-text"},[w._v(w._s(w.$t("fastAnalysis.step1")||"获取实时数据"))]),w.step>1?$("a-icon",{staticClass:"step-check",attrs:{type:"check"}}):w._e()],1),$("div",{staticClass:"step-item",class:{done:w.step>2,active:2===w.step}},[$("span",{staticClass:"step-dot"}),$("span",{staticClass:"step-text"},[w._v(w._s(w.$t("fastAnalysis.step2")||"计算技术指标"))]),w.step>2?$("a-icon",{staticClass:"step-check",attrs:{type:"check"}}):w._e()],1),$("div",{staticClass:"step-item",class:{done:w.step>3,active:3===w.step}},[$("span",{staticClass:"step-dot"}),$("span",{staticClass:"step-text"},[w._v(w._s(w.$t("fastAnalysis.step3")||"AI深度分析"))]),w.step>3?$("a-icon",{staticClass:"step-check",attrs:{type:"check"}}):w._e()],1),$("div",{staticClass:"step-item",class:{done:w.step>4,active:4===w.step}},[$("span",{staticClass:"step-dot"}),$("span",{staticClass:"step-text"},[w._v(w._s(w.$t("fastAnalysis.step4")||"生成报告"))]),w.step>4?$("a-icon",{staticClass:"step-check",attrs:{type:"check"}}):w._e()],1)]),$("div",{staticClass:"loading-footer"},[$("span",{staticClass:"elapsed-time"},[w._v(w._s(w.elapsedTimeText))])])])]):w.error?$("div",{staticClass:"error-container"},[$("a-result",{attrs:{status:"error",title:w.$t("fastAnalysis.error"),"sub-title":w.error},scopedSlots:w._u([{key:"extra",fn:function(){return[$("a-button",{attrs:{type:"primary"},on:{click:function(t){return w.$emit("retry")}}},[w._v(" "+w._s(w.$t("fastAnalysis.retry"))+" ")])]},proxy:!0}])})],1):w.result?$("div",{staticClass:"result-container"},[$("div",{staticClass:"decision-card",class:w.decisionClass},[$("div",{staticClass:"decision-main"},[$("div",{staticClass:"decision-badge"},[$("a-icon",{attrs:{type:w.decisionIcon}}),$("span",{staticClass:"decision-text"},[w._v(w._s(w.result.decision))])],1),$("div",{staticClass:"confidence-ring"},[$("a-progress",{attrs:{type:"circle",percent:w.result.confidence,width:80,strokeColor:w.confidenceColor},scopedSlots:w._u([{key:"format",fn:function(t){return[$("span",{staticClass:"confidence-value"},[w._v(w._s(t)+"%")])]}}])}),$("div",{staticClass:"confidence-label"},[w._v(w._s(w.$t("fastAnalysis.confidence")))])],1)]),$("div",{staticClass:"decision-summary"},[w._v(" "+w._s(w.result.summary)+" ")])]),$("div",{staticClass:"price-info-row"},[$("div",{staticClass:"price-card current"},[$("div",{staticClass:"price-label"},[w._v(w._s(w.$t("fastAnalysis.currentPrice")))]),$("div",{staticClass:"price-value"},[w._v("$"+w._s(w.formatPrice(null===(t=w.result.market_data)||void 0===t?void 0:t.current_price)))]),$("div",{staticClass:"price-change",class:(null===(a=w.result.market_data)||void 0===a?void 0:a.change_24h)>=0?"positive":"negative"},[w._v(" "+w._s((null===(s=w.result.market_data)||void 0===s?void 0:s.change_24h)>=0?"+":"")+w._s(w.formatNumber(null===(e=w.result.market_data)||void 0===e?void 0:e.change_24h,2))+"% ")])]),$("div",{staticClass:"price-card entry"},[$("div",{staticClass:"price-label"},[w._v(w._s(w.$t("fastAnalysis.entryPrice")))]),$("div",{staticClass:"price-value"},[w._v("$"+w._s(w.formatPrice(null===(i=w.result.trading_plan)||void 0===i?void 0:i.entry_price)))])]),$("div",{staticClass:"price-card stop"},[$("div",{staticClass:"price-label"},[w._v(w._s(w.$t("fastAnalysis.stopLoss")))]),$("div",{staticClass:"price-value negative"},[w._v("$"+w._s(w.formatPrice(null===(r=w.result.trading_plan)||void 0===r?void 0:r.stop_loss)))]),$("div",{staticClass:"price-hint"},[$("a-tooltip",{attrs:{title:w.$t("fastAnalysis.stopLossHint")}},[$("a-icon",{attrs:{type:"info-circle"}}),w._v(" "+w._s(w.$t("fastAnalysis.atrBased"))+" ")],1)],1)]),$("div",{staticClass:"price-card target"},[$("div",{staticClass:"price-label"},[w._v(w._s(w.$t("fastAnalysis.takeProfit")))]),$("div",{staticClass:"price-value positive"},[w._v("$"+w._s(w.formatPrice(null===(n=w.result.trading_plan)||void 0===n?void 0:n.take_profit)))]),$("div",{staticClass:"price-hint"},[$("a-tooltip",{attrs:{title:w.$t("fastAnalysis.takeProfitHint")}},[$("a-icon",{attrs:{type:"info-circle"}}),w._v(" "+w._s(w.$t("fastAnalysis.atrBased"))+" ")],1)],1)])]),$("div",{staticClass:"scores-row"},[$("div",{staticClass:"score-item"},[$("div",{staticClass:"score-header"},[$("a-icon",{attrs:{type:"line-chart"}}),$("span",[w._v(w._s(w.$t("fastAnalysis.technical")))])],1),$("a-progress",{attrs:{percent:(null===(l=w.result.scores)||void 0===l?void 0:l.technical)||50,strokeColor:w.getScoreColor(null===(o=w.result.scores)||void 0===o?void 0:o.technical),showInfo:!1}}),$("div",{staticClass:"score-value"},[w._v(w._s((null===(c=w.result.scores)||void 0===c?void 0:c.technical)||50))])],1),$("div",{staticClass:"score-item"},[$("div",{staticClass:"score-header"},[$("a-icon",{attrs:{type:"bank"}}),$("span",[w._v(w._s(w.$t("fastAnalysis.fundamental")))])],1),$("a-progress",{attrs:{percent:(null===(d=w.result.scores)||void 0===d?void 0:d.fundamental)||50,strokeColor:w.getScoreColor(null===(u=w.result.scores)||void 0===u?void 0:u.fundamental),showInfo:!1}}),$("div",{staticClass:"score-value"},[w._v(w._s((null===(m=w.result.scores)||void 0===m?void 0:m.fundamental)||50))])],1),$("div",{staticClass:"score-item"},[$("div",{staticClass:"score-header"},[$("a-icon",{attrs:{type:"heart"}}),$("span",[w._v(w._s(w.$t("fastAnalysis.sentiment")))])],1),$("a-progress",{attrs:{percent:(null===(h=w.result.scores)||void 0===h?void 0:h.sentiment)||50,strokeColor:w.getScoreColor(null===(y=w.result.scores)||void 0===y?void 0:y.sentiment),showInfo:!1}}),$("div",{staticClass:"score-value"},[w._v(w._s((null===(p=w.result.scores)||void 0===p?void 0:p.sentiment)||50))])],1),$("div",{staticClass:"score-item overall"},[$("div",{staticClass:"score-header"},[$("a-icon",{attrs:{type:"dashboard"}}),$("span",[w._v(w._s(w.$t("fastAnalysis.overall")))])],1),$("a-progress",{attrs:{percent:(null===(v=w.result.scores)||void 0===v?void 0:v.overall)||50,strokeColor:w.getScoreColor(null===(f=w.result.scores)||void 0===f?void 0:f.overall),showInfo:!1}}),$("div",{staticClass:"score-value"},[w._v(w._s((null===(g=w.result.scores)||void 0===g?void 0:g.overall)||50))])],1)]),w.result.detailed_analysis?$("div",{staticClass:"detailed-analysis"},[w.result.detailed_analysis.technical?$("div",{staticClass:"analysis-card technical"},[$("div",{staticClass:"analysis-card-header"},[$("a-icon",{attrs:{type:"line-chart"}}),$("span",[w._v(w._s(w.$t("fastAnalysis.technicalAnalysis")))]),$("a-tag",{attrs:{color:w.getScoreTagColor(null===(b=w.result.scores)||void 0===b?void 0:b.technical)}},[w._v(" "+w._s((null===(_=w.result.scores)||void 0===_?void 0:_.technical)||50)+"分 ")])],1),$("div",{staticClass:"analysis-card-content"},[w._v(" "+w._s(w.result.detailed_analysis.technical)+" ")])]):w._e(),w.result.detailed_analysis.fundamental?$("div",{staticClass:"analysis-card fundamental"},[$("div",{staticClass:"analysis-card-header"},[$("a-icon",{attrs:{type:"bank"}}),$("span",[w._v(w._s(w.$t("fastAnalysis.fundamentalAnalysis")))]),$("a-tag",{attrs:{color:w.getScoreTagColor(null===(k=w.result.scores)||void 0===k?void 0:k.fundamental)}},[w._v(" "+w._s((null===(C=w.result.scores)||void 0===C?void 0:C.fundamental)||50)+"分 ")])],1),$("div",{staticClass:"analysis-card-content"},[w._v(" "+w._s(w.result.detailed_analysis.fundamental)+" ")])]):w._e(),w.result.detailed_analysis.sentiment?$("div",{staticClass:"analysis-card sentiment"},[$("div",{staticClass:"analysis-card-header"},[$("a-icon",{attrs:{type:"heart"}}),$("span",[w._v(w._s(w.$t("fastAnalysis.sentimentAnalysis")))]),$("a-tag",{attrs:{color:w.getScoreTagColor(null===(S=w.result.scores)||void 0===S?void 0:S.sentiment)}},[w._v(" "+w._s((null===(A=w.result.scores)||void 0===A?void 0:A.sentiment)||50)+"分 ")])],1),$("div",{staticClass:"analysis-card-content"},[w._v(" "+w._s(w.result.detailed_analysis.sentiment)+" ")])]):w._e()]):w._e(),$("div",{staticClass:"analysis-details"},[$("div",{staticClass:"detail-section reasons"},[$("div",{staticClass:"section-title"},[$("a-icon",{attrs:{type:"bulb",theme:"twoTone",twoToneColor:"#52c41a"}}),$("span",[w._v(w._s(w.$t("fastAnalysis.keyReasons")))])],1),$("ul",{staticClass:"detail-list"},w._l(w.result.reasons,function(t,a){return $("li",{key:"r-"+a},[w._v(" "+w._s(t)+" ")])}),0)]),$("div",{staticClass:"detail-section risks"},[$("div",{staticClass:"section-title"},[$("a-icon",{attrs:{type:"warning",theme:"twoTone",twoToneColor:"#faad14"}}),$("span",[w._v(w._s(w.$t("fastAnalysis.risks")))])],1),$("ul",{staticClass:"detail-list"},w._l(w.result.risks,function(t,a){return $("li",{key:"k-"+a},[w._v(" "+w._s(t)+" ")])}),0)])]),w.result.indicators&&Object.keys(w.result.indicators).length>0?$("div",{staticClass:"indicators-section"},[$("div",{staticClass:"section-title"},[$("a-icon",{attrs:{type:"stock"}}),$("span",[w._v(w._s(w.$t("fastAnalysis.indicators")))])],1),$("div",{staticClass:"indicators-grid"},[w.result.indicators.rsi?$("div",{staticClass:"indicator-item"},[$("div",{staticClass:"indicator-name"},[w._v("RSI (14)")]),$("div",{staticClass:"indicator-value",class:w.getRsiClass(w.result.indicators.rsi.value)},[w._v(" "+w._s(w.formatNumber(w.result.indicators.rsi.value,1))+" ")]),$("div",{staticClass:"indicator-signal"},[w._v(w._s(w.translateSignal(w.result.indicators.rsi.signal)))])]):w._e(),w.result.indicators.macd?$("div",{staticClass:"indicator-item"},[$("div",{staticClass:"indicator-name"},[w._v("MACD")]),$("div",{staticClass:"indicator-value",class:"bullish"===w.result.indicators.macd.signal?"bullish":"bearish"===w.result.indicators.macd.signal?"bearish":""},[w._v(" "+w._s(w.translateTrend(w.result.indicators.macd.trend))+" ")]),$("div",{staticClass:"indicator-signal"},[w._v(w._s(w.translateSignal(w.result.indicators.macd.signal)))])]):w._e(),w.result.indicators.moving_averages?$("div",{staticClass:"indicator-item"},[$("div",{staticClass:"indicator-name"},[w._v(w._s(w.$t("fastAnalysis.maTrend")))]),$("div",{staticClass:"indicator-value",class:w.getMaTrendClass(w.result.indicators.moving_averages.trend)},[w._v(" "+w._s(w.translateTrend(w.result.indicators.moving_averages.trend))+" ")])]):w._e(),w.result.indicators.levels?$("div",{staticClass:"indicator-item"},[$("div",{staticClass:"indicator-name"},[w._v(w._s(w.$t("fastAnalysis.support")))]),$("div",{staticClass:"indicator-value"},[w._v("$"+w._s(w.formatPrice(w.result.indicators.levels.support)))])]):w._e(),w.result.indicators.levels?$("div",{staticClass:"indicator-item"},[$("div",{staticClass:"indicator-name"},[w._v(w._s(w.$t("fastAnalysis.resistance")))]),$("div",{staticClass:"indicator-value"},[w._v("$"+w._s(w.formatPrice(w.result.indicators.levels.resistance)))])]):w._e(),w.result.indicators.volatility?$("div",{staticClass:"indicator-item"},[$("div",{staticClass:"indicator-name"},[w._v(w._s(w.$t("fastAnalysis.volatility")))]),$("div",{staticClass:"indicator-value",class:w.getVolatilityClass(w.result.indicators.volatility.level)},[w._v(" "+w._s(w.translateVolatility(w.result.indicators.volatility.level))+" ("+w._s(w.result.indicators.volatility.pct)+"%) ")])]):w._e()])]):w._e(),$("div",{staticClass:"feedback-section"},[$("div",{staticClass:"feedback-question"},[w._v(w._s(w.$t("fastAnalysis.wasHelpful")))]),$("div",{staticClass:"feedback-buttons"},[$("a-button",{attrs:{type:"helpful"===w.userFeedback?"primary":"default",size:"small",loading:"helpful"===w.feedbackLoading},on:{click:function(t){return w.submitFeedback("helpful")}}},[$("a-icon",{attrs:{type:"like"}}),w._v(" "+w._s(w.$t("fastAnalysis.helpful"))+" ")],1),$("a-button",{attrs:{type:"not_helpful"===w.userFeedback?"danger":"default",size:"small",loading:"not_helpful"===w.feedbackLoading},on:{click:function(t){return w.submitFeedback("not_helpful")}}},[$("a-icon",{attrs:{type:"dislike"}}),w._v(" "+w._s(w.$t("fastAnalysis.notHelpful"))+" ")],1)],1),$("div",{staticClass:"analysis-meta"},[$("span",[w._v(w._s(w.$t("fastAnalysis.analysisTime"))+": "+w._s(w.result.analysis_time_ms)+"ms")]),w.result.memory_id?$("span",[w._v("ID: #"+w._s(w.result.memory_id))]):w._e()])])]):$("div",{staticClass:"empty-container"},[$("div",{staticClass:"empty-content"},[$("a-icon",{staticClass:"empty-icon",attrs:{type:"radar-chart"}}),$("div",{staticClass:"empty-title"},[w._v(w._s(w.$t("fastAnalysis.selectSymbol")))]),$("div",{staticClass:"empty-hint"},[w._v(w._s(w.$t("fastAnalysis.selectHint")))])],1)])])}),k=[],C={name:"FastAnalysisReport",props:{result:{type:Object,default:null},loading:{type:Boolean,default:!1},error:{type:String,default:null}},data:function(){return{userFeedback:null,feedbackLoading:null,progress:0,elapsedSeconds:0,mainTimer:null}},computed:(0,c.A)((0,c.A)({},(0,d.aH)({navTheme:function(t){return t.app.theme}})),{},{isDarkTheme:function(){return"dark"===this.navTheme||"realdark"===this.navTheme},progressPercent:function(){return Math.round(10*this.progress)/10},step:function(){return this.progress<25?1:this.progress<50?2:this.progress<75?3:4},currentStepText:function(){var t={1:this.$t("fastAnalysis.step1")||"获取实时数据",2:this.$t("fastAnalysis.step2")||"计算技术指标",3:this.$t("fastAnalysis.step3")||"AI深度分析",4:this.$t("fastAnalysis.step4")||"生成报告"};return t[this.step]||this.$t("fastAnalysis.preparing")||"准备中..."},elapsedTimeText:function(){if(this.elapsedSeconds<60)return"".concat(this.elapsedSeconds,"s");var t=Math.floor(this.elapsedSeconds/60),a=this.elapsedSeconds%60;return"".concat(t,"m ").concat(a,"s")},decisionClass:function(){if(!this.result)return"";var t=this.result.decision;return"BUY"===t?"decision-buy":"SELL"===t?"decision-sell":"decision-hold"},decisionIcon:function(){if(!this.result)return"question";var t=this.result.decision;return"BUY"===t?"arrow-up":"SELL"===t?"arrow-down":"pause"},confidenceColor:function(){var t,a=(null===(t=this.result)||void 0===t?void 0:t.confidence)||50;return a>=70?"#52c41a":a>=50?"#1890ff":"#faad14"}}),watch:{result:function(){this.userFeedback=null},loading:{handler:function(t){t?this.startProgressTimer():this.stopProgressTimer()},immediate:!0}},mounted:function(){this.loading&&this.startProgressTimer()},beforeDestroy:function(){this.stopProgressTimer()},methods:{formatPrice:function(t){if(void 0===t||null===t)return"--";var a=parseFloat(t);return isNaN(a)?"--":a<1?a.toFixed(6):a<100?a.toFixed(4):a<1e4?a.toFixed(2):a.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})},formatNumber:function(t){var a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:2;if(void 0===t||null===t)return"--";var s=parseFloat(t);return isNaN(s)?"--":s.toFixed(a)},formatProgress:function(t){var a=parseFloat(t)||0;return a%1===0?a.toFixed(0):a.toFixed(1)},getScoreColor:function(t){return t>=70?"#52c41a":t>=50?"#1890ff":t>=30?"#faad14":"#ff4d4f"},getScoreTagColor:function(t){return t>=70?"green":t>=50?"blue":t>=30?"orange":"red"},getRsiClass:function(t){return t<30?"oversold":t>70?"overbought":""},getMaTrendClass:function(t){return t?t.includes("uptrend")||t.includes("strong_uptrend")?"bullish":t.includes("downtrend")||t.includes("strong_downtrend")?"bearish":"":""},getVolatilityClass:function(t){return"high"===t?"high-volatility":"low"===t?"low-volatility":""},translateSignal:function(t){if(!t)return"--";var a="fastAnalysis.signal.".concat(t),s=this.$t(a);return s===a?t:s},translateTrend:function(t){if(!t)return"--";var a="fastAnalysis.trend.".concat(t),s=this.$t(a);return s===a?t:s},translateVolatility:function(t){if(!t)return"--";var a="fastAnalysis.volatilityLevel.".concat(t),s=this.$t(a);return s===a?t:s},submitFeedback:function(t){var a=this;return(0,o.A)((0,l.A)().m(function s(){var e;return(0,l.A)().w(function(s){while(1)switch(s.p=s.n){case 0:if(null!==(e=a.result)&&void 0!==e&&e.memory_id){s.n=1;break}return a.$message.warning(a.$t("fastAnalysis.feedbackUnavailable")||"反馈功能暂不可用,请刷新后重试"),s.a(2);case 1:return a.feedbackLoading=t,s.p=2,s.n=3,g({memory_id:a.result.memory_id,feedback:t});case 3:a.userFeedback=t,a.$message.success(a.$t("fastAnalysis.feedbackThanks")),s.n=5;break;case 4:s.p=4,s.v,a.$message.error(a.$t("fastAnalysis.feedbackFailed"));case 5:return s.p=5,a.feedbackLoading=null,s.f(5);case 6:return s.a(2)}},s,null,[[2,4,5,6]])}))()},startProgressTimer:function(){var t=this;this.stopProgressTimer(),this.progress=0,this.elapsedSeconds=0;var a=Date.now();this.mainTimer=window.setInterval(function(){t.elapsedSeconds=Math.floor((Date.now()-a)/1e3),t.progress<75?t.progress=Math.min(t.progress+1,75):t.progress<90?t.progress=Math.min(t.progress+.5,90):t.progress<95&&(t.progress=Math.min(t.progress+.2,95))},100)},stopProgressTimer:function(){this.mainTimer&&(window.clearInterval(this.mainTimer),this.mainTimer=null),this.progress=0,this.elapsedSeconds=0}}},S=C,A=s(845),w=(0,A.A)(S,_,k,!1,null,"110dde64",null),$=w.exports,x={name:"Analysis",props:{embedded:{type:Boolean,default:!1},presetSymbol:{type:String,default:""},autoAnalyzeSignal:{type:Number,default:0}},components:{FastAnalysisReport:$},data:function(){return{loadingMarket:!1,heatmapType:"crypto",marketData:{fearGreed:null,vix:null,dxy:null,indices:[],heatmap:{crypto:[],commodities:[],sectors:[],forex:[]},calendar:[]},loadingSentiment:!1,loadingIndices:!1,loadingHeatmap:!1,loadingCalendar:!1,watchlistPriceTimer:null,watchlistPrices:{},localUserInfo:{},loadingUserInfo:!1,userId:1,watchlist:[],loadingWatchlist:!1,showAddStockModal:!1,addingStock:!1,selectedSymbol:void 0,analyzing:!1,analysisResult:null,analysisError:null,showHistoryModal:!1,historyList:[],historyLoading:!1,historyPage:1,historyPageSize:20,historyTotal:0,marketTypes:[],selectedMarketTab:"",symbolSearchKeyword:"",symbolSearchResults:[],searchingSymbols:!1,hotSymbols:[],loadingHotSymbols:!1,selectedSymbolForAdd:null,searchTimer:null,hasSearched:!1}},computed:(0,c.A)((0,c.A)((0,c.A)({},(0,d.L8)(["userInfo"])),(0,d.aH)({navTheme:function(t){return t.app.theme},primaryColor:function(t){return t.app.color||"#1890ff"}})),{},{isDarkTheme:function(){return"dark"===this.navTheme||"realdark"===this.navTheme},isZhLocale:function(){return"zh-CN"===this.$i18n.locale},currentHeatmap:function(){return this.marketData.heatmap[this.heatmapType]||[]},storeUserInfo:function(){return this.userInfo||{}},mergedUserInfo:function(){return this.localUserInfo&&this.localUserInfo.email?this.localUserInfo:this.storeUserInfo}}),created:function(){this.loadUserInfo(),this.loadMarketTypes(),this.loadWatchlist(),this.loadMarketData()},mounted:function(){this.startWatchlistPriceRefresh()},beforeDestroy:function(){this.watchlistPriceTimer&&clearInterval(this.watchlistPriceTimer)},methods:{filterSymbolOption:function(t,a){var s,e=(null===(s=a.componentOptions)||void 0===s||null===(s=s.propsData)||void 0===s?void 0:s.value)||"";return"__add_stock_option__"===e||e.toLowerCase().includes(t.toLowerCase())},handleSymbolChange:function(t){var a=this;if("__add_stock_option__"===t)return this.showAddStockModal=!0,void this.$nextTick(function(){a.selectedSymbol=void 0});this.selectedSymbol=t,this.analysisResult=null,this.analysisError=null,this.$emit("symbol-change",t)},selectWatchlistItem:function(t){this.selectedSymbol="".concat(t.market,":").concat(t.symbol),this.analysisResult=null,this.analysisError=null,this.$emit("symbol-change",this.selectedSymbol)},loadMarketData:function(){var t=this;return(0,o.A)((0,l.A)().m(function a(){return(0,l.A)().w(function(a){while(1)switch(a.n){case 0:t.loadingMarket=!0,t.loadSentimentData(),t.loadIndicesData(),t.loadHeatmapData(),t.loadCalendarData();case 1:return a.a(2)}},a)}))()},loadSentimentData:function(){var t=this;return(0,o.A)((0,l.A)().m(function a(){var s,e,i,r;return(0,l.A)().w(function(a){while(1)switch(a.p=a.n){case 0:return t.loadingSentiment=!0,a.p=1,a.n=2,(0,b.EF)();case 2:s=a.v,1===(null===s||void 0===s?void 0:s.code)&&null!==s&&void 0!==s&&s.data&&(t.marketData.fearGreed=(null===(e=s.data.fear_greed)||void 0===e?void 0:e.value)||null,t.marketData.vix=(null===(i=s.data.vix)||void 0===i?void 0:i.value)||null,t.marketData.dxy=(null===(r=s.data.dxy)||void 0===r?void 0:r.value)||null),a.n=4;break;case 3:a.p=3,a.v;case 4:return a.p=4,t.loadingSentiment=!1,t.checkAllLoaded(),a.f(4);case 5:return a.a(2)}},a,null,[[1,3,4,5]])}))()},loadIndicesData:function(){var t=this;return(0,o.A)((0,l.A)().m(function a(){var s;return(0,l.A)().w(function(a){while(1)switch(a.p=a.n){case 0:return t.loadingIndices=!0,a.p=1,a.n=2,(0,b.yI)();case 2:s=a.v,1===(null===s||void 0===s?void 0:s.code)&&null!==s&&void 0!==s&&s.data&&(t.marketData.indices=s.data.indices||[]),a.n=4;break;case 3:a.p=3,a.v;case 4:return a.p=4,t.loadingIndices=!1,t.checkAllLoaded(),a.f(4);case 5:return a.a(2)}},a,null,[[1,3,4,5]])}))()},loadHeatmapData:function(){var t=this;return(0,o.A)((0,l.A)().m(function a(){var s;return(0,l.A)().w(function(a){while(1)switch(a.p=a.n){case 0:return t.loadingHeatmap=!0,a.p=1,a.n=2,(0,b.f$)();case 2:s=a.v,1===(null===s||void 0===s?void 0:s.code)&&null!==s&&void 0!==s&&s.data&&(t.marketData.heatmap={crypto:s.data.crypto||[],commodities:s.data.commodities||[],sectors:s.data.sectors||[],forex:s.data.forex||[]}),a.n=4;break;case 3:a.p=3,a.v;case 4:return a.p=4,t.loadingHeatmap=!1,t.checkAllLoaded(),a.f(4);case 5:return a.a(2)}},a,null,[[1,3,4,5]])}))()},loadCalendarData:function(){var t=this;return(0,o.A)((0,l.A)().m(function a(){var s;return(0,l.A)().w(function(a){while(1)switch(a.p=a.n){case 0:return t.loadingCalendar=!0,a.p=1,a.n=2,(0,b.kF)();case 2:s=a.v,1===(null===s||void 0===s?void 0:s.code)&&(t.marketData.calendar=s.data||[]),a.n=4;break;case 3:a.p=3,a.v;case 4:return a.p=4,t.loadingCalendar=!1,t.checkAllLoaded(),a.f(4);case 5:return a.a(2)}},a,null,[[1,3,4,5]])}))()},checkAllLoaded:function(){this.loadingSentiment||this.loadingIndices||this.loadingHeatmap||this.loadingCalendar||(this.loadingMarket=!1)},getFearGreedClass:function(t){return t?t<=25?"extreme-fear":t<=45?"fear":t<=55?"neutral":t<=75?"greed":"extreme-greed":""},getVixLevel:function(t){return t?t<15?"low":t<25?"medium":"high":""},formatNum:function(t){var a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:2;return void 0===t||null===t||isNaN(t)?"--":Number(t).toFixed(a)},getHeatmapStyle:function(t){var a=parseFloat(t)||0,s=Math.min(Math.abs(a)/5,1);return a>=0?{background:"rgba(34, 197, 94, ".concat(.15+.6*s,")"),color:a>2?"#fff":"#166534"}:{background:"rgba(239, 68, 68, ".concat(.15+.6*s,")"),color:a<-2?"#fff":"#991b1b"}},getCountryFlag:function(t){var a={US:"🇺🇸",CN:"🇨🇳",EU:"🇪🇺",JP:"🇯🇵",UK:"🇬🇧",DE:"🇩🇪",AU:"🇦🇺",CA:"🇨🇦"};return a[t]||"🌍"},formatCalendarDate:function(t){if(!t)return"";try{var a=new Date(t),s=new Date,e=new Date(s);if(e.setDate(e.getDate()+1),a.toDateString()===s.toDateString())return this.isZhLocale?"今天":"Today";if(a.toDateString()===e.toDateString())return this.isZhLocale?"明天":"Tmrw";var i=a.getMonth()+1,r=a.getDate();return"".concat(i,"/").concat(r)}catch(n){return t}},formatPrice:function(t){return t?t>=1e4?(t/1e3).toFixed(1)+"K":t>=1e3?t.toFixed(0):t.toFixed(2):"--"},formatHeatmapPrice:function(t){return t?t>=1e4?"$"+(t/1e3).toFixed(1)+"K":t>=1e3?"$"+t.toFixed(0):t>=1?"$"+t.toFixed(2):"$"+t.toFixed(4):""},getHeatmapName:function(t){return"sectors"===this.heatmapType||"commodities"===this.heatmapType||"forex"===this.heatmapType?this.isZhLocale?t.name_cn||t.name:t.name_en||t.name:t.name},getImpactClass:function(t){return t.actual_impact||t.expected_impact||"neutral"},getMarketColor:function(t){var a={USStock:"green",Crypto:"purple",Forex:"gold",Futures:"cyan"};return a[t]||"default"},getCurrencySymbol:function(t){return"$"},startFastAnalysis:function(){var t=this;return(0,o.A)((0,l.A)().m(function a(){var s,e,i,r,o,c,d,u;return(0,l.A)().w(function(a){while(1)switch(a.p=a.n){case 0:if(!t.analyzing){a.n=1;break}return a.a(2);case 1:if(t.selectedSymbol){a.n=2;break}return t.$message.warning(t.$t("dashboard.analysis.message.selectSymbol")),a.a(2);case 2:return t.analyzing=!0,t.analysisError=null,s=t.selectedSymbol.split(":"),e=(0,n.A)(s,2),i=e[0],r=e[1],o=t.$store.getters.lang||"zh-CN",a.p=3,a.n=4,p({market:i,symbol:r,language:o,timeframe:"1D"});case 4:if(c=a.v,!c||1!==c.code||!c.data){a.n=5;break}t.analysisResult=c.data,t.$message.success(t.$t("dashboard.analysis.message.analysisComplete")),a.n=6;break;case 5:throw new Error((null===c||void 0===c?void 0:c.msg)||"分析失败");case 6:a.n=8;break;case 7:a.p=7,u=a.v,t.analysisError=(null===u||void 0===u||null===(d=u.response)||void 0===d||null===(d=d.data)||void 0===d?void 0:d.msg)||(null===u||void 0===u?void 0:u.message)||t.$t("dashboard.analysis.message.analysisFailed"),t.$message.error(t.analysisError);case 8:return a.p=8,t.analyzing=!1,a.f(8);case 9:return a.a(2)}},a,null,[[3,7,8,9]])}))()},loadHistoryList:function(){var t=this;return(0,o.A)((0,l.A)().m(function a(){var s;return(0,l.A)().w(function(a){while(1)switch(a.p=a.n){case 0:return t.historyLoading=!0,a.p=1,a.n=2,v({page:t.historyPage,pagesize:t.historyPageSize});case 2:s=a.v,s&&1===s.code&&s.data&&(t.historyList=s.data.list||[],t.historyTotal=s.data.total||0),a.n=4;break;case 3:a.p=3,a.v,t.$message.error(t.$t("dashboard.analysis.message.loadHistoryFailed")||"加载历史记录失败");case 4:return a.p=4,t.historyLoading=!1,a.f(4);case 5:return a.a(2)}},a,null,[[1,3,4,5]])}))()},viewHistoryResult:function(t){var a=this;return(0,o.A)((0,l.A)().m(function s(){return(0,l.A)().w(function(s){while(1)switch(s.n){case 0:if(!t.full_result){s.n=1;break}return a.analysisResult=t.full_result,a.selectedSymbol="".concat(t.market,":").concat(t.symbol),a.showHistoryModal=!1,s.a(2);case 1:a.analysisResult={decision:t.decision,confidence:t.confidence,summary:t.summary,market_data:{current_price:t.price,change_24h:0},trading_plan:{entry_price:t.price,stop_loss:.95*t.price,take_profit:1.05*t.price},scores:t.scores||{},reasons:t.reasons||[],risks:[],indicators:t.indicators||{},memory_id:t.id,analysis_time_ms:0},a.selectedSymbol="".concat(t.market,":").concat(t.symbol),a.showHistoryModal=!1;case 2:return s.a(2)}},s)}))()},deleteHistoryItem:function(t){var a=this;return(0,o.A)((0,l.A)().m(function s(){var e;return(0,l.A)().w(function(s){while(1)switch(s.p=s.n){case 0:return s.p=0,s.n=1,f(t.id);case 1:e=s.v,e&&1===e.code?(a.$message.success(a.$t("dashboard.analysis.message.deleteSuccess")),a.loadHistoryList()):a.$message.error((null===e||void 0===e?void 0:e.msg)||a.$t("dashboard.analysis.message.deleteFailed")),s.n=3;break;case 2:s.p=2,s.v,a.$message.error(a.$t("dashboard.analysis.message.deleteFailed"));case 3:return s.a(2)}},s,null,[[0,2]])}))()},formatTime:function(t){if(!t)return"-";var a=new Date(1e3*t);return a.toLocaleString("zh-CN")},formatIsoTime:function(t){if(!t)return"-";var a=new Date(t);return a.toLocaleString("zh-CN")},getStatusColor:function(t){var a={pending:"orange",processing:"blue",completed:"green",failed:"red"};return a[t]||"default"},getStatusText:function(t){var a={pending:"dashboard.analysis.status.pending",processing:"dashboard.analysis.status.processing",completed:"dashboard.analysis.status.completed",failed:"dashboard.analysis.status.failed"},s=a[t];return s?this.$t(s):t},loadUserInfo:function(){var t=this;return(0,o.A)((0,l.A)().m(function a(){var s;return(0,l.A)().w(function(a){while(1)switch(a.p=a.n){case 0:if(t.loadingUserInfo=!0,a.p=1,!t.storeUserInfo||!t.storeUserInfo.email){a.n=2;break}return t.localUserInfo=t.storeUserInfo,t.userId=t.storeUserInfo.id,t.loadingUserInfo=!1,t.loadWatchlist(),a.a(2);case 2:return a.n=3,(0,u.ug)();case 3:s=a.v,s&&1===s.code&&s.data&&(t.localUserInfo=s.data,t.userId=s.data.id,t.$store.commit("SET_INFO",s.data),t.loadWatchlist()),a.n=5;break;case 4:a.p=4,a.v;case 5:return a.p=5,t.loadingUserInfo=!1,a.f(5);case 6:return a.a(2)}},a,null,[[1,4,5,6]])}))()},loadWatchlist:function(){var t=this;return(0,o.A)((0,l.A)().m(function a(){var s;return(0,l.A)().w(function(a){while(1)switch(a.p=a.n){case 0:if(t.userId){a.n=1;break}return a.a(2);case 1:return t.loadingWatchlist=!0,a.p=2,a.n=3,(0,m.Qo)({userid:t.userId});case 3:if(s=a.v,!s||1!==s.code||!s.data){a.n=4;break}return t.watchlist=s.data.map(function(t){return(0,c.A)((0,c.A)({},t),{},{price:0,change:0,changePercent:0})}),a.n=4,t.loadWatchlistPrices();case 4:a.n=6;break;case 5:a.p=5,a.v;case 6:return a.p=6,t.loadingWatchlist=!1,a.f(6);case 7:return a.a(2)}},a,null,[[2,5,6,7]])}))()},loadWatchlistPrices:function(){var t=this;return(0,o.A)((0,l.A)().m(function a(){var s,e,i,r;return(0,l.A)().w(function(a){while(1)switch(a.p=a.n){case 0:if(t.watchlist&&0!==t.watchlist.length){a.n=1;break}return a.a(2);case 1:return a.p=1,s=t.watchlist.map(function(t){return{market:t.market,symbol:t.symbol}}),a.n=2,(0,m.ms)({watchlist:s});case 2:e=a.v,e&&1===e.code&&e.data&&(i={},r={},e.data.forEach(function(t){i["".concat(t.market,"-").concat(t.symbol)]=t,r["".concat(t.market,":").concat(t.symbol)]={price:t.price||0,change:t.changePercent||0}}),t.watchlistPrices=r,t.watchlist=t.watchlist.map(function(t){var a="".concat(t.market,"-").concat(t.symbol),s=i[a];return s?(0,c.A)((0,c.A)({},t),{},{price:s.price||0,change:s.change||0,changePercent:s.changePercent||0}):t})),a.n=4;break;case 3:a.p=3,a.v;case 4:return a.a(2)}},a,null,[[1,3]])}))()},startWatchlistPriceRefresh:function(){var t=this;this.watchlistPriceTimer=setInterval(function(){t.watchlist&&t.watchlist.length>0&&t.loadWatchlistPrices()},3e4),this.watchlist&&this.watchlist.length>0&&this.loadWatchlistPrices()},handleAddStock:function(){var t=this;return(0,o.A)((0,l.A)().m(function a(){var s,e,i,r,n,o,c;return(0,l.A)().w(function(a){while(1)switch(a.p=a.n){case 0:if(s="",e="",i="",!t.selectedSymbolForAdd){a.n=1;break}s=t.selectedSymbolForAdd.market,e=t.selectedSymbolForAdd.symbol.toUpperCase(),i=t.selectedSymbolForAdd.name||"",a.n=4;break;case 1:if(!t.symbolSearchKeyword||!t.symbolSearchKeyword.trim()){a.n=3;break}if(t.selectedMarketTab){a.n=2;break}return t.$message.warning(t.$t("dashboard.analysis.modal.addStock.pleaseSelectMarket")),a.a(2);case 2:s=t.selectedMarketTab,e=t.symbolSearchKeyword.trim().toUpperCase(),i="",a.n=4;break;case 3:return t.$message.warning(t.$t("dashboard.analysis.modal.addStock.pleaseSelectOrEnterSymbol")),a.a(2);case 4:return t.addingStock=!0,a.p=5,a.n=6,(0,m.dp)({userid:t.userId,market:s,symbol:e,name:i});case 6:if(r=a.v,!r||1!==r.code){a.n=8;break}return t.$message.success(t.$t("dashboard.analysis.message.addStockSuccess")),t.handleCloseAddStockModal(),a.n=7,t.loadWatchlist();case 7:a.n=9;break;case 8:t.$message.error((null===r||void 0===r?void 0:r.msg)||t.$t("dashboard.analysis.message.addStockFailed"));case 9:a.n=11;break;case 10:a.p=10,c=a.v,o=(null===c||void 0===c||null===(n=c.response)||void 0===n||null===(n=n.data)||void 0===n?void 0:n.msg)||(null===c||void 0===c?void 0:c.message)||t.$t("dashboard.analysis.message.addStockFailed"),t.$message.error(o);case 11:return a.p=11,t.addingStock=!1,a.f(11);case 12:return a.a(2)}},a,null,[[5,10,11,12]])}))()},handleCloseAddStockModal:function(){this.showAddStockModal=!1,this.selectedSymbolForAdd=null,this.symbolSearchKeyword="",this.symbolSearchResults=[],this.hasSearched=!1,this.selectedMarketTab=this.marketTypes.length>0?this.marketTypes[0].value:""},handleMarketTabChange:function(t){this.selectedMarketTab=t,this.symbolSearchKeyword="",this.symbolSearchResults=[],this.selectedSymbolForAdd=null,this.hasSearched=!1,this.loadHotSymbols(t)},handleSymbolSearchInput:function(t){var a=this,s=t.target.value;if(this.symbolSearchKeyword=s,this.searchTimer&&clearTimeout(this.searchTimer),!s||""===s.trim())return this.symbolSearchResults=[],this.hasSearched=!1,void(this.selectedSymbolForAdd=null);this.searchTimer=setTimeout(function(){a.searchSymbolsInModal(s)},500)},handleSearchOrInput:function(t){t&&t.trim()&&(this.selectedMarketTab?this.symbolSearchResults.length>0||(this.hasSearched&&0===this.symbolSearchResults.length?this.handleDirectAdd():this.searchSymbolsInModal(t)):this.$message.warning(this.$t("dashboard.analysis.modal.addStock.pleaseSelectMarket")))},searchSymbolsInModal:function(t){var a=this;return(0,o.A)((0,l.A)().m(function s(){var e;return(0,l.A)().w(function(s){while(1)switch(s.p=s.n){case 0:if(t&&""!==t.trim()){s.n=1;break}return a.symbolSearchResults=[],a.hasSearched=!1,s.a(2);case 1:if(a.selectedMarketTab){s.n=2;break}return a.$message.warning(a.$t("dashboard.analysis.modal.addStock.pleaseSelectMarket")),s.a(2);case 2:return a.searchingSymbols=!0,a.hasSearched=!0,s.p=3,s.n=4,(0,m._3)({market:a.selectedMarketTab,keyword:t.trim(),limit:20});case 4:e=s.v,e&&1===e.code&&e.data&&e.data.length>0?a.symbolSearchResults=e.data:(a.symbolSearchResults=[],a.selectedSymbolForAdd={market:a.selectedMarketTab,symbol:t.trim().toUpperCase(),name:""}),s.n=6;break;case 5:s.p=5,s.v,a.symbolSearchResults=[],a.selectedSymbolForAdd={market:a.selectedMarketTab,symbol:t.trim().toUpperCase(),name:""};case 6:return s.p=6,a.searchingSymbols=!1,s.f(6);case 7:return s.a(2)}},s,null,[[3,5,6,7]])}))()},handleDirectAdd:function(){this.symbolSearchKeyword&&this.symbolSearchKeyword.trim()?this.selectedMarketTab?this.selectedSymbolForAdd={market:this.selectedMarketTab,symbol:this.symbolSearchKeyword.trim().toUpperCase(),name:""}:this.$message.warning(this.$t("dashboard.analysis.modal.addStock.pleaseSelectMarket")):this.$message.warning(this.$t("dashboard.analysis.modal.addStock.pleaseEnterSymbol"))},selectSymbol:function(t){this.selectedSymbolForAdd={market:t.market,symbol:t.symbol,name:t.name||t.symbol}},loadHotSymbols:function(t){var a=this;return(0,o.A)((0,l.A)().m(function s(){var e;return(0,l.A)().w(function(s){while(1)switch(s.p=s.n){case 0:if(t||(t=a.selectedMarketTab||(a.marketTypes.length>0?a.marketTypes[0].value:"")),t){s.n=1;break}return s.a(2);case 1:return a.loadingHotSymbols=!0,s.p=2,s.n=3,(0,m.z6)({market:t,limit:10});case 3:e=s.v,e&&1===e.code&&e.data?a.hotSymbols=e.data:a.hotSymbols=[],s.n=5;break;case 4:s.p=4,s.v,a.hotSymbols=[];case 5:return s.p=5,a.loadingHotSymbols=!1,s.f(5);case 6:return s.a(2)}},s,null,[[2,4,5,6]])}))()},removeFromWatchlist:function(t){var a=arguments,s=this;return(0,o.A)((0,l.A)().m(function e(){var i,n,o;return(0,l.A)().w(function(e){while(1)switch(e.p=e.n){case 0:if(s.userId){e.n=1;break}return e.a(2);case 1:return i="object"===(0,r.A)(t)?t.symbol:t,n="object"===(0,r.A)(t)?t.market:a[1],e.p=2,e.n=3,(0,m.mk)({userid:s.userId,symbol:i,market:n});case 3:if(o=e.v,!o||1!==o.code){e.n=5;break}return s.$message.success(s.$t("dashboard.analysis.message.removeStockSuccess")),e.n=4,s.loadWatchlist();case 4:e.n=6;break;case 5:s.$message.error((null===o||void 0===o?void 0:o.msg)||s.$t("dashboard.analysis.message.removeStockFailed"));case 6:e.n=8;break;case 7:e.p=7,e.v,s.$message.error(s.$t("dashboard.analysis.message.removeStockFailed"));case 8:return e.a(2)}},e,null,[[2,7]])}))()},getMarketName:function(t){return this.$t("dashboard.analysis.market.".concat(t))||t},formatNumber:function(t){return"string"===typeof t?t:t.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})},loadMarketTypes:function(){var t=this;return(0,o.A)((0,l.A)().m(function a(){var s;return(0,l.A)().w(function(a){while(1)switch(a.p=a.n){case 0:return a.p=0,a.n=1,(0,m.iO)();case 1:s=a.v,s&&1===s.code&&s.data&&Array.isArray(s.data)?t.marketTypes=s.data.map(function(t){return{value:t.value,i18nKey:t.i18nKey||"dashboard.analysis.market.".concat(t.value)}}):t.marketTypes=[{value:"USStock",i18nKey:"dashboard.analysis.market.USStock"},{value:"Crypto",i18nKey:"dashboard.analysis.market.Crypto"},{value:"Forex",i18nKey:"dashboard.analysis.market.Forex"},{value:"Futures",i18nKey:"dashboard.analysis.market.Futures"}],a.n=3;break;case 2:a.p=2,a.v,t.marketTypes=[{value:"USStock",i18nKey:"dashboard.analysis.market.USStock"},{value:"Crypto",i18nKey:"dashboard.analysis.market.Crypto"},{value:"Forex",i18nKey:"dashboard.analysis.market.Forex"},{value:"Futures",i18nKey:"dashboard.analysis.market.Futures"}];case 3:t.marketTypes.length>0&&!t.selectedMarketTab&&(t.selectedMarketTab=t.marketTypes[0].value);case 4:return a.a(2)}},a,null,[[0,2]])}))()}},watch:{presetSymbol:function(t){t&&t!==this.selectedSymbol&&(this.selectedSymbol=t,this.analysisResult=null,this.analysisError=null)},autoAnalyzeSignal:function(t){var a=this;t&&(this.presetSymbol&&this.presetSymbol!==this.selectedSymbol&&(this.selectedSymbol=this.presetSymbol),this.$nextTick(function(){a.startFastAnalysis()}))},showAddStockModal:function(t){t?(this.marketTypes.length>0&&!this.selectedMarketTab&&(this.selectedMarketTab=this.marketTypes[0].value),this.selectedMarketTab&&this.loadHotSymbols(this.selectedMarketTab)):(this.selectedSymbolForAdd=null,this.symbolSearchKeyword="",this.symbolSearchResults=[],this.hasSearched=!1,this.searchTimer&&(clearTimeout(this.searchTimer),this.searchTimer=null))}}},T=x,F=(0,A.A)(T,e,i,!1,null,"76a3e064",null),M=F.exports},62618:function(t,a,s){s.d(a,{EF:function(){return o},f$:function(){return n},kF:function(){return l},r9:function(){return c},yI:function(){return r}});var e=s(76471),i="/api/global-market";function r(){return(0,e.Ay)({url:"".concat(i,"/overview"),method:"get"})}function n(){return(0,e.Ay)({url:"".concat(i,"/heatmap"),method:"get"})}function l(){return(0,e.Ay)({url:"".concat(i,"/calendar"),method:"get"})}function o(){return(0,e.Ay)({url:"".concat(i,"/sentiment"),method:"get"})}function c(t){return(0,e.Ay)({url:"".concat(i,"/opportunities"),method:"get",params:t})}},64118:function(t,a,s){s.d(a,{Qo:function(){return r},_3:function(){return d},dp:function(){return n},iO:function(){return c},mk:function(){return l},ms:function(){return o},z6:function(){return u}});var e=s(76471),i={GetWatchlist:"/api/market/watchlist/get",AddWatchlist:"/api/market/watchlist/add",RemoveWatchlist:"/api/market/watchlist/remove",GetWatchlistPrices:"/api/market/watchlist/prices",MultiAnalysis:"/api/analysis/multiAnalysis",CreateAnalysisTask:"/api/analysis/createTask",GetAnalysisTaskStatus:"/api/analysis/getTaskStatus",GetAnalysisHistoryList:"/api/analysis/getHistoryList",DeleteAnalysisTask:"/api/analysis/deleteTask",ReflectAnalysis:"/api/analysis/reflect",ChatMessage:"/api/ai/chat/message",GetChatHistory:"/api/ai/chat/history",SaveChatHistory:"/api/ai/chat/history/save",GetConfig:"/api/market/config",GetMenuFooterConfig:"/api/market/menuFooterConfig",GetMarketTypes:"/api/market/types",SearchSymbols:"/api/market/symbols/search",GetHotSymbols:"/api/market/symbols/hot"};function r(t){return(0,e.Ay)({url:i.GetWatchlist,method:"get",params:t})}function n(t){return(0,e.Ay)({url:i.AddWatchlist,method:"post",data:t})}function l(t){return(0,e.Ay)({url:i.RemoveWatchlist,method:"post",data:t})}function o(t){return(0,e.Ay)({url:i.GetWatchlistPrices,method:"get",params:{watchlist:JSON.stringify(t.watchlist||[])}})}function c(){return(0,e.Ay)({url:i.GetMarketTypes,method:"get"})}function d(t){return(0,e.Ay)({url:i.SearchSymbols,method:"get",params:t})}function u(t){return(0,e.Ay)({url:i.GetHotSymbols,method:"get",params:t})}}}]); \ No newline at end of file diff --git a/frontend/dist/js/app-legacy.f346bd4d.js b/frontend/dist/js/app-legacy.a9e4bd9c.js similarity index 63% rename from frontend/dist/js/app-legacy.f346bd4d.js rename to frontend/dist/js/app-legacy.a9e4bd9c.js index 5a27c47..81ab516 100644 --- a/frontend/dist/js/app-legacy.f346bd4d.js +++ b/frontend/dist/js/app-legacy.a9e4bd9c.js @@ -1 +1 @@ -(function(){var e={55585:function(e,t,a){"use strict";a.d(t,{iD:function(){return o},ri:function(){return l},ug:function(){return r}});var i=a(76471),s={Login:"/api/auth/login",Logout:"/api/auth/logout",UserInfo:"/api/auth/info",UserMenu:"/user/nav"};function o(e){return(0,i.Ay)({url:s.Login,method:"post",data:e})}function n(){return(0,i.Ay)({url:s.UserInfo,method:"get",headers:{"Content-Type":"application/json;charset=UTF-8"}})}function r(){return n()}function l(){return(0,i.Ay)({url:s.Logout,method:"post",headers:{"Content-Type":"application/json;charset=UTF-8"}})}},73047:function(e,t,a){"use strict";a.d(t,{EM:function(){return o},GF:function(){return g},KP:function(){return v},Ke:function(){return d},Ox:function(){return r},P7:function(){return l},UH:function(){return m},WM:function(){return n},Yx:function(){return b},kv:function(){return h},mV:function(){return c},oK:function(){return y},tq:function(){return f},ul:function(){return A},v_:function(){return u},xQ:function(){return p}});var i=a(76471),s={strategies:"/api/strategies",strategyDetail:"/api/strategies/detail",createStrategy:"/api/strategies/create",batchCreateStrategies:"/api/strategies/batch-create",updateStrategy:"/api/strategies/update",stopStrategy:"/api/strategies/stop",startStrategy:"/api/strategies/start",deleteStrategy:"/api/strategies/delete",batchStartStrategies:"/api/strategies/batch-start",batchStopStrategies:"/api/strategies/batch-stop",batchDeleteStrategies:"/api/strategies/batch-delete",testConnection:"/api/strategies/test-connection",trades:"/api/strategies/trades",positions:"/api/strategies/positions",equityCurve:"/api/strategies/equityCurve",notifications:"/api/strategies/notifications",unreadNotificationCount:"/api/strategies/notifications/unread-count"};function o(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return(0,i.Ay)({url:s.strategies,method:"get",params:e})}function n(e){return(0,i.Ay)({url:s.createStrategy,method:"post",data:e})}function r(e){return(0,i.Ay)({url:s.batchCreateStrategies,method:"post",data:e})}function l(e,t){return(0,i.Ay)({url:s.updateStrategy,method:"put",params:{id:e},data:t})}function d(e){return(0,i.Ay)({url:s.stopStrategy,method:"post",params:{id:e}})}function c(e){return(0,i.Ay)({url:s.startStrategy,method:"post",params:{id:e}})}function u(e){return(0,i.Ay)({url:s.deleteStrategy,method:"delete",params:{id:e}})}function m(e){return(0,i.Ay)({url:s.batchStartStrategies,method:"post",data:e})}function g(e){return(0,i.Ay)({url:s.batchStopStrategies,method:"post",data:e})}function p(e){return(0,i.Ay)({url:s.batchDeleteStrategies,method:"delete",data:e})}function h(e){return(0,i.Ay)({url:s.testConnection,method:"post",data:{exchange_config:e}})}function f(e){return(0,i.Ay)({url:s.trades,method:"get",params:{id:e}})}function y(e){return(0,i.Ay)({url:s.positions,method:"get",params:{id:e}})}function b(e){return(0,i.Ay)({url:s.equityCurve,method:"get",params:{id:e}})}function v(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return(0,i.Ay)({url:s.notifications,method:"get",params:e})}function A(){return(0,i.Ay)({url:s.unreadNotificationCount,method:"get"})}},85102:function(e,t,a){"use strict";var i=a(57888),s=a(1512),o=a(3508),n=a.n(o),r={antLocale:s.A,momentName:"eu",momentLocale:n()},l={"common.confirm":"Confirm","common.cancel":"Cancel","common.save":"Save","common.delete":"Delete","common.edit":"Edit","common.add":"Add","common.close":"Close","common.done":"Done","common.ok":"OK","common.loading":"Loading...","common.noData":"No data",submit:"Submit",save:"Save","submit.ok":"Submit successfully","save.ok":"Saved successfully","menu.welcome":"Welcome","menu.home":"Home","menu.dashboard":"Dashboard","menu.dashboard.analysis":"AI Analysis","menu.dashboard.aiAssetAnalysis":"AI Asset Analysis","menu.dashboard.aiQuant":"AI Quant","menu.dashboard.indicator":"Indicator Analysis","menu.dashboard.community":"Indicator Market","menu.dashboard.tradingAssistant":"Trading Assistant","menu.dashboard.portfolio":"Portfolio","menu.dashboard.globalMarket":"Global Market","menu.dashboard.polymarket":"Prediction Markets","menu.settings":"Settings","menu.dashboard.aiTradingAssistant":"AI Trading Assistant","menu.dashboard.signalRobot":"Signal Robot","menu.dashboard.monitor":"Monitor","menu.dashboard.workplace":"Workplace","aiAssetAnalysis.title":"AI Asset Analysis","aiAssetAnalysis.subtitle":"Unify portfolio monitoring, instant analysis, and scheduled tasks into one smooth workflow.","aiAssetAnalysis.actions.quickAnalysis":"Start Analysis Now","aiAssetAnalysis.actions.monitorTasks":"Manage Monitor Tasks","aiAssetAnalysis.actions.openStandalone":"Open Standalone Page","aiAssetAnalysis.quickBar.title":"Quick Analyze","aiAssetAnalysis.quickBar.placeholder":"Select a symbol from asset pool","aiAssetAnalysis.quickBar.useInQuick":"Use in Instant Analysis","aiAssetAnalysis.quickBar.runNow":"Analyze Now","aiAssetAnalysis.history.title":"Recent Analysis","aiAssetAnalysis.history.empty":"No analysis history yet","aiAssetAnalysis.actions.enterQuick":"Go to Instant Analysis","aiAssetAnalysis.actions.enterMonitor":"Go to Asset Pool & Tasks","aiAssetAnalysis.flow.poolTitle":"Build Asset Pool","aiAssetAnalysis.flow.poolDesc":"Add positions and watch targets first to build one unified analysis pool.","aiAssetAnalysis.flow.poolAction":"Manage Asset Pool","aiAssetAnalysis.flow.quickTitle":"Instant Analysis","aiAssetAnalysis.flow.quickDesc":"Run AI analysis for any symbol in one click and get suggestions quickly.","aiAssetAnalysis.flow.quickAction":"Run Analysis","aiAssetAnalysis.flow.autoTitle":"Scheduled Monitoring","aiAssetAnalysis.flow.autoDesc":"Set recurring AI analysis tasks and deliver reports through notification channels.","aiAssetAnalysis.flow.autoAction":"Configure Tasks","aiAssetAnalysis.tabs.quick":"Instant Analysis","aiAssetAnalysis.tabs.monitor":"Asset Pool & Scheduled Tasks","aiAssetAnalysis.tabLead.quick":"Best for ad-hoc decisions: select a symbol and analyze immediately.","aiAssetAnalysis.tabLead.monitor":"Best for continuous tracking: maintain positions and set monitor ranges/frequency.","aiAssetAnalysis.stats.totalAnalyses":"Total Analyses","aiAssetAnalysis.stats.accuracy":"Accuracy","aiAssetAnalysis.stats.avgReturn":"Avg Return","aiAssetAnalysis.stats.satisfaction":"Satisfaction","aiAssetAnalysis.stats.decisions":"Decision Dist.","aiAssetAnalysis.opportunities.title":"AI Opportunity Radar","aiAssetAnalysis.opportunities.empty":"No opportunities found","aiAssetAnalysis.opportunities.analyze":"Analyze","aiAssetAnalysis.opportunities.updateHint":"Updates hourly","aiAssetAnalysis.opportunities.signal.overbought":"Overbought","aiAssetAnalysis.opportunities.signal.oversold":"Oversold","aiAssetAnalysis.opportunities.signal.bullish_momentum":"Bullish","aiAssetAnalysis.opportunities.signal.bearish_momentum":"Bearish","aiAssetAnalysis.opportunities.market.Crypto":"🪙 Crypto","aiAssetAnalysis.opportunities.market.USStock":"📈 US Stock","aiAssetAnalysis.opportunities.market.Forex":"💱 Forex","aiAssetAnalysis.opportunities.market.PredictionMarket":"🎯 Prediction Market","aiAssetAnalysis.opportunities.reason.crypto.overbought":"24h +{change}%, 7d +{change7d}%, overbought risk","aiAssetAnalysis.opportunities.reason.crypto.bullish_momentum":"24h +{change}%, strong bullish momentum","aiAssetAnalysis.opportunities.reason.crypto.oversold":"24h -{change}%, possible oversold bounce","aiAssetAnalysis.opportunities.reason.crypto.bearish_momentum":"24h -{change}%, clear bearish trend","aiAssetAnalysis.opportunities.reason.usstock.overbought":"Day +{change}%, large gain, watch for pullback","aiAssetAnalysis.opportunities.reason.usstock.bullish_momentum":"Day +{change}%, strong bullish momentum","aiAssetAnalysis.opportunities.reason.usstock.oversold":"Day -{change}%, possible oversold bounce","aiAssetAnalysis.opportunities.reason.usstock.bearish_momentum":"Day -{change}%, clear bearish trend","aiAssetAnalysis.opportunities.reason.forex.overbought":"Day +{change}%, volatile, watch for reversal","aiAssetAnalysis.opportunities.reason.forex.bullish_momentum":"Day +{change}%, bullish momentum","aiAssetAnalysis.opportunities.reason.forex.oversold":"Day -{change}%, volatile, possible bounce","aiAssetAnalysis.opportunities.reason.forex.bearish_momentum":"Day -{change}%, clear bearish trend","aiAssetAnalysis.checkup.title":"Portfolio Checkup","aiAssetAnalysis.checkup.btn":"Checkup","aiAssetAnalysis.checkup.desc":"Run AI analysis on all positions in your portfolio to quickly understand the current status and get recommendations for each asset.","aiAssetAnalysis.checkup.start":"Start Checkup","aiAssetAnalysis.checkup.progress":"Analyzing {current}/{total}...","aiAssetAnalysis.checkup.noPositions":"No positions in your portfolio. Please add assets first.","aiAssetAnalysis.checkup.complete":"Checkup Complete","aiAssetAnalysis.checkup.failed":"Failed","aiAssetAnalysis.checkup.rerun":"Run Again","aiAssetAnalysis.search.hint":"Search","aiAssetAnalysis.search.placeholder":"Search any symbol... (Ctrl+K)","aiAssetAnalysis.search.noResults":"No results found. Try a different keyword.","menu.form":"Form","menu.form.basic-form":"Basic Form","menu.form.step-form":"Step Form","menu.form.step-form.info":"Step Form(write transfer information)","menu.form.step-form.confirm":"Step Form(confirm transfer information)","menu.form.step-form.result":"Step Form(finished)","menu.form.advanced-form":"Advanced Form","menu.list":"List","menu.list.table-list":"Search Table","menu.list.basic-list":"Basic List","menu.list.card-list":"Card List","menu.list.search-list":"Search List","menu.list.search-list.articles":"Search List(articles)","menu.list.search-list.projects":"Search List(projects)","menu.list.search-list.applications":"Search List(applications)","menu.profile":"Profile","menu.profile.basic":"Basic Profile","menu.profile.advanced":"Advanced Profile","menu.result":"Result","menu.result.success":"Success","menu.result.fail":"Fail","menu.exception":"Exception","menu.exception.not-permission":"403","menu.exception.not-find":"404","menu.exception.server-error":"500","menu.exception.trigger":"Trigger","menu.account":"Account","menu.account.center":"Account Center","menu.account.settings":"Account Settings","menu.account.trigger":"Trigger Error","menu.account.logout":"Logout","menu.wallet":"My Wallet","menu.docs":"Documentation","menu.docs.detail":"Doc Detail","menu.header.refreshPage":"Refresh Page","menu.invite.friends":"Invite Friends","app.setting.pagestyle":"Page Style Setting","app.setting.pagestyle.light":"Light Menu Style","app.setting.pagestyle.dark":"Dark Menu Style","app.setting.pagestyle.realdark":"RealDark style","app.setting.themecolor":"Theme Color","app.setting.navigationmode":"Navigation Mode","app.setting.sidemenu.nav":"Sidebar Navigation","app.setting.topmenu.nav":"Top Navigation","app.setting.content-width":"Content Width","app.setting.content-width.tooltip":"This setting is only effective for [Top Navigation]","app.setting.content-width.fixed":"Fixed","app.setting.content-width.fluid":"Fluid","app.setting.fixedheader":"Fixed Header","app.setting.fixedheader.tooltip":"Configurable when Header is fixed","app.setting.autoHideHeader":"Hide Header on Scroll","app.setting.fixedsidebar":"Fixed Sidebar Menu","app.setting.sidemenu":"Side Menu Layout","app.setting.topmenu":"Top Menu Layout","app.setting.othersettings":"Other Settings","app.setting.weakmode":"Weak Mode","app.setting.multitab":"Multi-Tab Mode","app.setting.copy":"Copy Setting","app.setting.loading":"Loading theme","app.setting.copyinfo":"copy success,please replace defaultSettings in src/config/defaultSettings.js","app.setting.copy.success":"Copy Success","app.setting.copy.fail":"Copy Failed","app.setting.theme.switching":"Switching theme...","app.setting.production.hint":"Setting panel shows in development environment only, please manually modify","app.setting.themecolor.daybreak":"Daybreak Blue (Default)","app.setting.themecolor.dust":"Dust Red","app.setting.themecolor.volcano":"Volcano","app.setting.themecolor.sunset":"Sunset Orange","app.setting.themecolor.cyan":"Cyan","app.setting.themecolor.green":"Polar Green","app.setting.themecolor.geekblue":"Geek Blue","app.setting.themecolor.purple":"Golden Purple","app.setting.tooltip":"Page Settings","notice.title":"Notifications","notice.empty":"No notifications","notice.markAllRead":"Mark all as read","notice.clear":"Clear all","notice.close":"Close","notice.justNow":"Just now","notice.minutesAgo":"minutes ago","notice.hoursAgo":"hours ago","notice.daysAgo":"days ago","notice.detailInfo":"Details","notice.aiDecision":"AI Decision","notice.confidence":"Confidence","notice.reasoning":"Reasoning","notice.symbol":"Symbol","notice.currentPrice":"Current Price","notice.triggerPrice":"Trigger Price","notice.action":"Action","notice.quantity":"Quantity","notice.viewPortfolio":"View Portfolio","notice.type.aiMonitor":"AI Monitor","notice.type.priceAlert":"Price Alert","notice.type.signal":"Trade Signal","notice.type.buy":"Buy Signal","notice.type.sell":"Sell Signal","notice.type.hold":"Hold Suggestion","notice.type.trade":"Trade Execution","notice.type.notification":"Notification","user.login.userName":"userName","user.login.password":"password","user.login.username.placeholder":"Account: admin","user.login.password.placeholder":"password: admin or ant.design","user.login.message-invalid-credentials":"Login failed, please check your email and verification code","user.login.message-invalid-verification-code":"Invalid verification code","user.login.tab-login-credentials":"Credentials","user.login.tab-login-email":"Email","user.login.tab-login-mobile":"Mobile number","user.login.captcha.placeholder":"Please enter captcha","user.login.mobile.placeholder":"Mobile number","user.login.mobile.verification-code.placeholder":"Verification code","user.login.email.placeholder":"Please enter your email address","user.login.email.verification-code.placeholder":"Please enter verification code","user.login.email.sending":"Sending verification code...","user.login.email.send-success-title":"Notice","user.login.email.send-success":"Verification code sent successfully, please check your email","user.login.sms.send-success":"Verification code sent successfully, please check your SMS","user.login.remember-me":"Remember me","user.login.forgot-password":"Forgot your password?","user.login.sign-in-with":"Sign in with","user.login.signup":"Sign up","user.login.login":"Login","user.register.register":"Register","user.register.email.placeholder":"Email","user.register.password.placeholder":"Password ","user.register.password.popover-message":"Please enter at least 6 characters. Please do not use passwords that are easy to guess. ","user.register.confirm-password.placeholder":"Confirm password","user.register.get-verification-code":"Get code","user.register.sign-in":"Already have an account?","user.register-result.msg":"Account:registered at {email}","user.register-result.activation-email":"The activation email has been sent to your email address and is valid for 24 hours. Please log in to the email in time and click on the link in the email to activate the account.","user.register-result.back-home":"Back to home","user.register-result.view-mailbox":"View mailbox","user.email.required":"Please enter your email!","user.email.wrong-format":"The email address is in the wrong format!","user.userName.required":"Please enter account name or email address","user.password.required":"Please enter your password!","user.password.twice.msg":"The passwords entered twice do not match!","user.password.strength.msg":"The password is not strong enough","user.password.strength.strong":"Strength: strong","user.password.strength.medium":"Strength: medium","user.password.strength.low":"Strength: low","user.password.strength.short":"Strength: too short","user.confirm-password.required":"Please confirm your password!","user.phone-number.required":"Please enter your phone number!","user.phone-number.wrong-format":"Please enter a valid phone number","user.verification-code.required":"Please enter the verification code!","user.captcha.required":"Please enter captcha!","user.login.infos":"QuantDinger is an AI multi-agent stock analysis tool that does not have securities investment consulting qualifications. All analysis results, scores, and reference opinions on the platform are automatically generated by AI based on historical data, and are only for learning, research, and technical exchanges, and do not constitute any investment advice or decision-making basis. Stock investment involves market risk, liquidity risk, policy risk and other risks, which may lead to losses of principal. Users should make independent decisions based on their risk tolerance capacity, and bear the consequences of any investment behavior and its results using this tool. Market risk, investment needs to be cautious.","user.login.tab-login-web3":"Web3 Login","user.login.web3.tip":"Sign in with your wallet via signature","user.login.web3.connect":"Connect wallet and login","user.login.web3.no-wallet":"No wallet detected","user.login.web3.no-address":"Wallet address not found","user.login.web3.nonce-failed":"Failed to get nonce","user.login.web3.verify-failed":"Signature verification failed","user.login.web3.success":"Login success","user.login.web3.failed":"Wallet login failed","nav.no_wallet":"No wallet detected","nav.copy":"Copy","nav.copy_success":"Copied","user.login.oauth.google":"Sign in with Google","user.login.oauth.github":"Sign in with GitHub","user.login.oauth.loading":"Redirecting to authorization page...","user.login.oauth.failed":"OAuth login failed","user.login.oauth.get-url-failed":"Failed to get authorization URL","user.login.subtitle":"driven quantitative insights for global markets","user.login.legal.title":"Legal Disclaimer","user.login.legal.view":"View Legal Disclaimer","user.login.legal.collapse":"Hide Legal Disclaimer","user.login.legal.agree":"I have read and agree to the Legal Disclaimer","user.login.legal.required":"Please read and check the Legal Disclaimer first","user.login.legal.content":"QuantDinger is an AI multi-agent stock analysis tool and does not provide investment advice. All analysis results, scores, and references are generated by AI based on historical data and are for learning, research, and technical exchange only. They do not constitute investment advice or a basis for decision-making. Stock investments involve market, liquidity, and policy risks, which may lead to loss of principal. Users should make independent decisions based on their risk tolerance and bear the consequences of any investment behavior and results using this tool.","user.login.privacy.title":"Privacy Policy","user.login.privacy.view":"View Privacy Policy","user.login.privacy.collapse":"Hide Privacy Policy","user.login.privacy.content":"We value your privacy and data protection. (1) Scope of collection: We only collect information necessary to provide the service (e.g., email, mobile number, country code, Web3 wallet address) and limited logs/device data. (2) Purpose of use: Account login and security verification, feature provisioning, troubleshooting, and compliance requirements. (3) Storage & security: Data is encrypted and access-controlled to prevent unauthorized access, disclosure, or loss. (4) Sharing & third parties: We do not share personal data with third parties except as required by law or to deliver the service; where third-party services are involved (e.g., wallets, SMS providers), processing is limited to the minimum scope required. (5) Cookies/local storage: Used for session and login state (e.g., tokens, PHPSESSID). You may clear or restrict them in your browser. (6) Your rights: You may exercise rights of access, correction, deletion, and consent withdrawal as permitted by law. (7) Changes & notices: We will provide prominent notice for updates. Continued use indicates that you have read and agreed to the updated terms. If you do not agree, please stop using the service and contact us.","user.login.username":"Username","user.login.usernameRequired":"Please enter username","user.login.passwordRequired":"Please enter password","user.login.tab":"Login","user.login.submit":"Login","user.login.register":"Create Account","user.login.forgotPassword":"Forgot Password?","user.login.orLoginWith":"Or login with","user.login.methodPassword":"Password","user.login.methodCode":"Email Code","user.login.email":"Email","user.login.emailRequired":"Please enter email","user.login.emailInvalid":"Invalid email format","user.login.verificationCode":"Verification Code","user.login.codeRequired":"Please enter verification code","user.login.sendCode":"Send","user.login.codeSent":"Verification code sent","user.login.codeLoginHint":"New users will be auto-registered","user.login.welcomeNew":"Welcome!","user.login.accountCreated":"Your account has been created","user.oauth.processing":"Processing login...","user.oauth.error.missing_params":"Missing required parameters","user.oauth.error.invalid_state":"Invalid state parameter","user.oauth.error.user_creation_failed":"Failed to create user","user.oauth.error.server_error":"Server error","user.register.tab":"Register","user.register.title":"Create Account","user.register.email":"Email","user.register.emailRequired":"Please enter email","user.register.emailInvalid":"Invalid email format","user.register.verificationCode":"Verification Code","user.register.codeRequired":"Please enter verification code","user.register.sendCode":"Send Code","user.register.codeSent":"Verification code sent","user.register.username":"Username","user.register.usernameRequired":"Please enter username","user.register.usernameLength":"Username must be 3-30 characters","user.register.usernamePattern":"Start with letter, letters/numbers/underscore only","user.register.password":"Password","user.register.passwordRequired":"Please enter password","user.register.confirmPassword":"Confirm Password","user.register.confirmPasswordRequired":"Please confirm password","user.register.passwordMismatch":"Passwords do not match","user.register.submit":"Create Account","user.register.haveAccount":"Already have an account?","user.register.login":"Login","user.register.success":"Registration successful","user.register.pleaseLogin":"Please login with your new account","user.register.pwdMinLength":"At least 8 characters","user.register.pwdUppercase":"At least one uppercase letter","user.register.pwdLowercase":"At least one lowercase letter","user.register.pwdNumber":"At least one number","user.resetPassword.title":"Reset Password","user.resetPassword.email":"Email","user.resetPassword.emailRequired":"Please enter email","user.resetPassword.emailInvalid":"Invalid email format","user.resetPassword.verificationCode":"Verification Code","user.resetPassword.codeRequired":"Please enter verification code","user.resetPassword.sendCode":"Send Code","user.resetPassword.codeSent":"Verification code sent","user.resetPassword.next":"Next","user.resetPassword.backToLogin":"Back to Login","user.resetPassword.resettingFor":"Resetting password for","user.resetPassword.newPassword":"New Password","user.resetPassword.passwordRequired":"Please enter new password","user.resetPassword.confirmPassword":"Confirm New Password","user.resetPassword.confirmPasswordRequired":"Please confirm password","user.resetPassword.submit":"Reset Password","user.resetPassword.back":"Back","user.resetPassword.successTitle":"Password Reset Successful","user.resetPassword.successSubtitle":"You can now login with your new password","user.resetPassword.goToLogin":"Go to Login","user.security.retry":"Retry","profile.passwordHintNew":"For security, email verification is required to change password. Password must be at least 8 characters with uppercase, lowercase, and number.","profile.verificationCode":"Verification Code","profile.codeRequired":"Please enter verification code","profile.codePlaceholder":"Enter verification code","profile.sendCode":"Send Code","profile.codeSent":"Verification code sent","profile.codeWillSendTo":"Code will be sent to","profile.noEmailWarning":"Please set your email first in Basic Info tab","account.basicInfo":"Basic Information","account.id":"User ID","account.username":"Username","account.nickname":"Nickname","account.email":"Email","account.mobile":"Mobile","account.web3address":"Wallet Address","account.pid":"Referrer ID","account.level":"Level","account.money":"Balance","account.qdtBalance":"QDT Balance","account.score":"Score","account.createtime":"Registration Time","account.inviteLink":"Invite Link","account.recharge":"Recharge","account.rechargeTip":"Please scan the QR code below with WeChat or Alipay to recharge","account.qrCodePlaceholder":"QR Code Placeholder (Mock)","account.rechargeAmount":"Recharge Amount","account.enterAmount":"Please enter recharge amount","account.rechargeHint":"Minimum recharge amount: 1 QDT","account.confirmRecharge":"Confirm Recharge","account.enterValidAmount":"Please enter a valid recharge amount","account.rechargeSuccess":"Recharge successful! Recharged {amount} QDT","account.settings.menuMap.basic":"Basic Settings","account.settings.menuMap.security":"Security Settings","account.settings.menuMap.notification":"New Message Notification","account.settings.menuMap.moneyLog":"Transaction History","account.moneyLog.empty":"No transaction history","account.moneyLog.total":"Total {total} records","account.moneyLog.type.purchase":"Purchase Indicator","account.moneyLog.type.recharge":"Recharge","account.moneyLog.type.refund":"Refund","account.moneyLog.type.reward":"Reward","account.moneyLog.type.income":"Indicator Income","account.moneyLog.type.commission":"Platform Fee","wallet.balance":"QDT Balance","wallet.recharge":"Recharge","wallet.withdraw":"Withdraw","wallet.filter":"Filter","wallet.reset":"Reset","wallet.totalRecharge":"Total Recharge","wallet.totalWithdraw":"Total Withdraw","wallet.totalIncome":"Total Income","wallet.records":"Trading Records & Transaction History","wallet.tradingRecords":"Trading Records","wallet.moneyLog":"Transaction History","wallet.rechargeTip":"Please scan the QR code below with WeChat or Alipay to recharge","wallet.qrCodePlaceholder":"QR Code Placeholder (Simulated)","wallet.rechargeAmount":"Recharge Amount","wallet.enterAmount":"Please enter recharge amount","wallet.rechargeHint":"Minimum recharge amount: 1 QDT","wallet.confirmRecharge":"Confirm Recharge","wallet.enterValidAmount":"Please enter a valid recharge amount","wallet.rechargeSuccess":"Recharge successful! Recharged {amount} QDT","wallet.rechargeFailed":"Recharge failed","wallet.withdrawTip":"Please enter withdrawal amount and address","wallet.withdrawAmount":"Withdrawal Amount","wallet.enterWithdrawAmount":"Please enter withdrawal amount","wallet.withdrawHint":"Minimum withdrawal amount: 1 QDT","wallet.withdrawAddress":"Withdrawal Address (Optional)","wallet.enterWithdrawAddress":"Please enter withdrawal address","wallet.confirmWithdraw":"Confirm Withdrawal","wallet.enterValidWithdrawAmount":"Please enter a valid withdrawal amount","wallet.insufficientBalance":"Insufficient balance","wallet.withdrawSuccess":"Withdrawal successful! Withdrew {amount} QDT","wallet.withdrawFailed":"Withdrawal failed","wallet.noTradingRecords":"No trading records","wallet.noMoneyLog":"No transaction history","wallet.loadTradingRecordsFailed":"Failed to load trading records","wallet.loadMoneyLogFailed":"Failed to load transaction history","wallet.moneyLogTotal":"Total {total} records","wallet.moneyLogTypeTitle":"Type","wallet.moneyLogType.all":"All types","wallet.table.time":"Time","wallet.table.type":"Type","wallet.table.price":"Price","wallet.table.amount":"Amount","wallet.table.money":"Amount","wallet.table.balance":"Balance","wallet.table.memo":"Memo","wallet.table.value":"Value","wallet.table.profit":"P/L","wallet.table.commission":"Commission","wallet.table.total":"Total {total} records","wallet.tradeType.buy":"Buy","wallet.tradeType.sell":"Sell","wallet.tradeType.liquidation":"Liquidation","wallet.tradeType.openLong":"Open Long","wallet.tradeType.addLong":"Add Long","wallet.tradeType.closeLong":"Close Long","wallet.tradeType.closeLongStop":"Stop Loss Close Long","wallet.tradeType.closeLongProfit":"Take Profit Close Long","wallet.tradeType.openShort":"Open Short","wallet.tradeType.addShort":"Add Short","wallet.tradeType.closeShort":"Close Short","wallet.tradeType.closeShortStop":"Stop Loss Close Short","wallet.tradeType.closeShortProfit":"Take Profit Close Short","wallet.moneyLogType.purchase":"Purchase Indicator","wallet.moneyLogType.recharge":"Recharge","wallet.moneyLogType.withdraw":"Withdraw","wallet.moneyLogType.refund":"Refund","wallet.moneyLogType.reward":"Reward","wallet.moneyLogType.income":"Income","wallet.moneyLogType.commission":"Commission","wallet.web3Address.required":"Please fill in Web3 wallet address first","wallet.web3Address.requiredDescription":"You need to bind your Web3 wallet address before recharging to receive deposits","wallet.web3Address.placeholder":"Please enter your Web3 wallet address (starts with 0x)","wallet.web3Address.save":"Save Wallet Address","wallet.web3Address.saveSuccess":"Wallet address saved successfully","wallet.web3Address.saveFailed":"Failed to save wallet address","wallet.web3Address.invalidFormat":"Please enter a valid Web3 wallet address (Ethereum format: 42 characters starting with 0x, or TRC20 format: 34 characters starting with T)","wallet.selectCoin":"Select Coin","wallet.selectChain":"Select Chain","wallet.chain.eth":"ETH(ERC20)","wallet.chain.trc20":"TRC20","wallet.chain.bsc":"BSC","wallet.targetQdtAmount":"Target QDT Amount (Optional)","wallet.targetQdtAmount.placeholder":"Enter the QDT amount you want to exchange, current QDT price: {price} USDT","wallet.targetQdtAmount.requiredUsdt":"Required USDT: {amount}","wallet.rechargeAddress":"Recharge Address","wallet.copyAddress":"Copy","wallet.copySuccess":"Copied successfully!","wallet.copyFailed":"Copy failed, please copy manually","wallet.rechargeAddressHint":"Please ensure you use {chain} chain to recharge {coin} to this address","wallet.qdtPrice.loading":"Loading...","wallet.rechargeTip.new":"Please select coin and chain, then scan the QR code below to recharge","wallet.exchangeRate":"1 QDT ≈ {rate} USDT","wallet.withdrawableAmount":"Withdrawable Amount","wallet.totalBalance":"Total Balance","wallet.insufficientWithdrawable":"Insufficient withdrawable amount, current withdrawable: {amount} QDT","wallet.withdrawAddressRequired":"Please enter withdrawal address","wallet.withdrawAddressHint":"Please ensure the address is correct, withdrawal cannot be revoked","wallet.withdrawSubmitSuccess":"Withdrawal application submitted successfully, please wait for review","menu.footer.contactUs":"Contact Us","menu.footer.getSupport":"Get Support","menu.footer.socialAccounts":"Social Accounts","menu.footer.userAgreement":"User Agreement","menu.footer.privacyPolicy":"Privacy Policy","menu.footer.support":"Support","menu.footer.featureRequest":"Feature request","menu.footer.email":"Email","menu.footer.liveChat":"24/7 live chat","dashboard.analysis.title":"Multi-Dimensional Analysis","dashboard.analysis.subtitle":"AI-Powered Comprehensive Financial Analysis Platform","dashboard.analysis.selectSymbol":"Select or enter symbol code","dashboard.analysis.selectModel":"Select Model","dashboard.analysis.startAnalysis":"Start Analysis","dashboard.analysis.history":"History","dashboard.analysis.tab.overview":"Overview","dashboard.analysis.tab.fundamental":"Fundamental","dashboard.analysis.tab.technical":"Technical","dashboard.analysis.tab.news":"News","dashboard.analysis.tab.sentiment":"Sentiment","dashboard.analysis.tab.risk":"Risk","dashboard.analysis.tab.debate":"Debate","dashboard.analysis.tab.decision":"Final Decision","dashboard.analysis.empty.selectSymbol":"Select Symbol to Start Analysis","dashboard.analysis.empty.selectSymbolDesc":"Select from watchlist or enter symbol code to get multi-dimensional AI analysis report","dashboard.analysis.empty.startAnalysis":'Click "Start Analysis" button to perform multi-dimensional analysis',"dashboard.analysis.empty.startAnalysisDesc":"We will provide comprehensive analysis from multiple dimensions including fundamental, technical, news, sentiment and risk","dashboard.analysis.empty.noData":"No {type} analysis data available, please perform comprehensive analysis first","dashboard.analysis.empty.noWatchlist":"No watchlist items","dashboard.analysis.empty.noHistory":"No history records","dashboard.analysis.empty.watchlistHint":"No watchlist, please","dashboard.analysis.empty.noDebateData":"No debate data available","dashboard.analysis.empty.noDecisionData":"No decision data available","dashboard.analysis.empty.selectAgent":"Please select an Agent to view analysis results","dashboard.analysis.loading.analyzing":"Analyzing, please wait...","dashboard.analysis.loading.fundamental":"Analyzing fundamental data...","dashboard.analysis.loading.technical":"Analyzing technical indicators...","dashboard.analysis.loading.news":"Analyzing news data...","dashboard.analysis.loading.sentiment":"Analyzing market sentiment...","dashboard.analysis.loading.risk":"Assessing risks...","dashboard.analysis.loading.debate":"Debating...","dashboard.analysis.loading.decision":"Generating final decision...","dashboard.analysis.score.overall":"Overall Score","dashboard.analysis.score.recommendation":"Recommendation","dashboard.analysis.score.confidence":"Confidence","dashboard.analysis.dimension.fundamental":"Fundamental","dashboard.analysis.dimension.technical":"Technical","dashboard.analysis.dimension.news":"News","dashboard.analysis.dimension.sentiment":"Sentiment","dashboard.analysis.dimension.risk":"Risk","dashboard.analysis.card.dimensionScores":"Dimension Scores","dashboard.analysis.card.overviewReport":"Overview Report","dashboard.analysis.card.financialMetrics":"Financial Metrics","dashboard.analysis.card.fundamentalReport":"Fundamental Analysis Report","dashboard.analysis.card.technicalIndicators":"Technical Indicators","dashboard.analysis.card.technicalReport":"Technical Analysis Report","dashboard.analysis.card.newsList":"Related News","dashboard.analysis.card.newsReport":"News Analysis Report","dashboard.analysis.card.sentimentIndicators":"Sentiment Indicators","dashboard.analysis.card.sentimentReport":"Sentiment Analysis Report","dashboard.analysis.card.riskMetrics":"Risk Metrics","dashboard.analysis.card.riskReport":"Risk Assessment Report","dashboard.analysis.card.bullView":"Bullish View (Bull)","dashboard.analysis.card.bearView":"Bearish View (Bear)","dashboard.analysis.card.researchConclusion":"Researcher Conclusion","dashboard.analysis.card.traderPlan":"Trader Plan","dashboard.analysis.card.riskDebate":"Risk Committee Debate","dashboard.analysis.card.finalDecision":"Final Decision","dashboard.analysis.card.tradePlanDetail":"Trading Plan Details","dashboard.analysis.tradingPlan.entry_price":"Entry Price","dashboard.analysis.tradingPlan.position_size":"Position Size","dashboard.analysis.tradingPlan.stop_loss":"Stop Loss","dashboard.analysis.tradingPlan.take_profit":"Take Profit","dashboard.analysis.label.confidence":"Confidence","dashboard.analysis.label.keyPoints":"Key Points","dashboard.analysis.label.riskWarning":"Risk Warning","dashboard.analysis.risk.risky":"Aggressive View (Risky)","dashboard.analysis.risk.neutral":"Neutral View (Neutral)","dashboard.analysis.risk.safe":"Conservative View (Safe)","dashboard.analysis.risk.conclusion":"Conclusion","dashboard.analysis.feature.fundamental":"Fundamental Analysis","dashboard.analysis.feature.technical":"Technical Analysis","dashboard.analysis.feature.news":"News Analysis","dashboard.analysis.feature.sentiment":"Sentiment Analysis","dashboard.analysis.feature.risk":"Risk Assessment","dashboard.analysis.watchlist.title":"My Watchlist","dashboard.analysis.watchlist.add":"Add","dashboard.analysis.watchlist.addStock":"Add Stock","dashboard.analysis.modal.addStock.title":"Add to Watchlist","dashboard.analysis.modal.addStock.confirm":"Confirm","dashboard.analysis.modal.addStock.cancel":"Cancel","dashboard.analysis.modal.addStock.market":"Market Type","dashboard.analysis.modal.addStock.marketPlaceholder":"Please select market","dashboard.analysis.modal.addStock.marketRequired":"Please select market type","dashboard.analysis.modal.addStock.symbol":"Symbol","dashboard.analysis.modal.addStock.symbolPlaceholder":"e.g.: AAPL, TSLA, GOOGL, 000001, BTC","dashboard.analysis.modal.addStock.symbolRequired":"Please enter symbol code","dashboard.analysis.modal.addStock.searchPlaceholder":"Search symbol code or name","dashboard.analysis.modal.addStock.searchOrInputPlaceholder":"Search or enter symbol code (e.g.: AAPL, BTC/USDT, EUR/USD)","dashboard.analysis.modal.addStock.searchOrInputHint":"Search in database or enter code directly (name will be fetched automatically)","dashboard.analysis.modal.addStock.search":"Search","dashboard.analysis.modal.addStock.searchResults":"Search Results","dashboard.analysis.modal.addStock.hotSymbols":"Hot Symbols","dashboard.analysis.modal.addStock.noHotSymbols":"No hot symbols available","dashboard.analysis.modal.addStock.selectedSymbol":"Selected Symbol","dashboard.analysis.modal.addStock.pleaseSelectSymbol":"Please select a symbol first","dashboard.analysis.modal.addStock.pleaseSelectOrEnterSymbol":"Please select a symbol or enter symbol code","dashboard.analysis.modal.addStock.pleaseEnterSymbol":"Please enter symbol code","dashboard.analysis.modal.addStock.pleaseSelectMarket":"Please select market type first","dashboard.analysis.modal.addStock.searchFailed":"Search failed, please try again later","dashboard.analysis.modal.addStock.noSearchResults":"No matching symbols found","dashboard.analysis.modal.addStock.willAutoFetchName":"Name will be fetched automatically","dashboard.analysis.modal.addStock.addDirectly":"Add Directly","dashboard.analysis.modal.addStock.nameWillBeFetched":"Name will be fetched automatically when adding","dashboard.analysis.market.USStock":"US Stock","dashboard.analysis.market.Crypto":"Cryptocurrency","dashboard.analysis.market.Forex":"Forex","dashboard.analysis.market.Futures":"Futures","dashboard.analysis.modal.history.title":"Analysis History","dashboard.analysis.modal.history.viewResult":"View Result","dashboard.analysis.modal.history.completeTime":"Complete Time","dashboard.analysis.modal.history.error":"Error","dashboard.analysis.status.pending":"Pending","dashboard.analysis.status.processing":"Processing","dashboard.analysis.status.completed":"Completed","dashboard.analysis.status.failed":"Failed","dashboard.analysis.message.selectSymbol":"Please select a symbol first","dashboard.analysis.message.taskCreated":"Analysis task created, executing in background...","dashboard.analysis.message.analysisComplete":"Analysis Complete","dashboard.analysis.message.analysisCompleteCache":"Analysis Complete (Using Cache)","dashboard.analysis.message.analysisFailed":"Analysis failed, please try again later","dashboard.analysis.message.addStockSuccess":"Added successfully","dashboard.analysis.message.addStockFailed":"Failed to add","dashboard.analysis.message.removeStockSuccess":"Removed successfully","dashboard.analysis.message.removeStockFailed":"Failed to remove","dashboard.analysis.message.resumingAnalysis":"Resuming analysis task...","dashboard.analysis.message.deleteSuccess":"Deleted successfully","dashboard.analysis.message.deleteFailed":"Failed to delete","dashboard.analysis.modal.history.delete":"Delete","dashboard.analysis.modal.history.deleteConfirm":"Are you sure you want to delete this analysis record?","dashboard.analysis.test":"Gongzhuan No.{no} shop","dashboard.analysis.introduce":"Introduce","dashboard.analysis.total-sales":"Total Sales","dashboard.analysis.day-sales":"Daily Sales","dashboard.analysis.visits":"Visits","dashboard.analysis.visits-trend":"Visits Trend","dashboard.analysis.visits-ranking":"Visits Ranking","dashboard.analysis.day-visits":"Daily Visits","dashboard.analysis.week":"WoW Change","dashboard.analysis.day":"DoD Change","dashboard.analysis.payments":"Payments","dashboard.analysis.conversion-rate":"Conversion Rate","dashboard.analysis.operational-effect":"Operational Effect","dashboard.analysis.sales-trend":"Stores Sales Trend","dashboard.analysis.sales-ranking":"Sales Ranking","dashboard.analysis.all-year":"All Year","dashboard.analysis.all-month":"All Month","dashboard.analysis.all-week":"All Week","dashboard.analysis.all-day":"All day","dashboard.analysis.search-users":"Search Users","dashboard.analysis.per-capita-search":"Per Capita Search","dashboard.analysis.online-top-search":"Online Top Search","dashboard.analysis.the-proportion-of-sales":"The Proportion Of Sales","dashboard.analysis.dropdown-option-one":"Operation one","dashboard.analysis.dropdown-option-two":"Operation two","dashboard.analysis.channel.all":"ALL","dashboard.analysis.channel.online":"Online","dashboard.analysis.channel.stores":"Stores","dashboard.analysis.sales":"Sales","dashboard.analysis.traffic":"Traffic","dashboard.analysis.table.rank":"Rank","dashboard.analysis.table.search-keyword":"Keyword","dashboard.analysis.table.users":"Users","dashboard.analysis.table.weekly-range":"Weekly Range","dashboard.indicator.selectSymbol":"Select or enter symbol code","dashboard.indicator.emptyWatchlistHint":"No watchlist, please add first","dashboard.indicator.hint.selectSymbol":"Please select a symbol to start analysis","dashboard.indicator.hint.selectSymbolDesc":"Select or enter stock code in the search box above to view K-line chart and technical indicators","dashboard.indicator.retry":"Retry","dashboard.indicator.panel.title":"Technical Indicators","dashboard.indicator.panel.realtimeOn":"Turn off real-time update","dashboard.indicator.panel.realtimeOff":"Turn on real-time update","dashboard.indicator.panel.themeLight":"Switch to dark theme","dashboard.indicator.panel.themeDark":"Switch to light theme","dashboard.indicator.section.enabled":"Enabled","dashboard.indicator.section.added":"My Added Indicators","dashboard.indicator.section.custom":"My Created Indicators","dashboard.indicator.section.bought":"Purchased Indicators","dashboard.indicator.section.myCreated":"My Created Indicators","dashboard.indicator.section.purchased":"Purchased Indicators","dashboard.indicator.empty":"No indicators, please add or create indicators first","dashboard.indicator.emptyPurchased":"No purchased indicators, check out the market","dashboard.indicator.buy":"Buy Indicators","dashboard.indicator.action.start":"Start","dashboard.indicator.action.stop":"Stop","dashboard.indicator.action.edit":"Edit","dashboard.indicator.action.delete":"Delete","dashboard.indicator.action.backtest":"Backtest","dashboard.indicator.action.publish":"Publish to Community","dashboard.indicator.action.unpublish":"Published (Click to Manage)","dashboard.indicator.status.normal":"Active","dashboard.indicator.status.normalPermanent":"Active (Permanent)","dashboard.indicator.status.expired":"Expired","dashboard.indicator.expiry.permanent":"Permanent","dashboard.indicator.expiry.noExpiry":"No expiration","dashboard.indicator.expiry.expired":"Expired: {date}","dashboard.indicator.expiry.expiresOn":"Expires: {date}","dashboard.indicator.delete.confirmTitle":"Confirm Deletion","dashboard.indicator.delete.confirmContent":'Are you sure you want to delete indicator "{name}"? This action cannot be undone.',"dashboard.indicator.delete.confirmOk":"Delete","dashboard.indicator.delete.confirmCancel":"Cancel","dashboard.indicator.delete.success":"Deleted successfully","dashboard.indicator.delete.failed":"Failed to delete","dashboard.indicator.save.success":"Saved successfully","dashboard.indicator.save.failed":"Failed to save","dashboard.indicator.publish.title":"Publish to Community","dashboard.indicator.publish.editTitle":"Manage Publication","dashboard.indicator.publish.hint":'After publishing, other users can view and purchase your indicator in the "Indicator Community"',"dashboard.indicator.publish.pricingType":"Pricing Type","dashboard.indicator.publish.free":"Free","dashboard.indicator.publish.paid":"Paid","dashboard.indicator.publish.price":"Price","dashboard.indicator.publish.description":"Description","dashboard.indicator.publish.descriptionPlaceholder":"Enter a detailed description to help others understand your indicator...","dashboard.indicator.publish.confirm":"Publish","dashboard.indicator.publish.update":"Update","dashboard.indicator.publish.unpublish":"Unpublish","dashboard.indicator.publish.success":"Published successfully","dashboard.indicator.publish.failed":"Failed to publish","dashboard.indicator.publish.unpublishSuccess":"Unpublished successfully","dashboard.indicator.publish.unpublishFailed":"Failed to unpublish","dashboard.indicator.error.loadWatchlistFailed":"Failed to load watchlist","dashboard.indicator.error.chartNotReady":"Chart component not initialized, please select a symbol and wait for the chart to load","dashboard.indicator.error.chartMethodNotReady":"Chart component method not ready, please try again later","dashboard.indicator.error.chartExecuteNotReady":"Chart component execute method not ready, please try again later","dashboard.indicator.error.parseFailed":"Failed to parse Python code","dashboard.indicator.error.parseFailedCheck":"Failed to parse Python code, please check the code format","dashboard.indicator.error.addIndicatorFailed":"Failed to add indicator","dashboard.indicator.error.runIndicatorFailed":"Failed to run indicator","dashboard.indicator.error.pleaseLogin":"Please login first","dashboard.indicator.error.loadDataFailed":"Failed to load data","dashboard.indicator.error.loadDataFailedDesc":"Please check network connection","dashboard.indicator.error.tiingoSubscription":"Forex 1-minute data requires Tiingo paid subscription. Please use other timeframes or upgrade your subscription.","dashboard.indicator.error.pythonEngineFailed":"Python engine failed to load, indicator functionality may be unavailable","dashboard.indicator.error.chartInitFailed":"Chart initialization failed","dashboard.indicator.warning.enterCode":"Please enter indicator code first","dashboard.indicator.warning.chartNotInitialized":"Chart not initialized, cannot use drawing tools","dashboard.indicator.warning.pyodideLoadFailed":"Python Engine Load Failed","dashboard.indicator.warning.pyodideLoadFailedDesc":"Your current region or network environment cannot use this feature","dashboard.indicator.success.runIndicator":"Indicator ran successfully","dashboard.indicator.success.clearDrawings":"All drawings cleared","dashboard.indicator.sma":"SMA (Moving Average Group)","dashboard.indicator.ema":"EMA (Exponential Moving Average Group)","dashboard.indicator.rsi":"RSI (Relative Strength Index)","dashboard.indicator.macd":"MACD","dashboard.indicator.bb":"Bollinger Bands","dashboard.indicator.atr":"ATR (Average True Range)","dashboard.indicator.cci":"CCI (Commodity Channel Index)","dashboard.indicator.williams":"Williams %R","dashboard.indicator.mfi":"MFI (Money Flow Index)","dashboard.indicator.adx":"ADX (Average Directional Index)","dashboard.indicator.obv":"OBV (On Balance Volume)","dashboard.indicator.adosc":"ADOSC (Accumulation/Distribution Oscillator)","dashboard.indicator.ad":"AD (Accumulation/Distribution Line)","dashboard.indicator.kdj":"KDJ (Stochastic Indicator)","dashboard.indicator.signal.buy":"BUY","dashboard.indicator.signal.sell":"SELL","dashboard.indicator.signal.supertrendBuy":"SuperTrend Buy","dashboard.indicator.signal.supertrendSell":"SuperTrend Sell","dashboard.indicator.chart.kline":"K-Line","dashboard.indicator.chart.volume":"Volume","dashboard.indicator.chart.uptrend":"Up Trend","dashboard.indicator.chart.downtrend":"Down Trend","dashboard.indicator.tooltip.time":"Time","dashboard.indicator.tooltip.open":"O","dashboard.indicator.tooltip.close":"C","dashboard.indicator.tooltip.high":"H","dashboard.indicator.tooltip.low":"L","dashboard.indicator.tooltip.volume":"Volume","dashboard.indicator.drawing.line":"Line","dashboard.indicator.drawing.horizontalLine":"Horizontal Line","dashboard.indicator.drawing.verticalLine":"Vertical Line","dashboard.indicator.drawing.ray":"Ray","dashboard.indicator.drawing.straightLine":"Straight Line","dashboard.indicator.drawing.parallelLine":"Parallel Line","dashboard.indicator.drawing.priceLine":"Price Line","dashboard.indicator.drawing.priceChannel":"Price Channel","dashboard.indicator.drawing.fibonacciLine":"Fibonacci Line","dashboard.indicator.drawing.measure":"Measure","dashboard.indicator.drawing.clearAll":"Clear All Drawings","dashboard.indicator.market.USStock":"US Stock","dashboard.indicator.market.Crypto":"Cryptocurrency","dashboard.indicator.market.Forex":"Forex","dashboard.indicator.market.Futures":"Futures","dashboard.indicator.create":"Create Indicator","dashboard.indicator.editor.title":"Create/Edit Indicator","dashboard.indicator.editor.name":"Indicator Name","dashboard.indicator.editor.nameRequired":"Please enter indicator name","dashboard.indicator.editor.namePlaceholder":"Enter indicator name","dashboard.indicator.editor.description":"Description","dashboard.indicator.editor.descriptionPlaceholder":"Enter description (optional)","dashboard.indicator.editor.code":"Python Code","dashboard.indicator.editor.codeRequired":"Please enter indicator code","dashboard.indicator.editor.codePlaceholder":"Enter Python code","dashboard.indicator.editor.run":"Run","dashboard.indicator.editor.runHint":"Click Run button to preview indicator on K-line chart","dashboard.indicator.editor.guide":"Development Guide","dashboard.indicator.editor.guideTitle":"Python Indicator Development Guide","dashboard.indicator.editor.save":"Save","dashboard.indicator.editor.cancel":"Cancel","dashboard.indicator.editor.unnamed":"Unnamed Indicator","dashboard.indicator.editor.publishToCommunity":"Publish to Community","dashboard.indicator.editor.publishToCommunityHint":"After publishing, other users can view and use your indicator in the community","dashboard.indicator.editor.indicatorType":"Indicator Type","dashboard.indicator.editor.indicatorTypeRequired":"Please select indicator type","dashboard.indicator.editor.indicatorTypePlaceholder":"Please select indicator type","dashboard.indicator.editor.previewImage":"Preview Image","dashboard.indicator.editor.uploadImage":"Upload Image","dashboard.indicator.editor.previewImageHint":"Recommended size: 800x400, max 2MB","dashboard.indicator.editor.pricing":"Pricing (QDT)","dashboard.indicator.editor.pricingType.free":"Free","dashboard.indicator.editor.pricingType.permanent":"Permanent","dashboard.indicator.editor.pricingType.monthly":"Monthly","dashboard.indicator.editor.price":"Price","dashboard.indicator.editor.priceRequired":"Please enter price","dashboard.indicator.editor.pricePlaceholder":"Please enter price","dashboard.indicator.editor.pricingHint":"Free indicators (price 0) will still receive platform rewards based on usage and ratings (QDT)","dashboard.indicator.editor.aiGenerate":"AI Generate","dashboard.indicator.editor.aiPromptPlaceholder":"Describe your signal logic (buy/sell only) and plots. Position sizing, risk, scaling, fees/slippage are configured in backtest.","dashboard.indicator.boundary.message":"Note: The indicator script only computes plots + buy/sell signals. Position sizing, risk, scaling, fees/slippage belong to execution config.","dashboard.indicator.boundary.indicatorRule":"Keep the script to buy/sell only (and set df['buy']/df['sell']). Do NOT implement position management, TP/SL, scaling in the script.","dashboard.indicator.boundary.backtestRule":"Rule: If a bar has a main signal (buy/sell → open/close/reverse), scaling in/out is skipped on the same bar.","dashboard.indicator.editor.aiGenerateBtn":"AI Generate Code","dashboard.indicator.editor.aiPromptRequired":"Please enter your idea","dashboard.indicator.editor.aiGenerateSuccess":"Code generated successfully","dashboard.indicator.editor.aiGenerateError":"Code generation failed, please try again later","dashboard.indicator.editor.verifyCode":"Verify Code","dashboard.indicator.editor.verifyCodeSuccess":"Verification Passed","dashboard.indicator.editor.verifyCodeFailed":"Verification Failed","dashboard.indicator.editor.verifyCodeEmpty":"Code cannot be empty","dashboard.indicator.guide.title":"Python Indicator & Strategy Development Guide","dashboard.indicator.guide.intro":"This platform supports writing custom technical indicators and trading signals using Python. The system includes built-in pandas and numpy data analysis libraries. You can use standard DataFrame operations to process K-line data and draw charts or mark buy/sell signals.","dashboard.indicator.guide.section1.title":"1. Runtime Environment & Predefined Variables","dashboard.indicator.guide.section1.env":"Your code runs in a browser-based Python environment (Pyodide).","dashboard.indicator.guide.section1.libs":"Pre-installed Libraries","dashboard.indicator.guide.section1.libsDesc":"The following libraries are imported by default, no need to import again:","dashboard.indicator.guide.section1.libsList":"pandas (pd), numpy (np), math, json","dashboard.indicator.guide.section1.data":"Input Data: df","dashboard.indicator.guide.section1.dataDesc":"The system automatically converts current K-line data into a Pandas DataFrame object, variable name is df.","dashboard.indicator.guide.section1.dataColumns":"df contains the following columns (all float type):","dashboard.indicator.guide.section1.dataColumnsList":"time (timestamp, seconds), open, high, low, close, volume","dashboard.indicator.guide.section1.dataNote":"Data index is arranged from old to new (0 is the earliest data, last row is the latest data).","dashboard.indicator.guide.section1.dataIndex":"Important: df index is timestamp (DatetimeIndex), please preserve the index, avoid using .values which loses the index.","dashboard.indicator.guide.section2.title":"2. Parameter Definition","dashboard.indicator.guide.section2.desc":"You can define variables as parameters at the beginning of your code. The system will try to parse statements like variable = value as adjustable parameters.","dashboard.indicator.guide.section2.example":"Parameter Example","dashboard.indicator.guide.section2.exampleCode":"span = 20 or multiplier = 2.0","dashboard.indicator.guide.section3.title":"3. Backtest Signal Setup (Important!)","dashboard.indicator.guide.section3.desc":"If you want your indicator to support backtesting, you must set the following two columns in your code:","dashboard.indicator.guide.section3.backtestRequired":"Required for Backtesting:","dashboard.indicator.guide.section3.backtestBuySignal":"df['buy_signal'] - Boolean Series, True indicates buy signal","dashboard.indicator.guide.section3.backtestSellSignal":"df['sell_signal'] - Boolean Series, True indicates sell signal","dashboard.indicator.guide.section3.backtestExample":"Example:","dashboard.indicator.guide.section3.backtestExampleCode":"df['buy_signal'] = condition_buy
df['sell_signal'] = condition_sell","dashboard.indicator.guide.section3.backtestNote":"Note: Even if you only set output.signals for chart display, you must set these two columns to enable backtesting.","dashboard.indicator.guide.section4.title":"4. Output Requirements: output","dashboard.indicator.guide.section4.desc":"At the end of code execution, you must define a dictionary named output to tell the chart how to display results.","dashboard.indicator.guide.section4.fields":"The output dictionary contains the following fields:","dashboard.indicator.guide.section4.plots":"plots - For drawing lines (e.g., moving averages, RSI)","dashboard.indicator.guide.section4.signals":"signals - For marking buy/sell signals (e.g., arrows, labels)","dashboard.indicator.guide.section4.name":"name - Indicator name (optional)","dashboard.indicator.guide.section4.calculatedVars":"calculatedVars - Calculated variables (optional, for displaying additional information)","dashboard.indicator.guide.section5.title":"5. Plot Configuration (Plots)","dashboard.indicator.guide.section5.desc":"Each object in the plots list represents a line.","dashboard.indicator.guide.section5.table.field":"Field","dashboard.indicator.guide.section5.table.type":"Type","dashboard.indicator.guide.section5.table.required":"Required","dashboard.indicator.guide.section5.table.requiredYes":"Yes","dashboard.indicator.guide.section5.table.requiredNo":"No","dashboard.indicator.guide.section5.table.desc":"Description","dashboard.indicator.guide.section5.table.name":"The name of the indicator line, displayed in the legend","dashboard.indicator.guide.section5.table.data":"Data list, length must match the number of rows in df. Recommended to use series.tolist()","dashboard.indicator.guide.section5.table.color":"Line color (Hex format, e.g. '#ff0000'). If not filled, the system will automatically assign","dashboard.indicator.guide.section5.table.typeDesc":"Chart type, default is 'line'","dashboard.indicator.guide.section5.table.overlay":"Important. True means display on main chart (with K-line), False means display on sub-chart (independent area)","dashboard.indicator.guide.section5.example":"Example: Draw Simple Moving Average (SMA)","dashboard.indicator.guide.section5.exampleCalc":"Calculate SMA","dashboard.indicator.guide.section5.exampleOutput":"Construct Output","dashboard.indicator.guide.section5.exampleOverlay":"Display on main chart","dashboard.indicator.guide.section6.title":"6. Signal Markers (Signals)","dashboard.indicator.guide.section6.desc":"signals are used to mark buy/sell points on specific K-lines through icons or text. Note: This is only for chart display. The backtest system uses df['buy_signal'] and df['sell_signal'].","dashboard.indicator.guide.section6.table.type":"Signal type: 'buy' (buy, marked below K-line) or 'sell' (sell, marked above K-line)","dashboard.indicator.guide.section6.table.data":"Signal data list. Fill price value at signal positions, fill None (or np.nan) at non-signal positions","dashboard.indicator.guide.section6.table.text":'Text displayed on the label (e.g. "B", "S", "Buy", "Sell")',"dashboard.indicator.guide.section6.table.color":"Marker color","dashboard.indicator.guide.section6.hint":"The system automatically handles positioning.","dashboard.indicator.guide.section6.buy":"Markers will be automatically positioned below the Low of the current K-line","dashboard.indicator.guide.section6.sell":"Markers will be automatically positioned above the High of the current K-line","dashboard.indicator.guide.section6.example":"Example: Draw Buy/Sell Signals","dashboard.indicator.guide.section6.exampleInit":"Initialize signal list, fill all with None","dashboard.indicator.guide.section6.exampleLogic":"Simple logic: mark buy when close price is greater than open price","dashboard.indicator.guide.section6.exampleNote":"In actual logic, please use loops or vectorized operations","dashboard.indicator.guide.section6.examplePrice":"Record price","dashboard.indicator.guide.section6.exampleText":"Buy","dashboard.indicator.guide.section7.title":"7. Complete Code Examples","dashboard.indicator.guide.section7.exampleA":"Example A: Dual EMA Strategy (Supports Backtesting)","dashboard.indicator.guide.section7.exampleACode":'# 1. Calculate indicators
df[\'ema_fast\'] = df[\'close\'].ewm(span=5, adjust=False).mean()
df[\'ema_slow\'] = df[\'close\'].ewm(span=13, adjust=False).mean()

# 2. Calculate crossover signals
cross_up = (df[\'ema_fast\'] > df[\'ema_slow\']) & (df[\'ema_fast\'].shift(1) <= df[\'ema_slow\'].shift(1))
cross_down = (df[\'ema_fast\'] < df[\'ema_slow\']) & (df[\'ema_fast\'].shift(1) >= df[\'ema_slow\'].shift(1))

# 3. 【Important】Set NEW backtest signal columns (bool)
df[\'open_long\'] = cross_up
df[\'close_long\'] = cross_down
df[\'open_short\'] = cross_down
df[\'close_short\'] = cross_up

# 4. Generate signal data for chart display
buy_signals = [df[\'low\'].iloc[i] * 0.995 if cross_up.iloc[i] else None for i in range(len(df))]
sell_signals = [df[\'high\'].iloc[i] * 1.005 if cross_down.iloc[i] else None for i in range(len(df))]

# 5. Build output
output = {
"name": "Dual EMA Strategy",
"plots": [
{"name": "EMA 5", "data": df[\'ema_fast\'].tolist(), "color": "#FF6B6B", "overlay": True},
{"name": "EMA 13", "data": df[\'ema_slow\'].tolist(), "color": "#4ECDC4", "overlay": True}
],
"signals": [
{"type": "buy", "text": "BUY", "data": buy_signals, "color": "#00E676"},
{"type": "sell", "text": "SELL", "data": sell_signals, "color": "#FF5252"}
]
}',"dashboard.indicator.guide.section7.exampleB":"Example B: Bollinger Bands - Chart Display Only","dashboard.indicator.guide.section7.exampleBCode":'# Calculate Bollinger Bands (chart display only, no backtesting)
length = 20
mult = 2.0
df[\'sma\'] = df[\'close\'].rolling(length).mean()
df[\'std\'] = df[\'close\'].rolling(length).std()
df[\'upper\'] = df[\'sma\'] + mult * df[\'std\']
df[\'lower\'] = df[\'sma\'] - mult * df[\'std\']

output = {
"name": "Bollinger Bands",
"plots": [
{"name": "Upper", "data": df[\'upper\'].tolist(), "color": "#FF5252", "overlay": True},
{"name": "Middle", "data": df[\'sma\'].tolist(), "color": "#2196F3", "overlay": True},
{"name": "Lower", "data": df[\'lower\'].tolist(), "color": "#00E676", "overlay": True}
]
}',"dashboard.indicator.guide.section7.exampleC":"Example C: RSI Strategy (Supports Backtesting)","dashboard.indicator.guide.section7.exampleCCode":'# Calculate RSI
delta = df[\'close\'].diff()
up = delta.clip(lower=0)
down = -1 * delta.clip(upper=0)
ema_up = up.ewm(com=13, adjust=False).mean()
ema_down = down.ewm(com=13, adjust=False).mean()
rs = ema_up / ema_down
df[\'rsi\'] = 100 - (100 / (1 + rs))

# Generate trading signals
buy_condition = df[\'rsi\'] < 30 # Oversold buy
sell_condition = df[\'rsi\'] > 70 # Overbought sell

# 【Important】Set NEW backtest signal columns (bool)
df[\'open_long\'] = buy_condition
df[\'close_long\'] = sell_condition
df[\'open_short\'] = sell_condition
df[\'close_short\'] = buy_condition

# Generate chart signals
buy_signals = [df[\'low\'].iloc[i] * 0.995 if buy_condition.iloc[i] else None for i in range(len(df))]
sell_signals = [df[\'high\'].iloc[i] * 1.005 if sell_condition.iloc[i] else None for i in range(len(df))]

output = {
"name": "RSI Strategy",
"plots": [
{"name": "RSI", "data": df[\'rsi\'].tolist(), "color": "#9C27B0", "overlay": False},
{"name": "Overbought", "data": [70] * len(df), "color": "#FF5252", "style": "dashed", "overlay": False},
{"name": "Oversold", "data": [30] * len(df), "color": "#00E676", "style": "dashed", "overlay": False}
],
"signals": [
{"type": "buy", "text": "BUY", "data": buy_signals, "color": "#00E676"},
{"type": "sell", "text": "SELL", "data": sell_signals, "color": "#FF5252"}
]
}',"dashboard.indicator.guide.section6.param":"Parameters","dashboard.indicator.guide.section6.calc":"Calculate","dashboard.indicator.guide.section6.output":"Output","dashboard.indicator.guide.section6.generate":"Generate signal data (initialize with None)","dashboard.indicator.guide.section6.subchart":"Display on sub-chart","dashboard.indicator.guide.section8.title":"8. Frequently Asked Questions (FAQ)","dashboard.indicator.guide.section8.q1":"Q: Why can't my indicator be backtested?","dashboard.indicator.guide.section8.a1":"A: The backtest system requires NEW signal columns: df['open_long'], df['close_long'], df['open_short'], df['close_short'] (boolean). Even if you set output.signals for chart display, you must set these columns to enable backtesting.","dashboard.indicator.guide.section8.q2":"Q: Data length mismatch?","dashboard.indicator.guide.section8.a2":"A: The data list in plots and signals must have exactly the same length as the K-line data. If you use df['xxx'].tolist(), there is usually no problem.","dashboard.indicator.guide.section8.q3":"Q: How to handle NaN (empty values)?","dashboard.indicator.guide.section8.a3":"A: Pandas calculations (such as rolling mean) will produce NaN at the beginning. The system will automatically convert NaN to null for chart rendering. You don't need to manually clean it, but if you need specific logic, you can use df.fillna(0) or other methods.","dashboard.indicator.guide.section8.q4":"Q: Index mismatch causing all signals to be NaN?","dashboard.indicator.guide.section8.a4":"A: Please ensure you preserve the original df index (timestamp). Avoid using .values to create new Series. Use columns directly like df['close'] for operations.","dashboard.indicator.guide.section8.q5":"Q: Can I use third-party network libraries?","dashboard.indicator.guide.section8.a5":"A: No. The runtime environment is a browser sandbox and cannot use libraries like requests to request external APIs, nor can it install additional pip packages. Limited to built-in libraries such as pandas, numpy, math, json.","dashboard.indicator.guide.section8.q6":"Q: How to debug code?","dashboard.indicator.guide.section8.a6":"A: If the chart does not display indicators, it is usually because the Python code has an error. Please check for syntax errors or array index out of bounds. It is recommended to debug the algorithm logic in a local Python environment first, then copy it in.","dashboard.indicator.guide.section8.q7":"Q: Backtest shows 0 signals?","dashboard.indicator.guide.section8.a7":"A: Please check the data type of df['open_long']/df['close_long']/df['open_short']/df['close_short']. They should be boolean (True/False), not numeric. Use condition.fillna(False).astype(bool) to ensure correct type.","dashboard.indicator.paramsConfig.title":"Indicator Parameters","dashboard.indicator.paramsConfig.noParams":"No configurable parameters for this indicator","dashboard.indicator.paramsConfig.hint":"Configure parameters and click OK to run the indicator","dashboard.indicator.backtest.title":"Indicator Backtest","dashboard.indicator.backtest.config":"Backtest Parameters","dashboard.indicator.backtest.startDate":"Start Date","dashboard.indicator.backtest.endDate":"End Date","dashboard.indicator.backtest.selectStartDate":"Select start date","dashboard.indicator.backtest.selectEndDate":"Select end date","dashboard.indicator.backtest.startDateRequired":"Please select start date","dashboard.indicator.backtest.endDateRequired":"Please select end date","dashboard.indicator.backtest.initialCapital":"Initial Capital","dashboard.indicator.backtest.initialCapitalRequired":"Please enter initial capital","dashboard.indicator.backtest.commission":"Commission Rate (%)","dashboard.indicator.backtest.commissionHint":"Charged on notional value (incl. leverage) per trade; both entry & exit are deducted from balance.","dashboard.indicator.backtest.leverage":"Leverage","dashboard.indicator.backtest.timeframe":"Timeframe","dashboard.indicator.backtest.tradeDirection":"Trade Direction","dashboard.indicator.backtest.longOnly":"Long Only","dashboard.indicator.backtest.shortOnly":"Short Only","dashboard.indicator.backtest.both":"Both","dashboard.indicator.backtest.run":"Run Backtest","dashboard.indicator.backtest.rerun":"Run Again","dashboard.indicator.backtest.close":"Close","dashboard.indicator.backtest.running":"Running indicator backtest...","dashboard.indicator.backtest.loadingTip1":"Fetching historical K-line data...","dashboard.indicator.backtest.loadingTip2":"Executing strategy signal calculation...","dashboard.indicator.backtest.loadingTip3":"Simulating trade execution...","dashboard.indicator.backtest.loadingTip4":"Calculating backtest metrics...","dashboard.indicator.backtest.loadingTip5":"Almost done, please wait...","dashboard.indicator.backtest.results":"Backtest Results","dashboard.indicator.backtest.totalReturn":"Total Return","dashboard.indicator.backtest.annualReturn":"Annual Return","dashboard.indicator.backtest.maxDrawdown":"Max Drawdown","dashboard.indicator.backtest.sharpeRatio":"Sharpe Ratio","dashboard.indicator.backtest.winRate":"Win Rate","dashboard.indicator.backtest.profitFactor":"Profit Factor","dashboard.indicator.backtest.totalTrades":"Total Trades","dashboard.indicator.totalReturn":"Total Return","dashboard.indicator.annualReturn":"Annual Return","dashboard.indicator.maxDrawdown":"Max Drawdown","dashboard.indicator.sharpeRatio":"Sharpe Ratio","dashboard.indicator.winRate":"Win Rate","dashboard.indicator.profitFactor":"Profit Factor","dashboard.indicator.totalTrades":"Total Trades","dashboard.indicator.backtest.totalCommission":"Total Commission","dashboard.indicator.backtest.equityCurve":"Equity Curve","dashboard.indicator.backtest.strategy":"Indicator","dashboard.indicator.backtest.benchmark":"Benchmark","dashboard.indicator.backtest.tradeHistory":"Trade History","dashboard.indicator.backtest.tradeTime":"Time","dashboard.indicator.backtest.tradeType":"Type","dashboard.indicator.backtest.buy":"Buy","dashboard.indicator.backtest.sell":"Sell","dashboard.indicator.backtest.liquidation":"Liquidation","dashboard.indicator.backtest.openLong":"Open Long","dashboard.indicator.backtest.closeLong":"Close Long","dashboard.indicator.backtest.closeLongStop":"Close Long (Stop Loss)","dashboard.indicator.backtest.closeLongProfit":"Close Long (Take Profit)","dashboard.indicator.backtest.addLong":"Add Long","dashboard.indicator.backtest.openShort":"Open Short","dashboard.indicator.backtest.closeShort":"Close Short","dashboard.indicator.backtest.closeShortStop":"Close Short (Stop Loss)","dashboard.indicator.backtest.closeShortProfit":"Close Short (Take Profit)","dashboard.indicator.backtest.addShort":"Add Short","dashboard.indicator.backtest.closeLongTrailing":"Close Long (Trailing)","dashboard.indicator.backtest.reduceLong":"Reduce Long","dashboard.indicator.backtest.closeShortTrailing":"Close Short (Trailing)","dashboard.indicator.backtest.reduceShort":"Reduce Short","dashboard.indicator.backtest.price":"Price","dashboard.indicator.backtest.amount":"Amount","dashboard.indicator.backtest.balance":"Balance","dashboard.indicator.backtest.profit":"P&L","dashboard.indicator.backtest.success":"Backtest completed","dashboard.indicator.backtest.failed":"Backtest failed, please try again later","dashboard.indicator.backtest.quickSelect":"Quick Select","dashboard.indicator.backtest.precisionMode":"Backtest Precision Mode","dashboard.indicator.backtest.estimatedCandles":"Est. {count} candles to process","dashboard.indicator.backtest.highPrecisionDesc":"Using 1-minute candles for high-precision backtest, stop-loss/take-profit triggers are more accurate","dashboard.indicator.backtest.mediumPrecisionDesc":"Range exceeds 30 days, using 5-minute candles to balance precision and performance","dashboard.indicator.backtest.standardModeWarning":"Using Standard Backtest Mode","dashboard.indicator.backtest.standardModeDesc":"Current config does not support high-precision backtest, using strategy timeframe","dashboard.indicator.backtest.onlyCryptoSupported":"High-precision backtest only supports cryptocurrency market","dashboard.indicator.backtest.noIndicatorCode":"This indicator has no backtestable code","dashboard.indicator.backtest.noSymbol":"Please select a trading symbol first","dashboard.indicator.backtest.dateRangeExceeded":"Backtest date range exceeded: {timeframe} timeframe allows max {maxRange}","dashboard.indicator.backtest.dateRangeExceededDays":"Backtest range exceeds limit: {timeframe} max {maxRange} ({maxDays} days)","dashboard.indicator.backtest.metaLine":"Symbol: {symbol} | Market: {market} | Timeframe: {timeframe}","dashboard.indicator.backtest.savedRunId":"Backtest saved. Run ID: {id}","dashboard.indicator.backtest.historyTitle":"Backtest History","dashboard.indicator.backtest.historyRefresh":"Refresh","dashboard.indicator.backtest.historyView":"View","dashboard.indicator.backtest.historyNoData":"No backtest history","dashboard.indicator.backtest.historyUseCurrent":"Only current symbol/timeframe","dashboard.indicator.backtest.historyFilterSymbol":"Symbol","dashboard.indicator.backtest.historyFilterTimeframe":"Timeframe","dashboard.indicator.backtest.historyApply":"Apply filters","dashboard.indicator.backtest.historyAIAnalyze":"AI Analyze","dashboard.indicator.backtest.historyAIAnalyzeTitle":"AI Suggestions","dashboard.indicator.backtest.historyNoAIResult":"No AI analysis result","dashboard.indicator.backtest.historyRunId":"Run ID","dashboard.indicator.backtest.historyCreatedAt":"Time","dashboard.indicator.backtest.historyRange":"Range","dashboard.indicator.backtest.historyStatus":"Status","dashboard.indicator.backtest.historyStatusSuccess":"Success","dashboard.indicator.backtest.historyStatusFailed":"Failed","dashboard.indicator.backtest.historyActions":"Actions","dashboard.indicator.backtest.prev":"Previous","dashboard.indicator.backtest.next":"Next","dashboard.indicator.backtest.steps.strategy.title":"Execution Config","dashboard.indicator.backtest.steps.strategy.desc":"Position, risk, scaling","dashboard.indicator.backtest.steps.trading.title":"Backtest Setup","dashboard.indicator.backtest.steps.trading.desc":"Time, capital, fees, leverage, slippage","dashboard.indicator.backtest.steps.results.title":"Results","dashboard.indicator.backtest.steps.results.desc":"Summary & trades","dashboard.indicator.backtest.panel.risk":"Execution: Risk (SL / trailing)","dashboard.indicator.backtest.panel.scale":"Execution: Scale-in (Trend / DCA)","dashboard.indicator.backtest.panel.reduce":"Execution: Scale-out (Trend / Adverse)","dashboard.indicator.backtest.panel.position":"Execution: Entry sizing","dashboard.indicator.backtest.field.stopLossPct":"Stop Loss (%)","dashboard.indicator.backtest.field.takeProfitPct":"Take Profit (%)","dashboard.indicator.backtest.field.trailingEnabled":"Trailing stop / take profit","dashboard.indicator.backtest.field.trailingStopPct":"Trailing drawdown (%)","dashboard.indicator.backtest.field.trailingActivationPct":"Trailing activation (%)","dashboard.indicator.backtest.field.slippage":"Slippage (%)","dashboard.indicator.backtest.field.trendAddEnabled":"Trend-following scale-in","dashboard.indicator.backtest.field.dcaAddEnabled":"Mean-reversion DCA","dashboard.indicator.backtest.field.trendAddStepPct":"Scale-in trigger (%)","dashboard.indicator.backtest.field.dcaAddStepPct":"DCA trigger (%)","dashboard.indicator.backtest.field.trendAddSizePct":"Scale-in size (% of capital)","dashboard.indicator.backtest.field.dcaAddSizePct":"DCA size (% of capital)","dashboard.indicator.backtest.field.trendAddMaxTimes":"Max scale-in times","dashboard.indicator.backtest.field.dcaAddMaxTimes":"Max DCA times","dashboard.indicator.backtest.field.trendReduceEnabled":"Trend reduce","dashboard.indicator.backtest.field.adverseReduceEnabled":"Adverse reduce","dashboard.indicator.backtest.field.trendReduceStepPct":"Trend trigger (%)","dashboard.indicator.backtest.field.adverseReduceStepPct":"Adverse trigger (%)","dashboard.indicator.backtest.field.trendReduceSizePct":"Reduce size (% of position)","dashboard.indicator.backtest.field.adverseReduceSizePct":"Adverse reduce size (% of position)","dashboard.indicator.backtest.field.trendReduceMaxTimes":"Max trend reduce times","dashboard.indicator.backtest.field.adverseReduceMaxTimes":"Max adverse reduce times","dashboard.indicator.backtest.field.entryPct":"Entry size (% of capital)","dashboard.indicator.backtest.field.minOrderPct":"Min order size (% of capital) (optional)","dashboard.indicator.backtest.hint.entryPctMax":"Max entry: {maxPct}% (reserve budget for future scale-ins)","dashboard.docs.title":"Documentation","dashboard.docs.search.placeholder":"Search documents...","dashboard.docs.category.all":"All","dashboard.docs.category.guide":"Guides","dashboard.docs.category.api":"API Reference","dashboard.docs.category.tutorial":"Tutorials","dashboard.docs.category.faq":"FAQ","dashboard.docs.featured.title":"Featured Documents","dashboard.docs.featured.tag":"Featured","dashboard.docs.list.views":"views","dashboard.docs.list.author":"Author","dashboard.docs.list.empty":"No documents","dashboard.docs.list.backToAll":"Back to All Documents","dashboard.docs.list.total":"Total {count} documents","dashboard.docs.detail.back":"Back to List","dashboard.docs.detail.updatedAt":"Updated at","dashboard.docs.detail.related":"Related Documents","dashboard.docs.detail.notFound":"Document Not Found","dashboard.docs.detail.error":"Document does not exist or has been deleted","dashboard.docs.search.result":"Search Results","dashboard.docs.search.keyword":"Keyword","dashboard.totalEquity":"Total Equity","dashboard.totalPnL":"Total P&L","dashboard.aiStrategies":"AI Strategies","dashboard.indicatorStrategies":"Indicator Strategies","dashboard.running":"Running","dashboard.enabled":"Enabled","dashboard.pnlHistory":"P&L History","dashboard.strategyPerformance":"Strategy Performance","dashboard.strategyRanking":"Strategy Ranking","dashboard.winRate":"Win Rate","dashboard.profitFactor":"Profit Factor","dashboard.maxDrawdown":"Max Drawdown","dashboard.totalTrades":"Total Trades","dashboard.runningStrategies":"Running Strategies","dashboard.equityCurve":"Equity Curve","dashboard.strategyAllocation":"Strategy Allocation","dashboard.drawdownCurve":"Drawdown Curve","dashboard.drawdown":"Drawdown","dashboard.hourlyDistribution":"Hourly Distribution","dashboard.dailyPnl":"Daily P&L","dashboard.cumulativePnl":"Cumulative P&L","dashboard.tradeCount":"Trade Count","dashboard.profit":"Profit","dashboard.noData":"No Data","dashboard.noStrategyData":"No strategy data","dashboard.ranking.totalProfit":"Total Profit","dashboard.ranking.roi":"ROI","dashboard.ranking.trades":"Trades","dashboard.unit.trades":"","dashboard.unit.strategies":"","dashboard.label.avgDaily":"Avg Daily","dashboard.label.avgProfit":"Avg Profit","dashboard.label.win":"W","dashboard.label.lose":"L","dashboard.label.trade":"Trades","dashboard.label.indicator":"Indicator","dashboard.label.totalPnl":"Total P&L","dashboard.label.maxDrawdownPoint":"Max DD","dashboard.profitCalendar":"Profit Calendar","dashboard.recentTrades":"Recent Trades","dashboard.currentPositions":"Current Positions","dashboard.table.time":"Time","dashboard.table.strategy":"Strategy","dashboard.table.symbol":"Symbol","dashboard.table.type":"Type","dashboard.table.side":"Side","dashboard.table.size":"Size","dashboard.table.entryPrice":"Entry Price","dashboard.table.price":"Price","dashboard.table.amount":"Amount","dashboard.table.profit":"Profit","dashboard.pendingOrders":"Order Execution Records","dashboard.totalOrders":"Total {total} orders","dashboard.viewError":"View Error","dashboard.filled":"Filled","dashboard.orderTable.time":"Created Time","dashboard.orderTable.strategy":"Strategy","dashboard.orderTable.symbol":"Symbol","dashboard.orderTable.signalType":"Signal Type","dashboard.orderTable.amount":"Amount","dashboard.orderTable.price":"Filled Price","dashboard.orderTable.status":"Status","dashboard.orderTable.timeInfo":"Time","dashboard.orderTable.executedAt":"Executed Time","dashboard.orderTable.exchange":"Exchange","dashboard.orderTable.notify":"Notify","dashboard.orderTable.actions":"Actions","dashboard.orderTable.delete":"Delete","dashboard.orderTable.deleteConfirm":"Delete this record?","dashboard.orderTable.deleteSuccess":"Deleted","dashboard.orderTable.deleteFailed":"Delete failed","dashboard.newOrderNotify":"New Order Alert","dashboard.newOrderDesc":"New order execution record","dashboard.soundEnabled":"Sound notification enabled","dashboard.soundDisabled":"Sound notification disabled","dashboard.clickToMute":"Click to mute","dashboard.clickToUnmute":"Click to unmute","dashboard.signalType.openLong":"Open Long","dashboard.signalType.openShort":"Open Short","dashboard.signalType.closeLong":"Close Long","dashboard.signalType.closeShort":"Close Short","dashboard.signalType.addLong":"Add Long","dashboard.signalType.addShort":"Add Short","dashboard.status.pending":"Pending","dashboard.status.processing":"Processing","dashboard.status.completed":"Completed","dashboard.status.failed":"Failed","dashboard.status.cancelled":"Cancelled","dashboard.table.pnl":"Unrealized P&L","form.basic-form.basic.title":"Basic form","form.basic-form.basic.description":"Form pages are used to collect or verify information to users, and basic forms are common in scenarios where there are fewer data items.","form.basic-form.title.label":"Title","form.basic-form.title.placeholder":"Give the target a name","form.basic-form.title.required":"Please enter a title","form.basic-form.date.label":"Start and end date","form.basic-form.placeholder.start":"Start date","form.basic-form.placeholder.end":"End date","form.basic-form.date.required":"Please select the start and end date","form.basic-form.goal.label":"Goal description","form.basic-form.goal.placeholder":"Please enter your work goals","form.basic-form.goal.required":"Please enter a description of the goal","form.basic-form.standard.label":"Metrics","form.basic-form.standard.placeholder":"Please enter a metric","form.basic-form.standard.required":"Please enter a metric","form.basic-form.client.label":"Client","form.basic-form.label.tooltip":"Target service object","form.basic-form.client.placeholder":"Please describe your customer service, internal customers directly @ Name / job number","form.basic-form.client.required":"Please describe the customers you serve","form.basic-form.invites.label":"Inviting critics","form.basic-form.invites.placeholder":"Please direct @ Name / job number, you can invite up to 5 people","form.basic-form.weight.label":"Weight","form.basic-form.weight.placeholder":"Please enter weight","form.basic-form.public.label":"Target disclosure","form.basic-form.label.help":"Customers and invitees are shared by default","form.basic-form.radio.public":"Public","form.basic-form.radio.partially-public":"Partially public","form.basic-form.radio.private":"Private","form.basic-form.publicUsers.placeholder":"Open to","form.basic-form.option.A":"Colleague A","form.basic-form.option.B":"Colleague B","form.basic-form.option.C":"Colleague C","form.basic-form.email.required":"Please enter your email!","form.basic-form.email.wrong-format":"The email address is in the wrong format!","form.basic-form.userName.required":"Please enter your userName!","form.basic-form.password.required":"Please enter your password!","form.basic-form.password.twice":"The passwords entered twice do not match!","form.basic-form.strength.msg":"Please enter at least 6 characters and don't use passwords that are easy to guess.","form.basic-form.strength.strong":"Strength: strong","form.basic-form.strength.medium":"Strength: medium","form.basic-form.strength.short":"Strength: too short","form.basic-form.confirm-password.required":"Please confirm your password!","form.basic-form.phone-number.required":"Please enter your phone number!","form.basic-form.phone-number.wrong-format":"Malformed phone number!","form.basic-form.verification-code.required":"Please enter the verification code!","form.basic-form.form.get-captcha":"Get Captcha","form.basic-form.captcha.second":"sec","form.basic-form.form.optional":" (optional) ","form.basic-form.form.submit":"Submit","form.basic-form.form.save":"Save","form.basic-form.email.placeholder":"Email","form.basic-form.password.placeholder":"Password","form.basic-form.confirm-password.placeholder":"Confirm password","form.basic-form.phone-number.placeholder":"Phone number","form.basic-form.verification-code.placeholder":"Verification code","result.success.title":"Submission Success","result.success.description":"The submission results page is used to feed back the results of a series of operational tasks. If it is a simple operation, use the Message global prompt feedback. This text area can show a simple supplementary explanation. If there is a similar requirement for displaying “documents”, the following gray area can present more complicated content.","result.success.operate-title":"Project Name","result.success.operate-id":"Project ID","result.success.principal":"Principal","result.success.operate-time":"Effective time","result.success.step1-title":"Create project","result.success.step1-operator":"Qu Lili","result.success.step2-title":"Departmental preliminary review","result.success.step2-operator":"Zhou Maomao","result.success.step2-extra":"Urge","result.success.step3-title":"Financial review","result.success.step4-title":"Finish","result.success.btn-return":"Back List","result.success.btn-project":"View Project","result.success.btn-print":"Print","result.fail.error.title":"Submission Failed","result.fail.error.description":"Please check and modify the following information before resubmitting.","result.fail.error.hint-title":"The content you submitted has the following error:","result.fail.error.hint-text1":"Your account has been frozen","result.fail.error.hint-btn1":"Thaw immediately","result.fail.error.hint-text2":"Your account is not yet eligible to apply","result.fail.error.hint-btn2":"Upgrade immediately","result.fail.error.btn-text":"Return to modify","account.settings.menuMap.custom":"Custom Settings","account.settings.menuMap.binding":"Account Binding","account.settings.basic.avatar":"Avatar","account.settings.basic.change-avatar":"Change avatar","account.settings.basic.email":"Email","account.settings.basic.email-message":"Please input your email!","account.settings.basic.nickname":"Nickname","account.settings.basic.nickname-message":"Please input your Nickname!","account.settings.basic.profile":"Personal profile","account.settings.basic.profile-message":"Please input your personal profile!","account.settings.basic.profile-placeholder":"Brief introduction to yourself","account.settings.basic.country":"Country/Region","account.settings.basic.country-message":"Please input your country!","account.settings.basic.geographic":"Province or city","account.settings.basic.geographic-message":"Please input your geographic info!","account.settings.basic.address":"Street Address","account.settings.basic.address-message":"Please input your address!","account.settings.basic.phone":"Phone Number","account.settings.basic.phone-message":"Please input your phone!","account.settings.basic.update":"Update Information","account.settings.basic.update.success":"Update basic information successfully","account.settings.security.strong":"Strong","account.settings.security.medium":"Medium","account.settings.security.weak":"Weak","account.settings.security.password":"Account Password","account.settings.security.password-description":"Current password strength:","account.settings.security.phone":"Security Phone","account.settings.security.phone-description":"Bound phone:","account.settings.security.question":"Security Question","account.settings.security.question-description":"The security question is not set, and the security policy can effectively protect the account security","account.settings.security.email":"Bound Email","account.settings.security.email-description":"Bound Email:","account.settings.security.mfa":"MFA Device","account.settings.security.mfa-description":"Unbound MFA device, after binding, can be confirmed twice","account.settings.security.modify":"Modify","account.settings.security.set":"Set","account.settings.security.bind":"Bind","account.settings.binding.taobao":"Binding Taobao","account.settings.binding.taobao-description":"Currently unbound Taobao account","account.settings.binding.alipay":"Binding Alipay","account.settings.binding.alipay-description":"Currently unbound Alipay account","account.settings.binding.dingding":"Binding DingTalk","account.settings.binding.dingding-description":"Currently unbound DingTalk account","account.settings.binding.bind":"Bind","account.settings.notification.password":"Account Password","account.settings.notification.password-description":"Messages from other users will be notified in the form of a station letter","account.settings.notification.messages":"System Messages","account.settings.notification.messages-description":"System messages will be notified in the form of a station letter","account.settings.notification.todo":"To-do Notification","account.settings.notification.todo-description":"The to-do list will be notified in the form of a letter from the station","account.settings.settings.open":"Open","account.settings.settings.close":"Close","trading-assistant.title":"Trading Assistant","trading-assistant.strategyList":"Strategy List","trading-assistant.createStrategy":"Create Strategy","trading-assistant.noStrategy":"No strategies","trading-assistant.selectStrategy":"Please select a strategy from the left to view details","trading-assistant.startStrategy":"Start Strategy","trading-assistant.stopStrategy":"Stop Strategy","trading-assistant.editStrategy":"Edit Strategy","trading-assistant.deleteStrategy":"Delete Strategy","trading-assistant.startAll":"Start All","trading-assistant.stopAll":"Stop All","trading-assistant.deleteAll":"Delete All","trading-assistant.symbolCount":"symbols","trading-assistant.strategyCount":"strategies","trading-assistant.groupBy":"Group By","trading-assistant.groupByStrategy":"Strategy","trading-assistant.groupBySymbol":"Symbol","trading-assistant.timeframe":"Timeframe","trading-assistant.indicator":"Indicator","trading-assistant.status.running":"Running","trading-assistant.status.stopped":"Stopped","trading-assistant.status.error":"Error","trading-assistant.strategyType.IndicatorStrategy":"Indicator Strategy","trading-assistant.strategyType.PromptBasedStrategy":"Prompt Strategy","trading-assistant.strategyType.GridStrategy":"Grid Strategy","trading-assistant.tabs.tradingRecords":"Trading Records","trading-assistant.tabs.positions":"Positions","trading-assistant.tabs.equityCurve":"Equity Curve","trading-assistant.form.step1":"Select Indicator","trading-assistant.form.step2":"Exchange Configuration","trading-assistant.form.step3":"Strategy Parameters","trading-assistant.form.step2Params":"Parameters","trading-assistant.form.step3Signal":"Signal Delivery","trading-assistant.form.simpleMode":"Simple","trading-assistant.form.advancedMode":"Advanced","trading-assistant.form.simpleModeHint":"Quick setup with recommended defaults","trading-assistant.form.advancedModeHint":"Customize all parameters for pros","trading-assistant.form.simpleStep1":"Select Indicator & Pair","trading-assistant.form.simpleStep2":"Launch Mode","trading-assistant.form.simpleDefaultsHint":"Defaults (expand to customize)","trading-assistant.form.showAdvancedSettings":"Show Advanced Settings","trading-assistant.form.hideAdvancedSettings":"Hide Advanced Settings","trading-assistant.form.marketCategory":"Market Category","trading-assistant.form.marketCategoryHint":"Select a market first. Only Crypto can enable live trading; other markets are signal-only.","trading-assistant.market.USStock":"US Stock","trading-assistant.market.Crypto":"Crypto","trading-assistant.market.Forex":"Forex","trading-assistant.form.indicator":"Select Indicator","trading-assistant.form.indicatorHint":"You can only select indicators you have purchased or created","trading-assistant.form.qdtCostHints":"Using strategies will consume QDT, please ensure your account has sufficient QDT balance","trading-assistant.form.indicatorDescription":"Indicator Description","trading-assistant.form.noDescription":"No description","trading-assistant.form.indicatorParams":"Indicator Parameters","trading-assistant.form.indicatorParamsHint":"These parameters will be passed to the indicator code. Different strategies can use different parameter values.","trading-assistant.form.exchange":"Select Exchange","trading-assistant.form.apiKey":"API Key","trading-assistant.form.secretKey":"Secret Key","trading-assistant.form.passphrase":"Passphrase","trading-assistant.form.testConnection":"Test Connection","trading-assistant.form.strategyName":"Strategy Name","trading-assistant.form.symbol":"Trading Pair","trading-assistant.form.symbols":"Trading Pairs (Multi-select)","trading-assistant.form.symbolHint":"Symbol format depends on the selected market","trading-assistant.form.symbolsHint":"Select multiple pairs to create strategies for each","trading-assistant.form.strategyType":"Strategy Type","trading-assistant.form.strategyTypeSingle":"Single Symbol Strategy","trading-assistant.form.strategyTypeCrossSectional":"Cross-Sectional Strategy","trading-assistant.form.strategyTypeHint":"Single Symbol: Trade a single symbol; Cross-Sectional: Manage a portfolio of multiple symbols","trading-assistant.form.symbolList":"Symbol List","trading-assistant.form.symbolListHint":"Select multiple symbols, strategy will rank and rebalance based on indicator scores","trading-assistant.form.portfolioSize":"Portfolio Size","trading-assistant.form.portfolioSizeHint":"Number of symbols to hold simultaneously","trading-assistant.form.longRatio":"Long Ratio","trading-assistant.form.longRatioHint":"Proportion of long positions (0-1), e.g. 0.5 means 50% long, 50% short","trading-assistant.form.rebalanceFrequency":"Rebalance Frequency","trading-assistant.form.rebalanceDaily":"Daily","trading-assistant.form.rebalanceWeekly":"Weekly","trading-assistant.form.rebalanceMonthly":"Monthly","trading-assistant.form.rebalanceFrequencyHint":"Frequency of portfolio rebalancing","trading-assistant.form.addSymbol":"Add Symbol","trading-assistant.form.addSymbolTitle":"Add Symbol to Watchlist","trading-assistant.form.searchSymbolPlaceholder":"Search by code, e.g. BTC, AAPL","trading-assistant.form.noSymbolFound":"No matching symbol found","trading-assistant.form.canDirectAdd":"You can directly add the code","trading-assistant.form.searchSymbolHint":"Enter code to search symbols","trading-assistant.form.confirmAdd":"Confirm Add","trading-assistant.form.addSymbolSuccess":"Symbol added successfully","trading-assistant.form.addSymbolFailed":"Failed to add, please try again","trading-assistant.form.pleaseSelectSymbol":"Please select or enter a symbol","trading-assistant.form.symbolHintCrypto":"Crypto: use trading pairs like BTC/USDT","trading-assistant.form.symbolHintGeneral":"Enter the symbol for the selected market (e.g. 600519, AAPL, EURUSD).","trading-assistant.form.initialCapital":"Initial Capital","trading-assistant.form.marketType":"Market Type","trading-assistant.form.marketTypeFutures":"Futures","trading-assistant.form.marketTypeSpot":"Spot","trading-assistant.form.marketTypeHint":"Futures support bidirectional trading and leverage, spot only supports long positions with fixed 1x leverage","trading-assistant.form.leverage":"Leverage","trading-assistant.form.leverageHint":"Futures: 1-125x, Spot: Fixed 1x","trading-assistant.form.spotLeverageFixed":"Spot trading leverage is fixed at 1x","trading-assistant.form.spotOnlyLongHint":"Spot trading only supports long positions","trading-assistant.form.tradeDirection":"Trade Direction","trading-assistant.form.tradeDirectionLong":"Long Only","trading-assistant.form.tradeDirectionShort":"Short Only","trading-assistant.form.tradeDirectionBoth":"Both","trading-assistant.form.timeframe":"Timeframe","trading-assistant.form.klinePeriod":"K-Line Period","trading-assistant.form.timeframe1m":"1 Minute","trading-assistant.form.timeframe5m":"5 Minutes","trading-assistant.form.timeframe15m":"15 Minutes","trading-assistant.form.timeframe30m":"30 Minutes","trading-assistant.form.timeframe1H":"1 Hour","trading-assistant.form.timeframe4H":"4 Hours","trading-assistant.form.timeframe1D":"1 Day","trading-assistant.form.selectStrategyType":"Select Strategy Type","trading-assistant.form.indicatorStrategy":"Indicator Strategy","trading-assistant.form.indicatorStrategyDesc":"Automated trading strategy based on technical indicators","trading-assistant.form.aiStrategy":"AI Strategy","trading-assistant.form.aiStrategyDesc":"Automated trading strategy based on AI intelligent decision-making","trading-assistant.form.enableAiFilter":"Enable AI Intelligent Decision Filter","trading-assistant.form.enableAiFilterHint":"When enabled, indicator signals will be filtered by AI to improve trading quality","trading-assistant.form.aiFilterPrompt":"Custom Prompt","trading-assistant.form.aiFilterPromptHint":"Provide custom instructions for AI filtering, leave blank to use system default","trading-assistant.validation.strategyTypeRequired":"Please select a strategy type","trading-assistant.validation.marketCategoryRequired":"Please select a market category","trading-assistant.form.advancedSettings":"Advanced Settings","trading-assistant.form.orderMode":"Order Mode","trading-assistant.form.orderModeMaker":"Maker (Limit)","trading-assistant.form.orderModeTaker":"Taker (Market)","trading-assistant.form.orderModeHint":"Maker mode uses limit orders with lower fees; Taker mode executes immediately with higher fees","trading-assistant.form.makerWaitSec":"Maker Wait Time (seconds)","trading-assistant.form.makerWaitSecHint":"Time to wait for order fill before canceling and retrying","trading-assistant.form.makerRetries":"Maker Retries","trading-assistant.form.makerRetriesHint":"Maximum number of retries when maker order is not filled","trading-assistant.form.fallbackToMarket":"Fallback to Market on failure","trading-assistant.form.fallbackToMarketHint":"If limit order (open/close) is not filled, downgrade to market order to ensure execution","trading-assistant.form.marginMode":"Margin Mode","trading-assistant.form.marginModeCross":"Cross Margin","trading-assistant.form.marginModeIsolated":"Isolated Margin","trading-assistant.form.stopLossPct":"Stop Loss (%)","trading-assistant.form.stopLossPctHint":"Set stop loss percentage, 0 means disabled","trading-assistant.form.takeProfitPct":"Take Profit (%)","trading-assistant.form.takeProfitPctHint":"Set take profit percentage, 0 means disabled","trading-assistant.form.commission":"Commission (%)","trading-assistant.form.commissionHint":"Trading fee percentage (optional)","trading-assistant.form.slippage":"Slippage (%)","trading-assistant.form.slippageHint":"Estimated slippage percentage (optional)","trading-assistant.form.executionMode":"Execution","trading-assistant.form.executionModeSignal":"Signal only (push notifications)","trading-assistant.form.executionModeLive":"Live trading","trading-assistant.form.liveTradingCryptoOnlyHint":"Live trading is available for Crypto only. Other markets can only push signals.","trading-assistant.form.liveTradingNotSupportedHint":"Live trading is not available for this market","trading-assistant.form.broker":"Broker","trading-assistant.form.localDeploymentRequired":"⚠️ Local Deployment Required","trading-assistant.form.localDeploymentHint":"IBKR and MT5 are external trading interfaces that require local deployment of QuantDinger. Cloud SaaS mode is not supported. Please ensure you have installed and configured the trading software (TWS/IB Gateway or MT5 terminal) on your local machine.","trading-assistant.form.ibkrConnectionTitle":"Interactive Brokers Connection","trading-assistant.form.ibkrConnectionHint":"Make sure TWS or IB Gateway is running with API enabled","trading-assistant.validation.brokerRequired":"Please select a broker","trading-assistant.placeholders.selectBroker":"Select broker","trading-assistant.brokerNames":{ibkr:"Interactive Brokers (IBKR)",mt5:"MetaTrader 5 (MT5)",mt4:"MetaTrader 4 (MT4)",futu:"Futu Securities",tiger:"Tiger Brokers",td:"TD Ameritrade",schwab:"Charles Schwab"},"trading-assistant.form.ibkrHost":"Host","trading-assistant.form.ibkrPort":"Port","trading-assistant.form.ibkrPortHint":"TWS Live:7497, TWS Paper:7496, Gateway Live:4001, Gateway Paper:4002","trading-assistant.form.ibkrClientId":"Client ID","trading-assistant.form.ibkrAccount":"Account","trading-assistant.form.ibkrAccountHint":"Leave empty to auto-select first account. Specify for multi-account users.","trading-assistant.placeholders.ibkrAccount":"Optional, e.g. U1234567","trading-assistant.exchange.ibkrConnectionSuccess":"IBKR connected successfully","trading-assistant.exchange.ibkrConnectionFailed":"IBKR connection failed. Please check if TWS/Gateway is running.","trading-assistant.exchange.checkLocalDeployment":"Please ensure you are running locally. Cloud SaaS does not support external trading interfaces.","trading-assistant.form.forexBroker":"Forex Broker","trading-assistant.form.mt5ConnectionTitle":"MetaTrader 5 Connection","trading-assistant.form.mt5ConnectionHint":"Make sure MT5 terminal is running and logged in (Windows only)","trading-assistant.form.mt5Server":"Server","trading-assistant.form.mt5ServerHint":"Broker server name (e.g., ICMarkets-Demo)","trading-assistant.form.mt5Login":"Account Number","trading-assistant.form.mt5Password":"Password","trading-assistant.form.mt5TerminalPath":"MT5 Terminal Path (Optional)","trading-assistant.form.mt5TerminalPathHint":"If MT5 terminal is not installed in the default location, specify the full path to terminal64.exe (e.g., C:\\Program Files\\MetaTrader 5\\terminal64.exe)","trading-assistant.placeholders.mt5Server":"e.g., ICMarkets-Demo","trading-assistant.placeholders.mt5Login":"e.g., 12345678","trading-assistant.placeholders.mt5Password":"Your MT5 password","trading-assistant.placeholders.mt5TerminalPath":"e.g., C:\\Program Files\\MetaTrader 5\\terminal64.exe","trading-assistant.validation.mt5ServerRequired":"Please enter MT5 server","trading-assistant.validation.mt5LoginRequired":"Please enter MT5 account number","trading-assistant.validation.mt5PasswordRequired":"Please enter MT5 password","trading-assistant.validation.portfolioSizeRequired":"Please enter portfolio size","trading-assistant.validation.longRatioRequired":"Please enter long ratio","trading-assistant.exchange.mt5ConnectionSuccess":"MT5 connected successfully","trading-assistant.exchange.mt5ConnectionFailed":"MT5 connection failed. Please check if terminal is running.","trading-assistant.form.notifyChannels":"Notification Channels","trading-assistant.form.notifyChannelsHint":"Choose how you want to receive buy/sell and risk-management signals.","trading-assistant.notify.browser":"Browser","trading-assistant.notify.email":"Email","trading-assistant.notify.phone":"Phone","trading-assistant.notify.telegram":"Telegram","trading-assistant.notify.discord":"Discord","trading-assistant.notify.webhook":"Webhook","trading-assistant.form.notifyEmail":"Email","trading-assistant.form.notifyPhone":"Phone number","trading-assistant.form.notifyTelegram":"Telegram (chat id / username)","trading-assistant.form.notifyDiscord":"Discord (webhook url)","trading-assistant.form.notifyWebhook":"Webhook URL","trading-assistant.form.liveTradingConfigTitle":"Exchange Credentials","trading-assistant.form.liveTradingConfigHint":"Provide your exchange API credentials. You can test the connection before saving.","trading-assistant.form.savedCredential":"Saved credential","trading-assistant.form.savedCredentialHint":"Select a saved credential to auto-fill API keys (optional).","trading-assistant.form.saveCredential":"Save this credential for future use","trading-assistant.form.credentialName":"Credential name (optional)","trading-assistant.form.signalMode":"Signal Mode","trading-assistant.form.signalModeConfirmed":"Confirmed","trading-assistant.form.signalModeAggressive":"Aggressive","trading-assistant.form.signalModeHint":"Confirmed: only check completed candles; Aggressive: also check forming candles","trading-assistant.form.cancel":"Cancel","trading-assistant.form.prev":"Previous","trading-assistant.form.next":"Next","trading-assistant.form.confirmCreate":"Confirm Create","trading-assistant.form.confirmEdit":"Confirm Edit","trading-assistant.messages.createSuccess":"Strategy created successfully","trading-assistant.messages.createFailed":"Failed to create strategy","trading-assistant.messages.updateSuccess":"Strategy updated successfully","trading-assistant.messages.updateFailed":"Failed to update strategy","trading-assistant.messages.deleteSuccess":"Strategy deleted successfully","trading-assistant.messages.deleteFailed":"Failed to delete strategy","trading-assistant.messages.startSuccess":"Strategy started successfully","trading-assistant.messages.startFailed":"Failed to start strategy","trading-assistant.messages.stopSuccess":"Strategy stopped successfully","trading-assistant.messages.stopFailed":"Failed to stop strategy","trading-assistant.messages.loadFailed":"Failed to load strategy list","trading-assistant.messages.runningWarning":"Strategy is running, please stop it before editing","trading-assistant.messages.deleteConfirmWithName":'Are you sure you want to delete strategy "{name}"? This action cannot be undone.',"trading-assistant.messages.deleteConfirm":"Are you sure you want to delete this strategy? This action cannot be undone.","trading-assistant.messages.loadTradesFailed":"Failed to load trading records","trading-assistant.messages.loadPositionsFailed":"Failed to load position records","trading-assistant.messages.loadEquityFailed":"Failed to load equity curve","trading-assistant.messages.loadIndicatorsFailed":"Failed to load indicator list, please try again later","trading-assistant.messages.spotLimitations":"Spot trading has been automatically set to long only with 1x leverage","trading-assistant.messages.autoFillApiConfig":"Auto-filled API configuration for this exchange from history","trading-assistant.messages.batchCreateSuccess":"Successfully created {count} strategies","trading-assistant.messages.batchStartSuccess":"Successfully started {count} strategies","trading-assistant.messages.batchStartFailed":"Failed to start strategies","trading-assistant.messages.batchStopSuccess":"Successfully stopped {count} strategies","trading-assistant.messages.batchStopFailed":"Failed to stop strategies","trading-assistant.messages.batchDeleteSuccess":"Successfully deleted {count} strategies","trading-assistant.messages.batchDeleteFailed":"Failed to delete strategies","trading-assistant.messages.batchDeleteConfirm":'Are you sure you want to delete {count} strategies in group "{name}"? This action cannot be undone.',"trading-assistant.placeholders.selectIndicator":"Please select an indicator","trading-assistant.placeholders.selectExchange":"Please select an exchange","trading-assistant.placeholders.selectMarketCategory":"Please select market category","trading-assistant.placeholders.inputApiKey":"Please enter API Key","trading-assistant.placeholders.inputSecretKey":"Please enter Secret Key","trading-assistant.placeholders.inputPassphrase":"Please enter Passphrase","trading-assistant.placeholders.inputStrategyName":"Please enter strategy name","trading-assistant.placeholders.selectSymbol":"Please select trading pair","trading-assistant.placeholders.selectSymbols":"Please select trading pairs (multi-select)","trading-assistant.placeholders.inputSymbol":"Please enter symbol","trading-assistant.placeholders.selectTimeframe":"Please select timeframe","trading-assistant.placeholders.selectKlinePeriod":"Please select K-line period","trading-assistant.placeholders.inputAiFilterPrompt":"Please enter custom prompt (optional)","trading-assistant.placeholders.inputEmail":"Please enter email","trading-assistant.placeholders.inputPhone":"Please enter phone number","trading-assistant.placeholders.inputTelegram":"Please enter Telegram chat id / username","trading-assistant.placeholders.inputDiscord":"Please enter Discord webhook url","trading-assistant.placeholders.inputWebhook":"Please enter webhook url","trading-assistant.placeholders.selectSavedCredential":"Select saved credential","trading-assistant.placeholders.inputCredentialName":"For example: Binance main key","trading-assistant.validation.indicatorRequired":"Please select an indicator","trading-assistant.validation.exchangeRequired":"Please select an exchange","trading-assistant.validation.apiKeyRequired":"Please enter API Key","trading-assistant.validation.secretKeyRequired":"Please enter Secret Key","trading-assistant.validation.passphraseRequired":"Please enter Passphrase","trading-assistant.validation.exchangeConfigIncomplete":"Please fill in complete exchange configuration information","trading-assistant.validation.testConnectionRequired":'Please click "Test Connection" button and ensure the connection is successful',"trading-assistant.validation.testConnectionFailed":"Connection test failed, please check the configuration and test again","trading-assistant.validation.credentialRequired":"Please add and test exchange credentials in Personal Center first","trading-assistant.validation.strategyNameRequired":"Please enter strategy name","trading-assistant.validation.symbolRequired":"Please select trading pair","trading-assistant.validation.symbolsRequired":"Please select at least one trading pair","trading-assistant.validation.initialCapitalRequired":"Please enter initial capital","trading-assistant.validation.leverageRequired":"Please enter leverage","trading-assistant.validation.emailInvalid":"Invalid email address","trading-assistant.validation.notifyChannelRequired":"Please select at least one notification channel","trading-assistant.table.time":"Time","trading-assistant.table.type":"Type","trading-assistant.table.price":"Price","trading-assistant.table.amount":"Amount","trading-assistant.table.value":"Value","trading-assistant.table.commission":"Commission","trading-assistant.table.symbol":"Trading Pair","trading-assistant.table.side":"Side","trading-assistant.table.size":"Position Size","trading-assistant.table.entryPrice":"Entry Price","trading-assistant.table.currentPrice":"Current Price","trading-assistant.table.unrealizedPnl":"Unrealized P&L","trading-assistant.table.pnlPercent":"P&L %","trading-assistant.table.buy":"Buy","trading-assistant.table.sell":"Sell","trading-assistant.table.long":"Long","trading-assistant.table.short":"Short","trading-assistant.table.noPositions":"No positions","trading-assistant.detail.title":"Strategy Details","trading-assistant.detail.strategyName":"Strategy Name","trading-assistant.detail.strategyType":"Strategy Type","trading-assistant.detail.status":"Status","trading-assistant.detail.tradingMode":"Trading Mode","trading-assistant.detail.exchange":"Exchange","trading-assistant.detail.initialCapital":"Initial Capital","trading-assistant.detail.totalInvestment":"Total Investment","trading-assistant.detail.currentEquity":"Current Equity","trading-assistant.detail.totalPnl":"Total P&L","trading-assistant.detail.indicatorName":"Indicator Name","trading-assistant.detail.maxLeverage":"Max Leverage","trading-assistant.detail.decideInterval":"Decision Interval","trading-assistant.detail.symbols":"Trading Symbols","trading-assistant.detail.createdAt":"Created At","trading-assistant.detail.updatedAt":"Updated At","trading-assistant.detail.llmConfig":"AI Model Configuration","trading-assistant.detail.exchangeConfig":"Exchange Configuration","trading-assistant.detail.provider":"Provider","trading-assistant.detail.modelId":"Model ID","trading-assistant.detail.close":"Close","trading-assistant.detail.loadFailed":"Failed to load strategy details","trading-assistant.equity.noData":"No equity data","trading-assistant.equity.equity":"Equity","trading-assistant.exchange.tradingMode":"Trading Mode","trading-assistant.exchange.virtual":"Virtual Trading","trading-assistant.exchange.live":"Live Trading","trading-assistant.exchange.selectExchange":"Select Exchange","trading-assistant.exchange.walletAddress":"Wallet Address","trading-assistant.exchange.walletAddressPlaceholder":"Please enter wallet address (starts with 0x)","trading-assistant.exchange.privateKey":"Private Key","trading-assistant.exchange.privateKeyPlaceholder":"Please enter private key (64 characters)","trading-assistant.exchange.testConnection":"Test Connection","trading-assistant.exchange.connectionSuccess":"Connection successful","trading-assistant.exchange.connectionFailed":"Connection failed","trading-assistant.exchange.testFailed":"Connection test failed","trading-assistant.exchange.fillComplete":"Please fill in complete exchange configuration information","trading-assistant.exchange.ipWhitelistTip":"Please add the following IPs to the whitelist in your exchange API settings:","trading-assistant.strategyTypeOptions.ai":"AI-Driven Strategy","trading-assistant.strategyTypeOptions.indicator":"Indicator Strategy","trading-assistant.strategyTypeOptions.aiDeveloping":"AI-Driven Strategy feature is under development, stay tuned","trading-assistant.strategyTypeOptions.aiDevelopingWarning":"AI-Driven Strategy feature is under development","trading-assistant.indicatorType.trend":"Trend","trading-assistant.indicatorType.momentum":"Momentum","trading-assistant.indicatorType.volatility":"Volatility","trading-assistant.indicatorType.volume":"Volume","trading-assistant.indicatorType.custom":"Custom","trading-assistant.exchangeNames":{okx:"OKX",binance:"Binance",hyperliquid:"Hyperliquid",blockchaincom:"Blockchain.com",coinbaseexchange:"Coinbase",gate:"Gate.io",mexc:"MEXC",kraken:"Kraken",bitfinex:"Bitfinex",bybit:"Bybit",kucoin:"KuCoin",huobi:"Huobi",bitget:"Bitget",bitmex:"BitMEX",deribit:"Deribit",phemex:"Phemex",bitmart:"BitMart",bitstamp:"Bitstamp",bittrex:"Bittrex",poloniex:"Poloniex",gemini:"Gemini",cryptocom:"Crypto.com",bitflyer:"bitFlyer",upbit:"Upbit",bithumb:"Bithumb",coinone:"Coinone",zb:"ZB",lbank:"LBank",bibox:"Bibox",bigone:"BigONE",bitrue:"Bitrue",coinex:"CoinEx",digifinex:"DigiFinex",ftx:"FTX",ftxus:"FTX US",binanceus:"Binance US",binancecoinm:"Binance COIN-M",binanceusdm:"Binance USDⓈ-M",ibkr:"Interactive Brokers (IBKR)",deepcoin:"Deepcoin"},"ai-trading-assistant.title":"AI Trading Assistant","ai-trading-assistant.strategyList":"Strategy List","ai-trading-assistant.createStrategy":"Create Strategy","ai-trading-assistant.noStrategy":"No strategies","ai-trading-assistant.selectStrategy":"Please select a strategy from the left to view details","ai-trading-assistant.startStrategy":"Start Strategy","ai-trading-assistant.stopStrategy":"Stop Strategy","ai-trading-assistant.editStrategy":"Edit Strategy","ai-trading-assistant.deleteStrategy":"Delete Strategy","ai-trading-assistant.status.running":"Running","ai-trading-assistant.status.stopped":"Stopped","ai-trading-assistant.status.error":"Error","ai-trading-assistant.tabs.tradingRecords":"Trading Records","ai-trading-assistant.tabs.positions":"Positions","ai-trading-assistant.tabs.aiDecisions":"AI Decisions","ai-trading-assistant.tabs.equityCurve":"Equity Curve","ai-trading-assistant.form.createTitle":"Create AI Trading Strategy","ai-trading-assistant.form.editTitle":"Edit AI Trading Strategy","ai-trading-assistant.form.strategyName":"Strategy Name","ai-trading-assistant.form.modelId":"AI Model","ai-trading-assistant.form.modelIdHint":"Using system OpenRouter service, no API Key configuration needed","ai-trading-assistant.form.decideInterval":"Decision Interval","ai-trading-assistant.form.decideInterval5m":"5 Minutes","ai-trading-assistant.form.decideInterval10m":"10 Minutes","ai-trading-assistant.form.decideInterval30m":"30 Minutes","ai-trading-assistant.form.decideInterval1h":"1 Hour","ai-trading-assistant.form.decideInterval4h":"4 Hours","ai-trading-assistant.form.decideInterval1d":"1 Day","ai-trading-assistant.form.decideInterval1w":"1 Week","ai-trading-assistant.form.decideIntervalHint":"Time interval for AI decision making","ai-trading-assistant.form.runPeriod":"Run Period","ai-trading-assistant.form.runPeriodHint":"Start and end time for strategy execution","ai-trading-assistant.form.startDate":"Start Date","ai-trading-assistant.form.endDate":"End Date","ai-trading-assistant.form.qdtCostTitle":"QDT Cost Notice","ai-trading-assistant.form.qdtCostHint":"Each AI decision will cost {cost} QDT. Please ensure your account has sufficient QDT balance. During strategy execution, each decision will be charged in real-time.","ai-trading-assistant.form.apiKey":"API Key","ai-trading-assistant.form.exchange":"Select Exchange","ai-trading-assistant.form.secretKey":"Secret Key","ai-trading-assistant.form.passphrase":"Passphrase","ai-trading-assistant.form.testConnection":"Test Connection","ai-trading-assistant.form.symbol":"Trading Pair","ai-trading-assistant.form.symbolHint":"Select the trading pair to trade","ai-trading-assistant.form.initialCapital":"Initial Capital (Margin)","ai-trading-assistant.form.leverage":"Leverage","ai-trading-assistant.form.timeframe":"Timeframe","ai-trading-assistant.form.timeframe1m":"1 Minute","ai-trading-assistant.form.timeframe5m":"5 Minutes","ai-trading-assistant.form.timeframe15m":"15 Minutes","ai-trading-assistant.form.timeframe30m":"30 Minutes","ai-trading-assistant.form.timeframe1H":"1 Hour","ai-trading-assistant.form.timeframe4H":"4 Hours","ai-trading-assistant.form.timeframe1D":"1 Day","ai-trading-assistant.form.marketType":"Market Type","ai-trading-assistant.form.marketTypeFutures":"Futures","ai-trading-assistant.form.marketTypeSpot":"Spot","ai-trading-assistant.form.totalPnl":"Total PnL","ai-trading-assistant.form.customPrompt":"Custom Prompt","ai-trading-assistant.form.customPromptHint":"Optional, used to customize AI trading strategy and decision logic","ai-trading-assistant.form.cancel":"Cancel","ai-trading-assistant.form.prev":"Previous","ai-trading-assistant.form.next":"Next","ai-trading-assistant.form.confirmCreate":"Confirm Create","ai-trading-assistant.form.confirmEdit":"Confirm Edit","ai-trading-assistant.messages.createSuccess":"Strategy created successfully","ai-trading-assistant.messages.createFailed":"Failed to create strategy","ai-trading-assistant.messages.updateSuccess":"Strategy updated successfully","ai-trading-assistant.messages.updateFailed":"Failed to update strategy","ai-trading-assistant.messages.deleteSuccess":"Strategy deleted successfully","ai-trading-assistant.messages.deleteFailed":"Failed to delete strategy","ai-trading-assistant.messages.startSuccess":"Strategy started successfully","ai-trading-assistant.messages.startFailed":"Failed to start strategy","ai-trading-assistant.messages.stopSuccess":"Strategy stopped successfully","ai-trading-assistant.messages.stopFailed":"Failed to stop strategy","ai-trading-assistant.messages.loadFailed":"Failed to load strategy list","ai-trading-assistant.messages.loadDecisionsFailed":"Failed to load AI decision records","ai-trading-assistant.messages.deleteConfirm":"Are you sure you want to delete this strategy? This action cannot be undone.","ai-trading-assistant.placeholders.inputStrategyName":"Please enter strategy name","ai-trading-assistant.placeholders.selectModelId":"Please select AI model","ai-trading-assistant.placeholders.selectDecideInterval":"Please select decision interval","ai-trading-assistant.placeholders.startTime":"Start Time","ai-trading-assistant.placeholders.endTime":"End Time","ai-trading-assistant.placeholders.inputApiKey":"Please enter API Key","ai-trading-assistant.placeholders.selectExchange":"Please select an exchange","ai-trading-assistant.placeholders.inputSecretKey":"Please enter Secret Key","ai-trading-assistant.placeholders.inputPassphrase":"Please enter Passphrase","ai-trading-assistant.placeholders.selectSymbol":"Please select trading pair, e.g.: BTC/USDT","ai-trading-assistant.placeholders.selectTimeframe":"Please select timeframe","ai-trading-assistant.placeholders.inputCustomPrompt":"Please enter custom prompt (optional)","ai-trading-assistant.validation.strategyNameRequired":"Please enter strategy name","ai-trading-assistant.validation.modelIdRequired":"Please select AI model","ai-trading-assistant.validation.runPeriodRequired":"Please select run period","ai-trading-assistant.validation.apiKeyRequired":"Please enter API Key","ai-trading-assistant.validation.exchangeRequired":"Please select an exchange","ai-trading-assistant.validation.secretKeyRequired":"Please enter Secret Key","ai-trading-assistant.validation.symbolRequired":"Please select trading pair","ai-trading-assistant.validation.initialCapitalRequired":"Please enter initial capital","ai-trading-assistant.table.time":"Time","ai-trading-assistant.table.type":"Type","ai-trading-assistant.table.price":"Price","ai-trading-assistant.table.amount":"Amount","ai-trading-assistant.table.value":"Value","ai-trading-assistant.table.symbol":"Trading Pair","ai-trading-assistant.table.side":"Side","ai-trading-assistant.table.size":"Position Size","ai-trading-assistant.table.entryPrice":"Entry Price","ai-trading-assistant.table.currentPrice":"Current Price","ai-trading-assistant.table.unrealizedPnl":"Unrealized P&L","ai-trading-assistant.table.profit":"Profit","ai-trading-assistant.table.openLong":"Open Long","ai-trading-assistant.table.closeLong":"Close Long","ai-trading-assistant.table.openShort":"Open Short","ai-trading-assistant.table.closeShort":"Close Short","ai-trading-assistant.table.addLong":"Add Long","ai-trading-assistant.table.addShort":"Add Short","ai-trading-assistant.table.closeShortProfit":"Close Short (TP)","ai-trading-assistant.table.closeShortStop":"Close Short (SL)","ai-trading-assistant.table.closeLongProfit":"Close Long (TP)","ai-trading-assistant.table.closeLongStop":"Close Long (SL)","ai-trading-assistant.table.buy":"Buy","ai-trading-assistant.table.sell":"Sell","ai-trading-assistant.table.long":"Long","ai-trading-assistant.table.short":"Short","ai-trading-assistant.table.hold":"Hold","ai-trading-assistant.table.reasoning":"Analysis Reasoning","ai-trading-assistant.table.decisions":"Decisions","ai-trading-assistant.table.riskAssessment":"Risk","ai-trading-assistant.table.confidence":"Confidence","ai-trading-assistant.table.totalRecords":"Total {total} records","ai-trading-assistant.table.noPositions":"No positions","ai-trading-assistant.detail.title":"Strategy Details","ai-trading-assistant.equity.noData":"No equity data","ai-trading-assistant.equity.equity":"Equity","ai-trading-assistant.exchange.testFailed":"Connection test failed","ai-trading-assistant.exchange.connectionSuccess":"Connection successful","ai-trading-assistant.exchange.connectionFailed":"Connection failed","ai-trading-assistant.form.advancedSettings":"Advanced Settings","ai-trading-assistant.form.orderMode":"Order Mode","ai-trading-assistant.form.orderModeMaker":"Maker (Limit)","ai-trading-assistant.form.orderModeTaker":"Taker (Market)","ai-trading-assistant.form.orderModeHint":"Maker mode uses limit orders with lower fees; Taker mode executes immediately with higher fees","ai-trading-assistant.form.makerWaitSec":"Maker Wait Time (seconds)","ai-trading-assistant.form.makerWaitSecHint":"Time to wait for order fill before canceling and retrying","ai-trading-assistant.form.makerRetries":"Maker Retries","ai-trading-assistant.form.makerRetriesHint":"Maximum number of retries when maker order is not filled","ai-trading-assistant.form.fallbackToMarket":"Fallback to Market on failure","ai-trading-assistant.form.fallbackToMarketHint":"If limit order (open/close) is not filled, downgrade to market order to ensure execution","ai-trading-assistant.form.marginMode":"Margin Mode","ai-trading-assistant.form.marginModeCross":"Cross Margin","ai-trading-assistant.form.marginModeIsolated":"Isolated Margin","ai-analysis.title":"Quantum Trading Engine","ai-analysis.system.online":"ONLINE","ai-analysis.system.agents":"AGENTS","ai-analysis.system.active":"ACTIVE","ai-analysis.system.stage":"STAGE","ai-analysis.panel.roster":"AGENTS ROSTER","ai-analysis.panel.thinking":"Thinking...","ai-analysis.panel.done":"Done","ai-analysis.panel.standby":"Standby","ai-analysis.input.title":"QUANTUM TRADING ENGINE","ai-analysis.input.placeholder":"SELECT TARGET ASSET (e.g. BTC/USDT)","ai-analysis.input.watchlist":"Watchlist","ai-analysis.input.start":"START ANALYSIS","ai-analysis.input.recent":"RECENT MISSIONS:","ai-analysis.vis.stage":"STAGE","ai-analysis.vis.processing":"PROCESSING","ai-analysis.result.complete":"ANALYSIS COMPLETE","ai-analysis.result.signal":"FINAL SIGNAL","ai-analysis.result.confidence":"CONFIDENCE:","ai-analysis.result.new":"NEW ANALYSIS","ai-analysis.result.full":"VIEW FULL DOSSIER","ai-analysis.logs.title":"SYSTEM LOGS","ai-analysis.modal.title":"CLASSIFIED REPORT","ai-analysis.modal.fundamental":"FUNDAMENTAL ANALYSIS","ai-analysis.modal.technical":"TECHNICAL ANALYSIS","ai-analysis.modal.sentiment":"SENTIMENT ANALYSIS","ai-analysis.modal.risk":"RISK ASSESSMENT","ai-analysis.stage.idle":"IDLE","ai-analysis.stage.1":"PHASE 1: MULTI-DIMENSIONAL ANALYSIS","ai-analysis.stage.2":"PHASE 2: BULL/BEAR DEBATE","ai-analysis.stage.3":"PHASE 3: STRATEGIC PLANNING","ai-analysis.stage.4":"PHASE 4: RISK COMMITTEE REVIEW","ai-analysis.stage.complete":"COMPLETE","ai-analysis.agent.investment_director":"Investment Director","ai-analysis.agent.role.investment_director":"Comprehensive Analysis & Final Conclusion","ai-analysis.agent.market":"Market Analyst","ai-analysis.agent.role.market":"Technical & Market Data","ai-analysis.agent.fundamental":"Fundamental Analyst","ai-analysis.agent.role.fundamental":"Financials & Valuation","ai-analysis.agent.technical":"Technical Analyst","ai-analysis.agent.role.technical":"Technical Indicators & Charts","ai-analysis.agent.news":"News Analyst","ai-analysis.agent.role.news":"Global News Filter","ai-analysis.agent.sentiment":"Sentiment Analyst","ai-analysis.agent.role.sentiment":"Social & Emotional","ai-analysis.agent.risk":"Risk Analyst","ai-analysis.agent.role.risk":"Basic Risk Check","ai-analysis.agent.bull":"Bull Researcher","ai-analysis.agent.role.bull":"Growth Catalyst Hunter","ai-analysis.agent.bear":"Bear Researcher","ai-analysis.agent.role.bear":"Risk & Flaw Hunter","ai-analysis.agent.manager":"Research Manager","ai-analysis.agent.role.manager":"Debate Moderator","ai-analysis.agent.trader":"Trader Agent","ai-analysis.agent.role.trader":"Execution Strategist","ai-analysis.agent.risky":"Risky Analyst","ai-analysis.agent.role.risky":"Aggressive Strategy","ai-analysis.agent.neutral":"Neutral Analyst","ai-analysis.agent.role.neutral":"Balanced Strategy","ai-analysis.agent.safe":"Safe Analyst","ai-analysis.agent.role.safe":"Conservative Strategy","ai-analysis.agent.cro":"Risk Manager (CRO)","ai-analysis.agent.role.cro":"Final Decision Authority","ai-analysis.script.market":"Fetching OHLCV data from major exchanges...","ai-analysis.script.fundamental":"Retrieving quarterly financial reports...","ai-analysis.script.technical":"Analyzing technical indicators and chart patterns...","ai-analysis.script.news":"Scanning global financial news feeds...","ai-analysis.script.sentiment":"Analyzing social media trends...","ai-analysis.script.risk":"Calculating historical volatility...","invite.inviteLink":"Invite Link","invite.copy":"Copy Link","invite.copySuccess":"Copied successfully!","invite.copyFailed":"Copy failed, please copy manually","invite.noInviteLink":"Invite link not generated","invite.totalInvites":"Total Invites","invite.totalReward":"Total Reward","invite.rules":"Invite Rules","invite.rule1":"You will receive a reward for each friend you successfully invite to register","invite.rule2":"When your invited friend completes their first transaction, you will receive an additional reward","invite.rule3":"Invite rewards will be directly credited to your account","invite.inviteList":"Invite List","invite.tasks":"Task Center","invite.inviteeName":"Invitee","invite.inviteTime":"Invite Time","invite.status":"Status","invite.reward":"Reward","invite.active":"Active","invite.inactive":"Inactive","invite.completed":"Completed","invite.claimed":"Claimed","invite.pending":"Pending","invite.goToTask":"Go to Task","invite.claimReward":"Claim Reward","invite.verify":"Verify","invite.verifySuccess":"Verification successful! Task completed","invite.verifyNotCompleted":"Task not completed yet, please complete the task first","invite.verifyFailed":"Verification failed, please try again later","invite.claimSuccess":"Successfully claimed {reward} QDT!","invite.claimFailed":"Claim failed, please try again later","invite.totalRecords":"Total {total} records","invite.task.twitter.title":"Share Tweet on X (Twitter)","invite.task.twitter.desc":"Share our official tweet to your X (Twitter) account","invite.task.youtube.title":"Follow our YouTube Channel","invite.task.youtube.desc":"Subscribe and follow our official YouTube channel","invite.task.telegram.title":"Join Telegram Group","invite.task.telegram.desc":"Join our official Telegram community group","invite.task.discord.title":"Join Discord Server","invite.task.discord.desc":"Join our Discord community server",message:"-","layouts.usermenu.dialog.title":"Message","layouts.usermenu.dialog.content":"Are you sure you would like to logout?","layouts.userLayout.title":"Clarity from Uncertainty","signal-robot.title":"Signal Robot Console","signal-robot.createBot":"Create New Bot","signal-robot.search.nameOrSymbol":"Name/Symbol","signal-robot.search.placeholder":"Search bot name or symbol","signal-robot.search.status":"Status","signal-robot.search.statusAll":"All","signal-robot.search.statusRunning":"Running","signal-robot.search.statusPaused":"Paused","signal-robot.search.query":"Query","signal-robot.search.reset":"Reset","signal-robot.table.botName":"Bot Name","signal-robot.table.symbolTimeframe":"Symbol/Timeframe","signal-robot.table.triggerStrategy":"Trigger Strategy","signal-robot.table.notificationChannels":"Notification Channels","signal-robot.table.status":"Status","signal-robot.table.action":"Action","signal-robot.table.triggerConditions":"{count} trigger conditions","signal-robot.table.monitoring":"Monitoring","signal-robot.table.paused":"Paused","signal-robot.table.edit":"Edit","signal-robot.table.pause":"Pause","signal-robot.table.start":"Start","signal-robot.table.delete":"Delete","signal-robot.table.deleteConfirm":"Are you sure you want to delete this bot?","signal-robot.table.deleteSuccess":"Deleted successfully","signal-robot.table.startSuccess":"Bot started","signal-robot.table.pauseSuccess":"Bot paused","signal-robot.channel.telegram":"Telegram","signal-robot.channel.discord":"Discord","signal-robot.channel.email":"Email","signal-robot.channel.webhook":"Webhook","signal-robot.channel.browser":"Browser Push","signal-robot.modal.createTitle":"Create New Signal Robot","signal-robot.modal.editTitle":"Edit Signal Robot","signal-robot.modal.step.basic":"Basic Settings","signal-robot.modal.step.entry":"Entry Strategy","signal-robot.modal.step.position":"Position Management","signal-robot.modal.step.risk":"Risk Control","signal-robot.modal.step.notify":"Notification Config","signal-robot.modal.prev":"Previous","signal-robot.modal.next":"Next","signal-robot.modal.preview":"Preview Backtest","signal-robot.modal.complete":"Complete & Run","signal-robot.modal.saveSuccess":"Saved successfully","signal-robot.modal.previewDeveloping":"Preview feature is under development...","signal-robot.modal.basicInfoRequired":"Please complete basic information","signal-robot.basic.alert":"Set basic information for the bot","signal-robot.basic.title":"Basic Information","signal-robot.basic.botName":"Bot Name","signal-robot.basic.botNamePlaceholder":"e.g.: BTC SuperTrend Strategy","signal-robot.basic.symbol":"Trading Pair","signal-robot.basic.symbolPlaceholder":"Select from watchlist","signal-robot.basic.noWatchlist":"No watchlist items, please add in market page first","signal-robot.basic.timeframe":"K-Line Period","signal-robot.basic.timeframe15m":"15 Minutes","signal-robot.basic.timeframe30m":"30 Minutes","signal-robot.basic.timeframe1h":"1 Hour","signal-robot.basic.timeframe4h":"4 Hours","signal-robot.basic.timeframe1d":"1 Day","signal-robot.basic.autoNameSuggestion":"{symbol} Signal Robot","signal-robot.entry.alert":"Trigger entry signal when all conditions below are met","signal-robot.entry.condition":"Condition {index}","signal-robot.entry.indicator":"Indicator","signal-robot.entry.indicatorSupertrend":"SuperTrend","signal-robot.entry.indicatorEma":"EMA (Exponential Moving Average)","signal-robot.entry.indicatorRsi":"RSI (Relative Strength Index)","signal-robot.entry.indicatorMacd":"MACD","signal-robot.entry.indicatorBollinger":"Bollinger Bands","signal-robot.entry.atrPeriod":"ATR Period","signal-robot.entry.multiplier":"Multiplier","signal-robot.entry.triggerSignal":"Trigger Signal","signal-robot.entry.signalTrendBullish":"Trend Bullish","signal-robot.entry.signalTrendBearish":"Trend Bearish","signal-robot.entry.signalIsUptrend":"Is Uptrend","signal-robot.entry.signalIsDowntrend":"Is Downtrend","signal-robot.entry.period":"Period","signal-robot.entry.compareCondition":"Compare Condition","signal-robot.entry.priceAbove":"Price > EMA (Price Above)","signal-robot.entry.priceBelow":"Price < EMA (Price Below)","signal-robot.entry.crossUp":"Price Crosses Above EMA (Golden Cross)","signal-robot.entry.crossDown":"Price Crosses Below EMA (Death Cross)","signal-robot.entry.compare":"Compare","signal-robot.entry.greaterThan":"Greater Than","signal-robot.entry.lessThan":"Less Than","signal-robot.entry.crossUpShort":"Cross Up","signal-robot.entry.crossDownShort":"Cross Down","signal-robot.entry.threshold":"Threshold","signal-robot.entry.selectIndicator":"Please select an indicator to configure parameters","signal-robot.entry.addCondition":"Add Condition","signal-robot.position.alert":"Configure initial position size, leverage and pyramiding rules","signal-robot.position.basicTitle":"Basic Position Management","signal-robot.position.initialSize":"Initial Size (Capital %)","signal-robot.position.initialSizeHint":"Recommended 5% - 20%","signal-robot.position.leverage":"Leverage","signal-robot.position.leverageHint":"Please ensure your exchange account supports this leverage","signal-robot.position.maxPyramiding":"Max Pyramiding Times","signal-robot.position.maxPyramidingHint":"0 means no pyramiding","signal-robot.position.pyramidingTitle":"Pyramiding Rules","signal-robot.position.pyramidingEnabled":"Enabled","signal-robot.position.pyramidingDisabled":"Disabled","signal-robot.position.pyramidingCondition":"Pyramiding Trigger Condition","signal-robot.position.priceRisePct":"Price Rises (Long) / Falls (Short)","signal-robot.position.profitPct":"Profit Reaches","signal-robot.position.triggerThreshold":"Trigger Threshold (%)","signal-robot.position.triggerThresholdHint":"e.g. 3%: add position once every 3% rise","signal-robot.position.addSize":"Single Add Size (Capital %)","signal-robot.position.pyramidingDisabledHint":"Pyramiding disabled, only initial position will be executed","signal-robot.risk.alert":"Configure take profit, stop loss and exit rules","signal-robot.risk.stopLossTitle":"Stop Loss","signal-robot.risk.stopLossEnabled":"Enabled","signal-robot.risk.stopLossDisabled":"Disabled","signal-robot.risk.stopLossType":"Stop Loss Type","signal-robot.risk.stopLossFixedPct":"Fixed Percentage","signal-robot.risk.stopLossAtrMultiplier":"ATR Multiplier","signal-robot.risk.stopLossValue":"Value","signal-robot.risk.stopLossFixedHint":"e.g. 2%: stop loss when loss reaches 2%","signal-robot.risk.stopLossAtrHint":"e.g. 2.0: stop loss when price touches ATR*2.0","signal-robot.risk.stopLossDisabledHint":"Stop loss disabled (high risk)","signal-robot.risk.trailingStopTitle":"Trailing Stop","signal-robot.risk.activationProfit":"Activation Profit (%)","signal-robot.risk.activationProfitHint":"Start trailing when profit reaches this level","signal-robot.risk.callbackPct":"Callback (%)","signal-robot.risk.callbackPctHint":"Trigger take profit when price falls from peak by this percentage","signal-robot.risk.trailingStopDisabledHint":"Trailing stop disabled","signal-robot.risk.otherExitTitle":"Other Exit Rules","signal-robot.risk.signalExit":"Allow Signal Exit","signal-robot.risk.signalExitHint":"Close position immediately when reverse signal appears (e.g. close long when short signal appears)","signal-robot.notify.alert":"Configure notification methods when signal is triggered","signal-robot.notify.channelTitle":"Notification Channels","signal-robot.notify.discordWebhook":"Discord Webhook","signal-robot.notify.genericWebhook":"Generic Webhook","signal-robot.notify.webhookUrl":"Webhook URL","signal-robot.notify.webhookUrlPlaceholder":"https://example.com/webhook","signal-robot.notify.discordUrl":"Discord URL","signal-robot.notify.discordUrlPlaceholder":"https://discord.com/api/webhooks/...","signal-robot.operator.greaterThan":"Greater Than","signal-robot.operator.lessThan":"Less Than","signal-robot.operator.equal":"Equal","signal-robot.operator.goldenCross":"Golden Cross","signal-robot.operator.deathCross":"Death Cross","signal-robot.operator.increaseBy":"Increase By","signal-robot.operator.decreaseBy":"Decrease By","signal-robot.indicator.price":"Price","signal-robot.indicator.rsi":"RSI","signal-robot.indicator.kdjK":"KDJ(K)","signal-robot.indicator.kdjJ":"KDJ(J)","signal-robot.indicator.macd":"MACD","signal-robot.indicator.macdHist":"MACD Histogram","signal-robot.indicator.bollingerUp":"Bollinger Upper","signal-robot.indicator.bollingerLow":"Bollinger Lower","signal-robot.indicator.volume":"Volume","signal-robot.indicator.changePct1h":"1H Change %","signal-robot.indicator.changePct24h":"24H Change %","signal-robot.indicator.signalLine":"Signal Line","settings.title":"System Settings","settings.description":"Configure application settings, API keys, and system preferences","settings.save":"Save Settings","settings.reset":"Reset","settings.saveSuccess":"Settings saved successfully","settings.saveFailed":"Failed to save settings","settings.loadFailed":"Failed to load settings","settings.openrouterBalance":"OpenRouter Account Balance","settings.queryBalance":"Query Balance","settings.balanceUsage":"Used","settings.balanceRemaining":"Remaining","settings.balanceLimit":"Total Limit","settings.balanceQuerySuccess":"Balance query successful","settings.balanceQueryFailed":"Failed to query balance","settings.balanceNotQueried":'Click "Query Balance" to get account info',"settings.default":"Default","settings.pleaseSelect":"Please select","settings.inputApiKey":"Enter key","settings.getApi":"Get API","settings.link.getApi":"Get API","settings.link.getApiKey":"Get API Key","settings.link.getToken":"Get Token","settings.link.createBot":"Create Bot","settings.link.viewModels":"View Models","settings.link.freeRegister":"Free Register","settings.link.supportedExchanges":"Supported Exchanges","settings.link.applyApi":"Apply API","settings.link.createSearchEngine":"Create Search Engine","settings.link.getTurnstileKey":"Get Turnstile Key","settings.link.getGoogleCredentials":"Get Google Credentials","settings.link.getGithubCredentials":"Get GitHub Credentials","settings.restartRequired":"Settings saved. Some changes require Python service restart to take effect.","settings.copyRestartCmd":"Copy restart command","settings.copySuccess":"Copied","settings.copyFailed":"Copy failed","settings.group.server":"Server Configuration","settings.group.auth":"Security & Authentication","settings.group.ai":"AI / LLM Configuration","settings.group.trading":"Live Trading","settings.group.strategy":"Strategy Execution","settings.group.data_source":"Data Sources","settings.group.notification":"Notifications","settings.group.email":"Email (SMTP)","settings.group.sms":"SMS (Twilio)","settings.group.agent":"AI Agent","settings.group.network":"Network & Proxy","settings.group.search":"Web Search","settings.group.security":"Registration & Security","settings.group.app":"Application","settings.field.SECRET_KEY":"Secret Key","settings.field.ADMIN_USER":"Admin Username","settings.field.ADMIN_PASSWORD":"Admin Password","settings.field.ADMIN_EMAIL":"Admin Email","settings.field.ENABLE_REGISTRATION":"Enable Registration","settings.field.TURNSTILE_SITE_KEY":"Turnstile Site Key","settings.field.TURNSTILE_SECRET_KEY":"Turnstile Secret Key","settings.field.FRONTEND_URL":"Frontend URL","settings.field.GOOGLE_CLIENT_ID":"Google Client ID","settings.field.GOOGLE_CLIENT_SECRET":"Google Client Secret","settings.field.GOOGLE_REDIRECT_URI":"Google Redirect URI","settings.field.GITHUB_CLIENT_ID":"GitHub Client ID","settings.field.GITHUB_CLIENT_SECRET":"GitHub Client Secret","settings.field.GITHUB_REDIRECT_URI":"GitHub Redirect URI","settings.field.SECURITY_IP_MAX_ATTEMPTS":"IP Max Failed Attempts","settings.field.SECURITY_IP_WINDOW_MINUTES":"IP Window (minutes)","settings.field.SECURITY_IP_BLOCK_MINUTES":"IP Block Duration (minutes)","settings.field.SECURITY_ACCOUNT_MAX_ATTEMPTS":"Account Max Failed Attempts","settings.field.SECURITY_ACCOUNT_WINDOW_MINUTES":"Account Window (minutes)","settings.field.SECURITY_ACCOUNT_BLOCK_MINUTES":"Account Block Duration (minutes)","settings.field.VERIFICATION_CODE_EXPIRE_MINUTES":"Verification Code Expiry (minutes)","settings.field.VERIFICATION_CODE_RATE_LIMIT":"Code Rate Limit (seconds)","settings.field.VERIFICATION_CODE_IP_HOURLY_LIMIT":"Code Hourly Limit per IP","settings.field.VERIFICATION_CODE_MAX_ATTEMPTS":"Code Max Attempts","settings.field.VERIFICATION_CODE_LOCK_MINUTES":"Code Lock Minutes","settings.field.PYTHON_API_HOST":"Listen Address","settings.field.PYTHON_API_PORT":"Port","settings.field.PYTHON_API_DEBUG":"Debug Mode","settings.field.ENABLE_PENDING_ORDER_WORKER":"Enable Order Worker","settings.field.PENDING_ORDER_STALE_SEC":"Order Stale Timeout (sec)","settings.field.ORDER_MODE":"Order Mode","settings.field.MAKER_WAIT_SEC":"Limit Order Wait Time (sec)","settings.field.MAKER_OFFSET_BPS":"Limit Order Price Offset (bps)","settings.field.SIGNAL_WEBHOOK_URL":"Webhook URL","settings.field.SIGNAL_WEBHOOK_TOKEN":"Webhook Token","settings.field.SIGNAL_NOTIFY_TIMEOUT_SEC":"Notify Timeout (sec)","settings.field.TELEGRAM_BOT_TOKEN":"Telegram Bot Token","settings.field.SMTP_HOST":"SMTP Host","settings.field.SMTP_PORT":"SMTP Port","settings.field.SMTP_USER":"SMTP Username","settings.field.SMTP_PASSWORD":"SMTP Password","settings.field.SMTP_FROM":"From Address","settings.field.SMTP_USE_TLS":"Use TLS","settings.field.SMTP_USE_SSL":"Use SSL","settings.field.TWILIO_ACCOUNT_SID":"Account SID","settings.field.TWILIO_AUTH_TOKEN":"Auth Token","settings.field.TWILIO_FROM_NUMBER":"From Number","settings.field.DISABLE_RESTORE_RUNNING_STRATEGIES":"Disable Auto Restore","settings.field.STRATEGY_TICK_INTERVAL_SEC":"Tick Interval (sec)","settings.field.PRICE_CACHE_TTL_SEC":"Price Cache TTL (sec)","settings.field.PROXY_PORT":"Proxy Port","settings.field.PROXY_HOST":"Proxy Host","settings.field.PROXY_SCHEME":"Proxy Scheme","settings.field.PROXY_URL":"Full Proxy URL","settings.field.CORS_ORIGINS":"CORS Origins","settings.field.RATE_LIMIT":"Rate Limit (per min)","settings.field.ENABLE_CACHE":"Enable Cache","settings.field.ENABLE_REQUEST_LOG":"Enable Request Log","settings.field.ENABLE_AI_ANALYSIS":"Enable AI Analysis","settings.field.ENABLE_AGENT_MEMORY":"Enable Agent Memory","settings.field.AGENT_MEMORY_ENABLE_VECTOR":"Enable Vector Retrieval (Local)","settings.field.AGENT_MEMORY_EMBEDDING_DIM":"Embedding Dimension","settings.field.AGENT_MEMORY_TOP_K":"Top-K Retrieval Count","settings.field.AGENT_MEMORY_CANDIDATE_LIMIT":"Candidate Window Size","settings.field.AGENT_MEMORY_HALF_LIFE_DAYS":"Time Decay Half-life (days)","settings.field.AGENT_MEMORY_W_SIM":"Similarity Weight","settings.field.AGENT_MEMORY_W_RECENCY":"Recency Weight","settings.field.AGENT_MEMORY_W_RETURNS":"Returns Weight","settings.field.ENABLE_REFLECTION_WORKER":"Enable Auto Verification","settings.field.REFLECTION_WORKER_INTERVAL_SEC":"Verification Interval (sec)","settings.field.OPENROUTER_API_KEY":"OpenRouter API Key","settings.field.OPENROUTER_API_URL":"OpenRouter API URL","settings.field.OPENROUTER_MODEL":"Default Model","settings.field.OPENROUTER_TEMPERATURE":"Temperature","settings.field.OPENROUTER_MAX_TOKENS":"Max Tokens","settings.field.OPENROUTER_TIMEOUT":"Timeout (sec)","settings.field.OPENROUTER_CONNECT_TIMEOUT":"Connect Timeout (sec)","settings.field.AI_MODELS_JSON":"Models JSON","settings.field.MARKET_TYPES_JSON":"Market Types JSON","settings.field.TRADING_SUPPORTED_SYMBOLS_JSON":"Supported Symbols JSON","settings.field.DATA_SOURCE_TIMEOUT":"Timeout (sec)","settings.field.DATA_SOURCE_RETRY":"Retry Count","settings.field.DATA_SOURCE_RETRY_BACKOFF":"Retry Backoff (sec)","settings.field.FINNHUB_API_KEY":"Finnhub API Key","settings.field.FINNHUB_TIMEOUT":"Finnhub Timeout (sec)","settings.field.FINNHUB_RATE_LIMIT":"Finnhub Rate Limit","settings.field.CCXT_DEFAULT_EXCHANGE":"CCXT Default Exchange","settings.field.CCXT_TIMEOUT":"CCXT Timeout (ms)","settings.field.CCXT_PROXY":"CCXT Proxy","settings.field.YFINANCE_TIMEOUT":"YFinance Timeout (sec)","settings.field.TIINGO_API_KEY":"Tiingo API Key","settings.field.TIINGO_TIMEOUT":"Tiingo Timeout (sec)","settings.field.SEARCH_PROVIDER":"Search Provider","settings.field.SEARCH_MAX_RESULTS":"Max Results","settings.field.TAVILY_API_KEYS":"Tavily API Keys","settings.field.BOCHA_API_KEYS":"Bocha API Keys","settings.field.SERPAPI_KEYS":"SerpAPI Keys","settings.field.SEARCH_GOOGLE_API_KEY":"Google API Key","settings.field.SEARCH_GOOGLE_CX":"Google CX","settings.field.SEARCH_BING_API_KEY":"Bing API Key","settings.field.INTERNAL_API_KEY":"Internal API Key","settings.desc.SEARCH_PROVIDER":"Web search provider for AI research","settings.desc.TAVILY_API_KEYS":"Tavily Search API keys, comma-separated for rotation. Free 1000 requests/month","settings.desc.BOCHA_API_KEYS":"Bocha Search API keys, comma-separated for rotation","settings.desc.SERPAPI_KEYS":"SerpAPI keys for Google/Bing search, comma-separated for rotation","settings.desc.ORDER_MODE":"maker: Limit order first (lower fees), market: Market order (instant fill)","settings.desc.MAKER_WAIT_SEC":"Wait time for limit order fill before switching to market order","settings.desc.MAKER_OFFSET_BPS":"Price offset in basis points. Buy: price*(1-offset), Sell: price*(1+offset)","settings.desc.TIINGO_API_KEY":"Tiingo API key for Forex/Metals data (free tier does not support 1-minute data)","settings.desc.TIINGO_TIMEOUT":"Tiingo API request timeout","portfolio.summary.totalValue":"Total Value","portfolio.summary.totalCost":"Total Cost","portfolio.summary.totalPnl":"Total P&L","portfolio.summary.positionCount":"Positions","portfolio.summary.profitLossRatio":"Profit/Loss","portfolio.summary.today":"Today","portfolio.summary.todayPnl":"Today P&L","portfolio.summary.bestPerformer":"Best Performer","portfolio.summary.worstPerformer":"Worst Performer","portfolio.summary.priceSync":"Price Sync","portfolio.summary.syncInterval":"Refresh","portfolio.summary.justNow":"Just now","portfolio.summary.ago":" ago","portfolio.positions.title":"My Positions","portfolio.positions.add":"Add Position","portfolio.positions.addFirst":"Add Your First Position","portfolio.positions.empty":"No positions yet","portfolio.positions.deleteConfirm":"Are you sure to delete this position?","portfolio.positions.currentPrice":"Current","portfolio.positions.entryPrice":"Entry","portfolio.positions.quantity":"Quantity","portfolio.positions.side":"Side","portfolio.positions.long":"Long","portfolio.positions.short":"Short","portfolio.positions.marketValue":"Value","portfolio.positions.pnl":"P&L","portfolio.positions.items":"positions","portfolio.monitors.title":"AI Monitors","portfolio.monitors.add":"Add Monitor","portfolio.monitors.addFirst":"Add AI Monitor","portfolio.monitors.empty":"No monitors yet","portfolio.monitors.deleteConfirm":"Are you sure to delete this monitor?","portfolio.monitors.interval":"Interval","portfolio.monitors.lastRun":"Last Run","portfolio.monitors.nextRun":"Next Run","portfolio.monitors.channels":"Channels","portfolio.monitors.runNow":"Run Now","portfolio.monitors.analysisResult":"AI Analysis Result","portfolio.monitors.runningTitle":"AI Analysis Started","portfolio.monitors.runningDesc":"Analysis is running in background. Results will be pushed via notification. Analyzing multiple positions may take a few minutes.","portfolio.monitors.timeoutTitle":"Request Timeout","portfolio.monitors.timeoutDesc":"Analysis may still be running in background. Please check notifications for results later. If no notification is received, please try again.","portfolio.modal.addPosition":"Add Position","portfolio.modal.editPosition":"Edit Position","portfolio.modal.addMonitor":"Add Monitor","portfolio.modal.editMonitor":"Edit Monitor","portfolio.form.market":"Market","portfolio.form.marketRequired":"Please select a market","portfolio.form.selectMarket":"Select Market","portfolio.form.symbol":"Symbol","portfolio.form.symbolRequired":"Please enter symbol","portfolio.form.searchSymbol":"Search or enter symbol","portfolio.form.useAsSymbol":"Use","portfolio.form.asSymbolCode":"as symbol code","portfolio.form.symbolHint":"Search symbols or enter any code directly","portfolio.form.side":"Side","portfolio.form.quantity":"Quantity","portfolio.form.quantityRequired":"Please enter quantity","portfolio.form.enterQuantity":"Enter quantity","portfolio.form.entryPrice":"Entry Price","portfolio.form.entryPriceRequired":"Please enter entry price","portfolio.form.enterEntryPrice":"Enter entry price","portfolio.form.notes":"Notes","portfolio.form.enterNotes":"Optional: Add notes","portfolio.form.monitorName":"Monitor Name","portfolio.form.monitorNameRequired":"Please enter monitor name","portfolio.form.enterMonitorName":"e.g. Daily Portfolio Analysis","portfolio.form.interval":"Interval","portfolio.form.minutes":"minutes","portfolio.form.hour":"hour","portfolio.form.hours":"hours","portfolio.form.notifyChannels":"Notify Channels","portfolio.form.browser":"Browser","portfolio.form.email":"Email","portfolio.form.telegramChatId":"Telegram Chat ID","portfolio.form.enterTelegramChatId":"Enter Telegram Chat ID","portfolio.form.telegramRequired":"Please enter Telegram Chat ID","portfolio.form.emailAddress":"Email Address","portfolio.form.enterEmail":"Enter email address","portfolio.form.emailRequired":"Please enter email address","portfolio.form.emailInvalid":"Please enter a valid email address","portfolio.form.customPrompt":"Custom Prompt","portfolio.form.customPromptPlaceholder":'Optional: Add focus areas, e.g. "Focus on tech stock risks"',"portfolio.form.monitorScope":"Monitor Scope","portfolio.form.allPositions":"All Positions","portfolio.form.selectedPositions":"Selected Positions","portfolio.form.selectPositions":"Select Positions","portfolio.form.selectAll":"Select All","portfolio.form.deselectAll":"Deselect All","portfolio.form.selectedCount":"{count} of {total} selected","portfolio.form.pleaseSelectPositions":"Please select at least one position to monitor","portfolio.form.notificationFromProfile":"Notifications will be sent to addresses configured in your profile","portfolio.form.goToProfile":"Go to settings","portfolio.message.loadFailed":"Failed to load data","portfolio.message.saveSuccess":"Saved successfully","portfolio.message.saveFailed":"Failed to save","portfolio.message.deleteSuccess":"Deleted successfully","portfolio.message.deleteFailed":"Failed to delete","portfolio.message.updateFailed":"Failed to update","portfolio.message.monitorEnabled":"Monitor enabled","portfolio.message.monitorDisabled":"Monitor paused","portfolio.message.monitorRunSuccess":"Analysis completed","portfolio.message.monitorRunFailed":"Analysis failed","portfolio.message.monitorRunning":"AI analysis started, please wait for notification","portfolio.groups.all":"All Positions","portfolio.groups.ungrouped":"Ungrouped","portfolio.form.group":"Group","portfolio.form.enterGroup":"Enter or select group","portfolio.alerts.title":"Price/PnL Alerts","portfolio.alerts.addAlert":"Add Alert","portfolio.alerts.editAlert":"Edit Alert","portfolio.alerts.alertType":"Alert Type","portfolio.alerts.priceAbove":"Price Above","portfolio.alerts.priceBelow":"Price Below","portfolio.alerts.pnlAbove":"Profit Above (%)","portfolio.alerts.pnlBelow":"Loss Below (%)","portfolio.alerts.threshold":"Threshold","portfolio.alerts.thresholdRequired":"Please enter threshold","portfolio.alerts.enterPrice":"Enter price","portfolio.alerts.enterPercent":"Enter percentage","portfolio.alerts.currentPrice":"Current Price","portfolio.alerts.currentPriceHint":"Current price","portfolio.alerts.repeatInterval":"Repeat Alert","portfolio.alerts.noRepeat":"No repeat (trigger once)","portfolio.alerts.every5min":"Every 5 minutes","portfolio.alerts.every15min":"Every 15 minutes","portfolio.alerts.every30min":"Every 30 minutes","portfolio.alerts.every1hour":"Every 1 hour","portfolio.alerts.every4hours":"Every 4 hours","portfolio.alerts.onceDaily":"Once daily","portfolio.alerts.enabled":"Enable Alert","portfolio.alerts.enabledDesc":"Auto-monitor and trigger notifications","portfolio.alerts.delete":"Delete","portfolio.alerts.deleteConfirm":"Are you sure you want to delete this alert?","portfolio.modal.addAlert":"Add Alert","portfolio.modal.editAlert":"Edit Alert","menu.userManage":"User Management","menu.myProfile":"My Profile","common.actions":"Actions","common.refresh":"Refresh","userManage.title":"User Management","userManage.searchPlaceholder":"Search by username/email/nickname","userManage.description":"Manage system users, roles and permissions","userManage.createUser":"Create User","userManage.editUser":"Edit User","userManage.username":"Username","userManage.password":"Password","userManage.nickname":"Nickname","userManage.email":"Email","userManage.role":"Role","userManage.status":"Status","userManage.lastLogin":"Last Login","userManage.active":"Active","userManage.disabled":"Disabled","userManage.neverLogin":"Never","userManage.usernameRequired":"Please enter username","userManage.usernamePlaceholder":"Enter username","userManage.passwordRequired":"Please enter password","userManage.passwordPlaceholder":"Enter password (min 6 chars)","userManage.passwordMin":"Password must be at least 6 characters","userManage.nicknamePlaceholder":"Enter nickname","userManage.emailPlaceholder":"Enter email","userManage.emailInvalid":"Invalid email format","userManage.rolePlaceholder":"Select role","userManage.statusPlaceholder":"Select status","userManage.resetPassword":"Reset Password","userManage.resetPasswordWarning":"This will reset the user's password","userManage.newPassword":"New Password","userManage.newPasswordPlaceholder":"Enter new password","userManage.confirmDelete":"Are you sure to delete this user?","userManage.roleAdmin":"Admin","userManage.roleManager":"Manager","userManage.roleUser":"User","userManage.roleViewer":"Viewer","profile.title":"My Profile","profile.description":"Manage your account settings and preferences","profile.basicInfo":"Basic Info","profile.changePassword":"Change Password","profile.username":"Username","profile.nickname":"Nickname","profile.email":"Email","profile.lastLogin":"Last Login","profile.nicknamePlaceholder":"Enter your nickname","profile.emailPlaceholder":"Enter your email","profile.emailInvalid":"Invalid email format","profile.emailCannotChange":"Email cannot be changed after registration","profile.passwordHint":"Password must be at least 6 characters","profile.oldPassword":"Current Password","profile.newPassword":"New Password","profile.confirmPassword":"Confirm Password","profile.oldPasswordRequired":"Please enter current password","profile.oldPasswordPlaceholder":"Enter current password","profile.newPasswordRequired":"Please enter new password","profile.newPasswordPlaceholder":"Enter new password","profile.confirmPasswordRequired":"Please confirm password","profile.confirmPasswordPlaceholder":"Confirm new password","profile.passwordMin":"Password must be at least 6 characters","profile.passwordMismatch":"Passwords do not match","profile.credits.title":"My Credits","profile.credits.unit":"Credits","profile.credits.recharge":"Top Up","profile.credits.vipExpires":"VIP expires on","profile.credits.vipExpired":"VIP expired","profile.credits.noVip":"Not a VIP","profile.credits.hint":"AI analysis/backtest/monitoring will consume credits; VIP only makes VIP-free indicators free to use.","profile.creditsLog":"Credits History","profile.creditsLog.time":"Time","profile.creditsLog.action":"Type","profile.creditsLog.amount":"Change","profile.creditsLog.balance":"Balance","profile.creditsLog.remark":"Remark","profile.creditsLog.actionConsume":"Consume","profile.creditsLog.actionRecharge":"Recharge","profile.creditsLog.actionAdjust":"Adjust","profile.creditsLog.actionRefund":"Refund","profile.creditsLog.actionVipGrant":"VIP Grant","profile.creditsLog.actionVipRevoke":"VIP Revoke","profile.creditsLog.actionRegisterBonus":"Register Bonus","profile.creditsLog.actionReferralBonus":"Referral Bonus","profile.creditsLog.actionIndicatorPurchase":"Indicator Purchase","profile.creditsLog.actionIndicatorSale":"Indicator Sale","profile.referral.title":"Invite Friends","profile.referral.listTab":"Referrals","profile.referral.totalInvited":"Invited","profile.referral.bonusPerInvite":"Per Invite","profile.referral.yourLink":"Your Referral Link","profile.referral.copyLink":"Copy Link","profile.referral.linkCopied":"Referral link copied","profile.referral.newUserBonus":"New users get","profile.referral.user":"User","profile.referral.registerTime":"Registered","profile.referral.noReferrals":"No referrals yet","profile.referral.shareNow":"Share Now","profile.notifications.title":"Notification Settings","profile.notifications.hint":"Configure your default notification methods, which will be used automatically when creating asset monitors and alerts","profile.notifications.defaultChannels":"Default Notification Channels","profile.notifications.browser":"In-App Notification","profile.notifications.email":"Email","profile.notifications.phone":"SMS","profile.notifications.telegramBotToken":"Telegram Bot Token","profile.notifications.telegramBotTokenPlaceholder":"Enter your Telegram Bot Token","profile.notifications.telegramBotTokenHint":"Get Token by creating a bot via @BotFather","profile.notifications.telegramChatId":"Telegram Chat ID","profile.notifications.telegramPlaceholder":"Enter your Telegram Chat ID (e.g. 123456789)","profile.notifications.telegramHint":"Send /start to @userinfobot to get your Chat ID","profile.notifications.notifyEmail":"Notification Email","profile.notifications.emailPlaceholder":"Email address to receive notifications","profile.notifications.emailHint":"Uses your account email by default, or set a different one","profile.notifications.phonePlaceholder":"Enter phone number (e.g. +1234567890)","profile.notifications.phoneHint":"Requires admin to configure Twilio service","profile.notifications.discordWebhook":"Discord Webhook","profile.notifications.discordPlaceholder":"https://discord.com/api/webhooks/...","profile.notifications.discordHint":"Create Webhook in Discord server settings","profile.notifications.webhookUrl":"Webhook URL","profile.notifications.webhookPlaceholder":"https://your-server.com/webhook","profile.notifications.webhookHint":"Custom Webhook URL, notifications sent via POST JSON","profile.notifications.webhookToken":"Webhook Token (Optional)","profile.notifications.webhookTokenPlaceholder":"Bearer Token for request authentication","profile.notifications.webhookTokenHint":"Sent as Authorization: Bearer Token to Webhook","profile.notifications.testBtn":"Send Test Notification","profile.notifications.saveSuccess":"Notification settings saved successfully","profile.notifications.selectChannel":"Please select at least one notification channel","profile.notifications.fillTelegramToken":"Please fill in Telegram Bot Token","profile.notifications.fillTelegram":"Please fill in Telegram Chat ID","profile.notifications.fillEmail":"Please fill in notification email","profile.notifications.testSent":"Test notification sent, please check your notification channels","userManage.credits":"Credits","userManage.adjustCredits":"Adjust Credits","userManage.setVip":"Set VIP","userManage.currentCredits":"Current Credits","userManage.newCredits":"New Credits","userManage.enterCredits":"Enter new credits amount","userManage.creditsNonNegative":"Credits cannot be negative","userManage.currentVip":"Current VIP Status","userManage.vipActive":"Active","userManage.vipExpired":"Expired","userManage.vipDays":"VIP Days","userManage.vipExpiresAt":"VIP Expires At","userManage.cancelVip":"Cancel VIP","userManage.days":"days","userManage.customDate":"Custom Date","userManage.selectDate":"Please select a date","userManage.remark":"Remark","userManage.remarkPlaceholder":"Optional remark","userManage.tabUsers":"User Management","systemOverview.tabTitle":"System Overview","systemOverview.totalStrategies":"Total Strategies","systemOverview.runningStrategies":"Running","systemOverview.totalCapital":"Total Capital","systemOverview.totalPnl":"Total PnL","systemOverview.filterAll":"All Status","systemOverview.filterRunning":"Running","systemOverview.filterStopped":"Stopped","systemOverview.searchPlaceholder":"Search strategy/symbol/user","systemOverview.running":"Running","systemOverview.stopped":"Stopped","systemOverview.colUser":"User","systemOverview.colStrategy":"Strategy","systemOverview.colStatus":"Status","systemOverview.colSymbol":"Symbol","systemOverview.colCapital":"Capital","systemOverview.colPnl":"PnL / ROI","systemOverview.colPositions":"Pos","systemOverview.colTrades":"Trades","systemOverview.colIndicator":"Indicator","systemOverview.colExchange":"Exchange","systemOverview.colTimeframe":"TF","systemOverview.colLeverage":"Lev","systemOverview.colCreatedAt":"Created","systemOverview.realized":"Real","systemOverview.unrealized":"Unreal","systemOverview.symbols":"symbols","systemOverview.live":"Live","systemOverview.signal":"Signal Only","settings.group.billing":"Billing & Credits","settings.field.BILLING_ENABLED":"Enable Billing","settings.field.BILLING_VIP_BYPASS":"VIP Bypass (Legacy)","settings.field.BILLING_COST_AI_ANALYSIS":"AI Analysis Cost","settings.field.BILLING_COST_STRATEGY_RUN":"Strategy Run Cost","settings.field.BILLING_COST_BACKTEST":"Backtest Cost","settings.field.BILLING_COST_PORTFOLIO_MONITOR":"Portfolio Monitor Cost","settings.field.CREDITS_REGISTER_BONUS":"Register Bonus","settings.field.CREDITS_REFERRAL_BONUS":"Referral Bonus","settings.field.RECHARGE_TELEGRAM_URL":"Recharge Telegram URL","settings.field.MEMBERSHIP_MONTHLY_PRICE_USD":"Monthly Membership Price (USD)","settings.field.MEMBERSHIP_MONTHLY_CREDITS":"Monthly Membership Bonus Credits","settings.field.MEMBERSHIP_YEARLY_PRICE_USD":"Yearly Membership Price (USD)","settings.field.MEMBERSHIP_YEARLY_CREDITS":"Yearly Membership Bonus Credits","settings.field.MEMBERSHIP_LIFETIME_PRICE_USD":"Lifetime Membership Price (USD)","settings.field.MEMBERSHIP_LIFETIME_MONTHLY_CREDITS":"Lifetime Monthly Credits","settings.field.USDT_PAY_ENABLED":"Enable USDT Pay","settings.field.USDT_PAY_CHAIN":"USDT Chain","settings.field.USDT_TRC20_XPUB":"TRC20 XPUB (Watch-only)","settings.field.USDT_TRC20_CONTRACT":"USDT TRC20 Contract","settings.field.TRONGRID_BASE_URL":"TronGrid Base URL","settings.field.TRONGRID_API_KEY":"TronGrid API Key","settings.field.USDT_PAY_CONFIRM_SECONDS":"Confirm Delay (sec)","settings.field.USDT_PAY_EXPIRE_MINUTES":"Order Expire (min)","settings.desc.BILLING_ENABLED":"Enable billing system. Users need credits to use certain features when enabled","settings.desc.BILLING_VIP_BYPASS":"Legacy switch. If enabled, VIP users bypass ALL feature credit costs. Recommended OFF: VIP should only unlock VIP-free indicators.","settings.desc.BILLING_COST_AI_ANALYSIS":"Credits consumed per AI analysis request","settings.desc.BILLING_COST_STRATEGY_RUN":"Credits consumed when starting a strategy","settings.desc.BILLING_COST_BACKTEST":"Credits consumed per backtest run","settings.desc.BILLING_COST_PORTFOLIO_MONITOR":"Credits consumed per portfolio AI monitoring run","settings.desc.CREDITS_REGISTER_BONUS":"Credits awarded to new users on registration","settings.desc.CREDITS_REFERRAL_BONUS":"Credits awarded to referrer when someone signs up with their referral code","settings.desc.VERIFICATION_CODE_MAX_ATTEMPTS":"Maximum attempts to verify a code before lockout","settings.desc.VERIFICATION_CODE_LOCK_MINUTES":"Lockout duration after exceeding max attempts","settings.desc.RECHARGE_TELEGRAM_URL":"Telegram customer service URL for recharge inquiries","settings.desc.MEMBERSHIP_MONTHLY_PRICE_USD":"Monthly membership price in USD (mock payment in current version).","settings.desc.MEMBERSHIP_MONTHLY_CREDITS":"Credits granted immediately after purchasing monthly membership.","settings.desc.MEMBERSHIP_YEARLY_PRICE_USD":"Yearly membership price in USD (mock payment in current version).","settings.desc.MEMBERSHIP_YEARLY_CREDITS":"Credits granted immediately after purchasing yearly membership.","settings.desc.MEMBERSHIP_LIFETIME_PRICE_USD":"Lifetime membership price in USD (mock payment in current version).","settings.desc.MEMBERSHIP_LIFETIME_MONTHLY_CREDITS":"Credits granted every 30 days for lifetime members (first grant happens immediately on purchase).","settings.desc.USDT_PAY_ENABLED":"Enable USDT scan-to-pay flow (per-order unique address + auto reconciliation).","settings.desc.USDT_PAY_CHAIN":"Currently only TRC20 is supported.","settings.desc.USDT_TRC20_XPUB":"Watch-only xpub used to derive per-order deposit addresses. Do NOT paste private key/seed.","settings.desc.USDT_TRC20_CONTRACT":"USDT contract address on TRON (default prefilled).","settings.desc.TRONGRID_BASE_URL":"TronGrid API base URL (default is fine).","settings.desc.TRONGRID_API_KEY":"Optional. For higher TronGrid rate limits and stability.","settings.desc.USDT_PAY_CONFIRM_SECONDS":"After a payment is detected, wait N seconds before marking it confirmed.","settings.desc.USDT_PAY_EXPIRE_MINUTES":"Order expiration time; users need to regenerate an order after it expires.","globalMarket.title":"Global Market Dashboard","globalMarket.fearGreedShort":"F&G","globalMarket.calendar":"Calendar","globalMarket.lastUpdate":"Last Update","globalMarket.refresh":"Refresh","globalMarket.name":"Name","globalMarket.price":"Price","globalMarket.change":"Change","globalMarket.trend":"Trend","globalMarket.pair":"Pair","globalMarket.unit":"Unit","globalMarket.refreshSuccess":"Data refreshed successfully","globalMarket.refreshError":"Failed to refresh data","globalMarket.fetchError":"Failed to fetch data","globalMarket.loading":"Loading...","globalMarket.fearGreedIndex":"Fear & Greed Index","globalMarket.fearGreedTip":"Fear & Greed Index measures market sentiment, 0 = Extreme Fear, 100 = Extreme Greed","globalMarket.volatilityIndex":"Volatility Index","globalMarket.dollarIndex":"Dollar Index","globalMarket.majorIndices":"Major Indices","globalMarket.vixTitle":"VIX Volatility Index","globalMarket.vixTip":"VIX measures expected market volatility, higher values indicate more market fear","globalMarket.extremeFear":"Extreme Fear","globalMarket.fear":"Fear","globalMarket.neutral":"Neutral","globalMarket.greed":"Greed","globalMarket.extremeGreed":"Extreme Greed","globalMarket.marketOverview":"Market Overview","globalMarket.indices":"Indices","globalMarket.forex":"Forex","globalMarket.crypto":"Crypto","globalMarket.commodities":"Commodities","globalMarket.heatmap":"Market Heatmap","globalMarket.cryptoHeatmap":"Crypto","globalMarket.commoditiesHeatmap":"Commodities","globalMarket.sectorHeatmap":"Sectors","globalMarket.forexHeatmap":"Forex","globalMarket.opportunities":"Trading Opportunities","globalMarket.noOpportunities":"No significant opportunities detected","globalMarket.financialNews":"Financial News","globalMarket.noNews":"No news available","globalMarket.economicCalendar":"Economic Calendar","globalMarket.noEvents":"No events scheduled","globalMarket.actual":"Actual","globalMarket.forecast":"Forecast","globalMarket.previous":"Previous","globalMarket.signal.bullish":"Bullish Momentum","globalMarket.signal.bearish":"Bearish Momentum","globalMarket.signal.overbought":"Overbought Warning","globalMarket.signal.oversold":"Oversold Opportunity","globalMarket.worldMap":"Global Markets Map","globalMarket.rising":"Rising","globalMarket.falling":"Falling","globalMarket.bullish":"Bullish","globalMarket.bearish":"Bearish","globalMarket.expectedImpact":"Expected Impact","globalMarket.aboveForecast":"Above Forecast","globalMarket.belowForecast":"Below Forecast","globalMarket.upcomingEvents":"Upcoming Events","globalMarket.releasedEvents":"Released Data","trading-assistant.form.notificationFromProfile":"Notifications will be sent to the address configured in your profile.","trading-assistant.form.notificationConfigMissing":"You have not configured parameters for selected channels ({channels}). Please go to your profile to configure them.","trading-assistant.form.goToProfile":"Go to Profile","community.title":"Indicator Market","community.searchPlaceholder":"Search indicators...","community.all":"All","community.freeOnly":"Free","community.paidOnly":"Paid","community.sortNewest":"Newest","community.sortHot":"Popular","community.sortRating":"Top Rated","community.sortPriceLow":"Price: Low to High","community.sortPriceHigh":"Price: High to Low","community.myPurchases":"My Purchases","community.noIndicators":"No indicators yet","community.createFirst":"Create Your First Indicator","community.total":"Total","community.items":"items","community.free":"Free","community.credits":"Credits","community.myIndicator":"My Indicator","community.purchased":"Purchased","community.noDescription":"No description","community.loadFailed":"Failed to load","community.publishedAt":"Published","community.downloads":"Downloads","community.rating":"Rating","community.views":"Views","community.description":"Description","community.performance":"Live Performance","community.strategyCount":"Strategies","community.tradeCount":"Trades","community.winRate":"Win Rate","community.totalProfit":"Total Profit","community.reviews":"Reviews","community.useNow":"Use Now","community.getFree":"Get Free","community.buyNow":"Buy Now","community.purchaseSuccess":"Purchase successful! Indicator added to your list","community.purchaseFailed":"Purchase failed","community.indicator_not_found":"Indicator not found or unavailable","community.cannot_buy_own":"Cannot buy your own indicator","community.already_purchased":"You have already purchased this indicator","community.insufficient_credits":"Insufficient credits","community.commentSuccess":"Comment submitted","community.commentFailed":"Failed to submit comment","community.commentUpdateSuccess":"Comment updated successfully","community.commentUpdateFailed":"Failed to update comment","community.editComment":"Edit Comment","community.cancelEdit":"Cancel","community.updateComment":"Update Comment","community.alreadyCommented":"You have already reviewed this indicator","community.editMyComment":"Edit Review","community.me":"Me","community.edited":"edited","community.not_purchased":"Please purchase/get the indicator first to leave a review","community.cannot_comment_own":"Cannot review your own indicator","community.already_commented":"You have already reviewed this indicator","community.noComments":"No reviews yet","community.yourRating":"Your Rating","community.commentPlaceholder":"Share your experience...","community.submitComment":"Submit Review","community.pleaseRate":"Please select a rating","community.loadMore":"Load More","community.justNow":"Just now","community.minutesAgo":"minutes ago","community.hoursAgo":"hours ago","community.daysAgo":"days ago","community.noPurchases":"No purchases yet","community.purchasedFrom":"Seller","community.purchaseTime":"Purchase Time","community.admin.reviewTab":"Review","community.admin.pending":"Pending","community.admin.approved":"Approved","community.admin.rejected":"Rejected","community.admin.noItems":"No items","community.admin.noDescription":"No description","community.admin.viewCode":"View Code","community.admin.note":"Note","community.admin.approve":"Approve","community.admin.reject":"Reject","community.admin.unpublish":"Unpublish","community.admin.delete":"Delete","community.admin.deleteConfirm":"Are you sure to delete this indicator? This cannot be undone.","community.admin.unpublishConfirm":"Are you sure to unpublish this indicator?","community.admin.unpublishHint":"This indicator will be hidden from the market","community.admin.confirm":"Confirm","community.admin.cancel":"Cancel","community.admin.approveTitle":"Approve Indicator","community.admin.rejectTitle":"Reject Indicator","community.admin.noteLabel":"Note (optional)","community.admin.notePlaceholder":"Enter review note...","community.admin.loadFailed":"Failed to load","community.admin.reviewSuccess":"Review submitted","community.admin.reviewFailed":"Review failed","community.admin.unpublishSuccess":"Unpublished successfully","community.admin.unpublishFailed":"Failed to unpublish","community.admin.deleteSuccess":"Deleted successfully","community.admin.deleteFailed":"Failed to delete","fastAnalysis.aiAnalysis":"AI Analysis","fastAnalysis.analyzing":"AI is analyzing...","fastAnalysis.pleaseWait":"Please wait, fetching real-time data and generating professional report","fastAnalysis.error":"Analysis Failed","fastAnalysis.retry":"Retry","fastAnalysis.selectSymbol":"Select a symbol to start","fastAnalysis.selectHint":"Choose from your watchlist or add a new symbol","fastAnalysis.confidence":"Confidence","fastAnalysis.currentPrice":"Current Price","fastAnalysis.entryPrice":"Entry Price","fastAnalysis.stopLoss":"Stop Loss","fastAnalysis.takeProfit":"Take Profit","fastAnalysis.stopLossHint":"Based on 2x ATR & support","fastAnalysis.takeProfitHint":"Based on 3x ATR & resistance","fastAnalysis.atrBased":"ATR-based","fastAnalysis.riskReward":"Risk/Reward","fastAnalysis.technical":"Technical","fastAnalysis.fundamental":"Fundamental","fastAnalysis.sentiment":"Sentiment","fastAnalysis.overall":"Overall","fastAnalysis.keyReasons":"Key Reasons","fastAnalysis.risks":"Risks","fastAnalysis.indicators":"Technical Indicators","fastAnalysis.maTrend":"MA Trend","fastAnalysis.support":"Support","fastAnalysis.resistance":"Resistance","fastAnalysis.volatility":"Volatility","fastAnalysis.wasHelpful":"Was this analysis helpful?","fastAnalysis.helpful":"Helpful","fastAnalysis.notHelpful":"Not Helpful","fastAnalysis.feedbackThanks":"Thanks for your feedback!","fastAnalysis.feedbackFailed":"Failed to submit feedback","fastAnalysis.feedbackUnavailable":"Feedback unavailable, please re-analyze","fastAnalysis.analysisTime":"Analysis time","fastAnalysis.startAnalysis":"Analyze","fastAnalysis.history":"History","fastAnalysis.systemTitle":"QUANTDINGER AI","fastAnalysis.systemOnline":"Online","fastAnalysis.version":"Fast","fastAnalysis.preparing":"Preparing...","fastAnalysis.step1":"Fetching real-time data","fastAnalysis.step2":"Calculating indicators","fastAnalysis.step3":"AI deep analysis","fastAnalysis.step4":"Generating report","fastAnalysis.technicalAnalysis":"Technical Analysis","fastAnalysis.fundamentalAnalysis":"Fundamental Analysis","fastAnalysis.sentimentAnalysis":"Market Sentiment","fastAnalysis.signal.bullish":"Bullish","fastAnalysis.signal.bearish":"Bearish","fastAnalysis.signal.neutral":"Neutral","fastAnalysis.signal.overbought":"Overbought","fastAnalysis.signal.oversold":"Oversold","fastAnalysis.signal.strong_bullish":"Strong Bullish","fastAnalysis.signal.strong_bearish":"Strong Bearish","fastAnalysis.trend.uptrend":"Uptrend","fastAnalysis.trend.downtrend":"Downtrend","fastAnalysis.trend.sideways":"Sideways","fastAnalysis.trend.consolidating":"Consolidating","fastAnalysis.trend.golden_cross":"Golden Cross","fastAnalysis.trend.death_cross":"Death Cross","fastAnalysis.trend.strong_uptrend":"Strong Uptrend","fastAnalysis.trend.strong_downtrend":"Strong Downtrend","fastAnalysis.volatilityLevel.high":"High","fastAnalysis.volatilityLevel.medium":"Medium","fastAnalysis.volatilityLevel.low":"Low","fastAnalysis.volatilityLevel.unknown":"Unknown","fastAnalysis.marketOverview":"Market Overview","fastAnalysis.selectTip":"Select a symbol from your watchlist to start AI analysis","aiQuant.title":"AI Quant","aiQuant.strategyList":"Strategies","aiQuant.create":"Create","aiQuant.edit":"Edit","aiQuant.delete":"Delete","aiQuant.start":"Start","aiQuant.stop":"Stop","aiQuant.analyze":"Analyze Now","aiQuant.noStrategy":"No strategies yet, click to create","aiQuant.selectStrategy":"Select a strategy from the left","aiQuant.createFirst":"Create Your First Strategy","aiQuant.createStrategy":"Create Strategy","aiQuant.editStrategy":"Edit Strategy","aiQuant.confirmDelete":"Are you sure you want to delete this strategy?","aiQuant.latestAnalysis":"Latest Analysis","aiQuant.analysisHistory":"Analysis History","aiQuant.decision":"Decision","aiQuant.confidence":"Confidence","aiQuant.currentPrice":"Current Price","aiQuant.entryPrice":"Entry Price","aiQuant.stopLoss":"Stop Loss","aiQuant.takeProfit":"Take Profit","aiQuant.reason":"Reason","aiQuant.analyzedAt":"Analyzed At","aiQuant.tradeSettings":"Trade Settings","aiQuant.minutes":"min","aiQuant.hour":"hour","aiQuant.hours":"hours","aiQuant.stats.totalStrategies":"Total Strategies","aiQuant.stats.runningStrategies":"Running","aiQuant.stats.totalAnalyses":"Analyses","aiQuant.stats.totalPnl":"Total PnL","aiQuant.status.running":"Running","aiQuant.status.stopped":"Stopped","aiQuant.status.paused":"Paused","aiQuant.executionMode.signal":"Signal Only","aiQuant.executionMode.live":"Live Trading","aiQuant.marketType.spot":"Spot","aiQuant.marketType.futures":"Futures","aiQuant.field.strategyName":"Strategy Name","aiQuant.field.market":"Market","aiQuant.field.symbol":"Symbol","aiQuant.field.marketType":"Market Type","aiQuant.field.aiModel":"AI Model","aiQuant.field.interval":"Analysis Interval","aiQuant.field.aiPrompt":"AI Prompt","aiQuant.field.executionMode":"Execution Mode","aiQuant.field.positionSize":"Position Size","aiQuant.field.stopLoss":"Stop Loss %","aiQuant.field.takeProfit":"Take Profit %","aiQuant.field.totalAnalyses":"Total Analyses","aiQuant.field.totalTrades":"Total Trades","aiQuant.field.totalPnl":"Total PnL","aiQuant.placeholder.strategyName":"Enter strategy name","aiQuant.placeholder.market":"Select market","aiQuant.placeholder.symbol":"e.g., BTC/USDT","aiQuant.placeholder.aiModel":"Use system default","aiQuant.placeholder.aiPrompt":"Enter your trading strategy prompt, e.g., Buy when RSI is below 30...","aiQuant.validation.strategyName":"Please enter strategy name","aiQuant.validation.market":"Please select market","aiQuant.validation.symbol":"Please enter symbol","aiQuant.table.decision":"Decision","aiQuant.table.confidence":"Confidence","aiQuant.table.entryPrice":"Entry","aiQuant.table.stopLoss":"Stop Loss","aiQuant.table.takeProfit":"Take Profit","aiQuant.table.time":"Time","aiQuant.msg.createSuccess":"Strategy created successfully","aiQuant.msg.updateSuccess":"Strategy updated successfully","aiQuant.msg.deleteSuccess":"Strategy deleted successfully","aiQuant.msg.startSuccess":"Strategy started","aiQuant.msg.stopSuccess":"Strategy stopped","aiQuant.msg.analyzeSuccess":"Analysis completed","aiQuant.field.initialCapital":"Initial Capital","aiQuant.field.leverage":"Leverage","aiQuant.field.tradeDirection":"Trade Direction","aiQuant.field.trailingStop":"Trailing Stop","aiQuant.field.trailingStopPct":"Trailing Stop %","aiQuant.direction.long":"Long Only","aiQuant.direction.short":"Short Only","aiQuant.direction.both":"Both","aiQuant.riskControl":"Risk Control","aiQuant.aiSettings":"AI Settings","aiQuant.systemDefault":"System Default","aiQuant.placeholder.selectSymbol":"Select from watchlist","aiQuant.hint.symbolFromWatchlist":"Select from your watchlist, market type is auto-detected","aiQuant.hint.spotLeverageFixed":"Spot market leverage is fixed at 1x","aiQuant.hint.stopLossEnforced":"Enforced stop loss, AI cannot modify","aiQuant.hint.takeProfitEnforced":"Enforced take profit, AI cannot modify","aiQuant.hint.aiPromptOnly":"AI only determines direction based on prompt, will not modify your risk settings","aiQuant.aiLimitWarning":"AI Permission Restricted","aiQuant.aiLimitDescription":"AI can ONLY determine trade direction (BUY/SELL/HOLD). Leverage, position size, stop loss/take profit are fully controlled by you and CANNOT be modified by AI.","aiQuant.userStopLoss":"Your Stop Loss","aiQuant.userTakeProfit":"Your Take Profit","aiQuant.userLeverage":"Your Leverage","aiQuant.validation.initialCapital":"Please enter initial capital","aiQuant.table.currentPrice":"Current Price","aiQuant.field.promptTemplate":"Strategy Template","aiQuant.placeholder.selectTemplate":"Select a preset template","aiQuant.template.default":"📊 Comprehensive Analysis (Recommended)","aiQuant.template.trend":"📈 Trend Following","aiQuant.template.swing":"🔄 Swing Trading","aiQuant.template.news":"📰 News Driven","aiQuant.template.custom":"✏️ Custom","aiQuant.hint.dataProvided":"System auto-provides: real-time price, indicators (RSI/MACD/MA), recent news, macro data. AI analyzes these with your prompt to determine direction.","aiQuant.hint.liveWarning":"Live mode will trade with REAL money! Make sure you have configured exchange API and understand the risks!","trading-assistant.liveDisclaimer.title":"Live Trading Disclaimer","trading-assistant.liveDisclaimer.content":"Live trading involves significant risk and may result in partial or total loss of funds. The platform does not guarantee returns or profits. You are responsible for your own decisions and outcomes.","trading-assistant.liveDisclaimer.agree":"I have read and understood the disclaimer and still want to enable live trading","trading-assistant.liveDisclaimer.required":"Please accept the disclaimer before enabling live trading","trading-assistant.liveDisclaimer.blockTitle":"Please accept the disclaimer first","trading-assistant.liveDisclaimer.blockDesc":"You must accept the disclaimer to configure live trading connection and order settings.","menu.billing":"Membership","billing.title":"Membership / Credits","billing.desc":"Choose a plan to activate VIP and receive bonus credits.","billing.snapshot.credits":"Current Credits","billing.snapshot.vip":"VIP Status","billing.snapshot.notVip":"Not VIP","billing.snapshot.expires":"Expires","billing.vipRule.title":"VIP Benefit","billing.vipRule.desc":"VIP has only one special permission: VIP-free indicators can be used without credits deduction. Other paid features/indicators still consume credits.","billing.plan.monthly":"Monthly","billing.plan.yearly":"Yearly","billing.plan.lifetime":"Lifetime","billing.perMonth":"month","billing.perYear":"year","billing.once":"one-time","billing.credits":"Credits","billing.lifetimeMonthly":"Monthly bonus","billing.buyNow":"Buy Now","billing.purchaseSuccess":"Purchase successful","billing.purchaseFailed":"Purchase failed","billing.usdt.title":"USDT Scan to Pay","billing.usdt.hintTitle":"Scan with your wallet and send USDT","billing.usdt.hintDesc":"Make sure the network and amount are correct (TRC20 only for now). Membership will be activated automatically after payment is confirmed.","billing.usdt.chain":"Chain","billing.usdt.amount":"Amount","billing.usdt.address":"Deposit Address","billing.usdt.copyAddress":"Copy Address","billing.usdt.copyAmount":"Copy Amount","billing.usdt.refresh":"Refresh","billing.usdt.expires":"Expires","billing.usdt.paidSuccess":"Payment confirmed. Membership activated.","billing.usdt.status.pending":"Waiting for payment","billing.usdt.status.paid":"Payment detected","billing.usdt.status.confirmed":"Confirmed","billing.usdt.status.expired":"Expired","billing.usdt.status.cancelled":"Cancelled","billing.usdt.status.failed":"Failed","billing.usdt.expiredHint":"Order expired. If you already paid, please contact support with your TxHash and payment screenshot.","billing.usdt.confirmedHint":"Payment confirmed, membership activated! Thank you for your purchase.","community.vipFree":"VIP Free","dashboard.indicator.publish.vipFree":"VIP Free","dashboard.indicator.publish.vipFreeHint":"When enabled: VIP users can use this indicator for free (non-VIP still need to purchase).","quickTrade.title":"Quick Trade","quickTrade.selectSymbol":"Select Trading Pair","quickTrade.exchange":"Exchange","quickTrade.selectExchange":"Select exchange account","quickTrade.cryptoOnly":"Crypto only","quickTrade.noExchange":"No crypto exchange accounts yet. Add one in Profile → Exchange Config.","quickTrade.available":"Available","quickTrade.long":"Long","quickTrade.short":"Short","quickTrade.market":"Market","quickTrade.limit":"Limit","quickTrade.limitPrice":"Limit Price","quickTrade.enterPrice":"Enter price","quickTrade.amount":"Amount","quickTrade.enterAmount":"Enter amount","quickTrade.leverage":"Leverage","quickTrade.tpsl":"TP/SL Price (Optional)","quickTrade.tp":"Take Profit Price","quickTrade.sl":"Stop Loss Price","quickTrade.tpPlaceholder":"Enter TP price","quickTrade.slPlaceholder":"Enter SL price","quickTrade.optional":"Optional","quickTrade.buyLong":"Buy / Long","quickTrade.sellShort":"Sell / Short","quickTrade.currentPosition":"Current Position","quickTrade.side":"Side","quickTrade.posSize":"Size","quickTrade.entryPrice":"Entry Price","quickTrade.markPrice":"Mark Price","quickTrade.unrealizedPnl":"Unrealized PnL","quickTrade.closePosition":"Close Position","quickTrade.noPosition":"No Position","quickTrade.noPositionHint":"No position for current trading pair","quickTrade.recentTrades":"Recent Trades","quickTrade.orderSuccess":"Order placed successfully!","quickTrade.orderFailed":"Order failed","quickTrade.positionClosed":"Position closed!","quickTrade.openPanel":"Quick Trade","quickTrade.tradeNow":"Trade Now","profile.exchange.title":"Exchange Config","profile.exchange.hint":"Manage your exchange API keys and broker connections. They can be used in Trading Assistant and Quick Trade.","profile.exchange.addAccount":"Add Exchange Account","profile.exchange.noAccounts":"No exchange accounts yet. Click the button above to add one.","profile.exchange.colExchange":"Exchange","profile.exchange.colName":"Name","profile.exchange.colHint":"Connection Info","profile.exchange.colCreatedAt":"Created At","profile.exchange.colActions":"Actions","profile.exchange.deleteConfirm":"Are you sure you want to delete this exchange account? This cannot be undone.","profile.exchange.deleteSuccess":"Exchange account deleted","profile.exchange.addTitle":"Add Exchange Account","profile.exchange.selectExchange":"Select Exchange","profile.exchange.accountName":"Account Name (Optional)","profile.exchange.accountNamePlaceholder":"e.g. Main Account, Test Account","profile.exchange.apiKey":"API Key","profile.exchange.secretKey":"Secret Key","profile.exchange.passphrase":"Passphrase","profile.exchange.demoTrading":"Demo Trading","profile.exchange.ibkrHost":"TWS/Gateway Host","profile.exchange.ibkrPort":"TWS/Gateway Port","profile.exchange.ibkrPortHint":"TWS Paper:7497 | TWS Live:7496 | Gateway Paper:4002 | Gateway Live:4001","profile.exchange.ibkrClientId":"Client ID","profile.exchange.ibkrAccount":"Account (Optional)","profile.exchange.mt5Server":"Server","profile.exchange.mt5Login":"Login","profile.exchange.mt5Password":"Password","profile.exchange.mt5TerminalPath":"Terminal Path (Optional)","profile.exchange.mt5TerminalPathHint":"Path to MT5 terminal, e.g. C:\\Program Files\\MetaTrader 5\\terminal64.exe","profile.exchange.testConnection":"Test Connection","profile.exchange.testSuccess":"Connection successful!","profile.exchange.testFailed":"Connection failed","profile.exchange.saveSuccess":"Exchange account added successfully","profile.exchange.saveFailed":"Failed to add account","profile.exchange.typeCrypto":"Crypto Exchange","profile.exchange.typeIBKR":"US Stocks (IBKR)","profile.exchange.typeMT5":"Forex (MetaTrader 5)","profile.exchange.localDeploymentRequired":"Local deployment required","profile.exchange.localDeploymentHint":"This broker requires local deployment of QuantDinger to use.","profile.exchange.goToManage":"Go to Profile → Exchange Config to manage","profile.exchange.noCredentialHint":"Please add an exchange account in Profile first","adminOrders.tabTitle":"Order List","adminOrders.totalOrders":"Total Orders","adminOrders.paidOrders":"Paid","adminOrders.pendingOrders":"Pending","adminOrders.totalRevenue":"Total Revenue","adminOrders.filterAll":"All Status","adminOrders.filterPending":"Pending","adminOrders.filterPaid":"Paid","adminOrders.filterConfirmed":"Confirmed","adminOrders.filterExpired":"Expired","adminOrders.searchPlaceholder":"Search by username/email","adminOrders.colUser":"User","adminOrders.colType":"Type","adminOrders.colPlan":"Plan","adminOrders.colAmount":"Amount","adminOrders.colStatus":"Status","adminOrders.colChain":"Chain","adminOrders.colAddress":"Address","adminOrders.colTxHash":"Tx Hash","adminOrders.colCreatedAt":"Created","adminOrders.lifetime":"Lifetime","adminOrders.yearly":"Yearly","adminOrders.monthly":"Monthly","adminOrders.statusPaid":"Paid","adminOrders.statusConfirmed":"Confirmed","adminOrders.statusPending":"Pending","adminOrders.statusExpired":"Expired","adminOrders.statusCancelled":"Cancelled","adminOrders.statusFailed":"Failed","adminAiStats.tabTitle":"AI Analysis","adminAiStats.totalAnalyses":"Total Analyses","adminAiStats.activeUsers":"Active Users","adminAiStats.uniqueSymbols":"Symbols Analyzed","adminAiStats.accuracy":"Correct / Verified","adminAiStats.userStatsTitle":"Per-User Statistics","adminAiStats.recentTitle":"Recent Analysis Records","adminAiStats.searchPlaceholder":"Search by username","adminAiStats.colUser":"User","adminAiStats.colAnalysisCount":"Analyses","adminAiStats.colSymbols":"Symbols","adminAiStats.colMarkets":"Markets","adminAiStats.colAccuracy":"Correct / Wrong","adminAiStats.colFeedback":"Feedback","adminAiStats.colLastAnalysis":"Last Analysis","adminAiStats.colMarket":"Market","adminAiStats.colSymbol":"Symbol","adminAiStats.colModel":"Model","adminAiStats.colStatus":"Status","adminAiStats.colCreatedAt":"Time","adminAiStats.helpful":"Helpful","adminAiStats.notHelpful":"Not Helpful","polymarket.title":"Prediction Markets","polymarket.subtitle":"AI analysis and trading opportunity recommendations based on Polymarket prediction market data","polymarket.filter.category":"Select Category","polymarket.filter.sortBy":"Sort By","polymarket.sort.volume":"24h Volume","polymarket.sort.aiScore":"AI Opportunity Score","polymarket.sort.highProbability":"High Probability","polymarket.sort.highReturn":"High Return Ratio","polymarket.search.placeholder":"Search prediction markets...","polymarket.category.all":"All","polymarket.category.crypto":"Cryptocurrency","polymarket.category.politics":"Politics","polymarket.category.economics":"Economics","polymarket.category.sports":"Sports","polymarket.category.tech":"Tech","polymarket.category.finance":"Finance","polymarket.category.geopolitics":"Geopolitics","polymarket.category.culture":"Culture","polymarket.category.climate":"Climate","polymarket.category.entertainment":"Entertainment","polymarket.market.currentProbability":"Current Probability","polymarket.ai.predicted":"AI Predicted Probability","polymarket.ai.marketProbability":"Market Probability","polymarket.ai.recommendation":"AI Recommendation","polymarket.ai.confidence":"Confidence","polymarket.ai.opportunityScore":"Opportunity Score","polymarket.ai.reasoning":"Analysis Reasoning","polymarket.ai.keyFactors":"Key Factors","polymarket.recommendation.YES":"YES (Bullish)","polymarket.recommendation.NO":"NO (Bearish)","polymarket.recommendation.HOLD":"HOLD (Neutral)","polymarket.status.active":"Active","polymarket.status.closed":"Closed","polymarket.status.resolved":"Resolved","polymarket.action.viewDetail":"View Details","polymarket.action.viewOnPolymarket":"View on Polymarket","polymarket.detail.title":"Prediction Market Details","polymarket.detail.currentProbability":"Current Probability","polymarket.detail.volume24h":"24h Volume","polymarket.detail.liquidity":"Liquidity","polymarket.detail.aiAnalysis":"AI Analysis Results","polymarket.detail.assetOpportunities":"Related Asset Trading Opportunities","polymarket.opportunity.confidence":"Confidence","polymarket.opportunity.analyze":"Analyze Asset","polymarket.signal.BUY":"BUY","polymarket.signal.SELL":"SELL","polymarket.signal.HOLD":"HOLD","polymarket.error.loadFailed":"Failed to load markets","polymarket.error.searchFailed":"Search failed","polymarket.error.notFound":"Market not found","polymarket.error.loadDetailFailed":"Failed to load details","polymarket.viewOnPolymarket":"View on Polymarket","polymarket.filter.explanation.title":"Filter Explanation","polymarket.filter.explanation.volume":"Sorted by 24h trading volume, showing the most active prediction markets.","polymarket.filter.explanation.aiScore":"Sorted by AI opportunity score, considering AI-market divergence, confidence, and other factors. High-value opportunities are prioritized.","polymarket.filter.explanation.highProbability":"Sorted by AI predicted probability, prioritizing events with high AI probability (AI prediction > market probability + 10%).","polymarket.filter.explanation.highReturn":"Sorted by high return ratio, prioritizing opportunities with large AI-market divergence and high confidence (divergence × confidence). Suitable for finding undervalued predictions.","polymarket.deepAnalysis.prompt":"Currently showing rule-based simple analysis. Click the button below for AI deep analysis to get more accurate predictions and recommendations.","polymarket.deepAnalysis.button":"Deep Analysis","polymarket.deepAnalysis.success":"Deep analysis completed! Credits charged: {credits}, Remaining: {remaining}","polymarket.deepAnalysis.successFree":"Deep analysis completed!","polymarket.deepAnalysis.failed":"Deep analysis failed, please try again later","polymarket.deepAnalysis.insufficientCredits":"Insufficient credits! Required: {required}, Current: {current}, Shortage: {shortage}","polymarket.error.invalidMarketId":"Invalid market ID","polymarket.analysis.title":"Polymarket Prediction Market Analysis","polymarket.analysis.description":"Enter a Polymarket link or market title, and AI will analyze trading opportunities for you","polymarket.analysis.startAnalysis":"Start Analysis","polymarket.analysis.inputHint":"Please enter a Polymarket market link or market title","polymarket.analysis.inputPlaceholder":'e.g., https://polymarket.com/event/xxx or "Bitcoin price above $100k in 2025?"',"polymarket.analysis.inputRequired":"Please enter a Polymarket link or market title","polymarket.analysis.analyzeButton":"Start Analysis","polymarket.analysis.analyzing":"Analyzing, please wait...","polymarket.analysis.success":"Analysis completed!","polymarket.analysis.failed":"Analysis failed, please try again later","polymarket.analysis.insufficientCredits":"Insufficient credits, please recharge first","polymarket.analysis.viewOnPolymarket":"View on Polymarket","polymarket.analysis.aiAnalysis":"AI Analysis Results","polymarket.analysis.marketProbability":"Market Probability","polymarket.analysis.aiPredictedProbability":"AI Predicted Probability","polymarket.analysis.divergence":"Divergence","polymarket.analysis.recommendation":"Recommendation","polymarket.analysis.recommendationYes":"YES (Bullish)","polymarket.analysis.recommendationNo":"NO (Bearish)","polymarket.analysis.recommendationHold":"HOLD (Neutral)","polymarket.analysis.confidenceScore":"Confidence Score","polymarket.analysis.opportunityScore":"Opportunity Score","polymarket.analysis.reasoning":"Analysis Reasoning","polymarket.analysis.keyFactors":"Key Factors","polymarket.analysis.creditsCharged":"Credits charged for this analysis: {credits}","polymarket.analysis.remainingCredits":"Remaining credits: {credits}","polymarket.analysis.newAnalysis":"New Analysis","polymarket.analysis.tabAnalyze":"Analyze","polymarket.analysis.tabHistory":"History","polymarket.analysis.historyMarket":"Market","polymarket.analysis.historyRecommendation":"Recommendation","polymarket.analysis.historyOpportunityScore":"Opportunity Score","polymarket.analysis.historyCreatedAt":"Analysis Time","polymarket.analysis.historyTotal":"Total {total} records","polymarket.analysis.loadHistoryFailed":"Failed to load history","aiAssetAnalysis.tabs.polymarket":"Prediction Markets"};t["default"]=(0,i.A)((0,i.A)({},r),l)},90849:function(e,t,a){"use strict";a(23792),a(3362),a(69085),a(9391),a(74423),a(21699),a(52675),a(89463),a(66412),a(60193),a(92168),a(2259),a(86964),a(83237),a(61833),a(67947),a(31073),a(45700),a(78125),a(20326),a(28706),a(26835),a(33771),a(2008),a(50113),a(48980),a(46449),a(78350),a(23418),a(48598),a(62062),a(31051),a(34782),a(26910),a(87478),a(54554),a(93514),a(30237),a(54743),a(46761),a(11745),a(89572),a(48957),a(62010),a(4731),a(36033),a(93153),a(82326),a(36389),a(64444),a(8085),a(77762),a(65070),a(60605),a(39469),a(72152),a(75376),a(56624),a(11367),a(5914),a(78553),a(98690),a(60479),a(70761),a(2892),a(45374),a(25428),a(32637),a(40150),a(59149),a(64601),a(44435),a(87220),a(25843),a(9868),a(17427),a(87607),a(5506),a(52811),a(53921),a(83851),a(81278),a(1480),a(40875),a(29908),a(94052),a(94003),a(221),a(79432),a(9220),a(7904),a(93967),a(93941),a(10287),a(26099),a(16034),a(39796),a(60825),a(87411),a(21211),a(40888),a(9065),a(86565),a(32812),a(84634),a(71137),a(30985),a(34268),a(34873),a(84864),a(27495),a(69479),a(38781),a(31415),a(23860),a(99449),a(27337),a(47764),a(71761),a(35701),a(68156),a(85906),a(42781),a(25440),a(5746),a(90744),a(11392),a(42762),a(39202),a(43359),a(89907),a(11898),a(35490),a(5745),a(94298),a(60268),a(69546),a(20781),a(50778),a(89195),a(46276),a(48718),a(16308),a(34594),a(29833),a(46594),a(72107),a(95477),a(21489),a(22134),a(3690),a(61740),a(81630),a(72170),a(75044),a(69539),a(31694),a(89955),a(33206),a(48345),a(44496),a(66651),a(12887),a(19369),a(66812),a(8995),a(52568),a(31575),a(36072),a(88747),a(28845),a(29423),a(57301),a(373),a(86614),a(41405),a(33684),a(73772),a(30958),a(23500),a(62953),a(59848),a(122),a(3296),a(27208),a(48408),a(7452);var i=a(85471),s=function(){var e=this,t=e._self._c;return t("a-config-provider",{attrs:{locale:e.locale,direction:e.direction}},[t("div",{attrs:{id:"app"}},[t("router-view")],1)])},o=[],n={navTheme:"light",primaryColor:"#13C2C2",layout:"sidemenu",contentWidth:"Fluid",fixedHeader:!0,fixSiderbar:!0,colorWeak:!1,menu:{locale:!0},title:"QuantDinger",pwa:!1,iconfontUrl:"",production:!0},r=function(e){document.title=e;var t=navigator.userAgent,a=/\bMicroMessenger\/([\d\.]+)/;if(a.test(t)&&/ip(hone|od|ad)/i.test(t)){var i=document.createElement("iframe");i.src="/favicon.ico",i.style.display="none",i.onload=function(){setTimeout(function(){i.remove()},9)},document.body.appendChild(i)}},l=n.title,d=a(57888),c=a(64765),u=a(74053),m=a.n(u),g=a(95093),p=a.n(g),h=a(85102);i.Ay.use(c.A);var f="en-US",y={"en-US":(0,d.A)({},h["default"])},b=new c.A({silentTranslationWarn:!0,locale:f,fallbackLocale:f,messages:y}),v=[f];function A(e){b.locale=e;var t=document.documentElement,a=/^ar/i.test(e);return t&&(t.setAttribute("lang",e),t.setAttribute("dir",a?"rtl":"ltr")),document.body&&(document.body.setAttribute("dir",a?"rtl":"ltr"),document.body.classList.toggle("rtl",a)),e}function k(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:f;return new Promise(function(t){return m().set("lang",e),b.locale!==e?v.includes(e)?t(A(e)):a(2162)("./".concat(e)).then(function(t){var a=t.default;return b.setLocaleMessage(e,a),v.push(e),p().updateLocale(a.momentName,a.momentLocale),A(e)}):t(e)})}function S(e){return b.t("".concat(e))}var w,T,P=b,C={data:function(){return{}},computed:{locale:function(){var e=this.$route.meta.title;return e&&r("".concat(S(e)," - ").concat(l)),this.$i18n.getLocaleMessage(this.$store.getters.lang).antLocale},direction:function(){var e=this.$store.getters.lang;return e&&/^ar/i.test(e)?"rtl":"ltr"},theme:function(){return this.$store.state.app.theme}},watch:{theme:{handler:function(e){"dark"===e||"realdark"===e?(document.body.classList.add("dark"),document.body.classList.remove("light")):(document.body.classList.remove("dark"),document.body.classList.add("light"))},immediate:!0}}},E=C,R=a(845),I=(0,R.A)(E,s,o,!1,null,null,null),_=I.exports,M=a(40173),L=function(){var e=this,t=e._self._c;return t("div",{class:["user-layout-wrapper",e.isMobile&&"mobile"],attrs:{id:"userLayout"}},[t("div",{staticClass:"container"},[e._m(0),t("div",{staticClass:"user-layout-lang"},[t("select-lang",{staticClass:"select-lang-trigger"})],1),t("div",{staticClass:"user-layout-content"},[e._m(1),t("div",{staticClass:"main-content"},[t("router-view")],1),t("div",{staticClass:"footer"},[t("div",{staticClass:"copyright"},[e._v(" Copyright © 2025-2026 Quantdinger.com "),t("div",{staticStyle:{width:"70%","text-align":"center","margin-left":"15%","margin-top":"10px"}},[t("a",{staticStyle:{color:"#1890ff",cursor:"pointer"},on:{click:e.toggleRisk}},[e._v(" "+e._s(e.showRisk?e.$t("user.login.privacy.collapse"):e.$t("user.login.privacy.view"))+" ")]),e.showRisk?t("div",{staticStyle:{"margin-top":"10px","font-size":"12px",color:"rgba(0,0,0,0.65)","line-height":"1.6","text-align":"left"}},[t("div",{staticStyle:{"font-weight":"600","margin-bottom":"6px"}},[e._v(e._s(e.$t("user.login.privacy.title")))]),e._v(" "+e._s(e.$t("user.login.privacy.content"))+" ")]):e._e()])])])])])])},x=[function(){var e=this,t=e._self._c;return t("div",{staticClass:"fx-layer",attrs:{"aria-hidden":"true"}},[t("div",{staticClass:"fx-gradient"}),t("div",{staticClass:"fx-grid"})])},function(){var e=this,t=e._self._c;return t("div",{staticClass:"top"},[t("div",{staticClass:"header"},[t("a",{attrs:{href:"/"}},[t("img",{staticClass:"logo",attrs:{src:a(33153),alt:"logo"}})])])])}],D=a(95353),N={computed:(0,d.A)({},(0,D.aH)({isMobile:function(e){return e.app.isMobile}}))},F=(a(63713),a(77197)),O=(a(78269),a(40255)),B=(a(1747),a(36457)),H={computed:(0,d.A)({},(0,D.aH)({currentLang:function(e){return e.app.lang}})),methods:{setLang:function(e){this.$store.dispatch("setLang",e)}}},U=H,q=["en-US","ja-JP","ko-KR","vi-VN","th-TH","ar-SA","fr-FR","de-DE","zh-TW","zh-CN"],j={"zh-CN":"简体中文","zh-TW":"繁體中文","en-US":"English","ja-JP":"日本語","ko-KR":"한국어","vi-VN":"Tiếng Việt","th-TH":"ไทย","ar-SA":"العربية","fr-FR":"Français","de-DE":"Deutsch"},W={"zh-CN":"🇨🇳","zh-TW":"sg","en-US":"🇺🇸","ja-JP":"🇯🇵","ko-KR":"🇰🇷","vi-VN":"🇻🇳","th-TH":"🇹🇭","ar-SA":"🇸🇦","fr-FR":"🇫🇷","de-DE":"🇩🇪"},$={props:{prefixCls:{type:String,default:"ant-pro-drop-down"}},name:"SelectLang",mixins:[U],render:function(){var e=this,t=arguments[0],a=this.prefixCls,i=function(t){var a=t.key;e.setLang(a)},s=t(B.Ay,{class:["menu","ant-pro-header-menu"],attrs:{selectedKeys:[this.currentLang]},on:{click:i}},[q.map(function(e){return t(B.Ay.Item,{key:e},[t("span",{attrs:{role:"img","aria-label":j[e]}},[W[e]])," ",j[e]])})]);return t(F.Ay,{attrs:{overlay:s,placement:"bottomRight"}},[t("span",{class:a},[t(O.A,{attrs:{type:"global",title:S("navBar.lang")}})])])}},G=$,V={name:"UserLayout",components:{SelectLang:G},mixins:[N],data:function(){return{showRisk:!1}},methods:{toggleRisk:function(){this.showRisk=!this.showRisk}},mounted:function(){document.body.classList.add("userLayout")},beforeDestroy:function(){document.body.classList.remove("userLayout")}},Q=V,K=(0,R.A)(Q,L,x,!1,null,"7ae30672",null),z=K.exports,Y=function(){var e=this,t=e._self._c;return t("div",[t("router-view")],1)},X=[],J={name:"BlankLayout"},Z=J,ee=(0,R.A)(Z,Y,X,!1,null,"7f25f9eb",null),te=(ee.exports,function(){var e=this,t=e._self._c;return t("div",{class:["basic-layout-wrapper",e.settings.theme]},[t("pro-layout",e._b({attrs:{menus:e.menus,collapsed:e.collapsed,mediaQuery:e.query,isMobile:e.isMobile,handleMediaQuery:e.handleMediaQuery,handleCollapse:e.handleCollapse,i18nRender:e.i18nRender},scopedSlots:e._u([{key:"menuHeaderRender",fn:function(){return[t("div",[t("img",{attrs:{src:a(2304)}}),t("h1",[e._v(e._s(e.title))])])]},proxy:!0},{key:"headerContentRender",fn:function(){return[t("div",[t("a-tooltip",{attrs:{title:e.$t("menu.header.refreshPage")}},[t("a-icon",{staticStyle:{"font-size":"18px",cursor:"pointer"},attrs:{type:"reload"},on:{click:e.handleRefresh}})],1)],1)]},proxy:!0},{key:"rightContentRender",fn:function(){return[t("right-content",{attrs:{"top-menu":"topmenu"===e.settings.layout,"is-mobile":e.isMobile,theme:e.settings.theme}})]},proxy:!0},{key:"footerRender",fn:function(){return[t("div",{staticStyle:{display:"none"}})]},proxy:!0}])},"pro-layout",e.settings,!1),[t("a-modal",{attrs:{visible:e.showLegalModal,footer:null,title:e.$t("menu.footer.userAgreement"),width:800},on:{cancel:function(t){e.showLegalModal=!1}}},[t("div",{staticStyle:{"max-height":"60vh",overflow:"auto","white-space":"pre-wrap","line-height":"1.8",padding:"16px"}},[e._v(" "+e._s(e.menuFooterConfig.legal.user_agreement||e.$t("user.login.legal.content"))+" ")]),t("div",{staticStyle:{"margin-top":"12px","text-align":"right"}},[t("a-button",{attrs:{type:"primary"},on:{click:function(t){e.showLegalModal=!1}}},[e._v("OK")])],1)]),t("a-modal",{attrs:{visible:e.showPrivacyModal,footer:null,title:e.$t("menu.footer.privacyPolicy"),width:800},on:{cancel:function(t){e.showPrivacyModal=!1}}},[t("div",{staticStyle:{"max-height":"60vh",overflow:"auto","white-space":"pre-wrap","line-height":"1.8",padding:"16px"}},[e._v(" "+e._s(e.menuFooterConfig.legal.privacy_policy||e.$t("user.login.privacy.content"))+" ")]),t("div",{staticStyle:{"margin-top":"12px","text-align":"right"}},[t("a-button",{attrs:{type:"primary"},on:{click:function(t){e.showPrivacyModal=!1}}},[e._v("OK")])],1)]),t("setting-drawer",{ref:"settingDrawer",attrs:{settings:e.settings},on:{change:e.handleSettingChange}},[t("div",{staticStyle:{margin:"12px 0"}},[e._v(" This is SettingDrawer custom footer content. ")])]),t("router-view",{key:e.refreshKey})],1),t("div",{staticClass:"custom-menu-footer",class:{collapsed:e.collapsed,"drawer-open":e.isMobile&&e.isDrawerOpen,"drawer-animating":e.isMobile&&e.isDrawerAnimating}},[e.collapsed?e._e():t("div",{staticClass:"menu-footer-content"},[t("div",{staticClass:"footer-section"},[t("div",{staticClass:"section-title"},[e._v(e._s(e.$t("menu.footer.contactUs")))]),t("div",{staticClass:"section-links"},[t("a",{attrs:{href:e.menuFooterConfig.contact.support_url,target:"_blank"}},[e._v(e._s(e.$t("menu.footer.support")))]),t("span",{staticClass:"separator"},[e._v("|")]),t("a",{attrs:{href:e.menuFooterConfig.contact.feature_request_url,target:"_blank"}},[e._v(e._s(e.$t("menu.footer.featureRequest")))])])]),t("div",{staticClass:"footer-section"},[t("div",{staticClass:"section-title"},[e._v(e._s(e.$t("menu.footer.getSupport")))]),t("div",{staticClass:"section-links"},[t("a",{attrs:{href:"mailto:"+e.menuFooterConfig.contact.email}},[e._v(e._s(e.$t("menu.footer.email")))]),t("span",{staticClass:"separator"},[e._v("|")]),t("a",{attrs:{href:e.menuFooterConfig.contact.live_chat_url,target:"_blank"}},[e._v(e._s(e.$t("menu.footer.liveChat")))])])]),e.menuFooterConfig.social_accounts&&e.menuFooterConfig.social_accounts.length>0?t("div",{staticClass:"footer-section"},[t("div",{staticClass:"section-title"},[e._v(e._s(e.$t("menu.footer.socialAccounts")))]),t("div",{staticClass:"social-icons"},e._l(e.menuFooterConfig.social_accounts,function(e,a){return t("a",{key:a,staticClass:"social-icon",attrs:{href:e.url,target:"_blank",rel:"noopener noreferrer",title:e.name}},[t("Icon",{staticClass:"social-icon-svg",attrs:{icon:"simple-icons:".concat(e.icon)}})],1)}),0)]):e._e(),t("div",{staticClass:"footer-section"},[t("div",{staticClass:"section-links"},[t("a",{on:{click:function(t){e.showLegalModal=!0}}},[e._v(e._s(e.$t("menu.footer.userAgreement")))]),t("span",{staticClass:"separator"},[e._v("&")]),t("a",{on:{click:function(t){e.showPrivacyModal=!0}}},[e._v(e._s(e.$t("menu.footer.privacyPolicy")))])])]),t("div",{staticClass:"footer-section copyright"},[e._v(" "+e._s(e.menuFooterConfig.copyright)+" ")]),t("div",{staticClass:"footer-section version"},[e._v(" V2.2.3 ")])])])],1)}),ae=[],ie=a(18787),se=a(69511),oe=a.n(se),ne=a(58391),re=a.n(ne),le={getAntdSerials:function(e){var t=new Array(9).fill().map(function(t,a){return oe().varyColor.lighten(e,a/10)}),a=re()(e),i=oe().varyColor.toNum3(e.replace("#","")).join(",");return t.concat(a).concat(i)},changeColor:function(e){if(!oe()||!oe().changer||"function"!==typeof oe().changer.changeColor)return Promise.resolve();var t={newColors:this.getAntdSerials(e),changeUrl:function(e){return"/".concat(e)}};try{return oe().changer.changeColor(t,Promise)}catch(a){return Promise.resolve()}}},de=function(){return[{key:P.t("app.setting.themecolor.dust"),color:"#F5222D"},{key:P.t("app.setting.themecolor.volcano"),color:"#FA541C"},{key:P.t("app.setting.themecolor.sunset"),color:"#FAAD14"},{key:P.t("app.setting.themecolor.cyan"),color:"#13C2C2"},{key:P.t("app.setting.themecolor.green"),color:"#52C41A"},{key:P.t("app.setting.themecolor.daybreak"),color:"#1890FF"},{key:P.t("app.setting.themecolor.geekblue"),color:"#2F54EB"},{key:P.t("app.setting.themecolor.purple"),color:"#722ED1"}]},ce=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],a=t?null:ie.A.loading(P.t("app.setting.theme.switching"),0);le.changeColor(e).finally(function(){a&&setTimeout(function(){a()},10)})},ue=function(e){var t=document.body.querySelector("#app");e?t.classList.add("colorWeak"):t.classList.remove("colorWeak")},me=a(41802),ge=function(){var e=this,t=e._self._c;return t("div",{class:e.wrpCls},[t("avatar-dropdown",{class:e.prefixCls,attrs:{menu:!0,"current-user":e.currentUser}}),t("notice-icon",{class:e.prefixCls}),t("select-lang",{class:e.prefixCls}),t("a-tooltip",{attrs:{title:e.$t("app.setting.tooltip")}},[t("span",{class:e.prefixCls,on:{click:e.handleSettingClick}},[t("a-icon",{staticStyle:{"font-size":"16px"},attrs:{type:"setting"}})],1)])],1)},pe=[],he=a(42822),fe=function(){var e=this,t=e._self._c;return e.currentUser&&e.currentUser.name?t("a-dropdown",{attrs:{placement:"bottomRight"},scopedSlots:e._u([{key:"overlay",fn:function(){return[t("a-menu",{staticClass:"ant-pro-drop-down menu",attrs:{"selected-keys":[]}},[t("a-menu-item",{key:"profile",on:{click:e.handleProfile}},[t("a-icon",{attrs:{type:"user"}}),e._v(" "+e._s(e.$t("menu.profile")||"My Profile")+" ")],1),t("a-menu-divider"),t("a-menu-item",{key:"logout",on:{click:e.handleLogout}},[t("a-icon",{attrs:{type:"logout"}}),e._v(" "+e._s(e.$t("menu.account.logout"))+" ")],1)],1)]},proxy:!0}],null,!1,2847446919)},[t("span",{staticClass:"ant-pro-account-avatar"},[t("a-avatar",{staticClass:"antd-pro-global-header-index-avatar",attrs:{size:"small",src:e.currentUser.avatar}}),t("span",[e._v(e._s(e.currentUser.name))])],1)]):t("span",[t("a-spin",{style:{marginLeft:8,marginRight:8},attrs:{size:"small"}})],1)},ye=[],be=(a(62621),a(43898)),ve={name:"AvatarDropdown",props:{currentUser:{type:Object,default:function(){return null}},menu:{type:Boolean,default:!0}},methods:{handleProfile:function(){this.$router.push({name:"Profile"})},handleLogout:function(e){var t=this;be.A.confirm({title:this.$t("layouts.usermenu.dialog.title"),content:this.$t("layouts.usermenu.dialog.content"),onOk:function(){return t.$store.dispatch("Logout").then(function(){t.$router.push({name:"login"})})},onCancel:function(){}})}}},Ae=ve,ke=(0,R.A)(Ae,fe,ye,!1,null,null,null),Se=ke.exports,we=function(){var e=this,t=e._self._c;return t("div",{staticClass:"notice-icon-wrapper"},[t("a-popover",{attrs:{trigger:"click",placement:"bottomRight",overlayClassName:"header-notice-wrapper",getPopupContainer:function(){return e.$refs.noticeRef.parentElement},autoAdjustOverflow:!0,arrowPointAtCenter:!0,overlayStyle:{width:"380px",top:"50px"}},model:{value:e.visible,callback:function(t){e.visible=t},expression:"visible"}},[t("template",{slot:"content"},[t("div",{staticClass:"notice-header"},[t("span",{staticClass:"notice-title"},[e._v(e._s(e.$t("notice.title")))]),e.notifications.length>0?t("a",{staticClass:"notice-action",on:{click:e.markAllRead}},[e._v(" "+e._s(e.$t("notice.markAllRead"))+" ")]):e._e()]),t("a-spin",{attrs:{spinning:e.loading}},[e.notifications.length>0?t("div",{staticClass:"notice-list"},e._l(e.notifications,function(a){return t("div",{key:a.id,staticClass:"notice-item",class:{unread:!a.is_read},on:{click:function(t){return e.handleNoticeClick(a)}}},[t("div",{staticClass:"notice-item-icon"},[t("a-icon",{style:{color:e.getNoticeColor(a.signal_type)},attrs:{type:e.getNoticeIcon(a.signal_type)}})],1),t("div",{staticClass:"notice-item-content"},[t("div",{staticClass:"notice-item-title"},[e._v(e._s(a.title))]),t("div",{staticClass:"notice-item-desc"},[e._v(e._s(e.truncateMessage(a.message)))]),t("div",{staticClass:"notice-item-time"},[e._v(e._s(e.formatTime(a.created_at)))])])])}),0):t("div",{staticClass:"notice-empty"},[t("a-empty",{attrs:{description:e.$t("notice.empty")}})],1)]),e.notifications.length>0?t("div",{staticClass:"notice-footer"},[t("a",{on:{click:e.clearNotifications}},[e._v(e._s(e.$t("notice.clear")))])]):e._e()],1),t("span",{ref:"noticeRef",staticClass:"header-notice",on:{click:e.fetchNotice}},[t("a-badge",{attrs:{count:e.unreadCount,overflowCount:99}},[t("a-icon",{staticStyle:{"font-size":"16px",padding:"4px"},attrs:{type:"bell"}})],1)],1)],2),t("a-modal",{attrs:{title:e.detailNotice?e.detailNotice.title:"",footer:null,width:e.isHtmlReport?900:600,wrapClassName:e.isHtmlReport?"notice-detail-modal html-report-modal":"notice-detail-modal",centered:""},model:{value:e.detailVisible,callback:function(t){e.detailVisible=t},expression:"detailVisible"}},[e.detailNotice?t("div",{staticClass:"notice-detail"},[t("div",{staticClass:"notice-detail-meta"},[t("div",{staticClass:"notice-detail-type"},[t("a-icon",{style:{color:e.getNoticeColor(e.detailNotice.signal_type)},attrs:{type:e.getNoticeIcon(e.detailNotice.signal_type)}}),t("span",{staticClass:"type-label"},[e._v(e._s(e.getNoticeTypeLabel(e.detailNotice.signal_type)))])],1),t("div",{staticClass:"notice-detail-time"},[t("a-icon",{attrs:{type:"clock-circle"}}),t("span",[e._v(e._s(e.formatFullTime(e.detailNotice.created_at)))])],1)]),t("a-divider"),t("div",{staticClass:"notice-detail-content",class:{"html-report":e.isHtmlReport}},[t("div",{staticClass:"message-body",domProps:{innerHTML:e._s(e.formatMessageHtml(e.detailNotice.message))}})]),!e.isHtmlReport&&e.detailNotice.payload&&Object.keys(e.detailNotice.payload).length>0?[t("a-divider"),t("div",{staticClass:"notice-detail-extra"},[t("div",{staticClass:"extra-title"},[e._v(e._s(e.$t("notice.detailInfo")))]),"ai_monitor"===e.detailNotice.signal_type?[e.detailNotice.payload.final_decision?t("div",{staticClass:"extra-item decision"},[t("span",{staticClass:"label"},[e._v(e._s(e.$t("notice.aiDecision"))+":")]),t("a-tag",{attrs:{color:e.getDecisionColor(e.detailNotice.payload.final_decision)}},[e._v(" "+e._s(e.detailNotice.payload.final_decision)+" ")]),e.detailNotice.payload.confidence?t("span",{staticClass:"confidence"},[e._v(" ("+e._s(e.$t("notice.confidence"))+": "+e._s(e.detailNotice.payload.confidence)+"%) ")]):e._e()],1):e._e(),e.detailNotice.payload.reasoning?t("div",{staticClass:"extra-item"},[t("span",{staticClass:"label"},[e._v(e._s(e.$t("notice.reasoning"))+":")]),t("span",{staticClass:"value"},[e._v(e._s(e.detailNotice.payload.reasoning))])]):e._e()]:e._e(),"price_alert"===e.detailNotice.signal_type?[e.detailNotice.payload.symbol?t("div",{staticClass:"extra-item"},[t("span",{staticClass:"label"},[e._v(e._s(e.$t("notice.symbol"))+":")]),t("span",{staticClass:"value"},[e._v(e._s(e.detailNotice.payload.symbol))])]):e._e(),e.detailNotice.payload.price?t("div",{staticClass:"extra-item"},[t("span",{staticClass:"label"},[e._v(e._s(e.$t("notice.currentPrice"))+":")]),t("span",{staticClass:"value"},[e._v("$"+e._s(e.detailNotice.payload.price))])]):e._e(),e.detailNotice.payload.trigger_price?t("div",{staticClass:"extra-item"},[t("span",{staticClass:"label"},[e._v(e._s(e.$t("notice.triggerPrice"))+":")]),t("span",{staticClass:"value"},[e._v("$"+e._s(e.detailNotice.payload.trigger_price))])]):e._e()]:e._e(),"signal"===e.detailNotice.signal_type||"trade"===e.detailNotice.signal_type?[e.detailNotice.payload.symbol?t("div",{staticClass:"extra-item"},[t("span",{staticClass:"label"},[e._v(e._s(e.$t("notice.symbol"))+":")]),t("span",{staticClass:"value"},[e._v(e._s(e.detailNotice.payload.symbol))])]):e._e(),e.detailNotice.payload.action?t("div",{staticClass:"extra-item"},[t("span",{staticClass:"label"},[e._v(e._s(e.$t("notice.action"))+":")]),t("a-tag",{attrs:{color:"BUY"===e.detailNotice.payload.action?"green":"red"}},[e._v(" "+e._s(e.detailNotice.payload.action)+" ")])],1):e._e(),e.detailNotice.payload.quantity?t("div",{staticClass:"extra-item"},[t("span",{staticClass:"label"},[e._v(e._s(e.$t("notice.quantity"))+":")]),t("span",{staticClass:"value"},[e._v(e._s(e.detailNotice.payload.quantity))])]):e._e()]:e._e()],2)]:e._e(),t("div",{staticClass:"notice-detail-actions"},[e.detailNotice.payload&&e.detailNotice.payload.monitor_id?t("a-button",{attrs:{type:"primary"},on:{click:e.goToPortfolio}},[t("a-icon",{attrs:{type:"fund"}}),e._v(" "+e._s(e.$t("notice.viewPortfolio"))+" ")],1):e._e(),t("a-button",{on:{click:function(t){e.detailVisible=!1}}},[e._v(" "+e._s(e.$t("notice.close"))+" ")])],1)],2):e._e()])],1)},Te=[],Pe=a(9133),Ce=a(76959),Ee=a(17654),Re=a(73047),Ie=a(76471),_e={name:"HeaderNotice",data:function(){return{loading:!1,visible:!1,detailVisible:!1,detailNotice:null,notifications:[],unreadTotal:0,lastFetchId:0,pollingTimer:null}},computed:{unreadCount:function(){return Number(this.unreadTotal||0)},isHtmlReport:function(){return!(!this.detailNotice||!this.detailNotice.message)&&(this.detailNotice.message.includes('
')||this.detailNotice.message.includes("