如何对接TradingView指标实现自动化交易

引言

在之前的文章中老庄介绍过如何对接TradingView的策略脚本实现自动化交易。用一句话总结,就是创建警报的时候,在警报消息中填入TVCBOT中生成的代码。之后策略会生成订单的相关信息,并发送给TVCBOT,包括何时开仓,何时平仓,开仓数量是多少。但是对于指标脚本来说,同样的方法就不再适用了。因为在指标脚本中,不含任何与订单相关的细节,所以像开仓、平仓、止盈、止损等信息,都需要我们单独设置。接下来我会详细说明如何对接指标脚本实现自动交易,在正式开始之前,你需要先阅读上一篇文章,详细了解对接自动化交易的流程以及TVCBOT中各个选项的说明(链接)。

对接指标脚本的基本流程

如果你还是一个新手,你可能不太清楚指标脚本和策略脚本的区别。简单的说,指标脚本只负责提供交易信号,这些信号能够很好的辅助我们进行看盘,交易,例如下图表所示:

而策略脚本是将一套完整的交易系统通过代码的方式实现出来,然后再与TradingView的历史数据做交互,提供给我们关于这套交易系统的具体表现,包括盈亏,胜负,订单详情等信息,如图所示。

策略脚本中也可以实现指标脚本中的全部功能,但是还有会有一些细微的差别,在这里就不过多讨论。搞清楚指标脚本和策略脚本之间的差别之后,有助于我们理解自动对接的过程。

指标脚本源码

在开始对接之前,需要准备一份可用于交易的指标脚本源码。所以我特意准备了一份布林带突破指标脚本。它的逻辑非常简单,当收盘价突破布林带上轨时,进场做多,然后设置一个固定的止盈和止损比例,在图表中用直线画出来。当收盘价突破布林带下轨时,进场做空,同样设置一个止盈和止损比例。具体效果如下:

相关代码如下:

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © openbox6

//@version=5
indicator("布林", overlay = true)

src = input(close, title = '数据来源')

middle = ta.sma(src, 20)
dev = 1.2 * ta.stdev(src, 20)
upper = middle + dev
lower = middle - dev

plot(middle, color = color.gray, linewidth = 2)
plot(upper, color = color.green, linewidth = 2)
plot(lower, color = color.red, linewidth = 2)

take_profit = input.float(0.075, title = '止盈比例(%)', step = 0.01)
stop_loss = input.float(0.05, title = '止损比例(%)', step = 0.01)
var is_long = false
var long_open = 0.0
var long_tp = 0.0
var long_sl = 0.0
var is_short = false
var short_open = 0.0
var short_tp = 0.0
var short_sl = 0.0
var is_trade = false
long_signal = false
short_signal = false
exit_long = false
exit_short = false


if ta.crossover(close, upper)
    if not is_trade
        long_signal := true
        long_open := close
        long_tp := long_open * (1 + take_profit)
        long_sl := long_open * (1 - stop_loss)
        is_long := true
        is_trade := true

if ta.crossunder(close, lower)
    if not is_trade
        short_signal := true
        short_open := close
        short_tp := short_open * (1 - take_profit)
        short_sl := short_open * (1 + stop_loss)
        is_short := true
        is_trade := true

if is_long and not long_signal
    if high > long_tp
        is_trade := false
        is_long := false
        long_open := na
        long_tp := na
        long_sl := na
        exit_long := true
    else
        if low < long_sl
            is_trade := false
            is_long := false
            long_open := na
            long_tp := na
            long_sl := na
            exit_long := true

plotshape(long_signal, text = '做多进场', textcolor = color.green, size=size.small, style = shape.triangleup, location = location.belowbar, color = color.green)
plotshape(exit_long, text = '多单出场', textcolor = color.white, size=size.small, style = shape.triangledown, color = color.white)
plot(long_signal?long_open:na, color=color.yellow, linewidth = 10, style = plot.style_linebr)
plot(is_long?long_tp:na, color=color.green, linewidth = 2, style = plot.style_linebr)
plot(is_long?long_sl:na, color=color.white, linewidth = 2, style = plot.style_linebr)
alertcondition(long_signal, title = '多单进场', message = '多单进场')
alertcondition(exit_long, title = '多单出场', message = '多单出场')
alertcondition(short_signal, title = '空单进场', message = '空单进场')
alertcondition(exit_short, title = '空单出场', message = '空单出场')



if is_short and not short_signal
    if low < short_tp
        exit_short := true
        is_trade := false
        is_short := false
        short_open := na
        short_sl := na
        short_tp := na
    else
        if high > short_sl
            exit_short := true
            is_trade := false
            is_short := false
            short_open := na
            short_sl := na
            short_tp := na

plotshape(short_signal, text = '空单进场', textcolor = color.red, size=size.small, style = shape.triangledown, color = color.red)
plotshape(exit_short, text = '做空出场', textcolor = color.purple, size=size.small, style = shape.triangleup, location = location.belowbar, color = color.purple)
plot(short_signal?short_open:na, color=color.aqua, linewidth = 10, style = plot.style_linebr)
plot(is_short?short_tp:na, color=color.red, linewidth = 2, style = plot.style_linebr)
plot(is_short?short_sl:na, color=color.purple, linewidth = 2, style = plot.style_linebr)

设置进出场条件

现在让我们转到TVCBOT的“交易对接”页面。

重点看交易方向,其它选项的含义请参考我之前的文章(链接)。由于我们是一个多空双向开单的策略,所以我们一共需要设置四种指令的警报,依次对应:1. 做多,2. 市价全平,3. 做空,4. 市价全平。原因刚才已经解释过了,指标脚本只负责生成警报,不含任何订单信息。所以我们要定义四种类型的警报用于区分。如果你还有取消挂单的需求,那警报的数量还要更多。

然后我们设置一下对接警报的信息。假如我当前有1000 U,每次交易我只下100 U,那我应该这样:

考虑到限价订单可能会漏单,所以采用市价进场。另外还可以按照资户可用资金的比例下单:

TVCBOT会自动读取账户可用余额,由于我们假定账号有1000 U,所以设置成10%。之后再点击生成警报,这样我们就完成了警报信息的获取。

之后回到TradingView中来,准备创建警报,首先在“条件”这选中正确的指标脚本。

条件下方有四个选项供我们选择,分别是“多单出场”,“多单进场”,“空单出场”,“空单进场”。这里要注意了,这四个条件并非系统自带,而是我在指标脚本中使用代码生成的。

这样,当指标发出警报的时候,就和我们刚才在TVCBOT设置的动作对应上了。显然我们应该选择“多单进场”,触发繁率选择“仅一次”,否则会多次下单。之后,我们将刚才在TVCBOT生成的警报信息复制到消息文本框中。

和策略对接一样,还要复制正确的Webhook URL,最后点击创建。

由于老庄的警报限额已满,就没办法给大家完整的展示全部细节了。按照同样的方式,之后我们要依次设置好“多单出场”,“空单进场”,“空单出场”的警报,这样才能让这个指标脚本完整的运行起来。

小结

我想大家应该发现了,相对于策略脚本,对接指标脚本实现自动交易非常的繁琐。不仅要占用多个警报名额,而且还要配合代码才能实现。最重要的是缺乏回测数据的话,我们没法判断一个交易系统的具体好坏,只能从主观上进场判断,所以我并不是很推荐大家使用指标脚本进行自动交易。我能想到的唯一一种比较适合的场景是可以使用它进行挂单交易。在对接策略脚本的时候必须要等待订单成交之后才能触发,所以没法做到提前挂单。但是指标可以做到自定义触发条件,相对来说更灵活一些。假如使用挂单交易被动成交的话,还能够节省一点手续费,长期下来也是一笔不小的收入。如果你遇到不得不使用指标脚本进行自动交易的场景,那么你可以参考这篇文章。由于我自己完全不使用这个功能,难免会有不少疏漏之处,假如你遇到问题的话,可以在下方的评论区告诉我。

发表回复 0

Index