使用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 相关文章推荐
pyv8学习python和javascript变量进行交互
Dec 04 Python
python3编写C/S网络程序实例教程
Aug 25 Python
python查询mysql中文乱码问题
Nov 09 Python
python实现端口转发器的方法
Mar 13 Python
Windows下python3.6.4安装教程
Jul 31 Python
执行Django数据迁移时报 1091错误及解决方法
Oct 14 Python
jupyter notebook的安装与使用详解
May 18 Python
python3爬虫中异步协程的用法
Jul 10 Python
Matplotlib 折线图plot()所有用法详解
Jul 28 Python
python解决12306登录验证码的实现
Apr 18 Python
关于python爬虫应用urllib库作用分析
Sep 04 Python
pytorch实现加载保存查看checkpoint文件
Jul 15 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 面向对象实现代码
2009/11/11 PHP
CodeIgniter上传图片成功的全部过程分享
2013/08/12 PHP
php函数间的参数传递(值传递/引用传递)
2013/09/23 PHP
PHP递归复制、移动目录的自定义函数分享
2014/11/18 PHP
PHP正则验证Email的方法
2015/06/15 PHP
PHP函数checkdnsrr用法详解(Windows平台用法)
2016/03/21 PHP
php魔术方法功能与用法实例分析
2016/10/19 PHP
PHP面向对象程序设计模拟一般面向对象语言中的方法重载(overload)示例
2019/06/13 PHP
基于jQuery的图片左右无缝滚动插件
2012/05/23 Javascript
JS随即打乱数组实现代码
2012/12/03 Javascript
关闭浏览器输入框自动补齐 兼容IE,FF,Chrome等主流浏览器
2014/02/11 Javascript
当前流行的JavaScript代码风格指南
2014/09/10 Javascript
JavaScript异步加载浅析
2014/12/28 Javascript
JavaScript中指定函数名称的相关方法
2015/06/04 Javascript
jQuery操作Table技巧大汇总
2016/01/23 Javascript
Vue ElementUI之Form表单验证遇到的问题
2017/08/21 Javascript
vue.js添加一些触摸事件以及安装fastclick的实例
2018/08/28 Javascript
Windows下支持自动更新的Electron应用脚手架的方法
2018/12/24 Javascript
javascript sort()对数组中的元素进行排序详解
2019/10/13 Javascript
微信小程序自定义组件components(代码详解)
2019/10/21 Javascript
使用vue-cli3+typescript的项目模板创建工程的教程
2020/02/28 Javascript
JavaScript中的各种宽高属性的实现
2020/05/08 Javascript
原生js 实现表单验证功能
2021/02/08 Javascript
[38:44]DOTA2上海特级锦标赛A组小组赛#2 Secret VS CDEC第二局
2016/02/25 DOTA
使用Python的Twisted框架编写非阻塞程序的代码示例
2016/05/25 Python
python绘制简单折线图代码示例
2017/12/19 Python
Python企业编码生成系统之主程序模块设计详解
2019/07/26 Python
Python使用ElementTree美化XML格式的操作
2020/03/06 Python
关于HTML5你必须知道的28个新特性,新技巧以及新技术
2012/05/28 HTML / CSS
html5指南-5.使用web storage存储键值对的数据
2013/01/07 HTML / CSS
大韩航空官方网站:Korean Air
2017/10/25 全球购物
Bibloo荷兰:女士、男士和儿童的服装、鞋子和配饰
2019/02/25 全球购物
全国法院系统开展党的群众路线教育实践活动综述(全文)
2014/10/25 职场文书
golang switch语句的灵活写法介绍
2021/05/06 Golang
html5实现点击弹出图片功能
2021/07/16 HTML / CSS
centos8安装nginx1.9.1的详细过程
2021/08/02 Servers