靈感由來
前幾日受到《利用 tradingview 指標對接發明者實盤機器人》文章啓發,本身也嘗試復現了一下。但做者寫的比較粗略,也略晦澀難懂。python
因此我使用了Top 10 Python libraries of 2019 的3個庫重構了一份server。注意 tradingview webhook功能爲會員功能,須要購買會員!web
本系統webhook特性以下:
一、標準化json消息傳遞chrome
二、加入try..except..異常處理json
三、加入with..as..內存回收api
四、採用async異步瀏覽器
五、採用ASGI協議網絡
六、採用AUTO HTTP1.X-2.0協議併發
七、代碼通過 100% test coverageapp
八、裝飾器的運用使程序簡潔、執行效率高、穩定可靠異步
1、準備工做
您須要安裝 python 3.8.2 或以上版本 https://www.python.org/downloads/
您須要安裝pip包管理器 https://pip.pypa.io/en/stable/
安裝必要的包
HTTPX
是一個功能齊全的http訪問庫。獲2019 top 10 第一名。
HTTPX is a fully featured HTTP client for Python 3,
which provides sync and async APIs,
and support for both HTTP/1.1 and HTTP/2.
Starlette
Starlette 是一個輕量級ASGI標準庫/工具包。獲 top 10 第二名。
Starlette is a lightweight ASGI framework/toolkit,
which is ideal for building high performance asyncio services.
FastAPI
FastAPI 是一個基於Starlette的API快速實現庫。獲 top 10 第三名。
FastAPI framework, high performance, easy to learn, fast to code, ready for production
Uvicorn
Uvicorn 是一個輕量級 ASGI 服務端。
Uvicorn is a lightning-fast ASGI server, built on uvloop and httptools.
pydantic
pydantic 是一個基於python的數據格式管理庫,已用於Microsoft、Amazon Web Services、Uber
Data validation and settings management using python type annotations.
https://pydantic-docs.helpmanual.io/
題外話:
其實這些庫已經表明了當前行業的最高標準!!。.你還能用他們寫不少其餘的東西。我已經用其對接了5大交易所,監控資金流向。okex的檢測頻率甚至穩定在0.1秒。。或者說...能夠搭建一套千萬級併發的交易所...人生苦短,我用python。一行代碼能解決的問題,毫不用一堆。請日後看!
原理及實現
咱們要作的事情很簡單,就是接收tradingview post過來的數據再編碼發送http get傳遞給FMZ的託管者。有點相似中間件服務。
FMZ終端接收器
咱們要去fmz創建一個python策略,具體代碼以下:
接下去咱們把機器人運行起來
這裏要很是注意 機器人ID要填寫到python代碼中
webhook server 服務端搭建
第一步
新建一個python文件。起個名字 fz1.py
第二步
編寫導入模塊
第三步
在fmz主頁註冊api
並找到託管主機ID
並定義到 python代碼中。
這裏的RobotID須要在前面的託管策略中得到ID
第四步
定義一個api函數來提交CMD指令給fmz託管。
第四步
自定義數據類型(json格式)
使用pydantic模塊的BaseModel方法來定義一個類型
固然你也能夠本身定義更多的字段,這徹底取決於你本身想要達到的效果。
以上所有是非空字段,傳參若是缺乏一個會報錯,
若是須要傳遞可空參數,請參閱BaseModel手冊。
第五步
編寫Tradingview接收模塊(webhook server)
webhook 的協議使用的是http post方法。
因此咱們須要定義一個http server端並接受post傳遞過來的數據。
python服務端所有代碼
以上就是所有核心代碼的實現。
我略微處理了一下異常處理模塊以及重試機制。將全部代碼整合。
服務端的啓動
記住要講文件保存成fz1的文件名
接着咱們打開命令行工具。啓動python服務端
命令以下:
其中表明使用fz1的py文件並調用webhook任務。
host 表示接收0.0.0.0的ip訪問,也就是所有。
port 表示將端口設定爲8001 (這裏須要注意的是,tradingview只經過80端口訪問,你須要在防火牆作好端口映射,或者直接使用80)
reload 表示若是py主文件有迭代,服務端自動重載最新版本。
當你看到如圖所示,Application startup complete就表明啓動成功了
這時候你能夠打開瀏覽器,訪問 http://127.0.0.1:8001/redoc
fast api 已經爲你實現了api接口文檔,和自動調試器。
本地調試
咱們使用的是chrome 插件 TALEND API TESTER
你也能夠用其餘的http調試工具完成。
模擬本地tradingview發送webhook消息。
將模式調整爲post
url地址是 127.0.0.1:8001/tv/
post的body字段寫上json
同時在HEADER中會自動生成application/json
完成之後點擊發送
如圖所示。本地測試已經完成了。
咱們從本地模擬發送到webhook的數據經過python 傳遞到託管設備,並順利獲取到了相關數據。
將webhook部署到外網
本段落部分屬於我的網絡環境,每一個人不同。
登錄Juniper 終端
增長rule-set outside-to-inside
指定鏈路走向 from untruset to trust
增長tradingview 源地址IP斷 source-address [ 58.35.162.147/32 52.89.214.238/32 34.212.75.30/32 54.218.53.128/32 52.32.178.7/32 ];
指定目的地址(本機外網ip) destination-address xxx.xxx.xxx.xxx/32;
指定目的端口(本機外網port) destination-port 80;
作端口重定向 destination-nat pool inside-8001;
這些步驟主要是容許 tradingview 訪問個人外網ip,
並指定80端口重定向到本地設備的8001端口。
將設備規則執行之後。tradingview就能順利推送消息給咱們了。
tradingvew 消息測試
咱們打開tradingview 並在一個高級指標上新建一個報警,
這個方法能夠用於tradingview各類高級指標自動下單。
勾選webhook,並填寫服務端地址http://xxx.xxx.xxx.xxx/tv/
下方消息框填入字段消息。
{"apikey": "FMZ", "exchange": "bybit", "symbol": "BTC-USD", "side": "buy", "amount": "100"}
如圖所示 在指標上已經顯示了咱們的預警信息
當價格穿越指標之後,tradingview產生報警