VeighNa量化社区
你的开源社区量化交易平台
zlengine's Avatar
Member
离线
27 帖子
声望: 1

感谢楼上大佬

我看了看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是怎么命名的,有什么规律么,以方便转为正确格式,有没有人遇到同样的问题。谢谢

郭易燔 wrote:

on开头的时回调函数,是由交易所调用的,不需要主动调用。

这样啊,谢谢大神,能方便再指导一下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()

夏侯铭灈 wrote:

zlengine wrote:

xiaohe wrote:

可以自己去vnpy_ctp.api.vn_ctp下看

2.50版本的vnstudio\Lib\site-packages\vnpy\api\ctp目录下只有一个init.py文件。没有其他文件啊
你要安装vnstudio,然后在E:\vnstudio\Lib\site-packages\vnpy_ctp下

明白了,原来ctp独立出来了。谢谢

xiaohe wrote:

可以自己去vnpy_ctp.api.vn_ctp下看

2.50版本的vnstudio\Lib\site-packages\vnpy\api\ctp目录下只有一个init.py文件。没有其他文件啊

不知道是否封装了全部的函数,在对应CTP的api来调用一些函数时,发现无法调用,比如GetApiVersion()
不知道文档说明,能够知道那些封装了,在vnpy中是可以直接调用的?
谢谢大神

用Python的交易员 wrote:

B可以直接用,有AppID和AuthCode就行

谢谢大佬

比如同一个期货公司,两个账号。
一个账号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导入代码删除掉就好了。
谢谢论坛

© 2015-2022 微信 18391752892
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】