diff --git a/config_examples/freqaiprimer.json b/config_examples/freqaiprimer.json index 24d8fa16..ad3a6b2c 100644 --- a/config_examples/freqaiprimer.json +++ b/config_examples/freqaiprimer.json @@ -123,7 +123,8 @@ "bagging_fraction": 0.8, "bagging_freq": 5, "verbose": -1 - } + }, + "ml_prediction_api_url": "http://pairlist.xl.home/api/mlprediction" }, "api_server": { "enabled": true, diff --git a/freqtrade/templates/freqaiprimer.py b/freqtrade/templates/freqaiprimer.py index 996257e6..88940f5f 100644 --- a/freqtrade/templates/freqaiprimer.py +++ b/freqtrade/templates/freqaiprimer.py @@ -831,15 +831,64 @@ class FreqaiPrimer(IStrategy): pred_values[col] = round(float(last_row[col]), 4) if pred_values: - pred_info = ", ".join([f"{k}:{v}" for k, v in pred_values.items()]) - self.strategy_log(f"[{metadata['pair']}] FreqAI多目标预测: {pred_info}") - - # 特别记录三个主要目标变量 - entry_val = pred_values.get('&s-entry_signal', 'N/A') - exit_val = pred_values.get('&s-exit_signal', 'N/A') - vol_val = pred_values.get('&s-future_volatility', 'N/A') - - self.strategy_log(f"[{metadata['pair']}] FreqAI三目标预测 - 入场:{entry_val}, 出场:{exit_val}, 波动率:{vol_val}") + pred_info = ", ".join([f"{k}:{v}" for k, v in pred_values.items()]) + self.strategy_log(f"[{metadata['pair']}] FreqAI多目标预测: {pred_info}") + + # 特别记录三个主要目标变量 + entry_val = pred_values.get('&s-entry_signal', 'N/A') + exit_val = pred_values.get('&s-exit_signal', 'N/A') + vol_val = pred_values.get('&s-future_volatility', 'N/A') + + self.strategy_log(f"[{metadata['pair']}] FreqAI三目标预测 - 入场:{entry_val}, 出场:{exit_val}, 波动率:{vol_val}") + + # ========== 新增:发送HTTP请求 ========== + # 从配置中读取API URL + api_url = self.config.get('freqai', {}).get('ml_prediction_api_url', '') + if api_url: + import json + import urllib.request + import urllib.error + import os + + # 从环境变量获取virtualHostName + virtual_host_name = os.environ.get('VIRTUAL_HOST_NAME') + + # 只有正确获取到virtualHostName时才发送请求 + if virtual_host_name and virtual_host_name != 'default-vhost': + # 准备请求数据 + request_data = { + "hostName": "freqtrade-live-c6b6f357-20260215212649", + "virtualHostName": virtual_host_name, + "pairName": metadata['pair'], + "timestamp": int(last_row['date'].timestamp()), + "values": { + "&s-entry_signal": pred_values.get('&s-entry_signal', 0), + "&s-exit_signal": pred_values.get('&s-exit_signal', 0), + "&s-future_volatility": pred_values.get('&s-future_volatility', 0) + } + } + + # 转换为JSON + json_data = json.dumps(request_data).encode('utf-8') + + # 发送请求 + try: + req = urllib.request.Request(api_url, data=json_data, method='POST') + req.add_header('Content-Type', 'application/json') + with urllib.request.urlopen(req, timeout=5) as response: + status_code = response.getcode() + if status_code == 200: + self.strategy_log(f"[{metadata['pair']}] 成功发送ML预测数据到API (virtualHostName: {virtual_host_name})") + else: + self.strategy_log(f"[{metadata['pair']}] 发送ML预测数据失败,状态码: {status_code}") + except urllib.error.URLError as e: + self.strategy_log(f"[{metadata['pair']}] 发送ML预测数据网络错误: {str(e)}") + except Exception as e: + self.strategy_log(f"[{metadata['pair']}] 发送ML预测数据其他错误: {str(e)}") + else: + self.strategy_log(f"[{metadata['pair']}] 未正确获取到virtualHostName,跳过发送ML预测数据") + else: + self.strategy_log(f"[{metadata['pair']}] ML预测API URL未配置,跳过发送") except Exception as e: self.strategy_log(f"[{metadata['pair']}] 记录FreqAI预测结果时出错: {str(e)}") diff --git a/tools/live.sh b/tools/live.sh index 6fded23f..d6e37509 100755 --- a/tools/live.sh +++ b/tools/live.sh @@ -336,11 +336,12 @@ echo "正在启动新容器..." >&2 # 获取当前主机名 VIRTUAL_HOST_NAME=$(hostname) +echo "获取到宿主机虚机名: $VIRTUAL_HOST_NAME" >&2 # 临时禁用 set -e,以便捕获 docker run 的错误 set +e docker run -d --restart=always \ - -e virtualhost-name="$VIRTUAL_HOST_NAME" \ + -e VIRTUAL_HOST_NAME="$VIRTUAL_HOST_NAME" \ --name "${CONTAINER_NAME}" \ -p 8080:8080 \ -e TZ=Asia/Shanghai \