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

 更新时间:2019年11月18日 15:09:47   作者:Luzaofa  
今天小编就为大家分享一篇使用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><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">姓&nbsp;&nbsp;&nbsp;名: </label>
  <input type="text" name="name"> <br>
  <label style="color: white; size: 10px">代&nbsp;&nbsp;&nbsp;码: </label>
  <input type="text" name="code"> <br>
  <label style="color: white; size: 10px">数&nbsp;&nbsp;&nbsp;量: </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">姓&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;名: </label>
  <input type="text" name="name"> <br>
  <label style="color: white; size: 10px">年&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;龄: </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">代&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;码: </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">姓&nbsp;&nbsp;&nbsp;名: </label>
  <input type="text" name="name" value={{ name }} readonly="readonly" /> <br>
  <label style="color: white; size: 10px">代&nbsp;&nbsp;&nbsp;码: </label>
  <input type="text" name="code" value={{ code }} readonly="readonly" /> <br>
  <label style="color: white; size: 10px">数&nbsp;&nbsp;&nbsp;量: </label>
  <input type="text" name="number" value={{ number }} readonly="readonly" /> <br>
  <label style="color: white; size: 10px">价&nbsp;&nbsp;&nbsp;格: </label>
  <input type="text" name="price"> <br>
  <label style="color: white; size: 10px">操&nbsp;&nbsp;&nbsp;作: </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">姓&nbsp;&nbsp;名: </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函数方法设计原则

    这篇文章主要介绍了总结的几个Python函数方法设计原则,本文讲解了每个函数只做一件事、保持简单、保持简短、输入使用参数、输出使用return语句等内容,需要的朋友可以参考下
    2015-06-06
  • pandas 层次化索引的实现方法

    pandas 层次化索引的实现方法

    这篇文章主要介绍了pandas 层次化索引的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • python如何给字典的键对应的值为字典项的字典赋值

    python如何给字典的键对应的值为字典项的字典赋值

    这篇文章主要介绍了python如何给字典的键对应的值为字典项的字典赋值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • Python二维码生成识别实例详解

    Python二维码生成识别实例详解

    这篇文章主要介绍了Python二维码生成识别实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • Python虚拟环境venv用法详解

    Python虚拟环境venv用法详解

    这篇文章主要介绍了Python虚拟环境venv用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • python 实现按对象传值

    python 实现按对象传值

    今天小编就为大家分享一篇python 实现按对象传值,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • Python面向对象程序设计之静态方法、类方法、属性方法原理与用法分析

    Python面向对象程序设计之静态方法、类方法、属性方法原理与用法

    这篇文章主要介绍了Python面向对象程序设计之静态方法、类方法、属性方法,结合实例形式分析了Python静态方法、类方法、属性方法相关概念、原理、用法及相关操作注意事项,需要的朋友可以参考下
    2020-03-03
  • Python3离线安装Requests模块问题

    Python3离线安装Requests模块问题

    这篇文章主要介绍了Python3离线安装Requests模块问题,本文实例代码给大家介绍的非常详细,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-10-10
  • python hook监听事件详解

    python hook监听事件详解

    这篇文章主要为大家详细介绍了python hook监听事件的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-10-10
  • Python将string转换到float的实例方法

    Python将string转换到float的实例方法

    在本篇文章中小编给大家分享的是关于Python将string转换到float的实例方法以及相关知识点,需要的朋友们参考下。
    2019-07-07

最新评论