请问在CAT策略交易模块,怎样才能获取到持仓的信息,比如成交均价,当前盈亏?
请问在CAT策略交易模块,怎样才能获取到持仓的信息,比如成交均价,当前盈亏?
代码获取。想要根据目前持仓的盈亏,设置止损,有什么方法吗?
使用self.cta_engine.get_position()方法获取PositionData对象,需要传入positionid。positionid的格式为:gateway_name.vt_symbol.Direction.value,其中Direction为多或空。
long_position_id = f"{self.gateway_name}.{self.vt_symbol}.多"
   long_position = self.cta_engine.get_position(long_position_id)
   short_position_id = f"{self.gateway_name}.{self.vt_symbol}.空"
   short_position = self.cta_engine.get_position(short_position_id)
pnl字段PositionData中的pnl字段已经记录了当前持仓的盈亏,直接使用即可。
if long_position:
       print(f"多头持仓均价: {long_position.price}, 数量: {long_position.volume}, 盈亏: {long_position.pnl}")
   if short_position:
       print(f"空头持仓均价: {short_position.price}, 数量: {short_position.volume}, 盈亏: {short_position.pnl}")
self.cta_engine.get_position()方法仅在实盘环境中有效,回测时无法使用。self.gateway_name是交易接口名称(如CTP),self.vt_symbol是合约代码(如rb2210.SHFE)。MainEngine尚未收到持仓数据,需要确保交易接口已正确连接并订阅了持仓信息。通过以上方法,你可以在实盘中直接获取实际持仓信息并使用pnl字段查看当前盈亏。
当持仓亏损达到固定金额时触发止损。
if pnl < -1000:  # 亏损超过1000时止损
       self.sell(latest_price, abs(self.pos), stop=True)  # 本地停止单
当持仓亏损达到一定比例时触发止损。
stop_loss_ratio = 0.02  # 止损比例
   if pnl / position.price / position.volume < -stop_loss_ratio:  # 亏损超过2%时止损
       self.sell(latest_price, abs(self.pos), stop=True)  # 本地停止单
使用ATR(平均真实波动幅度)动态设置止损,适用于波动性较大的市场。
atr_value = self.am.atr(14)  # 计算ATR
   stop_loss_price = latest_price - atr_value * 2  # 多头止损
   self.sell(stop_loss_price, abs(self.pos), stop=True)  # 本地停止单
随着价格变动动态调整止损位置,锁定部分利润。
if self.pos > 0:  # 多头持仓
       self.intra_trade_high = max(self.intra_trade_high, latest_price)
       stop_loss_price = self.intra_trade_high - atr_value * 2
       self.sell(stop_loss_price, abs(self.pos), stop=True)  # 本地停止单
stop=True表示本地停止单,由VeighNa Trader在本地监控价格触发,而非交易所。latest_price为最新价格,可通过on_bar或on_tick获取。通过以上方法,可以根据持仓盈亏动态设置止损,有效控制风险。