量化策略规划及管理
来源: Obsidian Vault
量化策略规划及管理
统一管理所有量化策略的规划、开发、回测和运营规范 基于 fractal-system 从零到G1的完整迭代经验 + 策略库批量管理方法论 最后更新:2026-06-09
一、策略库总览
当前已开发/规划中的策略:
| 策略 | 类型 | 周期 | 方向 | 过滤器 | 笔数 | 胜率 | 年化 | 状态 |
|---|---|---|---|---|---|---|---|---|
| fractal-system | 反转(左侧) | 日线 | 多头 | amp<2% | 105 | 42.9% | 6.8% | 🔄 实盘观察期 |
| Ross-trade | 趋势跟随(右侧) | 日线 | 多+空 | 趋势/量/波动/布林 | 待测 | — | — | 🔄 开发中 |
| eod-overnight | 短线(尾盘) | 日线 | 多头 | 大盘/黑名单/止跌 | 393 | 63.9% | 105%(*) | 🔄 实盘观察期 |
每个策略在
mystocks/策略/下有代码仓库([策略名]/)和策略卡片([策略名].md)。
二、构建完整量化策略的七层框架
一个可上线运行的量化策略,需要逐层满足以下七层条件。任何一层缺失都会导致实盘失败。
第1层:数据基础
| 条件 | 说明 | 案例与教训 |
|---|---|---|
| 1.1 数据质量 | 历史数据干净、完整、无缺失 | CH日线585行/股(2020-2026),足够回测 |
| 1.2 数据粒度 | 时间周期必须与策略逻辑匹配 | 15min日内策略在T+1下不匹配——76.7%被overnight_exit强制结束 |
| 1.3 复权一致性 | 前复权/不复权必须统一 | trade_audit前复权 vs K线不复权,除权股偏差5-10% |
| 1.4 数据量充足 | 样本内+样本外均需覆盖 | 60min模式失败:单日仅4根bar,lookback不够 |
核心教训: 数据粒度是第一道门槛。在错误的时间周期上优化参数是徒劳。fractal-system花了5轮参数优化(V2-V7b)才发现瓶颈在时间周期本身。
第2层:市场制度适配
| 条件 | 说明 | 案例与教训 |
|---|---|---|
| 2.1 交易制度 | T+0/T+1、涨跌停、交易时间 | T+1是A股根本约束——日内持仓到收盘被迫清仓,价格大概率回落 |
| 2.2 交易成本 | 手续费、滑点、印花税 | 千一→万一差10倍:策略从"亏-40%"变"盈+1.4%" |
| 2.3 多空方向 | A股做空受限,天然偏多 | 空头103笔胜率23.3%,占总亏损63%。取消后立即改善 |
| 2.4 交易时间 | 盘中仅4小时 | 15min仅16根bar,0.8%已是能触及的止盈上限 |
核心教训: 策略必须与制度匹配。T+1下做日内、A股做空、高手续费下做高频——这些不是策略问题,是制度不匹配。
第3层:策略逻辑
| 条件 | 说明 | 案例与教训 |
|---|---|---|
| 3.1 入场可量化 | 规则用数学表达式描述,无歧义 | LSwing拐头 + 收盘价>前低,可编码可回测 |
| 3.2 出场完整 | 止损/止盈/时间止盈,三者缺一不可 | 初版缺时间止盈→持仓无限;后版优先级错→TIME_EXIT被截断 |
| 3.3 信号过滤 | 过滤假信号是策略的核心差异 | amp<2%将收益从+1.4%提升到+16.95%(单步最大改善) |
| 3.4 左侧vs右侧 | 预测反转 vs 确认后入场 | 左侧触碰魔法线后58.9%的LSwing值与前值相同,反转概率低 |
核心教训: 信号过滤 > 出场规则 > 入场信号。入场容易想到,但决定盈亏的是过滤和出场。
第4层:统计有效性
| 条件 | 说明 | 案例与教训 |
|---|---|---|
| 4.1 样本量 | 交易笔数足够多 | 9笔/2.5年不可信 → 105笔才有统计意义 |
| 4.2 股票池广度 | 足够多的股票验证泛化 | 8只→80只,从"无法判断"到"发现振幅过滤规律" |
| 4.3 盈亏平衡意识 | 任何参数组合都有最低胜率要求 | 盈亏比1.67:1需37.5%胜率,38.1%仅超0.6%,无安全边际 |
| 4.4 收益率归因 | 区分毛利和净利 | 零手续费+6,110 → 有手续费+1,398,手续费吃掉77% |
第5层:统计陷阱规避
| 条件 | 说明 | 案例与教训 |
|---|---|---|
| 5.1 前视偏差 | 回测不能使用未来信息 | 振幅过滤用回测前1年数据,用回测区间自身数据是自欺欺人 |
| 5.2 过拟合警觉 | 参数优化有天花板 | SL/TP/持仓天数全部调过,边际仅0.29%。真正突破来自换架构 |
| 5.3 幸存者偏差 | 回测收益可能不反映真实能力 | +16.95%/2.5年看似不错,但样本仍有限,需实盘验证 |
| 5.4 选择偏差 | 股票池选择可能引入偏差 | 80只手动选股有偏好 → 解决:全市场扫描+规则过滤 |
第6层:迭代方法论
| 维度 | 改善幅度 | 优先级 |
|---|---|---|
| 架构层:换时间周期 | 最大 | ⭐⭐⭐ |
| 逻辑层:加过滤/改方向 | 中等 | ⭐⭐ |
| 参数层:调SL/TP | 最小 | ⭐ |
改善幅度对比(fractal-system实证): - 架构(15min→日线):+3.11% - 逻辑(只做多):+42.1% - 逻辑(amp<2%过滤):+15.55% - 参数(V3→V7b):+0.29%
迭代纪律: 1. 每次失败必须有明确根因诊断——信号太少?止盈不可及?手续费太高?制度不匹配? 2. 不要在失败方向过度优化——15min调参5轮仍亏,应更早切换 3. 快速试错——每次迭代有明确假设和验证 4. 先验证方向,再优化参数——参数天花板到了就说明瓶颈在架构层
第7层:工程与运营
| 条件 | 说明 | 实施方式 |
|---|---|---|
| 7.1 可配置参数 | 所有阈值放配置文件 | TOML: sl_pct=0.015, tp1_ratio=1.67 |
| 7.2 回测框架 | 独立于实盘的回测脚本 | scripts/backtest_daily.py 支持批量/分组/统计 |
| 7.3 版本控制 | Git管理每个里程碑 | 402e93b可追溯到任何历史版本 |
| 7.4 自动化部署 | Cron日扫描+周报 | 日扫描(15:05) + 周报(周五18:00) |
| 7.5 评估节点 | 明确实盘评估规则 | 2026-06-22: WR≥40%→上线, 35-40%→观察, <35%→迭代 |
三、策略库管理规范
吸收自《一键回测整个策略库》方法论
3.1 目录结构
mystocks/策略/
├── README.md ← 策略库入口说明
├── INDEX/ ← HTML看板(http://ip:端口 浏览)
│ ├── index.html ← 总览仪表盘
│ ├── fractal-system.html ← 策略详情页
│ └── Ross-trade.html ← 策略详情页
│
├── cards/ ← 策略卡片(.md)
│ ├── fractal-system.md ← 分形投资体系卡片
│ ├── Ross-trade.md ← 洛氏霍克卡片
│ └── [future].md ← 未来新策略卡片
│
├── docs/ ← 管理文档
│ ├── 量化策略规划及管理.md ← 本文件(总览+规范)
│ ├── 新策略开发必读.md ← 提交前检查清单+评估标准
│ ├── 常见失败路径避坑清单.md ← 所有策略共享的失败路径库
│ └── 一键回测整个策略库.md ← 参考文档(批量回测方法论)
│
├── fractal-system/ ← 代码仓库(Gitea clone)
│ ├── src/ scripts/ config/ docs/
│
├── Ross-trade/ ← 代码仓库(Gitea clone)
│ ├── ross_trade/ scripts/ configs/ docs/
│
├── eod-overnight/ ← 代码仓库(从hermes/local复制)
│ ├── tasks/ config/ docs/ conditions/ phases/
│
└── [future-strategy]/ ← 未来新策略(同结构)
目录职责:
- README.md — 策略库入口,链接到各子目录
- INDEX/ — HTML看板,浏览器访问查看策略总览、回测对比、详情页
- cards/ — 策略卡片(.md),每个策略一个文件,含参数/回测/运维/迭代历史
- docs/ — 管理文档,规范/必读/避坑清单/参考
- [策略名]/ — 代码仓库(Gitea克隆)
每个策略占三个位置:
- [策略名]/ — 代码仓库(Gitea克隆,含源码/配置/脚本/测试)
- cards/[策略名].md — 策略卡片(人读摘要,含参数/回测/运维/迭代历史)
- INDEX/[策略名].html — 策略详情页(浏览器可读,含图表)
3.2 策略接口规范
状态: 暂缓 — 等Ross-trade完成开发后再评估统一接口
为支持批量回测和横向对比,每个策略应暴露统一接口:
# 每个策略模块必须实现以下接口
STRATEGY_NAME = "fractal-system" # 策略唯一标识
STRATEGY_DIR = "/root/.hermes/mycode/fractal-system" # 代码路径
def run_backtest(stock_pool=None, start=None, end=None, params=None):
"""运行回测,返回标准结果"""
return BacktestResult(
trades=[], # 交易列表
win_rate=0.0, # 胜率
total_return=0.0, # 总收益率
annual_return=0.0, # 年化收益
max_drawdown=0.0, # 最大回撤
sharpe=0.0, # 夏普比率
exit_reasons={}, # 离场原因分布
)
def run_daily_scan():
"""每日扫描,生成信号"""
pass
def get_config():
"""返回当前配置"""
pass
3.3 批量回测流水线
状态: 暂缓 — 依赖3.2统一接口
参照"一键回测整个策略库"的核心设计:
策略库目录 → 自动发现每个策略模块 → 统一数据集 → 运行回测 → 对比基准 → 排名汇总
关键设计原则:
- 自动发现 — 扫描策略目录,动态加载每个策略模块(
importlib) - 统一数据集 — 所有策略用同一份数据,保证横向可比
- 统一基准 — 用买入持有(Buy and Hold)作为统一参照
- 统一初始资金 — 所有策略用相同的
initial_capital - 失败隔离 — 单个策略异常不中断整体运行,记录到
failures.csv - 结果归档 — 每次运行生成:
-
summary.csv— 策略排名汇总 -failures.csv— 失败记录 - 每个策略的独立优化结果和资金曲线图 - 命令行控制 — 同一引擎,不同数据集:
bash python backtest_all.py --pool amp_lt_2pct --period 2024-01-01:2026-06-08
3.4 排除核心工具模块
策略目录中并非每个文件都是"可交易策略",需排除:
- 包初始化文件 (__init__.py)
- 工具函数库 (utils.py, common.py)
- 配置文件 (config.py, settings.py)
- 注册表/调度器
3.5 策略评估标准
| 指标 | 权重 | 说明 |
|---|---|---|
| 年化收益 | 20% | 扣除手续费后 |
| 最大回撤 | 25% | 核心指标,回撤>收益不可接受 |
| 夏普比率 | 20% | 风险调整后收益 |
| 胜率 | 15% | 需超过盈亏平衡线 |
| 样本量 | 10% | 最少30笔交易 |
| 实盘验证 | 10% | 至少2周实盘观察 |
评估节点规则: - 每2周评估一次实盘胜率 - WR ≥ 40% → 可上线 - 35-40% → 继续观察1周 - < 35% → 启动迭代
3.6 资金管理规则
多策略运行时的资金分配与风险敞口控制
| 策略状态 | 资金权重 | 说明 |
|---|---|---|
| 实盘盈利(≥6个月) | 60% | 已验证策略,主力仓位 |
| 实盘观察期(2-4周) | 25% | 观察中策略,限定风险 |
| 回测盈利(未实盘) | 15% | 待验证策略,最小仓位试水 |
| 开发中 | 0% | 不分配实盘资金 |
组合级约束:
| 约束 | 值 | 说明 |
|---|---|---|
| 单策略最大持仓 | 5只 | 防止单一策略过度集中 |
| 总风险敞口 | ≤6% | 所有策略持仓市值/总资金 |
| 单票最大仓位 | ≤20% | 跨策略合并计算 |
| 现金最低保有 | ≥10% | 应对极端行情 |
仓位评估可参考凯利公式:
f = (p×b - q) / b,其中p=胜率, b=盈亏比, q=1-p。 后续策略多了可以增加动态资金分配制度(按近期表现动态调整权重)。
3.7 策略淘汰规则
策略不是永久的。市场环境变化时,策略可能失效。需要明确的退役机制。
| 条件 | 动作 | 说明 |
|---|---|---|
| 实盘连续4周亏损 | ⚠️ 暂停,进入观察 | 可能是环境变化,暂停新开仓,持仓自然到期 |
| 实盘连续8周亏损 | ⛔ 退役,归档 | 策略失效,关闭Cron,代码归档保留 |
| 回测胜率 < 35% 且无改善路径 | 🗑️ 放弃开发 | 不浪费时间,记录失败原因后归档 |
| 3个月无信号 | 📦 归档休眠 | 策略逻辑可能不适配当前市场,保留代码随时唤醒 |
| 最大回撤 > 20% | ⚠️ 暂停,诊断 | 可能是参数/过滤失效,需回测验证 |
退役流程:
1. 关闭Cron任务
2. 策略卡片状态改为 ⚰️ 已退役
3. 代码仓库保留(不删除,作为历史参考)
4. 在本文件总览表中标记退役日期和原因
5. 如果未来市场环境变化,可重新唤醒
四、策略完整度对照表
以fractal-system G1为例,逐层检查:
| 层级 | 条件 | 状态 | 备注 |
|---|---|---|---|
| 1 | 数据基础 | ✅ | CH日线585行/股,前1年振幅计算 |
| 2 | 市场制度适配 | ✅ | 日线+只做多+万分之一手续费 |
| 3 | 策略逻辑 | ✅ | LSwing触碰+斜率确认+amp过滤 |
| 4 | 统计有效性 | ✅ | 105笔/42.9%WR/+16.95% |
| 5 | 统计陷阱 | ✅ | 无前视偏差,参数天花板已确认 |
| 6 | 迭代方法论 | ✅ | 6版迭代,每版有根因诊断 |
| 7 | 工程运营 | 🔄 | Cron已部署,实盘观察期中(06-09~06-22) |
五、常见失败路径与应对
| 失败路径 | 根因 | 应对 | 效果 |
|---|---|---|---|
| 时间周期与制度不匹配 | T+1下做日内,隔夜清仓亏损 | 换日线级别 | -1.71%→+1.40% |
| 空头在A股天然劣势 | 无法真正做空,亏损占63% | 只做多头 | -40.7%→+1.40% |
| 手续费模型错误 | 千一vs万一差10倍 | 修正为万分之一 | 策略从"亏损"变"盈利" |
| 信号稀疏无法判断 | 8只股票9笔交易 | 扩大到80只 | 发现振幅过滤规律 |
| 高振幅股票信号不可靠 | LSwing频繁变化,触碰后继续跌 | amp<2%过滤 | +1.40%→+16.95% |
| 参数优化天花板 | 调SL/TP边际仅0.29% | 停止调参,改架构 | 识别真正瓶颈 |
| 斜率确认太严格 | 58.9%的LSwing值与前值相同 | >改>= |
0笔→6笔信号 |
| 出场优先级错误 | TIME_EXIT被overnight截断 | 重排check()顺序 | TIME_EXIT正常触发 |
六、新策略开发流程
开发一个新策略时,按以下步骤推进:
1. 规划 → 确认策略逻辑/时间周期/数据源/市场制度约束
2. 数据 → 确认数据质量/粒度/复权一致性
3. 实现 → 编码信号生成/风控/回测框架
4. 初始回测 → 验证逻辑是否产生信号
5. 根因诊断 → 如果亏损,诊断是架构/逻辑/参数哪层的问题
6. 迭代优化 → 按优先级:架构 > 逻辑 > 参数
7. 扩大验证 → 扩大股票池/时间窗口
8. 固化 → Git commit + 配置文件 + 策略卡片
9. 部署 → Cron日扫描 + 实盘观察期
10. 评估 → 2周评估节点,决定上线/继续/迭代
每一步的详细要求见上方"七层框架"对应层级。
七、fractal-system 迭代版本历史
| 版本 | 周期 | 核心变更 | 笔数 | 胜率 | 收益 | 年化 |
|---|---|---|---|---|---|---|
| V1 | 15min | 初始信号生成 | 0 | - | - | - |
| V2 | 15min | +P0过滤+P3冷却 | 0 | - | - | - |
| V3 | 15min | +斜率确认放宽 | 9 | 33% | -1.71% | -0.7% |
| V4 | 60min | 连续60min模式 | 15 | 20% | -10.75% | -4.3% |
| V5 | 日线 | 切换日线 | 334 | 34.1% | -40.7% | - |
| F2 | 日线 | +只做多+SL1.5% | 236 | 38.1% | +1.40% | 0.6% |
| G1 | 日线 | +amp<2%过滤 | 105 | 42.9% | +16.95% | 6.8% |
八、一句话总结
量化策略的alpha来自"正确的时间周期 + 正确的方向 + 正确的股票过滤",而非参数微调。 80%的时间花在发现哪个维度是瓶颈上,20%的时间花在修复上。 架构(周期) > 逻辑(过滤/方向) > 参数(SL/TP),优先级不可颠倒。 策略库的价值在于批量验证、横向对比、快速淘汰——把时间花在值得深入的候选者上。
附录:策略卡片模板
新建策略时,复制此模板到
mystocks/策略/[策略名].md
# {策略名称}
> {一句话描述策略核心逻辑}
---
## 基本信息
| 项目 | 内容 |
|------|------|
| 策略名称 | {名称} |
| 代码仓库 | `mystocks/策略/{名称}/` (Gitea: {URL}) |
| 运行仓库 | {Hermes执行路径} |
| 数据源 | {CH/MySQL/TDX...} |
| 配置格式 | {TOML/YAML} |
| 数据处理 | {polars/pandas} |
| Git | {commit hash} |
| 状态 | {🔄实盘观察期 / ✅已上线 / 📋规划中 / ⚰️已退役} |
## 策略逻辑
**入场:**
- {规则1}
- {规则2}
- {过滤条件}
**出场:**
- 止损: {参数}
- 止盈TP1: {参数}
- 止盈TP2: {参数}
- 时间止盈: {参数}
**过滤:**
- {过滤器1}: {参数}
- {过滤器2}: {参数}
## 当前参数
| 参数 | 值 | 说明 |
|------|-----|------|
| {param} | {value} | {desc} |
## 回测结果
**回测区间:** {start} ~ {end}
**股票池:** {N只, 筛选条件}
| 指标 | 值 |
|------|-----|
| 总交易 | {N}笔 |
| 胜率 | {WR}% |
| 总收益 | {pnl}% |
| 年化收益 | {annual}% |
| 最大回撤 | {dd}% |
| 盈亏比 | {pf} |
**离场分布:**
- stop_loss: {N}笔 ({pct}%)
- take_profit_1: {N}笔 ({pct}%)
- take_profit_2: {N}笔 ({pct}%)
- time_exit: {N}笔 ({pct}%)
## 风控规则
| 规则 | 参数 | 说明 |
|------|------|------|
| {rule} | {value} | {desc} |
## 运维
| 项目 | 详情 |
|------|------|
| Cron日扫描 | {时间} (job: {id}) |
| Cron周报 | {时间} (job: {id}) |
| 评估节点 | {date} |
| 评估规则 | WR≥40%→上线 / 35-40%→观察 / <35%→迭代 |
## 迭代历史
| 版本 | 周期 | 核心变更 | 笔数 | 胜率 | 收益 | 年化 |
|------|------|---------|------|------|------|------|
| V1 | {period} | {change} | {N} | {WR} | {pnl} | {annual} |
| **当前** | **{period}** | **{change}** | **{N}** | **{WR}** | **{pnl}** | **{annual}** |
附录B:新策略添加流程(必读)
当一个新策略完成开发并通过回测验证后,必须按以下5步将其登记到策略库。 每个策略在策略库中占4个位置,缺一不可。
总览:4个登记位置
| # | 位置 | 路径 | 作用 |
|---|---|---|---|
| 1 | 代码仓库 | mystocks/策略/[策略名]/ |
源码、配置、脚本、报告 |
| 2 | 策略卡片 | cards/[策略名].md |
人读摘要(参数/回测/运维/迭代) |
| 3 | HTML详情页 | INDEX/[策略名].html |
浏览器看板(暗色主题) |
| 4 | 总览入口 | INDEX/index.html + README.md |
策略卡片+对比表+目录 |
Step 1: 创建代码仓库
cd "/mnt/c/Users/John Cheng/Documents/Obsidian Vault/mystocks/策略"
# 如果代码已在别处开发,复制或clone到此处
cp -r /path/to/[策略名] [策略名]/
# 或 git clone
git clone http://192.168.123.104:3001/john/[策略名].git
代码仓库标准结构(参考zt-chaser):
[策略名]/
├── config.yaml # 可配置参数(权重/阈值/过滤条件)
├── README.md # 策略说明
├── .gitignore # 排除缓存/数据
├── src/ # 源码模块
├── scripts/ # 运行脚本(回测/扫描/模拟盘)
├── data/cache/ # 数据缓存(.gitignore排除)
└── reports/ # HTML分析报告
Step 2: 创建策略卡片
在 cards/ 下创建 [策略名].md,使用附录A的卡片模板。必填内容:
- 基本信息:名称/类型/周期/数据源/代码位置/状态
- 核心指标:回测区间/样本量/胜率/收益/回撤/连亏
- 因子/逻辑体系:每个因子的权重/IC/p值/数据源
- 实盘参数:阈值/仓位/止损/卖出规则
- 迭代历史:版本表格
# 参考
cp cards/zt-chaser.md cards/[策略名].md
# 然后修改内容
Step 3: 创建HTML详情页
在 INDEX/ 下创建 [策略名].html,使用暗色主题(CSS变量与index.html一致)。
:root {
--bg:#0d1117; --card:#161b22; --border:#30363d;
--text:#c9d1d9; --dim:#8b949e; --accent:#58a6ff;
--green:#3fb950; --red:#f85149; --yellow:#d29922; --purple:#bc8cff;
}
关键组件(参考 INDEX/zt-chaser.html):
- 核心指标3列网格
- 因子表(含IC/p值/数据源标签)
- 回测阈值扫描表
- 成交率/风控模型(如有)
- 版本迭代时间线
- 返回总览按钮
Step 4: 更新总览看板
修改 INDEX/index.html,在策略卡片网格 <div class="grid"> 中添加新卡片:
<!-- [策略名] -->
<div class="card">
<div class="card-header">
<div class="card-icon" style="background:linear-gradient(...)">ICON</div>
<div>
<div class="card-title">[策略名]</div>
<div class="card-type">类型 · 理论 · 周期</div>
</div>
<span class="status obs/dev">状态</span>
</div>
<div class="stats">
<div class="stat"><div class="stat-value green">XX%</div><div class="stat-label">胜率</div></div>
<div class="stat"><div class="stat-value green">+XX%</div><div class="stat-label">收益</div></div>
<div class="stat"><div class="stat-value green">-XX%</div><div class="stat-label">回撤</div></div>
</div>
<div class="params"><table>...关键参数...</table></div>
<div class="version-bar">...版本条...</div>
<br>
<div class="actions">
<a class="btn btn-primary" href="[策略名].html">查看详情</a>
<a class="btn btn-outline" href="../cards/[策略名].md">Markdown卡片</a>
</div>
</div>
同时在对比表 <table class="compare-table"> 中添加新列。
Step 5: 更新README和总纲
README.md— 目录表加行 + 策略总览表加行docs/量化策略规划及管理.md— 第一章"策略库总览"表格加行
检查清单
完成添加后逐项确认:
| # | 检查项 | 命令/方法 |
|---|---|---|
| 1 | 代码仓库存在且有内容 | ls mystocks/策略/[策略名]/ |
| 2 | 策略卡片存在且内容完整 | 浏览 cards/[策略名].md |
| 3 | HTML详情页可访问 | curl localhost:8890/[策略名].html 返回200 |
| 4 | 总览看板显示新卡片 | 浏览器打开 localhost:8890 |
| 5 | 对比表包含新策略列 | 查看index.html对比表 |
| 6 | README总览表已更新 | 查看README.md |
| 7 | HTTP服务已启动 | curl localhost:8890 返回200 |
启动/重启HTTP看板服务
pkill -f "http.server 8890"
cd "/mnt/c/Users/John Cheng/Documents/Obsidian Vault/mystocks/策略/INDEX"
/root/miniconda3/envs/stock/bin/python -m http.server 8890 &
# 验证
curl -s -o /dev/null -w "%{http_code}" http://localhost:8890
浏览器访问:http://localhost:8890 或 http://192.168.123.104:8890