先做简单版本,再一步步增加功能

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('') # op_station
pStockEntrustPack.AddStr('') # client_id
pStockEntrustPack.AddStr('') # input_content
pStockEntrustPack.AddStr('') # account_content
pStockEntrustPack.AddStr('') # fund_content
pStockEntrustPack.AddStr(self.fund_account) # fund_account
pStockEntrustPack.AddStr('') # stock_code
pStockEntrustPack.AddStr('') # entrust_amount
pStockEntrustPack.AddStr('7.50') # entrust_price
pStockEntrustPack.AddStr('') # 1买入 2 卖出 #entrust_bs
pStockEntrustPack.AddStr('') # entrust_prop
pStockEntrustPack.AddStr('') # content_type
pStockEntrustPack.AddStr(self.password) # password
pStockEntrustPack.AddStr('') # password_type
pStockEntrustPack.AddStr('') # 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

这两个是什么原因造成的?

python类(4)——自己造第一个轮子的更多相关文章

  1. python类的相关知识第一部分

    一.类的相关概念 (1).什么是类 具有同种属性的对象称为类,是个抽象的概念.比如说:汽车.人.狗.神: (2).什么是对象或实例 日常生活中的所有东西都是对象,是类的实例化.比如说:推土车是汽车的实 ...

  2. 一步一步造个IoC轮子(一):IoC是什么

    一步一步造个Ioc轮子目录 一步一步造个IoC轮子(一):IoC是什么 一步一步造个IoC轮子(二):详解泛型工厂 一步一步造个IoC轮子(三):构造基本的IoC容器 前言 .net core正式版前 ...

  3. Python类中super()和__init__()的关系

    Python类中super()和__init__()的关系 1.单继承时super()和__init__()实现的功能是类似的 class Base(object): def __init__(sel ...

  4. python 类属性与方法

    Python 类属性与方法 标签(空格分隔): Python Python的访问限制 Python支持面向对象,其对属性的权限控制通过属性名来实现,如果一个属性有双下划线开头(__),该属性就无法被外 ...

  5. python类及其方法

    python类及其方法 一.介绍 在 Python 中,面向对象编程主要有两个主题,就是类和类实例类与实例:类与实例相互关联着:类是对象的定义,而实例是"真正的实物",它存放了类中 ...

  6. Python类的探讨

    我们下面的探讨基于Python3,我实际测试使用的是Python3.2,Python3与Python2在类函数的类型上做了改变 1,类定义语法  Python类定义以关键字class开头,一个类定义例 ...

  7. 用Vue自己造个组件轮子,以及实践背后带来的思考

    前言 首先,向大家说声抱歉.由于之前的井底之蛙,误认为Vue.js还远没有覆盖到二三线城市的互联网小厂里.现在我错了,从我司的前端技术选型之路便可见端倪.以太原为例,已经有不少公司陆续开始采用Vue. ...

  8. 【Python&数据结构】 抽象数据类型 Python类机制和异常

    这篇是<数据结构与算法Python语言描述>的笔记,但是大头在Python类机制和面向对象编程的说明上面.我也不知道该放什么分类了..总之之前也没怎么认真接触过基于类而不是独立函数的Pyt ...

  9. Python类中的self到底是干啥的

    Python类中的self到底是干啥的 Python编写类的时候,每个函数参数第一个参数都是self,一开始我不管它到底是干嘛的,只知道必须要写上.后来对Python渐渐熟悉了一点,再回头看self的 ...

随机推荐

  1. java中数组输出的方式

    方式1:遍历输出 public class Main { public static void main(String[] args) { int[] ns = { 1, 4, 9, 16, 25 } ...

  2. 八、Delphi10.3读取JSON文件,并修改JSON数组一条内容后保存到文件

    一.我们有一个JSON文件,如下: { "在野": [ { "城池": 0, "武将": 74, "登场年": 190 ...

  3. python SSTI tornado render模板注入

    原理tornado render是python中的一个渲染函数,也就是一种模板,通过调用的参数不同,生成不同的网页,如果用户对render内容可控,不仅可以注入XSS代码,而且还可以通过{{}}进行传 ...

  4. 树莓派—raspbian软件源

    零.一键换源 2018.05.18更新:新的默认源为raspbian.raspberrypi.org 因此一键换源相应改为 sudo sed -i 's#://raspbian.raspberrypi ...

  5. SpringBoot-拦截器配置

    SpringBoot-拦截器配置 SpringBoot-拦截器配置 在我们的SSM项目中,可以在web.xml中配置拦截器,但是在SpringBoot中只能使用java类来配置,配置方法如下. 创建拦 ...

  6. Consul 简介及集群安装

    简介 Consul是基于GO语言开发的开源工具,主要面向分布式,服务化的系统提供服务注册.服务发现和配置管理的功能. Consul的功能都很实用,其中包括:服务注册/发现.健康检查.Key/Value ...

  7. sql 报错问题

    SQLServer数据库密码已过期问题 处理

  8. QObject的timerEvent使用

    其实在QT里,我们自己写的类一般通常需要继承QObject类,因为这一类里规定好的拿来即可用的方法. 比如信号,槽,以及前一个博文写的movetothread方法,这里就是介绍一个QObject的ti ...

  9. Vulkan 之 Debugging

    1.可以用validation layers 进行验证: 2.Snapdragon Profiler 使用说明

  10. 149-PHP大小写转换函数

    <?php $str='PHP is a very good programming language.'; //定义一个字符串 echo "未经处理的字符串:<br /> ...