TradingViewWebHook信号执行策略(教学)

Author: 小小梦, Date: 2020-04-28 17:01:35
Tags: StudyTrade-aided

相关文章:https://www.fmz.com/bbs-topic/5533 B站视频链接:https://www.bilibili.com/video/BV1Wk4y1k7zz/

  • 2020.7.29 更新 增加SPK , BPK 两条指令,分别对应:卖出平多仓之后卖出开空仓,买入平空仓之后买入开多仓。

/*
- 交互命令字符串格式
  action:amount
  action: buy , sell , long , short , cover_long , cover_short, spk , bpk
- 交易所类型
  eType变量取值: 0 spot , 1 futures

- TV文档链接
  https://www.tradingview.com/pine-script-docs/en/v4/Quickstart_guide.html
  https://cn.tradingview.com/chart/8xfTuX7F/

- TV webhook 发送请求
  https://www.fmz.com/api/v1?access_key=xxx&secret_key=yyyy&method=CommandRobot&args=[186515,"action:amount"]

- 引用类库
  引用数字货币交易类库
*/

// 参数
// var IsMarketOrder = false 
// var QuotePrecision = 2
// var BasePrecision = 2

// 期货参数
// var Ct = ""


// 全局变量
var BUY = "buy"
var SELL = "sell"
var LONG = "long"
var SHORT = "short"
var COVER_LONG = "cover_long"
var COVER_SHORT = "cover_short"
var SPK = "spk"
var BPK = "bpk"


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 if (action == SPK) {   // 卖出平多仓,卖出开空仓
                    exchange.SetDirection("closebuy")
                    var tradeInfo1 = IsMarketOrder ? exchange.Sell(-1, amount) : exchange.Sell(ticker.Buy, amount)
                    exchange.SetDirection("sell")
                    var tradeInfo2 = IsMarketOrder ? exchange.Sell(-1, amount) : exchange.Sell(ticker.Buy, amount)
                    tradeInfo = [tradeInfo1, tradeInfo2]
                } else if (action == BPK) {   // 买入平空仓,买入开多仓
                    exchange.SetDirection("closesell")
                    var tradeInfo1 = IsMarketOrder ? exchange.Buy(-1, amount) : exchange.Buy(ticker.Sell, amount)
                    exchange.SetDirection("buy")
                    var tradeInfo2 = IsMarketOrder ? exchange.Buy(-1, amount) : exchange.Buy(ticker.Sell, amount)
                    tradeInfo = [tradeInfo1, tradeInfo2]
                } 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)
    }
}



Related

More

superon 看了一晚上还是没看懂,能不能代写一下 聯繫一下V:maybeyeah

zz791377920 这个支持哪些交易所?

zz791377920 现货交易数量填的10,下单的时候变成金额10u,这是哪里的设置问题吗?

刘哲1 为什么上来就报错,ReferenceError: 'QuotePrecision' is not defined at main (__FILE__:13)

kukerzzz 问一下合约交易里面只能设置数量吗,如果每次都满仓交易该如何写

15937556103 老师 能不能发一个关于合约的完整策略

15937556103 /upload/asset/203b175e3c2c22ac9681c.png 为什么一直都是这样

tobey2022 你好,能在单个机器人上放多个交易对吗?然后的预警的URL增加交易对名称,一个机器人运行多个交易对的预警

le7mars long,short,cover_long,cover_SHORT,是要分别添加webhook吗

sbwffg198212 这是什么意思啊,期货交易所不支持,我想要做币安的永续合约BTC_USDT 要怎么设置啊

sbwffg198212 这是什么意思啊,期货交易所不支持,我想要做币安的永续合约BTC_USDT 要怎么设置啊

sbwffg198212 /upload/asset/1cd7a606f646b8c0d32be.png

反向Q 老哥,可否出一期关于如何添加和设置期货合约的教学视频,最好说的详细一些。

sug210 /upload/asset/125e8fed0f51ab1f8122e.jpg 用spk指令报错

夜空 如何解决TV发出警报,FMZ偶尔接收不到信号的问题?特别是TV的两个策略在同一时间点给FMZ两个机器人发出信号,时不时有一个机器人接收不到。 而且已经注册了两个TV账号来发送,还是会出现这个问题,不过FMZ托管的服务器是同一个。 /upload/asset/1796a4b1725a66d015a9f.png /upload/asset/179ca7beaa5e8f9dd79cf.png

半岛未凉 spk ,bpk后面要加数量吗? 如TV信号有多次报警开多单后,能一次性平前面开多单的总数量,空单一样。代码怎么样写

melo23 合约 倍数 在哪里选择

小小梦 看下策略参数,如果你添加的是期货交易所对象,要设置合约。否则机器人不知道要操作什么合约。

Richie 您好 提醒错误 ct 合约设置为空是为什么?

小小梦 都可以,但是参数、TV上的webhook 设置可能要根据做的品种调整。

小小梦 现货市价单的买单,下单量是金额。

小小梦 估计你那里弄错了,在按照API 文档检查下。策略是可以正常运行的。

刘哲1 重新换了key也不行,是不是必须复制完整策略才能调起来

小小梦 code 1 是API KEY 错了,检查下.

刘哲1 现在我在平台内测试是能下单,但是用扩展api一调就报错,返回,code:1,data:[],我是用链接直接访问的,类似于浏览器打开链接

小小梦 不要只复制代码,复制完整的策略。

小小梦 TV发送的信号,里面写下单多少,策略就下单多少。如果要梭哈之类的,需要改策略。

小小梦 这个策略本身就是一个完整的例子,可以跑期货,你命令用错了, 检查下。

小小梦 可以跑期货的,你webhook回调里用的命令错了,要用期货的命令, 仔细看代码。

tobey2022 好的,已经在众包板块发布了信息,期望你的成果和合作,thanks.

小小梦 这个不修改了,可以众包板块发布信息,有开发者会接单。

tobey2022 可以直接发给你修改吗?因为其它人可能还要熟悉一段时间,

小小梦 平台上有众包板块,可以在里面发布需求。

tobey2022 @小小梦,能否修改一版这样的策略,如果可行的话,当然可以付费购买,期望你的成果和回复,thanks.

小小梦 可以,但是需要修改这个策略。

小小梦 没太明白你的意思。。

le7mars 我按照long、short、coverlong、covershort设了四个警报,但是由于本身的是strategy不是study,这四个指令每次都是同时触发……

le7mars 怎么区分?用long或 short区分?

小小梦 报警webhook的URL里区分就可以了。

le7mars 发现问题了,只能接收tradingview指标的交易警报,但是我写的strategy,设置了4个不同的警报,但是貌似无法识别,当信号产生时,四个信号同时开单。。。。

小小梦 TV上报警发送请求 ``` https://www.fmz.com/api/v1?access_key=xxx&secret_key=yyyy&method=CommandRobot&args=[186515,"action:amount"] ``` 其中action这个地方你写什么指令,机器人就收到什么指令。例如: ``` https://www.fmz.com/api/v1?access_key=xxx&secret_key=yyyy&method=CommandRobot&args=[186515,"long:1"] ```

小小梦 先看下FMZ 初级教程, 要操作期货交易所账号, 先配置期货交易所。然后机器人上添加期货交易所对象。

sbwffg198212 /upload/asset/1ccc5603d54593dcba809.png

sbwffg198212 我就是改了这些地方,大神帮我看下哪里不对啊,我不会 添加期货交易所对象,参数上设置合约,永续是swap, 币本位是XXX_USD, U本位是XXX_USDT。

小小梦 添加期货交易所对象,参数上设置合约,永续是swap, 币本位是XXX_USD, U本位是XXX_USDT。

小小梦 检查下是不是没有持仓的情况下去调用 SPK了。

小小梦 可以用FMZ平台文库中介绍的TV直连方式,https://www.fmz.com/digest-topic/5969 。

小小梦 杠杆值在交易所可以设置好。或者在策略代码里面下单之前```exchange.SetMarginLevel() ```设置杠杆值

小小梦 跑合约交易所,要设置合约,否则不知道要操作什么合约。

小小梦 ``` https://www.fmz.com/api/v1?access_key=xxx&secret_key=yyyy&method=CommandRobot&args=[186515,"action:amount"] ``` action 写成 spk ,bpk

夜空 我想知道针对SPK和BPK,TV那边怎么设置