From aaccdcfc16378731054308873359d475772829c8 Mon Sep 17 00:00:00 2001 From: dekun Date: Sun, 26 Jul 2026 10:12:03 +0800 Subject: [PATCH] Replace harsh red XMind markers with calmer business info/flag icons. Co-authored-by: Cursor --- docs/交易执行手册与行为准则.xmind | Bin 14057 -> 13898 bytes scripts/build_playbook_xmind.py | 1348 ++++++++++++++--------------- 2 files changed, 674 insertions(+), 674 deletions(-) diff --git a/docs/交易执行手册与行为准则.xmind b/docs/交易执行手册与行为准则.xmind index 0cc8cdb74a101c43672b013a08c6d1f7b3e8c4cf..07a586a30b2b2b98d3646a3867a1ed629cceb53f 100644 GIT binary patch literal 13898 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 literal 14057 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

}3nEN#AwiFo`h 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 str: - return uuid.uuid4().hex[:26] - - -def style( - *, - fill: Optional[str] = None, - color: Optional[str] = None, - font_size: str = "12pt", - bold: bool = False, - shape: str = "org.xmind.topicShape.roundedRect", - line: Optional[str] = None, -) -> dict[str, Any]: - props: dict[str, str] = { - "shape-class": shape, - "fo:font-family": "Microsoft YaHei", - "fo:font-size": font_size, - "fo:font-weight": "bold" if bold else "normal", - "border-line-width": "0pt", - "line-width": "1.5pt", - "line-class": "org.xmind.branchConnection.roundedelbow", - } - if fill: - props["svg:fill"] = fill - if color: - props["fo:color"] = color - if line: - props["line-color"] = line - return {"id": tid(), "properties": props} - - -def topic( - title: str, - children: list | None = None, - *, - markers: list[str] | None = None, - labels: list[str] | None = None, - notes: str | None = None, - fill: Optional[str] = None, - color: Optional[str] = None, - font_size: str = "12pt", - bold: bool = False, - line: Optional[str] = None, -) -> dict: - node: dict[str, Any] = { - "id": tid(), - "class": "topic", - "title": title, - "style": style( - fill=fill, color=color, font_size=font_size, bold=bold, line=line - ), - } - if markers: - node["markers"] = [{"markerId": m} for m in markers] - if labels: - node["labels"] = labels - if notes: - node["notes"] = {"plain": {"content": notes}} - if children: - node["children"] = {"attached": children} - return node - - -def t1(title: str, children: list, markers: list[str], label: str) -> dict: - return topic( - title, - children, - markers=markers, - labels=[label], - fill=C_L1, - color=C_TEXT, - font_size="16pt", - bold=True, - line=C_L1, - ) - - -def t2(title: str, children: list | None = None, markers: list[str] | None = None) -> dict: - return topic( - title, - children, - markers=markers or ["flag-dark-blue"], - fill=C_L2, - color=C_TEXT, - font_size="13pt", - bold=True, - line=C_L2, - ) - - -def leaf( - title: str, - *, - markers: list[str] | None = None, - fill: Optional[str] = None, - color: Optional[str] = C_TEXT_DARK, -) -> dict: - return topic( - title, - markers=markers or ["symbol-right"], - fill=fill or "#EBF5FB", - color=color, - font_size="11pt", - line="#AED6F1", - ) - - -def ok(title: str) -> dict: - return leaf(title, markers=["other-yes", "symbol-right"], fill="#E8F8F5", color=C_PASS) - - -def no(title: str) -> dict: - return leaf(title, markers=["other-no", "symbol-wrong"], fill="#FDEDEC", color=C_FAIL) - - -def warn(title: str) -> dict: - return leaf(title, markers=["symbol-attention"], fill="#FEF9E7", color=C_WARN) - - -def build_content() -> list: - root = topic( - "交易执行体系\n手册 v2 · 开单三检", - [ - t1( - "① 设计理念", - [ - t2( - "核心主张", - [ - leaf("少而精,珍惜机会,样本干净", markers=["star-dark-blue"]), - leaf("不保证收益;过程可控,结果随缘", markers=["symbol-info"]), - leaf("过滤比频率重要;日更不是目标", markers=["symbol-info"]), - leaf("看不懂不做;不为开单找理由", markers=["symbol-attention"]), - warn("丢掉对冲:无「有保护就能多做」幻觉"), - ], - markers=["other-lightbulb"], - ), - t2( - "工具边界", - [ - leaf("OKX 期权:方向单(虚值等)", markers=["flag-blue"]), - leaf("Gate 合约:结构清楚时的波段", markers=["flag-dark-blue"]), - leaf("同一时段尽量只让一边说话", markers=["symbol-equality"]), - no("不做期期对冲 / 偏置壳"), - ], - markers=["symbol-pin"], - ), - t2( - "文档分工", - [ - leaf("行为准则:能不能动手(防火墙)", markers=["other-lock"]), - leaf("执行手册:怎么做单(玩法/仓位/离场)", markers=["other-note"]), - ], - markers=["other-businesscard"], - ), - ], - markers=["priority-1", "other-lightbulb"], - label="理念", - ), - t1( - "② 资金要求", - [ - t2( - "总盘约 800U", - [ - leaf("单笔约 1.25% 量级", markers=["symbol-info"]), - leaf("全错一天约 2.5% 量级——防守优先", markers=["symbol-attention"]), - ], - markers=["other-businesscard"], - ), - t2( - "单笔期权", - [ - leaf("约 10U 权利金预算", markers=["priority-1"]), - leaf("一次只持有一个期权仓位", markers=["symbol-pin"]), - leaf("打满 = min(余额, 单笔预算)", markers=["symbol-equality"]), - ], - markers=["flag-blue"], - ), - t2( - "Gate 合约", - [ - leaf("日内保证金约 50U · 约 10 倍", markers=["symbol-info"]), - leaf("止损一般约 5U", markers=["symbol-attention"]), - leaf("单笔最大亏损不超过约 10U", markers=["symbol-no-entry"]), - leaf("有单才用保证金,无单为 0", markers=["task-done"]), - ], - markers=["flag-dark-blue"], - ), - t2( - "日损失心理框", - [ - warn("都错:合计大约 ≤20U"), - ok("都对:期望可到 40U+(理想,非每日目标)"), - no("不为「好像有保护」放大仓位"), - warn("尽量少同向双开;双开按合计最坏约 20U"), - ], - markers=["symbol-attention"], - ), - ], - markers=["priority-2", "other-businesscard"], - label="资金", - ), - t1( - "③ 操盘思路", - [ - t2( - "行为准则 · 开单三检", - [ - topic( - "一句话防火墙", - [ - leaf("信号够不够清晰?", markers=["symbol-question"]), - leaf("流程有没有跑通?", markers=["symbol-question"]), - leaf("情绪是不是在证明自己?", markers=["symbol-question"]), - no("三检不过 → 不开"), - ], - markers=["other-lock", "priority-1"], - fill="#154360", - color=C_TEXT, - font_size="12pt", - bold=True, - labels=["防火墙"], - ), - topic( - "总循环", - [ - leaf("信号判断 → 流程确认 → 情绪自检", markers=["arrow-right"]), - leaf("全部通过 → 开仓", markers=["other-yes"]), - leaf("等待系统结果(止盈/止损/到期)", markers=["other-clock"]), - leaf("复盘整环 → 等待下一信号", markers=["arrow-refresh"]), - no("任一步否决 → 空仓离开"), - ], - markers=["arrow-right"], - fill="#1A5276", - color=C_TEXT, - font_size="12pt", - bold=True, - ), - topic( - "开单前三秒停顿", - [ - leaf("核心信号是什么?", markers=["symbol-pin"]), - leaf("安全流程跑通了吗?", markers=["task-start"]), - leaf("冷静执行,还是怕踏空/回本/证明自己?", markers=["symbol-attention"]), - ], - markers=["other-clock"], - fill="#1A5276", - color=C_TEXT, - font_size="12pt", - bold=True, - ), - topic( - "检1 · 信号判断", - [ - ok("一句话说清唯一核心确认"), - ok("点位/结构本身已够清楚"), - no("说不清、靠宏观故事自圆"), - no("「好像有戏」但确认模糊"), - leaf("对照:1H→空间→结构→定损盈→工具", markers=["arrow-right"]), - ], - markers=["priority-1", "symbol-info"], - fill="#1A5276", - color=C_TEXT, - font_size="12pt", - bold=True, - labels=["Signal"], - ), - topic( - "检2 · 流程确认", - [ - ok("资金与当日额度符合"), - ok("单笔/组合敞口在预算内"), - no("资金或次数已触限"), - no("单笔或日最坏超限 → 暂停"), - no("「先开了再说」跳步"), - ], - markers=["priority-2", "task-start"], - fill="#1A5276", - color=C_TEXT, - font_size="12pt", - bold=True, - labels=["Process"], - ), - topic( - "检3 · 情绪自检", - [ - ok("符合系统 + 账户没问题 → 开"), - ok("可接受空仓,旁观者视角"), - no("怕踏空"), - no("上回亏了要回本"), - no("必须证明我是对的"), - warn("红灯亮了,信号再好看也不开"), - ], - markers=["priority-3", "smiley-smile"], - fill="#1A5276", - color=C_TEXT, - font_size="12pt", - bold=True, - labels=["Emotion"], - ), - topic( - "复盘只记什么", - [ - leaf("信号:是否做了?核心写了什么?", markers=["other-note"]), - leaf("流程:资金/敞口是否过关?有无跳步?", markers=["other-note"]), - leaf("情绪:当时是哪一类心态?", markers=["other-note"]), - warn("结果不推翻「三检是否完成」评分"), - ], - markers=["other-note"], - fill="#1A5276", - color=C_TEXT, - font_size="12pt", - bold=True, - ), - ], - markers=["other-lock", "flag-purple"], - ), - t2( - "开仓逻辑", - [ - topic( - "主链条(强制)", - [ - leaf("1H 方向:明显 N 字;跟 1H 波段", markers=["priority-1"]), - leaf("空间:空看支撑、多看阻力;≥约 2%", markers=["priority-2"]), - leaf("结构:15m/5m;量级约 8h+(约 48×15m)", markers=["priority-3"]), - leaf("定损盈:外沿/针尖;RR 须接受", markers=["priority-4"]), - leaf("选工具:期权 或 合约(不对冲)", markers=["priority-5"]), - no("任一步不过 → 空仓等待"), - ], - markers=["arrow-right", "symbol-pin"], - fill="#154360", - color=C_TEXT, - font_size="12pt", - bold=True, - labels=["主链"], - ), - topic( - "结构形态参考", - [ - leaf("收敛", markers=["flag-blue"]), - leaf("两段式回调", markers=["flag-dark-blue"]), - leaf("箱体", markers=["flag-gray"]), - leaf("假突破", markers=["flag-orange"]), - ], - markers=["symbol-image"], - fill="#1A5276", - color=C_TEXT, - font_size="12pt", - bold=True, - ), - topic( - "期权入场", - [ - ok("主链条全过;结构突破/假突破成立"), - leaf("一天期方向单;空间够优先虚值", markers=["star-blue"]), - leaf("默认先只开期权,不上合约", markers=["symbol-pin"]), - leaf("尽量 16:00 后开次日到期", markers=["other-clock"]), - no("不做:期期对冲、偏置壳、为开而开"), - ], - markers=["flag-blue", "symbol-plus"], - fill="#1A5276", - color=C_TEXT, - font_size="12pt", - bold=True, - labels=["期权"], - ), - topic( - "合约入场(Gate)", - [ - ok("主链条过关;位置极明确"), - leaf("想清进场:假突破 / 结构突破", markers=["symbol-info"]), - leaf("止损挂模型位(外沿/针尖)", markers=["symbol-attention"]), - warn("独立假突破:只做合约或空仓"), - no("勿与「突破期权后再加仓」混仓"), - ], - markers=["flag-dark-blue", "symbol-plus"], - fill="#1A5276", - color=C_TEXT, - font_size="12pt", - bold=True, - labels=["合约"], - ), - ], - markers=["symbol-plus", "arrow-up-right"], - ), - t2( - "平仓逻辑", - [ - topic( - "期权离场", - [ - ok("只认:系统/规则止盈"), - ok("只认:到期"), - no("开仓后中间不手动平仓"), - warn("紧急手平 → 标记非策略样本"), - ], - markers=["flag-green", "symbol-minus"], - fill="#145A32", - color=C_TEXT, - font_size="12pt", - bold=True, - labels=["期权"], - ), - topic( - "合约离场", - [ - ok("结构止盈为准"), - ok("结构止损为准(约 5U 量级)"), - leaf("等待系统/挂单结果,不情绪手平", markers=["other-clock"]), - ], - markers=["flag-dark-green", "symbol-minus"], - fill="#145A32", - color=C_TEXT, - font_size="12pt", - bold=True, - labels=["合约"], - ), - topic( - "持仓期盯什么", - [ - leaf("程序与纪律是否正常", markers=["task-done"]), - no("不是浮盈浮亏数字本身"), - leaf("无信号空档:空跑三检也是训练", markers=["other-lightbulb"]), - ], - markers=["symbol-info"], - fill="#1A5276", - color=C_TEXT, - font_size="12pt", - bold=True, - ), - ], - markers=["symbol-minus", "flag-green"], - ), - ], - markers=["priority-3", "arrow-right"], - label="操盘", - ), - t1( - "④ 纪律执行", - [ - t2( - "Gate 日纪律", - [ - leaf("只做很明确的位置", markers=["symbol-pin"]), - leaf("同一位置最多两次机会(突破/假突破)", markers=["priority-2"]), - no("两次都错 → 当日不再做单"), - ok("离场以结构止盈/止损为准"), - ], - markers=["flag-dark-blue", "task-done"], - ), - t2( - "期权日纪律", - [ - no("不手平;等规则止盈或到期"), - leaf("一次一仓;约 10U 权利金", markers=["symbol-pin"]), - no("不对冲;不做每天默认开期权"), - leaf("损位跟模型:外沿/针尖", markers=["symbol-attention"]), - ], - markers=["flag-blue", "task-done"], - ), - t2( - "开仓前自检清单", - [ - leaf("今日只动期权/合约?未开对冲?", markers=["task-start"]), - leaf("1H 方向清楚(含 N 字)?", markers=["task-start"]), - leaf("空间足够?结构量级够?", markers=["task-start"]), - leaf("止损/止盈与 RR 定好?", markers=["task-start"]), - leaf("工具选期权还是合约?理由写清?", markers=["task-start"]), - leaf("合约:本位置第几次?今日两次用完?", markers=["task-start"]), - ], - markers=["other-yes", "task-start"], - ), - t2( - "一句话版本", - [ - leaf("1H→空间→结构→定损盈→期权/合约", markers=["arrow-right"]), - leaf("不对冲;期权不手平", markers=["symbol-no-entry"]), - leaf("一位置两次,错完收工", markers=["priority-2"]), - leaf("珍惜机会,日更不是目标", markers=["star-dark-blue"]), - ], - markers=["star-dark-blue", "symbol-right"], - ), - ], - markers=["priority-4", "task-done"], - label="纪律", - ), - ], - # 中心主题保持干净:不加图标/标签/备注,避免绿人、黄便签等杂乱标识 - markers=None, - labels=None, - fill=C_ROOT, - color=C_TEXT, - font_size="20pt", - bold=True, - line=C_ROOT, - ) - root["structureClass"] = "org.xmind.ui.logic.right" - - # XMind Zen 内置主题名;客户端可识别 business - sheet = { - "id": tid(), - "class": "sheet", - "title": "执行手册与行为准则 · 商务版", - "rootTopic": root, - "theme": { - "id": tid(), - "title": "business", - "centralTopic": { - "id": "centralTopic", - "properties": { - "svg:fill": C_ROOT, - "fo:color": C_TEXT, - "fo:font-family": "Microsoft YaHei", - "fo:font-size": "20pt", - "fo:font-weight": "bold", - "shape-class": "org.xmind.topicShape.roundedRect", - "line-color": C_L1, - "line-width": "2pt", - "line-class": "org.xmind.branchConnection.roundedelbow", - }, - }, - "mainTopic": { - "id": "mainTopic", - "properties": { - "svg:fill": C_L1, - "fo:color": C_TEXT, - "fo:font-family": "Microsoft YaHei", - "fo:font-size": "15pt", - "fo:font-weight": "bold", - "shape-class": "org.xmind.topicShape.roundedRect", - "line-color": C_L2, - "line-width": "1.5pt", - }, - }, - "subTopic": { - "id": "subTopic", - "properties": { - "svg:fill": C_L2, - "fo:color": C_TEXT, - "fo:font-family": "Microsoft YaHei", - "fo:font-size": "12pt", - "shape-class": "org.xmind.topicShape.roundedRect", - "line-color": "#85C1E9", - }, - }, - "floatingTopic": { - "id": "floatingTopic", - "properties": { - "svg:fill": C_MUTED, - "fo:color": C_TEXT, - "fo:font-family": "Microsoft YaHei", - }, - }, - "importantTopic": { - "id": "importantTopic", - "properties": { - "svg:fill": C_WARN, - "fo:color": C_TEXT, - }, - }, - "minorTopic": { - "id": "minorTopic", - "properties": { - "svg:fill": "#EBF5FB", - "fo:color": C_TEXT_DARK, - }, - }, - "expiredTopic": { - "id": "expiredTopic", - "properties": { - "svg:fill": "#D5D8DC", - "fo:color": C_MUTED, - }, - }, - "calloutTopic": { - "id": "calloutTopic", - "properties": { - "svg:fill": "#FEF9E7", - "fo:color": C_WARN, - }, - }, - "summaryTopic": { - "id": "summaryTopic", - "properties": { - "svg:fill": "#145A32", - "fo:color": C_TEXT, - }, - }, - "boundary": { - "id": "boundary", - "properties": { - "svg:fill": "#D6EAF8", - "fo:color": C_L1, - "line-color": C_L2, - }, - }, - "summary": { - "id": "summary", - "properties": { - "line-color": C_L1, - "line-width": "2pt", - }, - }, - "relationship": { - "id": "relationship", - "properties": { - "line-color": C_MUTED, - "line-pattern": "dash", - }, - }, - "map": { - "id": "map", - "properties": { - "svg:fill": "#F4F6F7", - "color-list": f"{C_L1} {C_L2} #2874A6 #1ABC9C #B9770E", - "line-tapered": "none", - }, - }, - }, - } - return [sheet] - - -def main() -> None: - content = build_content() - metadata = { - "creator": {"name": "crypto_monitor", "version": "1.1"}, - "activeSheetId": content[0]["id"], - } - manifest = { - "file-entries": { - "content.json": {}, - "metadata.json": {}, - "manifest.json": {}, - } - } - OUT.parent.mkdir(parents=True, exist_ok=True) - if OUT.exists(): - OUT.unlink() - with zipfile.ZipFile(OUT, "w", compression=zipfile.ZIP_DEFLATED) as zf: - zf.writestr("content.json", json.dumps(content, ensure_ascii=False, indent=2)) - zf.writestr("metadata.json", json.dumps(metadata, ensure_ascii=False, indent=2)) - zf.writestr("manifest.json", json.dumps(manifest, ensure_ascii=False, indent=2)) - print(f"wrote {OUT}") - - -if __name__ == "__main__": - main() +#!/usr/bin/env python3 +"""Generate business-style XMind (Zen/2020+) from playbook + behavior rules.""" +from __future__ import annotations + +import json +import uuid +import zipfile +from pathlib import Path +from typing import Any, Optional + +OUT = Path(__file__).resolve().parents[1] / "docs" / "交易执行手册与行为准则.xmind" + +# 商务配色:深蓝主调 + 灰蓝辅色 + 强调色 +C_ROOT = "#0F2942" +C_L1 = "#1B4F72" +C_L2 = "#2E86AB" +C_PASS = "#1E8449" +C_FAIL = "#922B21" +C_WARN = "#B9770E" +C_MUTED = "#566573" +C_TEXT = "#FFFFFF" +C_TEXT_DARK = "#1C2833" + + +def tid() -> str: + return uuid.uuid4().hex[:26] + + +def style( + *, + fill: Optional[str] = None, + color: Optional[str] = None, + font_size: str = "12pt", + bold: bool = False, + shape: str = "org.xmind.topicShape.roundedRect", + line: Optional[str] = None, +) -> dict[str, Any]: + props: dict[str, str] = { + "shape-class": shape, + "fo:font-family": "Microsoft YaHei", + "fo:font-size": font_size, + "fo:font-weight": "bold" if bold else "normal", + "border-line-width": "0pt", + "line-width": "1.5pt", + "line-class": "org.xmind.branchConnection.roundedelbow", + } + if fill: + props["svg:fill"] = fill + if color: + props["fo:color"] = color + if line: + props["line-color"] = line + return {"id": tid(), "properties": props} + + +def topic( + title: str, + children: list | None = None, + *, + markers: list[str] | None = None, + labels: list[str] | None = None, + notes: str | None = None, + fill: Optional[str] = None, + color: Optional[str] = None, + font_size: str = "12pt", + bold: bool = False, + line: Optional[str] = None, +) -> dict: + node: dict[str, Any] = { + "id": tid(), + "class": "topic", + "title": title, + "style": style( + fill=fill, color=color, font_size=font_size, bold=bold, line=line + ), + } + if markers: + node["markers"] = [{"markerId": m} for m in markers] + if labels: + node["labels"] = labels + if notes: + node["notes"] = {"plain": {"content": notes}} + if children: + node["children"] = {"attached": children} + return node + + +def t1(title: str, children: list, markers: list[str], label: str) -> dict: + return topic( + title, + children, + markers=markers, + labels=[label], + fill=C_L1, + color=C_TEXT, + font_size="16pt", + bold=True, + line=C_L1, + ) + + +def t2(title: str, children: list | None = None, markers: list[str] | None = None) -> dict: + return topic( + title, + children, + markers=markers or ["flag-dark-blue"], + fill=C_L2, + color=C_TEXT, + font_size="13pt", + bold=True, + line=C_L2, + ) + + +def leaf( + title: str, + *, + markers: list[str] | None = None, + fill: Optional[str] = None, + color: Optional[str] = C_TEXT_DARK, +) -> dict: + return topic( + title, + markers=markers or ["symbol-right"], + fill=fill or "#EBF5FB", + color=color, + font_size="11pt", + line="#AED6F1", + ) + + +def ok(title: str) -> dict: + return leaf(title, markers=["other-yes", "symbol-right"], fill="#E8F8F5", color=C_PASS) + + +def no(title: str) -> dict: + return leaf(title, markers=["other-no", "flag-gray"], fill="#FDEDEC", color=C_FAIL) + + +def warn(title: str) -> dict: + return leaf(title, markers=["symbol-info"], fill="#FEF9E7", color=C_WARN) + + +def build_content() -> list: + root = topic( + "交易执行体系\n手册 v2 · 开单三检", + [ + t1( + "① 设计理念", + [ + t2( + "核心主张", + [ + leaf("少而精,珍惜机会,样本干净", markers=["star-dark-blue"]), + leaf("不保证收益;过程可控,结果随缘", markers=["symbol-info"]), + leaf("过滤比频率重要;日更不是目标", markers=["symbol-info"]), + leaf("看不懂不做;不为开单找理由", markers=["symbol-info"]), + warn("丢掉对冲:无「有保护就能多做」幻觉"), + ], + markers=["other-lightbulb"], + ), + t2( + "工具边界", + [ + leaf("OKX 期权:方向单(虚值等)", markers=["flag-blue"]), + leaf("Gate 合约:结构清楚时的波段", markers=["flag-dark-blue"]), + leaf("同一时段尽量只让一边说话", markers=["symbol-equality"]), + no("不做期期对冲 / 偏置壳"), + ], + markers=["symbol-info"], + ), + t2( + "文档分工", + [ + leaf("行为准则:能不能动手(防火墙)", markers=["other-lock"]), + leaf("执行手册:怎么做单(玩法/仓位/离场)", markers=["other-note"]), + ], + markers=["other-businesscard"], + ), + ], + markers=["priority-1", "other-lightbulb"], + label="理念", + ), + t1( + "② 资金要求", + [ + t2( + "总盘约 800U", + [ + leaf("单笔约 1.25% 量级", markers=["symbol-info"]), + leaf("全错一天约 2.5% 量级——防守优先", markers=["symbol-info"]), + ], + markers=["other-businesscard"], + ), + t2( + "单笔期权", + [ + leaf("约 10U 权利金预算", markers=["priority-1"]), + leaf("一次只持有一个期权仓位", markers=["symbol-info"]), + leaf("打满 = min(余额, 单笔预算)", markers=["symbol-equality"]), + ], + markers=["flag-blue"], + ), + t2( + "Gate 合约", + [ + leaf("日内保证金约 50U · 约 10 倍", markers=["symbol-info"]), + leaf("止损一般约 5U", markers=["symbol-info"]), + leaf("单笔最大亏损不超过约 10U", markers=["flag-gray"]), + leaf("有单才用保证金,无单为 0", markers=["task-done"]), + ], + markers=["flag-dark-blue"], + ), + t2( + "日损失心理框", + [ + warn("都错:合计大约 ≤20U"), + ok("都对:期望可到 40U+(理想,非每日目标)"), + no("不为「好像有保护」放大仓位"), + warn("尽量少同向双开;双开按合计最坏约 20U"), + ], + markers=["symbol-info"], + ), + ], + markers=["priority-2", "other-businesscard"], + label="资金", + ), + t1( + "③ 操盘思路", + [ + t2( + "行为准则 · 开单三检", + [ + topic( + "一句话防火墙", + [ + leaf("信号够不够清晰?", markers=["symbol-question"]), + leaf("流程有没有跑通?", markers=["symbol-question"]), + leaf("情绪是不是在证明自己?", markers=["symbol-question"]), + no("三检不过 → 不开"), + ], + markers=["other-lock", "priority-1"], + fill="#154360", + color=C_TEXT, + font_size="12pt", + bold=True, + labels=["防火墙"], + ), + topic( + "总循环", + [ + leaf("信号判断 → 流程确认 → 情绪自检", markers=["arrow-right"]), + leaf("全部通过 → 开仓", markers=["other-yes"]), + leaf("等待系统结果(止盈/止损/到期)", markers=["other-clock"]), + leaf("复盘整环 → 等待下一信号", markers=["arrow-refresh"]), + no("任一步否决 → 空仓离开"), + ], + markers=["arrow-right"], + fill="#1A5276", + color=C_TEXT, + font_size="12pt", + bold=True, + ), + topic( + "开单前三秒停顿", + [ + leaf("核心信号是什么?", markers=["symbol-info"]), + leaf("安全流程跑通了吗?", markers=["task-start"]), + leaf("冷静执行,还是怕踏空/回本/证明自己?", markers=["symbol-info"]), + ], + markers=["other-clock"], + fill="#1A5276", + color=C_TEXT, + font_size="12pt", + bold=True, + ), + topic( + "检1 · 信号判断", + [ + ok("一句话说清唯一核心确认"), + ok("点位/结构本身已够清楚"), + no("说不清、靠宏观故事自圆"), + no("「好像有戏」但确认模糊"), + leaf("对照:1H→空间→结构→定损盈→工具", markers=["arrow-right"]), + ], + markers=["priority-1", "symbol-info"], + fill="#1A5276", + color=C_TEXT, + font_size="12pt", + bold=True, + labels=["Signal"], + ), + topic( + "检2 · 流程确认", + [ + ok("资金与当日额度符合"), + ok("单笔/组合敞口在预算内"), + no("资金或次数已触限"), + no("单笔或日最坏超限 → 暂停"), + no("「先开了再说」跳步"), + ], + markers=["priority-2", "task-start"], + fill="#1A5276", + color=C_TEXT, + font_size="12pt", + bold=True, + labels=["Process"], + ), + topic( + "检3 · 情绪自检", + [ + ok("符合系统 + 账户没问题 → 开"), + ok("可接受空仓,旁观者视角"), + no("怕踏空"), + no("上回亏了要回本"), + no("必须证明我是对的"), + warn("红灯亮了,信号再好看也不开"), + ], + markers=["priority-3", "smiley-smile"], + fill="#1A5276", + color=C_TEXT, + font_size="12pt", + bold=True, + labels=["Emotion"], + ), + topic( + "复盘只记什么", + [ + leaf("信号:是否做了?核心写了什么?", markers=["other-note"]), + leaf("流程:资金/敞口是否过关?有无跳步?", markers=["other-note"]), + leaf("情绪:当时是哪一类心态?", markers=["other-note"]), + warn("结果不推翻「三检是否完成」评分"), + ], + markers=["other-note"], + fill="#1A5276", + color=C_TEXT, + font_size="12pt", + bold=True, + ), + ], + markers=["other-lock", "flag-purple"], + ), + t2( + "开仓逻辑", + [ + topic( + "主链条(强制)", + [ + leaf("1H 方向:明显 N 字;跟 1H 波段", markers=["priority-1"]), + leaf("空间:空看支撑、多看阻力;≥约 2%", markers=["priority-2"]), + leaf("结构:15m/5m;量级约 8h+(约 48×15m)", markers=["priority-3"]), + leaf("定损盈:外沿/针尖;RR 须接受", markers=["priority-4"]), + leaf("选工具:期权 或 合约(不对冲)", markers=["priority-5"]), + no("任一步不过 → 空仓等待"), + ], + markers=["arrow-right", "symbol-info"], + fill="#154360", + color=C_TEXT, + font_size="12pt", + bold=True, + labels=["主链"], + ), + topic( + "结构形态参考", + [ + leaf("收敛", markers=["flag-blue"]), + leaf("两段式回调", markers=["flag-dark-blue"]), + leaf("箱体", markers=["flag-gray"]), + leaf("假突破", markers=["flag-orange"]), + ], + markers=["symbol-image"], + fill="#1A5276", + color=C_TEXT, + font_size="12pt", + bold=True, + ), + topic( + "期权入场", + [ + ok("主链条全过;结构突破/假突破成立"), + leaf("一天期方向单;空间够优先虚值", markers=["star-blue"]), + leaf("默认先只开期权,不上合约", markers=["symbol-info"]), + leaf("尽量 16:00 后开次日到期", markers=["other-clock"]), + no("不做:期期对冲、偏置壳、为开而开"), + ], + markers=["flag-blue", "symbol-plus"], + fill="#1A5276", + color=C_TEXT, + font_size="12pt", + bold=True, + labels=["期权"], + ), + topic( + "合约入场(Gate)", + [ + ok("主链条过关;位置极明确"), + leaf("想清进场:假突破 / 结构突破", markers=["symbol-info"]), + leaf("止损挂模型位(外沿/针尖)", markers=["symbol-info"]), + warn("独立假突破:只做合约或空仓"), + no("勿与「突破期权后再加仓」混仓"), + ], + markers=["flag-dark-blue", "symbol-plus"], + fill="#1A5276", + color=C_TEXT, + font_size="12pt", + bold=True, + labels=["合约"], + ), + ], + markers=["symbol-plus", "arrow-up-right"], + ), + t2( + "平仓逻辑", + [ + topic( + "期权离场", + [ + ok("只认:系统/规则止盈"), + ok("只认:到期"), + no("开仓后中间不手动平仓"), + warn("紧急手平 → 标记非策略样本"), + ], + markers=["flag-green", "symbol-minus"], + fill="#145A32", + color=C_TEXT, + font_size="12pt", + bold=True, + labels=["期权"], + ), + topic( + "合约离场", + [ + ok("结构止盈为准"), + ok("结构止损为准(约 5U 量级)"), + leaf("等待系统/挂单结果,不情绪手平", markers=["other-clock"]), + ], + markers=["flag-dark-green", "symbol-minus"], + fill="#145A32", + color=C_TEXT, + font_size="12pt", + bold=True, + labels=["合约"], + ), + topic( + "持仓期盯什么", + [ + leaf("程序与纪律是否正常", markers=["task-done"]), + no("不是浮盈浮亏数字本身"), + leaf("无信号空档:空跑三检也是训练", markers=["other-lightbulb"]), + ], + markers=["symbol-info"], + fill="#1A5276", + color=C_TEXT, + font_size="12pt", + bold=True, + ), + ], + markers=["symbol-minus", "flag-green"], + ), + ], + markers=["priority-3", "arrow-right"], + label="操盘", + ), + t1( + "④ 纪律执行", + [ + t2( + "Gate 日纪律", + [ + leaf("只做很明确的位置", markers=["symbol-info"]), + leaf("同一位置最多两次机会(突破/假突破)", markers=["priority-2"]), + no("两次都错 → 当日不再做单"), + ok("离场以结构止盈/止损为准"), + ], + markers=["flag-dark-blue", "task-done"], + ), + t2( + "期权日纪律", + [ + no("不手平;等规则止盈或到期"), + leaf("一次一仓;约 10U 权利金", markers=["symbol-info"]), + no("不对冲;不做每天默认开期权"), + leaf("损位跟模型:外沿/针尖", markers=["symbol-info"]), + ], + markers=["flag-blue", "task-done"], + ), + t2( + "开仓前自检清单", + [ + leaf("今日只动期权/合约?未开对冲?", markers=["task-start"]), + leaf("1H 方向清楚(含 N 字)?", markers=["task-start"]), + leaf("空间足够?结构量级够?", markers=["task-start"]), + leaf("止损/止盈与 RR 定好?", markers=["task-start"]), + leaf("工具选期权还是合约?理由写清?", markers=["task-start"]), + leaf("合约:本位置第几次?今日两次用完?", markers=["task-start"]), + ], + markers=["other-yes", "task-start"], + ), + t2( + "一句话版本", + [ + leaf("1H→空间→结构→定损盈→期权/合约", markers=["arrow-right"]), + leaf("不对冲;期权不手平", markers=["flag-gray"]), + leaf("一位置两次,错完收工", markers=["priority-2"]), + leaf("珍惜机会,日更不是目标", markers=["star-dark-blue"]), + ], + markers=["star-dark-blue", "symbol-right"], + ), + ], + markers=["priority-4", "task-done"], + label="纪律", + ), + ], + # 中心主题保持干净:不加图标/标签/备注,避免绿人、黄便签等杂乱标识 + markers=None, + labels=None, + fill=C_ROOT, + color=C_TEXT, + font_size="20pt", + bold=True, + line=C_ROOT, + ) + root["structureClass"] = "org.xmind.ui.logic.right" + + # XMind Zen 内置主题名;客户端可识别 business + sheet = { + "id": tid(), + "class": "sheet", + "title": "执行手册与行为准则 · 商务版", + "rootTopic": root, + "theme": { + "id": tid(), + "title": "business", + "centralTopic": { + "id": "centralTopic", + "properties": { + "svg:fill": C_ROOT, + "fo:color": C_TEXT, + "fo:font-family": "Microsoft YaHei", + "fo:font-size": "20pt", + "fo:font-weight": "bold", + "shape-class": "org.xmind.topicShape.roundedRect", + "line-color": C_L1, + "line-width": "2pt", + "line-class": "org.xmind.branchConnection.roundedelbow", + }, + }, + "mainTopic": { + "id": "mainTopic", + "properties": { + "svg:fill": C_L1, + "fo:color": C_TEXT, + "fo:font-family": "Microsoft YaHei", + "fo:font-size": "15pt", + "fo:font-weight": "bold", + "shape-class": "org.xmind.topicShape.roundedRect", + "line-color": C_L2, + "line-width": "1.5pt", + }, + }, + "subTopic": { + "id": "subTopic", + "properties": { + "svg:fill": C_L2, + "fo:color": C_TEXT, + "fo:font-family": "Microsoft YaHei", + "fo:font-size": "12pt", + "shape-class": "org.xmind.topicShape.roundedRect", + "line-color": "#85C1E9", + }, + }, + "floatingTopic": { + "id": "floatingTopic", + "properties": { + "svg:fill": C_MUTED, + "fo:color": C_TEXT, + "fo:font-family": "Microsoft YaHei", + }, + }, + "importantTopic": { + "id": "importantTopic", + "properties": { + "svg:fill": C_WARN, + "fo:color": C_TEXT, + }, + }, + "minorTopic": { + "id": "minorTopic", + "properties": { + "svg:fill": "#EBF5FB", + "fo:color": C_TEXT_DARK, + }, + }, + "expiredTopic": { + "id": "expiredTopic", + "properties": { + "svg:fill": "#D5D8DC", + "fo:color": C_MUTED, + }, + }, + "calloutTopic": { + "id": "calloutTopic", + "properties": { + "svg:fill": "#FEF9E7", + "fo:color": C_WARN, + }, + }, + "summaryTopic": { + "id": "summaryTopic", + "properties": { + "svg:fill": "#145A32", + "fo:color": C_TEXT, + }, + }, + "boundary": { + "id": "boundary", + "properties": { + "svg:fill": "#D6EAF8", + "fo:color": C_L1, + "line-color": C_L2, + }, + }, + "summary": { + "id": "summary", + "properties": { + "line-color": C_L1, + "line-width": "2pt", + }, + }, + "relationship": { + "id": "relationship", + "properties": { + "line-color": C_MUTED, + "line-pattern": "dash", + }, + }, + "map": { + "id": "map", + "properties": { + "svg:fill": "#F4F6F7", + "color-list": f"{C_L1} {C_L2} #2874A6 #1ABC9C #B9770E", + "line-tapered": "none", + }, + }, + }, + } + return [sheet] + + +def main() -> None: + content = build_content() + metadata = { + "creator": {"name": "crypto_monitor", "version": "1.1"}, + "activeSheetId": content[0]["id"], + } + manifest = { + "file-entries": { + "content.json": {}, + "metadata.json": {}, + "manifest.json": {}, + } + } + OUT.parent.mkdir(parents=True, exist_ok=True) + if OUT.exists(): + OUT.unlink() + with zipfile.ZipFile(OUT, "w", compression=zipfile.ZIP_DEFLATED) as zf: + zf.writestr("content.json", json.dumps(content, ensure_ascii=False, indent=2)) + zf.writestr("metadata.json", json.dumps(metadata, ensure_ascii=False, indent=2)) + zf.writestr("manifest.json", json.dumps(manifest, ensure_ascii=False, indent=2)) + print(f"wrote {OUT}") + + +if __name__ == "__main__": + main()