使用Django搭建一个基金模拟交易系统教程
框架(架构)  /  管理员 发布于 7年前   407
亲手教你如何搭建一个基金模拟系统(基于Django框架)
第一步:创建项目、APP以及静态文件存储文件夹
django-admin startproject Chongyangdjango-admin startapp Stock # Chongyang文件夹里面操作
在chongyang项目创建statics和templates两个文件夹
第二步:配置Setting.py文件
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'Stock' # 添加自己的APP名] TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')], # 静态文件夹地址(必须配置) 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, },]# 数据库配置(使用默认sqlite) DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 'NAME': os.path.join(BASE_DIR, 'StockDB.db'), } }LANGUAGE_CODE = 'zh-hans' # 汉语TIME_ZONE = 'Asia/Shanghai' # 时区STATIC_URL = '/static/' # 静态文件配置STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'statics'), # 具体的路径 os.path.join(BASE_DIR, 'templates'),]
第三步:运行项目
python manage.py runserver 0.0.0.0:8000
到目前为止,你已经创建了一个拥有极其庞大功能的web网站,后续只需激活相应的服务即可
url.py # 路由配置文件views.py # 功能实现文件admin.py # 后台管理文件model.py # 数据库创建文件
第四步:具体项目配置
在配置好前面设置后直接在相应的文件里复制如下代码运行项目即可
1、models.py
from django.db import modelsimport uuid# 基金经理数据表class Fund_Manger(models.Model): name = models.CharField(max_length=20) age = models.IntegerField() entry_time = models.CharField(max_length=20) def __str__(self): return self.name# 股票信息数据表class Stock(models.Model): stock_name = models.CharField(max_length=20) code = models.CharField(max_length=10) def __str__(self): return self.code# 交易系统表class Trading(models.Model): name = models.CharField(max_length=20) time = models.DateTimeField() code = models.CharField(max_length=10) number = models.IntegerField() price = models.CharField(max_length=10) operate = models.CharField(max_length=10) total_price = models.CharField(max_length=20)# 清算数据表class Fund_pool(models.Model): time = models.DateTimeField() total_pool = models.CharField(max_length=30) oprate_people = models.CharField(max_length=10) people_num = models.IntegerField() def __str__(self): return self.total_pool
2、url.py
from django.contrib import adminfrom django.urls import pathfrom django.conf.urls import urlfrom Stock import viewsurlpatterns = [ path('admin/', admin.site.urls), url(r'^$', views.index), url(r'^data_entry/$', views.data_entry, name='data_entry'), url(r'^add_fund_manger/$', views.add_fund_manger), url(r'^add_stock/$', views.add_stock), url(r'^check$', views.check_index, name='check'), url(r'^trading/$', views.check), url(r'^trading_success/$', views.trading), url(r'^fund_pool/$', views.Fund_pool_, name='fund_pool'), url(r'^account/$', views.Account)]
3、views.py
from django.shortcuts import renderfrom django.http import HttpResponsefrom django.utils import timezonefrom Stock.models import Fund_Manger, Stock, Trading, Fund_poolimport redef index(request): return render(request, 'index.html')def data_entry(request): return render(request, 'data_entry.html')def check_index(request): return render(request, 'check.html')def add_fund_manger(request): ''' 添加时需判断原始表是否已经存在此用户信息 同时添加年龄限制(20~40) ''' if request.method == "POST": name = request.POST['name'] age = request.POST['age'] entry_time = request.POST['Time'] check_name = Fund_Manger.objects.filter(name=name) if check_name: return HttpResponse("<center><h1>该用户已处在!</h1></center>") else: if int(age) < 20 or int(age) >= 40: return HttpResponse("<center><h1>该用户年龄不符合要求!</h1></center>") else: Mas = Fund_Manger(name=name, age=age, entry_time=entry_time) Mas.save() return HttpResponse("<center><h1>用户注册成功!</h1></center>")def add_stock(request): ''' 添加基金池数据时需对股票代码做限定 仅限A股市场,同时做异常捕获处理 ''' if request.method == "POST": stock_name = request.POST['stock_name'] post_code = request.POST['code'] # 过滤交易代码(以0、3、6开头长度为6的数字) pattern = re.compile(r'000[\d+]{3}$|^002[\d+]{3}$|^300[\d+]{3}$|^600[\d+]{3}$|^601[\d+]{3}$|^603[\d+]{3}$') code = pattern.findall(post_code) # 异常处理 try: num = code[0].__len__() if num == 6: Mas = Stock(stock_name=stock_name, code=code[0]) Mas.save() return HttpResponse("<center><h1>基金池数据添加成功!</h1></center>") else: return HttpResponse("<center><h1>错误代码!</h1></center>") except Exception as e: return HttpResponse("<center><h1>错误代码!</h1></center>")def check(request): ''' 信息合规查询(仅限A股数据) 需对基金经理、股票代码、交易数量同时做判断 ''' if request.method == "POST": name = request.POST['name'] code = request.POST['code'] number = request.POST['number'] # 基金经理信息过滤 try: check_name = Fund_Manger.objects.filter(name=name) if check_name: # 基金池数据过滤 try: check_code = Stock.objects.filter(code=code) # 交易数量过滤 if check_code: if int(number) % 100 == 0: return render(request, 'trade_index.html', {"name": name, "code": code, "number": number}) else: return HttpResponse('<center><h1>交易数量填写错误!</h1></center>') else: return HttpResponse('<center><h1>基金池无该股票信息!</h1></center>') except Exception as e: print('异常信息为:%s' % str(e)) pass else: return HttpResponse('<center><h1>没有该基金经理!</h1></center>') except Exception as e: print('异常信息为:%s' % str(e)) passdef trading(request): ''' 按照操作进行划分(买入卖出) 若买入只需判断交易金额与剩余现金资产对比即可 若卖出还需对其持股数量加以判断 ''' if request.method == "POST": name = request.POST['name'] code = request.POST['code'] number = request.POST['number'] price = request.POST['price'] operate = request.POST['operate'] # 获取剩余可用资金 try: total_price = float(Trading.objects.all().order_by('-time')[0].total_price) except Exception as e: total_price = 1000000 if operate == '卖出': # 获取此股票持仓数量 stock_nums = Trading.objects.filter(code=code) stock_num = sum([i.number for i in stock_nums]) number = -int(number) if abs(number) <= stock_num: # 计算交易所需金额 trade_price = float(price) * int(number) balance = total_price - trade_price Time_ = timezone.localtime(timezone.now()).strftime("%Y-%m-%d %H:%M:%S") Mas = Trading(name=name, time=Time_, code=code, number=number, price=price, operate=operate, total_price=balance) Mas.save() return HttpResponse("<center><h1>交易完成!</h1></center>") else: return HttpResponse("<center><h1>持仓数小于卖出数,无法交易!</h1></center>") elif operate == '买入': trade_price = float(price) * int(number) balance = total_price - trade_price Time_ = timezone.localtime(timezone.now()).strftime("%Y-%m-%d %H:%M:%S") if trade_price <= total_price: Mas = Trading(name=name, time=Time_, code=code, number=number, price=price, operate=operate, total_price=balance) Mas.save() print(total_price) return HttpResponse("<center><h1>交易完成!</h1></center>") else: print(total_price) return HttpResponse("<center><h1>资金总额不足!</h1></center>") else: return HttpResponse("<center><h1>无效指令!</h1></center>")def Fund_pool_(request): return render(request, 'fund_pool.html')def Account(request): ''' 清算只需查询操作人是否为基金经理即可 ''' if request.method == "POST": name = request.POST['name'] # 基金经理信息 check_name = Fund_Manger.objects.filter(name=name) # 基金操作人数统计 oprate_people = Trading.objects.all() if check_name: total_price = float(Trading.objects.all().order_by('-time')[0].total_price) total_pool = '¥ ' + str(total_price) oprate_people_num = set([stock_name.name for stock_name in oprate_people]).__len__() Time_ = timezone.localtime(timezone.now()).strftime("%Y-%m-%d %H:%M:%S") Mas = Fund_pool(time=Time_, total_pool=total_pool, oprate_people=name, people_num=oprate_people_num) Mas.save() return HttpResponse("<center><h1>数据清算成功!</h1></center>") else: return HttpResponse('<center><h1>非法操作!</h1></center>')
4、admin.py
from django.contrib import adminfrom Stock.models import Fund_Manger, Stock, Trading, Fund_pool# Register your models here.class Fund_MangerAdmin(admin.ModelAdmin): list_display = ('name', 'age', 'entry_time')class StockAdmin(admin.ModelAdmin): list_display = ('stock_name', 'code')class TradingAdmin(admin.ModelAdmin): list_display = ('name', 'time', 'code', 'number', 'price', 'operate', 'total_price')class Fund_PoolAdmin(admin.ModelAdmin): list_display = ('time', 'total_pool', 'oprate_people', 'people_num')admin.site.register(Fund_Manger, Fund_MangerAdmin)admin.site.register(Stock, StockAdmin)admin.site.register(Trading, TradingAdmin)admin.site.register(Fund_pool, Fund_PoolAdmin)
第五步:在templates文件夹下面创建业务页面
1、index.html
<!DOCTYPE html><html lang="en"><head>{# <meta http-equiv="refresh" content="3;URL=data_entry/">#} <meta charset="UTF-8"> <title>首页</title><style> a{ font-size:25px; color: white} li{ color: white; font-size: 30px}</style></head><body style="background:url('../static/images/background.jpg') no-repeat fixed top; background-size: 100% 180%;overflow: hidden;"><center> <br/> <div style="position:fixed;left:0;right:0;top:0;bottom:0;width: 500px; height: 400px; margin:auto;"> <img src="https:/article/../static/images/logo.jpg" width="245" height="100"> <h2 style="color: white; size: 10px">基金模拟系统:</h2> <li><a href="https:/article/{% url 'data_entry' %}" rel="external nofollow" >数据录入系统</a></li> <li><a href="https:/article/{% url 'check' %}" rel="external nofollow" aria-setsize="10px">合规管理系统</a></li> <li><a href="https:/article/{% url 'fund_pool' %}" rel="external nofollow" >尾盘清算系统</a></li> </div></center></body></html>
2、check.html
<!DOCTYPE html><html><head><title>合规查询系统</title></head><body style="background:url('../static/images/background.jpg') no-repeat fixed top; background-size: 100% 180%;overflow: hidden;"><center> <br/> <div style="position:fixed;left:0;right:0;top:0;bottom:0;width: 500px; height: 400px; margin:auto;"> <img src="https:/article/../static/images/logo.jpg" width="245" height="100"> <h2 style="color: white; size: 10px">合规查询系统:</h2> <form action="/trading/" method="POST"> {% csrf_token %} <label style="color: white; size: 10px">姓 名: </label> <input type="text" name="name"> <br> <label style="color: white; size: 10px">代 码: </label> <input type="text" name="code"> <br> <label style="color: white; size: 10px">数 量: </label> <input type="text" name="number"> <br><br> <input type="submit" type="submit" style="width: 80px;height: 30px;border-radius: 7px;" value="提 交"> </form> </div></center></body></html>
3、data_entry.html
<!DOCTYPE html><html><head><title>数据录入系统</title></head><body style="background:url('../static/images/background.jpg') no-repeat fixed top; background-size: 100% 180%;overflow: hidden;"><center> <div style="position:fixed;left:0;right:0;top:0;bottom:0;width: 700px; height: 400px; margin:auto;"> <h1 style="color: white; size: 10px">重阳投资</h1> <h4 style="color: white; size: 10px">基金交易职员信息录入系统:</h4> <form action="/add_fund_manger/" method="post"> {% csrf_token %} <label style="color: white; size: 10px">姓 名: </label> <input type="text" name="name"> <br> <label style="color: white; size: 10px">年 龄: </label> <input type="text" name="age"> <br> <label style="color: white; size: 10px">入职时间: </label> <input type="text" name="Time"> <br><br> <input type="submit" style="width: 80px;height: 30px;border-radius: 7px;" value="提 交"> </form> <h4 style="color: white; size: 10px">基金池信息录入系统:</h4> <form action="/add_stock/" method="post"> {% csrf_token %} <label style="color: white; size: 10px">股票简称: </label> <input type="text" name="stock_name"> <br> <label style="color: white; size: 10px">代 码: </label> <input type="text" name="code"> <br><br> <input type="submit" style="width: 80px;height: 30px;border-radius: 7px;" value="提 交"> </form> </div></center></body></html>
4、trade_index.html
<!DOCTYPE html><html><head><title>交易系统</title></head><body style="background:url('../static/images/background.jpg') no-repeat fixed top; background-size: 100% 250%;overflow: hidden;"><center> <div style="position:fixed;left:0;right:0;top:0;bottom:0;width: 500px; height: 400px; margin:auto;"> <h1 style="color: white; size: 10px">重阳投资</h1> <h2 style="color: white; size: 10px">交易系统:</h2> <form action="/trading_success/" method="POST"> {% csrf_token %} <label style="color: white; size: 10px">姓 名: </label> <input type="text" name="name" value={{ name }} readonly="readonly" /> <br> <label style="color: white; size: 10px">代 码: </label> <input type="text" name="code" value={{ code }} readonly="readonly" /> <br> <label style="color: white; size: 10px">数 量: </label> <input type="text" name="number" value={{ number }} readonly="readonly" /> <br> <label style="color: white; size: 10px">价 格: </label> <input type="text" name="price"> <br> <label style="color: white; size: 10px">操 作: </label> <input type="text" name="operate"> <br><br> <input type="submit" type="submit" style="width: 80px;height: 30px;border-radius: 7px;" value="提 交"> </form> </div></center></body></html>
5、fund_pool.html
<!DOCTYPE html><html><head><title>基金清算系统</title></head><body style="background:url('../static/images/background.jpg') no-repeat fixed top; background-size: 100% 180%;overflow: hidden;"><center> <br> <div style="position:fixed;left:0;right:0;top:0;bottom:0;width: 500px; height: 400px; margin:auto;"> <h1 style="color: white; size: 10px">重阳投资</h1> <h4 style="color: white; size: 10px">基金清算系统:</h4> <form action="/account/" method="post"> {% csrf_token %} <label style="color: white; size: 10px">姓 名: </label> <input type="text" name="name"> <br><br> <input type="submit" style="width: 80px;height: 30px;border-radius: 7px;" value="清 算"> </form> </div></center></body></html>
第六步:创建表结构,创建超级管理员,运行项目即可
python manage.py makemigrationspython manage.py migratepython manage.py createsuperuserpython manage.py runserver 0.0.0.0:8000
以下内容只是自己学习Django的一点总结分享,有不足的地方欢迎大家指导学习,一起进步。
这篇使用Django搭建一个基金模拟交易系统教程就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号