From 9dc363270e662c9f63c664954a5aa5fb3cf0888d Mon Sep 17 00:00:00 2001 From: dekun Date: Sun, 26 Jul 2026 10:08:07 +0800 Subject: [PATCH] Restyle playbook XMind with business theme, markers, and labels. Co-authored-by: Cursor --- docs/交易执行手册与行为准则.xmind | Bin 7326 -> 14109 bytes scripts/build_playbook_xmind.py | 632 +++++++++++++++++++++++------- 2 files changed, 487 insertions(+), 145 deletions(-) diff --git a/docs/交易执行手册与行为准则.xmind b/docs/交易执行手册与行为准则.xmind index 25e8eb04eb66a68e2ab67dc5a80ad128c90400a8..9f54460d5e1375535e1b2629a349cdc4cbddca48 100644 GIT binary patch literal 14109 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 o>3?jo|J(mJp@_2->0Kg}h#%9JMW~USDAONAXi str: - return uuid.uuid4().hex + return uuid.uuid4().hex[:26] -def topic(title: str, children: list | None = None, notes: str | None = None) -> dict: - node: dict = { +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: @@ -27,280 +85,564 @@ def topic(title: str, children: list | None = None, notes: str | None = None) -> 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 + 开单三检)", + "交易执行体系\n手册 v2 · 开单三检", [ - topic( - "设计理念", + t1( + "① 设计理念", [ - topic("少而精,珍惜机会,样本干净"), - topic("不保证收益;过程可控,结果随缘"), - topic("过滤比频率重要;日更不是目标"), - topic("看不懂不做;不为开单找理由"), - topic("丢掉对冲:无「有保护就能多做」幻觉"), - topic( - "工具只留期权与合约", + t2( + "核心主张", [ - topic("OKX 期权:方向单(虚值等)"), - topic("Gate 合约:结构清楚时的波段"), - topic("同一时段尽量只让一边说话"), + leaf("少而精,珍惜机会,样本干净", markers=["star-dark-blue"]), + leaf("不保证收益;过程可控,结果随缘", markers=["symbol-info"]), + leaf("过滤比频率重要;日更不是目标", markers=["symbol-info"]), + leaf("看不懂不做;不为开单找理由", markers=["symbol-attention"]), + warn("丢掉对冲:无「有保护就能多做」幻觉"), ], + markers=["other-lightbulb"], ), - topic( + t2( + "工具边界", + [ + leaf("OKX 期权:方向单(虚值等)", markers=["flag-blue"]), + leaf("Gate 合约:结构清楚时的波段", markers=["flag-dark-blue"]), + leaf("同一时段尽量只让一边说话", markers=["symbol-equality"]), + no("不做期期对冲 / 偏置壳"), + ], + markers=["symbol-pin"], + ), + t2( "文档分工", [ - topic("行为准则:能不能动手(防火墙)"), - topic("执行手册:怎么做单(玩法/仓位/离场)"), + leaf("行为准则:能不能动手(防火墙)", markers=["other-lock"]), + leaf("执行手册:怎么做单(玩法/仓位/离场)", markers=["other-note"]), ], + markers=["other-businesscard"], ), ], + markers=["priority-1", "other-lightbulb"], + label="理念", ), - topic( - "资金要求", + t1( + "② 资金要求", [ - topic("总资金参考:约 800U"), - topic( + t2( + "总盘约 800U", + [ + leaf("单笔约 1.25% 量级", markers=["symbol-info"]), + leaf("全错一天约 2.5% 量级——防守优先", markers=["symbol-attention"]), + ], + markers=["other-businesscard"], + ), + t2( "单笔期权", [ - topic("约 10U 权利金预算"), - topic("一次只持有一个期权仓位"), - topic("按可用打满 = min(余额, 单笔预算)"), + leaf("约 10U 权利金预算", markers=["priority-1"]), + leaf("一次只持有一个期权仓位", markers=["symbol-pin"]), + leaf("打满 = min(余额, 单笔预算)", markers=["symbol-equality"]), ], + markers=["flag-blue"], ), - topic( + t2( "Gate 合约", [ - topic("日内保证金约 50U、约 10 倍"), - topic("止损一般约 5U"), - topic("单笔最大亏损不超过约 10U"), - topic("有单才用保证金,无单为 0"), + 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"], ), - topic( + t2( "日损失心理框", [ - topic("期权+合约都错:合计大约 ≤20U"), - topic("都对:期望可到 40U+(理想,非每日目标)"), - topic("相对 800U:单笔约 1.25%;全错一天约 2.5%"), - ], - ), - topic( - "叠加红线", - [ - topic("同日双开按合计最坏约 20U 接受"), - topic("尽量少同向双开"), - topic("不为「好像有保护」放大仓位"), + warn("都错:合计大约 ≤20U"), + ok("都对:期望可到 40U+(理想,非每日目标)"), + no("不为「好像有保护」放大仓位"), + warn("尽量少同向双开;双开按合计最坏约 20U"), ], + markers=["symbol-attention"], ), ], + markers=["priority-2", "other-businesscard"], + label="资金", ), - topic( - "操盘思路", + t1( + "③ 操盘思路", [ - topic( - "行为准则(开单三检)", + t2( + "行为准则 · 开单三检", [ topic( - "一句话", + "一句话防火墙", [ - topic("信号够不够清晰?"), - topic("流程有没有跑通?"), - topic("情绪是不是在证明自己?"), - 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( "总循环", [ - topic("信号判断 → 流程确认 → 情绪自检"), - topic("全部通过 → 开仓"), - topic("等待系统结果(止盈/止损/到期)"), - topic("复盘整环 → 等待下一信号"), - 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( "开单前三秒停顿", [ - topic("核心信号是什么?"), - topic("安全流程跑通了吗?"), - 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·信号判断", + "检1 · 信号判断", [ - topic("通过:一句话说清唯一核心确认"), - topic("通过:点位/结构本身已够清楚"), - topic("否决:说不清、靠宏观故事自圆"), - topic("否决:「好像有戏」但确认模糊"), - topic("对照主链条:1H→空间→结构→定损盈→工具"), + 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·流程确认", + "检2 · 流程确认", [ - topic("通过:资金与当日额度符合"), - topic("通过:单笔/组合敞口在预算内"), - topic("否决:资金或次数已触限"), - topic("否决:单笔或日最坏超限 → 暂停"), - topic("否决:「先开了再说」跳步"), + ok("资金与当日额度符合"), + ok("单笔/组合敞口在预算内"), + no("资金或次数已触限"), + no("单笔或日最坏超限 → 暂停"), + no("「先开了再说」跳步"), ], + markers=["priority-2", "task-start"], + fill="#1A5276", + color=C_TEXT, + font_size="12pt", + bold=True, + labels=["Process"], ), topic( - "检3·情绪自检", + "检3 · 情绪自检", [ - topic("通过:符合系统 + 账户没问题 → 开"), - topic("通过:可接受空仓,旁观者视角"), - topic("否决:怕踏空"), - topic("否决:上回亏了要回本"), - topic("否决:必须证明我是对的"), - topic("红灯亮了,信号再好看也不开"), + ok("符合系统 + 账户没问题 → 开"), + ok("可接受空仓,旁观者视角"), + no("怕踏空"), + no("上回亏了要回本"), + no("必须证明我是对的"), + warn("红灯亮了,信号再好看也不开"), ], + markers=["priority-3", "smiley-smile"], + fill="#1A5276", + color=C_TEXT, + font_size="12pt", + bold=True, + labels=["Emotion"], ), topic( "复盘只记什么", [ - topic("信号:是否做了?核心写了什么?"), - topic("流程:资金/敞口是否过关?有无跳步?"), - topic("情绪:当时是哪一类心态?"), - 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"], ), - topic( + t2( "开仓逻辑", [ topic( "主链条(强制)", [ - topic("1H 方向:明显 N 字;跟 1H 波段"), - topic("空间:空看支撑、多看阻力;至少约 ≥2%"), - topic("结构:15m/5m;量级约 8h+(约 48×15m)"), - topic("定损盈:外沿/针尖;RR 须接受"), - topic("选工具:期权 或 合约(不对冲)"), - 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( "结构形态参考", [ - topic("收敛"), - topic("两段式回调"), - topic("箱体"), - 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( "期权入场", [ - topic("主链条全过;结构突破/假突破成立"), - topic("一天期方向单;空间够优先虚值"), - topic("默认先只开期权,不上合约"), - topic("尽量下午 4 点后开次日到期(完整会话)"), - 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)", [ - topic("主链条过关;位置极明确"), - topic("想清进场:假突破 / 结构突破"), - topic("止损挂模型位(外沿/针尖)"), - topic("独立假突破:只做合约或空仓"), - topic("勿与「突破期权后再加仓」混仓"), + 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"], ), - topic( + t2( "平仓逻辑", [ topic( "期权离场", [ - topic("只认:系统/规则止盈"), - topic("只认:到期"), - topic("开仓后中间不手动平仓"), - topic("紧急手平 → 标记非策略样本"), + ok("只认:系统/规则止盈"), + ok("只认:到期"), + no("开仓后中间不手动平仓"), + warn("紧急手平 → 标记非策略样本"), ], + markers=["flag-green", "symbol-minus"], + fill="#145A32", + color=C_TEXT, + font_size="12pt", + bold=True, + labels=["期权"], ), topic( "合约离场", [ - topic("结构止盈为准"), - topic("结构止损为准(约 5U 量级)"), - 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( - "开仓后盯什么", + "持仓期盯什么", [ - topic("程序与纪律是否正常"), - topic("不是浮盈浮亏数字本身"), - 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="操盘", ), - topic( - "纪律执行", + t1( + "④ 纪律执行", [ - topic( + t2( "Gate 日纪律", [ - topic("只做很明确的位置"), - topic("同一位置最多两次机会(突破/假突破)"), - topic("两次都错 → 当日不再做单"), - topic("离场以结构止盈/止损为准"), + leaf("只做很明确的位置", markers=["symbol-pin"]), + leaf("同一位置最多两次机会(突破/假突破)", markers=["priority-2"]), + no("两次都错 → 当日不再做单"), + ok("离场以结构止盈/止损为准"), ], + markers=["flag-dark-blue", "task-done"], ), - topic( + t2( "期权日纪律", [ - topic("不手平;等规则止盈或到期"), - topic("一次一仓;约 10U 权利金"), - topic("不对冲;不做每天默认开期权"), - topic("损位跟模型:外沿/针尖"), + no("不手平;等规则止盈或到期"), + leaf("一次一仓;约 10U 权利金", markers=["symbol-pin"]), + no("不对冲;不做每天默认开期权"), + leaf("损位跟模型:外沿/针尖", markers=["symbol-attention"]), ], + markers=["flag-blue", "task-done"], ), - topic( + t2( "开仓前自检清单", [ - topic("今日只动期权/合约?未开对冲?"), - topic("1H 方向清楚(含 N 字)?"), - topic("空间足够?"), - topic("结构出现且量级够?"), - topic("止损/止盈与 RR 定好?"), - topic("工具选期权还是合约?理由写清?"), - topic("期权:止盈与接受到期写清?"), - topic("合约:本位置第几次?今日两次用完?"), + 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"], ), - topic( + t2( "一句话版本", [ - topic("1H→空间→结构→定损盈→期权/合约"), - topic("不对冲;期权不手平"), - topic("一位置两次,错完收工"), - topic("珍惜机会,日更不是目标"), + 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=["other-people", "star-dark-blue"], + labels=["商务版"], + fill=C_ROOT, + color=C_TEXT, + font_size="20pt", + bold=True, + line=C_ROOT, + notes="个人交易执行体系 · 向右逻辑图 · 商务标识版\n来源:交易执行手册 v2 + 交易行为准则-开单三检", ) root["structureClass"] = "org.xmind.ui.logic.right" + # XMind Zen 内置主题名;客户端可识别 business sheet = { "id": tid(), "class": "sheet", - "title": "执行手册与行为准则", + "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] @@ -308,7 +650,7 @@ def build_content() -> list: def main() -> None: content = build_content() metadata = { - "creator": {"name": "crypto_monitor", "version": "1.0"}, + "creator": {"name": "crypto_monitor", "version": "1.1"}, "activeSheetId": content[0]["id"], } manifest = {