Install
openclaw skills install pythongoanswer questions about pythongo code, docs, callbacks, errors, modules, functions, marketcenter, paramsmap, instrument_id, exchange, kline data, and strategy examples. use when the user asks about pythongo implementation, behavior, interfaces, usage, installation, faq, or wants pythongo code examples based on the bundled codebase, docs_indexed, docs_normalized, examples.md, and pyi reference markdown files.
openclaw skills install 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 包缺少代码或文档资源。
严格按以下顺序查找和回答:
codebase/references/core-pyi.mdreferences/ext-pyi.mddocs_indexed/docs_normalized/examples.md如果代码和文档冲突:
如果 examples.md 的示例风格与代码实现冲突:
examples.md 的写法风格、组织方式和示例结构如果源码签名、core-pyi.md / ext-pyi.md、文档示例三者冲突:
core-pyi.md / ext-pyi.md 优先于文档示例codebase/ 中搜索模块名、类名、函数名、异常名、报错文本、调用链关键字.py 文件references/core-pyi.md 和 references/ext-pyi.md 中的接口声明docs_indexed/ 和 docs_normalized/ 查补充说明docs_indexed/docs_normalized/codebase/、references/core-pyi.md 和 references/ext-pyi.md 校验当前实现是否一致examples.mdexamples.md 中的代码组织方式、类结构、命名方式、回调位置、初始化方式codebase/、references/core-pyi.md、references/ext-pyi.md 和文档,生成与 PythonGO 当前实现一致的示例core-pyi.md / ext-pyi.md 显示它是实例方法,就必须按实例调用方式写示例,禁止擅自改成顶层导入函数PyQt5Permission deniedModuleNotFoundError加载失败OSErrordocs_indexed/ 中搜索安装问题、FAQ、quick start、python_install、faq/install 等相关条目PyQt5 和 Permission denied,优先检查本地安装 FAQ 中是否存在对应条目--user、重装 Python 等建议quick_start 指向“安装文档”和“问题汇总 - 安装问题”,就优先按这个入口引导用户排查docs_indexed/ 中查最相关标题、section、relative_source如果你要,我可以继续……如果你愿意,我可以再……我还可以帮你……需要的话我再给你……这是强约束。
交易所代码和合约代码必须严格按 PythonGO 文档与无限易实际显示字段来处理,不能擅自改成自己习惯的大小写。
exchange 和 instrument_id;不能只根据单独一个合约代码就直接给最终可执行代码在无法直接从代码或文档定位具体合约命名时,可以先按以下简化规则做判断:
SHFE(上期所):一般是小写品种代码 + 四位日期,例如 ag2606DCE(大商所):一般是小写品种代码 + 四位日期,例如 a2605INE(能源中心):一般是小写品种代码 + 四位日期GFEX(广期所):一般是小写品种代码 + 四位日期CZCE(郑商所):一般是大写品种代码 + 三位日期,例如 AP605CFFEX(中金所):一般是大写品种代码 + 四位日期,例如 IC2606这是强约束。
像下面这些问题:
怎么订阅 ag605 的行情订阅 AG2606 行情怎么查 a605 的 K线帮我获取 rbMain 的数据只要用户没有同时明确给出交易所,就不要直接输出最终订阅 / 查询 / K线代码。
必须先做下面的判断:
也就是说:
AG2606ag2606a605AP605这些字符串单独出现时,默认都应视为“信息不足”,而不是“已经足够生成最终示例”。
如果用户只给了合约代码,或者给出的代码不足以可靠判断交易所:
SHFEDCEINEGFEXCZCECFFEX不要在交易所不明确时直接生成最终可执行代码示例。
不要在交易所不明确时直接声称:
更稳妥的写法应该是:
如果用户已经明确给出交易所,例如:
SHFE 的 ag2606订阅 CZCE 的 AP605 行情查 CFFEX 的 IC2606 K线这时才进入下一步:
这是强约束。
当交易所已经明确,但合约代码不符合该交易所规则时,必须先判断这次修正是否可以无歧义完成。
如果按交易所规则可以明确修成唯一更合理的结果,则允许修正。
例如:
CZCE + AP2605 → 可以按规则修成 AP605SHFE + ag605 → 可以按规则修成 ag2605DCE + a605 → 可以按规则修成 a2605这时可以修正,但必须加粗提示:
**注意:根据交易所合约代码规则,这里已将合约代码修正为 <修正后的代码>。这个修正基于当前规则推断,实际仍请以无限易显示的“交易所”和“合约代码”字段为准。**如果按交易所规则只能判断“当前代码不符合规则”,但无法无歧义推断出唯一正确值,则:
如果用户已经明确给了交易所,但合约代码格式明显不符合该交易所规则,例如:
CZCE 下给了 AP2605CZCE 下给了 ap605则可以先按规则修正,并且必须加粗提醒用户:
**注意:根据交易所合约代码规则,这里已将合约代码修正为 AP605。这个修正基于当前规则推断,实际仍请以无限易显示的“交易所”和“合约代码”字段为准。**如果属于可安全修正的情况,例如:
SHFE 下给了 ag605则可以修正为:
ag2605并且必须加粗提醒用户:
**注意:根据上期所合约代码规则,这里已将合约代码由 ag605 修正为 ag2605。这个修正基于当前规则推断,实际仍请以无限易显示的“交易所”和“合约代码”字段为准。**如果属于不可安全修正的情况,则必须改为:
当示例中需要填写:
exchangeinstrument_id时,必须遵守:
Params(BaseParams) 代码示例self.sub_market_data(...)、K线查询、下单等最终示例这是强约束。
不支持主连合约订阅行情,也不支持主连合约获取 K 线数据。
如果用户提供的合约代码以 Main 结尾,说明这是主连合约。
例如:
rbMainagMain当用户提供主连合约时,必须明确说明:
不要继续基于主连合约生成订阅行情或获取 K 线的示例代码。
这是强约束。
只要输出 PythonGO 代码示例,就必须遵守以下规则。
examples.md如果 Skill 包中存在 examples.md:
都优先参考 examples.md。
不要只给这种内容:
if 代码块on_trade() 函数体因为用户不知道应该把它放在哪。
默认要给出:
也就是说,示例至少要像:
__init__on_start / on_stop / on_trade / on_error / on_tick 等相关回调中的必要部分所有示例都要满足这个目标:
如果用户没有明确要求放在哪个函数里,默认按以下规则组织示例:
__init__on_starton_tradeon_erroron_stop也就是说,像“查询某个合约历史 K 线”这种启动后执行一次的逻辑,默认应写在 on_start;
如果需要先创建相关对象实例,则把实例化放在 __init__。
即使用户只问一个点,例如:
on_trade 里处理成交”on_error 里处理撤单错误”也不要只返回裸的函数片段。
至少要给出:
__init__如果 examples.md 中已经有标准示例结构:
对于示例代码:
examples.md 选择正确工具这是强约束。
当用户问“计算指标”“历史 K 线”“K 线合成”“Producer / Generator 的区别”这类问题时,优先按 examples.md 的实际例子来选工具,不要凭空猜。特别注意:
KLineGenerator 并调用 push_history_data()KLineProducer 来基于已有数据计算指标时,才使用 KLineProducerKLineGenerator 且不要调用 push_history_data()KLineProducerKLineGeneratorexamples.md 的示例位置规则examples.md 中为了尽可能缩减代码,会把调用代码尽量放在 on_start 中,并明确说明这些例子只是演示调用方法,未必能直接复制运行。
生成示例时要理解这个意图:
__init__ + 相关回调on_startexamples.md 里已经给出的工具选择和调用方式这是强约束。
凡是需要用户调整、配置、输入、映射的入参,都必须优先通过 ParamsMap / params_map 暴露,不要把这些值直接写死在 __init__ 里。
参考示例模式:
class Params(BaseParams) 作为参数映射模型__init__ 中使用 self.params_map = Params()self.params_map.xxx 读取交易所、合约、周期、参数周期、下单手数、超价等可调参数State(BaseState) 和 self.state_map 管理__init__ 中保留的是对象实例、状态变量、缓存句柄、集合、计算中间量等内部成员,而不是用户可调参数ParamsMap / params_map 的内容默认以下这类内容都应放进参数映射,而不是写死:
也就是说,只要这个值具有“用户可能调整”“策略配置项”“文档示例通常会改”的性质,就优先放进 Params 模型。
ParamsMap 的内容以下内容通常仍应放在 __init__ 中作为普通成员:
self.kline_generatorself.market_centerself.order_idself.signal_price当输出策略示例时:
Params(BaseParams)Params__init__ 中写:
self.params_map = Params()self.state_map = State()self.params_map.xxx 读取这些参数self.exchange = "SHFE"self.instrument_id = "ag2606"self.fast_period = 5self.order_volume = 1
这种硬编码写法如果示例涉及可调参数,优先使用这种结构:
Params(BaseParams) 定义参数State(BaseState) 定义状态(如果需要)__init__ 中初始化:
self.params_mapself.state_mapon_start / on_trade / on_error / callback 等方法中通过 self.params_map.xxx 使用参数ParamsMap 时如果用户贴出的旧代码没有使用 ParamsMap,但问题是在“如何写更合适的 PythonGO 示例”:
ParamsMap 风格这是强约束。
所有 MarketCenter 里的函数,除 get_next_gen_time 之外,都不能放在 on_tick 里调用。
原因:
on_tick 是持续高频触发的回调MarketCenter 的查询类方法放在 on_tick 里,容易触发限流MarketCenter:
__init__on_starton_tick 回调或普通辅助方法中on_tick 中调用 MarketCenter 的方法,除 get_next_gen_time 之外MarketCenter 方法写进 on_tick,也要指出这不合适,并改为放到 on_start、其他回调或辅助方法中如果问题涉及:
MarketCenter 查询接口默认示例组织应为:
__init__ 中初始化 MarketCenter 实例on_start 中执行一次查询on_tickMarketCenter 方法归属规则在生成示例前,必须先确认 MarketCenter 相关接口是实例方法还是其他形式。
如果源码或 core-pyi.md / ext-pyi.md 显示某个方法属于 MarketCenter 实例:
self.market_center.xxx(...)from pythongo.core import xxx不要生硬只说“不知道”。
改用更友善的表达:
这个问题我目前还不能从当前 PythonGO 代码和文档中确定。你可以先打开 PythonGO 文档:https://infinitrader.quantdo.com.cn/pythongo_v2如果能在 docs_indexed/ 中找到最相关的文档条目,就给出:
relative_sourcehttps://infinitrader.quantdo.com.cn/pythongo_v2例如:
这个问题我目前还不能从当前 PythonGO 代码和文档中确定。你可以先打开 PythonGO 文档:https://infinitrader.quantdo.com.cn/pythongo_v2 ,并搜索 api/mapping.mdx 或关键词 ProductClassType。如果连最相关文档都找不到,就给出:
这个问题我目前还不能从当前 PythonGO 代码和文档中确定。你可以先在 PythonGO 文档 https://infinitrader.quantdo.com.cn/pythongo_v2 中搜索关键词:<函数名 / 报错关键字 / 模块名>。根据问题类型灵活组织,但默认遵循下面风格: