# Binance Quant

面向 Binance 现货的 Python CLI 交易系统。

当前版本支持模拟交易、现货测试网市价单、显式生产现货交易、SQLite 审计存储，以及 SMA 均线交叉策略。

## 安装配置

```powershell
python -m pip install -e ".[dev]"
Copy-Item .env.example .env
```

使用 `testnet_live` 或 `live` 时，在 `.env` 中填写 Binance 凭据。模拟订单请保持 `BINANCE_MODE=dry_run`。

模式：

```text
BINANCE_MODE=dry_run
BINANCE_MODE=testnet_live
BINANCE_MODE=live
```

生产现货交易配置：

```text
BINANCE_MODE=live
BINANCE_REST_BASE_URLS=https://api.binance.com/api,https://api1.binance.com/api,https://api2.binance.com/api,https://api3.binance.com/api,https://api4.binance.com/api
BINANCE_STREAM_BASE_URL=wss://stream.binance.com:9443/ws
```

如果 URL 变量留空，`live` 默认使用以上生产 REST 候选端点。每次创建 Binance REST 客户端时会使用同一个代理配置请求各候选端点的 `/v3/time`，选择成功且耗时最低的端点执行本次调用流程；如果全部检测失败，会回退到第一个候选端点并保留原始请求错误。旧的 `BINANCE_REST_BASE_URL` 仍可用于固定单个端点。请使用 `binance.com` 的生产 Binance API key，不要使用现货测试网 key。

## 命令

```powershell
binance-quant version
binance-quant backtest data/candles.csv --symbol BTCUSDT --fast-window 5 --slow-window 20
binance-quant futures-backtest data/candles.csv --symbol BTCUSDT --fast-window 10 --slow-window 30 --initial-equity 1000 --margin-amount 100 --leverage 2
binance-quant orders --database-path binance_quant.sqlite3
binance-quant account
binance-quant trade --max-candles 10
```

`trade` 默认持续运行，除非提供 `--max-candles`。在 `dry_run` 模式下会记录模拟订单；在 `testnet_live` 模式下需要现货测试网凭据，并可向 Binance 现货测试网提交市价单；在 `live` 模式下需要生产 Binance 凭据，并可提交真实市价单。

## 执行脚本

```powershell
.\scripts\run.ps1 -Action quote
.\scripts\run.ps1 -Action dry-run-order
.\scripts\run.ps1 -Action orders
.\scripts\run.ps1 -Action trade-loop -MaxCandles 10
.\scripts\run.ps1 -Action testnet-sell-quote -SellQuoteAmount 5 -ConfirmTestnetOrder
.\scripts\run.ps1 -Action live-preflight -UseSystemProxy
.\scripts\run.ps1 -Action live-sell-quote-preflight -SellQuoteAmount 5 -UseSystemProxy
.\scripts\run.ps1 -Action live-sell-quote -SellQuoteAmount 5 -UseSystemProxy -ConfirmLiveOrder
.\scripts\run.ps1 -Action live-auto-buy-once
.\scripts\run.ps1 -Action live-auto-sell-once
.\scripts\run.ps1 -Action live-ai-trade-once
.\scripts\run.ps1 -Action live-ai-trade-batch-once
.\scripts\run.ps1 -Action live-futures-ai-trade-batch-once
```

脚本默认偏安全：`dry-run-order` 和 `trade-loop` 会拒绝在非 `BINANCE_MODE=dry_run` 模式下运行。
`testnet-sell-quote` 使用 `quoteOrderQty` 提交 Binance 现货测试网市价卖单；除非 `BINANCE_MODE=testnet_live` 且提供 `-ConfirmTestnetOrder`，否则会拒绝运行。
`live-preflight` 会拒绝在非 `BINANCE_MODE=live` 模式下运行；通过后只检查生产账户访问权限，不会提交订单。
`live-sell-quote-preflight` 使用 `/v3/order/test` 验证生产现货市价卖单，不会撮合订单。
`live-sell-quote` 使用 `quoteOrderQty` 提交真实生产现货市价卖单；除非 `BINANCE_MODE=live` 且提供 `-ConfirmLiveOrder`，否则会拒绝运行。

## 数据字典

### Mode

| 值 | 说明 |
| --- | --- |
| `dry_run` | 仅模拟交易。订单只在本地记录，不会发送到 Binance。 |
| `testnet_live` | 使用 Binance 现货测试网端点，可以提交测试网订单。 |
| `live` | 使用生产 Binance 现货端点，可以提交真实订单。 |

### Action

`Action` 根据出现位置有两种含义：

| 字段 | 取值 | 说明 |
| --- | --- | --- |
| PowerShell `-Action` | `quote`, `dry-run-order`, `orders`, `trade-loop`, `testnet-sell-quote`, `live-preflight`, `live-sell-quote-preflight`, `live-sell-quote`, `live-auto-buy-once`, `live-auto-sell-once`, `live-ai-trade-once`, `live-ai-trade-batch-once`, `live-futures-ai-trade-batch-once` | 选择 `scripts/run.ps1` 要执行的工作流。 |
| AI 交易 `Action` | `BUY`, `SELL`, `HOLD` | 模型对某个交易对的预测。`BUY` 和 `SELL` 在通过置信度和本地风控检查后可能成为交易候选；`HOLD` 只记录不操作。 |

### Side 与 SignalType

| 字段 | 取值 | 说明 |
| --- | --- | --- |
| `Side` | `BUY`, `SELL` | 发送到 Binance 或记录在 `order_results` 中的实际订单方向。 |
| `SignalType` | `BUY`, `SELL`, `HOLD` | 策略信号。`HOLD` 没有订单方向。 |

### Status

`Status` 按结果类型区分。同一个列名会出现在多个 CLI 输出和 SQLite 审计表中。

`order_results` 中的订单结果状态：

| 值 | 说明 |
| --- | --- |
| `DRY_RUN` | 在 `dry_run` 模式下记录的模拟订单。 |
| `FAILED` | 本地提交订单失败，未记录到可用的 Binance 订单结果。 |
| `UNKNOWN` | Binance 响应中没有 `status` 字段。 |
| Binance 订单状态 | 在 `testnet_live` 和 `live` 中，该值复制自 Binance，例如已成交市价单的 `FILLED`，或已接受挂单的 `NEW`。 |

`auto_buy_runs` 和 `live-auto-buy-once` 输出中的自动买入运行状态：

| 值 | 说明 |
| --- | --- |
| `rejected` | 前置条件、扫描数据、风控检查或预占检查在提交买单前拒绝了本次运行。 |
| `no_candidate` | 扫描器没有找到通过候选规则的交易对。 |
| `reserved` | 已为每日限制和冷却期统计预占一次买入尝试名额。通常是短暂状态。 |
| `buy_submitted` | 已开始一次实盘市价买入尝试。通常会继续写入最终状态。 |
| `protected` | 市价买入已成交，且保护性 OCO 止盈止损卖单已被接受。 |
| `protection_failed` | 历史或中间状态，表示保护性卖单失败但回滚结果尚未最终写入。 |
| `rollback_completed` | 保护性 OCO 无法放置，且回滚市价卖出已完成。按退出码规则视为失败或不安全运行。 |
| `rollback_failed` | 买入保护或回滚失败，或买入响应不足以安全信任。视为严重状态，并以非零退出码结束。 |

`auto_sell_runs` 和 `live-auto-sell-once` 输出中的自动卖出运行状态：

| 值 | 说明 |
| --- | --- |
| `rejected` | 前置条件、可用余额、扫描数据、风控检查或预占检查在提交卖单前拒绝了本次运行。 |
| `no_candidate` | 扫描器没有找到通过卖出候选规则的持仓。 |
| `reserved` | 已为每日限制和冷却期统计预占一次卖出尝试名额。通常是短暂状态。 |
| `sell_submitted` | 已开始一次实盘市价卖出尝试。通常会继续写入最终状态。 |
| `sold` | 市价卖出已成交，本次运行成功完成。 |
| `sell_failed` | 卖出提交失败，或 Binance 响应无效。以非零退出码结束。 |

`ai_trade_runs`、`live-ai-trade-once` 和 `live-ai-trade-batch-once` 每行结果中的 AI 交易状态：

| 值 | 说明 |
| --- | --- |
| `pending` | 已记录 `BUY` 或 `SELL` 预测，但尚未接受、拒绝、跳过或执行。通常是短暂状态。 |
| `no_action` | 预测为 `HOLD`，或批量运行没有可执行预测。 |
| `rejected` | live 模式检查、功能开关、置信度阈值、交易对校验或本地风控检查在提交订单前拒绝了预测。 |
| `skipped` | 因其他动作已执行，或批量动作次数达到上限，较低优先级或超限预测未处理。 |
| `protected` | AI `BUY` 通过自动买入路径执行，并以 `protected` 结束。 |
| `rollback_completed` | AI `BUY` 已执行，但保护失败且回滚完成。视为失败的 AI 交易状态。 |
| `rollback_failed` | AI `BUY` 已执行，但保护或回滚失败。视为失败的 AI 交易状态。 |
| `sold` | AI `SELL` 通过自动卖出路径执行，并以 `sold` 结束。 |
| `sell_failed` | AI `SELL` 执行失败。视为失败的 AI 交易状态。 |

`live-ai-trade-batch-once` 的顶层批量状态：

| 值 | 说明 |
| --- | --- |
| `completed` | 至少一个动作已执行，且没有记录到单交易对失败的 AI 交易状态。 |
| `failed` | 至少一个单交易对结果为 `rollback_completed`、`rollback_failed` 或 `sell_failed`。 |
| `rejected` | 存在可执行预测，但全部在执行前被拒绝。 |
| `no_action` | 所有预测都是 `HOLD`，或没有产生可执行候选。 |

`auto_buy_events` 和 `auto_sell_events` 中的事件状态要么复制自 Binance 订单载荷，例如 `FILLED` 或 `NEW`；要么使用本地失败标记，例如 `FAILED` 和 `CRITICAL`。

## 实盘自动买入

`binance-quant live-auto-buy-once` 执行一次有边界的生产现货自动买入运行。它会扫描 `BTCUSDT`、`ETHUSDT`、`BNBUSDT`、`SOLUSDT`、`SPCXBUSDT`、`TSLABUSDT`、`MUBUSDT`、`CRCLBUSDT`、`SNDKBUSDT` 和 `NVDABUSDT`，在确定性规则通过且 24 小时涨幅低于阈值时最多买入 5 USDT，并放置默认 3% 限价止盈 + 2% 止损的 Binance Spot OCO 卖单。止损腿使用 `STOP_LOSS_LIMIT`，限价默认比触发价再低 0.2%。如果买入后 OCO 放置失败，会强制重试保护单；仍失败时才提交市价卖出回滚，并在邮件通知开启时发送保护失败告警。

该功能默认关闭：

```text
BINANCE_LIVE_AUTO_BUYER_ENABLED=false
BINANCE_AUTO_BUY_QUOTE_AMOUNT=5
BINANCE_AUTO_BUY_EXISTING_BASE_VALUE_LIMIT=5
BINANCE_AUTO_BUY_TAKE_PROFIT_PERCENT=3
BINANCE_AUTO_BUY_STOP_LOSS_PERCENT=2
BINANCE_AUTO_BUY_STOP_LIMIT_BUFFER_PERCENT=0.2
BINANCE_AUTO_BUY_MAX_24H_RALLY_PERCENT=10
```

`BINANCE_AUTO_BUY_EXISTING_BASE_VALUE_LIMIT` 控制“已持有基础资产”风控阈值，按当前卖一价折算基础资产持仓价值；默认等于 `BINANCE_AUTO_BUY_QUOTE_AMOUNT`，可以单独调大或调小。`BINANCE_AUTO_BUY_MAX_24H_RALLY_PERCENT` 控制追涨保护，默认 10，当前 24 小时涨幅达到或超过该百分比时拒绝买入。

仅在轮换任何已暴露 API key、确认 `BINANCE_MODE=live`，并接受它可能在没有人工确认的情况下提交真实 Binance 现货订单后再开启。该命令每次运行最多尝试买入一次，并依赖 SQLite 审计记录实现每日五次交易上限。

直接 CLI 命令 `binance-quant account` 和 `binance-quant trade` 会使用当前配置的模式和端点。除非 API key、交易对、报价金额和风控限制都是有意设置，否则不要设置 `BINANCE_MODE=live`。

## 实盘自动卖出

`binance-quant live-auto-sell-once` 会检查当前账户对 `BTCUSDT`、`ETHUSDT`、`BNBUSDT`、`SOLUSDT`、`SPCXBUSDT`、`TSLABUSDT`、`MUBUSDT`、`CRCLBUSDT`、`SNDKBUSDT` 和 `NVDABUSDT` 的持仓。如果某个持仓通过下行扫描器，它会按该资产四舍五入后的可用余额提交一次生产现货市价卖单。它会跳过锁定余额、已有卖出挂单、低于交易所最小数量的数量，以及低于交易对最小名义金额的订单。

该功能默认关闭：

```text
BINANCE_LIVE_AUTO_SELLER_ENABLED=false
```

仅在确认 `BINANCE_MODE=live`，并接受它可能在没有人工确认的情况下市价卖出真实 Binance 现货持仓后再开启。该命令每次运行最多尝试卖出一次，并使用 SQLite 审计记录实现每日五次卖出上限和同交易对冷却期。

## 实盘 AI 交易

`binance-quant live-ai-trade-once` 会请求本地 `codex exec` 对配置的交易对给出一个结构化 `BUY`、`SELL` 或 `HOLD` 预测。模型只预测方向；本地风控引擎仍会决定是否允许任何订单，本地执行代码负责提交 Binance 订单。AI `SELL` 遇到本程序创建的保护性止损卖单（`clientOrderId` 以 `bqab-stop-` 开头）时，会先取消该止损单、刷新账户余额，再提交市价卖出；其他开放卖单仍会阻止 AI 卖出。

该功能默认关闭：

```text
BINANCE_LIVE_AI_TRADER_ENABLED=false
BINANCE_AI_TRADER_SYMBOLS=BTCUSDT,ETHUSDT,BNBUSDT,SOLUSDT,SPCXBUSDT,TSLABUSDT,MUBUSDT,CRCLBUSDT,SNDKBUSDT,NVDABUSDT
BINANCE_AI_TRADER_MODEL=
BINANCE_AI_TRADER_MIN_CONFIDENCE=0.70
BINANCE_AI_TRADER_CODEX_COMMAND=codex
BINANCE_AI_TRADER_CODEX_TIMEOUT_SECONDS=60
BINANCE_AI_TRADER_MAX_ACTIONS_PER_RUN=5
BINANCE_AI_TRADER_KLINES=1h:24,4h:30,1d:14
BINANCE_AI_TRADER_AGG_TRADES_LIMIT=500
BINANCE_AI_TRADER_WS_ENABLED=true
BINANCE_AI_TRADER_WS_SAMPLE_SECONDS=15
```

仅在确认 `BINANCE_MODE=live`、Codex CLI 已认证，并接受获批模型预测可能导致真实生产现货订单后再开启。该命令每次运行最多执行一个动作；`BUY` 复用自动买入的报价金额、已持有基础资产价值限制、每日限制、冷却期、价差上限和保护性止损，`SELL` 复用自动卖出的余额、每日限制、冷却期、开放订单和交易所过滤规则检查。如果脚本、定时任务或服务环境找不到 `codex`，把 `BINANCE_AI_TRADER_CODEX_COMMAND` 改为绝对路径，例如 `D:\Program Files\nodejs\codex.cmd`。

`binance-quant live-ai-trade-batch-once` 使用相同的模型提示和本地风控引擎，但可以在单次运行中执行多个已批准预测。它按置信度处理可执行预测，并在每个候选执行前刷新账户和交易对状态，在达到 `BINANCE_AI_TRADER_MAX_ACTIONS_PER_RUN` 次实盘下单尝试后停止。默认批量上限为 5。

### 实盘 U 本位合约 AI 交易

合约 AI 命令默认关闭，目标是 Binance USDT-M 永续合约：

```powershell
.\scripts\run.ps1 -Action live-futures-ai-trade-batch-once
```

保守默认值：

```text
BINANCE_LIVE_FUTURES_AI_TRADER_ENABLED=false
BINANCE_LIVE_FUTURES_CONFIRM_PRODUCTION=false
BINANCE_FUTURES_MARGIN_AMOUNT=5
BINANCE_FUTURES_DEFAULT_LEVERAGE=2
BINANCE_FUTURES_MAX_LEVERAGE=3
BINANCE_FUTURES_MAX_TOTAL_MARGIN=20
BINANCE_FUTURES_AI_MAX_ACTIONS_PER_RUN=5
```

合约执行器要求账户处于单向持仓模式，并使用逐仓保证金。AI 可以建议 `OPEN_LONG`、`OPEN_SHORT`、`CLOSE` 或 `HOLD`，但本地风控会继续强制检查杠杆、保证金、止损、止盈、每日净亏损（已实现盈亏 + 手续费 + 资金费）和关闭仓位比例限制。

### AI 分析输入数据

`live-ai-trade-batch-once` 在执行前只调用一次本地 `codex exec`。传给 AI 的 `Market context` 是一份 JSON，当前包含以下数据：

| 字段 | 来源 | 说明 |
| --- | --- | --- |
| `symbols` | `BINANCE_AI_TRADER_SYMBOLS` | 本次要求 AI 逐一返回预测的交易对列表。 |
| `market[].symbol` | 配置交易对 | 当前市场数据对应的交易对。 |
| `market[].bid` | `/api/v3/ticker/bookTicker` | 当前盘口买一价。 |
| `market[].ask` | `/api/v3/ticker/bookTicker` | 当前盘口卖一价。 |
| `market[].spread_bps` | 本地计算 | 用买一价和卖一价计算出的价差，单位为 bps。 |
| `market[].best_bid_qty/best_ask_qty` | `/api/v3/ticker/bookTicker` | 买一、卖一数量。 |
| `market[].timeframes` | `BINANCE_AI_TRADER_KLINES` | 多周期 K 线数据。默认包含 `1h:24`、`4h:30`、`1d:14`。 |
| `market[].timeframes.<周期>.opens/highs/lows/closes/volumes` | `/api/v3/klines` | K 线 OHLCV 原始序列。 |
| `market[].timeframes.<周期>.quote_volumes/trade_counts/taker_buy_*` | `/api/v3/klines` | 成交额、成交笔数和主动买入成交量序列。 |
| `market[].timeframes.<周期>.indicators` | 本地计算 | SMA、EMA、RSI、MACD、ATR。历史不足时字段为 `null`。 |
| `market[].timeframes.<周期>.volume` | 本地计算 | 最近成交量、20 根均量和放大倍数。 |
| `market[].timeframes.<周期>.range` | 本地计算 | 20 根高低点、距离高低点 bps、突破/跌破标记。 |
| `market[].timeframes.<周期>.indicator_metadata` | 本地计算 | 展示 K 线数量、指标预热数量和指标算法说明。 |
| `market[].summary` | 本地汇总 | 从价格、24h 行情、周期指标、流动性、聚合成交和实时采样中提炼出的紧凑摘要。 |
| `market[].ticker_24h` | `/api/v3/ticker/24hr` | 24h 涨跌幅、高低点、成交量、成交额和成交笔数。 |
| `market[].average_price` | `/api/v3/avgPrice` | 当前平均价及统计分钟数。 |
| `market[].aggregate_trades` | `/api/v3/aggTrades` | 最近聚合成交统计、主动买卖成交额、VWAP、大单数量和大单成交额。 |
| `market[].realtime` | Spot WebSocket `bookTicker`、`depth20@100ms`、`aggTrade` | AI 调用前短窗口采样的实时价差、盘口深度、盘口倾斜和主动成交强度；采样失败时标记为 `unavailable`。 |
| `market[].liquidity` | `/api/v3/ticker/bookTicker` 和 `/api/v3/depth?limit=20` | 最优价数量、20 档深度、盘口不平衡、点差评级和流动性评级。 |

`BINANCE_AI_TRADER_KLINES` 使用 `周期:根数` 列表配置，多个周期用逗号分隔，例如 `1h:24,4h:30,1d:14`。默认配置会给 AI 最近 24 小时的小时级走势、最近 5 天的 4 小时走势，以及最近 14 天的日线背景。

`BINANCE_AI_TRADER_AGG_TRADES_LIMIT` 控制每个交易对拉取的最近聚合成交数量，最大 1000。`BINANCE_AI_TRADER_WS_ENABLED=true` 时，命令会在调用 AI 前用 `BINANCE_STREAM_BASE_URL` 进行一次短窗口 WebSocket 采样；采样时间由 `BINANCE_AI_TRADER_WS_SAMPLE_SECONDS` 控制。WebSocket 采样失败不会中止交易流程，只会在上下文中把对应交易对标记为 `unavailable`。

以上字段按 Binance Spot 官方接口组织：市场数据来自 [REST Market Data Endpoints](https://developers.binance.com/docs/binance-spot-api-docs/rest-api/market-data-endpoints)，账户余额、开放订单、成交历史和手续费能力对应 [REST Account Endpoints](https://developers.binance.com/docs/binance-spot-api-docs/rest-api/account-endpoints)，实时采样对应 [Spot WebSocket Streams](https://developers.binance.com/docs/binance-spot-api-docs/web-socket-streams)。

这些增强特征只影响模型判断输入；本地置信度阈值、余额检查、点差上限、冷却、每日限制、最小名义金额和保护性止损仍然是最终风控边界。

AI 不接收 API key、API secret、订单提交权限、账户余额快照、SQLite 历史审计记录、交易所过滤规则详情，或完整开放订单内容。当前代码会为本地执行阶段拉取 `/api/v3/account`、`/api/v3/openOrders` 和交易规则，并已同步 `/api/v3/myTrades` 到本地 `spot_trade_fills` 表；这些数据现在只用于本地风控、下单执行、成交审计和盈亏分析，不会进入 `Market context`。提示词要求 AI 只返回 JSON：对 `symbols` 中每个交易对给出一个 `BUY`、`SELL` 或 `HOLD`，附带 `confidence` 和中文 `reason`。AI 返回后，本地代码才会按置信度排序候选；每个候选执行前会按 `BINANCE_AI_TRADER_KLINES` 重新拉取账户、盘口、K 线、开放订单和交易规则数据，但这些刷新数据只用于本地风控和下单执行，不会再次发送给 AI。

后续优化大模型输入时，优先补充低敏、可解释、可压缩的执行上下文，而不是把原始账户和订单明细直接暴露给模型：

| 建议字段 | 推荐来源 | 用途 |
| --- | --- | --- |
| `market[].execution_context` | `/api/v3/account`、`/api/v3/openOrders`、交易规则和本地风控计算 | 给 AI 明确当前交易对是否可买、是否可卖、可用/锁定基础资产估值、报价资产可用余额、最小名义金额、保护性止损数量和阻塞原因。 |
| `market[].trade_performance` | 本地 `spot_trade_fills`，来源为 `/api/v3/myTrades` | 给 AI 看到该交易对近期真实交易表现，例如持仓成本、已实现盈亏、未实现盈亏、最近买入/卖出价、止损命中次数和平均持仓时间。 |
| `market[].fee_context` | `/api/v3/myTrades` 中的 `commission`，或 Binance commission 接口 | 让模型判断预期空间时考虑手续费和净收益，而不是只看毛价差。 |
| `market[].freshness` | REST 响应时间、K 线收盘时间、ticker/实时采样时间 | 降低陈旧行情导致的高置信度误判。 |

也建议压缩现有输入：默认让模型主要读取 `market[].summary.timeframes`，限制或移除完整 OHLCV 序列；去掉与 `summary.price`、`liquidity` 重复的顶层买卖价和最优档数量；`average_price` 对短线现货决策信号较弱，可只在需要时保留；实时采样不可用时用统一状态描述，避免每个交易对重复大段空字段。这样可以显著降低 prompt 体积，并把上下文预算留给账户可执行性、真实成交和盈亏质量。

每次调用本地 `codex exec` 都会追加写入可读日志文件 `logs/ai_trader_llm.log`。日志按调用块记录时间、模型、交易对、超时配置、耗时、执行状态、返回码、传给 AI 的上下文、完整 prompt、stdout、stderr 和错误信息。单个日志文件默认最大 20 MB，超过后轮转为 `ai_trader_llm.log.1`，最多保留到 `ai_trader_llm.log.5`。日志不会写入 API key 或 API secret，但会包含传给 AI 的市场上下文；`logs/` 已被 `.gitignore` 忽略，不会随代码提交。

### 邮件通知

`live-ai-trade-once` 在打印 CLI 摘要后可以发送运行结果邮件。邮件失败不会重试交易；命令会以非零退出码结束，并输出已脱敏的通知错误。

```text
BINANCE_EMAIL_NOTIFICATIONS_ENABLED=false
BINANCE_EMAIL_SMTP_SERVER=
BINANCE_EMAIL_SMTP_PORT=25
BINANCE_EMAIL_LOGIN=
BINANCE_EMAIL_SENDER_PASSWORD=
BINANCE_EMAIL_RECIPIENT=
```
