#!/usr/bin/env python3 """ 测试优化后的钉钉通知格式(创新高回踩确认版) """ import sys from pathlib import Path from datetime import datetime # 添加项目根目录到路径 current_dir = Path(__file__).parent sys.path.insert(0, str(current_dir)) from src.utils.notification import NotificationManager from loguru import logger def test_optimized_notification(): """ 测试优化后的钉钉通知格式 """ logger.info("🚀 开始测试优化后的钉钉通知格式...") # 配置通知管理器(测试模式,不实际发送) notification_config = { 'dingtalk': { 'enabled': False, # 设置为True并提供真实webhook进行实际测试 'webhook_url': 'https://oapi.dingtalk.com/robot/send?access_token=TEST_TOKEN' } } notification_manager = NotificationManager(notification_config) # 测试1: 单个策略信号通知 logger.info("\n📊 测试1: 单个策略信号通知") test_signal_data = { 'stock_code': '000001.SZ', 'stock_name': '平安银行', 'timeframe': 'daily', 'signal_type': '两阳+阴+阳突破(创新高回踩确认)', 'price': 14.50, 'signal_date': '2024-01-11', 'additional_info': { 'pattern_date': '2024-01-04', 'breakout_price': 11.60, 'new_high_price': 14.50, 'new_high_date': '2024-01-10', 'yin_high': 11.20, 'confirmation_date': '2024-01-11', 'confirmation_days': 7, 'pullback_distance': -0.89, 'yang1_entity_ratio': 0.60, 'yang2_entity_ratio': 0.67, 'final_yang_entity_ratio': 0.89, 'breakout_pct': 3.57, 'turnover_ratio': 2.50, 'above_ema20': True } } try: # 模拟发送单个信号通知 if notification_config['dingtalk']['enabled']: success = notification_manager.send_strategy_signal(**test_signal_data) logger.info(f"单个信号通知发送: {'✅成功' if success else '❌失败'}") else: logger.info("单个信号通知格式测试完成(未实际发送)") except Exception as e: logger.error(f"单个信号通知测试失败: {e}") # 测试2: 策略汇总通知 logger.info("\n📊 测试2: 策略汇总通知") test_summary_data = { '000001.SZ': { 'daily': [ { 'stock_name': '平安银行', 'date': '2024-01-04', 'breakout_price': 11.60, 'new_high_price': 14.50, 'new_high_date': '2024-01-10', 'confirmation_date': '2024-01-11', 'confirmation_days': 7, 'pullback_distance': -0.89, 'yin_high': 11.20, 'turnover_ratio': 2.5, 'breakout_pct': 3.57, 'above_ema20': True, 'new_high_confirmed': True # 标记为新格式 } ] }, '000002.SZ': { 'daily': [ { 'stock_name': '万科A', 'date': '2024-01-05', 'breakout_price': 9.80, 'new_high_price': 12.30, 'new_high_date': '2024-01-09', 'confirmation_date': '2024-01-12', 'confirmation_days': 7, 'pullback_distance': -1.2, 'yin_high': 9.60, 'turnover_ratio': 3.2, 'breakout_pct': 2.08, 'above_ema20': True, 'new_high_confirmed': True # 标记为新格式 } ] } } scan_stats = { 'total_scanned': 100, 'data_source': '双数据源合并' } try: # 模拟发送汇总通知 if notification_config['dingtalk']['enabled']: success = notification_manager.send_strategy_summary(test_summary_data, scan_stats) logger.info(f"汇总通知发送: {'✅成功' if success else '❌失败'}") else: logger.info("汇总通知格式测试完成(未实际发送)") except Exception as e: logger.error(f"汇总通知测试失败: {e}") # 测试3: 回踩提醒通知 logger.info("\n📊 测试3: 回踩提醒通知") test_pullback_alerts = [ { 'stock_code': '000001.SZ', 'stock_name': '平安银行', 'signal_date': '2024-01-11', 'current_date': '2024-01-18', 'timeframe': 'daily', 'yin_high': 11.20, 'breakout_price': 11.60, 'current_price': 11.15, 'current_low': 11.10, 'pullback_pct': -4.5, 'distance_to_yin_high': -0.45, 'days_since_signal': 7, 'alert_type': 'pullback_to_yin_high' } ] try: # 模拟发送回踩提醒 if notification_config['dingtalk']['enabled']: success = notification_manager.send_pullback_alerts(test_pullback_alerts) logger.info(f"回踩提醒发送: {'✅成功' if success else '❌失败'}") else: logger.info("回踩提醒格式测试完成(未实际发送)") except Exception as e: logger.error(f"回踩提醒测试失败: {e}") # 显示消息格式预览 print("\n" + "="*80) print("📱 优化后的钉钉消息格式预览") print("="*80) print("\n🎯 单个信号通知示例:") print("标题: 🎯 两阳+阴+阳突破(创新高回踩确认)信号确认") print("内容包含: 股票信息、创新高回踩确认详情、技术指标、操作建议等") print("\n📊 汇总通知示例:") print("标题: 🎯 K线形态策略信号汇总") print("内容包含: 扫描统计、确认信号详情(模式日期+确认日期+创新高价等)") print("\n⚠️ 回踩提醒示例:") print("标题: ⚠️ 已确认信号二次回踩提醒") print("内容包含: 已确认信号的二次回踩情况、支撑分析建议等") print("\n✅ 钉钉消息优化完成!") print("主要改进:") print("- 突出创新高回踩确认逻辑") print("- 详细展示时间线(模式日期→创新高日期→确认日期)") print("- 增加操作建议和风险提示") print("- 区分新旧格式信号,向下兼容") def main(): """主函数""" logger.info("🚀 开始钉钉通知优化测试...") test_optimized_notification() if __name__ == "__main__": main()