记录一次主流币系统的落地(2026-07-07)

把"想做"变成"在做",中间隔的是一个能自己跑起来的系统

前一天定了方向:做链上合约可用的 14 个高级策略,全部做进去。

这天就是落地——数据采集层、14 个策略引擎、回测引擎、预计算脚本、展示页,以及第一批真实仓位。


14 个策略,分五类

策略清单这么落:

类别 策略
A. 资金费率类 1. 费率反转 · 2. 费率趋势共振 · 3. 费率套利
B. 持仓量类 4. OI 背离 · 5. 多空比反转 · 6. 清算磁吸
C. 量价类 7. 盘口不平衡 · 8. 鲸鱼追踪 · 9. 放量突破
D. 技术指标类 10. ADX 多周期 · 11. SuperTrend · 12. RSI 背离+量
E. 宏观情绪类 13. BTC 主导率 · 14. 恐贪逆向

有几条是链上独有的:资金费率、未平仓量、多空比、链上订单簿——数据透明、CEX 拿不到。这也是"链上合约"这个选择真正的价值所在。

从数据到页面,一共六个模块

落地的文件是这些:

文件 功能
maincoin_data.py 数据采集层(费率 / OI / 多空比 / 订单簿 / 大单 / 全球情绪 / 高级指标)
maincoin_strategy.py 14 个策略引擎 + 兼容旧策略
maincoin_backtest.py 回测引擎(兼容新旧策略)
mc_precompute.py 预计算脚本(采集 + 策略 + 回测)
pages/16_maincoin_strategy.py 策略中心展示页(4 个 Tab)
pages/17_maincoin_paper.py 独立模拟交易页

写的过程中撞了几个必须记的坑:

  • signal 是 MySQL 保留字——建表时报 1064 语法错误,加反引号解决;后来替换成新策略引擎时,又批量修了一轮
  • 表缺 adx 列——14 个策略里新增的技术指标字段
  • 回测 PARAMS 缺旧 key——新策略引擎替换了旧函数名,回测报参数缺失,加回兼容函数才跑通
  • SuperTrend 的 Series 比较问题——DataFrame 操作下比较 Series 出问题,最后把这条策略简化成 MA 交叉的实现

改的时候守了一条:只动新建的表,不碰原有页面的任何代码。 一个新模块不该以打坏旧页面为代价。

库里多出来的那几张表

预计算跑完,多了这么几张表:

表名 用途
mc_top_coins 成交量前 10 币种列表
mc_perp_data 链上合约实时数据(费率、OI、多空比等)
mc_bt_results 回测结果 + 净值曲线 + 交易记录
mc_signals_latest 14 个策略最新信号
mc_sim_account 模拟账户
mc_sim_positions 实时持仓
mc_sim_trades 已平仓交易记录

信号跑完一共 140 条,分布是 35 LONG / 5 SHORT / 100 HOLD。当前最强的几条:

信号 置信度 原因
BTC funding_trend LONG 90% 趋势多头 + 费率正 + ADX=32
ETH funding_trend LONG 90% 趋势多头 + 费率正 + ADX=45
ZEC whale_tracking LONG 90% 鲸鱼买入 买卖比=15.5
BTC orderbook_imbalance SHORT 85% 卖盘强势 imbalance=−0.77

从"点按钮"到"打开就有"

展示层的要求一路在变,最后定型成一句话:页面只读库,零计算。

策略概览、实时信号、回测三个 Tab 全部改成打开即显示,不再有任何 st.button()。数据由 python mc_precompute.py 提前算好写库。

这样做的好处很直接:打开页面是秒级,而且每次看到的是同一份"快照",不用怀疑两个人刷出来的数不一样。

5 个初始仓位

系统跑起来了,但模拟交易里一笔交易都没有。查下来是个典型的"没接线"问题:

模拟交易读的是旧表 mc_sim_signals(0 条),而 14 个策略的结果在 mc_signals_latest(40 条活跃信号)。两个系统根本没打通。

修 maincoin_paper.py 改成读 mc_signals_latest,同时让它跳过没有合约的币种(TLM 就会卡住),然后跑了一轮,开出 5 个多头仓位:

交易对 方向 入场价 仓位 策略
BTC/USDT LONG $61,634 $1,500(15%) 费率趋势共振
ETH/USDT LONG $1,734 $1,500(15%) 费率趋势共振
BNB/USDT LONG $571 $1,500(15%) 费率趋势共振
XRP/USDT LONG $1.11 $1,500(15%) 费率趋势共振
TRX/USDT LONG $0.33 $1,500(15%) 鲸鱼追踪

账户:现金 $2,500 + 持仓 $7,500 = 总资产 $10,000。策略来源是 funding_trend(4 个)加 whale_tracking(1 个)。

顺带算了个粗账:按当前仓位和信号频率,每年大概 50-100 笔交易,预期年化 15-30%——但这个数字只是估算,先记着,别当真。

一个 account_id 的错

仓位开好了,页面却显示"无持仓"。

数据库里明明有 5 条 OPEN 记录。查到最后:是手动开仓时参数传错了——account_id 填成了 10000(余额值),应该是 1(账户 ID)。数据修正到 account_id=1 之后,页面上就正常了。

页面这边也顺手做了调整:16 号页去掉重复的「模拟交易」Tab(和 17 号页功能完全重复,而且原来还缺 load_kline_df 导入会报错),现在只留策略概览 / 实时信号 / 回测;17 号页把交易记录从 st.write() 文本行改成 st.dataframe() 结构化表格,列包括币种、方向、入场价、出场价、盈亏、盈亏%、策略、原因、平仓时间。


最后

三层。

表面是 14 个策略、7 张表、5 个仓位——一夜之间,系统从"两个技术指标"长成了一个有点像样的策略中心。

中间是一条工程规律:一个新系统能不能自己跑起来,不取决于策略写得多漂亮,而取决于那些接缝有没有接上。模拟交易读错表、account_id 传错、signal 撞保留字——每一个都是小得不能再小的错,但每一个都足以让整个系统看起来"是坏的"。

最里面一层,是那 5 个 $1,500 的仓位。

它们全部来自实证出来的信号,而不是我拍的脑袋。可即便如此,它们也只是模拟——是这套系统第一次真的把钱当成有重量的东西去用。从这天起,14 个策略不再是一份清单,而是要在真实价格上接受检验的十几个赌注。

一个策略系统真正的起点,不是它跑通的那一刻,而是它第一次需要为自己的仓位负责的那一刻。