diff --git a/mcp_quant.py b/mcp_quant.py index 71733a1f..087f8a07 100644 --- a/mcp_quant.py +++ b/mcp_quant.py @@ -2623,70 +2623,158 @@ async def calc_price_entropy(code: str, days: int = 60) -> Dict[str, Any]: # ==================== 工具注册(供MCP使用) ==================== +# 包装函数:将 args 字典解构为函数参数 +# MCP 调用时传入的是 args: Dict[str, Any],需要解构后调用实际函数 + +async def _wrap_get_macd_signal(args: Dict[str, Any]): + return await get_macd_signal(args.get("code"), args.get("days", 60)) + +async def _wrap_check_oscillator_status(args: Dict[str, Any]): + return await check_oscillator_status(args.get("code"), args.get("days", 30)) + +async def _wrap_analyze_bollinger_bands(args: Dict[str, Any]): + return await analyze_bollinger_bands(args.get("code"), args.get("days", 60), args.get("period", 20)) + +async def _wrap_calc_stop_loss_atr(args: Dict[str, Any]): + return await calc_stop_loss_atr(args.get("code"), args.get("days", 30), args.get("multiplier", 2.0)) + +async def _wrap_analyze_market_heat(args: Dict[str, Any]): + return await analyze_market_heat(args.get("code"), args.get("days", 20)) + +async def _wrap_check_volume_price_divergence(args: Dict[str, Any]): + return await check_volume_price_divergence(args.get("code"), args.get("days", 30)) + +async def _wrap_check_new_high_breakout(args: Dict[str, Any]): + return await check_new_high_breakout(args.get("code"), args.get("days", 250)) + +async def _wrap_identify_candlestick_pattern(args: Dict[str, Any]): + return await identify_candlestick_pattern(args.get("code"), args.get("days", 10)) + +async def _wrap_find_price_gaps(args: Dict[str, Any]): + return await find_price_gaps(args.get("code"), args.get("days", 60), args.get("min_gap_pct", 2.0)) + +async def _wrap_calc_max_drawdown(args: Dict[str, Any]): + return await calc_max_drawdown(args.get("code"), args.get("days", 250)) + +async def _wrap_check_valuation_rank(args: Dict[str, Any]): + return await check_valuation_rank(args.get("code"), args.get("days", 250)) + +async def _wrap_calc_price_zscore(args: Dict[str, Any]): + return await calc_price_zscore(args.get("code"), args.get("days", 60)) + +async def _wrap_calc_market_profile_vpoc(args: Dict[str, Any]): + return await calc_market_profile_vpoc(args.get("code"), args.get("date")) + +async def _wrap_calc_realized_volatility(args: Dict[str, Any]): + return await calc_realized_volatility(args.get("code"), args.get("date")) + +async def _wrap_analyze_buying_pressure(args: Dict[str, Any]): + return await analyze_buying_pressure(args.get("code"), args.get("date")) + +async def _wrap_get_comprehensive_analysis(args: Dict[str, Any]): + return await get_comprehensive_analysis(args.get("code")) + +async def _wrap_calc_rsi_divergence(args: Dict[str, Any]): + return await calc_rsi_divergence(args.get("code"), args.get("days", 60)) + +async def _wrap_calc_bollinger_squeeze(args: Dict[str, Any]): + return await calc_bollinger_squeeze(args.get("code"), args.get("days", 60)) + +async def _wrap_analyze_obv_trend(args: Dict[str, Any]): + return await analyze_obv_trend(args.get("code"), args.get("days", 60)) + +async def _wrap_calc_amihud_illiquidity(args: Dict[str, Any]): + return await calc_amihud_illiquidity(args.get("code"), args.get("days", 60)) + +async def _wrap_calc_parkinson_volatility(args: Dict[str, Any]): + return await calc_parkinson_volatility(args.get("code"), args.get("date")) + +async def _wrap_calc_trend_slope(args: Dict[str, Any]): + return await calc_trend_slope(args.get("code"), args.get("days", 60)) + +async def _wrap_calc_hurst_exponent(args: Dict[str, Any]): + return await calc_hurst_exponent(args.get("code"), args.get("days", 100)) + +async def _wrap_test_cointegration(args: Dict[str, Any]): + return await test_cointegration(args.get("code1"), args.get("code2"), args.get("days", 120)) + +async def _wrap_calc_kelly_position(args: Dict[str, Any]): + return await calc_kelly_position(args.get("win_rate"), args.get("win_loss_ratio"), args.get("max_position", 0.25)) + +async def _wrap_search_similar_kline(args: Dict[str, Any]): + return await search_similar_kline(args.get("code"), args.get("lookback", 5), args.get("search_range", 250)) + +async def _wrap_decompose_trend_simple(args: Dict[str, Any]): + return await decompose_trend_simple(args.get("code"), args.get("days", 120)) + +async def _wrap_calc_price_entropy(args: Dict[str, Any]): + return await calc_price_entropy(args.get("code"), args.get("days", 60), args.get("bins", 10)) + + QUANT_TOOLS = { # 经典技术指标 - "get_macd_signal": get_macd_signal, - "check_oscillator_status": check_oscillator_status, - "analyze_bollinger_bands": analyze_bollinger_bands, - "calc_stop_loss_atr": calc_stop_loss_atr, + "get_macd_signal": _wrap_get_macd_signal, + "check_oscillator_status": _wrap_check_oscillator_status, + "analyze_bollinger_bands": _wrap_analyze_bollinger_bands, + "calc_stop_loss_atr": _wrap_calc_stop_loss_atr, # 资金与情绪 - "analyze_market_heat": analyze_market_heat, - "check_volume_price_divergence": check_volume_price_divergence, + "analyze_market_heat": _wrap_analyze_market_heat, + "check_volume_price_divergence": _wrap_check_volume_price_divergence, # 形态与突破 - "check_new_high_breakout": check_new_high_breakout, - "identify_candlestick_pattern": identify_candlestick_pattern, - "find_price_gaps": find_price_gaps, + "check_new_high_breakout": _wrap_check_new_high_breakout, + "identify_candlestick_pattern": _wrap_identify_candlestick_pattern, + "find_price_gaps": _wrap_find_price_gaps, # 风险与估值 - "calc_max_drawdown": calc_max_drawdown, - "check_valuation_rank": check_valuation_rank, - "calc_price_zscore": calc_price_zscore, + "calc_max_drawdown": _wrap_calc_max_drawdown, + "check_valuation_rank": _wrap_check_valuation_rank, + "calc_price_zscore": _wrap_calc_price_zscore, # 分钟级高阶算子 - "calc_market_profile_vpoc": calc_market_profile_vpoc, - "calc_realized_volatility": calc_realized_volatility, - "analyze_buying_pressure": analyze_buying_pressure, + "calc_market_profile_vpoc": _wrap_calc_market_profile_vpoc, + "calc_realized_volatility": _wrap_calc_realized_volatility, + "analyze_buying_pressure": _wrap_analyze_buying_pressure, # 综合分析 - "get_comprehensive_analysis": get_comprehensive_analysis, + "get_comprehensive_analysis": _wrap_get_comprehensive_analysis, # ==================== 新增12个因子 ==================== # RSI背离检测 - "calc_rsi_divergence": calc_rsi_divergence, + "calc_rsi_divergence": _wrap_calc_rsi_divergence, # 布林带挤压 - "calc_bollinger_squeeze": calc_bollinger_squeeze, + "calc_bollinger_squeeze": _wrap_calc_bollinger_squeeze, # OBV能量潮独立分析 - "analyze_obv_trend": analyze_obv_trend, + "analyze_obv_trend": _wrap_analyze_obv_trend, # Amihud非流动性因子 - "calc_amihud_illiquidity": calc_amihud_illiquidity, + "calc_amihud_illiquidity": _wrap_calc_amihud_illiquidity, # 帕金森波动率 - "calc_parkinson_volatility": calc_parkinson_volatility, + "calc_parkinson_volatility": _wrap_calc_parkinson_volatility, # 趋势线性回归斜率 - "calc_trend_slope": calc_trend_slope, + "calc_trend_slope": _wrap_calc_trend_slope, # Hurst指数 - "calc_hurst_exponent": calc_hurst_exponent, + "calc_hurst_exponent": _wrap_calc_hurst_exponent, # 协整性测试 - "test_cointegration": test_cointegration, + "test_cointegration": _wrap_test_cointegration, # 凯利公式仓位 - "calc_kelly_position": calc_kelly_position, + "calc_kelly_position": _wrap_calc_kelly_position, # 相似K线检索 - "search_similar_kline": search_similar_kline, + "search_similar_kline": _wrap_search_similar_kline, # 趋势分解(简化版,不依赖Prophet) - "decompose_trend_simple": decompose_trend_simple, + "decompose_trend_simple": _wrap_decompose_trend_simple, # 价格熵值计算 - "calc_price_entropy": calc_price_entropy, + "calc_price_entropy": _wrap_calc_price_entropy, }