|
|
|
|
# 配置管理工具
|
|
|
|
|
import os
|
|
|
|
|
import json
|
|
|
|
|
from typing import Dict, Optional
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ConfigManager:
|
|
|
|
|
"""配置管理类"""
|
|
|
|
|
|
|
|
|
|
_instance = None
|
|
|
|
|
|
|
|
|
|
def __new__(cls):
|
|
|
|
|
if cls._instance is None:
|
|
|
|
|
cls._instance = super(ConfigManager, cls).__new__(cls)
|
|
|
|
|
cls._instance._load_config()
|
|
|
|
|
return cls._instance
|
|
|
|
|
|
|
|
|
|
def _load_config(self):
|
|
|
|
|
"""加载配置"""
|
|
|
|
|
# 配置文件路径
|
|
|
|
|
config_path = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))), 'config.json')
|
|
|
|
|
print(f"[ConfigManager]尝试加载配置文件: {config_path}")
|
|
|
|
|
# 默认配置
|
|
|
|
|
default_config = {
|
|
|
|
|
'openai_api_key': '',
|
|
|
|
|
'deepseek_api_key': '',
|
|
|
|
|
'deepseek_api_url': 'https://api.deepseek.com/v1/chat/completions',
|
|
|
|
|
'db_path': './data/futures_analysis.db',
|
|
|
|
|
'tqserver_host': 'api.shinnytech.com',
|
|
|
|
|
'tqserver_port': 7777,
|
|
|
|
|
'max_risk_percent': 0.02,
|
|
|
|
|
'min_profit_loss_ratio': 1.5,
|
|
|
|
|
'default_atr_multiplier': 2.0,
|
|
|
|
|
'default_adx_threshold': 20,
|
|
|
|
|
'review_times': '09:00,12:30,15:30'.split(',')
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# 从config.json加载配置
|
|
|
|
|
if os.path.exists(config_path):
|
|
|
|
|
try:
|
|
|
|
|
with open(config_path, 'r', encoding='utf-8') as f:
|
|
|
|
|
config_data = json.load(f)
|
|
|
|
|
|
|
|
|
|
# 从aiModel部分获取API配置
|
|
|
|
|
if 'aiModel' in config_data and 'models' in config_data['aiModel']:
|
|
|
|
|
# 查找启用的模型
|
|
|
|
|
enabled_models = [model for model in config_data['aiModel']['models'] if model.get('enabled', False)]
|
|
|
|
|
|
|
|
|
|
# 优先使用DeepSeek模型的配置
|
|
|
|
|
deepseek_model = next((model for model in config_data['aiModel']['models'] if model.get('name') == 'DeepSeek'), None)
|
|
|
|
|
if deepseek_model:
|
|
|
|
|
default_config['deepseek_api_key'] = deepseek_model.get('apiKey', '')
|
|
|
|
|
default_config['deepseek_api_url'] = deepseek_model.get('apiBaseUrl', 'https://api.deepseek.com/v1/chat/completions')
|
|
|
|
|
|
|
|
|
|
# 查找GPT-4模型的配置
|
|
|
|
|
gpt4_model = next((model for model in config_data['aiModel']['models'] if model.get('name') == 'GPT-4'), None)
|
|
|
|
|
if gpt4_model:
|
|
|
|
|
default_config['openai_api_key'] = gpt4_model.get('apiKey', '')
|
|
|
|
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
print(f"加载config.json失败: {e}")
|
|
|
|
|
# 使用默认配置
|
|
|
|
|
|
|
|
|
|
# 设置配置值
|
|
|
|
|
self.openai_api_key = default_config['openai_api_key']
|
|
|
|
|
self.deepseek_api_key = default_config['deepseek_api_key']
|
|
|
|
|
self.deepseek_api_url = default_config['deepseek_api_url']
|
|
|
|
|
self.db_path = default_config['db_path']
|
|
|
|
|
self.tqserver_host = default_config['tqserver_host']
|
|
|
|
|
self.tqserver_port = default_config['tqserver_port']
|
|
|
|
|
self.max_risk_percent = default_config['max_risk_percent']
|
|
|
|
|
self.min_profit_loss_ratio = default_config['min_profit_loss_ratio']
|
|
|
|
|
self.default_atr_multiplier = default_config['default_atr_multiplier']
|
|
|
|
|
self.default_adx_threshold = default_config['default_adx_threshold']
|
|
|
|
|
self.review_times = default_config['review_times']
|
|
|
|
|
|
|
|
|
|
def get_config(self) -> Dict:
|
|
|
|
|
"""获取所有配置"""
|
|
|
|
|
return {
|
|
|
|
|
'openai_api_key': self.openai_api_key,
|
|
|
|
|
'deepseek_api_key': self.deepseek_api_key,
|
|
|
|
|
'deepseek_api_url': self.deepseek_api_url,
|
|
|
|
|
'db_path': self.db_path,
|
|
|
|
|
'tqserver_host': self.tqserver_host,
|
|
|
|
|
'tqserver_port': self.tqserver_port,
|
|
|
|
|
'max_risk_percent': self.max_risk_percent,
|
|
|
|
|
'min_profit_loss_ratio': self.min_profit_loss_ratio,
|
|
|
|
|
'default_atr_multiplier': self.default_atr_multiplier,
|
|
|
|
|
'default_adx_threshold': self.default_adx_threshold,
|
|
|
|
|
'review_times': self.review_times
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
def update_config(self, config: Dict):
|
|
|
|
|
"""更新配置"""
|
|
|
|
|
for key, value in config.items():
|
|
|
|
|
if hasattr(self, key):
|
|
|
|
|
setattr(self, key, value)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 全局配置实例
|
|
|
|
|
config_manager = ConfigManager()
|