先做簡單版本,再一步步增加功能
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、原來想用字典來存儲數據,估計不行。因為有些數據是重復的,但是字典只保留一個。
因為字典中鍵值對是一一對應的。
認真研究后發現可以通過字典加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
這兩個是什么原因造成的?