使用发明者量化交易平台扩展API实现TradingView报警信号交易(推荐)

Author: 小小梦, Created: 2020-04-29 17:08:27, Updated: 2023-10-08 19:56:04

img

使用发明者量化交易平台扩展API实现TradingView报警信号交易

B站视频链接

发明者量化交易平台扩展API最近升级了,升级支持了直接访问模式,这样就可以轻松实现TradingView报警信号发送给发明者量化交易平台机器人实现自动交易。如果小伙伴还不知道扩展API为何物,听我细细道来。

发明者量化交易平台扩展API

发明者API文档相关部分链接

扩展API的主要作用是给程序化操作发明者量化交易平台上的各种功能提供接口,例如同时批量启动机器人,定时机器人启动、停止,读取机器人信息详情等。我们使用发明者量化交易平台扩展API实现TradingView报警信号交易这个需求计划只用扩展API中的CommandRobot(RobotId, Cmd)接口即可,这个接口可以给指定ID的机器人发送交互指令,机器人接收到指令即可执行对应操作(例如下单买入、卖出等)。

要使用扩展API,首先需要创建自己的发明者账号的API KEY: img API KEY秘钥由access keysecret key组成,API KEY即程序化操作发明者量化交易平台的钥匙,所以一定要妥善保管,切勿泄露。在创建FMZ扩展API KEY时,可以指定权限,例如上图仅仅给这个API KEY赋予访问CommandRobot(RobotId, Cmd)接口的权限,对于本篇例子基于安全考虑,请只给FMZ的扩展API KEY赋予CommandRobot(RobotId, Cmd)接口的访问权限。

扩展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的图表。

img

向图表添加一个指标,也可以是其它的脚本算法。这里为了方便演示我们使用最常用的MACD指标,然后设置K线周期为1分钟(为了让信号更快的触发,方便演示)。

img

在图表上点击右键,弹出菜单中选择「添加警报」。

img

在「警报」弹窗中设置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

img

点击一下交互按钮,测试一下机器人接收到命令买入的功能。

img

可以看到机器人接收到的命令字符串为: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我们可以通过机器人页面直接获取,如图: img 这次我们让信号触发时,买入0.02个币,命令字符串就为:"buy:0.02"。这样WebHook URL就完成了。这种方式只支持把信号写在URL里,如果想要获取到可由TV策略本身发出的警报消息里的内容,参考 https://www.fmz.com/api#直接验证

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

在TradingView上设置:

img

等待信号触发… 等待信号触发… 等待信号触发.

img

机器人接收到了信号:

img

这样就可以使用TradingView上的丰富的图表功能、指标算法配合发明者量化交易平台的策略机器人,实现自己想要的自动化交易,相对于把TradingView上的策略移植成JavaScript、Python语言难度直线下降。

「监控信号下单机器人」策略代码仅供学习研究,实盘使用需自行优化调整,支持期货,建议设置为市价单模式,详见策略代码参数。 抛砖引玉,如有问题、建议欢迎留言。


Related

More

pw1013 请问能不能对接一下deepcoin交易所,十分感谢

mingxi1005 发明者什么时候能对接币赢合约期货啊?币安和欧意返手续费太少了,高频机器人,手续费太伤了

mingxi1005 发明者什么时候能对接币赢合约期货啊?币安和欧意返手续费太少了,高频机器人,手续费太伤了

smilesg 你好大佬,我做的合约策略,开仓后有时中途会加仓,那么我最后要平仓的时候,用cover_long怎么平掉全部的仓位(因为不知道中间会加几次),"cover_long:1"里面的1改成什么,跪求代码

tyk950115 我的TV策略消息是这样的:订单{{strategy.order.action}}@{{strategy.order.contracts}}成交{{ticker}}。新策略仓位{{strategy.position_size}} 如果我想做合约的话,是不是要添加4个警报呢?做多、平多、做空、开空 webhook能不能引用策略里面的字段呢?还是要我写死才行?webhook里面的4种方式long、cover_long\short、cover_short怎么样才能和警报里面的消息对上吗?

小鹏学量化 我想把 tv的消息文本也传过来野,可惜不能携带,只能url携带参数,不是针对tradingview信息。

Ning 请问:[1234567,"buy:50"] 这个是买入价值50usdt的BTC, 但当我卖出时,[1234567,"sell:50"] 却显示【错误:Sell(-1, 50): insufficient balance】 那我如何设置,才能全部卖掉第一次买的BTC呢?

wqy 这个功能强啊!

lanbn 老师您好,我按照您的步骤一步一步照搬下来,就是服务器选用的是发明者自带的服务器,但是TV那边已经发信号了但是发明者这边的机器人还是不执行信号命令,是不是因为服务器的原因?请您答疑!!

tnmmhm 厉害了,收藏慢慢看

反向Q /upload/asset/19a5ed382b58652c4dd19.png /upload/asset/19b0ea9ffa5100a3594f3.png /upload/asset/19a806e32e9b589696fa0.png /upload/asset/19a5005173219393cf2d9.png 我按照步骤添加的合约代码,为什么还是显示错误,是那一步做错了吗?

wuxian 比如tv策略里有多头空头的指示,这个会根据tv策略里的提示进行开空、开多、平仓么?

PY008 期货合约代码写什么。

melo23 期货的视频教程在哪里

sug210 币安期货不支持吗?能支持的是哪个交易所

yuanlijie 合约怎么搞啊?编程小白,英文除了拼音字母啥也不认识。

mikelsl 立刻扩列一大波小白,这个太强了

skyfffire 厉害,又精简一步

homily 厉害

pw1013 显得你很能了是不是?我问版主关你屁事啊

hexiao49 我社区里发了个问题,能帮我看看不

小小梦 没有API接口的是没办法~

hexiao49 deep自己都没开api咋对接?

小小梦 这个要看有多少用户需求的。

小小梦 这个止盈止损要具体修改策略了,不是一两句就可以实现的。 FMZ直接支持PINE语言了,直接跑PINE脚本比较简单。

mingxi1005 小梦老师:我想在你公布的机器人上面加上 开单后挂止盈止损功能,要在哪里加?止盈止损功能的内在函数,FMZ上有吗?

小小梦 是呀,我也问过他们客服了,压根没开合约的API接口哇。。。。

mingxi1005 那就没办法咯

小小梦 这是现货API接口,老板! #_#!【大汗】 现货FMZ已经支持的。

mingxi1005 https://www.coinw.fit/front/API 这个网址有api,要梯子才能打开 /upload/asset/2986424014eb005f8cda2.png

mingxi1005 https://www.coinw.fit/front/API 这个网址有api,要梯子才能打开

小小梦 这个地址打不开哇。没有合约的API文档呀。

mingxi1005 API 入口链接:https://coinw.pw/API

小小梦 这个是coinw的现货API哇,coinw现货FMZ是已经支持的了,他们合约都没有接口的。您最好咨询下coinw。我问了他们客服,说是没有合约API。

mingxi1005 有啊 /upload/asset/29896466a9cd4cd2ce1b2.png 我们可以自己用通用协议绑定吧?只是要求要填IP地址,这个IP地址要填哪个地址呢? API 入口链接:https://coinw.pw/API

小小梦 尴尬了,您这边确定币赢合约有API接口吗?

mingxi1005 是的小梦老师,如果接入,会有很多量化接入进来,因为币赢返佣80%

小小梦 您好,是需要coinw这个交易所合约接入吗?还没对这个交易所评估过。

二两老波 请问你解决了吗。。。我也遇到这个问题了

lanbn 兄弟,TV的策略直接链接FMZ的这个你弄成功了吗?可以的话指导一下小弟啊,我弄来弄去还是没弄好!

小小梦 这个你可以具体设计的,比如你设计 请求里 cover_long:1, 改成 cover_long:all , 这样你在FMZ的这个 监听策略里把收到交互cover_long时修改一下, 判断如果是all,就全部平仓。要实现这个是要修改这个策略的。 ``` // 全局变量 var BUY = "buy" // 注意:现货用的命令 var SELL = "sell" // 现货用的命令 var LONG = "long" // 期货用的命令 var SHORT = "short" // 期货用的命令 var COVER_LONG = "cover_long" // 期货用的命令 var COVER_SHORT = "cover_short" // 期货用的命令 ...... .... .. . } 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) { // COVER_LONG 就是 “cover_long” ,判断到是这个action ,进入这里的if // 这里你再具体判断 all 之类的参数,去做全部平仓的操作设计,具体编写 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) } ```

yidai 请问解决了吗?同问

小小梦 TV的报警发送稳定性不太清楚,这个要看TV那边。

beiye args=[191755,"buy:0.02"],这里增加参数,做多同时可做空也可省略其中一个参数会不会更好?多个TV报警会不会出现意外两个相同点位的报警只发一个过来?

小小梦 使用FMZ的扩展API接收TV请求,可以获取Body内容,参看:https://www.fmz.com/api#直接验证 现在TV发出请求的url里,body里的数据都可以收到了。

1131717062 请问怎么在tv,策略上的开平仓警报怎么构建,webhook url

小小梦 使用FMZ的扩展API接收TV请求,可以获取Body内容,参看:https://www.fmz.com/api#%E7%9B%B4%E6%8E%A5%E9%AA%8C%E8%AF%81

小鹏学量化 https://www.fmz.com/strategy/221850,看到了,感谢大神!!

小小梦 有个直连方式的可以获取到请求的Body里的信息,在策略广场搜索下找下。

小小梦 修改策略,让50除以当时价格。

小小梦 如果收到命令,机器人状态栏上,“上次收到命令” 这个地方会显示收到的命令。 检查下是不是哪里没有配置对。

lanbn 配置的是币安的现货,机器人日志上上什么提示都没有,TV那里就是触发条件和webhook上设置一下就可以了吧?

小小梦 要看具体问题,你的机器人上配置的交易所是现货、期货?机器人日志上显示什么?

小小梦 /upload/asset/16afbca03eec23516d37.png 你交易所添加错了。

小小梦 老哥,API KEY截图要打码,安全第一。

反向Q /upload/asset/19aee891571def2a6c4f3.png 我在币安的API权限都开了,我也开通的合约账户,但是策略运行时总是添加不了期货交易所,是代码出问题了吗?

小小梦 日志上显示 Binance 说明添加的交易所对象是 币安现货。但是你的策略设置了期货合约代码,所以报错。

小小梦 需要在Trading view上设置报警,报警设置上填写webhook地址。可以实现开多开空平仓。

小小梦 https://www.fmz.com/api#exchange.setcontracttype... 这个函数描述中有,可以看下。

小小梦 本篇文章开头就有链接。

melo23 B站 视频 叫什么

小小梦 期货现货使用是一样的, 只是链接里面 参数替换一下而已。 var BUY = "buy" var SELL = "sell" var LONG = "long" var SHORT = "short" var COVER_LONG = "cover_long" var COVER_SHORT = "cover_short" long就是开多头仓位,short就是开空头仓位, cover_long 就是平多头,cover_short 平空头。 ``` https://www.fmz.com/api/v1?access_key=e3809e173e23004821a9bfb6a468e308&secret_key=45a811e0009d91ad21154e79d4074bc6&method=CommandRobot&args=[191755,"buy:0.02"] ``` 链接里面buy替换一下而已。

小小梦 TV上添加两个报警。一个平多 ,一个开空。TV可以添加N个报警。

sug210 如果是要平多仓同时开多,也就是信号设置是 cover_long:10 和 short:10,但是TV里设置后只能执行一个信号,这不是丢单吗?请问这个问题怎么解决

小小梦 都可以, 期货用期货的指令, 不是sell buy 了。 具体看下代码。

小小梦 期货设置合约就行了, 策略参数上,另外 在TV 上配置的 webhook url 里面要用 期货的命令 long, cover_long之类的。

key986 那是设置的现货的操作代码,请问期货应该咋个重新编写代码

小小梦 有视频教程可以看下,B站的。