使用Django搭建一个基金模拟交易系统教程


Posted in Python onNovember 18, 2019

亲手教你如何搭建一个基金模拟系统(基于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><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))
  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><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 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 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="../static/images/logo.jpg" width="245" height="100">
 <h2 style="color: white; size: 10px">基金模拟系统:</h2>

 <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 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="../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 makemigrations
python manage.py migrate
python manage.py createsuperuser
python manage.py runserver 0.0.0.0:8000

以下内容只是自己学习Django的一点总结分享,有不足的地方欢迎大家指导学习,一起进步。

这篇使用Django搭建一个基金模拟交易系统教程就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python使用filetype精确判断文件类型
Jul 02 Python
python爬虫爬取网页表格数据
Mar 07 Python
Pandas标记删除重复记录的方法
Apr 08 Python
python 限制函数执行时间,自己实现timeout的实例
Jan 12 Python
Python中的random.uniform()函数教程与实例解析
Mar 02 Python
python实现弹跳小球
May 13 Python
Python求均值,方差,标准差的实例
Jun 29 Python
python实现socket+threading处理多连接的方法
Jul 23 Python
python 扩展print打印文件路径和当前时间信息的实例代码
Oct 11 Python
python单例模式原理与创建方法实例分析
Oct 26 Python
python用tkinter实现一个gui的翻译工具
Oct 26 Python
python 批量压缩图片的脚本
Jun 02 Python
wxPython实现文本框基础组件
Nov 18 #Python
WxPython实现无边框界面
Nov 18 #Python
python中的RSA加密与解密实例解析
Nov 18 #Python
wxpython绘制圆角窗体
Nov 18 #Python
wxpython绘制音频效果
Nov 18 #Python
python导入不同目录下的自定义模块过程解析
Nov 18 #Python
解决django model修改添加字段报错的问题
Nov 18 #Python
You might like
PHP中的日期处理方法集锦
2007/01/02 PHP
php获取淘宝分类id示例
2014/01/16 PHP
PHP的Yii框架的常用日志操作总结
2015/12/08 PHP
聊聊 PHP 8 新特性 Attributes
2020/08/19 PHP
PHP延迟静态绑定使用方法实例解析
2020/09/05 PHP
HTML5如何适配 iPhone IOS 底部黑条
2021/03/09 HTML / CSS
JavaScript语言中的Literal Syntax特性分析
2007/03/08 Javascript
一个简单的jquery进度条示例
2014/04/28 Javascript
JS实现合并两个数组并去除重复项只留一个的方法
2015/12/17 Javascript
JavaScript位置与大小(1)之正确理解和运用与尺寸大小相关的DOM属性
2015/12/26 Javascript
javascript匀速动画和缓冲动画详解
2016/10/20 Javascript
jQuery 循环遍历改变a标签的href(实例讲解)
2017/07/12 jQuery
jquery写出PC端轮播图实例
2018/01/26 jQuery
图文介绍Vue父组件向子组件传值
2018/02/17 Javascript
React diff算法的实现示例
2018/04/20 Javascript
JS装饰器函数用法总结
2018/04/21 Javascript
vue 自定义组件的写法与用法详解
2020/03/04 Javascript
Python实现将sqlite数据库导出转成Excel(xls)表的方法
2017/07/17 Python
Python实现批量压缩图片
2018/01/25 Python
python正则实现提取电话功能
2018/02/24 Python
python数字图像处理实现直方图与均衡化
2018/05/04 Python
python ddt数据驱动最简实例代码
2019/02/22 Python
python标记语句块使用方法总结
2019/08/05 Python
基于python实现地址和经纬度转换
2020/05/19 Python
最简单的matplotlib安装教程(小白)
2020/07/28 Python
python 获取字典键值对的实现
2020/11/12 Python
整理HTML5的一些新特性与Canvas的常用属性
2016/01/29 HTML / CSS
驴妈妈旅游网:中国新型的B2C旅游电子商务网站
2016/08/16 全球购物
英国领先的高街书籍专家:Waterstones
2018/02/01 全球购物
Foot Locker加拿大官网:美国知名运动产品零售商
2019/07/21 全球购物
成语的广告词
2014/03/19 职场文书
劳务派遣管理制度(样本)
2019/08/23 职场文书
Vue项目中如何封装axios(统一管理http请求)
2021/05/02 Vue.js
解决Laravel使用验证时跳转到首页的问题
2021/11/17 PHP
MongoDB支持的索引类型
2022/04/11 MongoDB
什么是clearfix (一文搞清楚css清除浮动clearfix)
2023/05/21 HTML / CSS