完成程序设计课程的大作业,用python写的简单的股票交易系统

这是一个使用Python编写的简单股票交易系统,包括用户类(User)和股票类(Stock),实现了用户余额查询、股票买卖、股票价格浮动等功能。用户可以查看股票价格、买卖股票,并通过Tkinter展示交易信息和股票持有情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# coding=utf-8
"""


@author: liujiawei (Sy1507518),hanxu (Sy1507522)
@license: GPL
@contact: hanxubuaa11107@gmail.com,liujiawei0524@buaa.edu.com
@see: http://blog.youkuaiyun.com/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)
        return True


    def initStock(self):
        """
        用户股票数清零
        :param :   None
        :return:   None
        """
python大作业 一、Turtle创意大PK 自拟题目,完成一个利用Python程序的创意绘图,采用turtle库绘图为主,不少于50行代码,可选采用其他库。 (滑稽绘制) 二、程序练习 2.1 问题描述(10分) 人们常常提到"一万小定律",就是不管你做什么事情,只要坚持一万小,应该都可以成为该领域的专家。那么,10000小是多少年多少天呢? 2.2 问题描述(10分)0380031003800341590145037657 编写计算从n到m和的函数‬,函数名为sum(n,m)‬,函数返回值为n到m所有数据的和‬,使用该函数计算输入数据x,y之间所有数据的和。 2.3 问题描述(15分) 编写函数judgeTri(a,b,c),判断以参数a,b,c的值为边长能否构成三角形并判断三角形的形状;若是锐角三角形,返回R;若是直角三角形,返回Z;若是钝角三角形,返回D;若三边长不能构成三角形,返回ERROR。 2.4 问题描述(15分) 用户输入一个字符串,分别统计其中小字母、大字母、数字、空格和其他字符的个数,并在一行内输出小字母、大字母、数字、空格和其他字符的个数。 2.5 问题描述(20分) 程序的功能: (1) 使用随机库功能,生成一个包含10个不重复且小于200的正整数列表ls1,输出ls1。‬ (2) 使用列表排序方法,对ls1按奇数在前偶数在后,并且奇数之间的相对顺序不变,偶数之间的相对顺序也不变进行排序,再输出ls1。‬ (3) 使用列表排序方法,对ls1按元素字符长度降序进行排序,输出ls1。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值