import os
import pandas
from vnpy.trader.tqz_extern.tqz_constant import TQZMainContractsColumnType, TQZMainContractsSheetType
from vnpy.app.tqz_main_contracts_app.main_contracts_data_file_path import TQZMainContractsChangeFilePath
from vnpy.trader.tqz_server_data import TQZServerData
class TQZUpdateMainContractsExcel:
"""
Load main contracts of current futures market
"""
@classmethod
def tqz_update_main_contracts_excel(cls):
"""
Load main contracts from TqSdk
"""
main_contracts = TQZServerData().tqz_load_main_contracts()
cls.__create_main_contracts_excel(
current_main_vt_symbols=main_contracts
)
# --- private part ---
@classmethod
def __update_today_main_contracts(cls, market_main_vt_symbols):
"""
Update main contracts of current day to excel
"""
TQZMainContractsChangeFilePath.ensure_mainContractsFold_is_exist()
market_main_vt_symbols = sorted(market_main_vt_symbols)
if os.path.exists(path=TQZMainContractsChangeFilePath.main_contracts_excel()) is False:
cls.__create_main_contracts_excel(
current_main_vt_symbols=market_main_vt_symbols
)
else:
pre_main_contracts_dataframe = cls.__init_pre_main_contracts_dataframe(market_main_vt_symbols=market_main_vt_symbols)
today_main_contracts_dataframe = cls.__init_today_main_contracts_dataframe(
market_main_vt_symbols=market_main_vt_symbols,
pre_main_contracts_dataframe=pre_main_contracts_dataframe
)
cls.__to_excel(
content_dataframe=today_main_contracts_dataframe,
path=TQZMainContractsChangeFilePath.main_contracts_excel(),
sheet_name=TQZMainContractsSheetType.CURRENT_FUTURE_MAIN_CONTRACT.value
)
@staticmethod
def __init_today_main_contracts_dataframe(market_main_vt_symbols, pre_main_contracts_dataframe):
today_main_contracts_dataframe = pandas.DataFrame(
columns=[
TQZMainContractsColumnType.MAIN_CONTRACT.value,
TQZMainContractsColumnType.ENTRY_PRICE.value
]
)
today_main_contracts_dataframe[TQZMainContractsColumnType.MAIN_CONTRACT.value] = market_main_vt_symbols
today_main_contracts_dataframe.set_index(TQZMainContractsColumnType.MAIN_CONTRACT.value, inplace=True)
today_main_contracts_dataframe[TQZMainContractsColumnType.ENTRY_PRICE.value] = pre_main_contracts_dataframe[
TQZMainContractsColumnType.ENTRY_PRICE.value]
today_main_contracts_dataframe.reset_index(inplace=True)
return today_main_contracts_dataframe
@staticmethod
def __init_pre_main_contracts_dataframe(market_main_vt_symbols):
pre_main_contracts_dataframe = pandas.read_excel(
io=TQZMainContractsChangeFilePath.main_contracts_excel(),
sheet_name=TQZMainContractsSheetType.CURRENT_FUTURE_MAIN_CONTRACT.value
)
not_main_contracts = []
current_main_contracts = pre_main_contracts_dataframe[
TQZMainContractsColumnType.MAIN_CONTRACT.value].values.tolist()
for current_main_contract in current_main_contracts:
if current_main_contract not in market_main_vt_symbols:
not_main_contracts.append(current_main_contract)
pre_main_contracts_dataframe.set_index(TQZMainContractsColumnType.MAIN_CONTRACT.value, inplace=True)
pre_main_contracts_dataframe.drop(not_main_contracts, inplace=True) # drop all non_main_contracts
return pre_main_contracts_dataframe
@classmethod
def __create_main_contracts_excel(cls, current_main_vt_symbols):
"""
Create main-contracts-excel when excel is not exist.
"""
main_contracts_dataframe = pandas.DataFrame(
columns=[
TQZMainContractsColumnType.MAIN_CONTRACT.value,
TQZMainContractsColumnType.ENTRY_PRICE.value
]
)
main_contracts_dataframe[TQZMainContractsColumnType.MAIN_CONTRACT.value] = sorted(current_main_vt_symbols)
cls.__to_excel(
content_dataframe=main_contracts_dataframe,
path=TQZMainContractsChangeFilePath.main_contracts_excel(),
sheet_name=TQZMainContractsSheetType.CURRENT_FUTURE_MAIN_CONTRACT.value
)
@staticmethod
def __to_excel(content_dataframe, path, sheet_name):
"""
Write content_dataframe to path/excel/sheet_name
"""
excel_writer = pandas.ExcelWriter(path=path)
content_dataframe.to_excel(
excel_writer,
sheet_name=sheet_name,
index=False,
freeze_panes=(1, 0)
)
excel_writer.save()
if __name__ == '__main__':
TQZUpdateMainContractsExcel.tqz_update_main_contracts_excel()
量化交易之vnpy篇 - 重构主力合约换月模块 - 更新主力合约数据源部分
最新推荐文章于 2024-08-05 23:18:47 发布