# coding=utf-8
"""
@author: liujiawei (Sy1507518),hanxu (Sy1507522)
@license: GPL
@contact: [email protected],[email protected]
@see: http://blog.csdn.net/largetalk/article/details/6950435
@version: 3.1.1
@todo[0.0.2]: StockMarketSys
@note: a comment
@attention: please attention
@bug: a exist bug
@warning: warnings
"""
import sqlite3, random, threading, time, thread
import numpy as np
from Tkinter import *
from tkMessageBox import askokcancel
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
class User:
"""
@Class describe: 用户类、属于事务管理层。包含所有当前用户操作,直接与表现层链接
@private param: __username 用户名
__balance 余额
__totalProperty 总资产
__profit 盈亏
__stockProperty 当前用户股票资产
__originalProperty 用户本金
"""
__username = ''
__balance = 10000
__totalProperty = 10000
__profit = 0
__stockProperty = 0 #
__originalProperty = 10000 # 用户本金
def __init__(self, name):
self.__username = name
def calBalance(self):
"""查询返回用户余额"""
db = Database('testDB.db', self.__username)
db.getLinkedUser(self.__username)
temp = db.getUserCurrentmoney()
return temp
def calToatalProperty(self):
"""查询返回用户总资产"""
db = Database('testDB.db', self.__username)
db.getLinkedUser(self.__username)
temp = db.getUserCurrentprop()
return temp
def calPrfLoss(self):
"""查询返回当前利润"""
return self.calToatalProperty() - self.__originalProperty
def calStockProp(self):
"""查询返回用户股票资产"""
db = Database('testDB.db', self.__username)
db.getLinkedUser(self.__username)
temp = db.getUserStockprop()
return temp
def update(self):
self.__balance = self.calBalance()
self.__totalProperty = self.calToatalProperty()
self.__profit = self.calPrfLoss()
self.__stockProperty = self.calStockProp()
return True
def buyOneStock(self, stockname, stocknum):
"""买入一支股票
:param stockname: 购买股票名称
:param stocknum: 购买数量
:return: BOOL
"""
db = Database('testDB.db', self.__username)
money = stocknum * db.getStockPrice(stockname)
flag1 = (bool)(db.getUserCurrentmoney() > money)
flag2 = (bool)(db.getStockBalance(stockname) > stocknum)
if flag1 and flag2:
db.changeUserStocknum(self.__username, stockname, stocknum)
db.changeStockBalance(stockname, -stocknum)
db.changeUserCurrentmoney(-money)
return True
else:
return False
def sellOneStock(self, stockname, stocknum):
"""卖出一支股票
:param stockname: 购买股票名称
:param stocknum: 购买数量
:return: BOOL
"""
db = Database('testDB.db', self.__username)
money = stocknum * db.getStockPrice(stockname)
if (bool)(db.getUserStocknum(self.__username, stockname) > stocknum):
db.changeUserStocknum(self.__username, stockname, stocknum)
db.changeStockBalance(stockname, -stocknum)
db.changeUserCurrentmoney(-money)
return True
else:
return False
def getUsername(self):
"""
:return: string用户名
"""
self.update()
return self.__username
def getBalance(self):
"""
:return: float用户现金余额
"""
self.update()
db = Database('testDB.db', self.__username)
self.__balance = db.getUserCurrentmoney()
return self.__balance
def getTotalProperty(self):
"""
:return: float用户现有总资产
"""
self.update()
return self.__totalProperty
def getProfitOrLoss(self):
"""
:return: float用户总资产盈亏
"""
self.update()
return round(self.__profit, 2)
def getStockProp(self):
"""
:return: float用户股票总额
"""
self.update()
return self.__stockProperty
def drawUserExchange(self, figure):
"""
用于在屏幕上显示用户持有的股票数量,显示方式为直方图图
:param figure: Figure
:return:
"""
db = Database('testDB.db', self.__username)
stocknamelist = db.getStocknameList()
userstocknumlist = db.getUserStocknnumlist(self.__username)
width = 0.5
a = figure.add_subplot(111)
ind = np.arange(1, len(stocknamelist) + 1, 1)
a.cla()
a.bar(ind - width / 2, userstocknumlist, width, color='green')
a.set_xticks(ind)
a.set_xticklabels(stocknamelist)
a.set_ylabel('Stock Num')
a.set_xlabel('Stock ID')
a.set_ylabel('Stock Num')
def getStockholdingMsg(self):
"""
:return: string 用户所有股票数量信息
"""
db = Database('testDB.db', self.__username)
return db.getUserStockholdingStr(self.__username)
class Stock():
"""
@Class describe: 股票类、属于事务管理层。包含所有股票市场的操作,直接与表现层链接
@private param: __username 用户名
"""
__username = ''
def __init__(self, username):
self.__username = username
return
def showStockprice(self, f):
"""
在屏幕上用柱状图的形式显示所有股票信息价格,包含了股票价格浮动功能,并且按照股价顺序列出各项股票
:param f: Figure
:return:
"""
"""
按照股价顺序排列各个股票
"""
db = Database('testDB.db', '')
self.floatStock()
stockpricelist = []
stocknamelist = []
dict2 = sorted(dict(zip(db.getStocknameList(), db.getStockpriceList())).iteritems(), key=lambda d: d[1],
reverse=True)
for i in range(len(dict2)):
stockpricelist.append(dict2[i][1])
stocknamelist.append(dict2[i][0])
a = f.add_subplot(111)
ind = np.arange(1, len(stocknamelist) + 1, 1)
width = 0.5
a.cla()
a.bar(ind - width / 2, stockpricelist, width, color='green')
a.set_xticks(ind)
a.set_xticklabels(stocknamelist)
a.set_xlabel(u'Stock ID')
a.set_ylabel(u'Stock Price')
return True
def floatStock(self):
"""
对股票市场进行价格浮动,10%以内上下随机浮动
:return: Bool
"""
db = Database('testDB.db', '')
stocknamelist = db.getStocknameList()
for n in stocknamelist:
temp = random.uniform(random.uniform(90, 110), random.uniform(90, 110)) / 100
price1 = ((float)(db.getStockPrice(n)))
price = round(price1 * temp, 2)
a = db.changeStockPrice(n, price)
return True
def addNewstock(self, stockname, stockprice, stocknum):
"""
在股票市场增加一支股票
:param stockname: 股票名称
:param stockprice: 股票价格
:param stocknum: 股票总数量
:return: Bool
"""
db = Database('testDB.db', '')
stocknamelist = db.getStocknameList()
if stockname in stocknamelist:
return False
else:
stocknamelist.append(stockname)
db.addnewstock(stockname, stockprice, stocknum)
"""
@author: liujiawei (Sy1507518),hanxu (Sy1507522)
@license: GPL
@contact: [email protected],[email protected]
@see: http://blog.csdn.net/largetalk/article/details/6950435
@version: 3.1.1
@todo[0.0.2]: StockMarketSys
@note: a comment
@attention: please attention
@bug: a exist bug
@warning: warnings
"""
import sqlite3, random, threading, time, thread
import numpy as np
from Tkinter import *
from tkMessageBox import askokcancel
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
class User:
"""
@Class describe: 用户类、属于事务管理层。包含所有当前用户操作,直接与表现层链接
@private param: __username 用户名
__balance 余额
__totalProperty 总资产
__profit 盈亏
__stockProperty 当前用户股票资产
__originalProperty 用户本金
"""
__username = ''
__balance = 10000
__totalProperty = 10000
__profit = 0
__stockProperty = 0 #
__originalProperty = 10000 # 用户本金
def __init__(self, name):
self.__username = name
def calBalance(self):
"""查询返回用户余额"""
db = Database('testDB.db', self.__username)
db.getLinkedUser(self.__username)
temp = db.getUserCurrentmoney()
return temp
def calToatalProperty(self):
"""查询返回用户总资产"""
db = Database('testDB.db', self.__username)
db.getLinkedUser(self.__username)
temp = db.getUserCurrentprop()
return temp
def calPrfLoss(self):
"""查询返回当前利润"""
return self.calToatalProperty() - self.__originalProperty
def calStockProp(self):
"""查询返回用户股票资产"""
db = Database('testDB.db', self.__username)
db.getLinkedUser(self.__username)
temp = db.getUserStockprop()
return temp
def update(self):
self.__balance = self.calBalance()
self.__totalProperty = self.calToatalProperty()
self.__profit = self.calPrfLoss()
self.__stockProperty = self.calStockProp()
return True
def buyOneStock(self, stockname, stocknum):
"""买入一支股票
:param stockname: 购买股票名称
:param stocknum: 购买数量
:return: BOOL
"""
db = Database('testDB.db', self.__username)
money = stocknum * db.getStockPrice(stockname)
flag1 = (bool)(db.getUserCurrentmoney() > money)
flag2 = (bool)(db.getStockBalance(stockname) > stocknum)
if flag1 and flag2:
db.changeUserStocknum(self.__username, stockname, stocknum)
db.changeStockBalance(stockname, -stocknum)
db.changeUserCurrentmoney(-money)
return True
else:
return False
def sellOneStock(self, stockname, stocknum):
"""卖出一支股票
:param stockname: 购买股票名称
:param stocknum: 购买数量
:return: BOOL
"""
db = Database('testDB.db', self.__username)
money = stocknum * db.getStockPrice(stockname)
if (bool)(db.getUserStocknum(self.__username, stockname) > stocknum):
db.changeUserStocknum(self.__username, stockname, stocknum)
db.changeStockBalance(stockname, -stocknum)
db.changeUserCurrentmoney(-money)
return True
else:
return False
def getUsername(self):
"""
:return: string用户名
"""
self.update()
return self.__username
def getBalance(self):
"""
:return: float用户现金余额
"""
self.update()
db = Database('testDB.db', self.__username)
self.__balance = db.getUserCurrentmoney()
return self.__balance
def getTotalProperty(self):
"""
:return: float用户现有总资产
"""
self.update()
return self.__totalProperty
def getProfitOrLoss(self):
"""
:return: float用户总资产盈亏
"""
self.update()
return round(self.__profit, 2)
def getStockProp(self):
"""
:return: float用户股票总额
"""
self.update()
return self.__stockProperty
def drawUserExchange(self, figure):
"""
用于在屏幕上显示用户持有的股票数量,显示方式为直方图图
:param figure: Figure
:return:
"""
db = Database('testDB.db', self.__username)
stocknamelist = db.getStocknameList()
userstocknumlist = db.getUserStocknnumlist(self.__username)
width = 0.5
a = figure.add_subplot(111)
ind = np.arange(1, len(stocknamelist) + 1, 1)
a.cla()
a.bar(ind - width / 2, userstocknumlist, width, color='green')
a.set_xticks(ind)
a.set_xticklabels(stocknamelist)
a.set_ylabel('Stock Num')
a.set_xlabel('Stock ID')
a.set_ylabel('Stock Num')
def getStockholdingMsg(self):
"""
:return: string 用户所有股票数量信息
"""
db = Database('testDB.db', self.__username)
return db.getUserStockholdingStr(self.__username)
class Stock():
"""
@Class describe: 股票类、属于事务管理层。包含所有股票市场的操作,直接与表现层链接
@private param: __username 用户名
"""
__username = ''
def __init__(self, username):
self.__username = username
return
def showStockprice(self, f):
"""
在屏幕上用柱状图的形式显示所有股票信息价格,包含了股票价格浮动功能,并且按照股价顺序列出各项股票
:param f: Figure
:return:
"""
"""
按照股价顺序排列各个股票
"""
db = Database('testDB.db', '')
self.floatStock()
stockpricelist = []
stocknamelist = []
dict2 = sorted(dict(zip(db.getStocknameList(), db.getStockpriceList())).iteritems(), key=lambda d: d[1],
reverse=True)
for i in range(len(dict2)):
stockpricelist.append(dict2[i][1])
stocknamelist.append(dict2[i][0])
a = f.add_subplot(111)
ind = np.arange(1, len(stocknamelist) + 1, 1)
width = 0.5
a.cla()
a.bar(ind - width / 2, stockpricelist, width, color='green')
a.set_xticks(ind)
a.set_xticklabels(stocknamelist)
a.set_xlabel(u'Stock ID')
a.set_ylabel(u'Stock Price')
return True
def floatStock(self):
"""
对股票市场进行价格浮动,10%以内上下随机浮动
:return: Bool
"""
db = Database('testDB.db', '')
stocknamelist = db.getStocknameList()
for n in stocknamelist:
temp = random.uniform(random.uniform(90, 110), random.uniform(90, 110)) / 100
price1 = ((float)(db.getStockPrice(n)))
price = round(price1 * temp, 2)
a = db.changeStockPrice(n, price)
return True
def addNewstock(self, stockname, stockprice, stocknum):
"""
在股票市场增加一支股票
:param stockname: 股票名称
:param stockprice: 股票价格
:param stocknum: 股票总数量
:return: Bool
"""
db = Database('testDB.db', '')
stocknamelist = db.getStocknameList()
if stockname in stocknamelist:
return False
else:
stocknamelist.append(stockname)
db.addnewstock(stockname, stockprice, stocknum)