1. 程式人生 > >教你親手用Django搭建一個基金模擬交易系統

教你親手用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' %}">資料錄入系統</a></li>
        <li><a href="{% url 'check' %}" aria-setsize="10px">合規管理系統</a></li>
        <li><a href="{% url 'fund_pool' %}">尾盤清算系統</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搭建一個基金模擬交易系統

親手教你如何搭建一個基金模擬系統(基於Django框架) 第一步:建立專案、APP以及靜態檔案儲存資料夾 django-admin startproject Chongyang django-admin startapp Stock # Chong

星期四、星期五、星期一—GUI做一個簡易的交易系統

his 換行 巧克力 cal show .get ner 文本域 array 1、登錄界面 package org.eclipse.wb.swing; //登錄界面 import java.awt.BorderLayout;import java.awt.EventQue

手把手搭建一個加密貨幣交易模擬器,不用投錢就能玩

box NPU nec idp reat 監控 最簡 data- 自己 手把手教你搭建一個加密貨幣交易模擬器,不用投錢就能玩 大數據文摘,編譯:汪小七、黃文暢、小魚 我雖然不是交易員,但對加密貨幣的交易非常感興趣。然而,我不會在自己什麽都不清楚的時候就盲目投

怎麼Vulnhub來搭建環境(爸爸再也不用擔心我沒有靶場練習了)(增加自己的部分)

0x01 前言 0x02 下載 映象的下載地址和描述、難度等級等 隨便點選下載,有些需要FQ才能下載,推薦官網的下載地址。 作為測試,我就下載JIS-CTF: VulnUpload作為演示吧 0x03 安裝 下載完後,解壓出來,會看到

使用Vultr搭建VSS(VPN)(怎麼每月2.5美金享受到VPN的待遇)

起源 現在很多VPN也被封的差不多了。本人有在google上查詢資料的習慣,故在vultr上搭建了一個VPN。下面列出來搭建步驟。 關於價格 Vultr是國外雲主機服務的有名服務商之一,服務費非常便宜,僅2.5美金一個月。 搭建步驟 註冊 使用信用卡充值 購

15分鐘在以太坊編寫一個區塊鏈Web應用

作者 | 汪曉明  以太坊是什麼 以太坊是一個全新開放的區塊鏈平臺,它允許任何人在平臺中建立和使用通過區塊鏈技術執行的去中心化應用。就像比特幣一樣,以太坊不受任何人控制,也不歸任何人所有——它是一個開源專案,由全球區塊鏈愛好者共同建立。和比特幣協議有所不同的是,以

Eclipse 搭建一個Maven Spring SpringMVC 項目

hibernate 文件 res version 日誌 創建 oca skip www 1: 先創建一個maven web 項目: 可以參照之前的文章: 用Maven 創建一個 簡單的 JavaWeb 項目 創建好之後的目錄是這樣的; 2: 先配置maven 修

初學django搭建一個通訊錄應用

ret normal turn 服務器 制作 ont star left default ---恢復內容開始--- django搭建一個通訊錄應用 一、環境介紹 window10 64位 Django-1.5.12 python 2.7 Sqlite3 二、基本安裝 py

LVS 搭建一個負載均衡集群(轉)

always iptable sina watch 通過 main test 集群服務器 負載 http://blog.jobbole.com/87503/ 第一篇:《如何生成每秒百萬級別的 HTTP 請求?》 第二篇:《為最佳性能調優 Nginx》 第三篇:《用 L

手把手從零開始做一個好看的 APP

@+ error 教你 教授 wip rac tco 需要 apt 前言 從零開始,手把手帶你實現一個「專註睡前的 APP」。睡覺之前如果能有一個 APP,能讓我們寫一寫這一天的見聞或者心得,同時又能看一會段子、瞄一會好看的妹子,放松一下疲憊的身心那該多好,這也是我完成這

手把手菠菜源碼搭建gitlab系列

倉庫 查找 OS RF 私人 基礎 裝包 功能 安裝流程 菠菜源碼搭建是一個用於倉庫管理系統的開源項目。使用Git作為代碼管理工具,並在此基礎上搭建起來的web服務。企 娥:217 1793 408 可通過Web界面進行訪問公開的或者私人項目。它擁有與Github類似的功能

圖解瀏覽器緩存,提高戶體驗

一起 判斷 當前 存在 -m 實踐經驗 gsp 每次 png 歡迎大家前往騰訊雲+社區,獲取更多騰訊海量技術實踐幹貨哦~ 本文由前端林子發表於雲+社區專欄 瀏覽器緩存,是瀏覽器端保存數據,用於快速讀取或避免重復資源請求的優化機制,有效的緩存使用可以避免重復的網絡請求和加快

Python搭建一個簡單的代理池!經理再也不用擔心我的IP被封了

其實每次爬東西的時候,特怕IP被封,所以每次都要把時間延遲設定得長一點... 這次用Python搭建一個簡單的代理池。獲取代理IP,然後驗證其有效性。 不過結果好像不是很理想,為什麼西刺代理的高匿代理都能用??? 不是說免費代理不好使嗎?真的是黑人問號臉... / 01 / 代理獲取

nodejs搭建一個本地伺服器,以供本地介面獲取服務端資料

1、首先下載安裝好nodejs 64位的nodejs5.6.0下載地址:  5.6.0 nodejs,根據提示安裝在自己的電腦上即可 2、安裝好了,開啟cmd視窗,輸入命令:npm -v 檢驗nodejs是否安裝成功,如果出現以下介面則說明安裝成功了 3、輸入命令 

手把手從零開始搭建SpringBoot後端專案框架

原料 新鮮的IntelliJ IDEA、一雙手、以及電腦一臺。 搭建框架 新建專案 開啟IDE,點選File -> New Project。在左側的列表中的選擇Maven專案,點選Next。 填寫GroupId和ArtifactId 什麼是GroupId和Ar

【gulp】gulp搭建一個前端專案

一、安裝與建立 1.安裝node:https://nodejs.org/zh-cn/ 2.安裝gulp:npm install gulp -g 3.新建一個資料夾用來存放專案 4.在命令列進入建立的資料夾輸入 gulp init即可 5.新建一

django建立一個專案

環境說明: python3.6  django2.0  pycharm編輯器 環境安裝完畢後: 1.建立一個django專案: django-admin startproject mysite 網上其他注意,暫未遇到: 如果有 DJANGO_

從零開始寫一個雜湊表--導讀

  雜湊表是一個可以提供快速實現關聯陣列的資料結構。“雜湊”一詞會讓人產生困惑,下面我做了個總結。   雜湊表由一系列的桶組成,每一個桶儲存一個鍵值對。為了能夠確定一個鍵值對應該儲存在哪個桶裡,關鍵字要傳遞給雜湊函式。雜湊函式返回一個指明桶陣列索引的整數。當我們想要查詢一個鍵值對時,我們對關

從零開始寫一個雜湊表--雜湊表結構

  我們的鍵-值對(items),每一個都會被儲存在結構體中: // hash_table.h typedef struct { char* key; char* value; } ht_item;   我們的雜湊表儲存了一組鍵值對的指標,以及雜湊表大小的一些細節和

從零開始寫一個雜湊表--雜湊衝突

  雜湊函式把一個無窮大的輸入集合對映到一個有限大小的輸出集合。不同的關鍵字輸入會被對映到同一個陣列下標,這就導致了桶的衝突。雜湊表必須實現解決衝突的方法。   我們的雜湊表將使用開放地址法和再雜湊法。在桶索引衝突後,再雜湊法會使用兩個雜湊函式來計算鍵值對將要儲存的桶索引值。   有關其他雜