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

上弦之月 wrote:

首选修改vnpy\trader,object.py里面的ContractData

@dataclass
class ContractData(BaseData):
    """
    Contract data contains basic information about each contract traded.
    """
    price_tick: float = 0                               #最小价格变动

    margin_ratio : float = 0                            #保证金率
    max_order_volume : float = 0                        #限价单最大单次委托量
    open_commission_ratio : float = 0                   #开仓手续费率
    open_commission : float = 0                         #开仓手续费
    close_commission_ratio : float = 0                  #平仓手续费率
    close_commission : float = 0                        #平仓手续费  
    close_commission_today_ratio : float = 0            #平今手续费率
    close_commission_today : float = 0                  #平今手续费

CtpGateway里面加上

import shelve
#-------------------------------------------------------------------------------------------------
class CtpGateway(BaseGateway):
    #-------------------------------------------------------------------------------------------------
    def query_commission(self):
        """查询手续费数据"""
        self.td_api.query_commission()
    #-------------------------------------------------------------------------------------------------
    def save_commission(self):
        """保存手续费数据"""
        self.td_api.save_commission()
    #-------------------------------------------------------------------------------------------------
    def query_margin_ratio(self):
        """查询保证金率数据"""
        self.td_api.query_margin_ratio()
    #-------------------------------------------------------------------------------------------------
    def save_margin_ratio(self):
        """保存保证金率数据"""
        self.td_api.save_margin_ratio()
    #-------------------------------------------------------------------------------------------------
    def close(self):
        """"""
        #关闭ctp api前保存手续费,保证金率数据到硬盘
        self.save_commission()
        self.save_margin_ratio()
        self.td_api.close()
        self.md_api.close()
        self.query_functions = [self.query_account, self.query_position,self.query_commission,self.query_margin_ratio]

tdapi里面加上

class CtpTdApi(TdApi):
    """"""

    def __init__(self, gateway):
        self.commission_file_name = 'commission_data'
        self.commission_file_path = get_folder_path(self.commission_file_name)        
        self.commission_req = {}        #手续费查询字典   
        self.commission_data = {}       #手续费字典
        self.margin_ratio_file_name = 'margin_ratio_data'
        self.margin_ratio_file_path = get_folder_path(self.margin_ratio_file_name)        
        self.margin_ratio_req = {}        #保证金率查询字典   
        self.margin_ratio_data = {}       #保证金率字典 
    def onRspQryInstrument(self, data: dict, error: dict, reqid: int, last: bool): 
        #读取硬盘存储手续费数据,保证金率数据
        self.load_commission() 
        self.load_margin_ratio()
        """合约查询回报"""        
        contract = ContractData(
            symbol=data["InstrumentID"],
            exchange=EXCHANGE_CTP2VT[data["ExchangeID"]],
            name=data["InstrumentName"],
            product=PRODUCT_CTP2VT.get(data["ProductClass"], None),
            size=data["VolumeMultiple"],
            price_tick=data["PriceTick"],                    #合约最小价格变动
            max_order_volume=data["MaxLimitOrderVolume"],  #限价单次最大委托量
            gateway_name=self.gateway_name)
        #手续费数据合并到contract
        for X in self.commission_data.keys():
            if X == contract.symbol:
                contract.open_commission_ratio=self.commission_data[X]['OpenRatioByMoney']                  #开仓手续费率
                contract.open_commission=self.commission_data[X]['OpenRatioByVolume']                       #开仓手续费
                contract.close_commission_ratio=self.commission_data[X]['CloseRatioByMoney']                #平仓手续费率
                contract.close_commission=self.commission_data[X]['CloseRatioByVolume']                     #平仓手续费
                contract.close_commission_today_ratio=self.commission_data[X]['CloseTodayRatioByMoney']     #平今手续费率
                contract.close_commission_today=self.commission_data[X]['CloseTodayRatioByVolume']          #平今手续费
            elif contract.symbol[:2] in X:
                contract.open_commission_ratio=self.commission_data[X]['OpenRatioByMoney']                  #开仓手续费率
                contract.open_commission=self.commission_data[X]['OpenRatioByVolume']                       #开仓手续费
                contract.close_commission_ratio=self.commission_data[X]['CloseRatioByMoney']                #平仓手续费率
                contract.close_commission=self.commission_data[X]['CloseRatioByVolume']                     #平仓手续费
                contract.close_commission_today_ratio=self.commission_data[X]['CloseTodayRatioByMoney']     #平今手续费率
                contract.close_commission_today=self.commission_data[X]['CloseTodayRatioByVolume']          #平今手续费  
            elif contract.symbol[:1] in X:
                contract.open_commission_ratio=self.commission_data[X]['OpenRatioByMoney']                  
                contract.open_commission=self.commission_data[X]['OpenRatioByVolume']                       
                contract.close_commission_ratio=self.commission_data[X]['CloseRatioByMoney']                
                contract.close_commission=self.commission_data[X]['CloseRatioByVolume']                     
                contract.close_commission_today_ratio=self.commission_data[X]['CloseTodayRatioByMoney']     
                contract.close_commission_today=self.commission_data[X]['CloseTodayRatioByVolume']  
        for Y in self.margin_ratio_data.keys():
            if Y == contract.symbol:
                contract.margin_ratio = self.margin_ratio_data[Y]['LongMarginRatioByMoney']                 #合约保证金比率
    #-------------------------------------------------------------------------------------------------
    def onRspQryInstrumentCommissionRate(self, data: dict, error: dict, reqid: int, last: bool):
        """查询合约手续费率"""
        symbol = data.get('InstrumentID',None)
        if symbol:
            self.commission_data[symbol] = data
    #-------------------------------------------------------------------------------------------------
    def onRspQryInstrumentMarginRate(self, data: dict, error: dict, reqid: int, last: bool):
        """查询保证金率"""
        symbol = data.get('InstrumentID',None)
        if symbol:
            self.margin_ratio_data[symbol] = data
    #-------------------------------------------------------------------------------------------------
    def load_commission(self):
        """从硬盘读取手续费数据"""
        f = shelve.open(f"{self.commission_file_path}\\commission_data.vt")
        if 'data' in f:
            d = f['data']
            for key, value in list(d.items()):
                self.commission_data[key] = value
        f.close()
    #-------------------------------------------------------------------------------------------------
    def save_commission(self):
        """保存手续费数据到硬盘"""
        f = shelve.open(f"{self.commission_file_path}\\commission_data.vt")
        f['data'] = self.commission_data
        f.close()         
    #-------------------------------------------------------------------------------------------------
    def load_margin_ratio(self):
        """从硬盘读取保证金率数据"""
        f = shelve.open(f"{self.margin_ratio_file_path}\\margin_ratio_data.vt")
        if 'data' in f:
            d = f['data']
            for key, value in list(d.items()):
                self.margin_ratio_data[key] = value
        f.close()
    #-------------------------------------------------------------------------------------------------
    def save_margin_ratio(self):
        """保存保证金率数据到硬盘"""
        f = shelve.open(f"{self.margin_ratio_file_path}\\margin_ratio_data.vt")
        f['data'] = self.margin_ratio_data
        f.close() 
    #-------------------------------------------------------------------------------------------------
    #commission_vt_symbol,margin_ratio_vt_symbol都是全市场合约列表,需要自己维护
    #我用的合约连接交易所符号是'_',用'.'自己替换
    #-------------------------------------------------------------------------------------------------
    def query_commission(self):
        #查询手续费率
        if len(commission_vt_symbol) > 0:
            symbol = commission_vt_symbol[0].split('_')[0]
            #手续费率查询字典
            self.commission_req['BrokerID'] = self.brokerid
            self.commission_req['InvestorID'] = self.userid
            self.commission_req['InstrumentID'] = symbol
            self.reqid += 1 
            #请求查询手续费率
            self.reqQryInstrumentCommissionRate(self.commission_req,self.reqid)  
            commission_vt_symbol.pop(0)
    def query_margin_ratio(self):
        if len(margin_ratio_vt_symbol) > 0:
            symbol = margin_ratio_vt_symbol[0].split('_')[0]
            #保证金率查询字典
            self.margin_ratio_req['BrokerID'] = self.brokerid
            self.margin_ratio_req['InvestorID'] = self.userid
            self.margin_ratio_req['InstrumentID'] = symbol
            self.margin_ratio_req['HedgeFlag'] = THOST_FTDC_HF_Speculation
            self.reqid += 1 
            #请求查询保证金率
            self.reqQryInstrumentMarginRate(self.margin_ratio_req,self.reqid)  
            margin_ratio_vt_symbol.pop(0)

trader\ui,widget.py里面修改

class ContractManager(QtWidgets.QWidget):
    """
    Query contract data available to trade in system.
    """

    headers = {
        "vt_symbol": "本地代码",
        "symbol": "代码",
        "exchange": "交易所",
        "name": "名称",
        "product": "合约分类",
        "size": "合约乘数",
        "price_tick": "价格跳动",
        "min_volume": "最小委托量",
        "margin_ratio": "保证金率",
        "open_commission_ratio": "开仓手续费率",
        "open_commission": "开仓手续费",
        "close_commission_ratio": "平仓手续费率",
        "close_commission": "平仓手续费",
        "close_commission_today_ratio": "平今手续费率",
        "close_commission_today": "平今手续费",
        "gateway_name": "交易接口",
    }

大神,请教下,这个窗口的数据怎么保存到csv呢,好像没有右键保存到 CSV 功能

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

沪公网安备 31011502017034号

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