VeighNa量化社区
你的开源社区量化交易平台 | vn.py | vnpy
Member
avatar
加入于:
帖子: 36
声望: 0
class MyTdApi(TdApi):
    """
    CTP的交易API
    """

    if os.path.exists('D:/global/contract.db'): os.remove('D:/global/contract.db')

    column = "(ExchangeID,InstrumentName,ProductClass,DeliveryYear,DeliveryMonth,MaxMarketOrderVolume,MinMarketOrderVolume,MaxLimitOrderVolume,MinLimitOrderVolume,VolumeMultiple,PriceTick,CreateDate,OpenDate,ExpireDate,StartDelivDate,EndDelivDate,InstLifePhase,IsTrading,PositionType,PositionDateType,LongMarginRatio,ShortMarginRatio,MaxMarginSideAlgorithm,StrikePrice,OptionsType,UnderlyingMultiple,CombinationType,InstrumentID,ExchangeInstID,ProductID,UnderlyingInstrID)"

    values = "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"

    conn = sqlite3.connect('D:/global/contract.db') # 如果没有 contract.db 则创建
    cursor = conn.cursor()

    # 创建表 如果还没有则创建
    for t in ["contract", "CFFEX", "SHFE", "DCE", "CZCE", "INE", "GFEX", "CFFEX_O", "SHFE_O", "DCE_O", "CZCE_O", "INE_O", "GFEX_O"]:

        cursor.execute(f'CREATE TABLE IF NOT EXISTS {t} (ExchangeID text,InstrumentName text,ProductClass text,DeliveryYear integer,DeliveryMonth integer,MaxMarketOrderVolume integer,MinMarketOrderVolume integer,MaxLimitOrderVolume integer,MinLimitOrderVolume integer,VolumeMultiple integer,PriceTick real,CreateDate text,OpenDate text,ExpireDate text,StartDelivDate text,EndDelivDate text,InstLifePhase text,IsTrading integer,PositionType text,PositionDateType text,LongMarginRatio real,ShortMarginRatio real,MaxMarginSideAlgorithm text,StrikePrice real,OptionsType text,UnderlyingMultiple real,CombinationType text,InstrumentID text,ExchangeInstID text,ProductID text,UnderlyingInstrID text)')
        conn.commit()

    cursor.close()
    conn.close()

    def onRspQryInstrument(self, data: dict, error: dict, reqid: int, last: bool) -> None:
        """合约查询回报"""

        conn = sqlite3.connect('D:/global/contract.db')
        cursor = conn.cursor()

        product: Product = PRODUCT_CTP2VT.get(data["ProductClass"], None)
        if product:

            ExchangeID_flag, option_flag = "", ""
            value_data = []

            for k, v in data.items():
                if "reserve" not in k:
                    if k == "ExchangeID": 
                        ExchangeID_flag = v

                    if k == 'OptionsType':
                        if v == "1": 
                            v = 'call'
                            option_flag = 'call'
                        if v == "2": 
                            v = 'put'
                            option_flag = 'put'
                    value_data.append(v)

            value_data = tuple(value_data) # 拟插入的单条数据

            # ["contract", "CFFEX", "SHFE", "DCE", "CZCE", "INE", "GFEX", "CFFEX_O", "SHFE_O", "DCE_O", "CZCE_O", "INE_O", "GFEX_O"]
            cursor.execute(f'INSERT INTO contract {self.column} VALUES {self.values}', value_data) # 汇总表
            conn.commit()

            if ExchangeID_flag == "CFFEX":
                if option_flag: # 期权
                    cursor.execute(f'INSERT INTO CFFEX_O {self.column} VALUES {self.values}', value_data) # 汇总表
                    conn.commit()
                else: # 期货
                    cursor.execute(f'INSERT INTO CFFEX {self.column} VALUES {self.values}', value_data) # 汇总表
                    conn.commit()

            if ExchangeID_flag == "SHFE":
                if option_flag: # 期权
                    cursor.execute(f'INSERT INTO SHFE_O {self.column} VALUES {self.values}', value_data) # 汇总表
                    conn.commit()
                else: # 期货
                    cursor.execute(f'INSERT INTO SHFE {self.column} VALUES {self.values}', value_data) # 汇总表
                    conn.commit()

            if ExchangeID_flag == "DCE":
                if option_flag: # 期权
                    cursor.execute(f'INSERT INTO DCE_O {self.column} VALUES {self.values}', value_data) # 汇总表
                    conn.commit()
                else: # 期货
                    cursor.execute(f'INSERT INTO DCE {self.column} VALUES {self.values}', value_data) # 汇总表
                    conn.commit()

            if ExchangeID_flag == "CZCE":
                if option_flag: # 期权
                    value_data = list(value_data)
                    value_data[-2] = value_data[-2][:-1] # 移除郑商所期权产品名称带有的C/P后缀
                    value_data = tuple(value_data)
                    cursor.execute(f'INSERT INTO CZCE_O {self.column} VALUES {self.values}', value_data) # 汇总表
                    conn.commit()
                else: # 期货
                    cursor.execute(f'INSERT INTO CZCE {self.column} VALUES {self.values}', value_data) # 汇总表
                    conn.commit()

            if ExchangeID_flag == "INE":
                if option_flag: # 期权
                    cursor.execute(f'INSERT INTO INE_O {self.column} VALUES {self.values}', value_data) # 汇总表
                    conn.commit()
                else: # 期货
                    cursor.execute(f'INSERT INTO INE {self.column} VALUES {self.values}', value_data) # 汇总表
                    conn.commit()

            if ExchangeID_flag == "GFEX":
                if option_flag: # 期权
                    cursor.execute(f'INSERT INTO GFEX_O {self.column} VALUES {self.values}', value_data) # 汇总表
                    conn.commit()
                else: # 期货
                    cursor.execute(f'INSERT INTO GFEX {self.column} VALUES {self.values}', value_data) # 汇总表
                    conn.commit()
        if last:
            self.contract_inited = True
            self.gateway.write_log("合约信息查询成功")

            print("合约信息查询成功并存入本地 contract.db")
            cursor.close()
            conn.close()
Member
avatar
加入于:
帖子: 36
声望: 0

标题里有错误 更正为 sqlite3

Administrator
avatar
加入于:
帖子: 4579
声望: 331

感谢分享,帮你调整下格式

© 2015-2022 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

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