#代码是读取账户下的所有品种持仓,当其亏损达到1000元时对其自动止损平仓。
# 导入 tqsdk 库
from tqsdk import TqApi, TqAuth, TqAccount, TargetPosTask, TqKq
# 创建 api 实例,连接到交易账户
api = TqApi(TqKq(), web_gui=True, auth=TqAuth())
# 获取所有的持仓合约
positions = api.get_position()
# 创建一个字典,用于存储每个合约的行情数据和调仓工具
quotes = {}
target_poses = {}
# 遍历所有的持仓合约
for symbol in positions.keys():
# 订阅每个合约的行情数据,并存入字典
quotes[symbol] = api.get_quote(symbol)
# 为每个合约创建一个调仓工具,并存入字典
target_poses[symbol] = TargetPosTask(api, symbol)
# 设置风险控制阈值,单位为元
risk_limit = -1000
# 进入循环
while True:
# 等待数据更新
api.wait_update()
# 遍历所有的持仓合约
for symbol in positions.keys():
# 计算每个合约的持仓盈亏,单位为元
pnl = positions[symbol].float_profit
# 判断是否超过风险控制阈值
if pnl < risk_limit:
# 平掉该合约的所有持仓
target_poses[symbol].set_target_volume(0)
# 打印提示信息
print(f”{symbol} 合约的持仓盈亏超过 {risk_limit} 元,已平仓”)
//————-
上面代码运行有时正常,但有时会出现如下错误提示
Traceback (most recent call last)
File “C:\SHTLZC\Python\Python311\programs\123.py”, line 36, in <module>
target_poses[symbol].set_target_volume(0)
KeyError: ‘SHFE.hc2310’
提示的品种账户有其持仓,keytError也提示出了品种代码,但为啥又不能正常平仓呢?是字典键值问题还是set_target+volume(0)问题?
你这里报错应该是通过了 if pnl < risk_limit: 这个条件,错误是在target_poses没有‘SHFE.hc2310’这个key导致的