326 lines
8.5 KiB
Markdown
326 lines
8.5 KiB
Markdown
# Freqtrade 实盘部署全流程
|
||||
|
|
|
|||
|
|
从零部署 Freqtrade 交易机器人到 Vultr 服务器,运行 OKX USDT-M 永续合约实盘交易。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 1. 服务器信息
|
|||
|
|
|
|||
|
|
| 项目 | 详情 |
|
|||
|
|
|------|------|
|
|||
|
|
| 服务商 | Vultr |
|
|||
|
|
| IP | `104.156.239.5` |
|
|||
|
|
| 系统 | Ubuntu 22.04 |
|
|||
|
|
| 配置 | 2 vCPU / 2GB RAM / 61GB SSD |
|
|||
|
|
| 部署路径 | `/opt/freqtrade/` |
|
|||
|
|
| SSH 用户 | `root` |
|
|||
|
|
| SSH 密钥 | 本机 `~/.ssh/id_rsa` |
|
|||
|
|
| 跳板 | 通过阿里云 ecs 跳板(ProxyJump) |
|
|||
|
|
|
|||
|
|
### SSH 配置
|
|||
|
|
|
|||
|
|
在本机 `~/.ssh/config` 中添加:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
Host vultr
|
|||
|
|
HostName 104.156.239.5
|
|||
|
|
User root
|
|||
|
|
IdentityFile ~/.ssh/id_rsa
|
|||
|
|
IdentitiesOnly yes
|
|||
|
|
ProxyJump ecs
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
连接命令:`ssh vultr`
|
|||
|
|
|
|||
|
|
### 端口
|
|||
|
|
|
|||
|
|
| 端口 | 用途 |
|
|||
|
|
|------|------|
|
|||
|
|
| 22 | SSH |
|
|||
|
|
| 8080 | Freqtrade API Server / freqUI |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 2. 前置依赖安装
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 更新系统
|
|||
|
|
ssh vultr "apt update && apt install -y software-properties-common"
|
|||
|
|
|
|||
|
|
# 安装 Python 3.12(Ubuntu 22.04 默认 3.10 不满足 freqtrade >=3.11)
|
|||
|
|
ssh vultr "add-apt-repository -y ppa:deadsnakes/ppa && apt install -y python3.12 python3.12-venv python3.12-dev"
|
|||
|
|
|
|||
|
|
# 安装构建依赖
|
|||
|
|
ssh vultr "apt install -y build-essential git curl"
|
|||
|
|
|
|||
|
|
# 配置防火墙
|
|||
|
|
ssh vultr "ufw allow 22/tcp && ufw allow 8080/tcp"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 3. 部署 Freqtrade
|
|||
|
|
|
|||
|
|
### 3.1 克隆仓库
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 方式一:从 Gitea 克隆(推荐)
|
|||
|
|
ssh vultr "git clone https://git.looq.fun/liam/freqtrade-deploy.git /opt/freqtrade"
|
|||
|
|
|
|||
|
|
# 方式二:从本机 scp 推送
|
|||
|
|
scp -o ProxyJump=ecs -r /root/agents/freqtrade vultr:/opt/freqtrade
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3.2 创建虚拟环境并安装
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
ssh vultr "cd /opt/freqtrade && python3.12 -m venv .venv && .venv/bin/pip install -e ."
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3.3 安装 freqUI
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
ssh vultr "cd /opt/freqtrade && .venv/bin/freqtrade install-ui"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 4. 配置
|
|||
|
|
|
|||
|
|
### 4.1 部署策略文件
|
|||
|
|
|
|||
|
|
将策略文件推送到服务器:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
scp -o ProxyJump=ecs user_data/strategies/multi_asset_channel_breakout_v5.py \
|
|||
|
|
vultr:/opt/freqtrade/user_data/strategies/
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 4.2 配置 config.json
|
|||
|
|
|
|||
|
|
在 `/opt/freqtrade/user_data/config.json` 中配置以下关键项:
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"max_open_trades": 2,
|
|||
|
|
"stake_currency": "USDT",
|
|||
|
|
"stake_amount": "unlimited",
|
|||
|
|
"tradable_balance_ratio": 0.99,
|
|||
|
|
"dry_run": false,
|
|||
|
|
"timeframe": "15m",
|
|||
|
|
"stoploss": -0.80,
|
|||
|
|
"trading_mode": "futures",
|
|||
|
|
"margin_mode": "isolated",
|
|||
|
|
"exchange": {
|
|||
|
|
"name": "okx",
|
|||
|
|
"key": "e756108d-f14c-4777-8351-cd989f389dd2",
|
|||
|
|
"secret": "BC4579AEE9816ED4A38218910B6EC278",
|
|||
|
|
"password": "30l9L666.",
|
|||
|
|
"ccxt_config": {"hostname": "www.okx.cab"},
|
|||
|
|
"ccxt_async_config": {"hostname": "www.okx.cab"},
|
|||
|
|
"pair_whitelist": ["BTC/USDT:USDT", "ETH/USDT:USDT"]
|
|||
|
|
},
|
|||
|
|
"pairlists": [{"method": "StaticPairList"}],
|
|||
|
|
"api_server": {
|
|||
|
|
"enabled": true,
|
|||
|
|
"listen_ip_address": "0.0.0.0",
|
|||
|
|
"listen_port": 8080,
|
|||
|
|
"username": "liam",
|
|||
|
|
"password": "30l9L666"
|
|||
|
|
},
|
|||
|
|
"webhook": {
|
|||
|
|
"enabled": true,
|
|||
|
|
"url": "https://open.feishu.cn/open-apis/bot/v2/hook/2b1bc9a6-b470-447f-b783-1b253dcf522c"
|
|||
|
|
},
|
|||
|
|
"strategy": "MultiAssetChannelBreakoutV5",
|
|||
|
|
"strategy_path": "user_data/strategies/",
|
|||
|
|
"initial_state": "running"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**OKX API Key 说明:**
|
|||
|
|
- key: `e756108d-f14c-4777-8351-cd989f389dd2`
|
|||
|
|
- secret: `BC4579AEE9816ED4A38218910B6EC278`
|
|||
|
|
- password: `30l9L666.`
|
|||
|
|
- hostname: `www.okx.cab`(OKX 国内加速域名,非 `www.okx.com`)
|
|||
|
|
- 该 key 无 IP 限制(`ip: "0"`),任何服务器都能用
|
|||
|
|
|
|||
|
|
**freqUI 登录:**
|
|||
|
|
- 地址:`http://104.156.239.5:8080/`
|
|||
|
|
- 用户名:`liam`
|
|||
|
|
- 密码:`30l9L666`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 5. Systemd 服务
|
|||
|
|
|
|||
|
|
### 5.1 创建服务文件
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
ssh vultr "cat > /etc/systemd/system/freqtrade.service << 'EOF'
|
|||
|
|
[Unit]
|
|||
|
|
Description=Freqtrade Trading Bot
|
|||
|
|
After=network-online.target
|
|||
|
|
Wants=network-online.target
|
|||
|
|
|
|||
|
|
[Service]
|
|||
|
|
Type=simple
|
|||
|
|
User=root
|
|||
|
|
WorkingDirectory=/opt/freqtrade
|
|||
|
|
ExecStart=/opt/freqtrade/.venv/bin/freqtrade trade -c user_data/config.json
|
|||
|
|
Restart=on-failure
|
|||
|
|
RestartSec=10
|
|||
|
|
|
|||
|
|
[Install]
|
|||
|
|
WantedBy=multi-user.target
|
|||
|
|
EOF"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 5.2 启用并启动
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
ssh vultr "systemctl daemon-reload && systemctl enable freqtrade && systemctl start freqtrade"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 6. 验证部署
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 1. 检查服务状态
|
|||
|
|
ssh vultr "systemctl status freqtrade --no-pager"
|
|||
|
|
|
|||
|
|
# 2. 检查 API 响应
|
|||
|
|
curl -s http://104.156.239.5:8080/api/v1/ping
|
|||
|
|
# 应返回: {"status":"pong"}
|
|||
|
|
|
|||
|
|
# 3. 检查策略加载
|
|||
|
|
ssh vultr "journalctl -u freqtrade --no-pager -n 30 | grep -E 'strategy|timeframe|RUNNING'"
|
|||
|
|
|
|||
|
|
# 4. 检查交易对白名单
|
|||
|
|
ssh vultr "journalctl -u freqtrade --no-pager | grep 'Whitelist with'"
|
|||
|
|
|
|||
|
|
# 5. 访问 Web UI
|
|||
|
|
open http://104.156.239.5:8080/
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 7. 运维命令
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 查看服务状态
|
|||
|
|
ssh vultr "systemctl status freqtrade --no-pager"
|
|||
|
|
|
|||
|
|
# 查看实时日志
|
|||
|
|
ssh vultr "journalctl -u freqtrade.service -f"
|
|||
|
|
|
|||
|
|
# 查看最近 50 行日志
|
|||
|
|
ssh vultr "journalctl -u freqtrade.service --no-pager -n 50"
|
|||
|
|
|
|||
|
|
# 重启服务(部署新策略或修改配置后)
|
|||
|
|
ssh vultr "systemctl restart freqtrade"
|
|||
|
|
|
|||
|
|
# 停止服务
|
|||
|
|
ssh vultr "systemctl stop freqtrade"
|
|||
|
|
|
|||
|
|
# 查看交易记录(SQLite)
|
|||
|
|
ssh vultr "cd /opt/freqtrade && python3 -c \"
|
|||
|
|
import sqlite3
|
|||
|
|
conn = sqlite3.connect('tradesv3.sqlite')
|
|||
|
|
conn.row_factory = sqlite3.Row
|
|||
|
|
rows = conn.execute('SELECT id,pair,open_rate,close_rate,close_profit_abs,exit_reason FROM trades ORDER BY id').fetchall()
|
|||
|
|
for r in rows:
|
|||
|
|
print(dict(r))
|
|||
|
|
conn.close()
|
|||
|
|
\""
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 8. 当前线上配置摘要
|
|||
|
|
|
|||
|
|
| 配置项 | 值 |
|
|||
|
|
|--------|------|
|
|||
|
|
| 策略 | MultiAssetChannelBreakoutV5 |
|
|||
|
|
| 交易所 | OKX |
|
|||
|
|
| 交易模式 | USDT-M 永续合约 / 逐仓 |
|
|||
|
|
| 币对 | BTC/USDT, ETH/USDT |
|
|||
|
|
| 时间周期 | 15m |
|
|||
|
|
| 杠杆 | 10x(策略内固定) |
|
|||
|
|
| 最大持仓 | 2 |
|
|||
|
|
| 硬止损 | -80%(config 与策略 `stoploss=-0.80` 一致;10x 杠杆下=价格 -8%) |
|
|||
|
|
| 资金量 | unlimited(全仓比例 99%) |
|
|||
|
|
| API Server | 0.0.0.0:8080 |
|
|||
|
|
| 飞书 Webhook | 已启用 |
|
|||
|
|
| UI | FreqUI |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 9. 策略说明(MultiAssetChannelBreakoutV5)
|
|||
|
|
|
|||
|
|
### 9.1 核心逻辑
|
|||
|
|
|
|||
|
|
| 模块 | 说明 |
|
|||
|
|
|------|------|
|
|||
|
|
| 指标 | ATR(10) 波动率 + SMA 长均线 + 通道上下轨 + ADX(14) 动量 |
|
|||
|
|
| 入场 | 收盘价突破动态上轨 **且** 在长均线上方 **且** ADX > 28 |
|
|||
|
|
| 入场确认 | 实时下单防追高(偏离信号 K 线收盘价 >1% 取消)+ 防假突破(价格不低于信号 K 线均线和上轨) |
|
|||
|
|
| 出场 | 收盘价跌破动态退出线(下轨 + ATR × 0.19) |
|
|||
|
|
| 止损 | 分段:盈利 >5% 保本、>15% 允许 10% 回撤、>30% 允许 10% 回撤,其余靠 -8% 硬止损 |
|
|||
|
|
| 杠杆 | 固定 10x |
|
|||
|
|
|
|||
|
|
### 9.2 关键参数
|
|||
|
|
|
|||
|
|
| 参数 | 默认值 | 说明 |
|
|||
|
|
|------|--------|------|
|
|||
|
|
| `up_line_span` | 340 | 上轨窗口(15m K 线数,约 3.5 天) |
|
|||
|
|
| `up_line_offset` | -0.18 | 上轨 ATR 偏移(负值=上轨低于最高点,降低入场门槛) |
|
|||
|
|
| `buy_stop_profit_span` | 141 | 下轨窗口 |
|
|||
|
|
| `buy_stop_profit_offset` | 0.19 | 下轨 ATR 偏移 |
|
|||
|
|
| `ma_span_long_days` | 2 | 长均线天数(2×96=192 根 15m K 线) |
|
|||
|
|
| `adx_threshold` | 28 | 动量过滤阈值 |
|
|||
|
|
| `startup_candle_count` | 600 | 预热 K 线数 |
|
|||
|
|
|
|||
|
|
### 9.3 策略文件位置
|
|||
|
|
|
|||
|
|
| 位置 | 文件 |
|
|||
|
|
|------|------|
|
|||
|
|
| 本地 | `user_data/strategies/multi_asset_channel_breakout_v5.py` |
|
|||
|
|
| 服务器 | `/opt/freqtrade/user_data/strategies/multi_asset_channel_breakout_v5.py` |
|
|||
|
|
| 备份 | `skills/core/` |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 10. 更换策略流程
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 1. 修改策略文件
|
|||
|
|
# 本地编辑 user_data/strategies/xxx.py
|
|||
|
|
|
|||
|
|
# 2. 推送到服务器
|
|||
|
|
scp -o ProxyJump=ecs user_data/strategies/xxx.py vultr:/opt/freqtrade/user_data/strategies/
|
|||
|
|
|
|||
|
|
# 3. 修改 config.json 中的 strategy 名称和 timeframe
|
|||
|
|
ssh vultr "sed -i 's/\"strategy\": \"旧策略\"/\"strategy\": \"新策略\"/' /opt/freqtrade/user_data/config.json"
|
|||
|
|
|
|||
|
|
# 4. 重启服务
|
|||
|
|
ssh vultr "systemctl restart freqtrade"
|
|||
|
|
|
|||
|
|
# 5. 验证
|
|||
|
|
ssh vultr "journalctl -u freqtrade --no-pager -n 20 | grep -E 'strategy|RUNNING|Error'"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 11. 注意事项
|
|||
|
|
|
|||
|
|
- **SSH 跳板**:必须通过 `ProxyJump ecs` 走阿里云跳板,直连 Vultr 会超时
|
|||
|
|
- **Python 版本**:Ubuntu 22.04 默认 3.10,必须装 3.12
|
|||
|
|
- **OKX hostname**:用 `www.okx.cab` 而非 `www.okx.com`,国内访问 okx.com 受限
|
|||
|
|
- **时区**:服务器保持 UTC,所有交易所时间戳和 freqtrade 内部均用 UTC
|
|||
|
|
- **Warmup**:策略启动时通过 REST 拉取历史 K 线(startup_candle_count=600),约 3 次 API 调用,完成后图表立即可用
|
|||
|
|
- **仅做多**:`can_short = False`
|
|||
|
|
- **ROI 禁用**:`minimal_roi = {"0": 100}`,全部由信号出场和 custom_stoploss 处理
|
|||
|
|
- **服务自恢复**:`Restart=on-failure` + `RestartSec=10`,进程崩溃 10 秒后自动重启
|