请问在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
获取。通过以上方法,可以根据持仓盈亏动态设置止损,有效控制风险。