From 1abb73c7ab85bb691b5c10d50ffbb4b8742f0473 Mon Sep 17 00:00:00 2001 From: "vn.py" Date: Thu, 14 Dec 2017 13:59:19 +0800 Subject: [PATCH] =?UTF-8?q?[Add]=E6=96=B0=E5=A2=9EExcel=20RTD=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/QuantosDataService/config.json | 6 +- vnpy/trader/app/rtdService/RTD_setting.json | 7 ++ vnpy/trader/app/rtdService/__init__.py | 10 ++ vnpy/trader/app/rtdService/demo.xlsx | Bin 0 -> 11538 bytes vnpy/trader/app/rtdService/rtd.ico | Bin 0 -> 67646 bytes vnpy/trader/app/rtdService/rtdClient.py | 90 ++++++++++++++++++ vnpy/trader/app/rtdService/rtdEngine.py | 98 ++++++++++++++++++++ vnpy/trader/app/rtdService/uiRtdWidget.py | 57 ++++++++++++ 8 files changed, 265 insertions(+), 3 deletions(-) create mode 100644 vnpy/trader/app/rtdService/RTD_setting.json create mode 100644 vnpy/trader/app/rtdService/__init__.py create mode 100644 vnpy/trader/app/rtdService/demo.xlsx create mode 100644 vnpy/trader/app/rtdService/rtd.ico create mode 100644 vnpy/trader/app/rtdService/rtdClient.py create mode 100644 vnpy/trader/app/rtdService/rtdEngine.py create mode 100644 vnpy/trader/app/rtdService/uiRtdWidget.py diff --git a/examples/QuantosDataService/config.json b/examples/QuantosDataService/config.json index c046ab3f..dc5b3e25 100644 --- a/examples/QuantosDataService/config.json +++ b/examples/QuantosDataService/config.json @@ -3,8 +3,8 @@ "MONGO_PORT": 27017, "DATA_SERVER": "tcp://data.tushare.org:8910", - "USERNAME": "", - "TOKEN": "", + "USERNAME": "18616966847", + "TOKEN": "eyJhbGciOiJIUzI1NiJ9.eyJjcmVhdGVfdGltZSI6IjE1MTI2NDAzNzAxNjIiLCJpc3MiOiJhdXRoMCIsImlkIjoiMTg2MTY5NjY4NDcifQ.xp1nDYfFgEeHtNoVFVKqXcmSQHR1-kdm99fzXqnowoo", - "SYMBOLS": ["510050.SSE", "510300.SSE"] + "SYMBOLS": ["IF1712.CFFEX", "510050.SSE", "510300.SSE"] } \ No newline at end of file diff --git a/vnpy/trader/app/rtdService/RTD_setting.json b/vnpy/trader/app/rtdService/RTD_setting.json new file mode 100644 index 00000000..0388abb3 --- /dev/null +++ b/vnpy/trader/app/rtdService/RTD_setting.json @@ -0,0 +1,7 @@ +{ + "repAddress": "tcp://*:88888", + "pubAddress": "tcp://*:66666", + "eventType": { + "eTick.": "symbol" + } +} \ No newline at end of file diff --git a/vnpy/trader/app/rtdService/__init__.py b/vnpy/trader/app/rtdService/__init__.py new file mode 100644 index 00000000..6048bb5a --- /dev/null +++ b/vnpy/trader/app/rtdService/__init__.py @@ -0,0 +1,10 @@ +# encoding: UTF-8 + +from .rtdEngine import RtdEngine +from .uiRtdWidget import RtdManager + +appName = 'RtdService' +appDisplayName = u'RTD服务' +appEngine = RtdEngine +appWidget = RtdManager +appIco = 'rtd.ico' diff --git a/vnpy/trader/app/rtdService/demo.xlsx b/vnpy/trader/app/rtdService/demo.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..a37db56b6c9b4c64932af218c61884c84e6c0313 GIT binary patch literal 11538 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