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

1 篇文章 0 订阅

源码下载地址: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}',
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 上期ctp_api_c源代码.rar是一个包含CTP (中国金融期货交易系统) API的源代码压缩文件。CTP API是为了与中国金融期货交易系统进行交互而开发的一套接口。它允许开发人员通过编程语言来实现与交易系统的通信和交易操作。 该源代码包含了使用C语言编写的CTP API的实现代码。C语言是一种广泛使用的编程语言,非常适合开发高性能的软件。通过研究和理解这份源代码,开发人员可以了解CTP API的具体实现细节,并在此基础上进行二次开发。 该源代码压缩文件通常包含以下内容: 1. CTP API的源代码文件:这些文件包含了CTP API的各个功能模块的具体实现代码,如行情查询、委托下单、成交查询等。开发人员可以通过阅读这些代码来了解CTP API调用方式和相关参数。 2. 相关的头文件和函数库:这些文件包含了CTP API的函数声明和必要的宏定义等信息。开发人员可以在自己的项目中包含这些头文件并链接相关的函数库来使用CTP API的功能。 3. 示例代码:源代码压缩文件中可能还包含了一些示例代码,用于演示如何使用CTP API进行实际的交易操作。开发人员可以参考这些示例代码来快速上手并进行二次开发。 总而言之,上期ctp_api_c源代码.rar提供了一个基于C语言CTP API实现的源代码,通过研究和使用该代码,开发人员可以在自己的软件项目中实现与中国金融期货交易系统的交互和交易操作。 ### 回答2: 上期ctp_api_c 源代码.rar 是一个压缩文件,里面包含了ctp_api_c的源代码。ctp_api_c是一个针对中国金融期货交易的API接口库,主要用于开发相关的交易软件。 在这个压缩文件中,我们可以找到所有关于ctp_api_c的源代码文件。这些源代码文件是以.c和.h为后缀的,分别表示源代码和头文件。 在解压缩后的文件夹中,我们可以看到一些主要的文件,如ctp_md.c,ctp_td.c等。这些文件对应着行情数据接口和交易接口的实现。除此之外,还有一些辅助文件,如ctp_common.c,ctp_utils.c等,用于提供一些共用的函数和工具。 通过阅读这些源代码文件,可以了解ctp_api_c的整体架构和各个功能模块的实现细节。其中,会包含一些关于行情订阅、交易下单、账户查询等相关的代码。 值得一提的是,ctp_api_c是基于C语言编写的,因此在阅读这些源代码时,需要对C语言有一定的了解。通过分析和理解这些代码,我们可以更好地理解ctp_api_c的使用方法和原理,并在此基础上进行二次开发,以满足特定的交易需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值