Normalize fullwidth punctuation to ASCII across codebase.

Add scripts/normalize_ambiguous_unicode.py; fix corrupted patch_instance_theme_templates.py. Preserves curly quotes in string literals; removes Git homoglyph warnings on .env.example.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-07-08 23:42:26 +08:00
parent aaa72c7961
commit b733e551a0
392 changed files with 71522 additions and 71369 deletions
+84 -84
View File
@@ -1,157 +1,157 @@
# =============================================================================
# 环境配置模板可提交 Git)。程序运行时只读取同目录下的 .env
# 环境配置模板(可提交 Git).程序运行时只读取同目录下的 .env.
#
# 首次部署 / 新机
# 首次部署 / 新机:
# cp .env.example .env
# nano .env # 填入真实密钥端口代理等
# nano .env # 填入真实密钥,端口,代理等
#
# 升级代码git pull前建议备份.env 不在 Git 中pull 不会覆盖):
# 升级代码(git pull)前建议备份(.env 不在 Git 中,pull 不会覆盖):
# cp .env .env.backup.$(date +%Y%m%d)
#
# 从备份恢复
# 从备份恢复:
# cp .env.backup.YYYYMMDD .env
# =============================================================================
APP_ENV=production
# 服务监听地址云服务器通常用 0.0.0.0
# 服务监听地址(云服务器通常用 0.0.0.0)
APP_HOST=0.0.0.0
# 服务端口
APP_PORT=5001
# 是否开启调试模式生产建议 false
# 是否开启调试模式(生产建议 false)
APP_DEBUG=false
# 登录账号
APP_USERNAME=admin
# 登录密码请改成你自己的强密码
# 登录密码(请改成你自己的强密码)
APP_PASSWORD=admin123
# 是否关闭登录校验局域网可设 true公网务必 false
# 是否关闭登录校验(局域网可设 true;公网务必 false)
APP_AUTH_DISABLED=true
# --- 多账户交易中控 manual_trading_hub ---
# 中控请求本实例 /api/hub/* 时携带请求头 X-Hub-Token须与中控启动环境变量 HUB_BRIDGE_TOKEN 一致
# 未设置且 APP_AUTH_DISABLED=false 时仅网页登录后可访问本机联调可保持 APP_AUTH_DISABLED=true
# 中控请求本实例 /api/hub/* 时携带请求头 X-Hub-Token,须与中控启动环境变量 HUB_BRIDGE_TOKEN 一致
# 未设置且 APP_AUTH_DISABLED=false 时,仅网页登录后可访问;本机联调可保持 APP_AUTH_DISABLED=true
# HUB_BRIDGE_TOKEN=your-long-random-token
# Flask 会话密钥必须替换为长随机字符串
# Flask 会话密钥(必须替换为长随机字符串)
FLASK_SECRET_KEY=CHANGE_TO_LONG_RANDOM_SECRET
# 企业微信机器人 Webhook用于行情/风控推送
# 企业微信机器人 Webhook(用于行情/风控推送)
WECHAT_WEBHOOK=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=REPLACE_WITH_REAL_KEY
# 数据库文件路径相对路径会自动按项目目录解析
# 数据库文件路径(相对路径会自动按项目目录解析)
DB_PATH=crypto.db
# 交易截图上传目录
UPLOAD_DIR=static/images
# 自动备份scripts/backup_data.sh + cron可选默认即可
# 自动备份(scripts/backup_data.sh + cron,可选;默认即可)
# BACKUP_ROOT=/root/backups
# BACKUP_RETENTION_DAYS=30
# BACKUP_INSTANCE=crypto_monitor_binance
# 已废弃资金账户仅显示交易所 funding 余额不再读取此变量
# 已废弃:资金账户仅显示交易所 funding 余额,不再读取此变量
# TOTAL_CAPITAL=100
# 页顶「资金账户」默认仅 Binance Funding 钱包若 USDT 主要在现货可改为 true 合并 Spot
# 页顶「资金账户」默认仅 Binance Funding 钱包;若 USDT 主要在现货,可改为 true 合并 Spot
# BINANCE_FUNDING_INCLUDE_SPOT=false
# 计仓risk=以损定仓默认);full_margin=合约可用×FULL_MARGIN_BUFFER_RATIO 全仓杠杆须无仓后重启
# 计仓:risk=以损定仓(默认);full_margin=合约可用×FULL_MARGIN_BUFFER_RATIO 全仓杠杆(须无仓后重启)
POSITION_SIZING_MODE=risk
# 方向限制默认 false=双向均可true 时按 TRADE_DIRECTION 限制修改后须重启
# TRADE_DIRECTION=long_only | short_only | both或 多/空/双向
# 方向限制(默认 false=双向均可;true 时按 TRADE_DIRECTION 限制,修改后须重启)
# TRADE_DIRECTION=long_only | short_only | both(或 多/空/双向)
TRADE_DIRECTION_RESTRICT_ENABLED=false
TRADE_DIRECTION=both
# 币种白名单默认 false=全币种可手输true 时关键位/下单/策略仅下拉选择
# 币种白名单(默认 false=全币种可手输;true 时关键位/下单/策略仅下拉选择)
TRADE_SYMBOL_RESTRICT_ENABLED=false
TRADE_SYMBOL_WHITELIST=BTC,ETH
# 每天起始基数U
# 每天起始基数(U)
DAILY_START_CAPITAL=30
# 日内回撤后基数U
# 日内回撤后基数(U)
DAILY_LOSS_CAPITAL=20
# 日内盈利后基数U
# 日内盈利后基数(U)
DAILY_PROFIT_CAPITAL=50
# BTC 默认杠杆倍数
BTC_LEVERAGE=10
# 山寨币默认杠杆倍数
ALT_LEVERAGE=5
# 交易日重置小时北京时间
# 交易日重置小时(北京时间)
TRADING_DAY_RESET_HOUR=8
# 整点前禁止新开仓true=启用默认),false=关闭仍可保留 8 点作为交易日划分
# 整点前禁止新开仓:true=启用(默认),false=关闭(仍可保留 8 点作为交易日划分)
TRADING_DAY_RESET_OPEN_GUARD_ENABLED=true
# 是否开启 Binance 实盘下单false=只做本地流程true=真实下单
# 是否开启 Binance 实盘下单(false=只做本地流程,true=真实下单)
LIVE_TRADING_ENABLED=true
# Binance API Key需开通合约万向划转等权限
# Binance API Key(需开通合约,万向划转等权限)
BINANCE_API_KEY=REPLACE_WITH_BINANCE_API_KEY
# Binance API Secret
BINANCE_API_SECRET=REPLACE_WITH_BINANCE_API_SECRET
# 保证金模式cross=全仓isolated=逐仓
# 保证金模式:cross=全仓,isolated=逐仓
BINANCE_MARGIN_MODE=cross
# 持仓模式hedge=双向需账户开启双向持仓下单带 positionSide);oneway=单向
# 持仓模式:hedge=双向(需账户开启双向持仓,下单带 positionSide);oneway=单向
BINANCE_POSITION_MODE=hedge
# 条件单触发参考价CONTRACT_PRICE=最新成交价 MARK_PRICE=标记价更易触发时用标记价
# 条件单触发参考价:CONTRACT_PRICE=最新成交价 MARK_PRICE=标记价(更易触发时用标记价)
BINANCE_TRIGGER_WORKING_TYPE=CONTRACT_PRICE
# 页面与浏览器标签展示的交易所名称多环境区分时可改成例如 Binance·测试网
# 页面与浏览器标签展示的交易所名称(多环境区分时可改成例如 Binance·测试网)
# EXCHANGE_DISPLAY_NAME=Binance
# 企业微信推送里展示的账户备注
# BINANCE_ACCOUNT_LABEL=binance实盘账户
# 平仓盈亏估算false=按仓位历史口径已实现盈亏+手续费不含资金费);true=含资金费
# 平仓盈亏估算:false=按仓位历史口径(已实现盈亏+手续费,不含资金费);true=含资金费
# BINANCE_PNL_INCLUDE_FUNDING=false
# =============================================================================
# 关键位程序自动下单与 POSITION_SIZING_MODE 联动修改后须重启 PM2
# 关键位程序自动下单(与 POSITION_SIZING_MODE 联动,修改后须重启 PM2)
# =============================================================================
# 默认 false = 关闭所有关键位程序自动单箱体/收敛/斐波/假突破/触价
# 默认 false = 关闭所有关键位程序自动单(箱体/收敛/斐波/假突破/触价)
#
# POSITION_SIZING_MODE=risk以损定仓
# false → 不执行任何关键位自动单支撑/阻力提醒人工下单顺势加仓不受影响
# true → 允许关键位全套自动含触价
# POSITION_SIZING_MODE=risk(以损定仓)
# false → 不执行任何关键位自动单;支撑/阻力提醒,人工下单,顺势加仓不受影响
# true → 允许关键位全套自动(含触价)
#
# POSITION_SIZING_MODE=full_margin全仓杠杆须无仓切换
# POSITION_SIZING_MODE=full_margin(全仓杠杆,须无仓切换)
# false → 不执行触价自动单
# true → 仅回调/突破触价可程序自动开仓箱体/斐波等仍禁止
# true → 仅回调/突破触价可程序自动开仓;箱体/斐波等仍禁止
#
# 顺势加仓趋势回调不受本开关控制全仓模式下策略自动仍禁止
# 顺势加仓,趋势回调不受本开关控制;全仓模式下策略自动仍禁止.
KEY_AUTO_ORDER_ENABLED=false
# =============================================================================
# 关键位门控页面「关键位监控」规则条与 _key_hard_checks 共用
# 关键位门控(页面「关键位监控」规则条与 _key_hard_checks 共用)
# =============================================================================
# 【周期】门控 K 线周期如 5m15m仅影响关键位硬条件不改变顶栏分区
# 【周期】门控 K 线周期,如 5m,15m;仅影响关键位硬条件,不改变顶栏分区
KLINE_TIMEFRAME=5m
# 【确认K】闭合 K 序列中的棒偏移突破棒默认 -2倒数第2根),确认棒默认 -1倒数第1根
# 【确认K】闭合 K 序列中的棒偏移:突破棒默认 -2(倒数第2根),确认棒默认 -1(倒数第1根)
KEY_CONFIRM_BREAKOUT_BAR=-2
KEY_CONFIRM_BAR=-1
# 【量能】突破棒成交量 > 前 N 根均量 × 倍数默认 N=20倍数=1.3 即放大 30%
# 【量能】突破棒成交量 > 前 N 根均量 × 倍数(默认 N=20,倍数=1.3 即放大 30%)
KEY_VOLUME_MA_BARS=20
KEY_VOLUME_RATIO_MIN=1.3
# 【箱体/收敛】突破K收盘越过关键位占该侧价格%的下限无上限过猛由计划RR过滤
# 【箱体/收敛】突破K收盘越过关键位(占该侧价格%)的下限;无上限(过猛由计划RR过滤)
KEY_BREAKOUT_AMP_MIN_PCT=0.03
# 已不参与门控可保留配置项兼容旧环境
# 已不参与门控,可保留配置项兼容旧环境
KEY_BREAKOUT_AMP_MAX_PCT=0.5
# 【阻力/支撑】突破后微信提醒次数与间隔分钟
# 【阻力/支撑】突破后微信提醒次数与间隔(分钟)
KEY_ALERT_MAX_TIMES=3
KEY_ALERT_INTERVAL_MINUTES=5
# 【日成交量排名】品种须在该排名前 N 名添加关键位与运行时门控均校验
# 【日成交量排名】品种须在该排名前 N 名(添加关键位与运行时门控均校验)
KEY_DAILY_VOLUME_RANK_MAX=30
# 【关键位自动开仓盈亏比】按确认K收盘 E 计算严格大于该值才市价开仓如 1.5 表示须 >1.5:1
# 【关键位自动开仓盈亏比】按确认K收盘 E 计算,严格大于该值才市价开仓(如 1.5 表示须 >1.5:1)
KEY_AUTO_MIN_PLANNED_RR=1.5
# 止损突破 K 极值向外缓冲的百分比默认 0.5 即 0.5%
# 止损:突破 K 极值向外缓冲的百分比(默认 0.5 即 0.5%)
KEY_STOP_OUTSIDE_BREAKOUT_PCT=0.5
# 趋势单方案止损在突破 K 极值外侧的百分比默认 1 即 1%
# 趋势单方案:止损在突破 K 极值外侧的百分比(默认 1 即 1%)
KEY_TREND_STOP_OUTSIDE_PCT=1
# =============================================================================
# 交易执行 / 人工风控页面「实盘下单」
# 交易执行 / 人工风控(页面「实盘下单」)
# =============================================================================
# 【最大同时持仓】active 订单数达到该值后禁止人工与关键位自动再加仓默认 1=单仓
# 【最大同时持仓】active 订单数达到该值后禁止人工与关键位自动再加仓(默认 1=单仓)
MAX_ACTIVE_POSITIONS=1
# 【人工下单最低盈亏比】按当前价与 SL/TP 计算低于该值前后端均拒绝默认 1.4即须 >=1.4:1
# 【人工下单最低盈亏比】按当前价与 SL/TP 计算,低于该值前后端均拒绝(默认 1.4,即须 >=1.4:1)
MANUAL_MIN_PLANNED_RR=1.4
# 【关键位连开计仓】true=已有持仓时关键位自动单仍按「无仓时」资金快照算保证金基数
KEY_SIZING_USE_ZERO_POSITION_SNAPSHOT=true
# 【单日开仓 AI 提醒】本交易日开仓达到该次数时推送企业微信 AI 克制提醒不拦单
# 【单日开仓 AI 提醒】本交易日开仓达到该次数时推送企业微信 AI 克制提醒(不拦单)
DAILY_OPEN_ALERT_THRESHOLD=5
# 【单日开仓硬上限】本交易日开仓次数>=该值后禁止一切新开仓直至下一交易日北京时间 TRADING_DAY_RESET_HOUR 切日);0=不启用
# 【单日开仓硬上限】本交易日开仓次数>=该值后禁止一切新开仓直至下一交易日(北京时间 TRADING_DAY_RESET_HOUR 切日);0=不启用
DAILY_OPEN_HARD_LIMIT=0
# =============================================================================
# 账户冷静期 / 日冻结风控手动平仓外部平仓复盘情绪标签
# 账户冷静期 / 日冻结风控(手动平仓,外部平仓,复盘情绪标签)
# 详见 docs/account-risk-cooldown.md
# =============================================================================
RISK_CONTROL_ENABLED=true
@@ -160,74 +160,74 @@ RISK_COOLING_HOURS_MANUAL_JOURNAL=1
RISK_MANUAL_CLOSE_DAILY_LIMIT=2
RISK_MOOD_ISSUES_DAILY_FREEZE=true
# 资金与仓位刷新周期(秒)
# 资金与仓位刷新周期(秒)
BALANCE_REFRESH_SECONDS=60
# 前端价格快照轮询(秒)
# 前端价格快照轮询(秒)
PRICE_REFRESH_SECONDS=5
# 后台监控轮询周期(秒)
# 后台监控轮询周期(秒)
MONITOR_POLL_SECONDS=3
# 重启后多少秒内不做「外部平仓」同步避免 API 未就绪误判
# 重启后多少秒内不做「外部平仓」同步(避免 API 未就绪误判)
RECONCILE_STARTUP_GRACE_SEC=90
# 连续多少次轮询确认交易所空仓后才记为外部平仓默认 3 次 ≈ 9 秒
# 连续多少次轮询确认交易所空仓后,才记为外部平仓(默认 3 次 ≈ 9 秒)
RECONCILE_FLAT_CONFIRM_POLLS=3
# 使用可用资金时的缓冲比例如0.98代表用98%
# 使用可用资金时的缓冲比例(如0.98代表用98%)
FULL_MARGIN_BUFFER_RATIO=0.98
# =============================================================================
# 自动划转页顶「将 swap 补足到 XU」与 DAILY_START_CAPITAL 独立需一致时请设为相同值
# 自动划转(页顶「将 swap 补足到 XU」;与 DAILY_START_CAPITAL 独立,需一致时请设为相同值)
# =============================================================================
AUTO_TRANSFER_ENABLED=false
# 交易账户(swap)目标余额 U每日 8 点(北京)自动划入或划出至 funding持仓中不划转
# 交易账户(swap)目标余额 U:每日 8 点(北京)自动划入或划出至 funding;持仓中不划转
AUTO_TRANSFER_AMOUNT=30
AUTO_TRANSFER_FROM=funding
AUTO_TRANSFER_TO=swap
TRANSFER_CCY=USDT
# 北京时间该整点小时内尝试账簿按 UTC 自然日去重
# 北京时间该整点小时内尝试;账簿按 UTC 自然日去重
AUTO_TRANSFER_BJ_HOUR=8
# 强制清仓整点北京时间默认 0=凌晨00点
# 强制清仓整点(北京时间,默认 0=凌晨00点)
FORCE_CLOSE_BJ_HOUR=0
# 是否启用强制清仓默认关闭true 才会在整点执行
# 是否启用强制清仓(默认关闭,true 才会在整点执行)
FORCE_CLOSE_ENABLED=false
# 推送与AI超时(秒)
# 推送与AI超时(秒)
WECHAT_TIMEOUT_SECONDS=10
AI_TIMEOUT_SECONDS=120
# AI 提供方openai默认OpenAI 兼容网关| ollama本机 Ollama
# AI 提供方:openai(默认,OpenAI 兼容网关)| ollama(本机 Ollama)
AI_PROVIDER=openai
# OpenAI 兼容接口示例https://op.bz121.com/v1 账号见 gateway.json
# OpenAI 兼容接口(示例:https://op.bz121.com/v1 ,账号见 gateway.json)
OPENAI_API_BASE=https://op.bz121.com/v1
OPENAI_API_KEY=你的密钥
OPENAI_MODEL=gemma4:e4b
# 本机 OllamaAI_PROVIDER=ollama 时使用
# 本机 Ollama(AI_PROVIDER=ollama 时使用)
OLLAMA_API=http://127.0.0.1:11434/api/generate
AI_MODEL=huihui_ai/deepseek-r1-abliterated:latest
# Binance 代理可选):本机网络不稳定时通过 SSH 动态转发 SOCKS5 出口
# 1) 先在本机建立隧道示例):
# Binance 代理(可选):本机网络不稳定时通过 SSH 动态转发 SOCKS5 出口
# 1) 先在本机建立隧道(示例):
# ssh -N -D 127.0.0.1:1080 user@vps -o ServerAliveInterval=30 -o ExitOnForwardFailure=yes
# 2) 再启用下面这一行推荐 socks5h让远端解析域名):
# 2) 再启用下面这一行(推荐 socks5h,让远端解析域名):
# BINANCE_SOCKS_PROXY=socks5h://127.0.0.1:1080
#
# 如你更偏向 HTTP 代理VPS 上跑 tinyproxy 之类),可用
# 如你更偏向 HTTP 代理(VPS 上跑 tinyproxy 之类),可用:
# BINANCE_HTTP_PROXY=http://127.0.0.1:3128
# BINANCE_HTTPS_PROXY=http://127.0.0.1:3128
# 开仓多周期K线图可选
# 开仓多周期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 / DAILY_OPEN_HARD_LIMIT说明文档 docs/daily-open-limit.md
# 以损定仓按交易账户资金的百分比
# 详见上文 DAILY_OPEN_ALERT_THRESHOLD / DAILY_OPEN_HARD_LIMIT;说明文档 docs/daily-open-limit.md
# 以损定仓(按交易账户资金的百分比)
# RISK_PERCENT=2
# 移动保本触发达到多少R触发与偏移百分比
# 移动保本触发(达到多少R触发)与偏移(百分比)
# BREAKEVEN_RR_TRIGGER=1.0
# 移动保本阶梯每多少R继续上移一次默认1R
# 移动保本阶梯(每多少R继续上移一次,默认1R)
# BREAKEVEN_STEP_R=1.0
# BREAKEVEN_OFFSET_PCT=0.02
# 开单风格默认值trend / swing
# 开单风格默认值:trend / swing
# DEFAULT_TRADE_STYLE=trend
APP_TIMEZONE=Asia/Shanghai
# TRADING_DAY_RESET_HOUR 现在表示「北京时间」整点默认 8 点起算新交易日开仓整点限制见 TRADING_DAY_RESET_OPEN_GUARD_ENABLED
# TRADING_DAY_RESET_HOUR 现在表示「北京时间」整点,默认 8 点起算新交易日;开仓整点限制见 TRADING_DAY_RESET_OPEN_GUARD_ENABLED
+31 -31
View File
@@ -1,22 +1,22 @@
# crypto_monitor_binance
基于 **Flask** 的加密货币 **下单监控 / 关键位监控 / 交易复盘** 小系统行情与实盘接口统一走 **BinanceUSDT-M 永续**通过 **ccxt** 访问
基于 **Flask** 的加密货币 **下单监控 / 关键位监控 / 交易复盘** 小系统,行情与实盘接口统一走 **Binance(USDT-M 永续)**,通过 **ccxt** 访问.
## 功能概要
- **关键位监控**价格与硬条件校验企业微信推送可选
- **下单监控**本地风控含移动保本逻辑)、触达止盈/止损后尝试市价平仓并记账
- **策略交易**顶栏 `/strategy`趋势回调 + 顺势加仓),见仓库根 [策略交易说明.md](../策略交易说明.md)
- **AI 复盘**OpenAI 兼容网关默认或 Ollama见 [AI复盘与模型配置说明.md](../AI复盘与模型配置说明.md)
- **实盘可选**`LIVE_TRADING_ENABLED=true` 且配置 `BINANCE_API_KEY` / `BINANCE_API_SECRET`支持合约开仓平仓余额读取与内部划转依赖 API 权限
- **止盈止损Binance**市价成交后挂 **`STOP_MARKET`**止损)、**`TAKE_PROFIT_MARKET`**止盈);双向持仓带 `positionSide`不显式传 `reduceOnly`避免 API `-1106`)。触发参考价由 `BINANCE_TRIGGER_WORKING_TYPE` 控制最新价 / 标记价
- **关键位监控**:价格与硬条件校验,企业微信推送(可选)
- **下单监控**:本地风控(含移动保本逻辑),触达止盈/止损后尝试市价平仓并记账
- **策略交易**:顶栏 `/strategy`(趋势回调 + 顺势加仓),见仓库根 [策略交易说明.md](../策略交易说明.md)
- **AI 复盘**:OpenAI 兼容网关(默认)或 Ollama,见 [AI复盘与模型配置说明.md](../AI复盘与模型配置说明.md)
- **实盘(可选)**:`LIVE_TRADING_ENABLED=true` 且配置 `BINANCE_API_KEY` / `BINANCE_API_SECRET`,支持合约开仓,平仓,余额读取与内部划转(依赖 API 权限)
- **止盈止损(Binance)**:市价成交后挂 **`STOP_MARKET`**(止损),**`TAKE_PROFIT_MARKET`**(止盈);双向持仓带 `positionSide`;不显式传 `reduceOnly`(避免 API `-1106`).触发参考价由 `BINANCE_TRIGGER_WORKING_TYPE` 控制(最新价 / 标记价)
## 环境要求
- Python 3.10+建议
- 依赖`flask``requests``ccxt``werkzeug``Pillow`K 线图可选);经 SOCKS 代理时需 **`PySocks`**
- Python 3.10+(建议)
- 依赖:`flask`,`requests`,`ccxt`,`werkzeug`,`Pillow`(K 线图可选);经 SOCKS 代理时需 **`PySocks`**
安装示例
安装示例:
```bash
# 推荐在 /opt/crypto_monitor 执行仓库根目录 deploy/setup_env.sh
@@ -25,31 +25,31 @@ source .venv/bin/activate
pip install -r ../requirements.txt
```
页面上的 **「当日资金(交易账户)」** 与 **「可开仓」可用 U** 仅统计 **Binance U 本位永续合约账户**`fetch_balance``swap` / FAPI `assets` 中的 USDT),**不会**再用现货余额顶替
页面上的 **「当日资金(交易账户)」** 与 **「可开仓」可用 U** 仅统计 **Binance U 本位永续合约账户**(`fetch_balance``swap` / FAPI `assets` 中的 USDT),**不会**再用现货余额顶替.
## 配置说明`.env.example` → `.env`
## 配置说明(`.env.example` → `.env`)
- **`.env.example`**模板可提交 Git);首次`cp .env.example .env` 后编辑
- **`.env`**本机真实配置勿提交);`app.py` 只读此文件`git pull` 不覆盖 `.env`升级前可 `cp .env .env.backup.$(date +%Y%m%d)`
- **`.env.example`**:模板(可提交 Git);首次:`cp .env.example .env` 后编辑.
- **`.env`**:本机真实配置(勿提交);`app.py` 只读此文件.`git pull` 不覆盖 `.env`;升级前可 `cp .env .env.backup.$(date +%Y%m%d)`.
与 Binance 相关的常用变量
与 Binance 相关的常用变量:
| 变量 | 说明 |
|------|------|
| `BINANCE_API_KEY` / `BINANCE_API_SECRET` | 币安 API需合约等权限 |
| `LIVE_TRADING_ENABLED` | `true` 时允许真实下单`false` 仅本地逻辑 |
| `BINANCE_API_KEY` / `BINANCE_API_SECRET` | 币安 API(需合约等权限) |
| `LIVE_TRADING_ENABLED` | `true` 时允许真实下单;`false` 仅本地逻辑 |
| `BINANCE_MARGIN_MODE` | `cross` 全仓 / `isolated` 逐仓 |
| `BINANCE_POSITION_MODE` | `hedge` 双向需账户开启双向持仓/ `oneway` 单向 |
| `BINANCE_TRIGGER_WORKING_TYPE` | `CONTRACT_PRICE``MARK_PRICE`条件单触发参考 |
| `BINANCE_SOCKS_PROXY` / `BINANCE_HTTP_PROXY` | 可选代理与部署文档一致 |
| `EXCHANGE_DISPLAY_NAME` | 页面展示的交易所名称默认 `Binance` |
| `BINANCE_POSITION_MODE` | `hedge` 双向(需账户开启双向持仓)/ `oneway` 单向 |
| `BINANCE_TRIGGER_WORKING_TYPE` | `CONTRACT_PRICE``MARK_PRICE`(条件单触发参考) |
| `BINANCE_SOCKS_PROXY` / `BINANCE_HTTP_PROXY` | 可选代理(与部署文档一致) |
| `EXCHANGE_DISPLAY_NAME` | 页面展示的交易所名称,默认 `Binance` |
| `BINANCE_ACCOUNT_LABEL` | 推送文案中的账户备注 |
其余变量登录企业微信风控参数**`AI_PROVIDER` / `OPENAI_*` / `OLLAMA_*`**数据库路径等**`.env.example` 内注释** 或 `app.py` 顶部默认值
其余变量(登录,企业微信,风控参数,**`AI_PROVIDER` / `OPENAI_*` / `OLLAMA_*`**,数据库路径等)**`.env.example` 内注释** 或 `app.py` 顶部默认值.
## 运行
生产环境使用 **PM2**`ecosystem.config.cjs`)。临时调试
生产环境使用 **PM2**(`ecosystem.config.cjs`).临时调试:
```bash
cd /opt/crypto_monitor/crypto_monitor_binance
@@ -57,13 +57,13 @@ source .venv/bin/activate
python app.py
```
环境说明见 [docs/ubuntu-server.md](../docs/ubuntu-server.md)
环境说明见 [docs/ubuntu-server.md](../docs/ubuntu-server.md).
默认监听端口由 `.env``APP_PORT` 决定未设置时多为 `5000`)。
默认监听端口由 `.env``APP_PORT` 决定(未设置时多为 `5000`).
## 部署Linux / PM2 / SSH SOCKS
## 部署(Linux / PM2 / SSH SOCKS)
详见 **[部署文档.md](./部署文档.md)**Ubuntu + PM2 + 可选 SOCKS 访问 Binance)。
详见 **[部署文档.md](./部署文档.md)**(Ubuntu + PM2 + 可选 SOCKS 访问 Binance).
## 自检脚本
@@ -71,13 +71,13 @@ python app.py
python scripts/verify_binance_funding.py
```
用于核对 Key 前缀不含 Secret并尝试读取资金钱包 / 合约钱包 USDT需网络与 API 权限)。
用于核对 Key 前缀(不含 Secret)并尝试读取资金钱包 / 合约钱包 USDT(需网络与 API 权限).
## 数据与脚本
- 默认 SQLite`crypto.db`路径由 `DB_PATH` 指定
- `scripts/fix_breakeven_labels.py`批量修正「止损」但盈亏为正的记录标签见部署文档附录
- 默认 SQLite:`crypto.db`(路径由 `DB_PATH` 指定)
- `scripts/fix_breakeven_labels.py`:批量修正「止损」但盈亏为正的记录标签(见部署文档附录)
## 风险与合规
实盘交易有亏损风险请自行确认 API 权限IP 白名单杠杆与保证金模式与币安账户设置一致并遵守当地法律法规与 Binance 用户协议
实盘交易有亏损风险.请自行确认 API 权限,IP 白名单,杠杆与保证金模式与币安账户设置一致,并遵守当地法律法规与 Binance 用户协议.
File diff suppressed because it is too large Load Diff
+6 -6
View File
@@ -1,14 +1,14 @@
/**
* PM2 进程定义Ubuntu / Linux)。
* PM2 进程定义(Ubuntu / Linux).
*
* 仅托管 Flask 应用**SSH SOCKS 隧道**用 `ssh -D` 常驻可用 tmux / autossh),勿交给 PM2
* 与 `.env` 里 `BINANCE_SOCKS_PROXY` 端口一致即可不必交给 PM2
* 仅托管 Flask 应用.**SSH SOCKS 隧道**用 `ssh -D` 常驻(可用 tmux / autossh),勿交给 PM2.
* 与 `.env` 里 `BINANCE_SOCKS_PROXY` 端口一致即可;不必交给 PM2.
*
* 使用前项目根目录存在 `.venv`且已安装依赖走 SOCKS 时需 PySocks)。
* 使用前:项目根目录存在 `.venv`,且已安装依赖(走 SOCKS 时需 PySocks).
*
* 启动
* 启动:
* pm2 start ecosystem.config.cjs
* 保存开机列表
* 保存开机列表:
* pm2 save && pm2 startup
*/
const path = require("path");
@@ -1,18 +1,18 @@
#!/usr/bin/env python3
"""
一次性修复历史交易记录标签
将 trade_records 里“止损但实际盈利”的记录改为“保本止盈”
一次性修复历史交易记录标签:
将 trade_records 里“止损但实际盈利”的记录改为“保本止盈”.
默认条件可通过参数修改):
默认条件(可通过参数修改):
- monitor_type = 下单监控
- result = 止损
- pnl_amount > 0
用法示例
1) 仅预览不落库):
用法示例:
1) 仅预览(不落库):
python scripts/fix_breakeven_labels.py --db ./crypto.db --dry-run
2) 执行修复
2) 执行修复:
python scripts/fix_breakeven_labels.py --db ./crypto.db --apply
"""
@@ -115,15 +115,15 @@ def build_section(order_loop: str) -> str:
{{% endif %}}
</{t}>
<{t} class="rule-tip" id="order-rule-tip">
规则最多 {{{{ max_active_positions }}}}BTC {{{{ btc_leverage }}}}x / 山寨 {{{{ alt_leverage }}}}x
{{% if can_trade %}}可开仓{{% else %}}不可开仓持仓已满或未到北京时间 {{{{ reset_hour }}}}:00{{% endif %}}
规则:最多 {{{{ max_active_positions }}}};BTC {{{{ btc_leverage }}}}x / 山寨 {{{{ alt_leverage }}}}x;
{{% if can_trade %}}可开仓{{% else %}}不可开仓(持仓已满或未到北京时间 {{{{ reset_hour }}}}:00){{% endif %}};
人工开仓盈亏比不得低于 {{{{ manual_min_planned_rr }}}}:1
</{t}>
<{t} class="rule-tip">
以损定仓风险 {{{{ risk_percent }}}}% |移动保本下单可勾选关闭开启时 {{{{ breakeven_rr_trigger }}}}R 触发每 1R 阶梯上移),偏移 {{{{ breakeven_offset_pct }}}}%
以损定仓:风险 {{{{ risk_percent }}}}% |移动保本:下单可勾选关闭;开启时 {{{{ breakeven_rr_trigger }}}}R 触发(每 1R 阶梯上移),偏移 {{{{ breakeven_offset_pct }}}}%
</{t}>
<{t} class="rule-tip">
划转自动划转 {{{{ '开启' if auto_transfer_enabled else '关闭' }}}}每天<strong>北京时间 {{{{ auto_transfer_bj_hour }}}}:00</strong>起该整点小时内尝试账簿按 <strong>UTC 自然日</strong>去重界面时间为北京{{{{ auto_transfer_to }}}} 补足到 {{{{ auto_transfer_amount }}}}U来自 {{{{ auto_transfer_from }}}}
划转:自动划转 {{{{ '开启' if auto_transfer_enabled else '关闭' }}}}(每天<strong>北京时间 {{{{ auto_transfer_bj_hour }}}}:00</strong>起该整点小时内尝试;账簿按 <strong>UTC 自然日</strong>去重;界面时间为北京;{{{{ auto_transfer_to }}}} 补足到 {{{{ auto_transfer_amount }}}}U,来自 {{{{ auto_transfer_from }}}})
</{t}>
<form action="/manual_transfer" method="post" class="form-row">
<input name="amount" type="number" min="0.01" step="0.01" placeholder="手动划转金额U" required>
@@ -145,8 +145,8 @@ def build_section(order_loop: str) -> str:
<option value="">方向</option><option value="long">做多</option><option value="short">做空</option>
</select>
<select id="sltp-mode" name="sltp_mode">
<option value="price">止盈止损价格模式</option>
<option value="pct">止盈止损百分比模式</option>
<option value="price">止盈止损:价格模式</option>
<option value="pct">止盈止损:百分比模式</option>
</select>
<select name="trade_style" required>
<option value="trend">趋势单</option>
@@ -154,17 +154,17 @@ def build_section(order_loop: str) -> str:
</select>
<input id="order-leverage" name="leverage" type="number" min="1" step="1" placeholder="杠杆(可选)">
<label style="display:flex;align-items:center;gap:4px;font-size:.82rem;color:#cfd3ef">
<input type="checkbox" name="breakeven_enabled" value="1" checked> 启用移动保本关闭则仅保留初始止损与交易所挂单
<input type="checkbox" name="breakeven_enabled" value="1" checked> 启用移动保本(关闭则仅保留初始止损与交易所挂单)
</label>
<label style="display:flex;align-items:center;gap:4px;font-size:.82rem;color:#cfd3ef">
<input type="checkbox" name="order_chart" value="true"> 开仓后生成多周期K线图各周期100根含开平仓标记
<input type="checkbox" name="order_chart" value="true"> 开仓后生成多周期K线图(各周期100根,含开平仓标记)
</label>
<span style="display:flex;align-items:center;padding:0 10px;font-size:.8rem;color:#8fc8ff">成交价自动取交易所实时+成交回报</span>
<input id="order-sl" name="sl" step="any" placeholder="止损价格" required>
<input id="order-tp" name="tgt" step="any" placeholder="止盈价格" required>
<input id="order-sl-pct" name="sl_pct" type="number" min="0.01" step="0.01" placeholder="止损%" style="display:none">
<input id="order-tp-pct" name="tp_pct" type="number" min="0.01" step="0.01" placeholder="止盈%" style="display:none">
<button type="submit">开仓以损定仓</button>
<button type="submit">开仓(以损定仓)</button>
</form>
</{t}>
<{t} class="card">
@@ -218,7 +218,7 @@ if(addOrderForm){
const mode = (document.getElementById("sltp-mode")||{}).value || "price";
let sl, tp, entry;
if(mode === "pct"){
alert("百分比模式请确认盈亏比后再提交建议使用价格模式以便校验");
alert("百分比模式请确认盈亏比后再提交;建议使用价格模式以便校验.");
return;
}
sl = Number((document.getElementById("order-sl")||{}).value);
@@ -231,12 +231,12 @@ if(addOrderForm){
if(px) entry = Number(px);
const rr = calcClientRr(direction, entry, sl, tp);
if(rr === null || rr < MANUAL_MIN_PLANNED_RR){
alert(`计划盈亏比 ${rr === null ? '无效' : rr.toFixed(2)}:1 低于最低要求 ${MANUAL_MIN_PLANNED_RR}:1已阻止人工下单`);
alert(`计划盈亏比 ${rr === null ? '无效' : rr.toFixed(2)}:1 低于最低要求 ${MANUAL_MIN_PLANNED_RR}:1,已阻止人工下单.`);
return;
}
addOrderForm.submit();
})
.catch(()=>{ ev.preventDefault(); alert("无法校验盈亏比请稍后重试"); });
.catch(()=>{ ev.preventDefault(); alert("无法校验盈亏比,请稍后重试"); });
ev.preventDefault();
});
}
@@ -244,27 +244,27 @@ if(addOrderForm){
text = text.replace("refreshOrderDefaults();", hook + "\nrefreshOrderDefaults();")
if "max_active_positions" not in text and "order-rule-tip" in text:
text = text.replace(
"规则单仓",
"规则最多 {{ max_active_positions }} 仓",
"规则:单仓;",
"规则:最多 {{ max_active_positions }} 仓;",
)
# account snapshot tip
old_tip = '`规则单仓BTC {{ btc_leverage }}x'
old_tip = '`规则:单仓;BTC {{ btc_leverage }}x'
if old_tip in text:
text = text.replace(
old_tip,
"`规则最多 ${data.max_active_positions || {{ max_active_positions }}} 仓BTC {{ btc_leverage }}x",
"`规则:最多 ${data.max_active_positions || {{ max_active_positions }}} 仓;BTC {{ btc_leverage }}x",
)
text = text.replace(
'const canTradeText = data.can_trade ? "可开仓" : "不可开仓有持仓或未到北京时间 {{ reset_hour }}:00";',
'const canTradeText = data.can_trade ? "可开仓" : `不可开仓持仓 ${data.active_count||0}/${data.max_active_positions||{{ max_active_positions }}} 或未到北京时间 {{ reset_hour }}:00`;',
'const canTradeText = data.can_trade ? "可开仓" : "不可开仓(有持仓或未到北京时间 {{ reset_hour }}:00)";',
'const canTradeText = data.can_trade ? "可开仓" : `不可开仓(持仓 ${data.active_count||0}/${data.max_active_positions||{{ max_active_positions }}} 或未到北京时间 {{ reset_hour }}:00)`;',
)
text = text.replace(
"if(!data.in_top30){",
"const rankMax = data.rank_max || 30;\n if(!data.in_top30){",
)
text = text.replace(
"不在前30已拦截",
"不在前${rankMax}已拦截",
"不在前30,已拦截",
"不在前${rankMax},已拦截",
)
# conditional price refresh
if "data-page" in text and "refreshPriceSnapshotConditional" not in text:
@@ -68,8 +68,8 @@ if "key_monitor_page" not in g:
" can_trade = trading_day_reset_allows_new_open(now) and active_count == 0\n conn.close()\n return render_template(",
""" can_trade = trading_day_reset_allows_new_open(now) and active_count < MAX_ACTIVE_POSITIONS
key_gate_rule_text = (
f"周期 {KLINE_TIMEFRAME}|确认K突破棒偏移 {KEY_CONFIRM_BREAKOUT_BAR}确认棒偏移 {KEY_CONFIRM_BAR}"
f"量能突破量 > 前{KEY_VOLUME_MA_BARS}均量×{KEY_VOLUME_RATIO_MIN}"
f"周期 {KLINE_TIMEFRAME}|确认K:突破棒偏移 {KEY_CONFIRM_BREAKOUT_BAR},确认棒偏移 {KEY_CONFIRM_BAR}"
f"量能:突破量 > 前{KEY_VOLUME_MA_BARS}均量×{KEY_VOLUME_RATIO_MIN}"
f"自动开仓盈亏比 > {KEY_AUTO_MIN_PLANNED_RR}:1|日成交量排名前 {KEY_DAILY_VOLUME_RANK_MAX}"
)
conn.close()
@@ -2,8 +2,8 @@
"""
python scripts/verify_binance_funding.py
打印 BINANCE_API_KEY 前 8 位便于与 Binance 控制台核对不含 Secret)。用于服务器自检
对比 App资产 → 资金账户(Funding) / 现货账户(Spot) / U本位合约
打印 BINANCE_API_KEY 前 8 位便于与 Binance 控制台核对(不含 Secret).用于服务器自检.
对比 App:资产 → 资金账户(Funding) / 现货账户(Spot) / U本位合约.
"""
import os
import sys
@@ -30,9 +30,9 @@ def main():
k = (os.getenv("BINANCE_API_KEY") or "").strip()
s = (os.getenv("BINANCE_API_SECRET") or "").strip()
if not k or "REPLACE" in k.upper():
print("WARN: BINANCE_API_KEY 为空或仍像占位符请核对 .env")
print("WARN: BINANCE_API_KEY 为空或仍像占位符,请核对 .env")
if not s or "REPLACE" in s.upper():
print("WARN: BINANCE_API_SECRET 为空或仍像占位符请核对 .env")
print("WARN: BINANCE_API_SECRET 为空或仍像占位符,请核对 .env")
print("BINANCE_API_KEY prefix (8 chars):", (k[:8] + "") if len(k) > 8 else "(short)")
print("BINANCE_FUNDING_INCLUDE_SPOT:", os.getenv("BINANCE_FUNDING_INCLUDE_SPOT", "false"))
@@ -29,9 +29,9 @@
<div class="row" style="justify-content:space-between">
<div class="row">
<a class="btn" href="/">返回首页</a>
<strong style="color:#dbe4ff">实盘下单放大100根K线</strong>
<strong style="color:#dbe4ff">实盘下单放大(100根K线)</strong>
</div>
<div class="status">最近刷新<span id="updated-at">--</span></div>
<div class="status">最近刷新:<span id="updated-at">--</span></div>
</div>
{% if orders %}
<div class="row" style="margin-top:10px">
@@ -53,7 +53,7 @@
<span id="load-status" class="status"></span>
</div>
{% else %}
<div class="empty">当前没有激活订单无法展示放大K线</div>
<div class="empty">当前没有激活订单,无法展示放大K线.</div>
{% endif %}
</div>
+139 -139
View File
@@ -1,139 +1,139 @@
# 使用说明
**本文件对应仓库`crypto_monitor_binance`Binance U 本位永续)。**
功能界面与 **Gate.io USDT 永续版**目录 `crypto_monitor_gate`基本一致差异主要在 **`.env` 里交易所密钥与部分参数名**`BINANCE_*` / `GATE_*`),文末有对照
**部署代理PM2 等**请参考本仓库说明或 **`crypto_monitor_gate`** 下的 **`部署文档.md`**该文以 Gate + SSH SOCKS 为例Binance 侧将 API 与密钥改为 `BINANCE_*` 即可类比)。
**关键位自动开仓的规则RR结案原因**见本目录 **`关键位自动下单说明.md`**
---
## 1. 它能做什么
面向个人盘面的 **Web 控制台**主要能力包括
| 模块 | 说明 |
|------|------|
| **关键位监控** | 录入上/下沿与类型**5m 收线** 做硬条件过滤符合条件后 **企业微信** 提醒部分类型可 **自动市价开仓**见第 4 节与专门文档)。 |
| **实盘下单监控** | 手工填止损/止盈**以损定仓** 市价开单挂上条件止盈止损并在页面跟踪浮盈亏保本逻辑等 |
| **交易记录 / 复盘** | 平仓结果盈亏错过的单等归档与导出可选 **AI 复盘**见仓库根 [AI复盘与模型配置说明.md](../AI复盘与模型配置说明.md))。 |
| **策略交易** | 顶栏 `/strategy`**趋势回调**(左)**顺势加仓**(右)左右并列细则见 [策略交易说明.md](../策略交易说明.md) |
| **策略交易记录** | 顶栏 `/strategy/records`趋势/顺势分两栏可筛选库内保留最近 100 条结束快照 |
后台按 **`MONITOR_POLL_SECONDS`**默认几秒轮询行情与监控逻辑**切勿**在未理解规则时同时运行两套程序共用一个实盘账户
---
## 2. 运行前必须配置`.env`
首次在本目录执行 **`cp .env.example .env`**再编辑 `.env``.env` 勿提交 Git`git pull` 不会改你的 `.env`升级前建议 `cp .env .env.backup.$(date +%Y%m%d)`)。
至少检查以下项具体键名以 **`.env.example`** 为准):
| 类别 | 说明 |
|------|------|
| **登录网页** | `APP_PASSWORD`打开站点后的登录口令`FLASK_SECRET_KEY`Session 密钥请勿使用默认值 |
| **企业微信** | `WECHAT_WEBHOOK`告警与关键位推送机器人的 Webhook |
| **是否真下单** | `LIVE_TRADING_ENABLED=false`**不会**向交易所发送开仓指令适合测试流程)。改为 `true` 且密钥正确才会实盘 |
| **交易所 API** | **本仓库** `BINANCE_API_KEY``BINANCE_API_SECRET`永续相关见 `BINANCE_MARGIN_MODE``BINANCE_POSITION_MODE``BINANCE_TRIGGER_WORKING_TYPE`**勿**把 `.env` 提交到 Git |
| **关键位 RR / 止损外扩** | `KEY_AUTO_MIN_PLANNED_RR``KEY_STOP_OUTSIDE_BREAKOUT_PCT`详见 `关键位自动下单说明.md`)。 |
| **AI 复盘** | 默认 `AI_PROVIDER=openai``OPENAI_API_BASE=https://op.bz121.com/v1``OPENAI_API_KEY``OPENAI_MODEL=gemma4:e4b``AI_PROVIDER=ollama` + `OLLAMA_API` / `AI_MODEL`详见 [AI复盘与模型配置说明.md](../AI复盘与模型配置说明.md) |
网络需要代理时可配置 **`BINANCE_SOCKS_PROXY` / `BINANCE_HTTP_PROXY`**与 Gate 版 `GATE_*_PROXY` 用法类似)。
---
## 3. 如何启动与登录
1. 准备 Python 虚拟环境并安装依赖`flask``requests``ccxt`按需 `Pillow``PySocks`),配置好 `.env`
2. 启动 Flask 应用可用 **`ecosystem.config.cjs`** 交给 PM2或本地 `python app.py` / `flask run`以你当前脚本为准)。
3. 浏览器访问站点打开 **`/login`**使用 **`.env` 里的 `APP_PASSWORD`** 登录
登录后顶栏**关键位监控** | **实盘下单**默认首页| **策略交易**`/strategy`趋势回调 + 顺势加仓双栏| **策略交易记录**`/strategy/records`最近 100 条结束快照| **交易记录与复盘** | **统计分析**
---
## 4. 关键位监控顶栏「关键位监控」→ `/key_monitor`
### 4.1 添加一条关键位
1. **币种**`BTC``BTC/USDT`会规范成内部符号)。
2. **类型**必选其一):
| 类型 | 行为摘要 |
|------|----------|
| **箱体突破** | 通过门控且计划 RR 达标 → **自动市价开仓**`LIVE_TRADING_ENABLED=true` 且无其他持仓占位)。结案后本条从列表消失并记入历史 |
| **收敛突破** | 同上自动开仓类)。 |
| **关键阻力位** | **不自动开仓**触发后 **发 1 次微信**然后本条 **结案进历史** |
| **关键支撑位** | 同上仅提醒)。 |
| **回调触价开仓** | **不挂交易所限价**标记价回调触达 E 后 **下一轮询市价开仓**RR 门槛同 `KEY_AUTO_MIN_PLANNED_RR`);有效期 **24h** |
| **突破触价开仓** | **不挂交易所限价**标记价 **穿越 E 立即市价开仓**先触 SL/TP 侧失效有效期 **24h** |
3. **方向**做多 / 做空回调/突破触价箱体 / 收敛 / 斐波必选阻力/支撑不选)。
4. **价位**箱体/收敛/阻力/支撑填 **上沿 / 下沿**触价填 **入场 E / 止损 SL / 止盈 TP**
**限制**
活跃持仓数达到 **`MAX_ACTIVE_POSITIONS`**默认 1)时,**不允许**再添加「**箱体突破** / **收敛突破**仍可添加「**关键阻力位 / 支撑位**」
**4h EMA55** 与你的方向逆势页面会 **额外 Flash 提示****不阻挡**提交
### 4.2 触发后会发生什么简版
- **箱体 / 收敛**门控通过后算计划 SL/TP 与 RR不达标 → 微信说明 + **`rr_insufficient`** 结案达标 → **市价开仓**成功 **`auto_opened`** / 失败 **`exchange_failed`**均不重试同一关键位
- **阻力 / 支撑****单次推送****`key_level_alert_only`** 结案
详细公式与字段见 **`关键位自动下单说明.md`**
### 4.3 列表与历史
当前条目与历史记录的用法与 Gate 版相同结案后可在历史区查阅 **`close_reason`**
---
## 5. 实盘下单顶栏「实盘下单」→ `/trade`
- 持仓上限由 **`MAX_ACTIVE_POSITIONS`** 控制默认 1)。
- **人工开仓**计划盈亏比不得低于 **`MANUAL_MIN_PLANNED_RR`**默认 1.4:1)。
- 填写币种方向杠杆可选)、止损/止盈价格或百分比按表单)。
- 移动保本等选项按页面与 `.env` 默认
开仓成功后卡片 **「来源」**手工一般为 **下单监控**关键位自动为 **关键位监控**
---
## 6. 企业微信
推送逻辑与 Gate 版一致未配置 **`WECHAT_WEBHOOK`** 时可能没有消息请以 **交易所端** 核对持仓与挂单
---
## 7. 强烈建议的风险与运维习惯
1. **先用 `LIVE_TRADING_ENABLED=false`** 熟悉流程再实盘
2. **API 权限**最小化密钥勿泄露
3. **同一账户避免多程序重复开仓**
4. **自动备份**服务器上执行 `bash scripts/install_backup_cron.sh`每天北京时间 0:00 → `/root/backups`保留 30 天);升级前也可 `bash scripts/backup_data.sh` 手动跑一次
5. 升级代码后留意 **首轮启动**有无数据库迁移报错
---
## 8. 常见问题简要
| 现象 | 可自查 |
|------|--------|
| 关键位永远不触发 | 门控五项日成交量排名`KLINE_TIMEFRAME` |
| 有信号但不自动开仓 | `LIVE_TRADING_ENABLED`RR 阈值是否已有持仓API/保证金错误信息 |
| 加不了箱体/收敛 | 是否已有持仓 |
| 推送收不到 | Webhook网络 |
---
## 9. Gate 版`crypto_monitor_gate`差异速查
| 项目 | Binance 本仓库 | Gate 版 |
|------|----------------|--------|
| API 变量 | `BINANCE_API_KEY``BINANCE_API_SECRET``BINANCE_*` | `GATE_API_KEY``GATE_API_SECRET``GATE_*` |
| 代理示例 | `BINANCE_SOCKS_PROXY` | `GATE_SOCKS_PROXY` |
| TP/SL 实现 | `_binance_place_tp_sl_orders` | `_gate_place_tp_sl_orders``GATE_TPSL_*` |
| 资金舍入口径 | **`FUNDS_DECIMALS`**与记账一致 | 以 Gate 仓库实现为准 |
业务流程登录四种关键位手工单单仓两份程序对齐仅需更换目录与 `.env`
# 使用说明
**本文件对应仓库:`crypto_monitor_binance`(Binance U 本位永续).**
功能,界面与 **Gate.io USDT 永续版**(目录 `crypto_monitor_gate`)基本一致,差异主要在 **`.env` 里交易所密钥与部分参数名**(`BINANCE_*` / `GATE_*`),文末有对照.
**部署,代理,PM2 等**请参考本仓库说明或 **`crypto_monitor_gate`** 下的 **`部署文档.md`**(该文以 Gate + SSH SOCKS 为例;Binance 侧将 API 与密钥改为 `BINANCE_*` 即可类比).
**关键位自动开仓的规则,RR,结案原因**见本目录 **`关键位自动下单说明.md`**.
---
## 1. 它能做什么
面向个人盘面的 **Web 控制台**,主要能力包括:
| 模块 | 说明 |
|------|------|
| **关键位监控** | 录入上/下沿与类型,**5m 收线** 做硬条件过滤;符合条件后 **企业微信** 提醒,部分类型可 **自动市价开仓**(见第 4 节与专门文档). |
| **实盘下单监控** | 手工填止损/止盈,**以损定仓** 市价开单,挂上条件止盈止损,并在页面跟踪浮盈亏,保本逻辑等. |
| **交易记录 / 复盘** | 平仓结果,盈亏,错过的单等归档与导出;可选 **AI 复盘**(见仓库根 [AI复盘与模型配置说明.md](../AI复盘与模型配置说明.md)). |
| **策略交易** | 顶栏 `/strategy`:**趋势回调**(左)**顺势加仓**(右)左右并列;细则见 [策略交易说明.md](../策略交易说明.md). |
| **策略交易记录** | 顶栏 `/strategy/records`:趋势/顺势分两栏,可筛选,库内保留最近 100 条结束快照. |
后台按 **`MONITOR_POLL_SECONDS`**(默认几秒)轮询行情与监控逻辑.**切勿**在未理解规则时同时运行两套程序共用一个实盘账户.
---
## 2. 运行前必须配置(`.env`)
首次在本目录执行 **`cp .env.example .env`**,再编辑 `.env`(`.env` 勿提交 Git;`git pull` 不会改你的 `.env`,升级前建议 `cp .env .env.backup.$(date +%Y%m%d)`).
至少检查以下项(具体键名以 **`.env.example`** 为准):
| 类别 | 说明 |
|------|------|
| **登录网页** | `APP_PASSWORD`:打开站点后的登录口令.`FLASK_SECRET_KEY`:Session 密钥,请勿使用默认值. |
| **企业微信** | `WECHAT_WEBHOOK`:告警与关键位推送机器人的 Webhook. |
| **是否真下单** | `LIVE_TRADING_ENABLED=false`:**不会**向交易所发送开仓指令(适合测试流程).改为 `true` 且密钥正确才会实盘. |
| **交易所 API** | **本仓库:** `BINANCE_API_KEY`,`BINANCE_API_SECRET`;永续相关见 `BINANCE_MARGIN_MODE`,`BINANCE_POSITION_MODE`,`BINANCE_TRIGGER_WORKING_TYPE`.**勿**把 `.env` 提交到 Git. |
| **关键位 RR / 止损外扩** | `KEY_AUTO_MIN_PLANNED_RR`,`KEY_STOP_OUTSIDE_BREAKOUT_PCT`(详见 `关键位自动下单说明.md`). |
| **AI 复盘** | 默认 `AI_PROVIDER=openai`,`OPENAI_API_BASE=https://op.bz121.com/v1`,`OPENAI_API_KEY`,`OPENAI_MODEL=gemma4:e4b`;`AI_PROVIDER=ollama` + `OLLAMA_API` / `AI_MODEL`.详见 [AI复盘与模型配置说明.md](../AI复盘与模型配置说明.md). |
网络需要代理时可配置 **`BINANCE_SOCKS_PROXY` / `BINANCE_HTTP_PROXY`**(与 Gate 版 `GATE_*_PROXY` 用法类似).
---
## 3. 如何启动与登录
1. 准备 Python 虚拟环境并安装依赖(`flask`,`requests`,`ccxt`,按需 `Pillow`,`PySocks`),配置好 `.env`.
2. 启动 Flask 应用(可用 **`ecosystem.config.cjs`** 交给 PM2,或本地 `python app.py` / `flask run`,以你当前脚本为准).
3. 浏览器访问站点,打开 **`/login`**,使用 **`.env` 里的 `APP_PASSWORD`** 登录.
登录后顶栏:**关键位监控** | **实盘下单**(默认首页)| **策略交易**(`/strategy`,趋势回调 + 顺势加仓双栏)| **策略交易记录**(`/strategy/records`,最近 100 条结束快照)| **交易记录与复盘** | **统计分析**.
---
## 4. 关键位监控(顶栏「关键位监控」→ `/key_monitor`)
### 4.1 添加一条关键位
1. **币种**:`BTC``BTC/USDT`(会规范成内部符号).
2. **类型**(必选其一):
| 类型 | 行为摘要 |
|------|----------|
| **箱体突破** | 通过门控且计划 RR 达标 → **自动市价开仓**(`LIVE_TRADING_ENABLED=true` 且无其他持仓占位).结案后本条从列表消失并记入历史. |
| **收敛突破** | 同上(自动开仓类). |
| **关键阻力位** | **不自动开仓**;触发后 **发 1 次微信**,然后本条 **结案进历史**. |
| **关键支撑位** | 同上(仅提醒). |
| **回调触价开仓** | **不挂交易所限价**;标记价回调触达 E 后 **下一轮询市价开仓**(RR 门槛同 `KEY_AUTO_MIN_PLANNED_RR`);有效期 **24h** |
| **突破触价开仓** | **不挂交易所限价**;标记价 **穿越 E 立即市价开仓**;先触 SL/TP 侧失效;有效期 **24h** |
3. **方向**:做多 / 做空(回调/突破触价,箱体 / 收敛 / 斐波必选;阻力/支撑不选).
4. **价位**:箱体/收敛/阻力/支撑填 **上沿 / 下沿**;触价填 **入场 E / 止损 SL / 止盈 TP**.
**限制:**
活跃持仓数达到 **`MAX_ACTIVE_POSITIONS`**(默认 1)时,**不允许**再添加「**箱体突破** / **收敛突破**;仍可添加「**关键阻力位 / 支撑位**」.
**4h EMA55** 与你的方向逆势,页面会 **额外 Flash 提示**,**不阻挡**提交.
### 4.2 触发后会发生什么(简版)
- **箱体 / 收敛**:门控通过后算计划 SL/TP 与 RR;不达标 → 微信说明 + **`rr_insufficient`** 结案;达标 → **市价开仓**,成功 **`auto_opened`** / 失败 **`exchange_failed`**,均不重试同一关键位.
- **阻力 / 支撑**:**单次推送****`key_level_alert_only`** 结案.
详细公式与字段见 **`关键位自动下单说明.md`**.
### 4.3 列表与历史
当前条目与历史记录的用法与 Gate 版相同;结案后可在历史区查阅 **`close_reason`**.
---
## 5. 实盘下单(顶栏「实盘下单」→ `/trade`)
- 持仓上限由 **`MAX_ACTIVE_POSITIONS`** 控制(默认 1).
- **人工开仓**计划盈亏比不得低于 **`MANUAL_MIN_PLANNED_RR`**(默认 1.4:1).
- 填写币种,方向,杠杆(可选),止损/止盈(价格或百分比按表单).
- 移动保本等选项按页面与 `.env` 默认.
开仓成功后卡片 **「来源」**:手工一般为 **下单监控**;关键位自动为 **关键位监控**.
---
## 6. 企业微信
推送逻辑与 Gate 版一致;未配置 **`WECHAT_WEBHOOK`** 时可能没有消息,请以 **交易所端** 核对持仓与挂单.
---
## 7. 强烈建议的风险与运维习惯
1. **先用 `LIVE_TRADING_ENABLED=false`** 熟悉流程再实盘.
2. **API 权限**最小化,密钥勿泄露.
3. **同一账户避免多程序重复开仓**.
4. **自动备份**:服务器上执行 `bash scripts/install_backup_cron.sh`(每天北京时间 0:00 → `/root/backups`,保留 30 天);升级前也可 `bash scripts/backup_data.sh` 手动跑一次.
5. 升级代码后留意 **首轮启动**有无数据库迁移报错.
---
## 8. 常见问题(简要)
| 现象 | 可自查 |
|------|--------|
| 关键位永远不触发 | 门控五项,日成交量排名,`KLINE_TIMEFRAME`. |
| 有信号但不自动开仓 | `LIVE_TRADING_ENABLED`,RR 阈值,是否已有持仓,API/保证金错误信息. |
| 加不了箱体/收敛 | 是否已有持仓. |
| 推送收不到 | Webhook,网络. |
---
## 9. Gate 版(`crypto_monitor_gate`)差异速查
| 项目 | Binance 本仓库 | Gate 版 |
|------|----------------|--------|
| API 变量 | `BINANCE_API_KEY`,`BINANCE_API_SECRET`,`BINANCE_*` | `GATE_API_KEY`,`GATE_API_SECRET`,`GATE_*` |
| 代理示例 | `BINANCE_SOCKS_PROXY` | `GATE_SOCKS_PROXY` |
| TP/SL 实现 | `_binance_place_tp_sl_orders` | `_gate_place_tp_sl_orders`,`GATE_TPSL_*` |
| 资金舍入口径 | **`FUNDS_DECIMALS`**(与记账一致) | 以 Gate 仓库实现为准 |
业务流程(登录,四种关键位,手工单,单仓)两份程序对齐;仅需更换目录与 `.env`.
@@ -1,192 +1,192 @@
# 关键位监控说明自动开仓 + 人工盯盘
**适用Gate / Binance / OKX 三所实例共用 `lib/key_monitor/key_auto_order_lib.py`**
## 环境开关 `KEY_AUTO_ORDER_ENABLED`默认 `false`
| 计仓模式 | 开关 | 关键位程序自动单 |
|----------|------|------------------|
| `risk`以损定仓 | `false` | **全部关闭**含触价);支撑/阻力微信提醒仍可用 |
| `risk` | `true` | 箱体/收敛/斐波/假突破/触价均可自动旧行为 |
| `full_margin`全仓 | `false` | 全部关闭含触价 |
| `full_margin` | `true` | **仅触价**自动箱体/斐波等仍禁止 |
**不受本开关影响** 人工实盘下单关键支撑/阻力提醒**顺势加仓**`risk`)、趋势回调`risk`)。全仓模式下策略自动仍禁止
修改 `.env` 后须 **重启 PM2**复盘「开仓类型」与统计分段会随开关联动隐藏关键位选项
---
**适用`crypto_monitor_binance`Binance U 本位**
Gate / OKX 见各自目录下同名文档共享逻辑在 `lib/key_monitor/`
本文档与 `.env``check_key_monitors``add_key``_key_hard_checks``_process_key_rs_level_alert` 一致
---
## 一监控类型总览
| 录入类型 | 录入时选方向 | 自动市价开仓 | 触发与结案 |
|----------|--------------|--------------|------------|
| **箱体突破** | **必选** 多/空 | **是**门控 + RR | 条件满足 → 开仓或 `rr_insufficient` / `exchange_failed`**一次性删除** |
| **收敛突破** | **必选** 多/空 | **是**同上 | 同上 |
| **关键阻力位** | **不选**`direction=watch` | **否** | 5m 收盘突破上/下沿 → 微信 **3 次**`key_level_alert_done` |
| **关键支撑位** | **不选** | **否** | 同上与阻力位**相同规则**填上沿+下沿程序双向监控 |
| 斐波回调 0.618 / 0.786 | 必选 | 限价挂单逻辑 | 见斐波说明**不在下文展开** |
| **回调触价开仓** | **必选** 多/空 | **程序盯价 → 回调触 E 后市价** | 见下文 **§四** |
| **突破触价开仓** | **必选** 多/空 | **程序盯价 → 穿越 E 立即市价** | 见下文 **§四** |
**添加时箱体/收敛/斐波/触价):** 品种须 **日成交量排名前 `KEY_DAILY_VOLUME_RANK_MAX`默认 30**上沿 **>** 下沿触价开仓填 E/SL/TP上下沿仅作展示占位)。
---
## 二关键阻力位 / 关键支撑位人工盯盘
### 2.1 录入
- 填写 **上沿 `upper`****下沿 `lower`**程序同时监控两侧**无法预先判定**做多还是做空)。
- 页面 **不显示不要求** 方向库中 `direction` 初始为 `watch`**首次突破后** 写入 `long`向上突破上沿`short`向下突破下沿)。
### 2.2 触发极简
- 周期**`KLINE_TIMEFRAME`默认 5m最近一根已闭合 K** 的 **收盘价**非影线)。
- **向上突破上沿** `收盘 > upper` → 推断方向 **多 / 向上**本次监控任务开始按节奏提醒
- **向下突破下沿** `收盘 < lower` → 推断方向 **空 / 向下**本次任务同样开始提醒
- **任一侧突破即结束本条监控周期**不会在突破后再等待另一侧上沿下沿谁先满足用谁同根 K 仅可能满足一侧)。
**不参与** 量能二确 K越过幅度下限日成交排名运行时)、计划 RR自动开仓
### 2.3 微信提醒次数
| 配置 | 默认 | 含义 |
|------|------|------|
| `KEY_ALERT_MAX_TIMES` | `3` | 突破后最多推送 3 次 |
| `KEY_ALERT_INTERVAL_MINUTES` | `5` | 相邻两次推送至少间隔 5 分钟 |
- 第 1 次首次检测到突破的当次轮询若已闭合 5m 满足条件)。
- 第 23 次仅按间隔推送**不要求**价格仍在箱外)。
- 第 3 次推送后写入 `key_monitor_history``close_reason=**key_level_alert_done**``key_monitors` **删除**
### 2.4 与箱体/收敛的区别
| 项目 | 阻力/支撑 | 箱体/收敛 |
|------|-----------|-----------|
| 方向 | 程序推断 | 人工选择 |
| K 线根数 | 1 根闭合 5m | 2 根突破 K + 确认 K |
| 提醒次数 | 3 次后结案 | 自动单触发后 1 次业务推送并结案 |
---
## 三箱体突破 / 收敛突破自动开仓
### 3.1 K 线结构默认索引
| 角色 | 环境变量 | 默认 | 含义 |
|------|----------|------|------|
| 突破 K | `KEY_CONFIRM_BREAKOUT_BAR` | `-2` | 倒数第 2 根闭合 K |
| 确认 K | `KEY_CONFIRM_BAR` | `-1` | 倒数第 1 根闭合 K |
### 3.2 硬门控须全部通过
1. **有效突破收盘越界**
-`突破 K 收盘 > upper`
-`突破 K 收盘 < lower`
2. **突破越过幅度仅下限**
-`(突破 K 收盘 upper) / upper × 100 > KEY_BREAKOUT_AMP_MIN_PCT`默认 **0.03%**
-`(lower 突破 K 收盘) / lower × 100 >` 同上
- **无上限**突破过猛由 **计划 RR** 过滤
- **不再**使用 K 线实体占开盘价比例`KEY_BREAKOUT_AMP_MAX_PCT` **已不参与门控**
3. **确认 K 不进箱体**
-确认 K 收盘 **`> upper`**不得在 `[lower, upper]`
-确认 K 收盘 **`< lower`**
4. **量能** 突破 K 成交量 > 前 `KEY_VOLUME_MA_BARS`默认 20根均量 × `KEY_VOLUME_RATIO_MIN`默认 1.3
5. **日成交量排名** 运行时仍须前 `KEY_DAILY_VOLUME_RANK_MAX`默认 30
6. **计划 RR最后经济门控):** 按确认 K 收盘 **E** 计算 SL/TP 后`RR` **严格大于** `KEY_AUTO_MIN_PLANNED_RR`默认 1.5才市价开仓
### 3.3 止损 / 止盈确认 K 收盘为 E
箱体高 **H = |upper lower|**止损锚在 **突破 K 极值** 外侧
| 方向 | 止损标准/趋势方案 |
|------|------------------------|
| 多 | 突破 K **最低价** × (1 `KEY_STOP_OUTSIDE_BREAKOUT_PCT`%) |
| 空 | 突破 K **最高价** × (1 + `KEY_STOP_OUTSIDE_BREAKOUT_PCT`%) |
止盈方案见下表与改版前一致):
| 方案 | `sl_tp_mode` | 多SL / TP | 空SL / TP |
|------|--------------|-------------|-------------|
| 标准突破 | `standard` | 突破 K 低外侧% / **E+H** | 突破 K 高外侧% / **EH** |
| 箱体 1R·止盈 1.5H | `box_1p5` | **EH** / **E+1.5×H** | **E+H** / **E1.5×H** |
| 趋势单·自填止盈 | `trend_manual` | 突破 K 低 × (1`KEY_TREND_STOP_OUTSIDE_PCT`%) / **录入止盈** | 突破 K 高外侧% / **录入止盈** |
### 3.4 一次性结案`close_reason`
| `close_reason` | 含义 |
|----------------|------|
| `box_opposite_break` | 标记价先突破反向边界(多:≤下沿;空:≥上沿 |
| `rr_insufficient` | 门控通过但 RR 不达标或 SL/TP 几何无效 |
| `exchange_failed` | RR 达标但实盘/交易所等原因未开仓 |
| `auto_opened` | RR 达标且市价开仓成功 |
| `key_level_alert_done` | 阻力/支撑 **3 次提醒** 完成 |
---
## 四回调 / 突破触价开仓程序触价无交易所挂单
### 4.1 录入
- **回调触价开仓**方向必选多/空填写 **计划入场价 E****止损 SL****止盈 TP**做多须 `SL < E < TP`)。
- **突破触价开仓**同上添加时当前价须在突破方向一侧做多价低于 E做空价高于 E)。
- 计划 RR 以 **E** 为基准**严格大于** `KEY_AUTO_MIN_PLANNED_RR`默认 1.5)。
- 可选移动保本时间平仓**全仓杠杆模式**下可用
### 4.2 触发与结案
| 类型 | 触发条件标记价 |
|------|-------------------|
| **回调触价** | 做多 `≤ E`做空 `≥ E` → 下一轮询市价开仓 |
| **突破触价** | 做多**向上穿越** E做空**向下穿越** E → **立即**市价开仓 |
- 未成交前标记价先触 **TP 侧**`trigger_tp_invalidate`
- **突破触价**另未穿越 E 先触 **SL 侧**`trigger_sl_invalidate`
- **24h** 未触发 → `trigger_entry_expired`
- 成功 → `trigger_entry_filled`触发后开仓失败 → `trigger_exchange_failed`
### 4.3 计仓与占位
- **以损定仓**按 ESL 反推保证金触发时重算**全仓杠杆**可用×缓冲比例BTC/ETH 10x其它 5x
- **占当日开仓意图**已开 + 待触发),未成交不占持仓同币仅 1 条触价监控含回调/突破)。
共享逻辑`trigger_entry_key_monitor_lib.py`轮询`check_trigger_entry_key_monitors`
---
## 五环境与参数`.env` 摘要
| 变量 | 箱体/收敛 | 阻力/支撑 |
|------|-----------|-----------|
| `KEY_BREAKOUT_AMP_MIN_PCT` | 突破越过下限默认 0.03 | 不用 |
| `KEY_BREAKOUT_AMP_MAX_PCT` | **已废弃门控** | 不用 |
| `KEY_VOLUME_*` / `KEY_CONFIRM_*` | 用 | 不用 |
| `KEY_AUTO_MIN_PLANNED_RR` | 用 | 不用 |
| `KEY_ALERT_MAX_TIMES` / `KEY_ALERT_INTERVAL_MINUTES` | 不用 | 用默认 3 次 / 5 分钟 |
| `KEY_DAILY_VOLUME_RANK_MAX` | 添加时 + 运行时 | **仅添加时** |
---
## 六相关代码
| 说明 | 位置 |
|------|------|
| 共享判定 | `key_monitor_lib.py` |
| 主循环 | `check_key_monitors` |
| 自动门控 | `_key_hard_checks` |
| 阻力/支撑提醒 | `_process_key_rs_level_alert` |
| 录入 | `add_key` |
| 开仓 | `_market_open_for_key_monitor` |
# 关键位监控说明(自动开仓 + 人工盯盘)
**适用:Gate / Binance / OKX 三所实例(共用 `lib/key_monitor/key_auto_order_lib.py`)**
## 环境开关 `KEY_AUTO_ORDER_ENABLED`(默认 `false`)
| 计仓模式 | 开关 | 关键位程序自动单 |
|----------|------|------------------|
| `risk`(以损定仓) | `false` | **全部关闭**(含触价);支撑/阻力微信提醒仍可用 |
| `risk` | `true` | 箱体/收敛/斐波/假突破/触价均可自动(旧行为) |
| `full_margin`(全仓) | `false` | 全部关闭(含触价) |
| `full_margin` | `true` | **仅触价**自动;箱体/斐波等仍禁止 |
**不受本开关影响:** 人工实盘下单,关键支撑/阻力提醒,**顺势加仓**(`risk`),趋势回调(`risk`).全仓模式下策略自动仍禁止.
修改 `.env` 后须 **重启 PM2**.复盘「开仓类型」与统计分段会随开关联动隐藏关键位选项.
---
**适用:`crypto_monitor_binance`(Binance U 本位)**
Gate / OKX 见各自目录下同名文档;共享逻辑在 `lib/key_monitor/`.
本文档与 `.env`,`check_key_monitors`,`add_key`,`_key_hard_checks`,`_process_key_rs_level_alert` 一致.
---
## 一,监控类型总览
| 录入类型 | 录入时选方向 | 自动市价开仓 | 触发与结案 |
|----------|--------------|--------------|------------|
| **箱体突破** | **必选** 多/空 | **是**(门控 + RR) | 条件满足 → 开仓或 `rr_insufficient` / `exchange_failed`**一次性删除** |
| **收敛突破** | **必选** 多/空 | **是**(同上) | 同上 |
| **关键阻力位** | **不选**(`direction=watch`) | **否** | 5m 收盘突破上/下沿 → 微信 **3 次**`key_level_alert_done` |
| **关键支撑位** | **不选** | **否** | 同上(与阻力位**相同规则**:填上沿+下沿,程序双向监控) |
| 斐波回调 0.618 / 0.786 | 必选 | 限价挂单逻辑 | 见斐波说明(**不在下文展开**) |
| **回调触价开仓** | **必选** 多/空 | **程序盯价 → 回调触 E 后市价** | 见下文 **§四** |
| **突破触价开仓** | **必选** 多/空 | **程序盯价 → 穿越 E 立即市价** | 见下文 **§四** |
**添加时(箱体/收敛/斐波/触价):** 品种须 **日成交量排名前 `KEY_DAILY_VOLUME_RANK_MAX`(默认 30)**;上沿 **>** 下沿(触价开仓填 E/SL/TP,上下沿仅作展示占位).
---
## 二,关键阻力位 / 关键支撑位(人工盯盘)
### 2.1 录入
- 填写 **上沿 `upper`****下沿 `lower`**(程序同时监控两侧,**无法预先判定**做多还是做空).
- 页面 **不显示,不要求** 方向;库中 `direction` 初始为 `watch`,**首次突破后** 写入 `long`(向上突破上沿)`short`(向下突破下沿).
### 2.2 触发(极简)
- 周期:**`KLINE_TIMEFRAME`(默认 5m)最近一根已闭合 K** 的 **收盘价**(非影线).
- **向上突破上沿:** `收盘 > upper` → 推断方向 **多 / 向上**,本次监控任务开始按节奏提醒.
- **向下突破下沿:** `收盘 < lower` → 推断方向 **空 / 向下**,本次任务同样开始提醒.
- **任一侧突破即结束本条监控周期**(不会在突破后再等待另一侧;上沿,下沿谁先满足用谁,同根 K 仅可能满足一侧).
**不参与:** 量能,二确 K,越过幅度下限,日成交排名(运行时),计划 RR,自动开仓.
### 2.3 微信提醒次数
| 配置 | 默认 | 含义 |
|------|------|------|
| `KEY_ALERT_MAX_TIMES` | `3` | 突破后最多推送 3 次 |
| `KEY_ALERT_INTERVAL_MINUTES` | `5` | 相邻两次推送至少间隔 5 分钟 |
- 第 1 次:首次检测到突破的当次轮询(若已闭合 5m 满足条件).
- 第 2,3 次:仅按间隔推送(**不要求**价格仍在箱外).
- 第 3 次推送后:写入 `key_monitor_history`,`close_reason=**key_level_alert_done**`,`key_monitors` **删除**.
### 2.4 与箱体/收敛的区别
| 项目 | 阻力/支撑 | 箱体/收敛 |
|------|-----------|-----------|
| 方向 | 程序推断 | 人工选择 |
| K 线根数 | 1 根闭合 5m | 2 根(突破 K + 确认 K) |
| 提醒次数 | 3 次后结案 | 自动单:触发后 1 次业务推送并结案 |
---
## 三,箱体突破 / 收敛突破(自动开仓)
### 3.1 K 线结构(默认索引)
| 角色 | 环境变量 | 默认 | 含义 |
|------|----------|------|------|
| 突破 K | `KEY_CONFIRM_BREAKOUT_BAR` | `-2` | 倒数第 2 根闭合 K |
| 确认 K | `KEY_CONFIRM_BAR` | `-1` | 倒数第 1 根闭合 K |
### 3.2 硬门控(须全部通过)
1. **有效突破(收盘越界)**
-:`突破 K 收盘 > upper`
-:`突破 K 收盘 < lower`
2. **突破越过幅度(仅下限)**
-:`(突破 K 收盘 upper) / upper × 100 > KEY_BREAKOUT_AMP_MIN_PCT`(默认 **0.03%**)
-:`(lower 突破 K 收盘) / lower × 100 >` 同上
- **无上限**;突破过猛由 **计划 RR** 过滤.
- **不再**使用 K 线实体占开盘价比例;`KEY_BREAKOUT_AMP_MAX_PCT` **已不参与门控**.
3. **确认 K 不进箱体**
-:确认 K 收盘 **`> upper`**(不得在 `[lower, upper]`)
-:确认 K 收盘 **`< lower`**
4. **量能:** 突破 K 成交量 > 前 `KEY_VOLUME_MA_BARS`(默认 20)根均量 × `KEY_VOLUME_RATIO_MIN`(默认 1.3)
5. **日成交量排名:** 运行时仍须前 `KEY_DAILY_VOLUME_RANK_MAX`(默认 30)
6. **计划 RR(最后经济门控):** 按确认 K 收盘 **E** 计算 SL/TP 后,`RR` **严格大于** `KEY_AUTO_MIN_PLANNED_RR`(默认 1.5)才市价开仓
### 3.3 止损 / 止盈(确认 K 收盘为 E)
箱体高 **H = |upper lower|**.止损锚在 **突破 K 极值** 外侧:
| 方向 | 止损(标准/趋势方案) |
|------|------------------------|
| 多 | 突破 K **最低价** × (1 `KEY_STOP_OUTSIDE_BREAKOUT_PCT`%) |
| 空 | 突破 K **最高价** × (1 + `KEY_STOP_OUTSIDE_BREAKOUT_PCT`%) |
止盈方案见下表(与改版前一致):
| 方案 | `sl_tp_mode` | 多:SL / TP | 空:SL / TP |
|------|--------------|-------------|-------------|
| 标准突破 | `standard` | 突破 K 低外侧% / **E+H** | 突破 K 高外侧% / **EH** |
| 箱体 1R·止盈 1.5H | `box_1p5` | **EH** / **E+1.5×H** | **E+H** / **E1.5×H** |
| 趋势单·自填止盈 | `trend_manual` | 突破 K 低 × (1`KEY_TREND_STOP_OUTSIDE_PCT`%) / **录入止盈** | 突破 K 高外侧% / **录入止盈** |
### 3.4 一次性结案(`close_reason`)
| `close_reason` | 含义 |
|----------------|------|
| `box_opposite_break` | 标记价先突破反向边界(多:≤下沿;空:≥上沿) |
| `rr_insufficient` | 门控通过但 RR 不达标或 SL/TP 几何无效 |
| `exchange_failed` | RR 达标但实盘/交易所等原因未开仓 |
| `auto_opened` | RR 达标且市价开仓成功 |
| `key_level_alert_done` | 阻力/支撑 **3 次提醒** 完成 |
---
## 四,回调 / 突破触价开仓(程序触价,无交易所挂单)
### 4.1 录入
- **回调触价开仓**:方向必选多/空;填写 **计划入场价 E**,**止损 SL**,**止盈 TP**(做多须 `SL < E < TP`).
- **突破触价开仓**:同上;添加时当前价须在突破方向一侧(做多:价低于 E;做空:价高于 E).
- 计划 RR 以 **E** 为基准,**严格大于** `KEY_AUTO_MIN_PLANNED_RR`(默认 1.5).
- 可选移动保本,时间平仓;**全仓杠杆模式**下可用.
### 4.2 触发与结案
| 类型 | 触发条件(标记价) |
|------|-------------------|
| **回调触价** | 做多 `≤ E`;做空 `≥ E` → 下一轮询市价开仓 |
| **突破触价** | 做多**向上穿越** E;做空**向下穿越** E → **立即**市价开仓 |
- 未成交前标记价先触 **TP 侧**`trigger_tp_invalidate`.
- **突破触价**另:未穿越 E 先触 **SL 侧**`trigger_sl_invalidate`.
- **24h** 未触发 → `trigger_entry_expired`.
- 成功 → `trigger_entry_filled`;触发后开仓失败 → `trigger_exchange_failed`.
### 4.3 计仓与占位
- **以损定仓**:按 E,SL 反推保证金,触发时重算;**全仓杠杆**:可用×缓冲比例,BTC/ETH 10x,其它 5x.
- **占当日开仓意图**(已开 + 待触发),未成交不占持仓;同币仅 1 条触价监控(含回调/突破).
共享逻辑:`trigger_entry_key_monitor_lib.py`;轮询:`check_trigger_entry_key_monitors`.
---
## 五,环境与参数(`.env` 摘要)
| 变量 | 箱体/收敛 | 阻力/支撑 |
|------|-----------|-----------|
| `KEY_BREAKOUT_AMP_MIN_PCT` | 突破越过下限(默认 0.03) | 不用 |
| `KEY_BREAKOUT_AMP_MAX_PCT` | **已废弃门控** | 不用 |
| `KEY_VOLUME_*` / `KEY_CONFIRM_*` | 用 | 不用 |
| `KEY_AUTO_MIN_PLANNED_RR` | 用 | 不用 |
| `KEY_ALERT_MAX_TIMES` / `KEY_ALERT_INTERVAL_MINUTES` | 不用 | 用(默认 3 次 / 5 分钟) |
| `KEY_DAILY_VOLUME_RANK_MAX` | 添加时 + 运行时 | **仅添加时** |
---
## 六,相关代码
| 说明 | 位置 |
|------|------|
| 共享判定 | `key_monitor_lib.py` |
| 主循环 | `check_key_monitors` |
| 自动门控 | `_key_hard_checks` |
| 阻力/支撑提醒 | `_process_key_rs_level_alert` |
| 录入 | `add_key` |
| 开仓 | `_market_open_for_key_monitor` |
+147 -147
View File
@@ -1,147 +1,147 @@
# 界面与风控更新说明Binance 实例
## 顶栏导航4 项
| 顺序 | 名称 | 路由 | 说明 |
|------|------|------|------|
| 1 | 关键位监控 | `/key_monitor` | 关键位添加实时门控历史 |
| 2 | 实盘下单 | `/trade` | 人工开仓划转实时持仓**默认首页** `/``/trade` |
| 3 | 交易记录与复盘 | `/records` | 交易记录复盘表单AI 历史受顶栏 UTC 时间窗筛选 |
| 4 | 统计分析 | `/stats` | 按北京时间交易日切日 + 分品类统计块 |
## 关键位监控页
- 标题去掉「5m」规则条从 `.env` 读取周期确认K量能自动开仓盈亏比日成交量排名)。
- 左列活跃关键位**pos-card** 样式展示现价/距上沿/距下沿/门控
- 右列关键位历史失效/结案),与左列等高滚动**受顶栏 UTC 列表时间窗筛选**默认 UTC 当日)。
- 监控类型新增**斐波回调0.618****斐波回调0.786**与 Gate 主站同一套规则计算逻辑见仓库根目录 `fib_key_monitor_lib.py`)。
### 斐波关键位监控方案 A交易所限价
| 项 | 说明 |
|----|------|
| 同币互斥 | 每个币种只能有一条斐波监控0.618 与 0.786 不可并存 |
| 上下沿 | 上沿 **H**下沿 **L**须 H > L |
| 挂单价 E | **做多** `E = H ratio × (H L)`自 H 向下回撤);**做空** `E = L + ratio × (H L)`自 L 向上反弹 |
| 做多 | 限价 @ E止损 L止盈 H |
| 做空 | 限价 @ E止损 H止盈 L |
| 添加后 | **立即**在 Binance U 本位挂限价单卡片显示 **挂E**限价单 ID |
| 失效 | 以**标记价**判断做多且标记价 ≥ H做空且标记价 ≤ L且限价**未成交** → 撤销该限价单并结案 |
| 成交后 | 挂交易所 TP/SL含 Algo 通道条件单→ 写入 **实盘下单监控**`monitor_type=关键位监控``key_signal_type=斐波回调…`→ 从关键位列表移除 |
| 撤单 | 仅撤本条斐波的订单 ID**不会**对该合约 `cancel_all_orders` / 全撤 Algo避免误伤其他委托 |
| 盈亏比 | 计划 RR 须 > `KEY_AUTO_MIN_PLANNED_RR`0.618 理论约 1.6:10.786 约 3.7:1 |
| 日成交量 | 与箱体/收敛相同须在前 `KEY_DAILY_VOLUME_RANK_MAX` 名内方可添加 |
后台轮询`check_fib_key_monitors()`箱体/收敛仍走 `check_key_monitors()`
手动删除关键位时未成交斐波会先撤限价再删库
### 箱体 / 收敛自动开仓来源标注
- 自动开仓写入 `order_monitors.key_signal_type``箱体突破``收敛突破`
- 持仓与交易记录展示「来源 · 信号类型」
## 列表时间窗UTC全站顶栏
共用模块仓库根目录 `history_window_lib.py`Gate / Binance 主站一致)。
| 项 | 说明 |
|----|------|
| 默认 | **UTC 当日**`win_preset=utc_today`从 UTC 0:00 至当前时刻 |
| 可选 | 近 24 小时近 7 天自定义起止UTC`datetime-local` |
| 作用范围 | 关键位历史交易记录列表复盘记录 APIAI 历史 API导出「交易记录」「关键位历史」 |
| 与统计的关系 | **仅影响列表/导出****统计分析页仍按北京时间 `TRADING_DAY_RESET_HOUR`默认 8:00切交易日** |
| 库内时间 | DB 存北京时间字符串后端用 `utc_window_to_bj_sql_strings()` 换算后再 SQL 比较 |
| 切换方式 | 顶栏「列表筛选UTC」→ 选预设 → **应用**保留当前路由`/records?win_preset=…` |
查询参数示例
- `?win_preset=utc_today`
- `?win_preset=utc_last24h` / `utc_last7d`
- `?win_preset=custom&from_utc=2026-05-18 00:00:00&to_utc=2026-05-19 12:00:00`
## 交易记录与复盘
- 交易记录盈亏以**本地估算**为准平仓时按成交/计划价计算);盈亏列可标注 **估**
- 与币安 App 不一致时请在「核对修改」或复盘中 **手工填写** `reviewed_pnl_amount` 覆盖展示不再提供批量「同步交易所盈亏」)。
- **列表默认只显示当前 UTC 时间窗内**的记录见上节);导出 CSV 同步该时间窗
- 表头 **「止损(开仓)」**展示开仓快照 `initial_stop_loss`无则回退 `stop_loss`);核对/复盘仍可用有效止损字段
- 平仓写入 `trade_records``stop_loss``initial_stop_loss` 均写入**开仓时止损快照**`key_signal_type` 保留箱体/收敛/斐波来源`fib_key_monitor_lib.key_signal_type_for_trade_record`)。
- **开仓类型**`entry_reason`):机器单平仓入库时若未手填`key_signal_type` 自动映射见下表);列表/导出「开仓类型」列 = 复盘核对值优先否则入库值否则按信号映射
| `key_signal_type` | 自动写入的 `entry_reason` |
|-------------------|---------------------------|
| 箱体突破 | 关键位箱体突破 |
| 收敛突破 | 关键位收敛突破 |
| 斐波回调0.618 | 关键位斐波0.618 |
| 斐波回调0.786 | 关键位斐波0.786 |
- 复盘表单 **开仓类型** 下拉新增上述四条固定文案与趋势/波段类并列)。
- 复盘 **离场触发** 新增 **「止盈」**从交易记录「填入复盘」时若结果为「止盈/保本止盈/移动止盈/止损/手动平仓」会自动选中对应触发项并按 `key_signal_type` 预填开仓类型
- 勾选「保存时自动生成多周期 K 线图」时**平仓时间** 为锚点各周期向前约 `ORDER_CHART_LIMIT`默认 100根 K 线`_fetch_ohlcv_ending_at`),不再固定拉「最近 100 根」
- `/api/journals``/api/reviews` 支持同一时间窗 query与列表一致
### 导出交易记录 v3
- 文件名`trade_records_v3_YYYYMMDD.csv`
- 相对 v2 增加`key_signal_type``initial_stop_loss`及开仓快照列)、`planned_rr``actual_rr``risk_amount`交易所盈亏与时间字段等末列「开仓类型」为有效展示文案
- 「关键位历史」导出同样受 UTC 时间窗限制
## 实盘下单页
- 左列实盘下单监控表单划转规则)。
- 右列实时持仓独立模块)。
- **人工开仓门控**计划盈亏比 &lt; `MANUAL_MIN_PLANNED_RR`默认 **1.4**时前端弹窗 + 后端拒绝
- **移动保本**勾选启用):监控轮询达到触发 RR 后止损阶梯上移时**同步交易所**——**先撤**该合约全部 TP/SL含 Algo 条件单**再挂**新止损 + 原止盈`replace_active_monitor_tpsl_on_exchange`)。仅交易所成功后才写库失败发企业微信告警未配置实盘 API 时仍只更新本地
## 统计分析页`/stats`
| 项 | 说明 |
|----|------|
| 切日 | **北京时间**交易日边界 = 每日 `TRADING_DAY_RESET_HOUR:00``.env` 默认 **8** |
| 品类下拉 | 页顶 **「统计品类」** 下拉切换默认「全部交易」):全部交易下单监控关键位箱体突破关键位收敛结构关键位斐波0.618关键位斐波0.786一次只显示所选品类的日/周/月 |
| URL | 切换后写入 `stats_segment=``all``manual``key_box``key_conv``key_fib618``key_fib786`),刷新 `/stats` 可保持选项 |
| 每块指标 | 日 / 周 / 月开单次数平仓笔数胜率净盈亏回撤连续亏损等与原口径一致 |
| 开单次数 | 人工块`monitor_type=下单监控` 且无 `key_signal_type`关键位块`order_monitors.key_signal_type` 计数 |
| 不受 UTC 窗影响 | 统计始终基于库内全部已平仓记录按北京交易日归类**不**随顶栏 UTC 列表窗切换 |
## 持仓与计仓
- `MAX_ACTIVE_POSITIONS` 默认 **1**可在 `.env` 调大)。
- 关键位自动开仓在已有持仓时`KEY_SIZING_USE_ZERO_POSITION_SNAPSHOT=true`按**首笔开仓前**交易账户资金快照计仓字段 `trading_sessions.key_sizing_capital_snapshot`)。
## 配置
详见 `.env.example` 中「关键位门控」「交易执行 / 人工风控」注释段
## 自动备份服务器
- 脚本`scripts/backup_data.sh``crypto.db` + `static/images`
- 定时`scripts/install_backup_cron.sh` → 每天 **北京时间 0:00**目录 **`/root/backups/<实例名>/YYYY-MM-DD/`**保留 **30**
- 详见 `部署文档.md` 第 5.4 节自动备份
## 数据库启动时自动迁移
`key_monitors` 斐波字段`fib_limit_order_id``fib_entry_price``fib_stop_loss``fib_take_profit``fib_order_amount``fib_margin_capital``fib_leverage`
`trade_records` / `order_monitors``key_signal_type``exchange_realized_pnl``exchange_opened_at``exchange_closed_at``exchange_sync_key``entry_reason``reviewed_entry_reason``initial_stop_loss`
**历史数据**本次**不做**旧记录的批量回填`entry_reason` / `initial_stop_loss` / `key_signal_type`);仅**新产生**的平仓与复盘按新逻辑写入旧行展示可回退已有字段
## 涉及文件便于排查
| 路径 | 说明 |
|------|------|
| `history_window_lib.py` | UTC 时间窗解析与转北京时间 SQL 字符串 |
| `fib_key_monitor_lib.py` | 斐波计算`KEY_ENTRY_REASON_BY_SIGNAL``entry_reason_from_key_signal` |
| `crypto_monitor_binance/app.py` | 列表筛选统计分块导出 v3复盘 K 线锚点入库逻辑 |
| `crypto_monitor_binance/templates/index.html` | 顶栏时间窗统计分块 UI止损(开仓)列复盘预填 |
## 升级步骤
1. `git pull` 后对比 `.env.example`把新增变量合并进本地 `.env`
2. 在 VPS 上为 Binance / Gate / **各执行一次** `bash scripts/install_backup_cron.sh`若尚未安装)。
3. 重启 Binance 实例`pm2 restart crypto_binance`);SQLite 会自动 `ALTER` 缺列斐波交易所盈亏`entry_reason`)。
4. 浏览器强刷Ctrl+F5避免旧版 `index.html` 缓存
5. 打开任意页确认顶栏出现 **「列表筛选UTC」**`/stats` 可见分品类统计与「北京 8:00 切日」说明
6. 建议先用测试币验证斐波限价挂出标记价失效撤单成交后 TP/SL 与订单监控是否正常平仓后检查交易记录止损(开仓)与开仓类型
# 界面与风控更新说明(Binance 实例)
## 顶栏导航(4 项)
| 顺序 | 名称 | 路由 | 说明 |
|------|------|------|------|
| 1 | 关键位监控 | `/key_monitor` | 关键位添加,实时门控,历史 |
| 2 | 实盘下单 | `/trade` | 人工开仓,划转,实时持仓(**默认首页** `/``/trade`) |
| 3 | 交易记录与复盘 | `/records` | 交易记录,复盘表单,AI 历史(受顶栏 UTC 时间窗筛选) |
| 4 | 统计分析 | `/stats` | 按北京时间交易日切日 + 分品类统计块 |
## 关键位监控页
- 标题去掉「5m」;规则条从 `.env` 读取(周期,确认K,量能,自动开仓盈亏比,日成交量排名).
- 左列:活跃关键位,**pos-card** 样式展示现价/距上沿/距下沿/门控.
- 右列:关键位历史(失效/结案),与左列等高滚动;**受顶栏 UTC 列表时间窗筛选**(默认 UTC 当日).
- 监控类型新增:**斐波回调0.618**,**斐波回调0.786**(与 Gate 主站同一套规则,计算逻辑见仓库根目录 `fib_key_monitor_lib.py`).
### 斐波关键位监控(方案 A:交易所限价)
| 项 | 说明 |
|----|------|
| 同币互斥 | 每个币种只能有一条斐波监控(0.618 与 0.786 不可并存) |
| 上下沿 | 上沿 **H**,下沿 **L**(须 H > L) |
| 挂单价 E | **做多** `E = H ratio × (H L)`(自 H 向下回撤);**做空** `E = L + ratio × (H L)`(自 L 向上反弹) |
| 做多 | 限价 @ E,止损 L,止盈 H |
| 做空 | 限价 @ E,止损 H,止盈 L |
| 添加后 | **立即**在 Binance U 本位挂限价单;卡片显示 **挂E**,限价单 ID |
| 失效 | 以**标记价**判断:做多且标记价 ≥ H,做空且标记价 ≤ L,且限价**未成交** → 撤销该限价单并结案 |
| 成交后 | 挂交易所 TP/SL(含 Algo 通道条件单)→ 写入 **实盘下单监控**(`monitor_type=关键位监控`,`key_signal_type=斐波回调…`)→ 从关键位列表移除 |
| 撤单 | 仅撤本条斐波的订单 ID,**不会**对该合约 `cancel_all_orders` / 全撤 Algo,避免误伤其他委托 |
| 盈亏比 | 计划 RR 须 > `KEY_AUTO_MIN_PLANNED_RR`;0.618 理论约 1.6:1,0.786 约 3.7:1 |
| 日成交量 | 与箱体/收敛相同,须在前 `KEY_DAILY_VOLUME_RANK_MAX` 名内方可添加 |
后台轮询:`check_fib_key_monitors()`;箱体/收敛仍走 `check_key_monitors()`.
手动删除关键位时,未成交斐波会先撤限价再删库.
### 箱体 / 收敛自动开仓(来源标注)
- 自动开仓写入 `order_monitors.key_signal_type`:`箱体突破``收敛突破`.
- 持仓与交易记录展示「来源 · 信号类型」.
## 列表时间窗(UTC,全站顶栏)
共用模块:仓库根目录 `history_window_lib.py`(Gate / Binance 主站一致).
| 项 | 说明 |
|----|------|
| 默认 | **UTC 当日**(`win_preset=utc_today`,从 UTC 0:00 至当前时刻) |
| 可选 | 近 24 小时,近 7 天,自定义起止(UTC,`datetime-local`) |
| 作用范围 | 关键位历史,交易记录列表,复盘记录 API,AI 历史 API,导出「交易记录」「关键位历史」 |
| 与统计的关系 | **仅影响列表/导出**;**统计分析页仍按北京时间 `TRADING_DAY_RESET_HOUR`(默认 8:00)切交易日** |
| 库内时间 | DB 存北京时间字符串;后端用 `utc_window_to_bj_sql_strings()` 换算后再 SQL 比较 |
| 切换方式 | 顶栏「列表筛选(UTC)」→ 选预设 → **应用**(保留当前路由,`/records?win_preset=…`) |
查询参数示例:
- `?win_preset=utc_today`
- `?win_preset=utc_last24h` / `utc_last7d`
- `?win_preset=custom&from_utc=2026-05-18 00:00:00&to_utc=2026-05-19 12:00:00`
## 交易记录与复盘
- 交易记录盈亏以**本地估算**为准(平仓时按成交/计划价计算);盈亏列可标注 **估**.
- 与币安 App 不一致时,请在「核对修改」或复盘中 **手工填写** `reviewed_pnl_amount` 覆盖展示(不再提供批量「同步交易所盈亏」).
- **列表默认只显示当前 UTC 时间窗内**的记录(见上节);导出 CSV 同步该时间窗.
- 表头 **「止损(开仓)」**:展示开仓快照 `initial_stop_loss`(无则回退 `stop_loss`);核对/复盘仍可用有效止损字段.
- 平仓写入 `trade_records`:`stop_loss``initial_stop_loss` 均写入**开仓时止损快照**;`key_signal_type` 保留箱体/收敛/斐波来源(`fib_key_monitor_lib.key_signal_type_for_trade_record`).
- **开仓类型**(`entry_reason`):机器单平仓入库时,若未手填,`key_signal_type` 自动映射(见下表);列表/导出「开仓类型」列 = 复盘核对值优先,否则入库值,否则按信号映射.
| `key_signal_type` | 自动写入的 `entry_reason` |
|-------------------|---------------------------|
| 箱体突破 | 关键位箱体突破 |
| 收敛突破 | 关键位收敛突破 |
| 斐波回调0.618 | 关键位斐波0.618 |
| 斐波回调0.786 | 关键位斐波0.786 |
- 复盘表单 **开仓类型** 下拉新增上述四条固定文案(与趋势/波段类并列).
- 复盘 **离场触发** 新增 **「止盈」**;从交易记录「填入复盘」时,若结果为「止盈/保本止盈/移动止盈/止损/手动平仓」会自动选中对应触发项,并按 `key_signal_type` 预填开仓类型.
- 勾选「保存时自动生成多周期 K 线图」时:**平仓时间** 为锚点,各周期向前约 `ORDER_CHART_LIMIT`(默认 100)根 K 线(`_fetch_ohlcv_ending_at`),不再固定拉「最近 100 根」.
- `/api/journals`,`/api/reviews` 支持同一时间窗 query,与列表一致.
### 导出(交易记录 v3)
- 文件名:`trade_records_v3_YYYYMMDD.csv`
- 相对 v2 增加:`key_signal_type`,`initial_stop_loss`(及开仓快照列),`planned_rr`,`actual_rr`,`risk_amount`,交易所盈亏与时间字段等;末列「开仓类型」为有效展示文案.
- 「关键位历史」导出同样受 UTC 时间窗限制.
## 实盘下单页
- 左列:实盘下单监控(表单,划转,规则).
- 右列:实时持仓(独立模块).
- **人工开仓门控**:计划盈亏比 &lt; `MANUAL_MIN_PLANNED_RR`(默认 **1.4**)时前端弹窗 + 后端拒绝.
- **移动保本**(勾选启用):监控轮询达到触发 RR 后,止损阶梯上移时**同步交易所**——**先撤**该合约全部 TP/SL(含 Algo 条件单)**再挂**新止损 + 原止盈(`replace_active_monitor_tpsl_on_exchange`).仅交易所成功后才写库;失败发企业微信告警.未配置实盘 API 时仍只更新本地.
## 统计分析页(`/stats`)
| 项 | 说明 |
|----|------|
| 切日 | **北京时间**;交易日边界 = 每日 `TRADING_DAY_RESET_HOUR:00`(`.env` 默认 **8**) |
| 品类下拉 | 页顶 **「统计品类」** 下拉切换(默认「全部交易」):全部交易,下单监控,关键位箱体突破,关键位收敛结构,关键位斐波0.618,关键位斐波0.786;一次只显示所选品类的日/周/月 |
| URL | 切换后写入 `stats_segment=`(`all`,`manual`,`key_box`,`key_conv`,`key_fib618`,`key_fib786`),刷新 `/stats` 可保持选项 |
| 每块指标 | 日 / 周 / 月:开单次数,平仓笔数,胜率,净盈亏,回撤,连续亏损等(与原口径一致) |
| 开单次数 | 人工块:`monitor_type=下单监控` 且无 `key_signal_type`;关键位块:`order_monitors.key_signal_type` 计数 |
| 不受 UTC 窗影响 | 统计始终基于库内全部已平仓记录,按北京交易日归类,**不**随顶栏 UTC 列表窗切换 |
## 持仓与计仓
- `MAX_ACTIVE_POSITIONS` 默认 **1**(可在 `.env` 调大).
- 关键位自动开仓:在已有持仓时,`KEY_SIZING_USE_ZERO_POSITION_SNAPSHOT=true`,按**首笔开仓前**交易账户资金快照计仓(字段 `trading_sessions.key_sizing_capital_snapshot`).
## 配置
详见 `.env.example` 中「关键位门控」「交易执行 / 人工风控」注释段.
## 自动备份(服务器)
- 脚本:`scripts/backup_data.sh`(`crypto.db` + `static/images`)
- 定时:`scripts/install_backup_cron.sh` → 每天 **北京时间 0:00**,目录 **`/root/backups/<实例名>/YYYY-MM-DD/`**,保留 **30**
- 详见 `部署文档.md` 第 5.4 节(自动备份)
## 数据库(启动时自动迁移)
`key_monitors` 斐波字段:`fib_limit_order_id`,`fib_entry_price`,`fib_stop_loss`,`fib_take_profit`,`fib_order_amount`,`fib_margin_capital`,`fib_leverage`.
`trade_records` / `order_monitors`:`key_signal_type`,`exchange_realized_pnl`,`exchange_opened_at`,`exchange_closed_at`,`exchange_sync_key`,`entry_reason`,`reviewed_entry_reason`,`initial_stop_loss`.
**历史数据**:本次**不做**旧记录的批量回填(`entry_reason` / `initial_stop_loss` / `key_signal_type`);仅**新产生**的平仓与复盘按新逻辑写入.旧行展示可回退已有字段.
## 涉及文件(便于排查)
| 路径 | 说明 |
|------|------|
| `history_window_lib.py` | UTC 时间窗解析与转北京时间 SQL 字符串 |
| `fib_key_monitor_lib.py` | 斐波计算,`KEY_ENTRY_REASON_BY_SIGNAL`,`entry_reason_from_key_signal` |
| `crypto_monitor_binance/app.py` | 列表筛选,统计分块,导出 v3,复盘 K 线锚点,入库逻辑 |
| `crypto_monitor_binance/templates/index.html` | 顶栏时间窗,统计分块 UI,止损(开仓)列,复盘预填 |
## 升级步骤
1. `git pull` 后对比 `.env.example`,把新增变量合并进本地 `.env`.
2. 在 VPS 上为 Binance / Gate / **各执行一次** `bash scripts/install_backup_cron.sh`(若尚未安装).
3. 重启 Binance 实例(`pm2 restart crypto_binance`);SQLite 会自动 `ALTER` 缺列(斐波,交易所盈亏,`entry_reason`).
4. 浏览器强刷(Ctrl+F5)避免旧版 `index.html` 缓存.
5. 打开任意页确认顶栏出现 **「列表筛选(UTC)」**;`/stats` 可见分品类统计与「北京 8:00 切日」说明.
6. 建议先用测试币验证斐波:限价挂出,标记价失效撤单,成交后 TP/SL 与订单监控是否正常;平仓后检查交易记录止损(开仓)与开仓类型.
+389 -389
View File
@@ -1,389 +1,389 @@
# `crypto_monitor_binance` 部署指南SSH SOCKS + Binance + PM2Ubuntu
项目功能环境变量总览见 **[README.md](./README.md)**Ubuntu 环境Python / Node / PM2**[docs/ubuntu-server.md](../docs/ubuntu-server.md)**
本文面向**在本机或 VPS 上运行本项目****直连 Binance API 不稳定超时或被网络策略拦截** 的场景思路是
- 本机用 `ssh -D` 做动态转发把 **SOCKS5 出口**放到能稳定访问 Binance 的机器常见为一台境外 VPS
- 项目在 `.env` 中设置 **`BINANCE_SOCKS_PROXY=socks5h://127.0.0.1:1080`**或你实际端口),`ccxt` 经 SOCKS 访问交易所
- **SSH 隧道**`ssh -D` 在本机常驻可用 **tmux****autossh** 保持连接),**不要** 把 `ssh` 交给 PM2
- 使用 **PM2** 仅托管 **Flask 应用**仓库根目录 **`ecosystem.config.cjs`** 默认进程名为 **`crypto-monitor-binance`**
> 安全提醒不要把 `.env`私钥 `.pem`Binance API Key / Secret 提交到 Git下文只用占位符
---
## 0. 你需要准备的东西
- 一台 **Ubuntu**或同类 Linux运行项目的机器下文称「本机」
- 一台可 SSH 登录**能正常访问 Binance API** 的 VPS示例`HostName` 填你的服务器 IP用户如 `root`
- SSH**私钥登录**推荐便于隧道脚本无人值守
- 本机已安装`python3``python3-venv``pip``curl``ssh``git`可选)、`node` + `npm`安装 PM2
- Binance 账户已开通 **USDT-M 永续合约**API Key 勾选 **合约****万向划转**若使用资金↔合约划转等所需权限并配置 **IP 白名单**若启用
---
## 1. 获取代码与目录
将包含 `app.py` 的项目放到固定目录例如
```bash
mkdir -p /opt/crypto_monitor
cd /opt/crypto_monitor
git clone https://git.bz121.com/dekun/crypto_monitor.git
cd crypto_monitor/crypto_monitor_binance
```
下文用 **`/opt/crypto_monitor/crypto_monitor_binance`** 仅为示例请换成你的实际绝对路径
拉取代码后若目录下尚无 `.env`先从模板生成**勿**把填好密钥的 `.env` 提交 Git):
```bash
cp -n .env.example .env # -n已存在 .env 时不覆盖
```
---
## 2. 配置 SSH 私钥与 `~/.ssh/config`
```bash
mkdir -p ~/.ssh
chmod 700 ~/.ssh
# 私钥示例~/.ssh/vps1.pem
chmod 600 ~/.ssh/vps1.pem
```
编辑 `~/.ssh/config`示例别名 **`bn-vps`**与你手工启动 `ssh -D ... bn-vps` 一致即可):
```sshconfig
Host bn-vps
HostName 你的_VPS_IP
User root
IdentityFile ~/.ssh/vps1.pem
IdentitiesOnly yes
ServerAliveInterval 30
ServerAliveCountMax 3
ExitOnForwardFailure yes
BatchMode yes
```
测试
```bash
ssh bn-vps true
```
> 若尚未完全改为密钥登录可暂时注释 `BatchMode yes`调试完成后再打开
---
## 3. 手工验证SSH SOCKS + Binance API
### 3.1 本地 SOCKS示例端口 1080
```bash
ssh -N -D 127.0.0.1:1080 bn-vps
```
保持运行另开终端继续
### 3.2 验证经 SOCKS 可访问 Binance公开接口
```bash
curl -4 -sS --max-time 15 --proxy socks5h://127.0.0.1:1080 https://api.binance.com/api/v3/time
```
应返回 JSON`serverTime` 字段)。若此处失败**不要先启动应用**先修隧道或 VPS 出站
---
## 4. Python 虚拟环境
```bash
cd /opt/crypto_monitor/crypto_monitor_binance
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -U pip
pip install flask requests ccxt werkzeug PySocks Pillow
```
走 SOCKS 时 **必须** 安装 **`PySocks`**否则易出现代理相关报错
可选
```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_binance
cp -n .env.example .env # 已存在 .env 时不覆盖
nano .env # 填入 API登录密码端口代理等
```
### 5.2 备份与 `git pull`
- **`.env` 已被仓库根目录 `.gitignore` 忽略**`git pull` **不会**覆盖或删除你本地的 `.env`
- 若远端更新了 **`.env.example`**新增变量名),pull 后请对照模板**手动把新行补进你的 `.env`**不会自动合并进 `.env`)。
- **建议在每次 `git pull` 或大批量改配置前备份**
```bash
cp .env .env.backup.$(date +%Y%m%d)
# 恢复示例cp .env.backup.20260516 .env
```
- **换机 / 迁移**`scp` 复制整份 `.env` 到新机器对应目录或在新机重新 `cp .env.example .env` 后填写
### 5.3 AI 复盘与模型可选
三所共用仓库根目录 **`ai_client.py`**PM2 的 **`PYTHONPATH=..`** 须包含仓库根)。`.env` 中配置 **`AI_PROVIDER`**
| 模式 | 主要变量 |
|------|----------|
| **`openai`**默认 | `OPENAI_API_BASE=https://op.bz121.com/v1``OPENAI_API_KEY``OPENAI_MODEL=gemma4:e4b` |
| **`ollama`** | `OLLAMA_API``AI_MODEL`本机 Ollama |
密钥在 [op.bz121.com](https://op.bz121.com/) 的 **`gateway.json`** 页面获取`.env` 后需 **`pm2 restart`** 对应进程详见根目录 **[AI复盘与模型配置说明.md](../AI复盘与模型配置说明.md)**
### 5.4 自动备份数据库 + 复盘图片
默认每天 **北京时间 0:00** 备份到 **`/root/backups`**保留 **30 天** 后自动删除更早的目录
备份内容路径来自 `.env``DB_PATH``UPLOAD_DIR`):
- `crypto.db`优先 `sqlite3 .backup` 热备
- `static/images` 打包为 `static_images.tar.gz`
目录结构示例
```text
/root/backups/crypto_monitor_binance/2026-05-17/
crypto.db
static_images.tar.gz
manifest.txt
```
**一次性安装定时任务**在对应项目目录执行Binance / Gate 各执行一次):
```bash
cd /opt/crypto_monitor/crypto_monitor_binance
chmod +x scripts/backup_data.sh scripts/install_backup_cron.sh
bash scripts/install_backup_cron.sh
```
Gate 实例
```bash
cd /opt/crypto_monitor/crypto_monitor_gate
bash scripts/install_backup_cron.sh
```
实例趋势回调等):
```bash
cd /opt/crypto_monitor/crypto_monitor_gate
bash scripts/install_backup_cron.sh
```
**立即试跑**不写 cron):
```bash
bash scripts/backup_data.sh
```
日志默认`/var/log/crypto-monitor-backup-<项目目录名>.log`可选在 `.env` 中覆盖`BACKUP_ROOT``BACKUP_RETENTION_DAYS``BACKUP_INSTANCE`
**恢复示例**先停 PM2再覆盖文件):
```bash
pm2 stop crypto-monitor-binance
cp /root/backups/crypto_monitor_binance/2026-05-16/crypto.db ./crypto.db
tar -xzf /root/backups/crypto_monitor_binance/2026-05-16/static_images.tar.gz -C .
pm2 start ecosystem.config.cjs
```
建议安装`apt install -y sqlite3`热备更稳)。
### 5.5 必填项检查Binance + 代理
与交易所相关的变量使用 **`BINANCE_`** 前缀与代码一致)。至少确认
```env
APP_HOST=127.0.0.1
APP_PORT=5000
# 实盘按需
LIVE_TRADING_ENABLED=false
BINANCE_API_KEY=你的_Key
BINANCE_API_SECRET=你的_Secret
# 保证金cross=全仓 isolated=逐仓与币安账户/习惯一致
BINANCE_MARGIN_MODE=cross
# 持仓模式hedge=双向需在币安开启双向持仓);oneway=单向
BINANCE_POSITION_MODE=hedge
# 条件单触发参考CONTRACT_PRICE=最新成交价 MARK_PRICE=标记价
BINANCE_TRIGGER_WORKING_TYPE=CONTRACT_PRICE
# 经本机 SSH 动态转发访问 Binance端口与隧道一致
BINANCE_SOCKS_PROXY=socks5h://127.0.0.1:1080
# 若不用 SOCKS可改用 HTTP 代理一般二选一
# BINANCE_HTTP_PROXY=http://127.0.0.1:7890
# BINANCE_HTTPS_PROXY=http://127.0.0.1:7890
```
说明**推荐 `socks5h://`**由 SOCKS 端解析域名`curl --proxy socks5h://...` 行为一致
**止盈止损说明应用逻辑**实盘开仓后程序会在 Binance USDT-M 永续上挂 **`STOP_MARKET`止损** 与 **`TAKE_PROFIT_MARKET`止盈**`BINANCE_POSITION_MODE=hedge` 时会自动带 **`positionSide`**须与币安合约「双向持仓」开关一致不显式传 **`reduceOnly`**否则易触发 API **`-1106`**`Parameter 'reduceOnly' sent when not required`)。
---
## 6. 自检脚本可选
在已配置 `.env` 且网络可达的前提下
```bash
cd /opt/crypto_monitor/crypto_monitor_binance
source .venv/bin/activate
python scripts/verify_binance_funding.py
```
用于粗测资金钱包与合约钱包 USDT 读取需有效 API 与权限)。
---
## 7. 手工启动 Flask验证
1. SOCKS 已监听 `127.0.0.1:1080`若使用代理
2.`source .venv/bin/activate`
3. `.env` 已按需配置 `BINANCE_SOCKS_PROXY`
```bash
cd /opt/crypto_monitor/crypto_monitor_binance
source .venv/bin/activate
python app.py
```
浏览器访问`http://127.0.0.1:5000`或你在 `.env` 中的端口)。
---
## 8. 安装 PM2
```bash
sudo npm i -g pm2
pm2 -v
```
---
## 9. PM2使用仓库内 `ecosystem.config.cjs`推荐
在项目根目录
```bash
cd /opt/crypto_monitor/crypto_monitor_binance
pm2 start ecosystem.config.cjs
pm2 status
pm2 logs --lines 200
```
默认只启动 **`crypto-monitor-binance`**`.venv/bin/python app.py`)。
### 本机已可直连 Binance不需要隧道时
`.env` 里应 **去掉或留空** `BINANCE_SOCKS_PROXY`除非仍要走别的代理),`pm2 start ecosystem.config.cjs`
### 开机自启
```bash
pm2 save
pm2 startup
# 按屏幕提示执行一条 sudo 命令
```
---
## 10. 等价手工命令不使用 ecosystem 文件时
### 10.1 SSH SOCKS自行后台常驻不推荐用 PM2
示例前台调试生产请用 **PM2**见本文 §6 与 [docs/ubuntu-server.md](../docs/ubuntu-server.md)):
```bash
ssh -N -D 127.0.0.1:1080 bn-vps \
-o ServerAliveInterval=30 -o ServerAliveCountMax=3 \
-o ExitOnForwardFailure=yes
```
### 10.2 Flask
```bash
cd /opt/crypto_monitor/crypto_monitor_binance
pm2 start /opt/crypto_monitor/crypto_monitor_binance/.venv/bin/python --name crypto-monitor-binance -- \
/opt/crypto_monitor/crypto_monitor_binance/app.py
```
---
## 11. 交易所「连接不上」排查清单
1. **`.env` 是否为 Binance 变量**`BINANCE_SOCKS_PROXY` / `BINANCE_HTTP_PROXY` / `BINANCE_API_KEY` / `BINANCE_API_SECRET` 等前缀需与代码一致
2. **隧道是否在本机端口监听**若配置了 `BINANCE_SOCKS_PROXY`):
```bash
ss -lntp | grep 1080 || true
```
3. **curl 复测 Binance**与第 3.2 节相同);curl 不通则应用也不会通
4. **PySocks**`pip show PySocks`缺失则 `pip install PySocks`
5. **SSH 隧道连不上**检查私钥权限`~/.ssh/config`VPS 出站与端口是否与 `.env` 一致
6. **API 权限与 IP 白名单**Secret 错误权限不足未放行当前出口 IP 时私有接口会失败
7. **启动顺序**若走代理先保证 SOCKS 已监听再 `pm2 start` 应用或重启应用)。
---
## 12. 推荐启动顺序习惯
1. 若走代理先启动并确认 SSH SOCKS 已监听再 `curl --proxy socks5h://127.0.0.1:1080 https://api.binance.com/api/v3/time` 成功
2. `pm2 start ecosystem.config.cjs`
3. 再确认页面与余额等接口正常
---
## 13. 免责声明
交易所有合规与地区政策要求请确保使用方式符合当地法律法规与交易所条款本文仅描述网络与工程部署路径
---
## 附录数据库标签修复脚本 `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_binance` 部署指南:SSH SOCKS + Binance + PM2(Ubuntu)
项目功能,环境变量总览见 **[README.md](./README.md)**.Ubuntu 环境(Python / Node / PM2)**[docs/ubuntu-server.md](../docs/ubuntu-server.md)**.
本文面向:**在本机或 VPS 上运行本项目**,**直连 Binance API 不稳定,超时或被网络策略拦截** 的场景.思路是:
- 本机用 `ssh -D` 做动态转发,把 **SOCKS5 出口**放到能稳定访问 Binance 的机器(常见为一台境外 VPS)
- 项目在 `.env` 中设置 **`BINANCE_SOCKS_PROXY=socks5h://127.0.0.1:1080`**(或你实际端口),`ccxt` 经 SOCKS 访问交易所
- **SSH 隧道**:`ssh -D` 在本机常驻(可用 **tmux****autossh** 保持连接),**不要** 把 `ssh` 交给 PM2
- 使用 **PM2** 仅托管 **Flask 应用**;仓库根目录 **`ecosystem.config.cjs`** 默认进程名为 **`crypto-monitor-binance`**
> 安全提醒:不要把 `.env`,私钥 `.pem`,Binance API Key / Secret 提交到 Git;下文只用占位符.
---
## 0. 你需要准备的东西
- 一台 **Ubuntu**(或同类 Linux)运行项目的机器(下文称「本机」)
- 一台可 SSH 登录,**能正常访问 Binance API** 的 VPS(示例:`HostName` 填你的服务器 IP,用户如 `root`)
- SSH:**私钥登录**(推荐,便于隧道脚本无人值守)
- 本机已安装:`python3`,`python3-venv`,`pip`,`curl`,`ssh`,`git`(可选),`node` + `npm`(安装 PM2)
- Binance 账户:已开通 **USDT-M 永续合约**;API Key 勾选 **合约**,**万向划转**(若使用资金↔合约划转)等所需权限,并配置 **IP 白名单**(若启用)
---
## 1. 获取代码与目录
将包含 `app.py` 的项目放到固定目录,例如:
```bash
mkdir -p /opt/crypto_monitor
cd /opt/crypto_monitor
git clone https://git.bz121.com/dekun/crypto_monitor.git
cd crypto_monitor/crypto_monitor_binance
```
下文用 **`/opt/crypto_monitor/crypto_monitor_binance`** 仅为示例,请换成你的实际绝对路径.
拉取代码后,若目录下尚无 `.env`,先从模板生成(**勿**把填好密钥的 `.env` 提交 Git):
```bash
cp -n .env.example .env # -n:已存在 .env 时不覆盖
```
---
## 2. 配置 SSH 私钥与 `~/.ssh/config`
```bash
mkdir -p ~/.ssh
chmod 700 ~/.ssh
# 私钥示例:~/.ssh/vps1.pem
chmod 600 ~/.ssh/vps1.pem
```
编辑 `~/.ssh/config`(示例别名 **`bn-vps`**,与你手工启动 `ssh -D ... bn-vps` 一致即可):
```sshconfig
Host bn-vps
HostName 你的_VPS_IP
User root
IdentityFile ~/.ssh/vps1.pem
IdentitiesOnly yes
ServerAliveInterval 30
ServerAliveCountMax 3
ExitOnForwardFailure yes
BatchMode yes
```
测试:
```bash
ssh bn-vps true
```
> 若尚未完全改为密钥登录,可暂时注释 `BatchMode yes`,调试完成后再打开.
---
## 3. 手工验证:SSH SOCKS + Binance API
### 3.1 本地 SOCKS(示例端口 1080)
```bash
ssh -N -D 127.0.0.1:1080 bn-vps
```
保持运行,另开终端继续.
### 3.2 验证经 SOCKS 可访问 Binance(公开接口)
```bash
curl -4 -sS --max-time 15 --proxy socks5h://127.0.0.1:1080 https://api.binance.com/api/v3/time
```
应返回 JSON(`serverTime` 字段).若此处失败,**不要先启动应用**:先修隧道或 VPS 出站.
---
## 4. Python 虚拟环境
```bash
cd /opt/crypto_monitor/crypto_monitor_binance
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -U pip
pip install flask requests ccxt werkzeug PySocks Pillow
```
走 SOCKS 时 **必须** 安装 **`PySocks`**,否则易出现代理相关报错.
可选:
```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_binance
cp -n .env.example .env # 已存在 .env 时不覆盖
nano .env # 填入 API,登录密码,端口,代理等
```
### 5.2 备份与 `git pull`
- **`.env` 已被仓库根目录 `.gitignore` 忽略**:`git pull` **不会**覆盖或删除你本地的 `.env`.
- 若远端更新了 **`.env.example`**(新增变量名),pull 后请对照模板,**手动把新行补进你的 `.env`**(不会自动合并进 `.env`).
- **建议在每次 `git pull` 或大批量改配置前备份**:
```bash
cp .env .env.backup.$(date +%Y%m%d)
# 恢复示例:cp .env.backup.20260516 .env
```
- **换机 / 迁移**:`scp` 复制整份 `.env` 到新机器对应目录;或在新机重新 `cp .env.example .env` 后填写.
### 5.3 AI 复盘与模型(可选)
三所共用仓库根目录 **`ai_client.py`**(PM2 的 **`PYTHONPATH=..`** 须包含仓库根).`.env` 中配置 **`AI_PROVIDER`**:
| 模式 | 主要变量 |
|------|----------|
| **`openai`**(默认) | `OPENAI_API_BASE=https://op.bz121.com/v1`,`OPENAI_API_KEY`,`OPENAI_MODEL=gemma4:e4b` |
| **`ollama`** | `OLLAMA_API`,`AI_MODEL`(本机 Ollama) |
密钥在 [op.bz121.com](https://op.bz121.com/) 的 **`gateway.json`** 页面获取.`.env` 后需 **`pm2 restart`** 对应进程.详见根目录 **[AI复盘与模型配置说明.md](../AI复盘与模型配置说明.md)**.
### 5.4 自动备份(数据库 + 复盘图片)
默认每天 **北京时间 0:00** 备份到 **`/root/backups`**,保留 **30 天** 后自动删除更早的目录.
备份内容(路径来自 `.env``DB_PATH`,`UPLOAD_DIR`):
- `crypto.db`(优先 `sqlite3 .backup` 热备)
- `static/images` 打包为 `static_images.tar.gz`
目录结构示例:
```text
/root/backups/crypto_monitor_binance/2026-05-17/
crypto.db
static_images.tar.gz
manifest.txt
```
**一次性安装定时任务**(在对应项目目录执行,Binance / Gate 各执行一次):
```bash
cd /opt/crypto_monitor/crypto_monitor_binance
chmod +x scripts/backup_data.sh scripts/install_backup_cron.sh
bash scripts/install_backup_cron.sh
```
Gate 实例:
```bash
cd /opt/crypto_monitor/crypto_monitor_gate
bash scripts/install_backup_cron.sh
```
实例(趋势回调等):
```bash
cd /opt/crypto_monitor/crypto_monitor_gate
bash scripts/install_backup_cron.sh
```
**立即试跑**(不写 cron):
```bash
bash scripts/backup_data.sh
```
日志默认:`/var/log/crypto-monitor-backup-<项目目录名>.log`.可选在 `.env` 中覆盖:`BACKUP_ROOT`,`BACKUP_RETENTION_DAYS`,`BACKUP_INSTANCE`.
**恢复示例**(先停 PM2,再覆盖文件):
```bash
pm2 stop crypto-monitor-binance
cp /root/backups/crypto_monitor_binance/2026-05-16/crypto.db ./crypto.db
tar -xzf /root/backups/crypto_monitor_binance/2026-05-16/static_images.tar.gz -C .
pm2 start ecosystem.config.cjs
```
建议安装:`apt install -y sqlite3`(热备更稳).
### 5.5 必填项检查(Binance + 代理)
与交易所相关的变量使用 **`BINANCE_`** 前缀(与代码一致).至少确认:
```env
APP_HOST=127.0.0.1
APP_PORT=5000
# 实盘(按需)
LIVE_TRADING_ENABLED=false
BINANCE_API_KEY=你的_Key
BINANCE_API_SECRET=你的_Secret
# 保证金:cross=全仓 isolated=逐仓(与币安账户/习惯一致)
BINANCE_MARGIN_MODE=cross
# 持仓模式:hedge=双向(需在币安开启双向持仓);oneway=单向
BINANCE_POSITION_MODE=hedge
# 条件单触发参考:CONTRACT_PRICE=最新成交价 MARK_PRICE=标记价
BINANCE_TRIGGER_WORKING_TYPE=CONTRACT_PRICE
# 经本机 SSH 动态转发访问 Binance(端口与隧道一致)
BINANCE_SOCKS_PROXY=socks5h://127.0.0.1:1080
# 若不用 SOCKS,可改用 HTTP 代理(一般二选一)
# BINANCE_HTTP_PROXY=http://127.0.0.1:7890
# BINANCE_HTTPS_PROXY=http://127.0.0.1:7890
```
说明:**推荐 `socks5h://`**,由 SOCKS 端解析域名,`curl --proxy socks5h://...` 行为一致.
**止盈止损说明(应用逻辑)**:实盘开仓后,程序会在 Binance USDT-M 永续上挂 **`STOP_MARKET`(止损)** 与 **`TAKE_PROFIT_MARKET`(止盈)**;`BINANCE_POSITION_MODE=hedge` 时会自动带 **`positionSide`**,须与币安合约「双向持仓」开关一致.不显式传 **`reduceOnly`**(否则易触发 API **`-1106`**:`Parameter 'reduceOnly' sent when not required`).
---
## 6. 自检脚本(可选)
在已配置 `.env` 且网络可达的前提下:
```bash
cd /opt/crypto_monitor/crypto_monitor_binance
source .venv/bin/activate
python scripts/verify_binance_funding.py
```
用于粗测资金钱包与合约钱包 USDT 读取(需有效 API 与权限).
---
## 7. 手工启动 Flask(验证)
1. SOCKS 已监听 `127.0.0.1:1080`(若使用代理)
2.`source .venv/bin/activate`
3. `.env` 已按需配置 `BINANCE_SOCKS_PROXY`
```bash
cd /opt/crypto_monitor/crypto_monitor_binance
source .venv/bin/activate
python app.py
```
浏览器访问:`http://127.0.0.1:5000`(或你在 `.env` 中的端口).
---
## 8. 安装 PM2
```bash
sudo npm i -g pm2
pm2 -v
```
---
## 9. PM2:使用仓库内 `ecosystem.config.cjs`(推荐)
在项目根目录:
```bash
cd /opt/crypto_monitor/crypto_monitor_binance
pm2 start ecosystem.config.cjs
pm2 status
pm2 logs --lines 200
```
默认只启动 **`crypto-monitor-binance`**(`.venv/bin/python app.py`).
### 本机已可直连 Binance,不需要隧道时
`.env` 里应 **去掉或留空** `BINANCE_SOCKS_PROXY`(除非仍要走别的代理),`pm2 start ecosystem.config.cjs`.
### 开机自启
```bash
pm2 save
pm2 startup
# 按屏幕提示执行一条 sudo 命令
```
---
## 10. 等价手工命令(不使用 ecosystem 文件时)
### 10.1 SSH SOCKS(自行后台常驻,不推荐用 PM2)
示例(前台调试;生产请用 **PM2**,见本文 §6 与 [docs/ubuntu-server.md](../docs/ubuntu-server.md)):
```bash
ssh -N -D 127.0.0.1:1080 bn-vps \
-o ServerAliveInterval=30 -o ServerAliveCountMax=3 \
-o ExitOnForwardFailure=yes
```
### 10.2 Flask
```bash
cd /opt/crypto_monitor/crypto_monitor_binance
pm2 start /opt/crypto_monitor/crypto_monitor_binance/.venv/bin/python --name crypto-monitor-binance -- \
/opt/crypto_monitor/crypto_monitor_binance/app.py
```
---
## 11. 交易所「连接不上」排查清单
1. **`.env` 是否为 Binance 变量**:`BINANCE_SOCKS_PROXY` / `BINANCE_HTTP_PROXY` / `BINANCE_API_KEY` / `BINANCE_API_SECRET` 等前缀需与代码一致.
2. **隧道是否在本机端口监听**(若配置了 `BINANCE_SOCKS_PROXY`):
```bash
ss -lntp | grep 1080 || true
```
3. **curl 复测 Binance**(与第 3.2 节相同);curl 不通则应用也不会通.
4. **PySocks**:`pip show PySocks`,缺失则 `pip install PySocks`.
5. **SSH 隧道连不上**:检查私钥权限,`~/.ssh/config`,VPS 出站与端口是否与 `.env` 一致.
6. **API 权限与 IP 白名单**:Secret 错误,权限不足,未放行当前出口 IP 时,私有接口会失败.
7. **启动顺序**:若走代理,先保证 SOCKS 已监听,再 `pm2 start` 应用(或重启应用).
---
## 12. 推荐启动顺序(习惯)
1. 若走代理:先启动并确认 SSH SOCKS 已监听,再 `curl --proxy socks5h://127.0.0.1:1080 https://api.binance.com/api/v3/time` 成功
2. `pm2 start ecosystem.config.cjs`
3. 再确认页面与余额等接口正常
---
## 13. 免责声明
交易所有合规与地区政策要求.请确保使用方式符合当地法律法规与交易所条款.本文仅描述网络与工程部署路径.
---
## 附录:数据库标签修复脚本 `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='保本止盈'`.