问题描述
有个困扰我几周的问题,哪位能解答一下啊
官方例子:
官方例子:
# conding = gbk
def call_back(data):
print(data)
问题:passorder需要ConextInfo,这里怎么拿到C呢?
def init(C):
C.subID = C.subscribe_quote("000001.SZ","1d", callback = call_back)
拿到了 data, 回调函数要下单,password 需要 ContextInfo 变量。是什么机制传进去 call_back 呢?是什么变量名呢?
解决方案
在 QMT (迅投) 平台的 Python API 中,subscribe_quote 的回调函数默认只接收一个参数 data(即行情数据)。由于 passorder 等交易函数必须传入 ContextInfo 对象,要在回调函数中拿到它,通常有两种标准的 Python 编程技巧:全局变量法 和 闭包(嵌套函数)法。\n\n### 方法一:使用全局变量(推荐新手使用)\n\n最简单的方法是在 init 函数中将 ContextInfo 赋值给一个全局变量,然后在回调函数中直接使用该全局变量。\n\npython\n#coding:gbk\n\n# 定义一个全局变量用于存储 ContextInfo\nglobal_context = None\n\ndef call_back(data):\n global global_context\n print(\"收到行情数据:\", data)\n \n # 确保 global_context 已经被初始化\n if global_context is not None:\n # 在这里使用 global_context 进行下单\n # 例如:以最新价买入1手平安银行\n passorder(23, 1101, global_context.accid, '000001.SZ', 5, -1, 100, 'my_strategy', 1, 'order_01', global_context)\n\ndef init(ContextInfo):\n global global_context\n global_context = ContextInfo # 将传入的 ContextInfo 绑定到全局变量\n \n # 设置交易账号(实盘/模拟必须设置)\n ContextInfo.accid = '您的资金账号'\n ContextInfo.set_account(ContextInfo.accid)\n \n # 订阅行情并绑定回调\n ContextInfo.subID = ContextInfo.subscribe_quote(\"000001.SZ\", \"1d\", \"follow\", call_back)\n\ndef handlebar(ContextInfo):\n pass\n\n\n### 方法二:使用闭包(嵌套函数,更符合 Pythonic 风格)\n\n你可以直接在 init 函数内部定义回调函数。由于 Python 的作用域规则(闭包),内部函数可以直接访问外部函数(init)的局部变量 ContextInfo,无需使用 global 关键字。\n\npython\n#coding:gbk\n\ndef init(ContextInfo):\n # 设置交易账号\n ContextInfo.accid = '您的资金账号'\n ContextInfo.set_account(ContextInfo.accid)\n \n # 在 init 内部定义回调函数\n def call_back(data):\n print(\"收到行情数据:\", data)\n # 直接使用外层作用域的 ContextInfo\n passorder(23, 1101, ContextInfo.accid, '000001.SZ', 5, -1, 100, 'my_strategy', 1, 'order_01', ContextInfo)\n\n # 订阅行情并绑定内部的回调函数\n ContextInfo.subID = ContextInfo.subscribe_quote(\"000001.SZ\", \"1d\", \"follow\", call_back)\n\ndef handlebar(ContextInfo):\n pass\n\n\n### 注意事项:\n1. 账号设置:在使用 passorder 之前,请确保在 init 中调用了 ContextInfo.set_account() 绑定了资金账号,否则交易函数可能无法正确路由。\n2. quickTrade 参数:在回调函数中触发下单时,passorder 的 quickTrade 参数建议设置为 1 或 2(如示例中的 1),这样可以确保信号立即触发下单,而不是等待当前 K 线走完。\n3. 并发与频率:subscribe_quote 在 tick 级别更新时频率极高,在回调函数中直接下单务必做好**信号防重(防止重复下单)**的逻辑控制,例如记录已下单的标志位或判断持仓状态。