from dash import html from dash import dcc from dash import Input#输入 from dash import Output#输出 import time from dash import dash_table import dash import pandas as pd import requests import json from datetime import datetime import os path=os.path.dirname(os.path.abspath(__file__)) now_date=str(datetime.now())[:10] select_list=['用户信息','实时数据','历史数据','清空实时数据','清空历史数据'] def params_func(text=''): ''' 解析函数 ''' data_list=[] f=text.split('\n') for i in f: text=i.strip().lstrip() data_list.append(text) func='\n'.join(data_list) return func def get_n1_n2_daily(start_date='2023-12-14',end_date='2023-12-30'): ''' 获取2个时间的天数 ''' import datetime end_date=end_date.split('-') start_date=start_date.split('-') d1 =datetime.datetime(int(start_date[0]),int(start_date[1]),int(start_date[2])) d2 = datetime.datetime(int(end_date[0]),int(end_date[1]),int(end_date[2])) # 第二个日期 interval = d2 - d1 # 两日期差距 days=interval.days return days app=dash.Dash(__name__) app.layout=html.Div([ html.H3('小果聚合跟单服务器,找作者获取授权码 微信15117320079,输入的数据必须是字符串'), html.P('实盘前请清空实时数据其他的不用,点击运行按钮获取数据,运行实盘前需要获取授权码'), html.Tbody([ html.Tr([ html.Td('用户名称', style={'border':'1px solid','width':'200px'}), html.Td('数据类型', style={'border':'1px solid','width':'200px'}), html.Td('运行程序', style={'border':'1px solid','width':'200px'}), html.Td('下载数据', style={'border':'1px solid','width':'200px'}) ]), html.Tr([ html.Td(dcc.Input(value='123456',id='joinquant_trader_password'), style={'border':'1px solid','width':'200px'}), html.Td(dcc.Dropdown(options=select_list,value='用户信息',id='joinquant_trader_data_type'), style={'border':'1px solid','width':'200px'}), html.Td(dcc.Dropdown(options=['运行','不运行'],id='joinquant_trader_run',value='不运行'), style={'border':'1px solid','width':'200px'}), html.Td(dcc.RadioItems(options={'下载数据':"下载数据","不下载数据":"不下载数据"},id='joinquant_trader_down_data',value='不下载数据'), style={'border':'1px solid','width':'200px'}) ]), ]), dcc.Textarea(value=""" {'状态': 'held', '订单添加时间': 'datetime.datetime(2024, 4, 23, 9, 30)', '买卖': 'False', '下单数量': '9400', '已经成交': '9400', '股票代码': '', '订单ID': '1732208241', '平均成交价格': '10.5', '持仓成本': '10.59', '多空': 'long', '交易费用': '128.31'} """, id='joinquant_trader_text',style={'width': '80%', 'height': 200,"text-align":"left",}), html.H3('数据展示'), dash_table.DataTable( id='joinquant_trader_table', page_size=10, style_table={'font-size': 15}, sort_action='native'), dcc.Download(id='joinquant_trader_table_down') ]) #回调表1 @app.callback( Output(component_id='joinquant_trader_table',component_property='data',allow_duplicate=True), Input(component_id='joinquant_trader_password',component_property='value'), Input(component_id='joinquant_trader_data_type',component_property='value'), Input(component_id='joinquant_trader_text',component_property='value'), Input(component_id='joinquant_trader_run',component_property='value'), Input(component_id='joinquant_trader_down_data',component_property='value'), prevent_initial_call=True ) def show_wencai_data_table_1(password,data_type,text,run,down_data): if run=='运行': password_df=pd.read_excel(r'授权表\授权表.xlsx',dtype='object') try: del password_df['Unnamed: 0'] except: pass now_date=str(datetime.now())[:10] password_df['用户名称']=password_df['用户名称'].astype(str) password_df['到期时间']=password_df['到期时间'].astype(str) password_df.index=password_df['用户名称'] password_list=password_df['用户名称'].tolist() if str(password) in password_list: text=params_func(text) text=eval(text) df=password_df[password_df['用户名称']==password] end_date=str(df['到期时间'].tolist()[-1])[:10] day=get_n1_n2_daily(start_date=now_date,end_date=end_date) df['到期天数']=day if day>=1: if data_type=='用户信息': df['信息推送']='授权码正常' df['数据状态']=True elif data_type=='实时数据': try: df=pd.read_csv(r'{}\data\实时数据\{}实时数据.csv'.format(path,password)) try: del df['Unnamed: 0'] except: pass df['交易日']=df['交易日'].astype(str) select_list=list(text.keys()) select_list.append('交易日') select_list.append('数据状态') df=df[select_list] df=df[df['交易日']==now_date] except Exception as e: print(e,'实时数据有问题') df=pd.DataFrame() try: hist=pd.read_csv(r'{}\data\历史数据\{}历史数据.csv'.format(path,password)) try: del hist['Unnamed: 0'] except: pass df['交易日']=df['交易日'].astype(str) select_list=list(text.keys()) select_list.append('交易日') select_list.append('数据状态') df=df[select_list] except Exception as e: print(e,'历史数据有问题') hist=pd.DataFrame() data=pd.DataFrame() data['状态']=[text['状态']] data['订单添加时间']=[text['订单添加时间']] data['买卖']=[text['买卖']] data['下单数量']=[text['下单数量']] data['已经成交']=[text['已经成交']] data['股票代码']=[text['股票代码']] data['订单ID']=[text['订单ID']] data['平均成交价格']=[text['平均成交价格']] data['持仓成本']=[text['持仓成本']] data['多空']=[text['多空']] data['交易费用']=[text['交易费用']] df=pd.concat([df,data],ignore_index=True) df['证券代码']=df['股票代码'].apply(lambda x: str(x).split('.XSHE')[0]) df['数据长度']=df['证券代码'].apply(lambda x: len(str(x))) df=df[df['数据长度']>=6] try: del df['数据长度'] except: pass df=df.drop_duplicates(subset=['股票代码','下单数量','买卖','多空'],keep='last') df['交易日']=now_date df['数据状态']=True df.to_csv(r'{}\data\实时数据\{}实时数据.csv'.format(path,password)) hist=pd.concat([hist,data],ignore_index=True) hist=hist.drop_duplicates(subset=['股票代码','下单数量','买卖','多空'],keep='last') hist['交易日']=now_date hist['数据状态']=True hist.to_csv(r'{}\data\历史数据\{}历史数据.csv'.format(path,password)) elif data_type=='清空实时数据': df=pd.DataFrame() df.to_csv(r'{}\data\实时数据\{}实时数据.csv'.format(path,password)) elif data_type=='历史数据': try: hist=pd.read_csv(r'{}\data\历史数据\{}历史数据.csv'.format(path,password)) hist['证券代码']=hist['股票代码'].apply(lambda x: str(x).split('.XSHE')[0]) hist['数据长度']=hist['证券代码'].apply(lambda x: len(str(x))) hist=hist[hist['数据长度']>=6] hist=hist.drop_duplicates(subset=['股票代码','下单数量','买卖','多空'],keep='last') try: del hist['数据长度'] except: pass try: del hist['Unnamed: 0'] except: pass df=hist df['交易日']=df['交易日'].astype(str) select_list=list(text.keys()) select_list.append('交易日') select_list.append('数据状态') df=df[select_list] except Exception as e: print(e,'历史数据有问题') df=pd.DataFrame() elif data_type=='清空历史数据': df=pd.DataFrame() df.to_csv(r'{}\data\历史数据\{}历史数据.csv'.format(path,password)) else: df['信息推送']='授权码到期找作者获取' df['数据状态']=False else: df['信息推送']='授权码到期找作者获取' df['数据状态']=False return df.to_dict('records') else: df=pd.DataFrame() df['信息提示']=['用户没有注册请注册/联系作者微信15117320079'] df['数据状态']=False return df.to_dict('records') else: df=pd.DataFrame() df['信息提示']=['没有点击运行选择'] df['数据状态']=False return df.to_dict('records') #回调下载 @app.callback( Output(component_id='joinquant_trader_table_down',component_property='data',allow_duplicate=True), Input(component_id='joinquant_trader_password',component_property='value'), Input(component_id='joinquant_trader_data_type',component_property='value'), Input(component_id='joinquant_trader_text',component_property='value'), Input(component_id='joinquant_trader_run',component_property='value'), Input(component_id='joinquant_trader_down_data',component_property='value'), prevent_initial_call=True ) def show_wencai_data_table_down(password,data_type,text,run,down_data): if down_data=='下载数据': password_df=pd.read_excel(r'授权表\授权表.xlsx',dtype='object') try: del password_df['Unnamed: 0'] except: pass now_date=str(datetime.now())[:10] password_df['用户名称']=password_df['用户名称'].astype(str) password_df['到期时间']=password_df['到期时间'].astype(str) password_df.index=password_df['用户名称'] password_list=password_df['用户名称'].tolist() if str(password) in password_list: text=params_func(text) text=eval(text) df=password_df[password_df['用户名称']==password] end_date=str(df['到期时间'].tolist()[-1])[:10] day=get_n1_n2_daily(start_date=now_date,end_date=end_date) df['到期天数']=day if day>=1: if data_type in ['实时数据','历史数据']: hist=pd.read_csv(r'{}\data\{}\{}{}.csv'.format(path,data_type,password,data_type)) try: del hist['Unnamed: 0'] except: pass df=hist return dcc.send_data_frame(df.to_excel,filename='{}{}.xlsx'.format(now_date,data_type)) if __name__=='__main__': app.run( host='0.0.0.0', # 监听所有网络接口 port=8888, # 端口 debug=True # 开发时建议开启debug模式,便于调试 )