#!/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)