上期技术CTPAPI封装COM组件ctp开放平台openctp环境7_24小时x64组件python_delphi调用演示程序

部署运行你感兴趣的模型镜像

源码下载地址:https://gitee.com/topview999/TopViewQHTCtpCom

新修改后的python调用COM组件,pyside2制作的UI界面。体验一下远超VeighNaStation(VNPY)的订单及持仓刷新速度。阳了的时候无聊,攻了攻pyside2,算是入了门。pyside2界面简洁大方,功能强大,性能不错。源代码全部公开,COM组件免费,所有涉及到的代码都免费,拿去简单修改就可以搭建自己的量化平台。代码中大量的使用线程多任务用以更新界面、操作开平仓,性能、速度、稳定性没的说。话说python pyside2的性能有时确实不俗,查询全市场合约时,python pyside2界面下线程几秒钟完成。

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'TvQhtCtpComPYClient.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


import win32com.client.CLSIDToClass, pythoncom, pywintypes
import win32com.client.util
from pywintypes import IID
from win32com.client import Dispatch
from threading import Thread
import random
import time
import datetime
import ctypes
import numpy as np
import traceback
#import tracemalloc  #进行内存分析追踪


from TVQHTCTPCOM import *
from TVQHTCTPCOM import ITVQhtICtpClientAPI
from PySide2.QtWidgets import QApplication,QWidget,QLabel,QProgressBar,QTableView,QTextEdit,QLabel  #引用的 是pyside6时,线程无法触及信号发送。不知为何。
from PySide2.QtUiTools import QUiLoader
from PySide2.QtCore import QFile,QTimer
from PySide2.QtGui import QStandardItemModel
from PySide2.QtGui import QStandardItem
from PySide2.QtCore import Signal,QObject  # 导入信号类 DescendingOrder 
import sys
class TMyPostion:
    def __init__(self):
      self.LongPostion = 0    
      self.LongYDPostion = 0    
      self.LongFrozen = 0   
      self.LongOrder = 0
      self.LongOrder1 = 0 
      self.LongOrderFlag = 0  
      self.ShortPostion = 0  
      self.ShortYDPostion = 0  
      self.ShortFrozen = 9
      self.ShortOrder = 0
      self.ShortOrder1 = 0  
      self.ShortOrderFlag = 0
class TvMyUseVar:
  def __init__(self):
    self.sInstrumentID = 'IF2212'    
    self.sUserId = '4100'    
    self.sPassWord = '750'  
    self.iRefMin = 0 
    self.iMin = 0  
    self.IsDoit = 0  
    self.iBeginTest = 0  
    self.iVolT = 9
    self.vloop = 0 #循环时循环步骤标志
    self.vWaitOrderInt= 60  #下订单时间间隔
    self.vWaitInOrder =0 #下订单时间计数器
    self.vWaitInCancle = 0  #撤单后时间计数器
    self.vWaitCancleInt = 6 #撤单后时间间隔
    self.RunFlag = 0
    self.Interval = 1  #循环时间间隔
    self.RefSec  = -1 #上一秒数
    self.BeginOpenClose = 0 #开始进行循环开平仓测试
    self.vMyBidPrice = .0
    self.vMyAskPrice = .0
    self.vIsCanC = 0
    self.vIsCanC1 = 0
    self.vIsCanC2 = 0
    self.vIsCanC3 = 0
    self.MinDouble = -99999.99
    self.MyPostion = TMyPostion()
MyUseVar = TvMyUseVar()



class MySignals(QObject):
    # 定义一种信号,因为有文本框和进度条两个类,此处要四个参数,类型分别是: QPlainTextEdit 、 QProgressBar、字符串和整形数字
    # 调用 emit方法发信号时,传入参数必须是这里指定的参数类型
    # 此处也可分开写两个函数,一个是文本框输出的,一个是给进度条赋值的
    text_print = Signal(QLabel,QProgressBar,str,int)  #刷新登录获取数据信息进度信号 
    text_MarketData = Signal(QTableView,str,float,int,float,int,float,int,float,int,float,int,str)#行情信息信号
    text_Account = Signal(ITVQhtICtpClientAPI,QTableView,QLabel) #每秒刷新账户资金信号
    text_PositionProfit = Signal(ITVQhtICtpClientAPI,QTableView) # 每秒刷新持仓盈亏数据信号
    text_OnOrder = Signal(ITVQhtICtpClientAPI,QTableView,str) #ITVQhtICtpClientAPI 订单信号
    text_OnOrderLst = Signal(QTableView,int,str,str,int,str,int,int,int,int,int,float,int,str,str) #订单推送后将订单信息添加到表格信号
    text_OpenClose = Signal(ITVQhtICtpClientAPI,QTextEdit) #开平仓循环测试信号
    text_OutBars = Signal(ITVQhtICtpClientAPI,QTextEdit,str,int,int,float,float,float,float,str) #输出K线Bars数据时 ,InstrumentID,Period,Counts,Hight,Low,Open,Close,CreatTime
    text_OuttextEdit = Signal(QTextEdit,str) ##一个参数要写成元数组的形式


class myevents:
    # Event Handlers  事件回调函数列表 ,执行操作后的响应事件 都在以下函数中操作。
    # If you create handlers, they should have the following prototypes:
    def OnMarketData(self, InstrumentID=defaultNamedNotOptArg, BidPrice1=defaultNamedNotOptArg, BidVolume1=defaultNamedNotOptArg, AskPrice1=defaultNamedNotOptArg
            , AskVolume1=defaultNamedNotOptArg, OpenPrice=defaultNamedNotOptArg, HighestPrice=defaultNamedNotOptArg, LowestPrice=defaultNamedNotOptArg, LastPrice=defaultNamedNotOptArg
            , OpenInterest=defaultNamedNotOptArg, Volume=defaultNamedNotOptArg, UpperLimitPrice=defaultNamedNotOptArg, LowerLimitPrice=defaultNamedNotOptArg, PreSettlementPrice=defaultNamedNotOptArg
            , AveragePrice=defaultNamedNotOptArg, UpdateTime=defaultNamedNotOptArg, UpdateMilliSecond=defaultNamedNotOptArg):
        MyUseVar.vMyBidPrice = BidPrice1
        MyUseVar.vMyAskPrice = AskPrice1    
        for row in range(2):
            j = 0 
            for column in [InstrumentID,LastPrice,Volume,BidPrice1,BidVolume1,AskPrice1,AskVolume1,BidPrice1,-99999,AskPrice1,-99999,UpdateTime]:
                item = QStandardItem(f"{column}")
                Mui.model4.setItem(row,j,item)
                j = j+1
                Mui.AppText([j,column])
        
    def OnEventsInfo(self, InfoID=defaultNamedNotOptArg, MsgInfo=defaultNamedNotOptArg):
        thread = Thread(target=Mui.printFunc_OuttextEdit,args=(str(["OnEventsInfo:",InfoID,MsgInfo]),))#一个参数要写成元数组的形式
        thread.start()
    def OnInstrumentStatus(self, InstrumentID=defaultNamedNotOptArg, ExchangeID=defaultNamedNotOptArg, EnterTime=defaultNamedNotOptArg, NewState=defaultNamedNotOptArg):
        Mui.AppText2(["OnInstrumentStatus:",InstrumentID, ExchangeID, EnterTime,NewState])
    def OnTradeConnected(self):
        Mui.AppText2(["OnTradeConnected"])
    def OnTradeDisconnected(self):
        Mui.AppText2(["OnTradeDisconnected"])
    def OnMDConnected(self):
        Mui.AppText2(["OnMDConnected"])
    def OnMDDisconnected(self):
        Mui.AppText2(["OnMDDisconnected"])
    def OnOrder(self, OrderID=defaultNamedNotOptArg, InstrumentID=defaultNamedNotOptArg, IsBuy=defaultNamedNotOptArg, IsOpen=defaultNamedNotOptArg
            , Volume=defaultNamedNotOptArg, Price=defaultNamedNotOptArg, TradedVolume=defaultNamedNotOptArg, AvgTradePrice=defaultNamedNotOptArg, OrderStatus=defaultNamedNotOptArg
            , OrderSysID=defaultNamedNotOptArg, BrokerOrderSeq=defaultNamedNotOptArg, OrderLocalID=defaultNamedNotOptArg, InsertTime=defaultNamedNotOptArg, ErrorID=defaultNamedNotOptArg
            , ErrorMsg=defaultNamedNotOptArg, HedgeType=defaultNamedNotOptArg):
        threadOnOrder = Thread(target=Mui.printFunc_OnOrder,args=(InstrumentID,))  # 订单信号线程
        threadOnOrder.start()
        threadOnOrderLst = Thread(target=Mui.printFunc_OnOrderLst,args=(OrderID,OrderLocalID,OrderSysID,BrokerOrderSeq,InstrumentID,IsBuy,IsOpen,OrderStatus, Volume,TradedVolume,Price,ErrorID,InsertTime,ErrorMsg))
        threadOnOrderLst.start() #订单推送后将订单信息添加到表格信号线程
        
    def OnTrade(self, OrderID=defaultNamedNotOptArg, OrderSysID=defaultNamedNotOptArg, OrderLocalID=defaultNamedNotOptArg, TradeID=defaultNamedNotOptArg
            , InstrumentID=defaultNamedNotOptArg, IsBuy=defaultNamedNotOptArg, IsOpen=defaultNamedNotOptArg, Volume=defaultNamedNotOptArg, ThisTradePrice=defaultNamedNotOptArg
            , TradeTime=defaultNamedNotOptArg, OrderStatus=defaultNamedNotOptArg):
        thread = Thread(target=Mui.printFunc_OuttextEdit,args=(str(["OnTrade:",TradeTime,OrderID,OrderLocalID,OrderSysID,InstrumentID,IsBuy, IsOpen, Volume,ThisTradePrice]),))#一个参数要写成元数组的形式
        thread.start()
    def OnRtnQuote(self, BrokerID=defaultNamedNotOptArg, UserID=defaultNamedNotOptArg, InstrumentID=defaultNamedNotOptArg, ExchangeInstID=defaultNamedNotOptArg):
        print("OnRtnQuote")
    def OnOrderCanceled(self, OrderID=defaultNamedNotOptArg, ErrorID=defaultNamedNotOptArg, ErrorMsg=defaultNamedNotOptArg):
        thread = Thread(target=Mui.printFunc_OuttextEdit,args=(str([OrderID,ErrorID,ErrorMsg]),))#一个参数要写成元数组的形式
        thread.start()
    def OnOrderActionFailed(self, OrderID=defaultNamedNotOptArg, ErrorID=defaultNamedNotOptArg, ErrorMsg=defaultNamedNotOptArg):
        thread = Thread(target=Mui.printFunc_OuttextEdit,args=(str(["OnOrderActionFailed:",OrderID,ErrorID,ErrorMsg]),))#一个参数要写成元数组的形式
        thread.start()
    def OnInitFinished(self):
        Mui.AppText2(["OnInitFinished:","初始化完成!"])
        MyUseVar.RunFlag = 1
        thread_OpenClose = Thread(target=Mui.printFunc_OpenClose)  #进行每秒刷新账户资金 持仓盈亏数据线程 登录完成后开始
        thread_OpenClose.start()  
    def OnGetPositionDetail(self, InstrumentID=defaultNamedNotOptArg, OpenDate=defaultNamedNotOptArg, OrderID=defaultNamedNotOptArg, TradeID=defaultNamedNotOptArg
            , Direction=defaultNamedNotOptArg, Volume=defaultNamedNotOptArg, CloseVolume=defaultNamedNotOptArg, OpenPrice=defaultNamedNotOptArg, PositionProfitByDate=defaultNamedNotOptArg
            , PositionProfitByTrade=defaultNamedNotOptArg, Margin=defaultNamedNotOptArg, LastSettlementPrice=defaultNamedNotOptArg, SettlementPrice=defaultNamedNotOptArg,
                            CloseProfitByDate=defaultNamedNotOptArg, CloseProfitByTrade=defaultNamedNotOptArg, CloseAmount=defaultNamedNotOptArg, TimeFirstVolume=defaultNamedNotOptArg,
                            MarginRateByMoney=defaultNamedNotOptArg, MarginRateByVolume=defaultNamedNotOptArg):
        Mui.AppText3(["OnGetPositionDetail:",InstrumentID, OpenDate, TradeID, Direction,Volume,CloseVolume, OpenPrice, PositionProfitByDate, PositionProfitByTrade,Margin,LastSettlementPrice,
                    SettlementPrice,CloseProfitByDate,CloseProfitByTrade, CloseAmount, TimeFirstVolume,MarginRateByMoney, MarginRateByVolume])
    def OnGetInstrument(self, ExchangeID=defaultNamedNotOptArg, InstrumentID=defaultNamedNotOptArg, ExchangeInstID=defaultNamedNotOptArg, InstrumentName=defaultNamedNotOptArg
            , ProductClass=defaultNamedNotOptArg, MaxMarketOrderVolume=defaultNamedNotOptArg, MinMarketOrderVolume=defaultNamedNotOptArg, MaxLimitOrderVolume=defaultNamedNotOptArg, MinLimitOrderVolume=defaultNamedNotOptArg
            , VolumeMultiple=defaultNamedNotOptArg, PriceTick=defaultNamedNotOptArg, ExpireDate=defaultNamedNotOptArg, IsTrading=defaultNamedNotOptArg, LongMarginRatio=defaultNamedNotOptArg
            , ShortMarginRatio=defaultNamedNotOptArg, OptionsType=defaultNamedNotOptArg, ProductID=defaultNamedNotOptArg, CombinationType=defaultNamedNotOptArg, bIsLast=defaultNamedNotOptArg):
        thread = Thread(target=Mui.printFunc_OuttextEdit,args=(str(["OnGetInstrument:",ExchangeID,InstrumentID,InstrumentName,ExpireDate,IsTrading]),))#一个参数要写成元数组的形式
        thread.start()
    def OnRspError(self, ErrorID=defaultNamedNotOptArg, ErrorMsg=defaultNamedNotOptArg):
        thread = Thread(target=Mui.printFunc_OuttextEdit,args=(str(["OnRspError:",ErrorID,ErrorMsg]),))#一个参数要写成元数组的形式
        thread.start()
    def OnRspQryTrade(self, OrderID=defaultNamedNotOptArg, TradeID=defaultNamedNotOptArg, InstrumentID=defaultNamedNotOptArg, OrderSysID=defaultNamedNotOptArg
            , OrderLocalID=defaultNamedNotOptArg, BrokerOrderSeq=defaultNamedNotOptArg, IsBuy=defaultNamedNotOptArg, IsOpen=defaultNamedNotOptArg, Volume=defaultNamedNotOptArg
            , Price=defaultNamedNotOptArg, TradeDate=defaultNamedNotOptArg, TradeTime=defaultNamedNotOptArg):
        thread = Thread(target=Mui.printFunc_OuttextEdit,args=(str(["OnRspQryTrade:",TradeDate,TradeTime,InstrumentID,OrderID,TradeID,BrokerOrderSeq,OrderLocalID,OrderSysID,IsBuy, IsOpen, Volume,Price]),))#一个参数要写成元数组的形式
        thread.start()
    def OnOutPosition(self, InstrumentID=defaultNamedNotOptArg, LongPostion=defaultNamedNotOptArg, LongYDPostion=defaultNamedNotOptArg, LongFrozen=defaultNamedNotOptArg
            , LongSuspendPostion=defaultNamedNotOptArg, LongPositionPrice=defaultNamedNotOptArg, LongProfit=defaultNamedNotOptArg, ShortPostion=defaultNamedNotOptArg, ShortYDPostion=defaultNamedNotOptArg
            , ShortFrozen=defaultNamedNotOptArg, ShortSuspendPostion=defaultNamedNotOptArg, ShortPositionPrice=defaultNamedNotOptArg, ShortProfit=defaultNamedNotOptArg):
        finded = 0
        findrow = -1
        tmpmodel = Mui.ui.gridpositions.model()
        j = tmpmodel.rowCount()
        #print("tmpmodel.rowCount ",j)
        #print("tmpmodel.rowCount ",tmpmodel.item(0,0).text())
        for row in range(j):
            #print("row ",row)
            if ((tmpmodel.item(row,0).text()==InstrumentID and tmpmodel.item(row,1).text()=="  卖") or tmpmodel.item(row,0).text()==""):
                #print("tmpmodel.item(row,0).text() ",tmpmodel.item(row,0).text())
                finded = 1
                findrow = row
                break
        bidprice = 0.0
        askprice =0.0 
        if (finded==1):
            j = 0
            for column in [InstrumentID,"  卖",ShortPostion,ShortYDPostion,ShortFrozen,ShortSuspendPostion,ShortPositionPrice,ShortProfit,bidprice,askprice]:
                item = QStandardItem(f"{column}")
                tmpmodel.setItem(findrow,j,item)
                j = j+1
            j = 0
            for column in [InstrumentID,"买  ",LongPostion, LongYDPostion, LongFrozen, LongSuspendPostion,LongPositionPrice,LongProfit,bidprice,askprice]:
                item = QStandardItem(f"{column}")
                tmpmodel.setItem(findrow+1,j,item)
                j = j+1
        else:
            item0 = QStandardItem('%s' % InstrumentID)
            item1 = QStandardItem('%s' % "  卖")
            item2 = QStandardItem('%d' % ShortPostion)
            item3 = QStandardItem('%d' % ShortYDPostion)
            item4 = QStandardItem('%d' % ShortFrozen)
            item5 = QStandardItem('%d' % ShortSuspendPostion)
            item6 = QStandardItem('%.2f' % ShortPositionPrice)
            item7 = QStandardItem('%.2f' % ShortProfit)
            item8 = QStandardItem('%.2f' % bidprice)
            item9 = QStandardItem('%.2f' % askprice)
            tmpmodel.appendRow([item0,item1,item2,item3,item4,item5,item6,item7,item8,item9])
            item0 = QStandardItem('%s' % InstrumentID)
            item1 = QStandardItem('%s' % "买  ")
            item2 = QStandardItem('%d' % LongPostion)
            item3 = QStandardItem('%d' % LongYDPostion)
            item4 = QStandardItem('%d' % LongFrozen)
            item5 = QStandardItem('%d' % LongSuspendPostion)
            item6 = QStandardItem('%.2f' % LongPositionPrice)
            item7 = QStandardItem('%.2f' % LongProfit)
            item8 = QStandardItem('%.2f' % bidprice)
            item9 = QStandardItem('%.2f' % askprice)
            tmpmodel.appendRow([item0,item1,item2,item3,item4,item5,item6,item7,item8,item9])
    def OnDepthMarketData(self, InstrumentID=defaultNamedNotOptArg, BidPrice1=defaultNamedNotOptArg, BidVolume1=defaultNamedNotOptArg, AskPrice1=defaultNamedNotOptArg
            , AskVolume1=defaultNamedNotOptArg, BidPrice2=defaultNamedNotOptArg, BidVolume2=defaultNamedNotOptArg, AskPrice2=defaultNamedNotOptArg, AskVolume2=defaultNamedNotOptArg
            , BidPrice3=defaultNamedNotOptArg, BidVolume3=defaultNamedNotOptArg, AskPrice3=defaultNamedNotOptArg, AskVolume3=defaultNamedNotOptArg, BidPrice4=defaultNamedNotOptArg
            , BidVolume4=defaultNamedNotOptArg, AskPrice4=defaultNamedNotOptArg, AskVolume4=defaultNamedNotOptArg, BidPrice5=defaultNamedNotOptArg, BidVolume5=defaultNamedNotOptArg
            , AskPrice5=defaultNamedNotOptArg, AskVolume5=defaultNamedNotOptArg, OpenPrice=defaultNamedNotOptArg, HighestPrice=defaultNamedNotOptArg, LowestPrice=defaultNamedNotOptArg
            , LastPrice=defaultNamedNotOptArg, OpenInterest=defaultNamedNotOptArg, Volume=defaultNamedNotOptArg, UpperLimitPrice=defaultNamedNotOptArg, LowerLimitPrice=defaultNamedNotOptArg
            , PreSettlementPrice=defaultNamedNotOptArg, AveragePrice=defaultNamedNotOptArg, UpdateTime=defaultNamedNotOptArg, UpdateMilliSecond=defaultNamedNotOptArg):
        threadDepthMarketData = Thread(target=Mui.printFunc_MarketData,args=(InstrumentID,LastPrice,Volume,BidPrice1,BidVolume1,AskPrice1,AskVolume1,BidPrice5,BidVolume5,AskPrice5,AskVolume5,UpdateTime))
        threadDepthMarketData.start() #行情信息 刷新到表格线程
        MyUseVar.vMyBidPrice = BidPrice1
        MyUseVar.vMyAskPrice = AskPrice1
                
    def OnPushCancleOrder(self, OrderID=defaultNamedNotOptArg, InsertTime=defaultNamedNotOptArg, InstrumentID=defaultNamedNotOptArg, IsBuy=defaultNamedNotOptArg, IsOpen=defaultNamedNotOptArg, Volume=defaultNamedNotOptArg, TradedVolume=defaultNamedNotOptArg, Price=defaultNamedNotOptArg, OrderStatus=defaultNamedNotOptArg):
        thread = Thread(target=Mui.printFunc_OuttextEdit,args=(str(["OnPushCancleOrder",InsertTime,InstrumentID,OrderID,IsBuy,IsOpen, Volume,TradedVolume,Price,OrderStatus]),))#一个参数要写成元数组的形式
        thread.start()
    def OnOutProgress(self, ProFlag=defaultNamedNotOptArg, MaxInt=defaultNamedNotOptArg, Position=defaultNamedNotOptArg):
        str1 = ""
        if (ProFlag==1):
            str1 = "获取全市场合约信息进度"
        elif (ProFlag==2):
            str1 = "获取历史订单信息进度"
        elif (ProFlag==3):
            str1 = "获取持仓信息进度"
        elif (ProFlag==4):
            str1 = "获取持仓明细信息进度"
        elif (ProFlag==5):
            str1 = "读取历史K线数据进度"
        elif (ProFlag==9):
            str1 = "登录初始化完成"
        thread = Thread(target=Mui.printFunc,args=(str1,((Position-1) % 100) +1))#登录获取数据进度信息 刷新到progress线程
        thread.start()
    def OnOutBars(self, InstrumentID=defaultNamedNotOptArg, Period=defaultNamedNotOptArg, Counts=defaultNamedNotOptArg, Hight=defaultNamedNotOptArg, Low=defaultNamedNotOptArg, Open=defaultNamedNotOptArg, Close=defaultNamedNotOptArg, CreatTime=defaultNamedNotOptArg):
        thread = Thread(target=Mui.printFunc_OutBars,args=(InstrumentID,Period,Counts,Hight,Low,Open,Close,CreatTime))
        thread.start()
    def OnOutExchangeTradeTimes(self, ExchangeID=defaultNamedNotOptArg, InstrumentID=defaultNamedNotOptArg, OpenTime=defaultNamedNotOptArg, CloseTime=defaultNamedNotOptArg, TradeMins=defaultNamedNotOptArg, Flag=defaultNamedNotOptArg):
        Mui.AppText3("ExchangeID:{0} InstrumentID:{1} OpenTime:{2} CloseTime:{3} TradeMins:{4} Flag:{5}\n".format(ExchangeID,InstrumentID, OpenTime, CloseTime,TradeMins,Flag))
        thread = Thread(target=Mui.printFunc_OuttextEdit,args=("ExchangeID:{0} InstrumentID:{1} OpenTime:{2} CloseTime:{3} TradeMins:{4} Flag:{5}\n".format(ExchangeID,InstrumentID, OpenTime, CloseTime,TradeMins,Flag),))#一个参数要写成元数组的形式
        thread.start()

        
class Ui_UiMainWindow(QWidget):  #object
    def __init__(self):
      super(Ui_UiMainWindow,self).__init__()
      #先导入.ui文件,存在qfile_UIUI。然后关闭
      qfile_UIUI = QFile("TvQhtCtpComPYClient.ui")
      qfile_UIUI.open(QFile.ReadOnly)
      qfile_UIUI.close()
      # 导入加载的UI类(返回的就是UI界面对应的QWidget窗体对象)
      self.ui = QUiLoader().load(qfile_UIUI)  # 界面对象
      if not self.ui:
        print(QUiLoader().errorString())
        print("LoadO error")
        sys.exit(-1)
      else:
        print("LoadOk")
        
      #  加入界面按钮点击事件对应的过程回调映射。
      self.ui.BtnLogin.clicked.connect(self.Login) # type: ignore
      self.ui.SubIns.clicked.connect(self.bSubIns) # type: ignore bUnSubIns
      self.ui.UnSubIns.clicked.connect(self.bUnSubIns) # type: ignore
      self.ui.BtnRSQ.clicked.connect(self.callbacklog) # LogOut
      self.ui.BtnLogout.clicked.connect(self.LogOut) # LogOut
      self.ui.btnorder.clicked.connect(self.btnorder) # LogOut
      self.ui.rb0_4.clicked.connect(self.rb0_4click) # LogOut
      self.ui.rb1_4.clicked.connect(self.rb0_4click) # LogOut
      self.ui.rb0_5.clicked.connect(self.rb0_5click) # LogOut
      self.ui.rb1_5.clicked.connect(self.rb0_5click) # LogOut 
      self.ui.btnopenclose.clicked.connect(self.btnopencloseclick) # LogOut global BeginOpenClose #开始进行循环开平仓测试 
      self.ui.btnChinv.clicked.connect(self.btnChinvclick) # LogOut global BeginOpenClose #开始进行循环开平仓测试 
      
      self.ms = MySignals()                              #引入信号函数
      self.ms.text_print.connect(self.pF)           #将信号传递给主程序中pF函数进行处理
      self.ms.text_MarketData.connect(self.pF_MarketData)           #将信号传递给主程序中pF函数进行处理
      self.ms.text_Account.connect(self.pF_Account)           #将信号传递给主程序中pF函数进行处理
      self.ms.text_PositionProfit.connect(self.pF_PositionProfit)           #将信号传递给主程序中pF函数进行处理
      self.ms.text_OnOrder.connect(self.pF_OnOrder)           #将信号传递给主程序中pF函数进行处理 
      self.ms.text_OnOrderLst.connect(self.pF_OnOrderLst)           #将信号传递给主程序中pF函数进行处理
      self.ms.text_OpenClose.connect(self.pF_OpenClose)           #将信号传递给主程序中pF函数进行处理
      self.ms.text_OutBars.connect(self.pF_OutBars)           #将信号传递给主程序中pF函数进行处理 
      self.ms.text_OuttextEdit.connect(self.pF_OuttextEdit)           #将信号传递给主程序中pF函数进行处理 
      
      self.model4 = QStandardItemModel(1, 12)  # 行情信息表格 设置行数 列数
      self.model4.setHorizontalHeaderLabels(['合约名称','最新','数量','买一','买量','卖一','卖量','买五','买量','卖五','卖量','时间'])
      self.ui.tableView_4.setModel(self.model4)
      for row in range(1):
          for column in range(12):
              item = QStandardItem("")  #如果不开始进行表格赋值,.item(row,0).text()会提示错误 无text()这个属性。
              self.model4.setItem(row,column,item)
              
      self.model = QStandardItemModel(1, 8)  #账户资金表格设置行数 列数
      self.model.setHorizontalHeaderLabels(["静态权益","结算准备金","占用保证金","可用资金","可取资金","交易所保证金","浮动[持仓]盈亏","平仓盈亏"])
      self.ui.tableView.setModel(self.model)
      for row in range(1):
          for column in range(8):
              item = QStandardItem("")  #如果不开始进行表格赋值,.item(row,0).text()会提示错误 无text()这个属性。
              self.model.setItem(row,column,item)
              
      self.model1 = QStandardItemModel(2, 10)  #持仓数据表格 设置行数 列数
      self.model1.setHorizontalHeaderLabels(["合约名称","买卖","总持仓","昨仓","平仓冻结","开仓挂起","开仓均价","持仓盈亏","BidPrice","AskPrice"])
      self.ui.gridpositions.setModel(self.model1)
      for row in range(2):
          for column in range(10):
              item = QStandardItem("")  #如果不开始进行表格赋值,.item(row,0).text()会提示错误 无text()这个属性。
              self.model1.setItem(row,column,item)

      self.model2 = QStandardItemModel(1, 10)  #订单列表表格 设置行数 列数
      self.model2.setHorizontalHeaderLabels(["订单编号","合约名称","买卖","开平","手数","已成交","报单价格","成交均价","报单时间","报单状态"])
      self.ui.tableView_2.setModel(self.model2)
      for row in range(1):
          for column in range(10):
              item = QStandardItem("")  #如果不开始进行表格赋值,.item(row,0).text()会提示错误 无text()这个属性。
              self.model2.setItem(row,column,item)

      MyUseVar.RunFlag = 0
      MyUseVar.Interval = 1
      MyUseVar.vWaitOrderInt = 60


      MyUseVar.RefSec = -1

      MyUseVar.vloop = 0

      MyUseVar.vWaitCancleInt = 6

      MyUseVar.vVolT = 9

      MyUseVar.BeginOpenClose = 0
      

      MyUseVar.vWaitInOrder = 0
      #tracemalloc.start()   #启用内存分析追踪
      #self.snapshot1 = tracemalloc.take_snapshot() #建立一个内存快照

    def rb0_4click(self):
        errid = 0
        if (self.ui.rb0_4.isChecked()):
            tvapi1.SetOrderCloseMode(0,errid) #"设置登录模式为:0 设置返回值:{0} 0设置成功 1设置失败\n".format(errid)
            self.ui.textEdit_3.append("设置平仓时的优先顺序模式为:0 【0 先平昨再平今 1 先平今再平昨】 设置返回值:{0} 【0设置成功 1设置失败】\n".format(errid))
        else:
            tvapi1.SetOrderCloseMode(1,errid) #"设置登录模式为:0 设置返回值:{0} 0设置成功 1设置失败\n".format(errid)
            self.ui.textEdit_3.append("设置平仓时的优先顺序模式为:1 【0 先平昨再平今 1 先平今再平昨】 设置返回值:{0} 【0设置成功 1设置失败】\n".format(errid))
            
    def btnChinvclick(self):  
        if (self.ui.rb0_5.isChecked()):
            MyUseVar.vWaitOrderInt = self.ui.spinBox.value()
            if (MyUseVar.vWaitOrderInt<1):
                MyUseVar.vWaitOrderInt = 1
                self.ui.spinBox.setValue(1)
        else:
            MyUseVar.vWaitOrderInt = self.ui.spinBox.value()/50
            if (MyUseVar.vWaitOrderInt<1):
                MyUseVar.vWaitOrderInt = 1
                self.ui.spinBox.setValue(50)
            
        
            
        self.ui.textEdit.append("设置开平仓循环测试时的时间间隔:{0} {1}\n".format(self.ui.spinBox.value(),self.ui.label_9.text()))

    def rb0_5click(self):  
        if (self.ui.rb0_5.isChecked()):  #设置刷新时间间隔 毫秒为单位
            MyUseVar.Interval = 1
            self.ui.label_9.setText("秒")
        else:
            MyUseVar.Interval = 0.05
            self.ui.label_9.setText("毫秒")
        
    def btnorder(self):  #自定义一下 单按钮事件
        isopen = -1
        isbuy = -1
        #//IsBuy 0.多头 1.空头
    #//IsOpen 0.开仓 1.平仓 2.强平  3.平今 4.平昨 5.强减 6.本地强平;
        vol = int(self.ui.edtvol.text())
        if (vol<=0):
            vol = 1 
        if (self.ui.rb0_2.isChecked()):
            isopen = 0
        elif (self.ui.rb1_2.isChecked()):
            isopen = 1
        elif (self.ui.rb3_2.isChecked()):
            isopen = 3
        elif (self.ui.rb4_2.isChecked()):
            isopen = 4
            
        if (self.ui.rb0_3.isChecked()):
            isbuy = 0
        elif (self.ui.rb1_3.isChecked()):
            isbuy = 1
        vMyBidPrice=0.0
        if (isbuy>=0 and isbuy<=1 and isopen>=0 and isopen<=6):
            MyUseVar.MyPostion.LongOrder = tvapi1.PlaceOrder(self.ui.edtIns.text(),isbuy,isopen,vol,vMyBidPrice,MyUseVar.MyPostion.LongOrder)
            self.ui.textEdit_3.append("{} 下订单 order: {}  Price:{} \n".format(self.ui.edtIns.text(),MyUseVar.MyPostion.LongOrder,vMyBidPrice))

    # 查询操作代码
    def callbacklog(self):
        if (self.ui.rb0.isChecked()):
            vMultiply = 0
            vPriceUnit = 0
            vMarginRate = 0
            vExpireDate = ''
            vMultiply, vPriceUnit, vMarginRate, vExpireDate = tvapi1.GetInstrumentInfo(self.ui.edtIns.text(), vMultiply, vPriceUnit, vMarginRate, vExpireDate)
            self.ui.textEdit_3.append("查询合约:{} 合约乘数:{} 最小变动单位:{} 保证金比率:{} 合约到期日:{}\n".format(self.ui.edtIns.text(),vMultiply, vPriceUnit, vMarginRate, vExpireDate))
        elif (self.ui.rb1.isChecked()):
            tvapi1.GetPositionDetail(self.ui.edtIns.text())
            self.ui.textEdit_3.append("查询合约:%s 持仓成交明细\n".format(self.ui.edtIns.text()))
        elif (self.ui.rb2.isChecked()):
            PreBalance = .0
            Balance = .0
            PreMargin =.0
            Available  =.0
            WithdrawQuota  =.0
            ExchangeMargin  =.0
            CloseProfit  =.0
            PositionProfit  =.0
            PreBalance,Balance,PreMargin,Available,WithdrawQuota,ExchangeMargin,CloseProfit,PositionProfit = tvapi1.GetAccount(PreBalance,Balance,PreMargin,Available,WithdrawQuota,ExchangeMargin,CloseProfit ,PositionProfit)
            self.ui.textEdit_3.append("静态权益:{0} 结算保证金:{1} 占用保证金:{2} 可用资金:{3} 可取资金:{4} 交易所保证金:{5} 平仓盈亏:{6} 持仓盈亏:{7}\n".format(PreBalance, Balance, PreMargin, Available, WithdrawQuota, ExchangeMargin,CloseProfit,PositionProfit))
        elif (self.ui.rb3.isChecked()):
            tvapi1.GetTradeInfo(self.ui.edtIns.text())
            self.ui.textEdit_3.append("查询:{0} 成交信息\n".format(self.ui.edtIns.text()))
        elif (self.ui.rb4.isChecked()):
            tvapi1.SettlementInfoConfirm()
            self.ui.textEdit_3.append("确认结算单 !\n")
        elif (self.ui.rb5.isChecked()):
            vMultiply=0
            vPriceUnit=0
            vMarginRate=0
            vExpireDate=""
            tvapi1.GetInstrumentInfo("",vMultiply, vPriceUnit, vMarginRate, vExpireDate)
            self.ui.textEdit_3.append("查询全市场合约\n")
        elif (self.ui.rb6.isChecked()):
            if (len(self.ui.edtorderid.text())==0):
                vOrderId = 0
            else:
                vOrderId = int(self.ui.edtorderid.text())
            vIsCanC = 0
            vIsCanC = tvapi1.IsOrderOpen(vOrderId,vIsCanC)
            self.ui.textEdit_3.append("订单:{0} 是否可撤:{1} (0 :不可撤 1:可撤)\n".format(vOrderId,vIsCanC))
        elif (self.ui.rb7.isChecked()):
            lsp = 0
            ssp = 0
            lpp = .0
            spp=.0
            vd1=.0
            vd2=.0
            bid=.0
            ask=.0
            MyUseVar.MyPostion.LongPostion,MyUseVar.MyPostion.LongYDPostion,MyUseVar.MyPostion.LongFrozen,lsp,vd1,lpp,MyUseVar.MyPostion.ShortPostion,MyUseVar.MyPostion.ShortYDPostion,\
                                    MyUseVar.MyPostion.ShortFrozen,ssp,vd2,spp,bid,ask  = tvapi1.GetPositionPlus(self.ui.edtIns.text(),\
                                    MyUseVar.MyPostion.LongPostion,MyUseVar.MyPostion.LongYDPostion,MyUseVar.MyPostion.LongFrozen,lsp,vd1,lpp,MyUseVar.MyPostion.ShortPostion,MyUseVar.MyPostion.ShortYDPostion,\
                                    MyUseVar.MyPostion.ShortFrozen,ssp,vd2,spp,bid,ask)
            self.ui.textEdit_3.append("{12} 多头仓位:{0} 昨仓:{1} 冻结仓位:{2} 开仓挂起:{3} 持仓价格:{4} 持仓盈亏:{5} bid:{13} 空头仓位:{6} 昨仓:{7} 冻结仓位:{8} 开仓挂起:{9} 持仓价格:{10} 持仓盈亏:{11} ask:{14}\n".\
                       format(MyUseVar.MyPostion.LongPostion,MyUseVar.MyPostion.LongYDPostion,MyUseVar.MyPostion.LongFrozen,lsp,vd1,lpp,MyUseVar.MyPostion.ShortPostion,MyUseVar.MyPostion.ShortYDPostion,\
                              MyUseVar.MyPostion.ShortFrozen,ssp,vd2,spp,self.ui.edtIns.text(),bid,ask))
        elif (self.ui.rb8.isChecked()):
            vi1=0
            vi1 = tvapi1.GetHisOrderList("",vi1)#查询历史订单信息 不为空查询指定合约。
            self.ui.textEdit_3.append("查询历史订单信息,返回值:{0} (0 :成功 1:查询历史订单不成功 2:查询全市场合约不成功)\n".format(vi1))
        elif (self.ui.rb9.isChecked()):
            YdClose = 0
            YdSettlement = 0
            Open = 0
            Last = 0
            Bid1 = 0
            Ask1 = 0
            Bid1Volume = 0
            Ask1Volume = 0
            Highest = 0
            Lowest = 0
            TradedVolume = 0
            TradedAmmount = 0
            YdClose, YdSettlement,Open,Last,Bid1,Ask1,Bid1Volume, Ask1Volume,Highest,Lowest,TradedVolume,TradedAmmount = tvapi1.GetMarketData(self.ui.edtIns.text(), YdClose, \
                YdSettlement,Open,Last,Bid1,Ask1,Bid1Volume, Ask1Volume,Highest,Lowest,TradedVolume,TradedAmmount)
            self.ui.textEdit_3.append("{0} YdClose:{1:.2f} YdSettlement:{2:.2f} Open:{3:.2f} Last:{4:.2f} Bid1:{5:.2f} Ask1:{6:.2f} Bid1Volume:{7} Ask1Volume:{8} Highest:{9:.2f} Lowest:{10:.2f} TradedVolume:{11} TradedAmmount:{12:.2f}\n".
                       format(MyUseVar.sInstrumentID,YdClose, YdSettlement, Open, Last, Bid1, Ask1, Bid1Volume,Ask1Volume, Highest, Lowest,TradedVolume, TradedAmmount))
        elif (self.ui.rb10.isChecked()):
            tvapi1.PrintOrderInfo ()
            self.ui.textEdit_3.append("输出信息到:{0} 目录的{0}.txt文件中完成!\n".format(self.ui.UserName.text()))
        elif (self.ui.rb11.isChecked()):
            OpenRatioByMoney = 0.0
            OpenRatioByVolume = 0.0 
            CloseRatioByMoney = 0.0 
            CloseRatioByVolume = 0.0 
            CloseTodayRatioByMoney  = 0.0 
            CloseTodayRatioByVolume = 0.0 
            OpenRatioByMoney,OpenRatioByVolume, CloseRatioByMoney, CloseRatioByVolume,CloseTodayRatioByMoney , CloseTodayRatioByVolume = tvapi1.GetInstrumentRatio(self.ui.edtIns.text(), OpenRatioByMoney,OpenRatioByVolume, CloseRatioByMoney,\
                    CloseRatioByVolume,CloseTodayRatioByMoney , CloseTodayRatioByVolume)
            self.ui.textEdit_3.append('{0} OpenRatioByMoney:{1:.7f} OpenRatioByVolume:{2:.7f} CloseRatioByMoney:{3:.7f} CloseRatioByVolume:{4:.7f} CloseTodayRatioByMoney :{5:.7f} CloseTodayRatioByVolume:{6:.7f}'.format(self.ui.edtIns.text(), OpenRatioByMoney,
                                 OpenRatioByVolume, CloseRatioByMoney, CloseRatioByVolume, CloseTodayRatioByMoney , CloseTodayRatioByVolume))
        elif (self.ui.rb12.isChecked()):
            PreBalance = .0
            Balance = .0
            PreMargin =.0
            Available  =.0
            WithdrawQuota  =.0
            ExchangeMargin  =.0
            CloseProfit  =.0
            PositionProfit  =.0
            PreBalance,Balance,PreMargin,Available,WithdrawQuota,ExchangeMargin,CloseProfit,PositionProfit = tvapi1.GetRealAccount(PreBalance,Balance,PreMargin,Available,WithdrawQuota,ExchangeMargin,CloseProfit ,PositionProfit)
            self.ui.textEdit_3.append("静态权益:{0} 结算保证金:{1} 占用保证金:{2} 可用资金:{3} 可取资金:{4} 交易所保证金:{5} 平仓盈亏:{6} 持仓盈亏:{7}\n".format(PreBalance, Balance, PreMargin, Available, WithdrawQuota, ExchangeMargin,CloseProfit,PositionProfit))
        elif (self.ui.rb13.isChecked()):
            lsp = 0
            ssp = 0
            lpp = .0
            spp=.0
            vd1=.0
            vd2=.0
            bid=.0
            ask=.0
            MyUseVar.MyPostion.LongPostion,MyUseVar.MyPostion.LongYDPostion,MyUseVar.MyPostion.LongFrozen,lsp,MyUseVar.MyPostion.ShortPostion,MyUseVar.MyPostion.ShortYDPostion,\
                                    MyUseVar.MyPostion.ShortFrozen,ssp  = tvapi1.GetRealPosition(self.ui.edtIns.text(),\
                                    MyUseVar.MyPostion.LongPostion,MyUseVar.MyPostion.LongYDPostion,MyUseVar.MyPostion.LongFrozen,lsp,MyUseVar.MyPostion.ShortPostion,MyUseVar.MyPostion.ShortYDPostion,\
                                    MyUseVar.MyPostion.ShortFrozen,ssp)
            self.ui.textEdit_3.append("{0} 多头仓位:{1} 昨仓:{2} 冻结仓位:{3} 持仓价格:{4} 空头仓位:{5} 昨仓:{6} 冻结仓位:{7} 持仓价格:{8} \n".\
                       format(self.ui.edtIns.text(),MyUseVar.MyPostion.LongPostion,MyUseVar.MyPostion.LongYDPostion,MyUseVar.MyPostion.LongFrozen,lsp,MyUseVar.MyPostion.ShortPostion,MyUseVar.MyPostion.ShortYDPostion,\
                              MyUseVar.MyPostion.ShortFrozen,ssp))
        elif (self.ui.rb14.isChecked()):
            vOrderId = int(self.ui.edtorderid.text())
            vIsCanC = 0
            vIsCanC = tvapi1.CancelOrder(vOrderId, vIsCanC)
            self.ui.textEdit_3.append("订单:{0} 撤单状态:{1}【0:撤单成功 其它:撤单不成功】\n".format(vOrderId,vIsCanC))
        elif (self.ui.rb15.isChecked()):
            IsOk = 0
            Period = 1
            IsOk = tvapi1.CreateBars(self.ui.edtIns.text(),Period,IsOk)
            self.ui.textEdit_3.append("合约:{0} 创建{1}分钟周期BARS完成:{2} 【1:创建成功 2:此周期已创建 -1:创建不成功】\n".format(self.ui.edtIns.text(),Period,IsOk))
            if (IsOk==2):
                IsOk = tvapi1.DeleteBars(self.ui.edtIns.text(),Period,IsOk)
                self.ui.textEdit_3.append("合约:{0} 删除{1}分钟周期BARS完成:{2} 【1:删除成功 -1:删除不成功】\n".format(self.ui.edtIns.text(),Period,IsOk))
        elif (self.ui.rb16.isChecked()):
            vMultiply = 0
            vPriceUnit = 0
            vMarginRate = 0
            vExpireDate = ''
            vMultiply, vPriceUnit, vMarginRate, vExpireDate = tvapi1.GetInstrumentInfoOut(self.ui.edtIns.text(), vMultiply, vPriceUnit, vMarginRate, vExpireDate)
            self.ui.textEdit_3.append("查询合约:{} 合约乘数:{} 最小变动单位:{} 保证金比率:{} 合约到期日:{}\n".format(self.ui.edtIns.text(),vMultiply, vPriceUnit, vMarginRate, vExpireDate))
        elif (self.ui.rb17.isChecked()):
            vmaxi=0
            vopen=.0
            vhight=.0
            vclose=.0
            vlow=.0
            vvloumes=0
            vuptime=""
            tmppe=1
            counts=0
            vmaxi,vopen,vclose,vhight,vlow,vvloumes,counts,vuptime = tvapi1.GetBars(self.ui.edtIns.text(),tmppe,0,vmaxi,vopen,vclose,vhight,vlow,vvloumes,counts,vuptime)
            self.ui.textEdit_3.append("合约{}K线数据 周期:{} 计数器:{} 长度:{} 序号:{} open:{} vclose:{} vhight:{} vlow:{} vvloumes:{} counts{} vuptime:{}\n".format(self.ui.edtIns.text(),tmppe,counts,vmaxi,0,vopen,vclose,vhight,vlow,vvloumes,counts,vuptime))
            if (vmaxi>=1):
                for row in range(vmaxi):
                    vmaxi,vopen,vclose,vhight,vlow,vvloumes,counts,vuptime = tvapi1.GetBars(self.ui.edtIns.text(),tmppe,row,vmaxi,vopen,vclose,vhight,vlow,vvloumes,counts,vuptime)
                    self.ui.textEdit_3.append("合约{}K线数据 周期:{} 计数器:{} 长度:{} 序号:{} open:{} vclose:{} vhight:{} vlow:{} vvloumes:{} counts{} vuptime:{}\n".format(self.ui.edtIns.text(),tmppe,counts,vmaxi,row,vopen,vclose,vhight,vlow,vvloumes,counts,vuptime))
        elif (self.ui.rb18.isChecked()):
            vinfoid=0
            vinfo =""
            self.ui.textEdit_3.append("==========CZCE======添加苹果AP2305合约交易时间段=========================\n")
            vinfoid,vinfo = tvapi1.AppendExchangeTradeTimes("CZCE","AP2305",9,0,75,0,vinfoid,vinfo);   #开盘时间段 标志位是 0 收盘时间段标志位是9 其他为1
            self.ui.textEdit_3.append("添加{} 合约{}交易时间段{}:{} :{}  vinfoid:{}\n".format("CZCE","AP2305",9,0,vinfo,vinfoid))            
            vinfoid,vinfo = tvapi1.AppendExchangeTradeTimes("CZCE","AP2305",10,30,60,1,vinfoid,vinfo);   #开盘时间段 标志位是 0 收盘时间段标志位是9 其他为1
            self.ui.textEdit_3.append("添加{} 合约{}交易时间段{}:{} :{}  vinfoid:{}\n".format("CZCE","AP2305",9,0,vinfo,vinfoid))
            vinfoid,vinfo = tvapi1.AppendExchangeTradeTimes("CZCE","AP2305",13,30,90,9,vinfoid,vinfo);   #开盘时间段 标志位是 0 收盘时间段标志位是9 其他为1
            self.ui.textEdit_3.append("添加{} 合约{}交易时间段{}:{} :{}  vinfoid:{}\n".format("CZCE","AP2305",9,0,vinfo,vinfoid))            
            self.ui.textEdit_3.append("==========CZCE======添加苹果所有合约交易时间段=========================\n")
            vinfoid,vinfo = tvapi1.AppendExchangeTradeTimes("CZCE","AP999",9,0,75,0,vinfoid,vinfo);   #开盘时间段 标志位是 0 收盘时间段标志位是9 其他为1
            self.ui.textEdit_3.append("添加{} 合约{}交易时间段{}:{} :{}  vinfoid:{}\n".format("CZCE","AP999",9,0,vinfo,vinfoid))            
            vinfoid,vinfo = tvapi1.AppendExchangeTradeTimes("CZCE","AP999",10,30,60,1,vinfoid,vinfo);   #开盘时间段 标志位是 0 收盘时间段标志位是9 其他为1
            self.ui.textEdit_3.append("添加{} 合约{}交易时间段{}:{} :{}  vinfoid:{}\n".format("CZCE","AP999",9,0,vinfo,vinfoid))
            vinfoid,vinfo = tvapi1.AppendExchangeTradeTimes("CZCE","AP999",13,30,90,9,vinfoid,vinfo);   #开盘时间段 标志位是 0 收盘时间段标志位是9 其他为1
            self.ui.textEdit_3.append("添加{} 合约{}交易时间段{}:{} :{}  vinfoid:{}\n".format("CZCE","AP999",9,0,vinfo,vinfoid))
            self.ui.textEdit_3.append("==========CZCE======删除合约苹果2305交易时间段=========================\n")
            vinfoid,vinfo = tvapi1.DeleteExchangeTradeTimes("CZCE","AP2305",vinfoid,vinfo)
            self.ui.textEdit_3.append("删除{} 合约{}交易时间段{}:{} :{}  vinfoid:{}\n".format("CZCE","AP999",9,0,vinfo,vinfoid))
        elif (self.ui.rb19.isChecked()):
            self.ui.textEdit_3.append("==========SHFE======螺纹合约交易时间段=========================\n")
            tvapi1.GetOutExchangeTradeTimes("SHFE","rb9999") 
            self.ui.textEdit_3.append('================获取全部交易所全部合约交易时间段=========================')
            tvapi1.GetOutExchangeTradeTimes("","")
            
        
    # 查询操作结束
    def printFunc_OuttextEdit(self,vstr):    
        self.ms.text_OuttextEdit.emit(self.ui.textEdit_3,vstr)
              
    def pF_OuttextEdit(self,pt,vstr):#
        pt.append(vstr)
    
    def printFunc(self,vstr,vint):    #登录过程中查询相关信息时的进度条显示 线程调用显示进度条。
        self.ms.text_print.emit(self.ui.label_7,self.ui.progressBar,vstr,vint)
              
    def pF(self,pt,pb,vstr,int1):
        pt.setText(vstr)
        pb.setValue(int1)
        
    def printFunc_MarketData(self,InstrumentID,LastPrice,Volume,BidPrice1,BidVolume1,AskPrice1,AskVolume1,BidPrice5,BidVolume5,AskPrice5,AskVolume5,UpdateTime):    #订阅行情推送信息的 线程调用刷新行情表格。
        self.ms.text_MarketData.emit(self.ui.tableView_4,InstrumentID,LastPrice,Volume,BidPrice1,BidVolume1,AskPrice1,AskVolume1,BidPrice5,BidVolume5,AskPrice5,AskVolume5,UpdateTime)
        
    def pF_MarketData(self,ptv,InstrumentID,LastPrice,Volume,BidPrice1,BidVolume1,AskPrice1,AskVolume1,BidPrice5,BidVolume5,AskPrice5,AskVolume5,UpdateTime):
        finded = 0
        findrow = -1
        tmpmodel = ptv.model()
        j = tmpmodel.rowCount()
        for row in range(j):
            if (tmpmodel.item(row,0).text()==InstrumentID or tmpmodel.item(row,0).text()==""):
                k = 0 
                for column in [InstrumentID,LastPrice,Volume,BidPrice1,BidVolume1,AskPrice1,AskVolume1,BidPrice5,BidVolume5,AskPrice5,AskVolume5,UpdateTime]:
                    #item = QStandardItem(f"{column}")
                    #tmpmodel.setItem(findrow,k,QStandardItem(f"{column}"))
                    tmpmodel.item(row,k).setText(f"{column}")
                    k = k+1
                finded = 1
                break
        j = 0
        if (finded==0):
            item0 = QStandardItem('%s' % InstrumentID)
            item1 = QStandardItem('%.2f' % LastPrice)
            item2 = QStandardItem('%d' % Volume)
            item3 = QStandardItem('%.2f' % BidPrice1)
            item4 = QStandardItem('%d' % BidVolume1)
            item5 = QStandardItem('%.2f' % AskPrice1)
            item6 = QStandardItem('%d' % AskVolume1)
            item7 = QStandardItem('%.2f' % BidPrice5)
            item8 = QStandardItem('%d' % BidVolume5)
            item9 = QStandardItem('%.2f' % AskPrice5)
            item10 = QStandardItem('%d' % AskVolume5)
            item11 = QStandardItem('%s' % UpdateTime)
            tmpmodel.appendRow([item0,item1,item2,item3,item4,item5,item6,item7,item8,item9,item10,item11])
        
    def AppText(self,*args):
        try:
            self.ui.textEdit_3.append(str(args))
        except BaseException as e:
            traceback.print_exc()
        
    def AppText2(self,*args):
        try:
            self.ui.textEdit_3.append(str(args))
        except BaseException as e:
            traceback.print_exc()
        

    def AppText3(self,*args):
        try:
            self.ui.textEdit_3.append(str(args))
        except BaseException as e:
            traceback.print_exc()
        
    def Login(self):  #登录按钮事件
        errmsg=""
        errid = 1
        errid,errmsg = tvapi1.Login("config.ini",self.ui.UserName.text(),self.ui.PassWord.text(),errid,errmsg)
        Mui.AppText([errid,errmsg])
        
        
    def LogOut(self):#退出登录按钮事件
        tvapi1.LogOut()
        self.ui.textEdit_3.clear()
    def bSubIns(self):
        tvapi1.SubscribeDepthMD(self.ui.edtIns.text());#订阅深度五档行情
    def bUnSubIns(self):
        tvapi1.UnSubscribeMD(self.ui.edtIns.text());#订阅深度五档行情
        
    def printFunc_OnOrder(self,vins):    #根据订单回报推送的合约信息 线程调用刷新此合约持仓数据表格。
        self.ms.text_OnOrder.emit(tvapi1,self.ui.gridpositions,vins)
              
    def pF_OnOrder(self,vtv,ptv,vins):
        LongPostion = 0
        LongYdPostion = 0
        LongFrozen = 0
        LongSuspendPostion = 0
        LPrice = 0.0
        LongProfit =0.0
        ShortPostion =0
        ShortYDPostion = 0
        ShortFrozen = 0
        ShortSuspendPostion = 0
        SPrice= 0.0
        shortfit= 0.0
        bidprice= 0.0
        askprice =0.0
        try:
            LongPostion, LongYdPostion, LongFrozen, LongSuspendPostion,LPrice,LongProfit,ShortPostion,ShortYDPostion,ShortFrozen,\
                     ShortSuspendPostion,SPrice,shortfit,bidprice,askprice = vtv.GetPositionPlus(vins,LongPostion,\
                     LongYdPostion, LongFrozen,LongSuspendPostion,LPrice,LongProfit,ShortPostion,ShortYDPostion,ShortFrozen,ShortSuspendPostion,SPrice,shortfit,bidprice,askprice)
            finded = 0
            findrow = -1
            tmpmodel = ptv.model()
            j = tmpmodel.rowCount()
            finded = 0
            for row in range(j):
                if (tmpmodel.item(row,0).text()==vins and tmpmodel.item(row,1).text()=="  卖"):
                    k = 2
                    for column in [ShortPostion,ShortYDPostion,ShortFrozen,ShortSuspendPostion,SPrice,shortfit]:
                        #item = QStandardItem(f"{column}")  #持续增加内存 不采用。
                        #tmpmodel.setItem(row,k,item)
                        tmpmodel.item(row,k).setText(f"{column}")
                        k = k+1
                    m = 2
                    for column in [LongPostion, LongYdPostion, LongFrozen, LongSuspendPostion,LPrice,LongProfit]:
                        #item = QStandardItem(f"{column}")  #持续增加内存 不采用。
                        #tmpmodel.setItem(row+1,m,item)
                        tmpmodel.item(row+1,m).setText(f"{column}")
                        m = m+1
                    finded = 1
                    break
                if (tmpmodel.item(row,0).text()==""):
                    k = 0
                    for column in [vins,"  卖",ShortPostion,ShortYDPostion,ShortFrozen,ShortSuspendPostion,SPrice,shortfit]:
                        #item = QStandardItem(f"{column}")  #持续增加内存 不采用。
                        #tmpmodel.setItem(row,k,item)
                        tmpmodel.item(row,k).setText(f"{column}")
                        k = k+1
                    m = 0
                    for column in [vins,"买  ",LongPostion, LongYdPostion, LongFrozen, LongSuspendPostion,LPrice,LongProfit]:
                        #item = QStandardItem(f"{column}")  #持续增加内存 不采用。
                        #tmpmodel.setItem(row+1,m,item)
                        tmpmodel.item(row+1,m).setText(f"{column}")
                        m = m+1
                    finded = 1
                    break
            if (finded==0):
                item0 = QStandardItem('%s' % vins)
                item1 = QStandardItem('%s' % "  卖")
                item2 = QStandardItem('%d' % ShortPostion)
                item3 = QStandardItem('%d' % ShortYDPostion)
                item4 = QStandardItem('%d' % ShortFrozen)
                item5 = QStandardItem('%d' % ShortSuspendPostion)
                item6 = QStandardItem('%.2f' % SPrice)
                item7 = QStandardItem('%.2f' % shortfit)
                item8 = QStandardItem('%.2f' % bidprice)
                item9 = QStandardItem('%.2f' % askprice)
                tmpmodel.appendRow([item0,item1,item2,item3,item4,item5,item6,item7,item8,item9])
                item0 = QStandardItem('%s' % vins)
                item1 = QStandardItem('%s' % "买  ")
                item2 = QStandardItem('%d' % LongPostion)
                item3 = QStandardItem('%d' % LongYdPostion)
                item4 = QStandardItem('%d' % LongFrozen)
                item5 = QStandardItem('%d' % LongSuspendPostion)
                item6 = QStandardItem('%.2f' % LPrice)
                item7 = QStandardItem('%.2f' % LongProfit)
                item8 = QStandardItem('%.2f' % bidprice)
                item9 = QStandardItem('%.2f' % askprice)
                tmpmodel.appendRow([item0,item1,item2,item3,item4,item5,item6,item7,item8,item9])
                    
        except BaseException as e:
            traceback.print_exc()
    def printFunc_PositionProfit(self):    #每秒定时刷新持仓盈亏的 线程调用刷新持仓表格。
        self.ms.text_PositionProfit.emit(tvapi1,self.ui.gridpositions)
              
    def pF_PositionProfit(self,vtv,ptv):
        finded = 0
        findrow = -1
        tmpmodel = ptv.model()
        j = tmpmodel.rowCount()
        LongPostion = 0
        LongYdPostion = 0
        LongFrozen = 0
        LongSuspendPostion = 0
        LPrice = 0.0
        LongProfit =0.0
        ShortPostion =0
        ShortYDPostion = 0
        ShortFrozen = 0
        ShortSuspendPostion = 0
        SPrice= 0.0
        shortfit= 0.0
        bidprice= 0.0
        askprice =0.0
        for row in range(j):
            if (tmpmodel.item(row,1).text()=="  卖"):
                LongPostion, LongYdPostion, LongFrozen, LongSuspendPostion,LPrice,LongProfit,ShortPostion,ShortYDPostion,ShortFrozen,\
                             ShortSuspendPostion,SPrice,shortfit,bidprice,askprice = vtv.GetPositionPlus(tmpmodel.item(row,0).text(),LongPostion,\
                             LongYdPostion, LongFrozen,LongSuspendPostion,LPrice,LongProfit,ShortPostion,ShortYDPostion,ShortFrozen,ShortSuspendPostion,SPrice,shortfit,bidprice,askprice)
                k = 6
                for column in [SPrice,shortfit,bidprice,askprice]:
                    #item = QStandardItem(f"{column}")  #持续增加内存 不采用。
                    #tmpmodel.setItem(row,k,item)
                    tmpmodel.item(row,k).setText(f"{column}")
                    k = k+1
                m = 6
                for column in [LPrice,LongProfit,bidprice,askprice]:
                    #item = QStandardItem(f"{column}")  #持续增加内存 不采用。
                    #tmpmodel.setItem(row+1,m,item)
                    tmpmodel.item(row+1,m).setText(f"{column}")
                    m = m+1
                    
    def printFunc_OnOrderLst(self,OrderID,OrderLocalID,OrderSysID,BrokerOrderSeq,InstrumentID,IsBuy,IsOpen,OrderStatus, Volume,TradedVolume,Price,ErrorID,InsertTime,ErrorMsg):    #订单回报信息推送后添加到订单列表表格 的线程调用刷新订单列表表格
        self.ms.text_OnOrderLst.emit(self.ui.tableView_2,OrderID,OrderLocalID,OrderSysID,BrokerOrderSeq,InstrumentID,IsBuy,IsOpen,OrderStatus, Volume,TradedVolume,Price,ErrorID,InsertTime,ErrorMsg)
              
    def pF_OnOrderLst(self,ptv,OrderID,OrderLocalID,OrderSysID,BrokerOrderSeq,InstrumentID,IsBuy,IsOpen,OrderStatus, Volume,TradedVolume,Price,ErrorID,InsertTime,ErrorMsg):
        if (IsBuy==0):
            tmpbuy  = '买 '
        else:
            tmpbuy  = ' 卖'
            
        if (IsOpen==0):
            tmpopen = '开 '
        else:
            tmpopen = ' 平'
            
        tmpmodel = ptv.model()
        j = tmpmodel.rowCount()
        finded = 0
        for row in range(j):
            if (tmpmodel.item(row,0).text()==""):
                k = 0
                for column in [OrderID,InstrumentID,IsBuy,IsOpen,Volume,TradedVolume,Price,Price,InsertTime,ErrorMsg]:
                    #item = QStandardItem(f"{column}")    #持续增加内存 不采用。
                    #tmpmodel.setItem(row,k,item)
                    tmpmodel.item(row,k).setText(f"{column}")
                    k = k+1
                finded = 1
                break
            if (tmpmodel.item(row,0).text()==str(OrderID)):
                k = 4
                for column in [Volume,TradedVolume,Price,Price,InsertTime,ErrorMsg]:
                    #item = QStandardItem(f"{column}")   #持续增加内存 不采用。
                    #tmpmodel.setItem(row,k,item)
                    tmpmodel.item(row,k).setText(f"{column}")
                    k = k+1
                finded = 1
                break
        
        if (finded==0):
            """
            item0 = QStandardItem('%d' % OrderID)
            item1 = QStandardItem('%s' % InstrumentID)
            item2 = QStandardItem('%s' % tmpbuy)
            item3 = QStandardItem('%s' % tmpopen)
            item4 = QStandardItem('%d' % Volume)
            item5 = QStandardItem('%d' % TradedVolume)
            item6 = QStandardItem('%.2f' % Price)
            item7 = QStandardItem('%.2f' % Price)
            item8 = QStandardItem('%s' % InsertTime)
            item9 = QStandardItem('%s' % ErrorMsg)
            """
            #tmpmodel.appendRow([item0,item1,item2,item3,item4,item5,item6,item7,item8,item9])
            tmpmodel.insertRow(0,[QStandardItem('%d' % OrderID),QStandardItem('%s' % InstrumentID),QStandardItem('%s' % tmpbuy),QStandardItem('%s' % tmpopen),\
                                  QStandardItem('%d' % Volume),QStandardItem('%d' % TradedVolume),QStandardItem('%.2f' % Price),QStandardItem('%.2f' % Price),\
                                  QStandardItem('%s' % InsertTime),QStandardItem('%s' % ErrorMsg)])

    def printFunc_OutBars(self,InstrumentID,Period,Counts,Hight,Low,Open,Close,CreatTime):    #获取账户资金信息的线程调用账户资金表格
        self.ms.text_OutBars.emit(tvapi1,self.ui.textEdit_3,InstrumentID,Period,Counts,Hight,Low,Open,Close,CreatTime)
              
    def pF_OutBars(self,vtv,vedt3,InstrumentID,Period,Counts,Hight,Low,Open,Close,CreatTime):
        vedt3.append(str(["OnOutBars:",InstrumentID,"周期",Period,"计数器",Counts,"最高",Hight,"最低",Low,"开",Open,"平",Close,"时间",CreatTime]))
        ma10 = .0 
        ma10 = vtv.MA(InstrumentID,Period,10,ma10);
        ema12 = .0 
        ema12 = vtv.EMA(InstrumentID,Period,12,ema12);
        ema26 = .0 
        ema26 = vtv.EMA(InstrumentID,Period,26,ema26);
        diff1 = .0
        dea1 = .0
        macd1 = MyUseVar.MinDouble
        diff1,dea1 = vtv.MACD(InstrumentID,Period,diff1,dea1);
        if ((diff1>MyUseVar.MinDouble) and (dea1>MyUseVar.MinDouble)):
            macd1 = 2*(diff1-dea1)
        Defdiff1 = .0
        Defdea1 = .0
        Defmacd1 = MyUseVar.MinDouble
        Defdiff1,Defdea1 = vtv.DefMACD(InstrumentID,Period,12,26,9,Defdiff1,Defdea1);
        if ((Defdiff1>MyUseVar.MinDouble) and (Defdea1>MyUseVar.MinDouble)):
            Defmacd1 = 2*(Defdiff1-Defdea1)
        vedt3.append("InstrumentID:{0} Period:{1} Ma10:{2} ---macd:{3} ---diff:{4} ---dea:{5} ema12:{6} ema26:{7}\n".format(InstrumentID, Period, ma10,macd1,diff1,dea1,ema12,ema26))
        vedt3.append("InstrumentID:{0} Period:{1} Ma10:{2} Defmacd:{3} Defdiff:{4} Defdea:{5} ema12:{6} ema26:{7}\n".format(InstrumentID, Period, ma10, Defmacd1,Defdiff1,Defdea1,ema12,ema26))
        
    def printFunc_Account(self):    #获取账户资金信息的线程调用账户资金表格
        self.ms.text_Account.emit(tvapi1,self.ui.tableView,self.ui.label_10)
              
    def pF_Account(self,vtv,ptv,vlab):
        vlab.setText("当前时间:%s" % time.strftime("%Y-%m_%d %H:%M:%S",time.localtime()))
        PreBalance = .0
        Balance = .0
        PreMargin =.0
        Available  =.0
        WithdrawQuota  =.0
        ExchangeMargin  =.0
        CloseProfit  =.0
        PositionProfit  =.0
        tmpmodel = ptv.model()
        j = 0
        PreBalance,Balance,PreMargin,Available,WithdrawQuota,ExchangeMargin,CloseProfit,PositionProfit = vtv.GetAccount(PreBalance,Balance,PreMargin,Available,WithdrawQuota,ExchangeMargin,CloseProfit ,PositionProfit)
        for column in [PreBalance,Balance,PreMargin,Available,WithdrawQuota,ExchangeMargin ,PositionProfit,CloseProfit]:
            #item = QStandardItem(f"{column}")   #持续增加内存 不采用。
            #tmpmodel.setItem(0,j,item)
            tmpmodel.item(0,j).setText(f"{column}")
            j = j+1
        ptv.resizeColumnsToContents()
    def btnopencloseclick(self):
        MyUseVar.BeginOpenClose = 1 - MyUseVar.BeginOpenClose 
        if (MyUseVar.BeginOpenClose==0):
            self.ui.btnopenclose.setText("开始进行循环开平仓测试")
        else:
            self.ui.btnopenclose.setText("停止进行循环开平仓测试")
            tvapi1.SubscribeDepthMD(self.ui.edtIns.text());#订阅深度五档行情
    
    #=============OnTmr()===================以下代码为定时刷新账户资金、持仓盈亏数据及循环开平仓操作代码====================================================
    #def OnInitFinished(self):事件中启用printFunc_OpenClose线程循环
    def printFunc_OpenClose(self):    #登录过程中查询相关信息时的进度条显示 线程调用显示进度条。
        while True:
            #print("Interval:",MyUseVar.Interval,"BeginOpenClose:",MyUseVar.BeginOpenClose,"RunFlag:",MyUseVar.RunFlag,"vWaitCancleInt:",MyUseVar.vWaitCancleInt,"vWaitOrderInt:",MyUseVar.vWaitOrderInt)
            time.sleep(MyUseVar.Interval)#延时1秒 #延时50毫秒
            #print("vWaitInOrder:",MyUseVar.vWaitInOrder,"BeginOpenClose:",MyUseVar.BeginOpenClose,"RunFlag:",MyUseVar.RunFlag,"vWaitCancleInt:",MyUseVar.vWaitCancleInt,"vWaitOrderInt:",MyUseVar.vWaitOrderInt)
            if (MyUseVar.RunFlag==1 and MyUseVar.BeginOpenClose==1):
                self.ms.text_OpenClose.emit(tvapi1,self.ui.textEdit) #加入此代码后循环中占用内存会逐步增大,不知为何
            NewSec = time.strftime("%S",time.localtime())
            if (MyUseVar.RefSec!=NewSec):
                MyUseVar.RefSec = NewSec
                if (MyUseVar.RunFlag==1):
                    self.ms.text_Account.emit(tvapi1,self.ui.tableView,self.ui.label_10)             #加入此代码后循环中占用内存会逐步增大,不知为何
                    self.ms.text_PositionProfit.emit(tvapi1,self.ui.gridpositions)  #加入此代码后循环中占用内存会逐步增大,不知为何
                    #self.snapshot2 = tracemalloc.take_snapshot()  #建立一个新的内存快照
                    #self.top_stats = self.snapshot2.compare_to(self.snapshot1, 'lineno')  #比较两个内存快照
                    #for stat in self.top_stats[:10]:  #打印内存快照区别
                    #    print(stat)

    def pF_OpenClose(self,vtv,vte):
        MyUseVar.sInstrumentID = self.ui.edtIns.text()
        if (MyUseVar.vloop==0):  #获取持仓仓位 订单是否可撤 
            vd1=.0
            vd2=.0
            vte.append("===================================================================================")
            MyUseVar.MyPostion.LongPostion,MyUseVar.MyPostion.LongYDPostion,MyUseVar.MyPostion.LongFrozen,\
                    vd1,MyUseVar.MyPostion.ShortPostion,MyUseVar.MyPostion.ShortYDPostion,\
                    MyUseVar.MyPostion.ShortFrozen,vd2  = vtv.GetPosition(MyUseVar.sInstrumentID,\
                    MyUseVar.MyPostion.LongPostion,MyUseVar.MyPostion.LongYDPostion,\
                    MyUseVar.MyPostion.LongFrozen,vd1,MyUseVar.MyPostion.ShortPostion,MyUseVar.MyPostion.ShortYDPostion,\
                    MyUseVar.MyPostion.ShortFrozen,vd2)
            vte.append("{6} 多头仓位:{0} 昨仓:{1} 冻结仓位:{2} 空头仓位:{3} 昨仓:{4} 冻结仓位:{5}".\
                       format(MyUseVar.MyPostion.LongPostion,MyUseVar.MyPostion.LongYDPostion,MyUseVar.MyPostion.LongFrozen,\
                              MyUseVar.MyPostion.ShortPostion,MyUseVar.MyPostion.ShortYDPostion,\
                              MyUseVar.MyPostion.ShortFrozen,MyUseVar.sInstrumentID))
            MyUseVar.vIsCanC = 0
            MyUseVar.vIsCanC1 = 0
            MyUseVar.vIsCanC2 = 0
            MyUseVar.vIsCanC3 = 0
            if (MyUseVar.MyPostion.LongOrder > 0 or MyUseVar.MyPostion.LongOrder1 > 0 or
                MyUseVar.MyPostion.ShortOrder > 0 or MyUseVar.MyPostion.ShortOrder1 > 0 ):  #有订单号时 判断是否有可撤订单
                if (MyUseVar.MyPostion.LongOrder>0):
                    MyUseVar.vIsCanC = vtv.IsOrderOpen(MyUseVar.MyPostion.LongOrder,MyUseVar.vIsCanC);
                    vte.append("LongOrder订单:{0} 是否可撤:{1} (0 :不可撤 1:可撤)".format(MyUseVar.MyPostion.LongOrder,MyUseVar.vIsCanC))
                if (MyUseVar.MyPostion.LongOrder1>0):
                    MyUseVar.vIsCanC1 = vtv.IsOrderOpen(MyUseVar.MyPostion.LongOrder1,MyUseVar.vIsCanC1);
                    vte.append("LongOrder1订单:{0} 是否可撤:{1} (0 :不可撤 1:可撤)".format(MyUseVar.MyPostion.LongOrder1,MyUseVar.vIsCanC1))
                if (MyUseVar.MyPostion.ShortOrder>0):
                    MyUseVar.vIsCanC2 = vtv.IsOrderOpen(MyUseVar.MyPostion.ShortOrder,MyUseVar.vIsCanC2);
                    vte.append("ShortOrder订单:{0} 是否可撤:{1} (0 :不可撤 1:可撤)".format(MyUseVar.MyPostion.ShortOrder,MyUseVar.vIsCanC2))
                if (MyUseVar.MyPostion.ShortOrder1>0):
                    MyUseVar.vIsCanC3 = vtv.IsOrderOpen(MyUseVar.MyPostion.ShortOrder1,MyUseVar.vIsCanC3);
                    vte.append("ShortOrder1订单:{0} 是否可撤:{1} (0 :不可撤 1:可撤)".format(MyUseVar.MyPostion.ShortOrder1,MyUseVar.vIsCanC3))
                #结束判断订单是否可撤
            if (MyUseVar.vIsCanC==1 or MyUseVar.vIsCanC1==1 or MyUseVar.vIsCanC2==1 or MyUseVar.vIsCanC3==1 ):
                MyUseVar.vloop = 1
            else:
                MyUseVar.vloop = 4
        #结束vloop=0 步骤
        if (MyUseVar.vloop==1):  #有订单可撤时 等待时间
            MyUseVar.vWaitInCancle = MyUseVar.vWaitInCancle +1
            if (MyUseVar.vWaitInCancle>=MyUseVar.vWaitCancleInt):
                MyUseVar.vWaitInCancle = 0
                MyUseVar.vloop = 2
            #结束判断撤单后时间间隔
        #结束vloop=1 步骤
        if (MyUseVar.vloop==2):  #有订单可撤 撤单
            if (MyUseVar.vIsCanC==1):  #longorder可撤
                vtv.CancelOrder(MyUseVar.MyPostion.LongOrder, MyUseVar.vIsCanC)
                vte.append("LongOrder订单:{0} 空头撤单 状态:{1}【0:撤单成功 其它:撤单不成功】".format(MyUseVar.MyPostion.LongOrder,MyUseVar.vIsCanC))
            if (MyUseVar.vIsCanC1==1):  #longorder可撤
                vtv.CancelOrder(MyUseVar.MyPostion.LongOrder1, MyUseVar.vIsCanC)
                vte.append("LongOrder1订单:{0} 空头撤单 状态:{1}【0:撤单成功 其它:撤单不成功】".format(MyUseVar.MyPostion.LongOrder1,MyUseVar.vIsCanC))
            if (MyUseVar.vIsCanC2==1):  #longorder可撤
                vtv.CancelOrder(MyUseVar.MyPostion.ShortOrder, MyUseVar.vIsCanC)
                vte.append("ShortOrder订单:{0} 空头撤单 状态:{1}【0:撤单成功 其它:撤单不成功】".format(MyUseVar.MyPostion.ShortOrder,MyUseVar.vIsCanC))
            if (MyUseVar.vIsCanC3==1):  #longorder可撤
                vtv.CancelOrder(MyUseVar.MyPostion.ShortOrder1, MyUseVar.vIsCanC)
                vte.append("ShortOrder1订单:{0} 空头撤单 状态:{1}【0:撤单成功 其它:撤单不成功】".format(MyUseVar.MyPostion.ShortOrder1,MyUseVar.vIsCanC))
            MyUseVar.vloop=3
        #有订单可撤 撤单结束 vloop==2
        if (MyUseVar.vloop==3):  #有订单可撤时 等待时间
            MyUseVar.vWaitInCancle = MyUseVar.vWaitInCancle +1
            if (MyUseVar.vWaitInCancle>=MyUseVar.vWaitCancleInt):
                MyUseVar.vWaitInCancle = 0
                MyUseVar.vloop = 4
            #结束判断撤单后时间间隔
        #结束vloop=1 步骤
        if (MyUseVar.vloop==4):  #循环开平仓开始 random.randint(1,10)
            vrandtvol = random.randint(1,MyUseVar.vVolT)  # 产生随机开平仓手数量
            #==================多头开平仓操作=================================
            if (MyUseVar.MyPostion.LongPostion>0 and MyUseVar.MyPostion.LongPostion<vrandtvol):
                if (MyUseVar.MyPostion.LongOrderFlag == 1 ) :#上次平仓
                    vrandvol = random.randint(1,MyUseVar.MyPostion.LongPostion); # 产生随机开平仓手数量
                    MyUseVar.MyPostion.LongOrder, MyUseVar.MyPostion.LongOrder1 = vtv.Sell(MyUseVar.sInstrumentID, vrandvol,
                            MyUseVar.vMyBidPrice, MyUseVar.MyPostion.LongOrder, MyUseVar.MyPostion.LongOrder1)
                    vte.append("订单:{0} 订单:{2} 继续平多头仓位:{1} 价格:{3:.2f}".format(MyUseVar.MyPostion.LongOrder,vrandvol, MyUseVar.MyPostion.LongOrder1,MyUseVar.vMyBidPrice))
                else:   #  MyPostion.LongOrderFlag != 1时
                    vrandvol = random.randint(1,MyUseVar.vVolT); # 产生随机开平仓手数量
                    MyUseVar.MyPostion.LongOrder = vtv.Buy(MyUseVar.sInstrumentID, vrandvol,MyUseVar.vMyAskPrice, MyUseVar.MyPostion.LongOrder)
                    vte.append("订单:{0} 继续多头买开仓:{1} 价格:{2:.2f}".format(MyUseVar.MyPostion.LongOrder,vrandvol,MyUseVar.vMyAskPrice))
                #结束 上次平仓 MyPostion.LongOrderFlag = 1
            else:   #  条件:MyPostion.LongPostion>0 and MyPostion.LongPostion<vrandtvol不成立 时
                if (MyUseVar.MyPostion.LongPostion>vrandtvol):#  持仓量多 平多头多余仓位
                    vrandvol = random.randint(1,vrandtvol);
                    MyUseVar.MyPostion.LongOrder, MyUseVar.MyPostion.LongOrder1 = vtv.Sell(MyUseVar.sInstrumentID, vrandvol,MyUseVar.vMyBidPrice,
                          MyUseVar.MyPostion.LongOrder, MyUseVar.MyPostion.LongOrder1)
                    vte.append("订单:{0} 订单:{2} 平多头多余仓位:{1} 价格:{3:.2f}".format(MyUseVar.MyPostion.LongOrder,vrandvol, MyUseVar.MyPostion.LongOrder1,MyUseVar.vMyBidPrice))
                #  结束 MyPostion.LongPostion>vrandtvol
                if (MyUseVar.MyPostion.LongPostion<=0): #无持仓时
                    vrandvol = random.randint(1,MyUseVar.vVolT);
                    MyUseVar.MyPostion.LongOrder = vtv.Buy(MyUseVar.sInstrumentID, vrandvol ,MyUseVar.vMyAskPrice, MyUseVar.MyPostion.LongOrder)
                    vte.append("订单:{0} 多头买开仓:{1} 价格:{2:.2f}".format(MyUseVar.MyPostion.LongOrder,vrandvol,MyUseVar.vMyAskPrice ))
                #  结束 无持仓时
                if ((MyUseVar.MyPostion.LongPostion<=vrandtvol) and (MyUseVar.MyPostion.LongPostion>0)):
                    vrandvol = random.randint(1,MyUseVar.MyPostion.LongPostion);
                    MyUseVar.MyPostion.LongOrder, MyUseVar.MyPostion.LongOrder1 = vtv.Sell(MyUseVar.sInstrumentID, vrandvol,
                                            MyUseVar.vMyBidPrice, MyUseVar.MyPostion.LongOrder, MyUseVar.MyPostion.LongOrder1)
                    MyUseVar.MyPostion.LongOrderFlag = 1;
                    vte.append("订单:{0} 订单:{2} 多头平仓:{1} 价格:{3:.2f}".format(MyUseVar.MyPostion.LongOrder,vrandvol , MyUseVar.MyPostion.LongOrder1,MyUseVar.vMyBidPrice))
                #  结束 持仓时
            #结束 (MyPostion.LongPostion>0 and MyPostion.LongPostion<vrandtvol):
            #==================多头开平仓操作=================================
            #==================空头开平仓操作=================================
            if (MyUseVar.MyPostion.ShortPostion>0 and MyUseVar.MyPostion.ShortPostion<vrandtvol):
                if (MyUseVar.MyPostion.ShortOrderFlag == 1 ) :#上次平仓
                    vrandvol = random.randint(1,MyUseVar.MyPostion.ShortPostion); # 产生随机开平仓手数量
                    MyUseVar.MyPostion.ShortOrder, MyUseVar.MyPostion.ShortOrder1 = vtv.Cover(MyUseVar.sInstrumentID, vrandvol,
                            MyUseVar.vMyAskPrice, MyUseVar.MyPostion.ShortOrder, MyUseVar.MyPostion.ShortOrder1)
                    vte.append("订单:{0} 订单:{2} 继续平空头仓位:{1} 价格:{3:.2f}".format(MyUseVar.MyPostion.ShortOrder,vrandvol, MyUseVar.MyPostion.ShortOrder1,MyUseVar.vMyAskPrice))
                else:   #  MyPostion.ShortOrderFlag != 1时
                    vrandvol = random.randint(1,MyUseVar.vVolT); # 产生随机开平仓手数量
                    MyUseVar.MyPostion.ShortOrder = vtv.Short(MyUseVar.sInstrumentID, vrandvol,MyUseVar.vMyBidPrice, MyUseVar.MyPostion.ShortOrder)
                    vte.append("订单:{0} 继续空头卖开仓:{1} 价格:{2:.2f}".format(MyUseVar.MyPostion.ShortOrder,vrandvol,MyUseVar.vMyBidPrice))
                #结束 上次平仓 MyPostion.ShortOrderFlag = 1
            else:   #  条件:MyPostion.ShortPostion>0 and MyPostion.ShortPostion<vrandtvol不成立 时
                if (MyUseVar.MyPostion.ShortPostion>vrandtvol):#  持仓量多 平多头多余仓位
                    vrandvol = random.randint(1,vrandtvol);
                    MyUseVar.MyPostion.ShortOrder, MyUseVar.MyPostion.ShortOrder1 = vtv.Cover(MyUseVar.sInstrumentID, vrandvol,MyUseVar.vMyAskPrice,
                           MyUseVar.MyPostion.ShortOrder, MyUseVar.MyPostion.ShortOrder1)
                    vte.append("订单:{0} 订单:{2} 平空头多余仓位:{1} 价格:{3:.2f}".format(MyUseVar.MyPostion.ShortOrder,vrandvol, MyUseVar.MyPostion.ShortOrder1,MyUseVar.vMyAskPrice))
                #  结束 MyPostion.ShortPostion>vrandtvol
                if (MyUseVar.MyPostion.ShortPostion<=0): #无持仓时
                    vrandvol = random.randint(1,MyUseVar.vVolT);
                    MyUseVar.MyPostion.ShortOrder = vtv.Short(MyUseVar.sInstrumentID, vrandvol ,MyUseVar.vMyBidPrice, MyUseVar.MyPostion.ShortOrder)
                    vte.append("订单:{0} 空头卖开仓:{1} 价格:{2:.2f}".format(MyUseVar.MyPostion.ShortOrder,vrandvol,MyUseVar.vMyBidPrice ))
                #  结束 无持仓时
                if ((MyUseVar.MyPostion.ShortPostion<=vrandtvol) and (MyUseVar.MyPostion.ShortPostion>0)):
                    vrandvol = random.randint(1,MyUseVar.MyPostion.ShortPostion);
                    MyUseVar.MyPostion.ShortOrder, MyUseVar.MyPostion.ShortOrder1 = vtv.Cover(MyUseVar.sInstrumentID, vrandvol,
                                            MyUseVar.vMyAskPrice, MyUseVar.MyPostion.ShortOrder, MyUseVar.MyPostion.ShortOrder1)
                    MyUseVar.MyPostion.ShortOrderFlag = 1;
                    vte.append("订单:{0} 订单:{2} 空头平仓:{1} 价格:{3:.2f}".format(MyUseVar.MyPostion.ShortOrder,vrandvol , MyUseVar.MyPostion.ShortOrder1,MyUseVar.vMyAskPrice))
                #  结束 持仓时
            #结束 (MyPostion.ShortPostion>0 and MyPostion.ShortPostion<vrandtvol):
            #==================空头开平仓操作=================================
            MyUseVar.vloop = 5
        #结束循环开平仓 vloop=4 步骤
        if (MyUseVar.vloop==5):  #有等待时间
            MyUseVar.vWaitInOrder = MyUseVar.vWaitInOrder +1
            if (MyUseVar.vWaitInOrder>=MyUseVar.vWaitOrderInt):
                MyUseVar.vWaitInOrder = 0
                MyUseVar.vloop = 0
                vte.append("===================================================================================")
            #结束时间间隔
        #结束vloop=5 步骤        

        pass
        #try:
        #except BaseException as e:
        #    traceback.print_exc()
    #=============OnTmr()===================以上代码为定时刷新账户资金、持仓盈亏数据及循环开平仓操作代码====================================================
        
if __name__ == "__main__":
    app = QApplication([])#sys.argv
    #MainWindow = QtWidgets.QMainWindow()
    Mui = Ui_UiMainWindow()
    Mui.ui.show()
    Mui.ui.textEdit_3.append("QQ:426075")
    tvapi1 = win32com.client.DispatchWithEvents("TVQhtICtpClientAPI.com.1",myevents)   #创建CTPCOM组件实例 并将事件回调映射到自定义类事件中
    sys.exit(app.exec_())
    #app.exec_()
# -*- coding: mbcs -*-
# Created by makepy.py version 0.5.01
# By python version 3.10.1 (tags/v3.10.1:2cd268a, Dec  6 2021, 19:10:37) [MSC v.1929 64 bit (AMD64)]
# From type library 'TopViewQHTCtpCom.dll'
# On Mon Jan 16 09:54:20 2023
''
makepy_version = '0.5.01'
python_version = 0x30a01f0

import win32com.client.CLSIDToClass, pythoncom, pywintypes
import win32com.client.util
from pywintypes import IID
from win32com.client import Dispatch

# The following 3 lines may need tweaking for the particular server
# Candidates are pythoncom.Missing, .Empty and .ArgNotFound
defaultNamedOptArg=pythoncom.Empty
defaultNamedNotOptArg=pythoncom.Empty
defaultUnnamedArg=pythoncom.Empty

CLSID = IID('{22113AE6-06DA-4875-AE8A-1F4AE4219D3B}')
MajorVersion = 1
MinorVersion = 0
LibraryFlags = 8
LCID = 0x0

from win32com.client import DispatchBaseClass
class ITVQhtICtpClientAPI(DispatchBaseClass):
    CLSID = IID('{FD3E2400-1A18-45E4-8DAF-DE8840F22C8D}')
    coclass_clsid = IID('{4F356EF1-932E-48D1-B7A4-CFDE79752627}')

    def About(self):
        return self._oleobj_.InvokeTypes(20, LCID, 1, (24, 0), (),)

    def AppendExchangeTradeTimes(self, ExchangeID=defaultNamedNotOptArg, InstrumentID=defaultNamedNotOptArg, hour=defaultNamedNotOptArg, minute=defaultNamedNotOptArg
            , TradeTimes=defaultNamedNotOptArg, Flag=defaultNamedNotOptArg, InfoID=pythoncom.Missing, InfoMsg=pythoncom.Missing):
        return self._ApplyTypes_(40, 1, (24, 0), ((8, 1), (8, 1), (3, 1), (3, 1), (3, 1), (3, 1), (16387, 2), (16392, 2)), 'AppendExchangeTradeTimes', None,ExchangeID
            , InstrumentID, hour, minute, TradeTimes, Flag
            , InfoID, InfoMsg)

    def Buy(self, pszInstrumentID=defaultNamedNotOptArg, Volume=defaultNamedNotOptArg, Price=defaultNamedNotOptArg, OrderID=pythoncom.Missing):
        return self._ApplyTypes_(6, 1, (24, 0), ((8, 1), (3, 1), (5, 1), (16387, 2)), 'Buy', None,pszInstrumentID
            , Volume, Price, OrderID)

    def CancelOrder(self, OrderID=defaultNamedNotOptArg, Status=pythoncom.Missing):
        return self._ApplyTypes_(2, 1, (24, 0), ((3, 1), (16387, 2)), 'CancelOrder', None,OrderID
            , Status)

    def Cover(self, pszInstrumentID=defaultNamedNotOptArg, Volume=defaultNamedNotOptArg, Price=defaultNamedNotOptArg, OrderID=pythoncom.Missing
            , OrderID1=pythoncom.Missing):
        return self._ApplyTypes_(8, 1, (24, 0), ((8, 1), (3, 1), (5, 1), (16387, 2), (16387, 2)), 'Cover', None,pszInstrumentID
            , Volume, Price, OrderID, OrderID1)

    def CreateBars(self, InstrumentID=defaultNamedNotOptArg, Period=defaultNamedNotOptArg, Counts=pythoncom.Missing, IsOk=pythoncom.Missing):
        return self._ApplyTypes_(32, 1, (24, 0), ((8, 1), (3, 1), (16387, 2), (16387, 2)), 'CreateBars', None,InstrumentID
            , Period, Counts, IsOk)

    def DefMACD(self, InstrumentID=defaultNamedNotOptArg, Period=defaultNamedNotOptArg, Fast=defaultNamedNotOptArg, Slow=defaultNamedNotOptArg
            , Signal=defaultNamedNotOptArg, Diff=pythoncom.Missing, Dea=pythoncom.Missing):
        return self._ApplyTypes_(38, 1, (24, 0), ((8, 1), (3, 1), (3, 1), (3, 1), (3, 1), (16389, 2), (16389, 2)), 'DefMACD', None,InstrumentID
            , Period, Fast, Slow, Signal, Diff
            , Dea)

    def DeleteBars(self, InstrumentID=defaultNamedNotOptArg, Period=defaultNamedNotOptArg, IsOk=pythoncom.Missing):
        return self._ApplyTypes_(33, 1, (24, 0), ((8, 1), (3, 1), (16387, 2)), 'DeleteBars', None,InstrumentID
            , Period, IsOk)

    def DeleteExchangeTradeTimes(self, ExchangeID=defaultNamedNotOptArg, InstrumentID=defaultNamedNotOptArg, InfoID=pythoncom.Missing, InfoMsg=pythoncom.Missing):
        return self._ApplyTypes_(41, 1, (24, 0), ((8, 1), (8, 1), (16387, 2), (16392, 2)), 'DeleteExchangeTradeTimes', None,ExchangeID
            , InstrumentID, InfoID, InfoMsg)

    def EMA(self, InstrumentID=defaultNamedNotOptArg, Period=defaultNamedNotOptArg, Counts=defaultNamedNotOptArg, EMA=pythoncom.Missing):
        return self._ApplyTypes_(35, 1, (24, 0), ((8, 1), (3, 1), (3, 1), (16389, 2)), 'EMA', None,InstrumentID
            , Period, Counts, EMA)

    def Free(self):
        return self._oleobj_.InvokeTypes(22, LCID, 1, (24, 0), (),)

    def GetAPIVersion(self):
        # Result is a Unicode object
        return self._oleobj_.InvokeTypes(3, LCID, 1, (8, 0), (),)

    def GetAccount(self, PreBalance=pythoncom.Missing, Balance=pythoncom.Missing, PreMargin=pythoncom.Missing, Available=pythoncom.Missing
            , WithdrawQuota=pythoncom.Missing, ExchangeMargin=pythoncom.Missing, CloseProfit=pythoncom.Missing, PositionProfit=pythoncom.Missing):
        return self._ApplyTypes_(14, 1, (24, 0), ((16389, 2), (16389, 2), (16389, 2), (16389, 2), (16389, 2), (16389, 2), (16389, 2), (16389, 2)), 'GetAccount', None,PreBalance
            , Balance, PreMargin, Available, WithdrawQuota, ExchangeMargin
            , CloseProfit, PositionProfit)

    def GetBars(self, InstrumentID=defaultNamedNotOptArg, Period=defaultNamedNotOptArg, index=defaultNamedNotOptArg, Max=pythoncom.Missing
            , Open=pythoncom.Missing, Close=pythoncom.Missing, Hight=pythoncom.Missing, Low=pythoncom.Missing, Volume=pythoncom.Missing
            , Counts=pythoncom.Missing, UpdateTime=pythoncom.Missing):
        return self._ApplyTypes_(39, 1, (24, 0), ((8, 1), (3, 1), (3, 1), (16387, 2), (16389, 2), (16389, 2), (16389, 2), (16389, 2), (16387, 2), (16387, 2), (16392, 2)), 'GetBars', None,InstrumentID
            , Period, index, Max, Open, Close
            , Hight, Low, Volume, Counts, UpdateTime
            )

    def GetHisOrderList(self, InstrumentID=defaultNamedNotOptArg, GetFlag=pythoncom.Missing):
        return self._ApplyTypes_(18, 1, (24, 0), ((8, 1), (16387, 2)), 'GetHisOrderList', None,InstrumentID
            , GetFlag)

    def GetInstrumentInfo(self, InstrumentID=defaultNamedNotOptArg, Multiply=pythoncom.Missing, PriceUnit=pythoncom.Missing, MarginRate=pythoncom.Missing
            , ExpireDate=pythoncom.Missing):
        return self._ApplyTypes_(12, 1, (24, 0), ((8, 1), (16389, 2), (16389, 2), (16389, 2), (16392, 2)), 'GetInstrumentInfo', None,InstrumentID
            , Multiply, PriceUnit, MarginRate, ExpireDate)

    def GetInstrumentInfoOut(self, InstrumentID=defaultNamedNotOptArg, Multiply=pythoncom.Missing, PriceUnit=pythoncom.Missing, MarginRate=pythoncom.Missing
            , ExpireDate=pythoncom.Missing):
        return self._ApplyTypes_(37, 1, (24, 0), ((8, 1), (16389, 2), (16389, 2), (16389, 2), (16392, 2)), 'GetInstrumentInfoOut', None,InstrumentID
            , Multiply, PriceUnit, MarginRate, ExpireDate)

    def GetInstrumentRatio(self, InstrumentID=defaultNamedNotOptArg, OpenRatioByMoney=pythoncom.Missing, OpenRatioByVolume=pythoncom.Missing, CloseRatioByMoney=pythoncom.Missing
            , CloseRatioByVolume=pythoncom.Missing, CloseTodayRatioByMoney=pythoncom.Missing, CloseTodayRatioByVolume=pythoncom.Missing):
        return self._ApplyTypes_(26, 1, (24, 0), ((8, 1), (16389, 2), (16389, 2), (16389, 2), (16389, 2), (16389, 2), (16389, 2)), 'GetInstrumentRatio', None,InstrumentID
            , OpenRatioByMoney, OpenRatioByVolume, CloseRatioByMoney, CloseRatioByVolume, CloseTodayRatioByMoney
            , CloseTodayRatioByVolume)

    def GetMarketData(self, InstrumentID=defaultNamedNotOptArg, YdClose=pythoncom.Missing, YdSettlement=pythoncom.Missing, Open=pythoncom.Missing
            , Last=pythoncom.Missing, Bid1=pythoncom.Missing, Ask1=pythoncom.Missing, Bid1Volume=pythoncom.Missing, Ask1Volume=pythoncom.Missing
            , Highest=pythoncom.Missing, Lowest=pythoncom.Missing, TradedVolume=pythoncom.Missing, TradedAmmount=pythoncom.Missing):
        return self._ApplyTypes_(23, 1, (24, 0), ((8, 1), (16389, 2), (16389, 2), (16389, 2), (16389, 2), (16389, 2), (16389, 2), (16387, 2), (16387, 2), (16389, 2), (16389, 2), (16387, 2), (16389, 2)), 'GetMarketData', None,InstrumentID
            , YdClose, YdSettlement, Open, Last, Bid1
            , Ask1, Bid1Volume, Ask1Volume, Highest, Lowest
            , TradedVolume, TradedAmmount)

    def GetOutExchangeTradeTimes(self, ExchangeID=defaultNamedNotOptArg, InstrumentID=defaultNamedNotOptArg):
        return self._oleobj_.InvokeTypes(42, LCID, 1, (24, 0), ((8, 1), (8, 1)),ExchangeID
            , InstrumentID)

    def GetPosition(self, InstrumentID=defaultNamedNotOptArg, LongPosition=pythoncom.Missing, LongYdPosition=pythoncom.Missing, LongFrozen=pythoncom.Missing
            , LongPositionPrice=pythoncom.Missing, ShortPosition=pythoncom.Missing, ShortYdPosition=pythoncom.Missing, ShortFrozen=pythoncom.Missing, ShortPositionPrice=pythoncom.Missing):
        return self._ApplyTypes_(17, 1, (24, 0), ((8, 1), (16387, 2), (16387, 2), (16387, 2), (16389, 2), (16387, 2), (16387, 2), (16387, 2), (16389, 2)), 'GetPosition', None,InstrumentID
            , LongPosition, LongYdPosition, LongFrozen, LongPositionPrice, ShortPosition
            , ShortYdPosition, ShortFrozen, ShortPositionPrice)

    def GetPositionDetail(self, InstrumentID=defaultNamedNotOptArg):
        return self._oleobj_.InvokeTypes(13, LCID, 1, (24, 0), ((8, 1),),InstrumentID
            )

    def GetPositionPlus(self, InstrumentID=defaultNamedNotOptArg, LongPosition=pythoncom.Missing, LongYdPosition=pythoncom.Missing, LongFrozen=pythoncom.Missing
            , LongSuspendPostion=pythoncom.Missing, LongPositionPrice=pythoncom.Missing, LongPositionProfit=pythoncom.Missing, ShortPosition=pythoncom.Missing, ShortYdPosition=pythoncom.Missing
            , ShortFrozen=pythoncom.Missing, ShortSuspendPostion=pythoncom.Missing, ShortPositionPrice=pythoncom.Missing, ShortPositionProfit=pythoncom.Missing, BidPrice=pythoncom.Missing
            , AskPrice=pythoncom.Missing):
        return self._ApplyTypes_(31, 1, (24, 0), ((8, 1), (16387, 2), (16387, 2), (16387, 2), (16387, 2), (16389, 2), (16389, 2), (16387, 2), (16387, 2), (16387, 2), (16387, 2), (16389, 2), (16389, 2), (16389, 2), (16389, 2)), 'GetPositionPlus', None,InstrumentID
            , LongPosition, LongYdPosition, LongFrozen, LongSuspendPostion, LongPositionPrice
            , LongPositionProfit, ShortPosition, ShortYdPosition, ShortFrozen, ShortSuspendPostion
            , ShortPositionPrice, ShortPositionProfit, BidPrice, AskPrice)

    def GetRealAccount(self, PreBalance=pythoncom.Missing, Balance=pythoncom.Missing, PreMargin=pythoncom.Missing, Available=pythoncom.Missing
            , WithdrawQuota=pythoncom.Missing, ExchangeMargin=pythoncom.Missing, CloseProfit=pythoncom.Missing, PositionProfit=pythoncom.Missing):
        return self._ApplyTypes_(27, 1, (24, 0), ((16389, 2), (16389, 2), (16389, 2), (16389, 2), (16389, 2), (16389, 2), (16389, 2), (16389, 2)), 'GetRealAccount', None,PreBalance
            , Balance, PreMargin, Available, WithdrawQuota, ExchangeMargin
            , CloseProfit, PositionProfit)

    def GetRealPosition(self, InstrumentID=defaultNamedNotOptArg, LongPosition=pythoncom.Missing, LongYdPosition=pythoncom.Missing, LongFrozen=pythoncom.Missing
            , LongPositionPrice=pythoncom.Missing, ShortPosition=pythoncom.Missing, ShortYdPosition=pythoncom.Missing, ShortFrozen=pythoncom.Missing, ShortPositionPrice=pythoncom.Missing):
        return self._ApplyTypes_(28, 1, (24, 0), ((8, 1), (16387, 2), (16387, 2), (16387, 2), (16389, 2), (16387, 2), (16387, 2), (16387, 2), (16389, 2)), 'GetRealPosition', None,InstrumentID
            , LongPosition, LongYdPosition, LongFrozen, LongPositionPrice, ShortPosition
            , ShortYdPosition, ShortFrozen, ShortPositionPrice)

    def GetTradeInfo(self, InstrumentID=defaultNamedNotOptArg):
        return self._oleobj_.InvokeTypes(15, LCID, 1, (24, 0), ((8, 1),),InstrumentID
            )

    def GetTradingDay(self):
        # Result is a Unicode object
        return self._oleobj_.InvokeTypes(10, LCID, 1, (8, 0), (),)

    def IsOrderOpen(self, OrderID=defaultNamedNotOptArg, CanCacel=pythoncom.Missing):
        return self._ApplyTypes_(11, 1, (24, 0), ((3, 1), (16387, 2)), 'IsOrderOpen', None,OrderID
            , CanCacel)

    def LogOut(self):
        return self._oleobj_.InvokeTypes(21, LCID, 1, (24, 0), (),)

    def Login(self, vConfigIiniFile=defaultNamedNotOptArg, vuserid=defaultNamedNotOptArg, vpassword=defaultNamedNotOptArg, ErrorID=pythoncom.Missing
            , RegResultInfo=pythoncom.Missing):
        return self._ApplyTypes_(1, 1, (24, 0), ((8, 1), (8, 1), (8, 1), (16387, 2), (16392, 2)), 'Login', None,vConfigIiniFile
            , vuserid, vpassword, ErrorID, RegResultInfo)

    def MA(self, InstrumentID=defaultNamedNotOptArg, Period=defaultNamedNotOptArg, Counts=defaultNamedNotOptArg, MA=pythoncom.Missing):
        return self._ApplyTypes_(34, 1, (24, 0), ((8, 1), (3, 1), (3, 1), (16389, 2)), 'MA', None,InstrumentID
            , Period, Counts, MA)

    def MACD(self, InstrumentID=defaultNamedNotOptArg, Period=defaultNamedNotOptArg, Diff=pythoncom.Missing, Dea=pythoncom.Missing):
        return self._ApplyTypes_(36, 1, (24, 0), ((8, 1), (3, 1), (16389, 2), (16389, 2)), 'MACD', None,InstrumentID
            , Period, Diff, Dea)

    def PasswordUpdate(self, NewPassWord=defaultNamedNotOptArg):
        return self._oleobj_.InvokeTypes(24, LCID, 1, (24, 0), ((8, 1),),NewPassWord
            )

    def PlaceOrder(self, pszInstrumentID=defaultNamedNotOptArg, IsBuy=defaultNamedNotOptArg, IsOpen=defaultNamedNotOptArg, Volume=defaultNamedNotOptArg
            , Price=defaultNamedNotOptArg, OrderID=pythoncom.Missing):
        return self._ApplyTypes_(19, 1, (24, 0), ((8, 1), (3, 1), (3, 1), (3, 1), (5, 1), (16387, 2)), 'PlaceOrder', None,pszInstrumentID
            , IsBuy, IsOpen, Volume, Price, OrderID
            )

    def PrintOrderInfo(self):
        return self._oleobj_.InvokeTypes(25, LCID, 1, (24, 0), (),)

    def Sell(self, pszInstrumentID=defaultNamedNotOptArg, Volume=defaultNamedNotOptArg, Price=defaultNamedNotOptArg, OrderID=pythoncom.Missing
            , OrderID1=pythoncom.Missing):
        return self._ApplyTypes_(9, 1, (24, 0), ((8, 1), (3, 1), (5, 1), (16387, 2), (16387, 2)), 'Sell', None,pszInstrumentID
            , Volume, Price, OrderID, OrderID1)

    def SetOrderCloseMode(self, CloseMode=defaultNamedNotOptArg, SetOk=pythoncom.Missing):
        return self._ApplyTypes_(30, 1, (24, 0), ((3, 1), (16387, 2)), 'SetOrderCloseMode', None,CloseMode
            , SetOk)

    def SettlementInfoConfirm(self):
        return self._oleobj_.InvokeTypes(16, LCID, 1, (24, 0), (),)

    def Short(self, pszInstrumentID=defaultNamedNotOptArg, Volume=defaultNamedNotOptArg, Price=defaultNamedNotOptArg, OrderID=pythoncom.Missing):
        return self._ApplyTypes_(7, 1, (24, 0), ((8, 1), (3, 1), (5, 1), (16387, 2)), 'Short', None,pszInstrumentID
            , Volume, Price, OrderID)

    def SubscribeDepthMD(self, InstrumentID=defaultNamedNotOptArg):
        return self._oleobj_.InvokeTypes(29, LCID, 1, (24, 0), ((8, 1),),InstrumentID
            )

    def SubscribeMD(self, InstrumentID=defaultNamedNotOptArg):
        return self._oleobj_.InvokeTypes(4, LCID, 1, (24, 0), ((8, 1),),InstrumentID
            )

    def UnSubscribeMD(self, InstrumentID=defaultNamedNotOptArg):
        return self._oleobj_.InvokeTypes(5, LCID, 1, (24, 0), ((8, 1),),InstrumentID
            )

    _prop_map_get_ = {
    }
    _prop_map_put_ = {
    }
    def __iter__(self):
        "Return a Python iterator for this object"
        try:
            ob = self._oleobj_.InvokeTypes(-4,LCID,3,(13, 10),())
        except pythoncom.error:
            raise TypeError("This object does not support enumeration")
        return win32com.client.util.Iterator(ob, None)

class _ITVQhtICtpClientAPIEvents:
    CLSID = CLSID_Sink = IID('{BF886C94-57F1-4532-B4A4-3ADA86317BDC}')
    coclass_clsid = IID('{4F356EF1-932E-48D1-B7A4-CFDE79752627}')
    _public_methods_ = [] # For COM Server support
    _dispid_to_func_ = {
                1 : "OnMarketData",
                2 : "OnEventsInfo",
                3 : "OnInstrumentStatus",
                4 : "OnTradeConnected",
                5 : "OnTradeDisconnected",
                6 : "OnMDConnected",
                7 : "OnMDDisconnected",
                8 : "OnOrder",
                9 : "OnTrade",
               10 : "OnOrderCanceled",
               11 : "OnOrderActionFailed",
               12 : "OnInitFinished",
               13 : "OnGetPositionDetail",
               14 : "OnGetInstrument",
               15 : "OnRspError",
               16 : "OnOutPosition",
               17 : "OnDepthMarketData",
               18 : "OnPushCancleOrder",
               19 : "OnRspQryOrder",
               20 : "OnRspQryTrade",
               21 : "OnOutProgress",
               22 : "OnOutBars",
               23 : "OnOutExchangeTradeTimes",
        }

    def __init__(self, oobj = None):
        if oobj is None:
            self._olecp = None
        else:
            import win32com.server.util
            from win32com.server.policy import EventHandlerPolicy
            cpc=oobj._oleobj_.QueryInterface(pythoncom.IID_IConnectionPointContainer)
            cp=cpc.FindConnectionPoint(self.CLSID_Sink)
            cookie=cp.Advise(win32com.server.util.wrap(self, usePolicy=EventHandlerPolicy))
            self._olecp,self._olecp_cookie = cp,cookie
    def __del__(self):
        try:
            self.close()
        except pythoncom.com_error:
            pass
    def close(self):
        if self._olecp is not None:
            cp,cookie,self._olecp,self._olecp_cookie = self._olecp,self._olecp_cookie,None,None
            cp.Unadvise(cookie)
    def _query_interface_(self, iid):
        import win32com.server.util
        if iid==self.CLSID_Sink: return win32com.server.util.wrap(self)

    # Event Handlers
    # If you create handlers, they should have the following prototypes:
#    def OnMarketData(self, InstrumentID=defaultNamedNotOptArg, BidPrice1=defaultNamedNotOptArg, BidVolume1=defaultNamedNotOptArg, AskPrice1=defaultNamedNotOptArg
#            , AskVolume1=defaultNamedNotOptArg, OpenPrice=defaultNamedNotOptArg, HighestPrice=defaultNamedNotOptArg, LowestPrice=defaultNamedNotOptArg, LastPrice=defaultNamedNotOptArg
#            , OpenInterest=defaultNamedNotOptArg, Volume=defaultNamedNotOptArg, UpperLimitPrice=defaultNamedNotOptArg, LowerLimitPrice=defaultNamedNotOptArg, PreSettlementPrice=defaultNamedNotOptArg
#            , AveragePrice=defaultNamedNotOptArg, UpdateTime=defaultNamedNotOptArg, UpdateMilliSecond=defaultNamedNotOptArg):
#    def OnEventsInfo(self, InfoID=defaultNamedNotOptArg, MsgInfo=defaultNamedNotOptArg):
#    def OnInstrumentStatus(self, InstrumentID=defaultNamedNotOptArg, ExchangeID=defaultNamedNotOptArg, EnterTime=defaultNamedNotOptArg, NewState=defaultNamedNotOptArg):
#    def OnTradeConnected(self):
#    def OnTradeDisconnected(self):
#    def OnMDConnected(self):
#    def OnMDDisconnected(self):
#    def OnOrder(self, OrderID=defaultNamedNotOptArg, InstrumentID=defaultNamedNotOptArg, IsBuy=defaultNamedNotOptArg, IsOpen=defaultNamedNotOptArg
#            , Volume=defaultNamedNotOptArg, Price=defaultNamedNotOptArg, TradedVolume=defaultNamedNotOptArg, AvgTradePrice=defaultNamedNotOptArg, OrderStatus=defaultNamedNotOptArg
#            , OrderSysID=defaultNamedNotOptArg, BrokerOrderSeq=defaultNamedNotOptArg, OrderLocalID=defaultNamedNotOptArg, InsertTime=defaultNamedNotOptArg, ErrorID=defaultNamedNotOptArg
#            , ErrorMsg=defaultNamedNotOptArg, HedgeType=defaultNamedNotOptArg):
#    def OnTrade(self, OrderID=defaultNamedNotOptArg, OrderSysID=defaultNamedNotOptArg, OrderLocalID=defaultNamedNotOptArg, TradeID=defaultNamedNotOptArg
#            , InstrumentID=defaultNamedNotOptArg, IsBuy=defaultNamedNotOptArg, IsOpen=defaultNamedNotOptArg, Volume=defaultNamedNotOptArg, ThisTradePrice=defaultNamedNotOptArg
#            , TradeTime=defaultNamedNotOptArg, OrderStatus=defaultNamedNotOptArg):
#    def OnOrderCanceled(self, OrderID=defaultNamedNotOptArg, ErrorID=defaultNamedNotOptArg, ErrorMsg=defaultNamedNotOptArg):
#    def OnOrderActionFailed(self, OrderID=defaultNamedNotOptArg, ErrorID=defaultNamedNotOptArg, ErrorMsg=defaultNamedNotOptArg):
#    def OnInitFinished(self):
#    def OnGetPositionDetail(self, InstrumentID=defaultNamedNotOptArg, OpenDate=defaultNamedNotOptArg, OrderID=defaultNamedNotOptArg, TradeID=defaultNamedNotOptArg
#            , Direction=defaultNamedNotOptArg, Volume=defaultNamedNotOptArg, CloseVolume=defaultNamedNotOptArg, OpenPrice=defaultNamedNotOptArg, PositionProfitByDate=defaultNamedNotOptArg
#            , PositionProfitByTrade=defaultNamedNotOptArg, Margin=defaultNamedNotOptArg, LastSettlementPrice=defaultNamedNotOptArg, SettlementPrice=defaultNamedNotOptArg, CloseProfitByDate=defaultNamedNotOptArg
#            , CloseProfitByTrade=defaultNamedNotOptArg, CloseAmount=defaultNamedNotOptArg, TimeFirstVolume=defaultNamedNotOptArg, MarginRateByMoney=defaultNamedNotOptArg, MarginRateByVolume=defaultNamedNotOptArg):
#    def OnGetInstrument(self, ExchangeID=defaultNamedNotOptArg, InstrumentID=defaultNamedNotOptArg, ExchangeInstID=defaultNamedNotOptArg, InstrumentName=defaultNamedNotOptArg
#            , ProductClass=defaultNamedNotOptArg, MaxMarketOrderVolume=defaultNamedNotOptArg, MinMarketOrderVolume=defaultNamedNotOptArg, MaxLimitOrderVolume=defaultNamedNotOptArg, MinLimitOrderVolume=defaultNamedNotOptArg
#            , VolumeMultiple=defaultNamedNotOptArg, PriceTick=defaultNamedNotOptArg, ExpireDate=defaultNamedNotOptArg, IsTrading=defaultNamedNotOptArg, LongMarginRatio=defaultNamedNotOptArg
#            , ShortMarginRatio=defaultNamedNotOptArg, OptionsType=defaultNamedNotOptArg, ProductID=defaultNamedNotOptArg, CombinationType=defaultNamedNotOptArg, bIsLast=defaultNamedNotOptArg):
#    def OnRspError(self, ErrorID=defaultNamedNotOptArg, ErrorMsg=defaultNamedNotOptArg):
#    def OnOutPosition(self, InstrumentID=defaultNamedNotOptArg, LongPostion=defaultNamedNotOptArg, LongYDPostion=defaultNamedNotOptArg, LongFrozen=defaultNamedNotOptArg
#            , LongSuspendPostion=defaultNamedNotOptArg, LongPositionPrice=defaultNamedNotOptArg, LongProfit=defaultNamedNotOptArg, ShortPostion=defaultNamedNotOptArg, ShortYDPostion=defaultNamedNotOptArg
#            , ShortFrozen=defaultNamedNotOptArg, ShortSuspendPostion=defaultNamedNotOptArg, ShortPositionPrice=defaultNamedNotOptArg, ShortProfit=defaultNamedNotOptArg):
#    def OnDepthMarketData(self, InstrumentID=defaultNamedNotOptArg, BidPrice1=defaultNamedNotOptArg, BidVolume1=defaultNamedNotOptArg, AskPrice1=defaultNamedNotOptArg
#            , AskVolume1=defaultNamedNotOptArg, BidPrice2=defaultNamedNotOptArg, BidVolume2=defaultNamedNotOptArg, AskPrice2=defaultNamedNotOptArg, AskVolume2=defaultNamedNotOptArg
#            , BidPrice3=defaultNamedNotOptArg, BidVolume3=defaultNamedNotOptArg, AskPrice3=defaultNamedNotOptArg, AskVolume3=defaultNamedNotOptArg, BidPrice4=defaultNamedNotOptArg
#            , BidVolume4=defaultNamedNotOptArg, AskPrice4=defaultNamedNotOptArg, AskVolume4=defaultNamedNotOptArg, BidPrice5=defaultNamedNotOptArg, BidVolume5=defaultNamedNotOptArg
#            , AskPrice5=defaultNamedNotOptArg, AskVolume5=defaultNamedNotOptArg, OpenPrice=defaultNamedNotOptArg, HighestPrice=defaultNamedNotOptArg, LowestPrice=defaultNamedNotOptArg
#            , LastPrice=defaultNamedNotOptArg, OpenInterest=defaultNamedNotOptArg, Volume=defaultNamedNotOptArg, UpperLimitPrice=defaultNamedNotOptArg, LowerLimitPrice=defaultNamedNotOptArg
#            , PreSettlementPrice=defaultNamedNotOptArg, AveragePrice=defaultNamedNotOptArg, UpdateTime=defaultNamedNotOptArg, UpdateMilliSecond=defaultNamedNotOptArg):
#    def OnPushCancleOrder(self, OrderID=defaultNamedNotOptArg, InsertTime=defaultNamedNotOptArg, InstrumentID=defaultNamedNotOptArg, IsBuy=defaultNamedNotOptArg
#            , IsOpen=defaultNamedNotOptArg, Volume=defaultNamedNotOptArg, TradedVolume=defaultNamedNotOptArg, Price=defaultNamedNotOptArg, OrderStatus=defaultNamedNotOptArg):
#    def OnRspQryOrder(self, OrderID=defaultNamedNotOptArg, InstrumentID=defaultNamedNotOptArg, IsBuy=defaultNamedNotOptArg, IsOpen=defaultNamedNotOptArg
#            , Volume=defaultNamedNotOptArg, Price=defaultNamedNotOptArg, TradedVolume=defaultNamedNotOptArg, AvgTradePrice=defaultNamedNotOptArg, OrderStatus=defaultNamedNotOptArg
#            , OrderSysID=defaultNamedNotOptArg, BrokerOrderSeq=defaultNamedNotOptArg, OrderLocalID=defaultNamedNotOptArg, InsertTime=defaultNamedNotOptArg, ErrorID=defaultNamedNotOptArg
#            , ErrorMsg=defaultNamedNotOptArg, HedgeType=defaultNamedNotOptArg):
#    def OnRspQryTrade(self, OrderID=defaultNamedNotOptArg, TradeID=defaultNamedNotOptArg, InstrumentID=defaultNamedNotOptArg, OrderSysID=defaultNamedNotOptArg
#            , OrderLocalID=defaultNamedNotOptArg, BrokerOrderSeq=defaultNamedNotOptArg, IsBuy=defaultNamedNotOptArg, IsOpen=defaultNamedNotOptArg, Volume=defaultNamedNotOptArg
#            , Price=defaultNamedNotOptArg, TradeDate=defaultNamedNotOptArg, TradeTime=defaultNamedNotOptArg):
#    def OnOutProgress(self, ProFlag=defaultNamedNotOptArg, MaxInt=defaultNamedNotOptArg, Position=defaultNamedNotOptArg):
#    def OnOutBars(self, InstrumentID=defaultNamedNotOptArg, Period=defaultNamedNotOptArg, Counts=defaultNamedNotOptArg, Hight=defaultNamedNotOptArg
#            , Low=defaultNamedNotOptArg, Open=defaultNamedNotOptArg, Close=defaultNamedNotOptArg, CreatTime=defaultNamedNotOptArg):
#    def OnOutExchangeTradeTimes(self, ExchangeID=defaultNamedNotOptArg, InstrumentID=defaultNamedNotOptArg, OpenTime=defaultNamedNotOptArg, CloseTime=defaultNamedNotOptArg
#            , TradeMins=defaultNamedNotOptArg, Flag=defaultNamedNotOptArg):


from win32com.client import CoClassBaseClass
# This CoClass is known by the name 'TVQhtICtpClientAPI.com.1'
class TVQhtICtpClientAPI(CoClassBaseClass): # A CoClass
    CLSID = IID('{4F356EF1-932E-48D1-B7A4-CFDE79752627}')
    coclass_sources = [
        _ITVQhtICtpClientAPIEvents,
    ]
    default_source = _ITVQhtICtpClientAPIEvents
    coclass_interfaces = [
        ITVQhtICtpClientAPI,
    ]
    default_interface = ITVQhtICtpClientAPI

ITVQhtICtpClientAPI_vtables_dispatch_ = 1
ITVQhtICtpClientAPI_vtables_ = [
    (( 'Login' , 'vConfigIiniFile' , 'vuserid' , 'vpassword' , 'ErrorID' , 
             'RegResultInfo' , ), 1, (1, (), [ (8, 1, None, None) , (8, 1, None, None) , (8, 1, None, None) , 
             (16387, 2, None, None) , (16392, 2, None, None) , ], 1 , 1 , 4 , 0 , 56 , (3, 0, None, None) , 0 , )),
    (( 'CancelOrder' , 'OrderID' , 'Status' , ), 2, (2, (), [ (3, 1, None, None) , 
             (16387, 2, None, None) , ], 1 , 1 , 4 , 0 , 64 , (3, 0, None, None) , 0 , )),
    (( 'GetAPIVersion' , 'vVersion' , ), 3, (3, (), [ (16392, 10, None, None) , ], 1 , 1 , 4 , 0 , 72 , (3, 0, None, None) , 0 , )),
    (( 'SubscribeMD' , 'InstrumentID' , ), 4, (4, (), [ (8, 1, None, None) , ], 1 , 1 , 4 , 0 , 80 , (3, 0, None, None) , 0 , )),
    (( 'UnSubscribeMD' , 'InstrumentID' , ), 5, (5, (), [ (8, 1, None, None) , ], 1 , 1 , 4 , 0 , 88 , (3, 0, None, None) , 0 , )),
    (( 'Buy' , 'pszInstrumentID' , 'Volume' , 'Price' , 'OrderID' , 
             ), 6, (6, (), [ (8, 1, None, None) , (3, 1, None, None) , (5, 1, None, None) , (16387, 2, None, None) , ], 1 , 1 , 4 , 0 , 96 , (3, 0, None, None) , 0 , )),
    (( 'Short' , 'pszInstrumentID' , 'Volume' , 'Price' , 'OrderID' , 
             ), 7, (7, (), [ (8, 1, None, None) , (3, 1, None, None) , (5, 1, None, None) , (16387, 2, None, None) , ], 1 , 1 , 4 , 0 , 104 , (3, 0, None, None) , 0 , )),
    (( 'Cover' , 'pszInstrumentID' , 'Volume' , 'Price' , 'OrderID' , 
             'OrderID1' , ), 8, (8, (), [ (8, 1, None, None) , (3, 1, None, None) , (5, 1, None, None) , 
             (16387, 2, None, None) , (16387, 2, None, None) , ], 1 , 1 , 4 , 0 , 112 , (3, 0, None, None) , 0 , )),
    (( 'Sell' , 'pszInstrumentID' , 'Volume' , 'Price' , 'OrderID' , 
             'OrderID1' , ), 9, (9, (), [ (8, 1, None, None) , (3, 1, None, None) , (5, 1, None, None) , 
             (16387, 2, None, None) , (16387, 2, None, None) , ], 1 , 1 , 4 , 0 , 120 , (3, 0, None, None) , 0 , )),
    (( 'GetTradingDay' , 'TradingDay' , ), 10, (10, (), [ (16392, 10, None, None) , ], 1 , 1 , 4 , 0 , 128 , (3, 0, None, None) , 0 , )),
    (( 'IsOrderOpen' , 'OrderID' , 'CanCacel' , ), 11, (11, (), [ (3, 1, None, None) , 
             (16387, 2, None, None) , ], 1 , 1 , 4 , 0 , 136 , (3, 0, None, None) , 0 , )),
    (( 'GetInstrumentInfo' , 'InstrumentID' , 'Multiply' , 'PriceUnit' , 'MarginRate' , 
             'ExpireDate' , ), 12, (12, (), [ (8, 1, None, None) , (16389, 2, None, None) , (16389, 2, None, None) , 
             (16389, 2, None, None) , (16392, 2, None, None) , ], 1 , 1 , 4 , 0 , 144 , (3, 0, None, None) , 0 , )),
    (( 'GetPositionDetail' , 'InstrumentID' , ), 13, (13, (), [ (8, 1, None, None) , ], 1 , 1 , 4 , 0 , 152 , (3, 0, None, None) , 0 , )),
    (( 'GetAccount' , 'PreBalance' , 'Balance' , 'PreMargin' , 'Available' , 
             'WithdrawQuota' , 'ExchangeMargin' , 'CloseProfit' , 'PositionProfit' , ), 14, (14, (), [ 
             (16389, 2, None, None) , (16389, 2, None, None) , (16389, 2, None, None) , (16389, 2, None, None) , (16389, 2, None, None) , 
             (16389, 2, None, None) , (16389, 2, None, None) , (16389, 2, None, None) , ], 1 , 1 , 4 , 0 , 160 , (3, 0, None, None) , 0 , )),
    (( 'GetTradeInfo' , 'InstrumentID' , ), 15, (15, (), [ (8, 1, None, None) , ], 1 , 1 , 4 , 0 , 168 , (3, 0, None, None) , 0 , )),
    (( 'SettlementInfoConfirm' , ), 16, (16, (), [ ], 1 , 1 , 4 , 0 , 176 , (3, 0, None, None) , 0 , )),
    (( 'GetPosition' , 'InstrumentID' , 'LongPosition' , 'LongYdPosition' , 'LongFrozen' , 
             'LongPositionPrice' , 'ShortPosition' , 'ShortYdPosition' , 'ShortFrozen' , 'ShortPositionPrice' , 
             ), 17, (17, (), [ (8, 1, None, None) , (16387, 2, None, None) , (16387, 2, None, None) , (16387, 2, None, None) , 
             (16389, 2, None, None) , (16387, 2, None, None) , (16387, 2, None, None) , (16387, 2, None, None) , (16389, 2, None, None) , ], 1 , 1 , 4 , 0 , 184 , (3, 0, None, None) , 0 , )),
    (( 'GetHisOrderList' , 'InstrumentID' , 'GetFlag' , ), 18, (18, (), [ (8, 1, None, None) , 
             (16387, 2, None, None) , ], 1 , 1 , 4 , 0 , 192 , (3, 0, None, None) , 0 , )),
    (( 'PlaceOrder' , 'pszInstrumentID' , 'IsBuy' , 'IsOpen' , 'Volume' , 
             'Price' , 'OrderID' , ), 19, (19, (), [ (8, 1, None, None) , (3, 1, None, None) , 
             (3, 1, None, None) , (3, 1, None, None) , (5, 1, None, None) , (16387, 2, None, None) , ], 1 , 1 , 4 , 0 , 200 , (3, 0, None, None) , 0 , )),
    (( 'About' , ), 20, (20, (), [ ], 1 , 1 , 4 , 0 , 208 , (3, 0, None, None) , 0 , )),
    (( 'LogOut' , ), 21, (21, (), [ ], 1 , 1 , 4 , 0 , 216 , (3, 0, None, None) , 0 , )),
    (( 'Free' , ), 22, (22, (), [ ], 1 , 1 , 4 , 0 , 224 , (3, 0, None, None) , 0 , )),
    (( 'GetMarketData' , 'InstrumentID' , 'YdClose' , 'YdSettlement' , 'Open' , 
             'Last' , 'Bid1' , 'Ask1' , 'Bid1Volume' , 'Ask1Volume' , 
             'Highest' , 'Lowest' , 'TradedVolume' , 'TradedAmmount' , ), 23, (23, (), [ 
             (8, 1, None, None) , (16389, 2, None, None) , (16389, 2, None, None) , (16389, 2, None, None) , (16389, 2, None, None) , 
             (16389, 2, None, None) , (16389, 2, None, None) , (16387, 2, None, None) , (16387, 2, None, None) , (16389, 2, None, None) , 
             (16389, 2, None, None) , (16387, 2, None, None) , (16389, 2, None, None) , ], 1 , 1 , 4 , 0 , 232 , (3, 0, None, None) , 0 , )),
    (( 'PasswordUpdate' , 'NewPassWord' , ), 24, (24, (), [ (8, 1, None, None) , ], 1 , 1 , 4 , 0 , 240 , (3, 0, None, None) , 0 , )),
    (( 'PrintOrderInfo' , ), 25, (25, (), [ ], 1 , 1 , 4 , 0 , 248 , (3, 0, None, None) , 0 , )),
    (( 'GetInstrumentRatio' , 'InstrumentID' , 'OpenRatioByMoney' , 'OpenRatioByVolume' , 'CloseRatioByMoney' , 
             'CloseRatioByVolume' , 'CloseTodayRatioByMoney' , 'CloseTodayRatioByVolume' , ), 26, (26, (), [ (8, 1, None, None) , 
             (16389, 2, None, None) , (16389, 2, None, None) , (16389, 2, None, None) , (16389, 2, None, None) , (16389, 2, None, None) , 
             (16389, 2, None, None) , ], 1 , 1 , 4 , 0 , 256 , (3, 0, None, None) , 0 , )),
    (( 'GetRealAccount' , 'PreBalance' , 'Balance' , 'PreMargin' , 'Available' , 
             'WithdrawQuota' , 'ExchangeMargin' , 'CloseProfit' , 'PositionProfit' , ), 27, (27, (), [ 
             (16389, 2, None, None) , (16389, 2, None, None) , (16389, 2, None, None) , (16389, 2, None, None) , (16389, 2, None, None) , 
             (16389, 2, None, None) , (16389, 2, None, None) , (16389, 2, None, None) , ], 1 , 1 , 4 , 0 , 264 , (3, 0, None, None) , 0 , )),
    (( 'GetRealPosition' , 'InstrumentID' , 'LongPosition' , 'LongYdPosition' , 'LongFrozen' , 
             'LongPositionPrice' , 'ShortPosition' , 'ShortYdPosition' , 'ShortFrozen' , 'ShortPositionPrice' , 
             ), 28, (28, (), [ (8, 1, None, None) , (16387, 2, None, None) , (16387, 2, None, None) , (16387, 2, None, None) , 
             (16389, 2, None, None) , (16387, 2, None, None) , (16387, 2, None, None) , (16387, 2, None, None) , (16389, 2, None, None) , ], 1 , 1 , 4 , 0 , 272 , (3, 0, None, None) , 0 , )),
    (( 'SubscribeDepthMD' , 'InstrumentID' , ), 29, (29, (), [ (8, 1, None, None) , ], 1 , 1 , 4 , 0 , 280 , (3, 0, None, None) , 0 , )),
    (( 'SetOrderCloseMode' , 'CloseMode' , 'SetOk' , ), 30, (30, (), [ (3, 1, None, None) , 
             (16387, 2, None, None) , ], 1 , 1 , 4 , 0 , 288 , (3, 0, None, None) , 0 , )),
    (( 'GetPositionPlus' , 'InstrumentID' , 'LongPosition' , 'LongYdPosition' , 'LongFrozen' , 
             'LongSuspendPostion' , 'LongPositionPrice' , 'LongPositionProfit' , 'ShortPosition' , 'ShortYdPosition' , 
             'ShortFrozen' , 'ShortSuspendPostion' , 'ShortPositionPrice' , 'ShortPositionProfit' , 'BidPrice' , 
             'AskPrice' , ), 31, (31, (), [ (8, 1, None, None) , (16387, 2, None, None) , (16387, 2, None, None) , 
             (16387, 2, None, None) , (16387, 2, None, None) , (16389, 2, None, None) , (16389, 2, None, None) , (16387, 2, None, None) , 
             (16387, 2, None, None) , (16387, 2, None, None) , (16387, 2, None, None) , (16389, 2, None, None) , (16389, 2, None, None) , 
             (16389, 2, None, None) , (16389, 2, None, None) , ], 1 , 1 , 4 , 0 , 296 , (3, 0, None, None) , 0 , )),
    (( 'CreateBars' , 'InstrumentID' , 'Period' , 'Counts' , 'IsOk' , 
             ), 32, (32, (), [ (8, 1, None, None) , (3, 1, None, None) , (16387, 2, None, None) , (16387, 2, None, None) , ], 1 , 1 , 4 , 0 , 304 , (3, 0, None, None) , 0 , )),
    (( 'DeleteBars' , 'InstrumentID' , 'Period' , 'IsOk' , ), 33, (33, (), [ 
             (8, 1, None, None) , (3, 1, None, None) , (16387, 2, None, None) , ], 1 , 1 , 4 , 0 , 312 , (3, 0, None, None) , 0 , )),
    (( 'MA' , 'InstrumentID' , 'Period' , 'Counts' , 'MA' , 
             ), 34, (34, (), [ (8, 1, None, None) , (3, 1, None, None) , (3, 1, None, None) , (16389, 2, None, None) , ], 1 , 1 , 4 , 0 , 320 , (3, 0, None, None) , 0 , )),
    (( 'EMA' , 'InstrumentID' , 'Period' , 'Counts' , 'EMA' , 
             ), 35, (35, (), [ (8, 1, None, None) , (3, 1, None, None) , (3, 1, None, None) , (16389, 2, None, None) , ], 1 , 1 , 4 , 0 , 328 , (3, 0, None, None) , 0 , )),
    (( 'MACD' , 'InstrumentID' , 'Period' , 'Diff' , 'Dea' , 
             ), 36, (36, (), [ (8, 1, None, None) , (3, 1, None, None) , (16389, 2, None, None) , (16389, 2, None, None) , ], 1 , 1 , 4 , 0 , 336 , (3, 0, None, None) , 0 , )),
    (( 'GetInstrumentInfoOut' , 'InstrumentID' , 'Multiply' , 'PriceUnit' , 'MarginRate' , 
             'ExpireDate' , ), 37, (37, (), [ (8, 1, None, None) , (16389, 2, None, None) , (16389, 2, None, None) , 
             (16389, 2, None, None) , (16392, 2, None, None) , ], 1 , 1 , 4 , 0 , 344 , (3, 0, None, None) , 0 , )),
    (( 'DefMACD' , 'InstrumentID' , 'Period' , 'Fast' , 'Slow' , 
             'Signal' , 'Diff' , 'Dea' , ), 38, (38, (), [ (8, 1, None, None) , 
             (3, 1, None, None) , (3, 1, None, None) , (3, 1, None, None) , (3, 1, None, None) , (16389, 2, None, None) , 
             (16389, 2, None, None) , ], 1 , 1 , 4 , 0 , 352 , (3, 0, None, None) , 0 , )),
    (( 'GetBars' , 'InstrumentID' , 'Period' , 'index' , 'Max' , 
             'Open' , 'Close' , 'Hight' , 'Low' , 'Volume' , 
             'Counts' , 'UpdateTime' , ), 39, (39, (), [ (8, 1, None, None) , (3, 1, None, None) , 
             (3, 1, None, None) , (16387, 2, None, None) , (16389, 2, None, None) , (16389, 2, None, None) , (16389, 2, None, None) , 
             (16389, 2, None, None) , (16387, 2, None, None) , (16387, 2, None, None) , (16392, 2, None, None) , ], 1 , 1 , 4 , 0 , 360 , (3, 0, None, None) , 0 , )),
    (( 'AppendExchangeTradeTimes' , 'ExchangeID' , 'InstrumentID' , 'hour' , 'minute' , 
             'TradeTimes' , 'Flag' , 'InfoID' , 'InfoMsg' , ), 40, (40, (), [ 
             (8, 1, None, None) , (8, 1, None, None) , (3, 1, None, None) , (3, 1, None, None) , (3, 1, None, None) , 
             (3, 1, None, None) , (16387, 2, None, None) , (16392, 2, None, None) , ], 1 , 1 , 4 , 0 , 368 , (3, 0, None, None) , 0 , )),
    (( 'DeleteExchangeTradeTimes' , 'ExchangeID' , 'InstrumentID' , 'InfoID' , 'InfoMsg' , 
             ), 41, (41, (), [ (8, 1, None, None) , (8, 1, None, None) , (16387, 2, None, None) , (16392, 2, None, None) , ], 1 , 1 , 4 , 0 , 384 , (3, 0, None, None) , 0 , )),
    (( 'GetOutExchangeTradeTimes' , 'ExchangeID' , 'InstrumentID' , ), 42, (42, (), [ (8, 1, None, None) , 
             (8, 1, None, None) , ], 1 , 1 , 4 , 0 , 392 , (3, 0, None, None) , 0 , )),
]

RecordMap = {
    ###'tagMyStructField1': '{00000000-0000-0000-0000-000000000000}', # Record disabled because it doesn't have a non-null GUID
}

CLSIDToClassMap = {
    '{BF886C94-57F1-4532-B4A4-3ADA86317BDC}' : _ITVQhtICtpClientAPIEvents,
    '{FD3E2400-1A18-45E4-8DAF-DE8840F22C8D}' : ITVQhtICtpClientAPI,
    '{4F356EF1-932E-48D1-B7A4-CFDE79752627}' : TVQhtICtpClientAPI,
}
CLSIDToPackageMap = {}
win32com.client.CLSIDToClass.RegisterCLSIDsFromDict( CLSIDToClassMap )
VTablesToPackageMap = {}
VTablesToClassMap = {
    '{FD3E2400-1A18-45E4-8DAF-DE8840F22C8D}' : 'ITVQhtICtpClientAPI',
}


NamesToIIDMap = {
    '_ITVQhtICtpClientAPIEvents' : '{BF886C94-57F1-4532-B4A4-3ADA86317BDC}',
    'ITVQhtICtpClientAPI' : '{FD3E2400-1A18-45E4-8DAF-DE8840F22C8D}',
}


您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值