162 lines
5.0 KiB
Python
162 lines
5.0 KiB
Python
#!/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)
|