增加一键部署脚本
This commit is contained in:
+79
-79
@@ -1,79 +1,79 @@
|
||||
# 界面与风控更新说明(OKX 实例)
|
||||
|
||||
与 Gate / Binance 主站对齐的列表窗、统计分品类、交易记录展示、复盘与移动保本交易所同步;OKX 仍为 **三页导航**(交易执行 / 记录复盘 / 统计),关键位监控合并在 **交易执行** 页,**无** Gate 独立「关键位监控」页与斐波限价监控。
|
||||
|
||||
## 顶栏导航(3 项)
|
||||
|
||||
| 顺序 | 名称 | 路由 | 说明 |
|
||||
|------|------|------|------|
|
||||
| 1 | 交易执行 | `/trade` | 关键位监控 + 实盘下单(**默认首页** `/` → `/trade`) |
|
||||
| 2 | 交易记录与复盘 | `/records` | 交易记录、复盘表单、AI 历史(受顶栏 UTC 时间窗筛选) |
|
||||
| 3 | 统计分析 | `/stats` | 按北京时间交易日切日 + 分品类统计块 |
|
||||
|
||||
## 列表时间窗(UTC,全站顶栏)
|
||||
|
||||
共用模块:仓库根目录 `history_window_lib.py`(与 Gate / Binance 一致)。
|
||||
|
||||
| 项 | 说明 |
|
||||
|----|------|
|
||||
| 默认 | **UTC 当日**(`win_preset=utc_today`) |
|
||||
| 可选 | 近 24 小时、近 7 天、自定义起止(UTC) |
|
||||
| 作用范围 | 关键位历史、交易记录列表、复盘 API、AI 历史 API、导出「交易记录」「关键位历史」 |
|
||||
| 与统计 | **仅影响列表/导出**;统计页仍按北京时间 `TRADING_DAY_RESET_HOUR`(默认 8:00)切日 |
|
||||
| 切换 | 顶栏「列表筛选(UTC)」→ 应用(保留当前路由 query) |
|
||||
|
||||
## 交易记录与复盘
|
||||
|
||||
- 列表 **止损(开仓)**:展示 `initial_stop_loss` 快照(`display_open_stop_loss`)。
|
||||
- 类型列显示 `monitor_type` 与 `key_signal_type`(若有)。
|
||||
- 平仓入库:`stop_loss` / `initial_stop_loss` 为开仓止损快照;机器单 `entry_reason` 可按 `key_signal_type` 自动映射(箱体突破 / 收敛突破 → 四条固定关键位开仓类型文案)。
|
||||
- 复盘:开仓类型下拉含四条关键位固定文案 +「其他」;离场触发含 **「止盈」**;从交易记录填入时按结果与信号预填。
|
||||
- 复盘 K 线图:以 **平仓时间** 为锚点向前约 `ORDER_CHART_LIMIT`(默认 100)根(`_fetch_ohlcv_ending_at`)。
|
||||
- `/api/journals`、`/api/reviews` 与顶栏 UTC 窗一致。
|
||||
|
||||
### 导出(交易记录 v3)
|
||||
|
||||
- 文件名:`trade_records_v3_YYYYMMDD.csv`
|
||||
- 含 `key_signal_type`、`initial_stop_loss`、计划/实际 RR、`risk_amount` 等;末列「开仓类型」为有效展示文案。
|
||||
- 受 UTC 列表窗限制;关键位历史导出同理。
|
||||
|
||||
## 实盘下单(交易执行页)
|
||||
|
||||
- **移动保本**:表单可勾选「启用移动保本」;触发阶梯上移后 **先撤后挂** 交易所 TP/SL(`replace_active_monitor_tpsl_on_exchange`),仅成功后才写库;企业微信提示含「交易所:已先撤后挂止盈止损」。未配置实盘 API 时仅更新本地止损。
|
||||
- 开仓 TP/SL 仍通过 OKX `attachAlgoOrds`(与原有逻辑一致);重挂使用 ccxt `stopLoss` / `takeProfit` 参数,触发价经 `_okx_algo_trigger_price_str` 格式化。
|
||||
|
||||
## 统计分析页(`/stats`)
|
||||
|
||||
| 项 | 说明 |
|
||||
|----|------|
|
||||
| 切日 | 北京时间;边界 = `TRADING_DAY_RESET_HOUR:00`(默认 8) |
|
||||
| 品类下拉 | 全部交易、下单监控、关键位箱体突破、关键位收敛结构、关键位斐波0.618、关键位斐波0.786 |
|
||||
| URL | `stats_segment=`(`all` / `manual` / `key_box` / `key_conv` / `key_fib618` / `key_fib786`) |
|
||||
| 与 UTC 窗 | 统计 **不** 随顶栏列表窗变化 |
|
||||
|
||||
## 斐波关键位监控(与 Gate / Binance 对齐)
|
||||
|
||||
| 项 | 说明 |
|
||||
|----|------|
|
||||
| 类型 | **斐波回调0.618**、**斐波回调0.786**(交易执行页关键位表单) |
|
||||
| 同币互斥 | 每币仅一条斐波监控 |
|
||||
| 挂单价 E | 做多 `E = H − ratio×(H−L)`;做空 `E = L + ratio×(H−L)`;SL/TP 为 L/H |
|
||||
| 添加后 | 立即在 OKX 挂限价单;卡片显示 **挂E**、限价单 ID |
|
||||
| 失效 | 标记价触达止盈侧且限价未成交 → 仅撤本条限价单(`cancel_fib_limit_order`) |
|
||||
| 成交后 | 挂交易所 TP/SL → 写入 `order_monitors`(`monitor_type=关键位监控`,`key_signal_type=斐波回调…`)→ 从关键位表移除 |
|
||||
| 轮询 | `check_fib_key_monitors()`(与箱体/收敛 `check_key_monitors()` 分离) |
|
||||
| 盈亏比 | 计划 RR 须 > `KEY_AUTO_MIN_PLANNED_RR`(默认 1.5) |
|
||||
| 日成交量 | 排名前 `KEY_DAILY_VOLUME_RANK_MAX`(默认 30) |
|
||||
|
||||
计算逻辑见仓库根目录 `fib_key_monitor_lib.py`。
|
||||
|
||||
## 与 Gate 的差异(其余)
|
||||
|
||||
- 无独立「关键位监控」导航页(斐波在 **交易执行** 页添加)。
|
||||
- 无交易所已实现盈亏同步(`/api/sync_exchange_pnl`)。
|
||||
- 箱体/收敛仍为 **提醒** 模式,不自动市价开仓(Gate/Binance 主站为自动开仓)。
|
||||
|
||||
## 配置与部署
|
||||
|
||||
- 详见 `.env.example` 中 OKX(`OKX_*`)与通用风控项。
|
||||
- 代码更新后请 **重启 OKX 监控进程**;旧库行不做批量回填,展示字段有则用之、无则回退。
|
||||
# 界面与风控更新说明(OKX 实例)
|
||||
|
||||
与 Gate / Binance 主站对齐的列表窗、统计分品类、交易记录展示、复盘与移动保本交易所同步;OKX 仍为 **三页导航**(交易执行 / 记录复盘 / 统计),关键位监控合并在 **交易执行** 页,**无** Gate 独立「关键位监控」页与斐波限价监控。
|
||||
|
||||
## 顶栏导航(3 项)
|
||||
|
||||
| 顺序 | 名称 | 路由 | 说明 |
|
||||
|------|------|------|------|
|
||||
| 1 | 交易执行 | `/trade` | 关键位监控 + 实盘下单(**默认首页** `/` → `/trade`) |
|
||||
| 2 | 交易记录与复盘 | `/records` | 交易记录、复盘表单、AI 历史(受顶栏 UTC 时间窗筛选) |
|
||||
| 3 | 统计分析 | `/stats` | 按北京时间交易日切日 + 分品类统计块 |
|
||||
|
||||
## 列表时间窗(UTC,全站顶栏)
|
||||
|
||||
共用模块:仓库根目录 `history_window_lib.py`(与 Gate / Binance 一致)。
|
||||
|
||||
| 项 | 说明 |
|
||||
|----|------|
|
||||
| 默认 | **UTC 当日**(`win_preset=utc_today`) |
|
||||
| 可选 | 近 24 小时、近 7 天、自定义起止(UTC) |
|
||||
| 作用范围 | 关键位历史、交易记录列表、复盘 API、AI 历史 API、导出「交易记录」「关键位历史」 |
|
||||
| 与统计 | **仅影响列表/导出**;统计页仍按北京时间 `TRADING_DAY_RESET_HOUR`(默认 8:00)切日 |
|
||||
| 切换 | 顶栏「列表筛选(UTC)」→ 应用(保留当前路由 query) |
|
||||
|
||||
## 交易记录与复盘
|
||||
|
||||
- 列表 **止损(开仓)**:展示 `initial_stop_loss` 快照(`display_open_stop_loss`)。
|
||||
- 类型列显示 `monitor_type` 与 `key_signal_type`(若有)。
|
||||
- 平仓入库:`stop_loss` / `initial_stop_loss` 为开仓止损快照;机器单 `entry_reason` 可按 `key_signal_type` 自动映射(箱体突破 / 收敛突破 → 四条固定关键位开仓类型文案)。
|
||||
- 复盘:开仓类型下拉含四条关键位固定文案 +「其他」;离场触发含 **「止盈」**;从交易记录填入时按结果与信号预填。
|
||||
- 复盘 K 线图:以 **平仓时间** 为锚点向前约 `ORDER_CHART_LIMIT`(默认 100)根(`_fetch_ohlcv_ending_at`)。
|
||||
- `/api/journals`、`/api/reviews` 与顶栏 UTC 窗一致。
|
||||
|
||||
### 导出(交易记录 v3)
|
||||
|
||||
- 文件名:`trade_records_v3_YYYYMMDD.csv`
|
||||
- 含 `key_signal_type`、`initial_stop_loss`、计划/实际 RR、`risk_amount` 等;末列「开仓类型」为有效展示文案。
|
||||
- 受 UTC 列表窗限制;关键位历史导出同理。
|
||||
|
||||
## 实盘下单(交易执行页)
|
||||
|
||||
- **移动保本**:表单可勾选「启用移动保本」;触发阶梯上移后 **先撤后挂** 交易所 TP/SL(`replace_active_monitor_tpsl_on_exchange`),仅成功后才写库;企业微信提示含「交易所:已先撤后挂止盈止损」。未配置实盘 API 时仅更新本地止损。
|
||||
- 开仓 TP/SL 仍通过 OKX `attachAlgoOrds`(与原有逻辑一致);重挂使用 ccxt `stopLoss` / `takeProfit` 参数,触发价经 `_okx_algo_trigger_price_str` 格式化。
|
||||
|
||||
## 统计分析页(`/stats`)
|
||||
|
||||
| 项 | 说明 |
|
||||
|----|------|
|
||||
| 切日 | 北京时间;边界 = `TRADING_DAY_RESET_HOUR:00`(默认 8) |
|
||||
| 品类下拉 | 全部交易、下单监控、关键位箱体突破、关键位收敛结构、关键位斐波0.618、关键位斐波0.786 |
|
||||
| URL | `stats_segment=`(`all` / `manual` / `key_box` / `key_conv` / `key_fib618` / `key_fib786`) |
|
||||
| 与 UTC 窗 | 统计 **不** 随顶栏列表窗变化 |
|
||||
|
||||
## 斐波关键位监控(与 Gate / Binance 对齐)
|
||||
|
||||
| 项 | 说明 |
|
||||
|----|------|
|
||||
| 类型 | **斐波回调0.618**、**斐波回调0.786**(交易执行页关键位表单) |
|
||||
| 同币互斥 | 每币仅一条斐波监控 |
|
||||
| 挂单价 E | 做多 `E = H − ratio×(H−L)`;做空 `E = L + ratio×(H−L)`;SL/TP 为 L/H |
|
||||
| 添加后 | 立即在 OKX 挂限价单;卡片显示 **挂E**、限价单 ID |
|
||||
| 失效 | 标记价触达止盈侧且限价未成交 → 仅撤本条限价单(`cancel_fib_limit_order`) |
|
||||
| 成交后 | 挂交易所 TP/SL → 写入 `order_monitors`(`monitor_type=关键位监控`,`key_signal_type=斐波回调…`)→ 从关键位表移除 |
|
||||
| 轮询 | `check_fib_key_monitors()`(与箱体/收敛 `check_key_monitors()` 分离) |
|
||||
| 盈亏比 | 计划 RR 须 > `KEY_AUTO_MIN_PLANNED_RR`(默认 1.5) |
|
||||
| 日成交量 | 排名前 `KEY_DAILY_VOLUME_RANK_MAX`(默认 30) |
|
||||
|
||||
计算逻辑见仓库根目录 `fib_key_monitor_lib.py`。
|
||||
|
||||
## 与 Gate 的差异(其余)
|
||||
|
||||
- 无独立「关键位监控」导航页(斐波在 **交易执行** 页添加)。
|
||||
- 无交易所已实现盈亏同步(`/api/sync_exchange_pnl`)。
|
||||
- 箱体/收敛仍为 **提醒** 模式,不自动市价开仓(Gate/Binance 主站为自动开仓)。
|
||||
|
||||
## 配置与部署
|
||||
|
||||
- 详见 `.env.example` 中 OKX(`OKX_*`)与通用风控项。
|
||||
- 代码更新后请 **重启 OKX 监控进程**;旧库行不做批量回填,展示字段有则用之、无则回退。
|
||||
|
||||
+348
-348
@@ -1,349 +1,349 @@
|
||||
# `crypto_monitor` 本地部署 + SSH SOCKS 转发 + PM2 启动指南(Ubuntu)
|
||||
|
||||
本文面向:**本地 Ubuntu 机器运行项目**,但 **本机直连 OKX 会被 TLS/SNI reset** 的场景。解决思路是:
|
||||
|
||||
- 本机启动 `ssh -D` 动态转发,把 **SOCKS5 出口**放到你可正常访问 OKX 的 VPS 上
|
||||
- 项目通过环境变量 `OKX_SOCKS_PROXY=socks5h://127.0.0.1:1080` 让 `ccxt` 走 SOCKS
|
||||
- 用 `pm2` 托管 **SSH 隧道** 与 **Flask 应用**(你也可以只用 `screen`,但本文按你要求用 PM2)
|
||||
|
||||
> 安全提醒:不要把 `.env`、私钥 `.pem`、OKX API Key 提交到 Git;文档里只用占位符。
|
||||
|
||||
---
|
||||
|
||||
## 0. 你需要准备的东西
|
||||
|
||||
- 一台 **Ubuntu** 本地机器(下文称“本机”)
|
||||
- 一台可 SSH 登录、且 **能正常访问 OKX** 的 VPS(示例公网 IP:`47.76.87.111`,用户:`root`)
|
||||
- VPS 登录方式:**SSH 私钥**(推荐)或密码(不推荐用于无人值守)
|
||||
- 本机已安装:
|
||||
- `python3`、`python3-venv`、`pip`(或 `python3-pip`)
|
||||
- `git`(可选)
|
||||
- `curl`、`ssh`
|
||||
- `node` + `npm`(用于安装 `pm2`)
|
||||
|
||||
---
|
||||
|
||||
## 1. 从云服务器把项目同步到本地(推荐:打包下载)
|
||||
|
||||
在云服务器项目目录(包含 `app.py` 的目录)执行:
|
||||
|
||||
```bash
|
||||
cd /opt/crypto_monitor/crypto_monitor_okx
|
||||
|
||||
# 可选:清理 Python 缓存,减少小文件传输
|
||||
find . -type d -name __pycache__ -prune -exec rm -rf {} +
|
||||
find . -type f -name "*.pyc" -delete
|
||||
|
||||
tar -czf crypto_monitor.tgz .
|
||||
```
|
||||
|
||||
下载 `crypto_monitor.tgz` 到本机后解压:
|
||||
|
||||
```bash
|
||||
mkdir -p /opt/crypto_monitor/crypto_monitor_okx
|
||||
cd /opt/crypto_monitor
|
||||
tar -xzf crypto_monitor.tgz -C crypto_monitor_okx
|
||||
cd crypto_monitor_okx
|
||||
cp -n .env.example .env # 若尚无 .env
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2. 配置 SSH 私钥与 `~/.ssh/config`(推荐)
|
||||
|
||||
把私钥放到本机(示例:`~/.ssh/vps1.pem`),并设置权限:
|
||||
|
||||
```bash
|
||||
mkdir -p ~/.ssh
|
||||
chmod 700 ~/.ssh
|
||||
mv ~/Downloads/vps1.pem ~/.ssh/vps1.pem
|
||||
chmod 600 ~/.ssh/vps1.pem
|
||||
```
|
||||
|
||||
编辑 `~/.ssh/config`(没有就创建),添加:
|
||||
|
||||
```sshconfig
|
||||
Host okx-vps
|
||||
HostName 47.76.87.111
|
||||
User root
|
||||
IdentityFile ~/.ssh/vps1.pem
|
||||
IdentitiesOnly yes
|
||||
ServerAliveInterval 30
|
||||
ServerAliveCountMax 3
|
||||
ExitOnForwardFailure yes
|
||||
BatchMode yes
|
||||
```
|
||||
|
||||
测试:
|
||||
|
||||
```bash
|
||||
ssh okx-vps true
|
||||
```
|
||||
|
||||
> 如果你还没完全切到密钥登录(还会交互要密码),先把 `BatchMode yes` 注释掉,等密钥登录稳定后再打开。
|
||||
|
||||
---
|
||||
|
||||
## 3. 先手工验证:SSH SOCKS + OKX API
|
||||
|
||||
### 3.1 开一个本地 SOCKS(1080)
|
||||
|
||||
```bash
|
||||
ssh -N -D 127.0.0.1:1080 okx-vps
|
||||
```
|
||||
|
||||
保持该进程运行(另开终端继续下面步骤)。
|
||||
|
||||
### 3.2 验证 OKX 走 SOCKS 可用
|
||||
|
||||
```bash
|
||||
curl -4 -Iv --max-time 15 --proxy socks5h://127.0.0.1:1080 https://www.okx.com/api/v5/public/time
|
||||
```
|
||||
|
||||
看到 `HTTP/2 200`(或至少 TLS 握手成功且返回 JSON)即 OK。
|
||||
|
||||
---
|
||||
|
||||
## 4. Python 虚拟环境(venv)
|
||||
|
||||
在本机项目目录:
|
||||
|
||||
```bash
|
||||
cd /opt/crypto_monitor/crypto_monitor_okx
|
||||
|
||||
python3 -m venv .venv
|
||||
source .venv/bin/activate
|
||||
|
||||
python -m pip install -U pip
|
||||
pip install flask requests ccxt werkzeug PySocks Pillow
|
||||
```
|
||||
|
||||
> 说明:本仓库当前没有 `requirements.txt`。如果你希望“完全复刻云服务器依赖”,可以在云服务器项目环境里执行 `pip freeze > requirements.txt` 带回本机再 `pip install -r requirements.txt`(记得删掉明显无关/体积巨大的包)。
|
||||
|
||||
建议减少 `.pyc` 垃圾文件(可选):
|
||||
|
||||
```bash
|
||||
export PYTHONDONTWRITEBYTECODE=1
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. 配置环境变量(`.env.example` → `.env`)
|
||||
|
||||
| 文件 | 是否进 Git | 说明 |
|
||||
|------|------------|------|
|
||||
| **`.env.example`** | ✅ 是 | 变量模板与注释,可随 `git pull` 更新 |
|
||||
| **`.env`** | ❌ 否 | 本机真实配置;`app.py` **只读此文件** |
|
||||
|
||||
### 5.1 首次配置
|
||||
|
||||
```bash
|
||||
cd /opt/crypto_monitor/crypto_monitor_okx
|
||||
|
||||
cp -n .env.example .env # 已存在 .env 时不覆盖
|
||||
nano .env
|
||||
```
|
||||
|
||||
### 5.2 备份与 `git pull`
|
||||
|
||||
- **`.env` 不在 Git 中**:`git pull` **不会**覆盖本地 `.env`。
|
||||
- 远端若更新 **`.env.example`**,pull 后请**手动**把新增变量补进你的 `.env`。
|
||||
- **升级前备份**:`cp .env .env.backup.$(date +%Y%m%d)`;恢复:`cp .env.backup.YYYYMMDD .env`。
|
||||
- **换机**:`scp` 复制 `.env`,或新机 `cp .env.example .env` 后重填。
|
||||
|
||||
### 5.3 必填项检查(OKX + 代理)
|
||||
|
||||
至少确认/填写这些关键项(示例):
|
||||
|
||||
```env
|
||||
APP_HOST=127.0.0.1
|
||||
APP_PORT=5000
|
||||
|
||||
# OKX(如需实盘)
|
||||
LIVE_TRADING_ENABLED=false
|
||||
OKX_API_KEY=...
|
||||
OKX_API_SECRET=...
|
||||
OKX_API_PASSPHRASE=...
|
||||
|
||||
# OKX 出口:走本机 SSH 动态转发 SOCKS
|
||||
OKX_SOCKS_PROXY=socks5h://127.0.0.1:1080
|
||||
|
||||
# 开仓多周期K线图(可选)
|
||||
# ORDER_CHART_ENABLED=true
|
||||
# ORDER_CHART_TFS=4h,1h,15m,5m
|
||||
# ORDER_CHART_LIMIT=100
|
||||
# ORDER_CHART_DIR=static/images/order_charts
|
||||
# DAILY_OPEN_ALERT_THRESHOLD=5
|
||||
|
||||
# Ollama(如本机跑)
|
||||
OLLAMA_API=http://127.0.0.1:11434/api/generate
|
||||
AI_MODEL=你的模型名
|
||||
```
|
||||
|
||||
> `OKX_SOCKS_PROXY` 使用 `socks5h`:让 SOCKS 侧做域名解析(更贴近你 `curl --proxy socks5h://...` 的成功路径)。
|
||||
|
||||
---
|
||||
|
||||
## 6. 本机手工启动(验证 Flask)
|
||||
|
||||
确保:
|
||||
|
||||
1. SOCKS 隧道已运行(127.0.0.1:1080)
|
||||
2. 虚拟环境已 `activate`
|
||||
3. `.env` 已配置
|
||||
|
||||
启动:
|
||||
|
||||
```bash
|
||||
cd /opt/crypto_monitor/crypto_monitor_okx
|
||||
source .venv/bin/activate
|
||||
python app.py
|
||||
```
|
||||
|
||||
浏览器访问:`http://127.0.0.1:5000`(或你在 `.env` 配的端口)。
|
||||
|
||||
---
|
||||
|
||||
## 7. 安装 PM2(Node)
|
||||
|
||||
```bash
|
||||
sudo npm i -g pm2
|
||||
pm2 -v
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 8. 用 PM2 启动 SSH SOCKS 隧道(推荐:密钥免交互)
|
||||
|
||||
### 8.1 启动隧道进程
|
||||
|
||||
```bash
|
||||
pm2 start "ssh" --name okx-socks-tunnel -- \
|
||||
-N -D 127.0.0.1:1080 okx-vps \
|
||||
-o ServerAliveInterval=30 -o ServerAliveCountMax=3 \
|
||||
-o ExitOnForwardFailure=yes -o BatchMode=yes
|
||||
```
|
||||
|
||||
查看日志:
|
||||
|
||||
```bash
|
||||
pm2 logs okx-socks-tunnel --lines 200
|
||||
```
|
||||
|
||||
### 8.2 仍然验证 OKX
|
||||
|
||||
```bash
|
||||
curl -4 -Iv --max-time 15 --proxy socks5h://127.0.0.1:1080 https://www.okx.com/api/v5/public/time
|
||||
```
|
||||
|
||||
### 8.3 开机自启(可选)
|
||||
|
||||
```bash
|
||||
pm2 save
|
||||
pm2 startup
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 9. 用 PM2 启动 Flask(`app.py`)
|
||||
|
||||
`pm2` 管理 Python 的常用方式是直接启动解释器:
|
||||
|
||||
```bash
|
||||
cd /opt/crypto_monitor/crypto_monitor_okx
|
||||
|
||||
pm2 start /opt/crypto_monitor/crypto_monitor_okx/.venv/bin/python --name crypto-monitor -- \
|
||||
/opt/crypto_monitor/crypto_monitor_okx/app.py
|
||||
```
|
||||
|
||||
> 若项目目录与上文不一致,请替换为实际绝对路径;或用 `readlink -f app.py` 得到绝对路径。
|
||||
|
||||
查看日志:
|
||||
|
||||
```bash
|
||||
pm2 logs crypto-monitor --lines 200
|
||||
```
|
||||
|
||||
保存进程列表:
|
||||
|
||||
```bash
|
||||
pm2 save
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 10. 常见问题排查(高频)
|
||||
|
||||
### 10.1 OKX 仍然失败:先看隧道是否在
|
||||
|
||||
```bash
|
||||
ss -lntp | grep 1080 || true
|
||||
pm2 status
|
||||
```
|
||||
|
||||
### 10.2 `pm2` 里的 `ssh` 立刻退出
|
||||
|
||||
常见原因:
|
||||
|
||||
- 私钥权限不对(`chmod 600`)
|
||||
- `~/.ssh/config` 写错 `HostName/User/IdentityFile`
|
||||
- 开了 `BatchMode yes` 但仍需要密码(会失败)
|
||||
|
||||
### 10.3 `ccxt` SOCKS 报错 / 代理不生效
|
||||
|
||||
本机 Python 依赖通常需要:
|
||||
|
||||
```bash
|
||||
source .venv/bin/activate
|
||||
pip install PySocks
|
||||
```
|
||||
|
||||
### 10.4 `.pyc` 很多导致同步慢
|
||||
|
||||
`.pyc` 是缓存,删除不影响功能:
|
||||
|
||||
```bash
|
||||
find . -type d -name __pycache__ -prune -exec rm -rf {} +
|
||||
find . -type f -name "*.pyc" -delete
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 11. 推荐的启动顺序(固定习惯)
|
||||
|
||||
1. `pm2` 启动 `okx-socks-tunnel`
|
||||
2. `curl --proxy socks5h://127.0.0.1:1080 ...` 验证 OKX
|
||||
3. `pm2` 启动 `crypto-monitor`
|
||||
|
||||
---
|
||||
|
||||
## 12. 免责声明
|
||||
|
||||
交易所有合规与地区政策要求。请确保你的使用方式符合当地法律法规与交易所条款。本文仅描述网络与工程部署技术路径。
|
||||
|
||||
|
||||
|
||||
|
||||
写好了,脚本路径:
|
||||
|
||||
- `scripts/fix_breakeven_labels.py`
|
||||
|
||||
你在 Ubuntu 上这样用:
|
||||
|
||||
1) 先预览(不写库):
|
||||
```bash
|
||||
python scripts/fix_breakeven_labels.py --db ./crypto.db --dry-run
|
||||
```
|
||||
|
||||
2) 确认后执行:
|
||||
```bash
|
||||
python scripts/fix_breakeven_labels.py --db ./crypto.db --apply
|
||||
```
|
||||
|
||||
默认修复条件就是你要的:
|
||||
- `monitor_type='下单监控'`
|
||||
- `result='止损'`
|
||||
- `pnl_amount > 0`
|
||||
- 改成 `result='保本止盈'`
|
||||
|
||||
# `crypto_monitor` 本地部署 + SSH SOCKS 转发 + PM2 启动指南(Ubuntu)
|
||||
|
||||
本文面向:**本地 Ubuntu 机器运行项目**,但 **本机直连 OKX 会被 TLS/SNI reset** 的场景。解决思路是:
|
||||
|
||||
- 本机启动 `ssh -D` 动态转发,把 **SOCKS5 出口**放到你可正常访问 OKX 的 VPS 上
|
||||
- 项目通过环境变量 `OKX_SOCKS_PROXY=socks5h://127.0.0.1:1080` 让 `ccxt` 走 SOCKS
|
||||
- 用 `pm2` 托管 **SSH 隧道** 与 **Flask 应用**(你也可以只用 `screen`,但本文按你要求用 PM2)
|
||||
|
||||
> 安全提醒:不要把 `.env`、私钥 `.pem`、OKX API Key 提交到 Git;文档里只用占位符。
|
||||
|
||||
---
|
||||
|
||||
## 0. 你需要准备的东西
|
||||
|
||||
- 一台 **Ubuntu** 本地机器(下文称“本机”)
|
||||
- 一台可 SSH 登录、且 **能正常访问 OKX** 的 VPS(示例公网 IP:`47.76.87.111`,用户:`root`)
|
||||
- VPS 登录方式:**SSH 私钥**(推荐)或密码(不推荐用于无人值守)
|
||||
- 本机已安装:
|
||||
- `python3`、`python3-venv`、`pip`(或 `python3-pip`)
|
||||
- `git`(可选)
|
||||
- `curl`、`ssh`
|
||||
- `node` + `npm`(用于安装 `pm2`)
|
||||
|
||||
---
|
||||
|
||||
## 1. 从云服务器把项目同步到本地(推荐:打包下载)
|
||||
|
||||
在云服务器项目目录(包含 `app.py` 的目录)执行:
|
||||
|
||||
```bash
|
||||
cd /opt/crypto_monitor/crypto_monitor_okx
|
||||
|
||||
# 可选:清理 Python 缓存,减少小文件传输
|
||||
find . -type d -name __pycache__ -prune -exec rm -rf {} +
|
||||
find . -type f -name "*.pyc" -delete
|
||||
|
||||
tar -czf crypto_monitor.tgz .
|
||||
```
|
||||
|
||||
下载 `crypto_monitor.tgz` 到本机后解压:
|
||||
|
||||
```bash
|
||||
mkdir -p /opt/crypto_monitor/crypto_monitor_okx
|
||||
cd /opt/crypto_monitor
|
||||
tar -xzf crypto_monitor.tgz -C crypto_monitor_okx
|
||||
cd crypto_monitor_okx
|
||||
cp -n .env.example .env # 若尚无 .env
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2. 配置 SSH 私钥与 `~/.ssh/config`(推荐)
|
||||
|
||||
把私钥放到本机(示例:`~/.ssh/vps1.pem`),并设置权限:
|
||||
|
||||
```bash
|
||||
mkdir -p ~/.ssh
|
||||
chmod 700 ~/.ssh
|
||||
mv ~/Downloads/vps1.pem ~/.ssh/vps1.pem
|
||||
chmod 600 ~/.ssh/vps1.pem
|
||||
```
|
||||
|
||||
编辑 `~/.ssh/config`(没有就创建),添加:
|
||||
|
||||
```sshconfig
|
||||
Host okx-vps
|
||||
HostName 47.76.87.111
|
||||
User root
|
||||
IdentityFile ~/.ssh/vps1.pem
|
||||
IdentitiesOnly yes
|
||||
ServerAliveInterval 30
|
||||
ServerAliveCountMax 3
|
||||
ExitOnForwardFailure yes
|
||||
BatchMode yes
|
||||
```
|
||||
|
||||
测试:
|
||||
|
||||
```bash
|
||||
ssh okx-vps true
|
||||
```
|
||||
|
||||
> 如果你还没完全切到密钥登录(还会交互要密码),先把 `BatchMode yes` 注释掉,等密钥登录稳定后再打开。
|
||||
|
||||
---
|
||||
|
||||
## 3. 先手工验证:SSH SOCKS + OKX API
|
||||
|
||||
### 3.1 开一个本地 SOCKS(1080)
|
||||
|
||||
```bash
|
||||
ssh -N -D 127.0.0.1:1080 okx-vps
|
||||
```
|
||||
|
||||
保持该进程运行(另开终端继续下面步骤)。
|
||||
|
||||
### 3.2 验证 OKX 走 SOCKS 可用
|
||||
|
||||
```bash
|
||||
curl -4 -Iv --max-time 15 --proxy socks5h://127.0.0.1:1080 https://www.okx.com/api/v5/public/time
|
||||
```
|
||||
|
||||
看到 `HTTP/2 200`(或至少 TLS 握手成功且返回 JSON)即 OK。
|
||||
|
||||
---
|
||||
|
||||
## 4. Python 虚拟环境(venv)
|
||||
|
||||
在本机项目目录:
|
||||
|
||||
```bash
|
||||
cd /opt/crypto_monitor/crypto_monitor_okx
|
||||
|
||||
python3 -m venv .venv
|
||||
source .venv/bin/activate
|
||||
|
||||
python -m pip install -U pip
|
||||
pip install flask requests ccxt werkzeug PySocks Pillow
|
||||
```
|
||||
|
||||
> 说明:本仓库当前没有 `requirements.txt`。如果你希望“完全复刻云服务器依赖”,可以在云服务器项目环境里执行 `pip freeze > requirements.txt` 带回本机再 `pip install -r requirements.txt`(记得删掉明显无关/体积巨大的包)。
|
||||
|
||||
建议减少 `.pyc` 垃圾文件(可选):
|
||||
|
||||
```bash
|
||||
export PYTHONDONTWRITEBYTECODE=1
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. 配置环境变量(`.env.example` → `.env`)
|
||||
|
||||
| 文件 | 是否进 Git | 说明 |
|
||||
|------|------------|------|
|
||||
| **`.env.example`** | ✅ 是 | 变量模板与注释,可随 `git pull` 更新 |
|
||||
| **`.env`** | ❌ 否 | 本机真实配置;`app.py` **只读此文件** |
|
||||
|
||||
### 5.1 首次配置
|
||||
|
||||
```bash
|
||||
cd /opt/crypto_monitor/crypto_monitor_okx
|
||||
|
||||
cp -n .env.example .env # 已存在 .env 时不覆盖
|
||||
nano .env
|
||||
```
|
||||
|
||||
### 5.2 备份与 `git pull`
|
||||
|
||||
- **`.env` 不在 Git 中**:`git pull` **不会**覆盖本地 `.env`。
|
||||
- 远端若更新 **`.env.example`**,pull 后请**手动**把新增变量补进你的 `.env`。
|
||||
- **升级前备份**:`cp .env .env.backup.$(date +%Y%m%d)`;恢复:`cp .env.backup.YYYYMMDD .env`。
|
||||
- **换机**:`scp` 复制 `.env`,或新机 `cp .env.example .env` 后重填。
|
||||
|
||||
### 5.3 必填项检查(OKX + 代理)
|
||||
|
||||
至少确认/填写这些关键项(示例):
|
||||
|
||||
```env
|
||||
APP_HOST=127.0.0.1
|
||||
APP_PORT=5000
|
||||
|
||||
# OKX(如需实盘)
|
||||
LIVE_TRADING_ENABLED=false
|
||||
OKX_API_KEY=...
|
||||
OKX_API_SECRET=...
|
||||
OKX_API_PASSPHRASE=...
|
||||
|
||||
# OKX 出口:走本机 SSH 动态转发 SOCKS
|
||||
OKX_SOCKS_PROXY=socks5h://127.0.0.1:1080
|
||||
|
||||
# 开仓多周期K线图(可选)
|
||||
# ORDER_CHART_ENABLED=true
|
||||
# ORDER_CHART_TFS=4h,1h,15m,5m
|
||||
# ORDER_CHART_LIMIT=100
|
||||
# ORDER_CHART_DIR=static/images/order_charts
|
||||
# DAILY_OPEN_ALERT_THRESHOLD=5
|
||||
|
||||
# Ollama(如本机跑)
|
||||
OLLAMA_API=http://127.0.0.1:11434/api/generate
|
||||
AI_MODEL=你的模型名
|
||||
```
|
||||
|
||||
> `OKX_SOCKS_PROXY` 使用 `socks5h`:让 SOCKS 侧做域名解析(更贴近你 `curl --proxy socks5h://...` 的成功路径)。
|
||||
|
||||
---
|
||||
|
||||
## 6. 本机手工启动(验证 Flask)
|
||||
|
||||
确保:
|
||||
|
||||
1. SOCKS 隧道已运行(127.0.0.1:1080)
|
||||
2. 虚拟环境已 `activate`
|
||||
3. `.env` 已配置
|
||||
|
||||
启动:
|
||||
|
||||
```bash
|
||||
cd /opt/crypto_monitor/crypto_monitor_okx
|
||||
source .venv/bin/activate
|
||||
python app.py
|
||||
```
|
||||
|
||||
浏览器访问:`http://127.0.0.1:5000`(或你在 `.env` 配的端口)。
|
||||
|
||||
---
|
||||
|
||||
## 7. 安装 PM2(Node)
|
||||
|
||||
```bash
|
||||
sudo npm i -g pm2
|
||||
pm2 -v
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 8. 用 PM2 启动 SSH SOCKS 隧道(推荐:密钥免交互)
|
||||
|
||||
### 8.1 启动隧道进程
|
||||
|
||||
```bash
|
||||
pm2 start "ssh" --name okx-socks-tunnel -- \
|
||||
-N -D 127.0.0.1:1080 okx-vps \
|
||||
-o ServerAliveInterval=30 -o ServerAliveCountMax=3 \
|
||||
-o ExitOnForwardFailure=yes -o BatchMode=yes
|
||||
```
|
||||
|
||||
查看日志:
|
||||
|
||||
```bash
|
||||
pm2 logs okx-socks-tunnel --lines 200
|
||||
```
|
||||
|
||||
### 8.2 仍然验证 OKX
|
||||
|
||||
```bash
|
||||
curl -4 -Iv --max-time 15 --proxy socks5h://127.0.0.1:1080 https://www.okx.com/api/v5/public/time
|
||||
```
|
||||
|
||||
### 8.3 开机自启(可选)
|
||||
|
||||
```bash
|
||||
pm2 save
|
||||
pm2 startup
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 9. 用 PM2 启动 Flask(`app.py`)
|
||||
|
||||
`pm2` 管理 Python 的常用方式是直接启动解释器:
|
||||
|
||||
```bash
|
||||
cd /opt/crypto_monitor/crypto_monitor_okx
|
||||
|
||||
pm2 start /opt/crypto_monitor/crypto_monitor_okx/.venv/bin/python --name crypto-monitor -- \
|
||||
/opt/crypto_monitor/crypto_monitor_okx/app.py
|
||||
```
|
||||
|
||||
> 若项目目录与上文不一致,请替换为实际绝对路径;或用 `readlink -f app.py` 得到绝对路径。
|
||||
|
||||
查看日志:
|
||||
|
||||
```bash
|
||||
pm2 logs crypto-monitor --lines 200
|
||||
```
|
||||
|
||||
保存进程列表:
|
||||
|
||||
```bash
|
||||
pm2 save
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 10. 常见问题排查(高频)
|
||||
|
||||
### 10.1 OKX 仍然失败:先看隧道是否在
|
||||
|
||||
```bash
|
||||
ss -lntp | grep 1080 || true
|
||||
pm2 status
|
||||
```
|
||||
|
||||
### 10.2 `pm2` 里的 `ssh` 立刻退出
|
||||
|
||||
常见原因:
|
||||
|
||||
- 私钥权限不对(`chmod 600`)
|
||||
- `~/.ssh/config` 写错 `HostName/User/IdentityFile`
|
||||
- 开了 `BatchMode yes` 但仍需要密码(会失败)
|
||||
|
||||
### 10.3 `ccxt` SOCKS 报错 / 代理不生效
|
||||
|
||||
本机 Python 依赖通常需要:
|
||||
|
||||
```bash
|
||||
source .venv/bin/activate
|
||||
pip install PySocks
|
||||
```
|
||||
|
||||
### 10.4 `.pyc` 很多导致同步慢
|
||||
|
||||
`.pyc` 是缓存,删除不影响功能:
|
||||
|
||||
```bash
|
||||
find . -type d -name __pycache__ -prune -exec rm -rf {} +
|
||||
find . -type f -name "*.pyc" -delete
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 11. 推荐的启动顺序(固定习惯)
|
||||
|
||||
1. `pm2` 启动 `okx-socks-tunnel`
|
||||
2. `curl --proxy socks5h://127.0.0.1:1080 ...` 验证 OKX
|
||||
3. `pm2` 启动 `crypto-monitor`
|
||||
|
||||
---
|
||||
|
||||
## 12. 免责声明
|
||||
|
||||
交易所有合规与地区政策要求。请确保你的使用方式符合当地法律法规与交易所条款。本文仅描述网络与工程部署技术路径。
|
||||
|
||||
|
||||
|
||||
|
||||
写好了,脚本路径:
|
||||
|
||||
- `scripts/fix_breakeven_labels.py`
|
||||
|
||||
你在 Ubuntu 上这样用:
|
||||
|
||||
1) 先预览(不写库):
|
||||
```bash
|
||||
python scripts/fix_breakeven_labels.py --db ./crypto.db --dry-run
|
||||
```
|
||||
|
||||
2) 确认后执行:
|
||||
```bash
|
||||
python scripts/fix_breakeven_labels.py --db ./crypto.db --apply
|
||||
```
|
||||
|
||||
默认修复条件就是你要的:
|
||||
- `monitor_type='下单监控'`
|
||||
- `result='止损'`
|
||||
- `pnl_amount > 0`
|
||||
- 改成 `result='保本止盈'`
|
||||
|
||||
如果你想,我还可以再给你一条“先自动备份 DB 再执行”的一键命令。
|
||||
Reference in New Issue
Block a user