trading.ai/crypto_scanner.py
2025-11-02 10:41:17 +08:00

162 lines
5.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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="<green>{time:YYYY-MM-DD HH:mm:ss}</green> | <level>{level: <8}</level> | <cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> - <level>{message}</level>",
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)