持有隔夜仓,Vntrader加载后显示的开仓成本和期货公司终端显示的开仓成本不一致,Vntrader显示的开仓成本发生了变化。请问什么情况会出现这个问题,第一次碰到该现象?谢谢!
持有隔夜仓,Vntrader加载后显示的开仓成本和期货公司终端显示的开仓成本不一致,Vntrader显示的开仓成本发生了变化。请问什么情况会出现这个问题,第一次碰到该现象?谢谢!
麻烦提供下数据截图?
vn.py中取的是你的持仓成本,也就是逐日盯市,收盘清算后的结果(前一日的结算价)
用Python的交易员 wrote:
vn.py中取的是你的持仓成本,也就是逐日盯市,收盘清算后的结果(前一日的结算价)
VNPY 取开仓成本是不是会更合理一些 ; 或者自己可以修改这个字段取开仓成本吗,怎么修改 ?谢谢~
在ctp_gateway.py的持仓查询回报函数可以修改插入字段和逻辑,下面是该函数
def onRspQryInvestorPosition(self, data: dict, error: dict, reqid: int, last: bool):
""""""
if not data:
return
# Get buffered position object
key = f"{data['InstrumentID'], data['PosiDirection']}"
position = self.positions.get(key, None)
if not position:
position = PositionData(
symbol=data["InstrumentID"],
exchange=symbol_exchange_map[data["InstrumentID"]],
direction=DIRECTION_CTP2VT[data["PosiDirection"]],
gateway_name=self.gateway_name
)
self.positions[key] = position
# Get contract size, return if size value not collected
size = symbol_size_map.get(position.symbol, None)
if not size:
return
# For SHFE position data update
if position.exchange == Exchange.SHFE:
if data["YdPosition"] and not data["TodayPosition"]:
position.yd_volume = data["Position"]
# For other exchange position data update
else:
position.yd_volume = data["Position"] - data["TodayPosition"]
# Calculate previous position cost
cost = position.price * position.volume * size
# Update new position volume
position.volume += data["Position"]
position.pnl += data["PositionProfit"]
# Calculate average position price
if position.volume:
cost += data["PositionCost"]
position.price = cost / (position.volume * size)
# Get frozen volume
if position.direction == Direction.LONG:
position.frozen += data["ShortFrozen"]
else:
position.frozen += data["LongFrozen"]
if last:
for position in self.positions.values():
self.gateway.on_position(position)
self.positions.clear()
KeKe wrote:
在ctp_gateway.py的持仓查询回报函数可以修改插入字段和逻辑,下面是该函数
def onRspQryInvestorPosition(self, data: dict, error: dict, reqid: int, last: bool): """""" if not data: return # Get buffered position object key = f"{data['InstrumentID'], data['PosiDirection']}" position = self.positions.get(key, None) if not position: position = PositionData( symbol=data["InstrumentID"], exchange=symbol_exchange_map[data["InstrumentID"]], direction=DIRECTION_CTP2VT[data["PosiDirection"]], gateway_name=self.gateway_name ) self.positions[key] = position # Get contract size, return if size value not collected size = symbol_size_map.get(position.symbol, None) if not size: return # For SHFE position data update if position.exchange == Exchange.SHFE: if data["YdPosition"] and not data["TodayPosition"]: position.yd_volume = data["Position"] # For other exchange position data update else: position.yd_volume = data["Position"] - data["TodayPosition"] # Calculate previous position cost cost = position.price * position.volume * size # Update new position volume position.volume += data["Position"] position.pnl += data["PositionProfit"] # Calculate average position price if position.volume: cost += data["PositionCost"] position.price = cost / (position.volume * size) # Get frozen volume if position.direction == Direction.LONG: position.frozen += data["ShortFrozen"] else: position.frozen += data["LongFrozen"] if last: for position in self.positions.values(): self.gateway.on_position(position) self.positions.clear()
谢谢~~
邹wh wrote:
KeKe wrote:
在ctp_gateway.py的持仓查询回报函数可以修改插入字段和逻辑,下面是该函数
def onRspQryInvestorPosition(self, data: dict, error: dict, reqid: int, last: bool): """""" if not data: return # Get buffered position object key = f"{data['InstrumentID'], data['PosiDirection']}" position = self.positions.get(key, None) if not position: position = PositionData( symbol=data["InstrumentID"], exchange=symbol_exchange_map[data["InstrumentID"]], direction=DIRECTION_CTP2VT[data["PosiDirection"]], gateway_name=self.gateway_name ) self.positions[key] = position # Get contract size, return if size value not collected size = symbol_size_map.get(position.symbol, None) if not size: return # For SHFE position data update if position.exchange == Exchange.SHFE: if data["YdPosition"] and not data["TodayPosition"]: position.yd_volume = data["Position"] # For other exchange position data update else: position.yd_volume = data["Position"] - data["TodayPosition"] # Calculate previous position cost cost = position.price * position.volume * size # Update new position volume position.volume += data["Position"] position.pnl += data["PositionProfit"] # Calculate average position price if position.volume: cost += data["PositionCost"] position.price = cost / (position.volume * size) # Get frozen volume if position.direction == Direction.LONG: position.frozen += data["ShortFrozen"] else: position.frozen += data["LongFrozen"] if last: for position in self.positions.values(): self.gateway.on_position(position) self.positions.clear()
谢谢~~
For SHFE and INE position data update
if position.exchange in [Exchange.SHFE, Exchange.INE]: if data["YdPosition"] and not data["TodayPosition"]: position.yd_volume = data["Position"] # For other exchange position data update else: position.yd_volume = data["Position"] - data["TodayPosition"]
请问这段怎么理解呢?如果data["YdPosition"]和data["TodayPosition"]都存在怎么处理呢?
这是对上期所的特殊处理,因为上期所在平仓的时候需要分别发出平今和平昨指令,而其他交易所平仓指令会自动转换(优先平今)