感谢楼上大佬
我看了看Ctp的官方文档,提供的仓位查询函数的回报字段中实际是包括了开仓均价的。是vnpy在处理汇报数据的时候 没有取这个字段。
只需要在vnpy.gateway.ctp.ctp_gateway.py这个文件中,修改onRspQryInvestorPosition这个持仓查询的回报函数,给加上开仓均价字段即可。这样get_all_position获取到的持仓数据就有了open_price这个开仓均价字段
if position.volume and size:
cost += data["PositionCost"]
position.price = cost / (position.volume * size)
# 增加开仓均价字段
open_cost = data["OpenCost"]
position.open_price = open_cost / (position.volume * size)
目前vnpy返回的持仓数据字段只有一个持仓均价,就是昨日的结算价。
有什么办法获取开仓均价呢?
挨个交易日去查询交易记录不太有效率啊,难道一个仓位如果我已经持仓3个月,要查到3月前的成交记录才能计算获得开仓均价?CTP返回的持仓数据中是否包含这一数据呢?
有没有大神了解的,谢谢
MTF wrote:
VeighNa本身没有设计合约代码调整规则,都是直接用交易柜台传过来的代码,所以这个300 ETF期权在SOPT柜台那边发过来的代码应该就是你这里写的91006**
如果vnpy没有做过调整这个就奇怪了,在其他各大平台上深市300ETF期权的代码都是90001***格式的。而且和sopt的代码没有对应关系。沪市的倒是一样。不知道sopt这个单独的代码调整是什么原因
深市300 etf期权的代码格式为90001*格式,而在sopt端口中,深市300 etf期权合约代码格式却是91006**,vnpy是怎么命名的,有什么规律么,以方便转为正确格式,有没有人遇到同样的问题。谢谢
使用脚本模式,结算信息确认成功后,一直也未输出“合约信息查询成功”,也没有任何提示。发送交易订单也没有任何输出。
偶尔会出现这种情况,我想加一个判断,如果未查询成功就断开重连一次,否则没有任何提示也不知道出问题了。
请问各位大神这个怎么处理呢?
我在CTPgateway中找到了输出合约信息查询成功的onRspQryInstrument()回报函数,但是在vnpy文件夹下没有找到任何这个函数的调用,不知道从何加起,
希望有大神指点一下。
def onRspQryInstrument(self, data: dict, error: dict, reqid: int, last: bool):
"""
Callback of instrument query.
"""
product = PRODUCT_CTP2VT.get(data["ProductClass"], None)
if product:
contract = ContractData(
symbol=data["InstrumentID"],
exchange=EXCHANGE_CTP2VT[data["ExchangeID"]],
name=data["InstrumentName"],
product=product,
size=data["VolumeMultiple"],
pricetick=data["PriceTick"],
gateway_name=self.gateway_name,
long_margin_ratio = data["LongMarginRatio"],
short_margin_ratio = data["ShortMarginRatio"],
)
# For option only
if contract.product == Product.OPTION:
# Remove C/P suffix of CZCE option product name
if contract.exchange == Exchange.CZCE:
contract.option_portfolio = data["ProductID"][:-1]
else:
contract.option_portfolio = data["ProductID"]
contract.option_underlying = data["UnderlyingInstrID"]
contract.option_type = OPTIONTYPE_CTP2VT.get(data["OptionsType"], None)
contract.option_strike = data["StrikePrice"]
contract.option_index = str(data["StrikePrice"])
contract.option_expiry = datetime.strptime(data["ExpireDate"], "%Y%m%d")
self.gateway.on_contract(contract)
symbol_exchange_map[contract.symbol] = contract.exchange
symbol_name_map[contract.symbol] = contract.name
symbol_size_map[contract.symbol] = contract.size
if last:
self.gateway.write_log("合约信息查询成功")
for data in self.order_data:
self.onRtnOrder(data)
self.order_data.clear()
for data in self.trade_data:
self.onRtnTrade(data)
self.trade_data.clear()
xiaohe wrote:
可以自己去vnpy_ctp.api.vn_ctp下看
2.50版本的vnstudio\Lib\site-packages\vnpy\api\ctp目录下只有一个init.py文件。没有其他文件啊
不知道是否封装了全部的函数,在对应CTP的api来调用一些函数时,发现无法调用,比如GetApiVersion()
不知道文档说明,能够知道那些封装了,在vnpy中是可以直接调用的?
谢谢大神
比如同一个期货公司,两个账号。
一个账号A做了穿透式认证,另一个账号B用同样的程序可以直接登录么,
还是说另一个账号B也得做穿透式认证,之前程序的认证和之前的账号A绑定的,只对之前的账号A有效?
在while 循环下可以获取了。可能个别秒没有tick数据
vt_symbol = "rb2009.SHFE"
engine.subscribe(vt_symbol)
contract = engine.get_contract(vt_symbol)
print(contract)
tick = engine.get_tick(vt_symbol=vt_symbol,use_df=True)
print(tick)
如上,登录CTP成功后,获取tick数据,一直都是None。获取不到tick,是不支持么,在文档中的脚本模式下看到可以成功获取,有大神遇到过类似的问题么
用Python的交易员 wrote:
没吧,贴下哪里exit退出进程的代码?<
我用的是2.0.9版本
在vnpy/gateway/ctp/ctp_gateway.py文件中,
class ctpgateway的.close代码是def close(self): """""" self.td_api.close() self.md_api.close()
调用的是td_api和md_api的.close()方法,
而在class CtpMdApi(MdApi)和class CtpTdApi(TdApi)类中.close()方法的代码是def close(self): """""" if self.connect_status: self.exit()
因此在脚本模式里我自己加了个直接用
gateway = get_gateway(gateway_name) if gateway: gateway.close()
获取gateway然后用ctpgateway的.close()方法想要断开ctp接口,直接主程序就会退出。在接口py文件中也没有找到其他关闭或者断开ctp接口的函数
发现ctp_gateway.close()中的代码是直接exit()退出进程。简单粗暴啊,不知道封装的时候有没有disconnect的方法而不用直接exit还能继续执行下面的程序的
如题,我发现engine.close()并不能起到关闭引擎的作用。
而用gateway.close()关闭接口后,整个主进程也会随之关闭。这样每天都要再重新运行一次。
各位大神,
有什么办法可以在收盘后断开ctp,而不关闭主进程,
这样主进程循环到特定时间会重新登录CTP,
省去了每日重新手动再次运行登录CTP的烦恼。
难道只有每次新开一个进程才行么,这样感觉效率较低。
是在脚本模式下,使用engine.cover()函数平仓
持有今仓,没有找到专用的平今仓函数或者参数啊
VNPY2.0.9中信实盘,平燃油合约显示平昨仓位不足。
在论坛里看到类似问题很多,但是还是没有解决方案,大家有人找到解决办法了么,谢谢
问题已经解决,是我把端口号填写错误了。
在测试时又出现了Decrypt handshake data failed错误。发现时同时
from vnpy.gateway.ctp import CtpGateway
from vnpy.gateway.ctptest import CtptestGateway
把CtpGateway导入代码删除掉就好了。
谢谢论坛