小编给大家分享一下使用Django搭建一个基金模拟交易系统的案例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
如何搭建一个基金模拟系统(基于Django框架)
第一步:创建项目、APP以及静态文件存储文件夹
django-admin startproject Chongyang
django-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 models
import 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 admin
from django.urls import path
from django.conf.urls import url
from Stock import views
urlpatterns = [
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 render
from django.http import HttpResponse
from django.utils import timezone
from Stock.models import Fund_Manger, Stock, Trading, Fund_pool
import re
def 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><h2>该用户已处在!</h2></center>")
else:
if int(age) < 20 or int(age) >= 40:
return HttpResponse("<center><h2>该用户年龄不符合要求!</h2></center>")
else:
Mas = Fund_Manger(name=name, age=age, entry_time=entry_time)
Mas.save()
return HttpResponse("<center><h2>用户注册成功!</h2></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><h2>基金池数据添加成功!</h2></center>")
else:
return HttpResponse("<center><h2>错误代码!</h2></center>")
except Exception as e:
return HttpResponse("<center><h2>错误代码!</h2></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><h2>交易数量填写错误!</h2></center>')
else:
return HttpResponse('<center><h2>基金池无该股票信息!</h2></center>')
except Exception as e:
print('异常信息为:%s' % str(e))
pass
else:
return HttpResponse('<center><h2>没有该基金经理!</h2></center>')
except Exception as e:
print('异常信息为:%s' % str(e))
pass
def 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><h2>交易完成!</h2></center>")
else:
return HttpResponse("<center><h2>持仓数小于卖出数,无法交易!</h2></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><h2>交易完成!</h2></center>")
else:
print(total_price)
return HttpResponse("<center><h2>资金总额不足!</h2></center>")
else:
return HttpResponse("<center><h2>无效指令!</h2></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><h2>数据清算成功!</h2></center>")
else:
return HttpResponse('<center><h2>非法操作!</h2></center>')
4、admin.py
from django.contrib import admin
from 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 >
<center>
<br/>
<div >
<img src="../static/images/logo.jpg" width="245" height="100">
<h3 >基金模拟系统:</h3>
<li><a href="{% url 'data_entry' %}" rel="external nofollow" >数据录入系统</a></li>
<li><a href="{% url 'check' %}" rel="external nofollow" aria-setsize="10px">合规管理系统</a></li>
<li><a href="{% url 'fund_pool' %}" rel="external nofollow" >尾盘清算系统</a></li>
</div>
</center>
</body>
</html>
2、check.html
<!DOCTYPE html>
<html>
<head>
<title>合规查询系统</title>
</head>
<body >
<center>
<br/>
<div >
<img src="../static/images/logo.jpg" width="245" height="100">
<h3 >合规查询系统:</h3>
<form action="/trading/" method="POST">
{% csrf_token %}
<label >姓 名: </label>
<input type="text" name="name"> <br>
<label >代 码: </label>
<input type="text" name="code"> <br>
<label >数 量: </label>
<input type="text" name="number"> <br><br>
<input type="submit" type="submit" value="提 交">
</form>
</div>
</center>
</body>
</html>
3、data_entry.html
<!DOCTYPE html>
<html>
<head>
<title>数据录入系统</title>
</head>
<body >
<center>
<div >
<h2 >重阳投资</h2>
<h5 >基金交易职员信息录入系统:</h5>
<form action="/add_fund_manger/" method="post">
{% csrf_token %}
<label >姓 名: </label>
<input type="text" name="name"> <br>
<label >年 龄: </label>
<input type="text" name="age"> <br>
<label >入职时间: </label>
<input type="text" name="Time"> <br><br>
<input type="submit" value="提 交">
</form>
<h5 >基金池信息录入系统:</h5>
<form action="/add_stock/" method="post">
{% csrf_token %}
<label >股票简称: </label>
<input type="text" name="stock_name"> <br>
<label >代 码: </label>
<input type="text" name="code"> <br><br>
<input type="submit" value="提 交">
</form>
</div>
</center>
</body>
</html>
4、trade_index.html
<!DOCTYPE html>
<html>
<head>
<title>交易系统</title>
</head>
<body >
<center>
<div >
<h2 >重阳投资</h2>
<h3 >交易系统:</h3>
<form action="/trading_success/" method="POST">
{% csrf_token %}
<label >姓 名: </label>
<input type="text" name="name" value={{ name }} readonly="readonly" /> <br>
<label >代 码: </label>
<input type="text" name="code" value={{ code }} readonly="readonly" /> <br>
<label >数 量: </label>
<input type="text" name="number" value={{ number }} readonly="readonly" /> <br>
<label >价 格: </label>
<input type="text" name="price"> <br>
<label >操 作: </label>
<input type="text" name="operate"> <br><br>
<input type="submit" type="submit" value="提 交">
</form>
</div>
</center>
</body>
</html>
5、fund_pool.html
<!DOCTYPE html>
<html>
<head>
<title>基金清算系统</title>
</head>
<body >
<center>
<br>
<div >
<h2 >重阳投资</h2>
<h5 >基金清算系统:</h5>
<form action="/account/" method="post">
{% csrf_token %}
<label >姓 名: </label>
<input type="text" name="name"> <br><br>
<input type="submit" value="清 算">
</form>
</div>
</center>
</body>
</html>
第六步:创建表结构,创建超级管理员,运行项目即可
python manage.py makemigrations python manage.py migrate python manage.py createsuperuser python manage.py runserver 0.0.0.0:8000
以上是“使用Django搭建一个基金模拟交易系统的案例”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。