为了避免对策略运行的干扰,veighna刻意将策略的逻辑持仓与真实持仓相隔离,cta_template里也没有提供查询真实持仓的方法。而实际上人工干预经常发生,策略运行有必要知道实际持仓,为此提出真实仓位的查询问题。社区里的建议是在cta_template里增加一个get_position的方法,在查询原代码之后,发现主引擎的OMS类就可以完全持仓查询功能。特把代码列出,在策略中增加一个manage_position函数即可达到目的:
def manage_position(self):
self.positions = {"long":0, "short":0 }
om_engine = self.cta_engine.main_engine.get_engine('oms')
if om_engine.get_position(f"CTP.{self.vt_symbol}.多"):
self.positions["long"] = om_engine.get_position(f"CTP.{self.vt_symbol}.多").volume
if om_engine.get_position(f"CTP.{self.vt_symbol}.空"):
self.positions["short"] = om_engine.get_position(f"CTP.{self.vt_symbol}.空").volume
#om_engine.get_all_positions()
#get_all_positions()可以查询所有持仓,二种查询方式俱可,前者返回的是单个PositionData对象,后者返回一个PositionData列表。
0 条评论