crypto.ai/cryptoai/main.py
2025-04-28 12:14:28 +08:00

220 lines
7.5 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 -*-
import os
import sys
import argparse
from typing import Dict, Any
# 添加项目根目录到Python路径
current_dir = os.path.dirname(os.path.abspath(__file__))
parent_dir = os.path.dirname(current_dir)
sys.path.append(parent_dir)
from cryptoai.agents.crypto_agent import CryptoAgent
from cryptoai.agents.gold_agent import GoldAgent
from cryptoai.utils.config_loader import ConfigLoader
def parse_arguments():
"""解析命令行参数"""
parser = argparse.ArgumentParser(description='加密货币AI分析智能体')
parser.add_argument('--config', type=str, default=None,
help='配置文件路径,默认使用 cryptoai/config/config.yaml')
parser.add_argument('--run-once', action='store_true',
help='只运行一次分析周期,而不是持续运行')
parser.add_argument('--symbol', type=str, default=None,
help='只分析指定的交易对,例如 BTCUSDT')
parser.add_argument('--days', type=int, default=None,
help='获取历史数据的天数,默认使用配置中的值')
parser.add_argument('--interval', type=str, default=None,
help='K线时间间隔例如 1h默认使用配置中的值')
parser.add_argument('--risk-level', type=str, default=None,
choices=['low', 'medium', 'high'],
help='风险等级,默认使用配置中的值')
parser.add_argument('--agent', type=str, default='crypto',
choices=['crypto', 'gold'],
help='要使用的智能体类型,默认为加密货币智能体')
parser.add_argument('--alltick-key', type=str, default=None,
help='AllTick API密钥用于获取黄金等商品数据')
parser.add_argument('--okx-key', type=str, default=None,
help='OKX API密钥')
parser.add_argument('--okx-secret', type=str, default=None,
help='OKX API密钥')
parser.add_argument('--okx-passphrase', type=str, default=None,
help='OKX API密码')
return parser.parse_args()
def override_config_with_args(config_loader: ConfigLoader, args) -> None:
"""
使用命令行参数覆盖配置
Args:
config_loader: 配置加载器
args: 命令行参数
"""
# 获取原始配置
crypto_config = config_loader.get_crypto_config()
agent_config = config_loader.get_agent_config()
data_config = config_loader.get_data_config()
# 覆盖配置
if args.symbol:
if args.agent == 'crypto':
crypto_config['base_currencies'] = [args.symbol.replace(crypto_config['quote_currency'], '')]
elif args.agent == 'gold':
gold_config = config_loader.get_config('gold')
gold_config['symbols'] = [args.symbol]
if args.days:
data_config['historical_days'] = args.days
if args.interval:
if args.agent == 'crypto':
crypto_config['time_interval'] = args.interval
elif args.agent == 'gold':
gold_config = config_loader.get_config('gold')
gold_config['time_interval'] = args.interval
if args.risk_level:
agent_config['risk_level'] = args.risk_level
# 设置AllTick API密钥
if args.alltick_key:
alltick_config = config_loader.get_config('alltick')
alltick_config['api_key'] = args.alltick_key
# 设置OKX API相关配置
if args.okx_key or args.okx_secret or args.okx_passphrase:
okx_config = config_loader.get_config('okx')
if args.okx_key:
okx_config['api_key'] = args.okx_key
if args.okx_secret:
okx_config['api_secret'] = args.okx_secret
if args.okx_passphrase:
okx_config['passphrase'] = args.okx_passphrase
# 保存修改后的配置
# 注意:这只是修改了内存中的配置,没有写入文件
# 如果需要保存到文件,可以实现一个 save_config 方法
def analyze_single_symbol(agent, symbol: str, days: int = 30) -> Dict[str, Any]:
"""
分析单个交易对
Args:
agent: 智能体实例
symbol: 交易对符号
days: 历史数据天数
Returns:
分析结果
"""
print(f"\n开始分析{symbol}...")
# 获取并处理数据
raw_data = agent.fetch_historical_data(symbol, days=days)
if raw_data.empty:
print(f"无法获取{symbol}的数据")
return {}
processed_data = agent.process_data(symbol, raw_data)
# 根据agent类型执行不同的分析
if isinstance(agent, CryptoAgent):
# 分析市场
analysis_result = agent.analyze_market(symbol, processed_data)
# 预测价格
prediction_result = agent.predict_price(symbol)
# 生成策略
strategy = agent.generate_strategy(symbol, analysis_result)
# 整合结果
result = {
"analysis": analysis_result,
"prediction": prediction_result,
"strategy": strategy
}
elif isinstance(agent, GoldAgent):
# 黄金agent没有单独的analyze_market方法使用完整分析
result = agent.analyze_gold()
print(f"{symbol}分析完成")
return result
def main():
"""主函数"""
# 解析命令行参数
args = parse_arguments()
try:
# 加载配置
config_loader = ConfigLoader(args.config)
# 使用命令行参数覆盖配置
override_config_with_args(config_loader, args)
# 根据agent类型创建不同的智能体
if args.agent == 'crypto':
agent = CryptoAgent(config_path=args.config)
print("已启动加密货币分析智能体")
elif args.agent == 'gold':
agent = GoldAgent(config_path=args.config)
print("已启动黄金分析智能体")
# 如果指定了单个交易对
if args.symbol:
result = analyze_single_symbol(
agent=agent,
symbol=args.symbol,
days=args.days or (
agent.data_config['historical_days'] if isinstance(agent, CryptoAgent)
else agent.gold_config.get('historical_days', 180)
)
)
if isinstance(agent, CryptoAgent):
print("\n分析结果:")
print(f"市场趋势: {result.get('analysis', {}).get('market_trend', 'unknown')}")
print(f"24小时预测: {result.get('prediction', {}).get('prediction_24h', {})}")
print(f"建议操作: {result.get('strategy', {}).get('position', 'unknown')}")
elif isinstance(agent, GoldAgent) and result:
print("\n分析结果:")
symbol_result = result.get(args.symbol, {})
analysis = symbol_result.get('analysis', {})
print(f"市场趋势: {analysis.get('market_trend', 'unknown')}")
print(f"建议操作: {analysis.get('recommendation', 'unknown')}")
else:
# 启动智能体
agent.start_agent(run_once=args.run_once)
except KeyboardInterrupt:
print("\n程序已退出")
except Exception as e:
print(f"程序运行出错: {e}")
import traceback
traceback.print_exc()
if __name__ == "__main__":
main()