diff --git a/cryptoai/__pycache__/main.cpython-313.pyc b/cryptoai/__pycache__/main.cpython-313.pyc index f39fe6e..a53f145 100644 Binary files a/cryptoai/__pycache__/main.cpython-313.pyc and b/cryptoai/__pycache__/main.cpython-313.pyc differ diff --git a/cryptoai/agents/__pycache__/crypto_agent.cpython-313.pyc b/cryptoai/agents/__pycache__/crypto_agent.cpython-313.pyc index 1a88d39..91ce613 100644 Binary files a/cryptoai/agents/__pycache__/crypto_agent.cpython-313.pyc and b/cryptoai/agents/__pycache__/crypto_agent.cpython-313.pyc differ diff --git a/cryptoai/agents/crypto_agent.py b/cryptoai/agents/crypto_agent.py index c44f60d..1240195 100644 --- a/cryptoai/agents/crypto_agent.py +++ b/cryptoai/agents/crypto_agent.py @@ -217,6 +217,87 @@ class CryptoAgent: 请确保回复为有效的JSON格式,分析要精准专业。""" + def analyze_symbol(self, symbol: str) -> Dict[str, Any]: + """ + 分析单个交易对 + """ + results = {} + + print(f"\n开始分析{symbol}...") + + # 获取并处理数据 + raw_data = self.fetch_historical_data(symbol, days=self.crypto_config['historical_days']) + + if not raw_data.empty: + processed_data = self.process_data(symbol, raw_data) + + # 准备市场数据 + market_data = { + "symbol": symbol, + "current_price": float(processed_data['close'].iloc[-1]), + # "price_change_24h": float(processed_data['close'].iloc[-1] - processed_data['close'].iloc[-24]), + # "price_change_percentage_24h": float((processed_data['close'].iloc[-1] - processed_data['close'].iloc[-24]) / processed_data['close'].iloc[-24] * 100), + "historical_prices": processed_data['close'].tail(100).tolist(), + "volumes": processed_data['volume'].tail(100).tolist(), + "technical_indicators": { + "rsi": float(processed_data['RSI'].iloc[-1]), + "macd": float(processed_data['MACD'].iloc[-1]), + "macd_signal": float(processed_data['MACD_Signal'].iloc[-1]), + "bollinger_upper": float(processed_data['Bollinger_Upper'].iloc[-1]), + "bollinger_lower": float(processed_data['Bollinger_Lower'].iloc[-1]), + "ma5": float(processed_data['MA5'].iloc[-1]), + "ma10": float(processed_data['MA10'].iloc[-1]), + "ma20": float(processed_data['MA20'].iloc[-1]), + "ma50": float(processed_data['MA50'].iloc[-1]), + "atr": float(processed_data['ATR'].iloc[-1]) + }, + "klines": processed_data[['open', 'high', 'low', 'close', 'volume']].tail(100).to_dict('records') + } + + # 将市场数据格式化为适合大模型的格式 + formatted_data = self._format_market_data(market_data) + + # 构建提示词 + prompt = self._build_market_analysis_prompt(formatted_data) + + # 调用API获取分析和交易建议 + response, usage = self.deepseek_api.call_model(prompt, task_type="交易分析", symbol=symbol) + + # 解析响应 + analysis_result = self.deepseek_api.extract_json_from_response(response) + + # 添加token使用信息 + if usage: + analysis_result["_token_usage"] = usage + + # 整合结果 + results[symbol] = { + "analysis": analysis_result, + "timestamp": datetime.now().isoformat() + } + + # 保存分析结果到数据库 + try: + # 保存到数据库 + saved = self.db_manager.save_analysis_result( + agent='crypto', + symbol=symbol, + time_interval=self.time_interval, + analysis_result=analysis_result + ) + if saved: + print(f"{symbol}分析结果已保存到数据库") + else: + print(f"{symbol}分析结果保存到数据库失败") + except Exception as e: + print(f"保存{symbol}分析结果到数据库时出错: {e}") + + print(f"{symbol}分析完成") + else: + print(f"跳过{symbol}分析,无法获取数据") + + return results + def analyze_all_symbols(self) -> Dict[str, Dict[str, Any]]: """ 分析所有支持的交易对 @@ -229,81 +310,13 @@ class CryptoAgent: for symbol in self.symbols: print(f"\n开始分析{symbol}...") - # 获取并处理数据 - raw_data = self.fetch_historical_data(symbol, days=self.crypto_config['historical_days']) - - if not raw_data.empty: - processed_data = self.process_data(symbol, raw_data) - - # 准备市场数据 - market_data = { - "symbol": symbol, - "current_price": float(processed_data['close'].iloc[-1]), - # "price_change_24h": float(processed_data['close'].iloc[-1] - processed_data['close'].iloc[-24]), - # "price_change_percentage_24h": float((processed_data['close'].iloc[-1] - processed_data['close'].iloc[-24]) / processed_data['close'].iloc[-24] * 100), - "historical_prices": processed_data['close'].tail(100).tolist(), - "volumes": processed_data['volume'].tail(100).tolist(), - "technical_indicators": { - "rsi": float(processed_data['RSI'].iloc[-1]), - "macd": float(processed_data['MACD'].iloc[-1]), - "macd_signal": float(processed_data['MACD_Signal'].iloc[-1]), - "bollinger_upper": float(processed_data['Bollinger_Upper'].iloc[-1]), - "bollinger_lower": float(processed_data['Bollinger_Lower'].iloc[-1]), - "ma5": float(processed_data['MA5'].iloc[-1]), - "ma10": float(processed_data['MA10'].iloc[-1]), - "ma20": float(processed_data['MA20'].iloc[-1]), - "ma50": float(processed_data['MA50'].iloc[-1]), - "atr": float(processed_data['ATR'].iloc[-1]) - }, - "klines": processed_data[['open', 'high', 'low', 'close', 'volume']].tail(100).to_dict('records') - } - - # 将市场数据格式化为适合大模型的格式 - formatted_data = self._format_market_data(market_data) - - # 构建提示词 - prompt = self._build_market_analysis_prompt(formatted_data) - - # 调用API获取分析和交易建议 - response, usage = self.deepseek_api.call_model(prompt, task_type="交易分析", symbol=symbol) - - # 解析响应 - analysis_result = self.deepseek_api.extract_json_from_response(response) - - # 添加token使用信息 - if usage: - analysis_result["_token_usage"] = usage - - # 整合结果 - results[symbol] = { - "analysis": analysis_result, - "timestamp": datetime.now().isoformat() - } - - # 保存分析结果到数据库 - try: - # 保存到数据库 - saved = self.db_manager.save_analysis_result( - agent='crypto', - symbol=symbol, - time_interval=self.time_interval, - analysis_result=analysis_result - ) - if saved: - print(f"{symbol}分析结果已保存到数据库") - else: - print(f"{symbol}分析结果保存到数据库失败") - except Exception as e: - print(f"保存{symbol}分析结果到数据库时出错: {e}") - - print(f"{symbol}分析完成") - else: - print(f"跳过{symbol}分析,无法获取数据") + single_result = self.analyze_symbol(symbol) + results[symbol] = single_result[symbol] return results - def run_analysis_cycle(self) -> Dict[str, Any]: + def run_analysis_cycle(self, symbol: Optional[str] = None) -> Dict[str, Any]: """ 运行一个完整的分析周期 @@ -312,7 +325,10 @@ class CryptoAgent: """ print(f"开始新的分析周期,时间:{datetime.now().isoformat()}") - results = self.analyze_all_symbols() + if symbol: + results = self.analyze_symbol(symbol) + else: + results = self.analyze_all_symbols() # 保存分析结果 timestamp = datetime.now().strftime("%Y%m%d%H%M%S") @@ -343,7 +359,7 @@ class CryptoAgent: 把分析的JSON结果调用大模型转化成交易建议 """ prompt = f""" - 请对以下加密货币市场分析的JSON结果进行深入分析, 转化成包含:分析时间,技术分析,支撑位,压力位, 建议买点,卖点,止损位,止盈位,仓位建议, 增加适当的emoji便于阅读, 简单明了。 + 请对以下加密货币市场分析的JSON结果进行深入分析, 转化成包含:分析时间,分析时间级别,技术分析,支撑位,压力位, 建议买点,卖点,止损位,止盈位,仓位建议, 增加适当的emoji便于阅读, 简单明了。 分析 JSON 结果: {results} @@ -392,7 +408,7 @@ class CryptoAgent: except Exception as e: print(f"导出 token 使用情况时出错: {e}") - def start_agent(self) -> None: + def start_agent(self, symbol: Optional[str] = None) -> None: """ 启动智能体 @@ -402,11 +418,13 @@ class CryptoAgent: print("启动加密货币分析智能体...") try: - self.run_analysis_cycle() + if symbol: + self.run_analysis_cycle(symbol) + else: + self.run_analysis_cycle() # 导出最终的token使用情况 self._export_token_usage() - except KeyboardInterrupt: print("\n智能体已停止") # 导出最终的token使用情况 diff --git a/cryptoai/agents/gold_agent.py b/cryptoai/agents/gold_agent.py index 59029dd..2dc8fac 100644 --- a/cryptoai/agents/gold_agent.py +++ b/cryptoai/agents/gold_agent.py @@ -276,7 +276,7 @@ class GoldAgent: "seasonal_factor": float(processed_data['seasonal_factor'].iloc[-1]), "gold_bull_signal": float(processed_data['gold_bull_signal'].iloc[-1]) }, - "klines": processed_data[['open', 'high', 'low', 'close', 'volume']].tail(30).to_dict('records') + "klines": processed_data[['open', 'high', 'low', 'close', 'volume']].tail(100).to_dict('records') } # 将市场数据格式化为适合大模型的格式 @@ -331,8 +331,35 @@ class GoldAgent: # 导出 DeepSeek API token 使用情况 self._export_token_usage() - - return results + + # 把分析的JSON结果调用大模型转化成交易建议 + trading_suggestions = self.convert_analysis_to_trading_suggestions(results) + print(f"交易建议:{trading_suggestions}") + + if self.dingtalk_bot: + self.dingtalk_bot.send_markdown(title="黄金交易建议", text=trading_suggestions) + + return results, trading_suggestions + + def convert_analysis_to_trading_suggestions(self, results: Dict[str, Any]) -> str: + """ + 把分析的JSON结果调用大模型转化成交易建议 + """ + prompt = f""" + 请对以下黄金市场分析的JSON结果进行深入分析, 转化成包含:分析时间,技术分析,支撑位,压力位, 建议买点,卖点,止损位,止盈位,仓位建议, 增加适当的emoji便于阅读, 简单明了。 + + 分析 JSON 结果: + {results} + """ + + system_prompt = """ + 你是一个专业的黄金分析助手,你擅长分析市场趋势、预测价格走向和提供交易建议,请始终使用中文回复,并确保输出格式规范的Markdown。 + """ + response, usage = self.deepseek_api.call_model(prompt, system_prompt=system_prompt, task_type="交易建议") + + message = self.deepseek_api.extract_text_from_response(response) + + return message def _export_token_usage(self) -> None: """ diff --git a/cryptoai/config/config.yaml b/cryptoai/config/config.yaml index a96c0da..abd1052 100644 --- a/cryptoai/config/config.yaml +++ b/cryptoai/config/config.yaml @@ -25,13 +25,13 @@ alltick: # 加密货币设置 crypto: base_currencies: - - "BTC" - - "ETH" + # - "BTC" + # - "ETH" # - "SOL" # - "SUI" - # - "XRP" + - "CETUS" quote_currency: "USDT" - time_interval: "1h" # 可选: 1m, 5m, 15m, 30m, 1h, 4h, 1d + time_interval: "4h" # 可选: 1m, 5m, 15m, 30m, 1h, 4h, 1d historical_days: 30 # 黄金市场分析配置 @@ -39,9 +39,9 @@ gold: # 黄金交易对 symbols: ["GOLD"] # 历史数据天数 - historical_days: 180 + historical_days: 30 # 时间间隔 - time_interval: "1d" + time_interval: "4h" # 数据设置 diff --git a/cryptoai/main.py b/cryptoai/main.py index ce50da3..76c5685 100644 --- a/cryptoai/main.py +++ b/cryptoai/main.py @@ -18,7 +18,7 @@ from cryptoai.utils.config_loader import ConfigLoader def main(): try: - print("程序启动") + print("定时程序启动") # 设置每个4小时运行一次 schedule.every(4).hours.do(CryptoAgent().start_agent) @@ -26,7 +26,10 @@ def main(): while True: schedule.run_pending() time.sleep(1) - # CryptoAgent().start_agent() + + + # GoldAgent().start_agent() + # CryptoAgent().start_agent('BTCUSDT') except KeyboardInterrupt: print("\n程序已退出") diff --git a/requirements.txt b/requirements.txt index 475b634..ccbe800 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,4 +4,4 @@ numpy==1.24.3 sqlalchemy==2.0.19 pymysql==1.1.0 requests==2.31.0 -schedule==1.2.0 \ No newline at end of file +schedule==1.2.0