feat(longbridge): complete 602315 bypass + CLI helper + stock_t脚本
新增: - references/cli-unicode-table-parsing.md - CLI 表格 ┃ vs │ Unicode 解析 - references/cron-wrapper-multi-token-pitfall.md - cron script 字段不支持空格 - references/generic-stock-query.md - 通用 stock_t.py 持仓查询 - references/longportapp-cn-endpoints.md - Python SDK 走 longportapp.cn vs CLI 走 longbridge.com - references/sdk-vs-cli-domain-routing.md - SDK/CLI 域名路由差异 - scripts/longbridge_cli_helper.py - SDK 兼容层, 内部走 CLI (绕 602315) - scripts/stock_t.py - 通用持仓查询脚本 (不限定股票) 修改: - longbridge-cli/SKILL.md + references/longbridge-602315-bypass.md - longbridge-python-sdk/SKILL.md: 增 cn endpoint 说明 - intraday-trading/SKILL.md 关键发现: 1. Python SDK 用 openapi.longportapp.cn (阿里云深圳), CLI 用 openapi.longbridge.com (AWS 香港) 2. 两个不同域名, 不同 endpoint, 都需 LONGBRIDGE_HTTP_URL=https://openapi.longbridge.com 强制覆盖 3. CLI 默认不读 HTTP_PROXY env, 必须用 proxychains4 OS 层拦截 4. 完整链路: LONGBRIDGE_HTTP_URL=.com + LONGBRIDGE_REGION=ap + proxychains4 + Clash 香港节点 5. Yahoo Finance 备用数据源 (CLI 拿不到 K线) 6. CLI 表格用 ┃ (header) 和 │ (data) 两种 Unicode 字符, parser 要兼容 订单实测: - RGTI.US 1股@15.40: 下单 1259694819492519936, 撤单成功 - 9988.HK 200股@112.70: Rejected (余额或限额) - 1810.HK 1200股@25.98: Rejected (同上) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,65 @@
|
||||
---
|
||||
note: 2026-07-09 session - helper script for SDK-shaped access to longbridge CLI
|
||||
---
|
||||
|
||||
# CLI Unicode 表格解析陷阱
|
||||
|
||||
**问题**: Longbridge CLI 的表格输出中,**header 用的竖线和 data 行的竖线是不同字符**:
|
||||
- Header 边框: `┃` (U+2503, BOX DRAWINGS DOUBLE VERTICAL)
|
||||
- Data 边框: `│` (U+2502, BOX DRAWINGS LIGHT VERTICAL)
|
||||
|
||||
直接用 `line.split('┃')` 解析 → header 解析正常,data 行解析为空(因为 data 行没有 `┃` 只有 `│`)。
|
||||
|
||||
**正解**: 用 `re.split('[┃│]', line)` 同时处理两个字符。
|
||||
|
||||
```python
|
||||
import re
|
||||
def split_row(line):
|
||||
cells = re.split('[┃│]', line)
|
||||
return [c.strip() for c in cells if c.strip()]
|
||||
```
|
||||
|
||||
# 持仓表名换行问题
|
||||
|
||||
股票名称(长名称如 "Unitedhealth" / "Semicon Bear 3X")会在表格里换行,导致 parser 拿到空数据行。需要在 `stock_positions()` 里**过滤空持仓**:
|
||||
- 跳过 `标的` 为空 或 `持仓` 不是数字的行
|
||||
- 避免 `Position("Unitedhealth", 0, 0.0, 0)` 这种空对象
|
||||
|
||||
# Buy_power 缺失
|
||||
|
||||
CLI `balance` 输出**没有 buy_power 字段**(只有 现金余额/净资产/最大融资额/剩余融资额/风险等级)。需要推算:
|
||||
```python
|
||||
buy_power = cash + remaining_finance_amount
|
||||
```
|
||||
|
||||
SDK 的 `AccountBalance.buy_power` 是**实际可买入金额** = 现金 + 剩余融资额。`total_cash` 字段也对应现金余额。
|
||||
|
||||
# Cancel 交互确认
|
||||
|
||||
`longbridge cancel <id>` **没有 -y 标志**(`longbridge cancel --help` 显示没有此选项),交互式问 `确认撤销订单 XXX? [y/N]`。
|
||||
|
||||
**绕开**: `echo 'y' | longbridge cancel <id>` 或 `expect 'y\n'`。
|
||||
|
||||
Buy/sell 有 `-y`,但 cancel 没有。
|
||||
|
||||
# 参考实现
|
||||
|
||||
`scripts/longbridge_cli_helper.py` 提供 SDK 兼容接口:
|
||||
- `account_balance()` → `[AccountBalance]`
|
||||
- `stock_positions()` → `Channels`
|
||||
- `submit_order(symbol, order_type, side, qty, time_in_force, price)` → `OrderResult`
|
||||
- `cancel_order(order_id)` → None
|
||||
- enums: `OrderType.LO/MO`, `OrderSide.Buy/Sell`, `TimeInForceType.Day/GoodTilCanceled`
|
||||
|
||||
每个函数都内部走:
|
||||
```bash
|
||||
proxychains4 -f ~/.proxychains/proxychains.conf \
|
||||
~/.local/bin/longbridge --profile lb_real <cmd>
|
||||
```
|
||||
|
||||
外加强制 env:
|
||||
```python
|
||||
env['LONGBRIDGE_HTTP_URL'] = 'https://openapi.longbridge.com' # 走 .com 海外域
|
||||
env['LONGBRIDGE_REGION'] = 'ap' # 绕过 is_cn 探测
|
||||
env['LONGBRIDGE_TRADE_ENABLED'] = 'true' # 解除只读模式
|
||||
```
|
||||
Reference in New Issue
Block a user