463 浏览
0

#代码是读取账户下的所有品种持仓,当其亏损达到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)问题?

harrymissu 已回答的问题 2023年5月22日
0

你这里报错应该是通过了 if pnl < risk_limit: 这个条件,错误是在target_poses没有‘SHFE.hc2310’这个key导致的

harrymissu 已回答的问题 2023年5月22日