使用Django搭建一个基金模拟交易系统教程
亲手教你如何搭建一个基金模拟系统(基于Django框架)
第一步:创建项目、APP以及静态文件存储文件夹
django-adminstartprojectChongyang django-adminstartappStock#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'),
]
第三步:运行项目
pythonmanage.pyrunserver0.0.0.0:8000
到目前为止,你已经创建了一个拥有极其庞大功能的web网站,后续只需激活相应的服务即可
url.py#路由配置文件 views.py#功能实现文件 admin.py#后台管理文件 model.py#数据库创建文件
第四步:具体项目配置
在配置好前面设置后直接在相应的文件里复制如下代码运行项目即可
1、models.py
fromdjango.dbimportmodels importuuid #基金经理数据表 classFund_Manger(models.Model): name=models.CharField(max_length=20) age=models.IntegerField() entry_time=models.CharField(max_length=20) def__str__(self): returnself.name #股票信息数据表 classStock(models.Model): stock_name=models.CharField(max_length=20) code=models.CharField(max_length=10) def__str__(self): returnself.code #交易系统表 classTrading(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) #清算数据表 classFund_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): returnself.total_pool
2、url.py
fromdjango.contribimportadmin
fromdjango.urlsimportpath
fromdjango.conf.urlsimporturl
fromStockimportviews
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
fromdjango.shortcutsimportrender
fromdjango.httpimportHttpResponse
fromdjango.utilsimporttimezone
fromStock.modelsimportFund_Manger,Stock,Trading,Fund_pool
importre
defindex(request):
returnrender(request,'index.html')
defdata_entry(request):
returnrender(request,'data_entry.html')
defcheck_index(request):
returnrender(request,'check.html')
defadd_fund_manger(request):
'''
添加时需判断原始表是否已经存在此用户信息
同时添加年龄限制(20~40)
'''
ifrequest.method=="POST":
name=request.POST['name']
age=request.POST['age']
entry_time=request.POST['Time']
check_name=Fund_Manger.objects.filter(name=name)
ifcheck_name:
returnHttpResponse("该用户已处在!
")
else:
ifint(age)<20orint(age)>=40:
returnHttpResponse("该用户年龄不符合要求!
")
else:
Mas=Fund_Manger(name=name,age=age,entry_time=entry_time)
Mas.save()
returnHttpResponse("用户注册成功!
")
defadd_stock(request):
'''
添加基金池数据时需对股票代码做限定
仅限A股市场,同时做异常捕获处理
'''
ifrequest.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__()
ifnum==6:
Mas=Stock(stock_name=stock_name,code=code[0])
Mas.save()
returnHttpResponse("基金池数据添加成功!
")
else:
returnHttpResponse("错误代码!
")
exceptExceptionase:
returnHttpResponse("错误代码!
")
defcheck(request):
'''
信息合规查询(仅限A股数据)
需对基金经理、股票代码、交易数量同时做判断
'''
ifrequest.method=="POST":
name=request.POST['name']
code=request.POST['code']
number=request.POST['number']
#基金经理信息过滤
try:
check_name=Fund_Manger.objects.filter(name=name)
ifcheck_name:
#基金池数据过滤
try:
check_code=Stock.objects.filter(code=code)
#交易数量过滤
ifcheck_code:
ifint(number)%100==0:
returnrender(request,'trade_index.html',{"name":name,"code":code,"number":number})
else:
returnHttpResponse('交易数量填写错误!
')
else:
returnHttpResponse('基金池无该股票信息!
')
exceptExceptionase:
print('异常信息为:%s'%str(e))
pass
else:
returnHttpResponse('没有该基金经理!
')
exceptExceptionase:
print('异常信息为:%s'%str(e))
pass
deftrading(request):
'''
按照操作进行划分(买入卖出)
若买入只需判断交易金额与剩余现金资产对比即可
若卖出还需对其持股数量加以判断
'''
ifrequest.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)
exceptExceptionase:
total_price=1000000
ifoperate=='卖出':
#获取此股票持仓数量
stock_nums=Trading.objects.filter(code=code)
stock_num=sum([i.numberforiinstock_nums])
number=-int(number)
ifabs(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()
returnHttpResponse("交易完成!
")
else:
returnHttpResponse("持仓数小于卖出数,无法交易!
")
elifoperate=='买入':
trade_price=float(price)*int(number)
balance=total_price-trade_price
Time_=timezone.localtime(timezone.now()).strftime("%Y-%m-%d%H:%M:%S")
iftrade_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)
returnHttpResponse("交易完成!
")
else:
print(total_price)
returnHttpResponse("资金总额不足!
")
else:
returnHttpResponse("无效指令!
")
defFund_pool_(request):
returnrender(request,'fund_pool.html')
defAccount(request):
'''
清算只需查询操作人是否为基金经理即可
'''
ifrequest.method=="POST":
name=request.POST['name']
#基金经理信息
check_name=Fund_Manger.objects.filter(name=name)
#基金操作人数统计
oprate_people=Trading.objects.all()
ifcheck_name:
total_price=float(Trading.objects.all().order_by('-time')[0].total_price)
total_pool='¥'+str(total_price)
oprate_people_num=set([stock_name.nameforstock_nameinoprate_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()
returnHttpResponse("数据清算成功!
")
else:
returnHttpResponse('非法操作!
')
4、admin.py
fromdjango.contribimportadmin
fromStock.modelsimportFund_Manger,Stock,Trading,Fund_pool
#Registeryourmodelshere.
classFund_MangerAdmin(admin.ModelAdmin):
list_display=('name','age','entry_time')
classStockAdmin(admin.ModelAdmin):
list_display=('stock_name','code')
classTradingAdmin(admin.ModelAdmin):
list_display=('name','time','code','number','price','operate','total_price')
classFund_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
{# #} 首页
基金模拟系统: 数据录入系统 合规管理系统 尾盘清算系统