先说一下策略的逻辑。
策略的级别是1分钟。我根据主观判断进行手动开仓。
策略会在handle_bar中读取当前的持仓信息,并且遍历所有的持仓合约,判断持仓合约是否满足止损条件。如果满足止损条件,则会自动下单锁仓,让这个合约持仓的多单和空单数量保持一致。
------------------------------------------------------
今天上午一共手动下单4次,明细如下:
09:59:32,IH12,多单开仓,1手,全部成交,订单ID - 1601368311。
下单后,get_portfolio()返回的持仓信息:多单持仓的数量 1,空单持仓数量 0。
10:05:06,IH12,空单开仓,1手,全部成交。订单ID - 1601368310。
下单后,get_portfolio()返回的持仓信息:多单持仓的数量 1,空单持仓数量 1。
10:12:03,IH12,多单平仓,1手,已手动撤单(撤单时间10:12:10)。订单ID - 1601368309。
10:12:14,IH12,多单平仓,1手,全部成交。订单ID - 1601368308。
下单后,get_portfolio()返回的持仓信息:多单持仓的数量 1,空单持仓数量 0。
10:15:58的时候,触发了止损条件。日志截取如下:
2024-10-21 10:15:58 - INFO - >>> handle_bar - 合约ZJIH12的持仓情况:多单持仓的数量 1,空单持仓数量 0
2024-10-21 10:15:58 - INFO - >>> handle_bar - ZJIH12的最新k线的时间:2024-10-21 10:16:00,最新的1分钟收盘价:2690.8、MA120:2699.13、Diff:1.7547;前1分钟最高价:2697.6、最低价2694.6
2024-10-21 10:15:58 - INFO - >>> handle_bar - 当前ZJIH12的持仓为净多仓,其最新1分钟K线的收盘价2690.8<MA120的值2699.13,且最新1分钟K线的收盘价<前1分钟K线的最低价2694.6。满足锁仓要求。
2024-10-21 10:15:58 - INFO - >>> handle_bar - 订单已提交,以市价开仓卖出1手ZJIH12,订单ID:-1601368307
2024-10-21 10:15:58 - INFO - >>> order_status - 订单有新动向 - 无效单,订单ID -1601368307,合约代码 ZJIH12,开平方向 open,订单方向 sell, 订单价格 0.0,订单数量 0,已成交数量 0,未成交数量 0,订单类型 market,成交价格 0.0,本次成交数量 0,订单状态 inactive,订单创建时间 2024-10-21 10:15:58,交易账户 2200****,柜台返回的系统编号
--------------------------------------
我现在想问的是订单ID -1601368307的这个无效单是什么原因引起的。
我个人的猜测是金字塔get_portfolio()返回的持仓信息与真实的持仓信息不一致导致的,是金字塔的BUG。
在10:12:14的订单成交后,我认为正确的持仓信息应该是:多单持仓数量0,空单持仓数量1。而不是get_portfolio()返回的:多单持仓的数量 1,空单持仓数量 0。
我检查了自己的策略代码,是直接通过get_portfolio()获取当时的最新持仓信息的,应该不是我代码层面的错误:[Python] 复制代码 lst_portfolio = get_portfolio_book(type = 2) # 读取默认登录账户的持仓品种
Write.info(context, '>>> handle_bar - 当前持有的合约品种:%s'%(lst_portfolio))
# 遍历有持仓的合约品种
for itr_contract in lst_portfolio:
# 如果当前合约品种不在交易时段则跳过
if not istradertime(itr_contract):
Write.info(context, '>>> handle_bar - 合约%s当前不在交易时段,跳过'%(itr_contract))
continue
obj_position_info = get_portfolio(order_book_id = itr_contract, type = 2) # 单个合约品种的持仓信息
int_long_quantity = obj_position_info.buy_quantity # 多单持仓的数量
int_short_quantity = obj_position_info.sell_quantity # 空单持仓的数量
int_net_quantity = int_long_quantity - int_short_quantity # 净持仓的数量
Write.info(context, '>>> handle_bar - 合约%s的持仓情况:多单持仓的数量 %s,空单持仓数量 %s'%(itr_contract, int_long_quantity, int_short_quantity))
以前模拟账号交易的时候,也偶尔遇到过这种get_portfolio()查询到的持仓信息和实际应该的持仓信息不一致的情况,当时只以为是模拟账号的BUG,就没有再深究。
现在实盘也遇到这种问题,我希望能知道具体的原因,然后好针对的去解决。
|