首选修改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
#------------------------------------------------------------------------------------
def remain_alpha(convert_contract:str) -> str:
"""
返回vt_symbol或者symbol的字母字符串
"""
if "." in convert_contract:
convert_contract = extract_vt_symbol(convert_contract)[0]
symbol_mark = "".join(list(filter(str.isalpha,convert_contract)))
return symbol_mark
#-------------------------------------------------------------------------------------------------
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 = {} #保证金率字典
#读取硬盘存储手续费数据,保证金率数据
self.load_commission()
self.load_margin_ratio()
def onRspQryInstrument(self, data: dict, error: dict, reqid: int, last: bool):
"""合约查询回报"""
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)
symbol = contract.symbol
symbol_alpha = remain_alpha(symbol)
#手续费数据合并到contract
if symbol in list(self.commission_data):
contract.open_commission_ratio=self.commission_data[symbol]["OpenRatioByMoney"] #开仓手续费率
contract.open_commission=self.commission_data[symbol]["OpenRatioByVolume"] #开仓手续费
contract.close_commission_ratio=self.commission_data[symbol]["CloseRatioByMoney"] #平仓手续费率
contract.close_commission=self.commission_data[symbol]["CloseRatioByVolume"] #平仓手续费
contract.close_commission_today_ratio=self.commission_data[symbol]["CloseTodayRatioByMoney"] #平今手续费率
contract.close_commission_today=self.commission_data[symbol]["CloseTodayRatioByVolume"] #平今手续费
elif symbol_alpha in list(self.commission_data):
contract.open_commission_ratio=self.commission_data[symbol_alpha]["OpenRatioByMoney"] #开仓手续费率
contract.open_commission=self.commission_data[symbol_alpha]["OpenRatioByVolume"] #开仓手续费
contract.close_commission_ratio=self.commission_data[symbol_alpha]["CloseRatioByMoney"] #平仓手续费率
contract.close_commission=self.commission_data[symbol_alpha]["CloseRatioByVolume"] #平仓手续费
contract.close_commission_today_ratio=self.commission_data[symbol_alpha]["CloseTodayRatioByMoney"]#平今手续费率
contract.close_commission_today=self.commission_data[symbol_alpha]["CloseTodayRatioByVolume"] #平今手续费
if symbol in list(self.margin_ratio_data):
contract.margin_ratio = self.margin_ratio_data[symbol]["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": "交易接口",
}