#!/usr/bin/env python # -*- coding: utf-8 -*- """ 加密货币市场扫描脚本 使用K线形态策略扫描Binance交易对 """ import sys from pathlib import Path # 添加项目根目录到Python路径 project_root = Path(__file__).parent sys.path.insert(0, str(project_root)) from src.data.binance_fetcher import BinanceFetcher from src.strategy.crypto_kline_pattern_strategy import CryptoKLinePatternStrategy from src.utils.notification import NotificationManager from src.database.mysql_database_manager import MySQLDatabaseManager from src.utils.config_loader import config_loader from loguru import logger def setup_logger(): """配置日志""" logger.remove() # 移除默认处理器 # 控制台日志 logger.add( sys.stdout, format="{time:YYYY-MM-DD HH:mm:ss} | {level: <8} | {name}:{function}:{line} - {message}", level="INFO" ) # 文件日志 log_dir = project_root / "logs" log_dir.mkdir(exist_ok=True) logger.add( log_dir / "crypto_scanner_{time:YYYY-MM-DD}.log", rotation="00:00", retention="30 days", encoding="utf-8", level="DEBUG" ) logger.info("日志系统初始化完成") def main(max_symbols: int = 100): """ 主函数 Args: max_symbols: 最大扫描交易对数量,默认100 """ logger.info("="*80) logger.info("🚀 加密货币市场扫描程序启动") logger.info(f"📊 扫描交易对数量: {max_symbols}") logger.info("="*80) try: # 1. 加载配置 logger.info("📋 加载配置文件...") config = config_loader.load_config() # 策略配置 strategy_config = { 'min_entity_ratio': 0.55, # 前两根阳线实体最小比例 'final_yang_min_ratio': 0.40, # 最后阳线实体最小比例 'max_turnover_ratio': 100.0, # 最大换手率(加密货币通常更高) 'pullback_tolerance': 0.02, # 回踩容忍度2% 'monitor_days': 30, # 监控天数 'pullback_confirmation_days': 7, # 回踩确认天数 'timeframes': ['4hour', 'daily', 'weekly'], # 时间周期:4小时、日线、周线 'quote_asset': 'USDT', # 计价货币 'min_volume_usdt': 1000000 # 最小24h交易量 } # 通知配置 notification_config = config.get('notification', { 'dingtalk': { 'enabled': True, 'webhook_url': config.get('notification', {}).get('dingtalk', {}).get('webhook_url', '') } }) # 2. 初始化组件 logger.info("🔧 初始化系统组件...") # 数据获取器 data_fetcher = BinanceFetcher() # 通知管理器 notification_manager = NotificationManager(notification_config) # 数据库管理器 db_manager = MySQLDatabaseManager() # 策略 strategy = CryptoKLinePatternStrategy( data_fetcher=data_fetcher, notification_manager=notification_manager, config=strategy_config, db_manager=db_manager ) logger.info("✅ 系统组件初始化完成") # 3. 打印策略描述 logger.info("\n" + "="*80) logger.info(strategy.get_strategy_description()) logger.info("="*80 + "\n") # 4. 执行市场扫描 logger.info("🔍 开始扫描加密货币市场...") results = strategy.scan_market(max_symbols=max_symbols) # 5. 汇总结果 total_signals = sum( sum(result.get_signal_count() for result in symbol_results.values()) for symbol_results in results.values() ) total_patterns = sum( sum(result.get_pattern_count() for result in symbol_results.values()) for symbol_results in results.values() ) logger.info("\n" + "="*80) logger.info("✅ 加密货币市场扫描完成") logger.info(f"📊 扫描结果汇总:") logger.info(f" - 扫描交易对: {max_symbols} 个") logger.info(f" - 发现信号: {total_signals} 个") logger.info(f" - 形态形成: {total_patterns} 个") logger.info(f" - 涉及交易对: {len(results)} 个") logger.info("="*80) return results except Exception as e: logger.error(f"❌ 程序执行失败: {e}") import traceback logger.error(traceback.format_exc()) return None if __name__ == "__main__": # 设置日志 setup_logger() # 从命令行参数获取扫描数量 max_symbols = 100 if len(sys.argv) > 1: try: max_symbols = int(sys.argv[1]) logger.info(f"📊 使用命令行参数: 扫描 {max_symbols} 个交易对") except ValueError: logger.warning(f"⚠️ 无效的参数: {sys.argv[1]},使用默认值100") # 执行扫描 main(max_symbols=max_symbols)