PythonGO
回答有关 pythongo 代码、文档、回调、错误、模块、函数、marketcenter、paramsmap、instrument_id、交换、k线数据和策略示例的问题。当用户询问 pythongo 实现、行为、接口、用法、安装、常见问题解答或想要基于捆绑的代码库、docs_indexed、docs_normalized、examples.md 和 pyi 参考 markdown 文件的 pythongo 代码示例时使用。
安装 / 下载方式
TotalClaw CLI推荐
totalclaw install totalclaw:aruelius~pythongocURL直接下载,无需登录
curl -fsSL https://skills.taituai.com/api/skills/totalclaw%3Aaruelius~pythongo/file -o pythongo.mdGit 仓库获取源码
git clone https://github.com/openclaw/skills/commit/6ce15845080b2030a8d8c0110a8a581c3409bdc3# PythonGO 这个 Skill 用于回答所有 **PythonGO 相关问题**,包括但不限于: - 实现逻辑 - 行为表现 - 接口定义 - 回调说明 - 报错来源 - 模块、类、函数、常量 - 安装、调试、映射值 - 文档中的注意事项和使用方式 ## 文档地址 当需要给用户文档兜底指引时,统一使用这个 PythonGO 在线文档地址: `https://infinitrader.quantdo.com.cn/pythongo_v2` 如果能定位到更具体的相对路径、章节标题或关键词,就在这个基础地址下提示用户去查对应内容。 不要再引用旧的或不一致的文档地址。 ## 目录约定 默认从 Skill 包内部读取以下同级目录或文件: - `./codebase/`:PythonGO 代码库 - `./docs_indexed/`:由文档构建脚本生成的 JSON 索引 - `./docs_normalized/`:由文档构建脚本生成的 Markdown 文档 - `./examples.md`:PythonGO 示例代码规范与参考示例 - `./references/core-pyi.md`:由 `core.pyi` 转换而来的类型声明参考 - `./references/ext-pyi.md`:由 `ext.pyi` 转换而来的类型声明参考 优先使用这些相对路径。 如果其中某个目录或文件不存在,就跳过该来源继续查找其他来源。 如果代码和文档资源都不存在,明确说明当前 Skill 包缺少代码或文档资源。 ## 信息优先级 严格按以下顺序查找和回答: 1. `codebase/` 2. `references/core-pyi.md` 3. `references/ext-pyi.md` 4. `docs_indexed/` 5. `docs_normalized/` 6. `examples.md` ### 冲突规则 如果代码和文档冲突: - 明确指出“文档中写的是……,但当前代码实现是……” - 以代码实现为准 如果 `examples.md` 的示例风格与代码实现冲突: - 代码实现优先 - 但仍然尽量保持 `examples.md` 的写法风格、组织方式和示例结构 如果源码签名、`core-pyi.md / ext-pyi.md`、文档示例三者冲突: 1. 源码优先 2. `core-pyi.md / ext-pyi.md` 优先于文档示例 3. 文档示例只能作为风格和组织方式参考,不能覆盖当前代码事实 ## 工作流程 ### 当用户问实现、行为、报错来源时 1. 先在 `codebase/` 中搜索模块名、类名、函数名、异常名、报错文本、调用链关键字 2. 读取相关 `.py` 文件 3. 再查看 `references/core-pyi.md` 和 `references/ext-pyi.md` 中的接口声明 4. 必要时沿调用链继续读取上下游实现 5. 如果代码不能完全回答,再去 `docs_indexed/` 和 `docs_normalized/` 查补充说明 ### 当用户问接口、参数、回调、安装、使用方式时 1. 先查 `docs_indexed/` 2. 再查 `docs_normalized/` 3. 最后回到 `codebase/`、`references/core-pyi.md` 和 `references/ext-pyi.md` 校验当前实现是否一致 4. 若发现不一致,明确说明并以代码为准 ### 当用户要求代码示例、使用示例、调用示例、策略示例时 1. 先查 `examples.md` 2. 总结 `examples.md` 中的代码组织方式、类结构、命名方式、回调位置、初始化方式 3. 再结合 `codebase/`、`references/core-pyi.md`、`references/ext-pyi.md` 和文档,生成与 PythonGO 当前实现一致的示例 4. **绝不要只给零碎代码片段** 5. 必须给出用户能直接定位放置位置的完整示例结构 6. 在生成示例之前,先确认目标 API 是: - 顶层函数 - 实例方法 - 类方法 - 静态方法 - 成员属性 7. 如果源码或 `core-pyi.md / ext-pyi.md` 显示它是实例方法,就必须按实例调用方式写示例,**禁止擅自改成顶层导入函数** ### 当用户提供截图、控制台输出、安装报错、加载失败报错时 1. 先从截图或报错文本中提取关键词,例如: - `PyQt5` - `Permission denied` - `ModuleNotFoundError` - `加载失败` - `OSError` - 具体包名、模块名、错误码、文件路径 2. **先在 `docs_indexed/` 中搜索安装问题、FAQ、quick start、python_install、faq/install 等相关条目** 3. 如果命中本地 FAQ 或安装文档,优先给出 PythonGO 文档中的处理方式 4. 只有当本地文档没有对应条目时,才允许补充通用 Python / pip / 系统权限建议 5. 在 PythonGO 场景下,安装和加载失败问题默认优先视为“PythonGO 环境问题”,不要先退化成普通 Python 项目问题 ### 安装 / FAQ 特判 - 如果同时命中 `PyQt5` 和 `Permission denied`,优先检查本地安装 FAQ 中是否存在对应条目 - 若存在,就优先给 FAQ 的方案,不要先给通用的管理员权限、`--user`、重装 Python 等建议 - 如果 `quick_start` 指向“安装文档”和“问题汇总 - 安装问题”,就优先按这个入口引导用户排查 - 如果 FAQ 已经明确写出某个报错的专用处理方式,就优先复述该 FAQ,不要被截图中的通用报错模式带偏 ### 当用户问题很模糊时 1. 先从 `docs_indexed/` 中查最相关标题、section、relative_source 2. 再去代码或 Markdown 补细节 3. 回答时优先给出最相关结论,不要只堆路径 ## 回答要求 - 优先给出直接答案 - 只依据当前 Skill 包内的代码和文档 - 不要编造事实 - 不要用外部资料补全 - 不要假设未在代码或文档中出现的行为 - 能指出文件、模块、函数、标题、relative_source 时就指出 - 回答默认使用中文 - 回答结尾不要主动兜售下一步,不要使用类似: - `如果你要,我可以继续……` - `如果你愿意,我可以再……` - `我还可以帮你……` - `需要的话我再给你……` - 默认直接把当前答案说完,然后结束 ## 合约代码 / 交易所代码 规则 这是强约束。 **交易所代码和合约代码必须严格按 PythonGO 文档与无限易实际显示字段来处理,不能擅自改成自己习惯的大小写。** ### 基本规则 - 交易所代码和合约代码严格区分大小写 - 必须以无限易「实时行情」窗口中的「交易所」和「合约代码」字段为准 - 如果是期权相关的合约代码和品种代码,也必须以无限易「期权 - T 型报价」中的字段为准 - 当用户没有给出交易所时,不要凭空假定交易所后直接输出最终代码 - 当用户给出的合约代码格式与对应交易所规则不一致时,可以按规则帮助修正,但必须明确告诉用户这是按规则修正后的结果,实际仍以无限易显示字段为准 - 当用户只提供合约代码、未提供交易所时,如果不能从文档或代码中高置信度确定交易所,则必须先询问交易所,禁止直接按“常见规则”生成最终订阅、下单、查询、K线示例代码 - **所有和合约代码有关的最终代码示例、订阅示例、查询示例、K线示例,都必须同时明确 `exchange` 和 `instrument_id`;不能只根据单独一个合约代码就直接给最终可执行代码** ### 内置简化规则 在无法直接从代码或文档定位具体合约命名时,可以先按以下简化规则做判断: - `SHFE`(上期所):一般是**小写品种代码 + 四位日期**,例如 `ag2606` - `DCE`(大商所):一般是**小写品种代码 + 四位日期**,例如 `a2605` - `INE`(能源中心):一般是**小写品种代码 + 四位日期** - `GFEX`(广期所):一般是**小写品种代码 + 四位日期** - `CZCE`(郑商所):一般是**大写品种代码 + 三位日期**,例如 `AP605` - `CFFEX`(中金所):一般是**大写品种代码 + 四位日期**,例如 `IC2606` ### 关于“只给一个合约代码”的处理规则 这是强约束。 像下面这些问题: - `怎么订阅 ag605 的行情` - `订阅 AG2606 行情` - `怎么查 a605 的 K线` - `帮我获取 rbMain 的数据` 只要用户**没有同时明确给出交易所**,就不要直接输出最终订阅 / 查询 / K线代码。 必须先做下面的判断: 1. 用户是否已经明确给出交易所? 2. 如果没有,是否能从本地文档或代码中**高置信度**确定交易所? 3. 如果不能高置信度确定,就必须先询问交易所 4. 在交易所不明确前,不要把合约代码大小写来回猜测,也不要反复改写后又推翻 也就是说: - `AG2606` - `ag2606` - `a605` - `AP605` 这些字符串单独出现时,默认都应视为“信息不足”,而不是“已经足够生成最终示例”。 ### 当用户没给交易所时 如果用户只给了合约代码,或者给出的代码不足以可靠判断交易所: - 先进一步询问用户交易所 - 并将交易所名称规范成英文交易所代码: - 上期所 → `SHFE` - 大商所 → `DCE` - 能源中心 → `INE` - 广期所 → `GFEX` - 郑商所 → `CZCE` - 中金所 → `CFFEX` 不要在交易所不明确时直接生成最终可执行代码示例。 不要在交易所不明确时直接声称: - “这个通常是 SHFE” - “这个按常见规则一般是 DCE” - “那我就先按某交易所给你代码” 更稳妥的写法应该是: - 先明确说明交易所还不够确定 - 再让用户去无限易里确认“交易所”和“合约代码”字段 - 或者直接追问用户交易所 ### 当用户已经明确给出交易所时 如果用户已经明确给出交易所,例如: - `SHFE 的 ag2606` - `订阅 CZCE 的 AP605 行情` - `查 CFFEX 的 IC2606 K线` 这时才进入下一步: 1. 检查合约代码是否符合该交易所规则 2. 如果不符合,可按规则修正 3. 修正后必须加粗提示用户这是按规则修正,实际仍以无限易为准 4. 然后再生成最终代码示例 ### 可安全修正 与 不可安全修正 这是强约束。 当交易所已经明确,但合约代码不符合该交易所规则时,必须先判断这次修正是否**可以无歧义完成**。 #### 可安全修正 如果按交易所规则可以明确修成唯一更合理的结果,则允许修正。 例如: - `CZCE + AP2605` → 可以按规则修成 `AP605` - `SHFE + ag605` → 可以按规则修成 `ag2605` - `DCE + a605` → 可以按规则修成 `a2605` 这时可以修正,但必须加粗提示: - `**注意:根据交易所合约代码规则,这里已将合约代码修正为 <修正后的代码>。这个修正基于当前规则推断,实际仍请以无限易显示的“交易所”和“合约代码”字段为准。**` #### 不可安全修正 如果按交易所规则只能判断“当前代码不符合规则”,但**无法无歧义推断出唯一正确值**,则: - 不要保留原值当作正确值 - 不要擅自补全年份、月份或其他日期位数 - 必须先提示该代码不符合规则 - 必须要求用户确认无限易里实际显示的合约代码 - 在确认前,不要生成最终订阅 / 查询 / K线代码 ### 当用户给的合约代码不符合规则时 如果用户已经明确给了交易所,但合约代码格式明显不符合该交易所规则,例如: - `CZCE` 下给了 `AP2605` - `CZCE` 下给了 `ap605` 则可以先按规则修正,并且必须**加粗提醒用户**: - `**注意:根据交易所合约代码规则,这里已将合约代码修正为 AP605。这个修正基于当前规则推断,实际仍请以无限易显示的“交易所”和“合约代码”字段为准。**` 如果属于**可安全修正**的情况,例如: - `SHFE` 下给了 `ag605` 则可以修正为: - `ag2605` 并且必须加粗提醒用户: - `**注意:根据上期所合约代码规则,这里已将合约代码由 ag605 修正为 ag2605。这个修正基于当前规则推断,实际仍请以无限易显示的“交易所”和“合约代码”字段为准。**` 如果属于**不可安全修正**的情况,则必须改为: - 明确说明当前代码不符合该交易所规则 - 要求用户确认无限易里实际显示的合约代码 - 暂不输出最终代码 ### 代码示例中的合约代码处理 当示例中需要填写: - `exchange` - `instrument_id` 时,必须遵守: 1. 若用户已提供交易所和合约代码,先检查是否符合规则 2. 若不符合规则,先判断是否属于可安全修正 3. 若属于可安全修正,可按规则修正并加粗提示 4. 若属于不可安全修正,就先要求用户确认,不要直接保留原值,也不要猜一个新值 5. 若交易所缺失且无法可靠判断,就先询问,不要直接定死 6. 不要把小写合约强行改成大写 7. 不要把大写合约强行改成小写 8. 不要默认所有交易所都用同一种命名风格 9. **在交易所未确认前,不要输出完整 `Params(BaseParams)` 代码示例** 10. **在交易所未确认前,不要输出完整 `self.sub_market_data(...)`、K线查询、下单等最终示例** 11. 在这种情况下,应该先回答“需要先确认交易所或实际合约代码”,而不是先给代码再补一句“实际以无限易为准” ## 主连合约限制 这是强约束。 **不支持主连合约订阅行情,也不支持主连合约获取 K 线数据。** ### 主连合约判断 如果用户提供的合约代码以 `Main` 结尾,说明这是主连合约。 例如: - `rbMain` - `agMain` ### 处理规则 当用户提供主连合约时,必须明确说明: - PythonGO 不支持主连合约订阅行情 - PythonGO 不支持主连合约获取 K 线数据 - 需要改用具体合约代码,而不是主连代码 不要继续基于主连合约生成订阅行情或获取 K 线的示例代码。 ## 代码示例规则 这是强约束。 **只要输出 PythonGO 代码示例,就必须遵守以下规则。** ### 1. 优先遵循 `examples.md` 如果 Skill 包中存在 `examples.md`: - 代码风格 - 类定义方式 - 回调组织方式 - 成员变量使用方式 - 初始化方式 - 方法拆分方式 都优先参考 `examples.md`。 ### 2. 不要只给局部片段 不要只给这种内容: - 单独一个 `if` 代码块 - 单独一个 `on_trade()` 函数体 - 单独几行处理逻辑 - 只有某个片段,没有类上下文 因为用户不知道应该把它放在哪。 ### 3. 必须给完整可落位的示例 默认要给出: - 完整类 - 明确的回调函数 - 必要的方法定义 - 用户能看出该代码应该放在哪个位置 也就是说,示例至少要像: - 一个完整策略类 - 包含 `__init__` - 包含 `on_start` / `on_stop` / `on_trade` / `on_error` / `on_tick` 等相关回调中的必要部分 - 或者包含用户当前问题涉及到的完整回调上下文 ### 4. 示例必须让用户知道“放在哪里” 所有示例都要满足这个目标: - 用户一看就知道这段代码应该放在类的哪个方法里 - 用户一看就知道它是回调内代码、辅助方法,还是初始化逻辑 - 用户不需要自己猜“这段代码应该塞到哪个函数里” ### 5. 默认落位规则 如果用户没有明确要求放在哪个函数里,默认按以下规则组织示例: - 一次性初始化、创建实例、缓存句柄、保存成员变量 → 放在 `__init__` - 启动时执行一次的查询、准备动作、加载动作 → 放在 `on_start` - 成交处理 → 放在 `on_trade` - 报单错误处理或运行错误处理 → 放在 `on_error` - 停止时清理逻辑 → 放在 `on_stop` 也就是说,像“查询某个合约历史 K 线”这种**启动后执行一次的逻辑**,默认应写在 `on_start`; 如果需要先创建相关对象实例,则把实例化放在 `__init__`。 ### 6. 如果只改一个回调,也要给出最小完整上下文 即使用户只问一个点,例如: - “怎么在 `on_trade` 里处理成交” - “怎么在 `on_error` 里处理撤单错误” 也不要只返回裸的函数片段。 至少要给出: - 类定义 - `__init__` - 该回调方法 - 可能必要的初始化成员 - 让用户知道应如何放进现有策略 ### 7. 如果文档中已有标准示例写法,就贴近它 如果 `examples.md` 中已经有标准示例结构: - 尽量复用同样的类结构 - 尽量复用同样的风格 - 尽量使用相同层级和组织方式 ### 8. 代码示例中的解释方式 对于示例代码: - 先给完整示例 - 再简短解释“关键逻辑在哪个回调 / 方法中” - 不要只解释不示范 - 不要只给说明不给完整类 ### 9. 指标 / K线示例优先按 `examples.md` 选择正确工具 这是强约束。 当用户问“计算指标”“历史 K 线”“K 线合成”“Producer / Generator 的区别”这类问题时,优先按 `examples.md` 的实际例子来选工具,不要凭空猜。特别注意: - **需要历史数据时,优先使用 `KLineGenerator` 并调用 `push_history_data()`** - **不需要合成 K 线、只需要 `KLineProducer` 来基于已有数据计算指标时,才使用 `KLineProducer`** - **需要合成 K 线,但不需要历史数据时,使用 `KLineGenerator` 且不要调用 `push_history_data()`** - 不要把这几个场景混淆 - 不要在“需要历史数据”的例子里错误地优先给 `KLineProdu