#!/usr/bin/env python3 """ 数据采集服务 定时运行策略扫描 """ import time import schedule import sys from pathlib import Path # 添加项目根目录到路径 current_dir = Path(__file__).parent project_root = current_dir.parent sys.path.insert(0, str(project_root)) from src.strategy.kline_pattern_strategy import KLinePatternStrategy from src.utils.config_loader import ConfigLoader from src.data.tushare_fetcher import TushareFetcher from src.utils.notification import NotificationManager from src.database.database_manager import DatabaseManager from loguru import logger def run_strategy(): """运行策略扫描""" try: logger.info('开始运行策略扫描...') # 初始化各个组件 config_loader = ConfigLoader() config = config_loader.config # 初始化数据获取器 tushare_token = config.get('data_source', {}).get('tushare_token', '0ed6419a00d8923dc19c0b58fc92d94c9a0696949ab91a13aa58a0cc') data_fetcher = TushareFetcher(token=tushare_token) # 初始化通知管理器 notification_config = config.get('notification', {}) notification_manager = NotificationManager(notification_config) # 初始化数据库管理器 db_manager = DatabaseManager() # 初始化策略 strategy_config = config.get('strategy', {}).get('kline_pattern', {}) strategy = KLinePatternStrategy( data_fetcher=data_fetcher, notification_manager=notification_manager, config=strategy_config, db_manager=db_manager ) # 执行市场K线形态扫描 logger.info("开始扫描市场K线形态...") logger.info("⚠️ 注意: 这可能需要较长时间,请耐心等待") # 获取扫描股票数量配置 scan_count = strategy.config.get('scan_stocks_count', 20) logger.info(f"扫描股票数量: {scan_count}") results = strategy.scan_market(max_stocks=scan_count) if results: logger.info(f"📈 市场扫描结果 (发现 {len(results)} 只股票有信号):") for stock_code, stock_results in results.items(): total_signals = sum(len(signals) for signals in stock_results.values()) logger.info(f"股票: {stock_code} (共{total_signals}个信号)") for timeframe, signals in stock_results.items(): if signals: logger.info(f" {timeframe}: {len(signals)}个信号") # 只显示最新的信号 latest_signal = signals[-1] logger.info(f" 最新: {latest_signal['date']} 突破价格 {latest_signal['breakout_price']:.2f}元") else: logger.info("未发现任何K线形态信号") logger.info('策略扫描完成') except Exception as e: logger.error(f'策略运行失败: {e}') def main(): """主函数""" logger.info('数据采集服务已启动') # 工作日(周一到周五) 9点和15点运行策略 (北京时间) schedule.every().monday.at('09:00').do(run_strategy) schedule.every().monday.at('15:00').do(run_strategy) schedule.every().tuesday.at('09:00').do(run_strategy) schedule.every().tuesday.at('15:00').do(run_strategy) schedule.every().wednesday.at('09:00').do(run_strategy) schedule.every().wednesday.at('15:00').do(run_strategy) schedule.every().thursday.at('09:00').do(run_strategy) schedule.every().thursday.at('15:00').do(run_strategy) schedule.every().friday.at('09:00').do(run_strategy) schedule.every().friday.at('15:00').do(run_strategy) logger.info('调度时间设置: 工作日(周一至周五) 9:00和15:00 (北京时间)') # # 立即运行一次(用于测试) # logger.info('立即执行一次策略扫描...') # run_strategy() # 主循环 while True: schedule.run_pending() time.sleep(60) if __name__ == '__main__': main()