TradingView信号执行实盘交易的终极方案
经常使用TradingView的交易者都知道,TradingView可以推送消息到其它平台。之前在文库中也公开了一篇TradingView的信号推送策略,推送的消息内容是写死在请求url中的,有些不灵活。本篇我们重新用一种方式来设计一个TradingView信号执行策略。
场景和原理
可能有新手同学看到本篇文章题目和上面的描述有些懵,没关系!我们先把需求场景、原理阐述清楚。让您知道我在讲什么。OK,我们这就切入主题。
1、需求场景:
说了半天是要这个东西做什么工作呢?简单说就是我们在TradingView上有很多可以选择使用的指标、策略、代码等,这些都可以在TradingView上直接运行,可以画线、计算、显示交易信号等。并且TradingView有实时的价格数据、充足的K线数据方便各种指标计算。TradingView上这些脚本代码叫做PINE语言,唯独一点不太方便的就是在TradingView上实盘交易。虽然在FMZ上已经支持PINE语言,也可以实盘运行。但是也有TradingView的铁粉还是希望以TradingView上的图表发出的信号去下单交易,那么这个需求也可以通过FMZ来解决。所以本篇就是讲解这种解决方案的具体细节。
2、原理:

整个方案中涉及4个主体,简单来说分别是:

所以如果想这么玩就需要这几个准备:
1、TradingView上运行的脚本,负责发送信号请求到FMZ的扩展API接口,需要TradingView账号至少是PRO会员。
2、在FMZ上部署一个托管者程序,需要是可以访问到交易所接口的那种(例如新加坡、日本、香港等地的服务器)。
3、在FMZ上配置当TradingView信号发送过来时,要(下单)操作的交易所的API KEY。
4、你需要有个「TradingView信号执行策略」,这个策略就是本篇主要讲的。
TradingView信号执行策略
上一个版本的「TradingView信号执行策略」设计不太灵活,消息只能写死在TradingView发送的请求的url中。假如我们希望TradingView推送消息时在Body中写一些变量信息,这个时候就无能为力了。例如在TradingView上这样的消息内容:

那么TradingView上是可以如图中设置这样,把消息写在请求的Body中发送给FMZ的扩展API接口。那FMZ的这个扩展API接口如何调用呢?
FMZ的一系列扩展API接口中,我们要用到的是CommandRobot
这个接口,通常是这样调用这个接口:
这个请求url的query
中的access_key
和secret_key
就是FMZ平台的扩展API KEY
,这里演示所以设置为xxx
和yyyy
。那这个KEY怎么创建呢?在这个页面:https://www.fmz.com/m/account
,创建一个就可以,妥善保管,切勿泄露。

回归正题,继续说CommandRobot
接口的问题。如果需要访问的是CommandRobot
接口,请求中的method
就设置为:CommandRobot
。CommandRobot
这个接口的功能就是通过FMZ平台向某个ID的实盘发送一个交互消息,所以参数args
中包含的就是实盘ID和消息,上面这个请求url例子就是向ID为186515
的实盘程序,发送消息ok12345
。
之前是用这种方式请求FMZ扩展API的CommandRobot接口,消息只能写死例如上面例子中的ok12345
。如果消息在请求的Body中,就需要用另一种方式:
这样请求就可以通过FMZ平台,发送请求中Body的内容作为交互消息给ID为130350
的实盘了。如果TradingView上的消息设置为:{"close": {{close}}, "name": "aaa"}
,那么ID为130350
的实盘就会收到交互指令:{"close": 39773.75, "name": "aaa"}
为了让「TradingView信号执行策略」收到交互指令时能正确理解TradingView发送的这个指令,要提前约定一下消息格式:
策略设计成了多交易所架构,所以可以在这个策略上配置多个交易所对象,也就是可以控制多个不同账户的下单操作。只用在信号结构中Exchange指定要操作的交易所即可,设置1就是要让这个信号操作第一个添加的交易所对象对应的交易所账户。如果要操作的是现货ContractType设置为spot,期货就写具体合约,例如永续合约写swap。市价单价格传-1就可以了。Action设置对于期货、现货、开仓、平仓都是有区别的,不能设置错。
接下来就可以设计策略代码了,完整的策略代码:
策略参数和交互:

「TradingView信号执行策略」完整策略可以在FMZ策略广场搜索到。
简单测试
策略运行前要配置好交易所对象,在策略参数中设置好「FMZ平台的AccessKey」、「FMZ平台的SecretKey」这两个参数,不要设置错。运行起来显示:

会依次打印出:在TradingView上需要填写的WebHook地址、支持的Action指令、消息格式。重要的是WebHook地址:
直接复制粘贴写在TradingView上对应位置就可以。
如果想模拟TradingView发送信号,可以点击策略交互上的TestSignal按钮:

这个策略会自己发送一个请求(模拟TradingView发送信号请求),调用FMZ的扩展API接口,给策略自己发送一个消息:
当前策略就会收到另一个交互消息,并且执行:

并且下单交易。
实际场景中使用TradingView的测试
使用TradingView测试需要TradingView账号是Pro级别,测试之前有一些前置小知识需要简单讲解一下。
以一个简单的PINE脚本(TradingView上随便找的修改了一下)为例子
1、PINE脚本可以在脚本发出下单指令时附带一些信息
以下这些是占位符,例如我在报警中「消息」框中写入{{strategy.order.contracts}}
,那么在触发下单时就会发送消息(根据报警上的设置,邮件推送、webhook url请求、弹窗等),消息中就会包含这次执行订单的数量。
{{strategy.position_size}}
- 返回Pine中相同关键字的值,即当前仓位的大小。{{strategy.order.action}}
- 为执行的订单返回字符串“buy”或“sell”。{{strategy.order.contracts}}
- 返回已执行订单的合约数量。{{strategy.order.price}}
- 返回执行订单的价格。{{strategy.order.id}}
- 返回已执行订单的ID(在生成订单的函数调用之一中用作第一个参数的字符串:strategy.entry,strategy.exit或strategy.order)。{{strategy.order.comment}}
- 返回已执行订单的注释(在生成订单的函数调用之一中的comment参数中使用的字符串:strategy.entry、strategy.exit、或strategy.order)。如果未指定注释,则将使用strategy.order.id的值。{{strategy.order.alert_message}}
- 返回alert_message参数的值,该参数可以在调用用于下订单的函数之一时在策略的Pine代码中使用:strategy.entry、strategy.exit、或strategy.order。仅在Pine v4中支持此功能。{{strategy.market_position}}
- 以字符串形式返回策略的当前持仓:“long”、“flat”、或 “short”。{{strategy.market_position_size}}
- 以绝对值(即非负数)的形式返回当前仓位的大小。{{strategy.prev_market_position}}
- 以字符串形式返回策略的上一个持仓:“long”、“flat”、或 “short”。{{strategy.prev_market_position_size}}
- 以绝对值(即非负数)的形式返回前一个仓位的大小。
2、结合「TradingView信号执行策略」构造消息
3、让TradingView根据这个PINE脚本运行时发出信号,需要在TradingView上加载这个脚本时设置报警

当TradingView上的PINE脚本触发交易动作,就会发送webhook url请求。


FMZ的实盘就会执行这个信号。


视频地址
B站:https://www.bilibili.com/video/BV1BY411d7c6/
文章中的代码仅供参考,实际使用可以自行调整、扩展。