APP demo(还在优化):http://silverzy.com/tradings/

Github:https://github.com/jianwang0212/Dash_eth(如果可以star的话我会非常非常非常开心的!五一更新:安装运行步骤(pip install -r requirements.txt)和文件作用)

一个在TOP5对冲基金的朋友和一个在TOP3的高频交易公司都告诉我这是他们自己做“秘密个人交易系统”的监视器和提醒器 - Dash & Plotly。监视什么?你有没有问过自己,你确定你挂的是限价单最后交易所就会让你用限价单成交?为什么做回测时赚巨多钱一到实盘亏成狗?自己的真实交易费用/费率真的是像交易所官方介绍的交易费用/费率么?你的实时挂单的价格和数量真的跟你的理论计算数值一样么?精确到小数点5位?你的每笔成交是一次性被打到的还是被多个单试探打到的?作为做市商你真的需要挂多少单?

为什么要做一个实时监视器?

一: 让自己更熟悉Python,在不使用css和JS的情况下尝试编写网页app

  • 让自己学习新的技术栈:Dash,plotly,flask,dask(提高处理GB数据速度)。
  • 复习已经学过的技术栈:sqlite3,pandas,datetime,logging

二: 监视自己在不同市场的即时交易状况

First: 自己的即时挂单(买单,卖单)

交易量是多少 - 我想知道是否跟自己的交易理论一致

交易价格是多少 - 我想知道我成交的价格在当时的订单薄的哪个位置 - 如果是买单那就应该在best bid以下,如果是卖单就应该在best ask以上。

市场的5档买卖单,我自己的买单卖单的价格情况

交易类型是什么 - 因为是做市策略所以在任何时刻都应该是两个限价单:一个买单一个卖单。

Second: 自己的最新成交单:交易费是多少,交易费的比例是多少,交易量是多少,交易价格是多少,原始挂单类型是什么,真正成交的单类型是什么。

以上的表格告诉了我最新几个成交单的:

时间 - 我在意成交单的频率是不是符合我的预期。

交易费/费率是多少 - 我想知道是不是和官方文档里写的交易费用一致。强烈建议你仔细去看看你在交易所的费率,一般没有人会去看,计算实际费率和文档费率是否一致。但是很多情况下你就被交易所坑了。像表格里的前两个单因为是限价单,费率是0.00191(官方费率是0.0019),后两个单是市价单,费率是0.0028(官方是0.0028)。

交易量是多少 - 我想知道是否跟自己的交易理论一致,我的策略有一边倒情况下减少交易量的设置,所以可以看到amount一览越来越小。最后两栏数量都是1.4028,这代表我被逆向选择了 - 策略想撤单没撤成。

交易价格是多少 - 我想知道我成交的价格在当时的订单薄的哪个位置 - 如果是买单那就应该在best bid以下,如果是卖单就应该在best ask以上。

初始挂单类型是不是限价单 - 策略是做市策略所以应该全部是limit order

真正成交的单类型是什么 - 我希望每一笔单都是限价单成交。但可以从以上表格看到下午三点的单即使初始类型是限价,最终还是以市价单成交。我估计这是因为隐藏单和特殊对手盘的单导致的(可以看之前写的黑池交易)。

Third 自己的持仓

作为做市策略我希望自己的持仓是50%法币,50%虚拟货币

我同样希望看到正在使用的法币和虚拟货币是符合交易策略的理论值的(代表我正在挂买单和卖单)。

Fourth 自己的历史挂单情况,市场订单薄的对比,自己的成交单信息,以及自己的总资金变化情况(细分到法币和虚拟货币)

第一行的图表画出了自己的历史挂单情况和市场订单薄的对比。红色倒三角代表在15:08我以839.85的价格卖出了1.1187个虚拟货币。紧接着市场价格开始下跌。

第二行画出了总资金变化情况。Stack Bar 图表表示细分到法币和虚拟货币的持仓。

P.s 这是动态图表,可以随时放大缩小查看每一个数据点的具体数据的(鼠标漂浮到数据点上就有那一分钟的所有数据细节)。以上画出的是缩小到每分钟的版本。每天的版本如下:


为什么要用Py和基于HTML?

我觉得Python是最容易上手并且有很多优秀的库和开源社区的。很多繁琐的编程都可以通过搬砖直接拿来用, 很方便。整个APP用Python写就500行(前端后端一起,包括API爬数据,数据处理,SQL的读写输出等等等),作为一个新手自己花了两天时间做出来。我认为数据可视化,动态数据库输入输出里Python里的库是最全的。强烈推荐Dash。

我认为以后HTML5是APP,特别是数据可视化的最主流平台。任何一台电脑都有浏览器,任何一个手机也都有浏览器,但不是每一个电脑都有python,jupyter,r,shinny app,或者其他需要安装的exe可执行文件。所以今后应该编写的所有程序和文章都会基于HTML5。方便自己阅读也方便其他人拷贝。


如何实现?

我认为任何一个app都可以分为前端后端。对于这个监视器。

后端主要是用API(我用的CCXT)来爬各个交易所的数据

举个例子:

然后再把所有的数据储存到SQL数据库里面然后。。。后端就完成了。

前端就是展现数据:首先连到SQL database 然后我用的Dash和plotly做的动态展示。

前端 python code:

import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
import dash_table
import plotly.graph_objs as go
from plotly.subplots import make_subplots
import colorlover as cl
import datetime as dt
import flask
import os
import pandas as pd
import time
import sqlite3
import numpy as np
import mathapp = dash.Dash()# data
exchange_name = 'bitbay'
conn = sqlite3.connect('/Users/Zi/Projects/Dash_eth/test.db', check_same_thread=False)
df1 = pd.read_sql_query("SELECT * from {}_merge_td_bal_ods".format(exchange_name), conn)
df2 = pd.read_sql_query("SELECT * from {}_open_order".format(exchange_name), conn)
df3 = pd.read_sql_query("SELECT * from {}_trades".format(exchange_name), conn)
conn.close()def fig1_producer(df1, df2, df3):# setuprgba_bid = ['rgba(132, 132, 239, .9)','rgba(28, 28, 221, .7)','rgba(28, 28, 221, .5)','rgba(28, 28, 221, .4)','rgba(28, 28, 221, .2)']rgba_ask = ['rgba(221, 28, 86, .9)','rgba(221, 28, 86, .7)','rgba(221, 28, 86, .5)','rgba(221, 28, 86, .4)','rgba(221, 28, 86, .2)']rgba_bal = ['rgba(10, 10, 162, .9)','rgba(10, 10, 162, .4)','rgba(235, 64, 52, .9)','rgba(235, 64, 52, .4)']# Open orders: create buy & sell columnfor side in ['buy', 'sell']:df2[side + '_OpenOrder_price'] = df2['OpenOrder_price']condition = df2['OpenOrder_side'] != sidedf2.loc[condition, side + '_OpenOrder_price'] = None# Trades: create buy & sell columnfor side in ['buy', 'sell']:df1[side + '_executed'] = df1['price']condition = df1['side'] != sidedf1.loc[condition, side + '_executed'] = None# Graph - setup traces# Market orderbookfor i in [1]:trace_bid = go.Scatter(x=df1['time_x'],y=df1[str(i) + '_bid_px'],name='bid_' + str(i),line={"shape": 'hv'},marker_color=rgba_bid[i - 1],customdata=df1[str(i) + '_bid_sz'],hovertemplate="mkt_px:" + "%{y}; ""sz:" + "%{customdata:.3f}<br>")trace_ask = go.Scatter(x=df1['time_x'],y=df1[str(i) + '_ask_px'],name='ask_' + str(i),line={"shape": 'hv'},marker_color=rgba_ask[i - 1],customdata=df1[str(i) + '_ask_sz'],hovertemplate="mkt_px:" + "%{y}; ""sz:" + "%{customdata:.3f}<br>")# My open orderstrace_open_orders_buy = go.Scatter(x=df2['time'],y=df2['buy_OpenOrder_price'],mode='markers',name='my_bid',opacity=0.8,marker=dict(color='Yellow',size=10,opacity=0.6,symbol='line-ew',line=dict(color='LightSkyBlue',width=4)),hovertemplate="my_bid:" + "%{y}")trace_open_orders_sell = go.Scatter(x=df2['time'],y=df2['sell_OpenOrder_price'],mode='markers',name='my_ask',opacity=0.8,marker=dict(color='gold',size=10,opacity=0.6,symbol='line-ew',line=dict(color='violet',width=4)),hovertemplate="my_ask:" + "%{y}")# My trades# my trades - marker setup: create a size var for markersz = df1['amount'].tolist()sz1 = [0 if pd.isnull(x) else math.log10(float(x) + 10) * 5 for x in sz]trace_trades_buy = go.Scatter(x=df1['time_x'],y=df1['buy_executed'],name='bid_executed',mode='markers',marker=dict(color='LightSkyBlue',size=sz1,line=dict(color='blue',width=2)),marker_symbol='triangle-up',customdata=df1['amount'],hovertemplate="buy_px:" + "%{y}; ""sz:" + "%{customdata}<br>")trace_trades_sell = go.Scatter(x=df1['time_x'],y=df1['sell_executed'],name='ask_executed',mode='markers',marker=dict(color='LightSkyBlue',size=sz1,line=dict(color='red',width=2)),marker_symbol='triangle-down',customdata=df1['amount'],hovertemplate="sell_px:" + "%{y}; ""sz:" + "%{customdata}<br>")# balancetrace_bal_ff = go.Bar(x=df1['time_x'],y=df1['bal_fiat_free'] / df1['1_bid_px'],name='bal_fiat_free',marker_color=rgba_bal[0])trace_bal_fu = go.Bar(x=df1['time_x'],y=df1['bal_fiat_used'] / df1['1_bid_px'],name='bal_fiat_used',marker_color=rgba_bal[1])trace_bal_ef = go.Bar(x=df1['time_x'],y=df1['bal_eth_free'],name='bal_eth_free',marker_color=rgba_bal[2])trace_bal_eu = go.Bar(x=df1['time_x'],y=df1['bal_eth_used'],name='bal_eth_used',marker_color=rgba_bal[3])trace_bal_all = go.Scatter(x=df1['time_x'],y=(df1['bal_eth_total'] * df1['1_bid_px'] +df1['bal_fiat_total']) / df1['fx_x'],name='bal_all($)')# Group traces to figfig1_sub1_traces = [trace_bid, trace_ask, trace_open_orders_buy, trace_open_orders_sell,trace_trades_buy, trace_trades_sell]fig1_sub2_traces = [trace_bal_ff, trace_bal_fu,trace_bal_ef, trace_bal_eu]fig1 = make_subplots(rows=2, cols=1, shared_xaxes=True, vertical_spacing=0.1,specs=[[{"secondary_y": True}],[{"secondary_y": True}]],subplot_titles=("Market orderbook & my orders/trades (Local currency)", "My total balance & holding position (USD)"))for i in range(len(fig1_sub1_traces)):fig1.add_trace(fig1_sub1_traces[i],row=1, col=1)for i in range(len(fig1_sub2_traces)):fig1.add_trace(fig1_sub2_traces[i],row=2, col=1)fig1.add_trace(trace_bal_all,row=2, col=1, secondary_y=True)fig1.update_layout(barmode='stack')return fig1fig1 = fig1_producer(df1, df2, df3)def fig2_producer(df1, df2, df3):# Fig 2 Current dash board# Bal pie chartpie_labels = ['fiat_free', 'fiat_used', 'eth_free', 'eth_used']pie_values = [df1['bal_fiat_free'].iloc[-1] / df1['1_bid_px'].iloc[-1], df1['bal_fiat_used'].iloc[-1] / df1['1_bid_px'].iloc[-1],df1['bal_eth_free'].iloc[-1], df1['bal_eth_used'].iloc[-1]]trace_pie_bal = go.Pie(labels=pie_labels, values=pie_values, title='Balance in ETH', hole=0.4,textinfo='label+percent')# order book infoboop = df2['buy_OpenOrder_price']c_boop = boop.loc[~boop.isnull()].iloc[-1]soop = df2['sell_OpenOrder_price']c_soop = soop.loc[~soop.isnull()].iloc[-1]ob_y_bid = [df1['1_bid_px'].iloc[-1], df1['2_bid_px'].iloc[-1],df1['3_bid_px'].iloc[-1], df1['4_bid_px'].iloc[-1], df1['5_bid_px'].iloc[-1]]ob_y_ask = [df1['1_ask_px'].iloc[-1], df1['2_ask_px'].iloc[-1],df1['3_ask_px'].iloc[-1], df1['4_ask_px'].iloc[-1], df1['5_ask_px'].iloc[-1]]trace_c_ords_bid = go.Scatter(x=[1] * len(ob_y_bid), y=ob_y_bid, mode="markers", marker_symbol='line-ew',marker_line_color="midnightblue", marker_color="lightskyblue",marker_line_width=3, marker_size=150, name='mkt_bid')trace_c_ords_ask = go.Scatter(x=[1] * len(ob_y_ask), y=ob_y_ask, mode="markers", marker_symbol='line-ew',marker_line_color="red", marker_color="red",marker_line_width=3, marker_size=150, name='mkt_ask')trace_c_ords_my_bid = go.Scatter(x=[1], y=[c_boop], mode="markers", marker_symbol='diamond-wide',marker_line_color="gold", marker_color="blue",marker_line_width=2, marker_size=15, name='my_bid')trace_c_ords_my_ask = go.Scatter(x=[1], y=[c_soop], mode="markers", marker_symbol='diamond-wide',marker_line_color="gold", marker_color="red",marker_line_width=2, marker_size=15, name='my_ask')fig2 = make_subplots(rows=1, cols=2,specs=[[{"type": "domain"}, {"type": "xy"}]],subplot_titles=("Holdings", "Order book position"))fig2.add_trace(trace_pie_bal, row=1, col=1)fig2.add_trace(trace_c_ords_bid, row=1, col=2)fig2.add_trace(trace_c_ords_ask, row=1, col=2)fig2.add_trace(trace_c_ords_my_bid, row=1, col=2)fig2.add_trace(trace_c_ords_my_ask, row=1, col=2)fig2.update_layout(title='Current orders and positions')return fig2fig2 = fig2_producer(df1, df2, df3)# Tables# tbl_my_trades = df3[['time', 'type', 'type', 'takerOrMaker', 'side', 'amount', 'price',
#                      'fee_fiat', 'fee_pct']]# tbl_my_orders = df2[['time', 'OpenOrder_side', 'OpenOrder_price',
#                      'OpenOrder_amount', 'OpenOrder_filled', 'OpenOrder_remaining',
#                      'OpenOrder_fee']]
# tbl_my_trades = tbl_my_trades.tail().iloc[::-1]
# tbl_my_orders = tbl_my_orders.tail().iloc[::-1]# plot
app.layout = html.Div(children=[html.H1('Trading Dashboard'),dcc.Graph(id='g1',figure=fig1),dcc.Graph(id='g2',figure=fig2),html.H2('My latest trades'),dash_table.DataTable(id='table_trades',# columns=[{"name": i, "id": i}#          for i in tbl_my_trades.columns],# data=tbl_my_trades.to_dict('records'),style_as_list_view=True,style_cell={'padding': '5px'},style_header={'backgroundColor': 'white','fontWeight': 'bold'}),html.H2('My latest open orders'),dash_table.DataTable(id='table_openorders',# columns=[{"name": i, "id": i}#          for i in tbl_my_orders.columns],# data=tbl_my_orders.to_dict('records'),style_as_list_view=True,style_cell={'padding': '5px'},style_header={'backgroundColor': 'white','fontWeight': 'bold'}),dcc.Interval(id='interval-component',interval=70 * 1000,  # in millisecondsn_intervals=0)]
)@app.callback([Output('table_openorders', 'data'),Output('table_trades', 'data'),Output('table_openorders', 'columns'),Output('table_trades', 'columns'),Output('g1', 'figure'),Output('g2', 'figure')],[Input('interval-component', 'n_intervals')])
def update_tables_graphs(n):conn = sqlite3.connect('/Users/Zi/Projects/Dash_eth/test.db', check_same_thread=False)df1 = pd.read_sql_query("SELECT * from {}_merge_td_bal_ods".format(exchange_name), conn)df2 = pd.read_sql_query("SELECT * from {}_open_order".format(exchange_name), conn)df3 = pd.read_sql_query("SELECT * from {}_trades".format(exchange_name), conn)conn.close()# tables## tables - datatbl_my_trades = df3[['time', 'type', 'takerOrMaker', 'side', 'amount', 'price','fee_fiat', 'fee_pct']]tbl_my_orders = df2[['time', 'OpenOrder_side', 'OpenOrder_price','OpenOrder_amount', 'OpenOrder_filled', 'OpenOrder_remaining','OpenOrder_fee']]tbl_my_trades = tbl_my_trades.tail().iloc[::-1]tbl_my_orders = tbl_my_orders.tail().iloc[::-1]# tables - columncolumns_trades = [{"name": i, "id": i} for i in tbl_my_trades.columns]columns_orders = [{"name": i, "id": i} for i in tbl_my_orders.columns]# graphsfig1 = fig1_producer(df1, df2, df3)fig2 = fig2_producer(df1, df2, df3)return tbl_my_orders.to_dict('records'), tbl_my_trades.to_dict('records'), columns_orders, columns_trades, fig1, fig2if __name__ == '__main__':app.run_server(debug=True)

python窗口动态实时显示时间_量化交易实时动态监视系统(纯Python,只需要浏览器就能用)-直接GitHub开源可下载...相关推荐

  1. python窗口动态实时显示时间_苏州2.8寸串口屏厂家:切管机触摸屏实时动态显示切割过程...

    原标题:苏州寸串口屏厂家:切管机触摸屏实时动态显示切割过程 随着我国不锈钢管材的产量和消费的快速增长,管材加工技术也随之迅速发展,尤其是切管机的问世,更是给管材加工带来了前所未有的质的飞跃. 切管机在 ...

  2. python历史性分布计算代码_量化交易中,如何使用Python计算「筹码分布」指标【附代码】 [量化小讲堂-64]...

    引言: 邢不行的系列帖子"量化小讲堂",通过实际案例教初学者使用python进行量化投资,了解行业研究方向,希望能对大家有帮助. [历史文章汇总] 请点击此处 这是邢不行第  64 ...

  3. python k线图和指标_量化交易中,如何使用Python画K线、成交量、买卖点【邢不行】...

    引言: 邢不行的系列帖子"量化小讲堂",通过实际案例教初学者使用python进行量化投资,了解行业研究方向,希望能对大家有帮助. [历史文章汇总] 请点击此处 这是邢不行第  68 ...

  4. python 控件显示时间_设置tkinter标签以显示倒计时时间

    我正在尝试做一个pomodoro计时器,它将显示不同的倒计时点击三个按钮选项之一.在 这里的问题是,每次我在之前单击一个按钮之后单击一个按钮,标签都会为显示哪个计时器而烦恼.它试图同时显示两个定时器倒 ...

  5. python爬虫股票市盈率_量化交易的第一步,Python爬取股票数据

    基本环境配置python 3.6 pycharm requests csv time 相关模块pip安装即可 目标网页 分析网页 一切的一切都在图里 找到数据了,直接请求网页,解析数据,保存数据 请求 ...

  6. python金融量化 pdf_python量化交易pdf,Python和金融分析的关系?量化交易内容深度?...

    Q1:Python和金融分析的关系?量化交易内容深度? 1. Python适合做数据分析,有很多成熟的数据分析框架:Pandas, Numpy等, 这些在课程中都有教.这些框架都可以很方便的完成数据分 ...

  7. python如何显示时间_如何让python显示当前时间(东部)

    如果您需要大量时区,则应使用pytz包,并且需要正确处理夏令时的重复小时(即从午夜到凌晨1点发生的情况). 对于简单的事情,创建自己的时区类很容易: import datetime class EST ...

  8. python外汇交易回测系统_StarQuant - 综合量化交易回测系统/平台

    Welcome to StarQuant StarQuant(中文名:易数交易系统)是一个轻量的.面向个人( 普通)用户的综合量化交易回测系统,目前主要用于期货期权程序化交易(CTP接口,在实盘测试中 ...

  9. 数据分析常用的python包_量化投资数据分析之常用的python包(附代码)

    小伙伴们都知道python功能强大,在金融量化分析中运用广泛,python常用的数据分析包很多,下面先给大家简单列举一些(如果您刚开始学python觉得这东西很烦看不懂,那么请不要担心,直接忽视跳到第 ...

最新文章

  1. 【Intellij IDEA系列】IDEA的Debug调试技巧
  2. 微软2019暑期实习笔试题
  3. 电子白板技术_电子白板种类介绍及产品功能概述
  4. java线程的5个使用技巧
  5. 华为公开“实现汽车中电子控制功能的系统”相关专利
  6. c++ mfc 曲线图像的实现资料网址
  7. echart 全国地图 下钻省、市、区
  8. Flutter深色模式适配
  9. Excel作统计图表
  10. rovio环境配置与测试笔记
  11. C语言制作扫雷游戏(结合图形库)
  12. 罗格斯大学电子与计算机工程,罗格斯大学电子和计算机工程理学硕士研究生申请要求及申请材料要求清单...
  13. 蓝牙协议栈接收数据包流程1
  14. Android通过USB与PC通信
  15. 手工折纸作品展示:送别的花束
  16. 对c语言编程的感受,感受一种被“C语言编程”困惑的书(Stephen Kochan)
  17. 【深度学习】cs231n计算机视觉 CNN(卷积神经网络)
  18. 深度讲述6款 “数据分析” 工具,告诉你数据分析应该学这个!
  19. 南昌工程学院计算机考试题库和答案,南昌工程学院线性代数习题册参考答案
  20. 春天的味道——四月周报

热门文章

  1. 程序员面试——C++工程师面试大全第一部分
  2. 卷积神经网络CNN算法原理
  3. 机载激光雷达测量技术及工程应用实践_倾斜摄影与激光雷达技术在实景三维测量应用中的比较...
  4. 家用linux远程管理,linux远程管理器
  5. Algorithm Set:floyd判环法
  6. Leetcode每日一题:13.roman-to-integer(罗马数字转整数)
  7. 第九:Pytest进阶之xunit fixture
  8. html5音乐播放时间监测,【HTML5】HTML5中video元素事件详解(实时监测当前播放时间)...
  9. python在字符串结尾加反斜杠_Python原始字符串和尾部反斜杠
  10. Fiddler软件基本配置教程