教你亲手用Django搭建一个基金模拟交易系统

亲手教你如何搭建一个基金模拟系统(基于Django框架)

第一步:创建项目、APP以及静态文件存储文件夹

django-admin startproject Chongyang
django-admin startapp Stock    # Chongyang文件夹里面操作
在chongyang项目创建statics和templates两个文件夹

第二步:配置Setting.py文件

LANGUAGE_CODE = 'zh-hans'      # 汉语
TIME_ZONE = 'Asia/Shanghai'    # 时区

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'Stock'       # 添加自己的APP名
]   

# 数据库配置(使用默认sqlite) 
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        'NAME': os.path.join(BASE_DIR, 'StockDB.db'),
        }
}

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',
            ],
        },
    },
]

STATIC_URL = '/static/'         # 静态文件配置
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'statics'),        # 具体的路径
    os.path.join(BASE_DIR, 'templates'),
]

第三步:创建超级管理员、运行项目

python manage.py createsuperuser
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),
    url(r'^add_fund_manger/$', views.add_fund_manger),
    url(r'^add_stock/$', views.add_stock),
    url(r'^trading/$', views.check),
    url(r'^trading_success/$', views.trading),
    url(r'^fund_pool/$', views.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, 'check.html')

def data_entry(request):
    return render(request, 'data_entry.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=oprate,
                              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、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>
2、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>
3、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>
4、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 runserver 0.0.0.0:8000

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

猜你喜欢

转载自blog.csdn.net/Luzaofa/article/details/80662148
今日推荐