使用發明者量化交易平台擴展API實現TradingView報警信號交易


B站視頻鏈接

發明者量化交易平台擴展API最近升級了,升級支持了直接訪問模式,這樣就可以輕松實現TradingView報警信號發送給發明者量化交易平台機器人實現自動交易。如果小伙伴還不知道擴展API為何物,聽我細細道來。

發明者量化交易平台擴展API

發明者API文檔相關部分鏈接

擴展API的主要作用是給程序化操作發明者量化交易平台上的各種功能提供接口,例如同時批量啟動機器人,定時機器人啟動、停止,讀取機器人信息詳情等。我們使用發明者量化交易平台擴展API實現TradingView報警信號交易這個需求計划只用擴展API中的CommandRobot(RobotId, Cmd)接口即可,這個接口可以給指定ID的機器人發送交互指令,機器人接收到指令即可執行對應操作(例如下單買入、賣出等)。

要使用擴展API,首先需要創建自己的發明者賬號的API KEY:

API KEY秘鑰由access keysecret key組成,API KEY即程序化操作發明者量化交易平台的鑰匙,所以一定要妥善保管,切勿泄露。

擴展API的直接訪問模式

直接訪問模式是指把API KEY直接寫在URL的Query中,例如訪問發明者量化交易平台擴展API的URL可以寫成:

https://www.fmz.com/api/v1?access_key=xxx&secret_key=yyyy&method=CommandRobot&args=[186515,"ok12345"]

其中,https://www.fmz.com/api/v1是接口地址,?之后是Query,參數access_key秘鑰舉例用xxx表示(使用時填寫自己的FMZ賬號的access_key),參數secret_key秘鑰用yyyy表示(使用時具體填寫自己的賬號secret_key),參數method是要訪問的擴展API接口具體名稱,args為要調用的method接口的參數。

我們使用TradingView作為信號源,向發明者量化交易平台機器人發送交易命令,其實就只用CommandRobot這個接口。

TradingView

首先你要有個TradingView Pro級別的賬戶,Basic級別是無法使用報警中的WebHood功能的。我們進入TradingView的圖表。

向圖表添加一個指標,也可以是其它的腳本算法。這里為了方便演示我們使用最常用的MACD指標,然后設置K線周期為1分鍾(為了讓信號更快的觸發,方便演示)。

在圖表上點擊右鍵,彈出菜單中選擇「添加警報」。

在「警報」彈窗中設置WebHook,到了這一步可以先不用着急設置,我們先把發明者量化交易平台這邊的監控信號的機器人運行起來。

監控信號下單機器人

策略源碼:

// 全局變量
var BUY = "buy"
var SELL = "sell"
var LONG = "long"
var SHORT = "short"
var COVER_LONG = "cover_long"
var COVER_SHORT = "cover_short"

function main() {
    // 清空日志,如不需要,可以刪除
    LogReset(1)

    // 設置精度
    exchange.SetPrecision(QuotePrecision, BasePrecision)

    // 識別期貨還是現貨
    var eType = 0
    var eName = exchange.GetName()
    var patt = /Futures_/
    if (patt.test(eName)) {
        Log("添加的交易所為期貨交易所:", eName, "#FF0000")
        eType = 1
        if (Ct == "") {
            throw "Ct 合約設置為空"
        } else {
            Log(exchange.SetContractType(Ct), "設置合約:", Ct, "#FF0000")
        }
    } else {
        Log("添加的交易所為現貨交易所:", eName, "#32CD32")
    }
    
    var lastMsg = ""
    var acc = _C(exchange.GetAccount)
    while(true) {
        var cmd = GetCommand()
        if (cmd) {
            // 檢測交互命令
            lastMsg = "命令:" + cmd + "時間:" + _D()
            var arr = cmd.split(":")
            if (arr.length != 2) {
                Log("cmd信息有誤:", cmd, "#FF0000")
                continue
            }

            var action = arr[0]
            var amount = parseFloat(arr[1])

            if (eType == 0) {
                if (action == BUY) {               
                    var buyInfo = IsMarketOrder ? exchange.Buy(-1, amount) : $.Buy(amount)
                    Log("buyInfo:", buyInfo)
                } else if (action == SELL) {        
                    var sellInfo = IsMarketOrder ? exchange.Sell(-1, amount) : $.Sell(amount)
                    Log("sellInfo:", sellInfo)
                } else {
                    Log("現貨交易所不支持!", "#FF0000")
                }
            } else if (eType == 1) {
                var tradeInfo = null
                var ticker = _C(exchange.GetTicker)
                if (action == LONG) {
                    exchange.SetDirection("buy")
                    tradeInfo = IsMarketOrder ? exchange.Buy(-1, amount) : exchange.Buy(ticker.Sell, amount)
                } else if (action == SHORT) {        
                    exchange.SetDirection("sell")
                    tradeInfo = IsMarketOrder ? exchange.Sell(-1, amount) : exchange.Sell(ticker.Buy, amount)
                } else if (action == COVER_LONG) {        
                    exchange.SetDirection("closebuy")
                    tradeInfo = IsMarketOrder ? exchange.Sell(-1, amount) : exchange.Sell(ticker.Buy, amount)
                } else if (action == COVER_SHORT) {        
                    exchange.SetDirection("closesell")
                    tradeInfo = IsMarketOrder ? exchange.Buy(-1, amount) : exchange.Buy(ticker.Sell, amount)
                } else {
                    Log("期貨交易所不支持!", "#FF0000")
                }
                if (tradeInfo) {
                    Log("tradeInfo:", tradeInfo)
                }
            } else {
                throw "eType error, eType:" + eType
            }
            acc = _C(exchange.GetAccount)
        }
        var tbl = {
            type : "table", 
            title : "狀態信息", 
            cols : ["數據"], 
            rows : []
        }
        tbl.rows.push([JSON.stringify(acc)])
        LogStatus(_D(), eName, "上次接收到的命令:", lastMsg, "\n", "`" + JSON.stringify(tbl) + "`")
        Sleep(1000)
    }
}

策略源碼

策略代碼十分簡單,檢測GetCommand函數的返回值,當有交互消息發送給策略程序時,GetCommand函數會返回這個消息,然后策略程序根據消息內容作出對應的交易操作。該策略上已經設置了交互按鈕,可以測試交互功能,例如運行起來這個策略,給機器人配置發明者量化交易平台的模擬交易所WexApp

點擊一下交互按鈕,測試一下機器人接收到命令買入的功能。

可以看到機器人接收到的命令字符串為:buy:0.01

我們只需讓TradingView警報觸發時,WebHook請求URL中訪問發明者量化交易平台擴展API的CommandRobot接口時,攜帶的參數為buy:0.01即可。

設置TradingView的WebHook

回到TradingView中,我們填寫WebHook的URL。給access_keysecret_key參數填寫上自己的API KEYmethod固定的,我們要訪問的就只是CommandRobot這個擴展API接口,args參數為[機器人ID,命令字符串]的形式,機器人ID我們可以通過機器人頁面直接獲取,如圖:

這次我們讓信號觸發時,買入0.02個幣,命令字符串就為:"buy:0.02"。這樣WebHook URL就完成了。

https://www.fmz.com/api/v1?access_key=e3809e173e23004821a9bfb6a468e308&secret_key=45a811e0009d91ad21154e79d4074bc6&method=CommandRobot&args=[191755,"buy:0.02"]

在TradingView上設置:

等待信號觸發...
等待信號觸發..
等待信號觸發.
...

機器人接收到了信號:

這樣就可以使用TradingView上的豐富的圖表功能、指標算法配合發明者量化交易平台的策略機器人,實現自己想要的自動化交易,相對於把TradingView上的策略移植成JavaScript、Python語言難度直線下降。

「監控信號下單機器人」策略代碼僅供學習研究,實盤使用需自行優化調整,支持期貨,建議設置為市價單模式,詳見策略代碼參數。
拋磚引玉,如有問題、建議歡迎留言。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM