text: #!/usr/bin/env python
  # -*- coding: utf-8 -*-
  from time import sleep
  import _thread
  from py_ctp.ctp_trade import Trade
  from py_ctp.ctp_quote import Quote
  import py_ctp.ctp_struct as ctp
  """
  __title__ = ''
  __author__ = 'HaiFeng'
  __mtime__ = '2016/9/13'
  """
  import sys
  import os
  import platform
  sys.path.append(os.path.join(sys.path[0], '..'))  # 调用父目录下的模块
  
  
  class Test:
  
      def __init__(self):
          self.Session = ''
          dllpath = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'lib')
          self.q = Quote(os.path.join(dllpath, 'ctp_quote.' + ('dll' if 'Windows' in platform.system() else 'so')))
          self.t = Trade(os.path.join(dllpath, 'ctp_trade.' + ('dll' if 'Windows' in platform.system() else 'so')))
          self.req = 0
          self.ordered = False
          self.needAuth = False
          self.RelogEnable = True
  
      def q_OnFrontConnected(self):
          print('connected')
          self.q.ReqUserLogin(BrokerID=self.broker, UserID=self.investor, Password=self.pwd)
  
      def q_OnRspUserLogin(self, rsp: ctp.CThostFtdcRspUserLoginField, info: ctp.CThostFtdcRspInfoField, req: int, last: bool):
          print(info)
          self.q.SubscribeMarketData('rb1812')
  
      def q_OnTick(self, tick: ctp.CThostFtdcMarketDataField):
          f = tick
          # print(tick)
  
          if not self.ordered:
              _thread.start_new_thread(self.Order, (f,))
              self.ordered = True
  
      def Order(self, f: ctp.CThostFtdcMarketDataField):
          print("报单")
          self.req += 1
          self.t.ReqOrderInsert(
              BrokerID=self.broker,
              InvestorID=self.investor,
              InstrumentID=f.getInstrumentID(),
              OrderRef='{0:>12}'.format(self.req),
              UserID=self.investor,
              OrderPriceType=ctp.OrderPriceTypeType.LimitPrice,
              Direction=ctp.DirectionType.Buy,
              CombOffsetFlag=ctp.OffsetFlagType.Open.__char__(),
              CombHedgeFlag=ctp.HedgeFlagType.Speculation.__char__(),
              LimitPrice=f.getLastPrice() - 50,
              VolumeTotalOriginal=1,
              TimeCondition=ctp.TimeConditionType.GFD,
              # GTDDate=''
              VolumeCondition=ctp.VolumeConditionType.AV,
              MinVolume=1,
              ContingentCondition=ctp.ContingentConditionType.Immediately,
              StopPrice=0,
              ForceCloseReason=ctp.ForceCloseReasonType.NotForceClose,
              IsAutoSuspend=0,
              IsSwapOrder=0,
              UserForceClose=0)
  
      def OnFrontConnected(self):
          if not self.RelogEnable:
              return
          print('connected')
          if self.needAuth:
              self.t.ReqAuthenticate(self.broker, self.investor, '@haifeng', '8MTL59FK1QGLKQW2')
          else:
              self.t.ReqUserLogin(BrokerID=self.broker, UserID=self.investor, Password=self.pwd, UserProductInfo='@haifeng')
  
      def OnFrontDisconnected(self, reason: int):
          print(reason)
  
      def OnRspAuthenticate(self, pRspAuthenticateField: ctp.CThostFtdcRspAuthenticateField, pRspInfo: ctp.CThostFtdcRspInfoField, nRequestID: int, bIsLast: bool):
          print('auth：{0}:{1}'.format(pRspInfo.getErrorID(), pRspInfo.getErrorMsg()))
          self.t.ReqUserLogin(BrokerID=self.broker, UserID=self.investor, Password=self.pwd, UserProductInfo='@haifeng')
  
      def OnRspUserLogin(self, rsp: ctp.CThostFtdcRspUserLoginField, info: ctp.CThostFtdcRspInfoField, req: int, last: bool):
          print(info.getErrorMsg())
  
          if info.getErrorID() == 0:
              self.Session = rsp.getSessionID()
              self.t.ReqSettlementInfoConfirm(BrokerID=self.broker, InvestorID=self.investor)
          else:
              self.RelogEnable = False
  
      def OnRspSettlementInfoConfirm(self, pSettlementInfoConfirm: ctp.CThostFtdcSettlementInfoConfirmField, pRspInfo: ctp.CThostFtdcRspInfoField, nRequestID: int, bIsLast: bool):
          # print(pSettlementInfoConfirm)
          _thread.start_new_thread(self.StartQuote, ())
  
      def StartQuote(self):
          self.q.CreateApi()
          spi = self.q.CreateSpi()
          self.q.RegisterSpi(spi)
  
          self.q.OnFrontConnected = self.q_OnFrontConnected
          self.q.OnRspUserLogin = self.q_OnRspUserLogin
          self.q.OnRtnDepthMarketData = self.q_OnTick
  
          self.q.RegCB()
  
          self.q.RegisterFront(self.frontAddr.split(',')[1])
          self.q.Init()
          # self.q.Join()
  
      def Qry(self):
          sleep(1.1)
          self.t.ReqQryInstrument()
          while True:
              sleep(1.1)
              self.t.ReqQryTradingAccount(self.broker, self.investor)
              sleep(1.1)
              self.t.ReqQryInvestorPosition(self.broker, self.investor)
              return
  
      def OnRtnInstrumentStatus(self, pInstrumentStatus: ctp.CThostFtdcInstrumentStatusField):
          print(pInstrumentStatus.getInstrumentStatus())
  
      def OnRspOrderInsert(self, pInputOrder: ctp.CThostFtdcInputOrderField, pRspInfo: ctp.CThostFtdcRspInfoField, nRequestID: int, bIsLast: bool):
          print(pRspInfo)
          print(pInputOrder)
          print(pRspInfo.getErrorMsg())
  
      def OnRtnOrder(self, pOrder: ctp.CThostFtdcOrderField):
          print(pOrder)
          if pOrder.getSessionID() == self.Session and pOrder.getOrderStatus() == ctp.OrderStatusType.NoTradeQueueing:
              print("撤单")
              self.t.ReqOrderAction(
                  self.broker, self.investor,
                  InstrumentID=pOrder.getInstrumentID(),
                  OrderRef=pOrder.getOrderRef(),
                  FrontID=pOrder.getFrontID(),
                  SessionID=pOrder.getSessionID(),
                  ActionFlag=ctp.ActionFlagType.Delete)
  
      def Run(self):
          # CreateApi时会用到log目录,需要在程序目录下创建**而非dll下**
          self.t.CreateApi()
          spi = self.t.CreateSpi()
          self.t.RegisterSpi(spi)
  
          self.t.OnFrontConnected = self.OnFrontConnected
          self.t.OnFrontDisconnected = self.OnFrontDisconnected
          self.t.OnRspUserLogin = self.OnRspUserLogin
          self.t.OnRspSettlementInfoConfirm = self.OnRspSettlementInfoConfirm
          self.t.OnRspAuthenticate = self.OnRspAuthenticate
          self.t.OnRtnInstrumentStatus = self.OnRtnInstrumentStatus
          self.t.OnRspOrderInsert = self.OnRspOrderInsert
          self.t.OnRtnOrder = self.OnRtnOrder
          # _thread.start_new_thread(self.Qry, ())
          self.t.RegCB()
  
          self.frontAddr = 'tcp://180.168.146.187:10000,tcp://180.168.146.187:10010'
          self.broker = '9999'
          self.investor = '008107'
          self.pwd = '1'
          self.t.RegisterFront(self.frontAddr.split(',')[0])
          self.t.SubscribePrivateTopic(nResumeType=2)  # quick
          self.t.SubscribePrivateTopic(nResumeType=2)
          self.t.Init()
          # self.t.Join()
  
  
  if __name__ == '__main__':
      t = Test()
      t.Run()
      input()
      t.t.Release()
      input()
  