python類(4)——自己造第一個輪子


先做簡單版本,再一步步增加功能

1、簡單目的:要實現這樣一個功能,能夠連接服務器,登錄賬號,查詢賬號委托信息,如果有委托信息,撤銷委托。

屬性(不同賬戶之間差別):賬戶,密碼

方法(不同賬戶之間都要用到功能):連接服務器、登錄賬號、查詢委托信息、撤銷委托

問題1、如何在類方法中寫類方法?A類有方法a、b,如何在方法b下面使用方法a呢?

class A:
    def a(self):
        print('abcd')
    def b(self):
        self.a()
yq=A()
yq.b()   #abcd

可見在方法前加入self即可。

腳本文件一:

import py_t2sdk
class StockTrade:
    def __init__(self,fund_account,password,connect=None):
        self.fund_account=fund_account
        self.password=password
        self.connect=connect
    def StockEntrustPack(self):
        pStockEntrustPack = py_t2sdk.pyIF2Packer()
        pStockEntrustPack.BeginPack()
        pStockEntrustPack.AddField("op_entrust_way", 'C', 1)
        pStockEntrustPack.AddField("op_station", 'S', 255)
        pStockEntrustPack.AddField("client_id", 'S', 15)
        pStockEntrustPack.AddField("input_content", 'C', 1)
        pStockEntrustPack.AddField("account_content", 'S', 30)
        pStockEntrustPack.AddField("fund_content", 'S', 30)
        pStockEntrustPack.AddField("fund_account", 'S', 11)
        pStockEntrustPack.AddField("stock_code", 'S', 6)
        pStockEntrustPack.AddField("entrust_amount", 'I', 10)
        pStockEntrustPack.AddField("entrust_price", 'F', 10, 3)
        pStockEntrustPack.AddField("entrust_bs", 'S', 1)
        pStockEntrustPack.AddField("entrust_prop", 'S', 3)
        pStockEntrustPack.AddField("content_type", 'S', 6)
        pStockEntrustPack.AddField("password", 'S', 10)
        pStockEntrustPack.AddField("password_type", 'C')
        pStockEntrustPack.AddField("exchange_type", 'S', 4)
        pStockEntrustPack.AddStr('Z')  # op_entrust_way
        pStockEntrustPack.AddStr('123456')  # op_station
        pStockEntrustPack.AddStr('10080156')  # client_id
        pStockEntrustPack.AddStr('1')  # input_content
        pStockEntrustPack.AddStr('10080156')  # account_content
        pStockEntrustPack.AddStr('10080156')  # fund_content
        pStockEntrustPack.AddStr(self.fund_account)  # fund_account
        pStockEntrustPack.AddStr('601398')  # stock_code
        pStockEntrustPack.AddStr('100')  # entrust_amount
        pStockEntrustPack.AddStr('7.50')  # entrust_price
        pStockEntrustPack.AddStr('1')  # 1買入 2 賣出    #entrust_bs
        pStockEntrustPack.AddStr('0')  # entrust_prop
        pStockEntrustPack.AddStr('0')  # content_type
        pStockEntrustPack.AddStr(self.password)  # password
        pStockEntrustPack.AddStr('2')  # password_type
        pStockEntrustPack.AddStr('1')  # exchange_type  0資金 1上海 2深圳
        pStockEntrustPack.EndPack()
        return pStockEntrustPack

    def ConnectServer(self):
        config = py_t2sdk.pyCConfigInterface()
        config.Load('t2sdk.ini')
        self.connect = py_t2sdk.pyConnectionInterface(config)
        pCallBack = py_t2sdk.pyCallbackInterface('pyCallBack', 'pyCallBack')
        pCallBack.InitInstance()
        ret = self.connect.Create2BizMsg(pCallBack)
        # ret = connect.Create(pCallBack)
        if ret != 0:
            print('creat faild!!')
            exit()
        ret = self.connect.Connect(9000)
        if ret != 0:
            print('connect faild:')
            ErrMsg = self.connect.GetErrorMsg(ret)
            print(ErrMsg)
            exit()
        print('YES')

    def Login(self):
        # pLoginPack = GetLoginPack()
        # pAccountPack = GetAccountPack()
        pLoginPack = self.StockEntrustPack()
        pBizMsg = py_t2sdk.pyIBizMessage()
        # pBizMsg.SetFunction(10001)
        pBizMsg.SetFunction(332255)
        # pBizMsg.SetFunction(333002)
        iPacklen = pLoginPack.GetPackLen()
        iPackBuff = pLoginPack.GetPackBuf()
        pBizMsg.SetPacketType(0)
        pBizMsg.SetContent(iPackBuff, iPacklen)
        # ret = connect.SendBiz(10001,pLoginPack,1)
        ret = self.connect.SendBizMsg(pBizMsg, 1)
        print(ret)

    def QueryEntrust(self):
        pass

    def CheckEntrust(self):
        pass

    def QueryAccountCash(self):
        pass

    def GetEntrustInfo(self):
        pass

    def StockEntrust(self):
        pass

    def StockTrade(self):
        pass

#報錯 注冊超時。

解決:應該是連接多了,第一次連接上了,繼續第二次再連接會報注冊超時,連接一次就好了,不能多連。此外,應該說如果連接斷了,t2sdk會自動連接上去。

#問題:沒有觸發回調

解決:因為主程序在觸發回調之前進程結束了,可以在主程序后面加上sleep(100)

 

2、增加功能:

原來:要實現這樣一個功能,能夠連接服務器,登錄賬號,查詢賬號委托信息,如果有委托信息,撤銷委托。

新增:查詢賬戶資金、查詢賬戶持倉

思考:1、我看登錄賬號不是必須流程,連接服務器后可以直接查詢賬號信息、或查詢持倉等操作(不用先登錄賬號)

可以直接查詢,這個可以在后台設置。

2、有很多功能之間的差別在於功能號不同,可以設置不同功能號為類中方法的參數,一個類方法即可解決。

3、原來想用字典來存儲數據,估計不行。因為有些數據是重復的,但是字典只保留一個。

因為字典中鍵值對是一一對應的。

下面是字典保留信息:
{'init_date': '20180124', 'fund_account': '10080156', 'batch_no': '700011', 'entrust_no': '700011', 'exchange_type': '1', 'stock_account': 'S010080156', 'stock_code': '601398', 'entrust_bs': '1', 'entrust_price': '7.380', 'entrust_amount': '100.00', 'business_amount': '0.00', 'business_price': '0.000', 'report_no': '700011', 'report_time': '155330', 'entrust_type': '0', 'entrust_status': '2', 'entrust_time': '155330', 'entrust_date': '20180124', 'entrust_prop': '0', 'stock_name': '工商銀行', 'position_str': '000000004', 'entrust_price2': '7.380', 'cancel_info': '', 'entrust_way': '7', 'business_balance': '0.00', 'withdraw_amount': '0.00', 'curr_milltime': '155330129', 'report_milltime': '155330135', 'order_id': '700011', 'orig_order_id': '700011'}
------------------------------------------------------------

認真研究后發現可以通過字典加DataFrame格式來保存數據,現在有個問題如下:多結果集?該如何處理?

咨詢后:現在這邊產品暫時沒有多結果集,恆生資管部門那邊會用到。

4、存儲在DataFrame中打印不出來,不知道是不是設置緩存不夠原因?

 

5、在交易類中寫解包功能函數,用來存儲服務器返回數據,是否可以在回調函數中使用主函數中的交易類的函數?

不這樣做呢?還有哪些方法?我現在的問題是主函數如何獲得回調函數中返回數據?以前是在回調函數中直接打印出來,沒有傳到主函數。

 

6、運行時回調函數沒有打印出DataFrame,什么原因?

代碼一:在回調函數中打印

# coding=utf-8
import py_t2sdk
import pandas as pd
from pandas import Series,DataFrame

def PrintUnpack(lpUnpack):
    iDataSetCount = lpUnpack.GetDatasetCount()
    index = 0
    while index < iDataSetCount :
        lpUnpack.SetCurrentDatasetByIndex(index)
        iRowCount = lpUnpack.GetRowCount()
        RowIndex = 0
        while RowIndex  < iRowCount:
            iColCount = lpUnpack.GetColCount()
            iColIndex = 0
            while iColIndex < iColCount:
                ColType = lpUnpack.GetColType(iColIndex)
                if ColType == 'S':
                    print(lpUnpack.GetColName(iColIndex) + ':' + lpUnpack.GetStrByIndex(iColIndex))
                elif ColType == 'I':
                    print(lpUnpack.GetColName(iColIndex) + ':' + str(lpUnpack.GetIntByIndex(iColIndex)))
                elif ColType == 'C':
                    print(lpUnpack.GetColName(iColIndex) + ':' + lpUnpack.GetCharByIndex(iColIndex))
                elif ColType == 'F':
                    print(lpUnpack.GetColName(iColIndex) + ':' + str(lpUnpack.GetDoubleByIndex(iColIndex)))
                iColIndex += 1
            lpUnpack.Next()
            RowIndex += 1
        index += 1

def StoreUnpack(lpUnpack):
    iDataSetCount = lpUnpack.GetDatasetCount();print('iDataSetCount:',iDataSetCount)
    index = 0
    while index < iDataSetCount :
        print('index:',index)
        StoreUnpackDataFrame=DataFrame()
        lpUnpack.SetCurrentDatasetByIndex(index)
        iRowCount = lpUnpack.GetRowCount();print('iRowCount:',iRowCount)
        RowIndex = 0
        while RowIndex  < iRowCount:
            print('RowIndex:',RowIndex)
            StoreUnpack = {}  #存放一列的數據
            iColCount = lpUnpack.GetColCount();print('iColCount:',iColCount)
            iColIndex = 0
            while iColIndex < iColCount:
                print('iColIndex:',iColCount)
                ColType = lpUnpack.GetColType(iColIndex)
                if ColType == 'S':
                    print(lpUnpack.GetColName(iColIndex) + ':' + lpUnpack.GetStrByIndex(iColIndex))
                    StoreUnpack.update({lpUnpack.GetColName(iColIndex):lpUnpack.GetStrByIndex(iColIndex)})
                elif ColType == 'I':
                    print(lpUnpack.GetColName(iColIndex) + ':' + str(lpUnpack.GetIntByIndex(iColIndex)))
                    StoreUnpack.update({lpUnpack.GetColName(iColIndex): lpUnpack.GetStrByIndex(iColIndex)})
                elif ColType == 'C':
                    print(lpUnpack.GetColName(iColIndex) + ':' + lpUnpack.GetCharByIndex(iColIndex))
                    StoreUnpack.update({lpUnpack.GetColName(iColIndex): lpUnpack.GetStrByIndex(iColIndex)})
                elif ColType == 'F':
                    print(lpUnpack.GetColName(iColIndex) + ':' + str(lpUnpack.GetDoubleByIndex(iColIndex)))
                    StoreUnpack.update({lpUnpack.GetColName(iColIndex): lpUnpack.GetStrByIndex(iColIndex)})
                iColIndex += 1
            StoreUnpackRow = DataFrame(StoreUnpack, index=RowIndex)
            StoreUnpackDataFrame=pd.concat((StoreUnpackDataFrame,StoreUnpackRow))
            lpUnpack.Next()
            RowIndex += 1
        index += 1
    print(StoreUnpackDataFrame)
    return StoreUnpackDataFrame

class pyCallBack:
  def __init__(self):
    print('init')
  def OnConnect(self):
    print('OnConnect')
  def OnSafeConnect(self):
    print('OnSafeConnect')
  def OnRegister(self):
    print('OnRegister')
  def OnSent(self):
    print('OnSent')
  def OnClose(self):
    print('OnClose')
  def OnReceivedBiz(self,hResult,hSend,sBuff,iLenght):
    print('OnReceivedBiz')
    if hResult == 0 or hResult == 1:
      lppUnpack = py_t2sdk.pyIF2UnPacker()
      lppUnpack.SetPackBuff(sBuff,iLenght)
      PrintUnpack(lppUnpack)
    else:
      print(sBuff)
  def OnReceivedBizEx(self,hResult,hSend,sBuff,iLenght):
    print('OnReceivedBizEx')
    if hResult == 0 or hResult == 1:
      lppUnpack = py_t2sdk.pyIF2UnPacker()
      lppUnpack.SetPackBuff(sBuff,iLenght)
      PrintUnpack(lppUnpack)
    else:
      print(sBuff)    
  def OnReceivedBizMsg(self,hResult,hSend,sBuff,iLenght):
    print('OnReceivedBizMsg')
    if hResult == 0 or hResult == 1:
      lpBizMsg = py_t2sdk.pyIBizMessage()
      lpBizMsg.SetBuff(sBuff,iLenght)
      print('funcid:',lpBizMsg.GetFunction())
      lppUnpack = py_t2sdk.pyIF2UnPacker()
      iPackBuff,iPackLen = lpBizMsg.GetContent()
      lppUnpack.SetPackBuff(iPackBuff,iPackLen)
      #PrintUnpack(lppUnpack)
      StoreUnpack(lppUnpack)
      print('------------------------------------------------------------')
      #StoreUnpack=StoreUnpack(lppUnpack)
      # print('StoreUnpack:',StoreUnpack)
    else:
      print(sBuff)  

D:\Anaconda3\python.exe E:/UFXAPIForPython0119/demo/strategy_test.py
init
OnSafeConnect!
OnRegister!
OnConnect
OnSafeConnect
OnRegister
YES
1
OnReceivedBizMsg!

Process finished with exit code 0

代碼二:在主函數中打印

# def PrintUnpack(lpUnpack):
    #     iDataSetCount = lpUnpack.GetDatasetCount()
    #     index = 0
    #     while index < iDataSetCount:
    #         lpUnpack.SetCurrentDatasetByIndex(index)
    #         iRowCount = lpUnpack.GetRowCount()
    #         RowIndex = 0
    #         while RowIndex < iRowCount:
    #             StoreUnpack = {}  # 存放一列的數據
    #             iColCount = lpUnpack.GetColCount()
    #             iColIndex = 0
    #             while iColIndex < iColCount:
    #                 ColType = lpUnpack.GetColType(iColIndex)
    #                 if ColType == 'S':
    #                     print(lpUnpack.GetColName(iColIndex) + ':' + lpUnpack.GetStrByIndex(iColIndex))
    #                     StoreUnpack.update({lpUnpack.GetColName(iColIndex): lpUnpack.GetStrByIndex(iColIndex)})
    #                 elif ColType == 'I':
    #                     print(lpUnpack.GetColName(iColIndex) + ':' + str(lpUnpack.GetIntByIndex(iColIndex)))
    #                     StoreUnpack.update({lpUnpack.GetColName(iColIndex): lpUnpack.GetStrByIndex(iColIndex)})
    #                 elif ColType == 'C':
    #                     print(lpUnpack.GetColName(iColIndex) + ':' + lpUnpack.GetCharByIndex(iColIndex))
    #                     StoreUnpack.update({lpUnpack.GetColName(iColIndex): lpUnpack.GetStrByIndex(iColIndex)})
    #                 elif ColType == 'F':
    #                     print(lpUnpack.GetColName(iColIndex) + ':' + str(lpUnpack.GetDoubleByIndex(iColIndex)))
    #                     StoreUnpack.update({lpUnpack.GetColName(iColIndex): lpUnpack.GetStrByIndex(iColIndex)})
    #                 iColIndex += 1
    #             print(StoreUnpack)
    #             lpUnpack.Next()
    #             RowIndex += 1
    #         index += 1

D:\Anaconda3\python.exe E:/UFXAPIForPython0119/demo/strategy_test.py
init
OnSafeConnect!
OnRegister!
OnConnect
OnSafeConnect
OnRegister
YES
1
OnReceivedBizMsg!
OnReceivedBizMsg
funcid: 333101
init unpacker,591
iDataSetCount: 1
index: 0
iRowCount: 0
Empty DataFrame
Columns: []
Index: []
------------------------------------------------------------

Process finished with exit code 0

這兩個是什么原因造成的?

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM