量化 TradingView Pine 脚本实现策略平仓

tradedge · 2024年04月26日 · 15 次阅读

Pine Script 使用市价订单平仓

在 Pine Script 中,使用市价平仓策略的虚拟头寸是一种常见方法。Pine Script 有两个生成这种退出的订单函数:

  • strategy.close() 函数用于退出所有具有特定名称的持仓交易。
  • strategy.close_all() 函数简单地退出所有持仓交易。

市价平仓

使用 strategy.close() 函数 对指定的交易进行平仓,该函数接收一个订单标识符的参数

例如:

strategy.close("Enter Long")

这个语句让 strategy.close() 函数使用市价订单关闭名为 "Enter Long" 的入场订单。

代码片段缺少的是何时发送订单。目前,每根 K 线上的 strategy.close() 都会尝试关闭名为 "Enter Long" 的未平仓订单。但这会导致交易几乎立即关闭。

相反,我们将 strategy.close() 放在一个 if 语句中。这样,当 if 语句的条件测试为真时,函数才会执行。这样退出订单只会在特定情况下生成。

以下是示例:

// 当价格穿过加权移动平均线下方时,提交一个市价订单关闭 'Enter Long' 订单
if ta.crossunder(close, ta.wma(close, 15))
    strategy.close("Enter Long")

这个 if 语句使用 ta.crossunder() 函数检查收盘价是否穿过了 15 根加权移动平均线的下方。当发生这种交叉时,条件为真,if 语句的代码块就会执行。(如果没有这种交叉,条件为假,if 语句内的代码就不会运行。)

在 if 语句中,strategy.close() 函数退出所有名为 "Enter Long" 的未平仓订单。这样,市价订单平仓只会在条件满足时执行。

以下是市价对空头仓位平仓的势力:

// 当价格穿过加权移动平均线上方时,提交一个市价订单关闭 'Enter Short' 订单
if ta.crossover(close, ta.wma(close, 15))
    strategy.close("Enter Short")

使用市价订单平仓的另一种方法是使用 strategy.close_all() 函数。该函数通过单个市价订单关闭所有未平仓位。无论策略是多头还是空头,strategy.close_all() 都会自动选择正确的市价订单来退出所有未平仓交易。

strategy.close_all() 函数在以下情况下很有用:

  • 有多个具有不同名称的未平仓订单。与为每个未平仓订单名称调用 strategy.close() 不同,我们可以使用单个 strategy.close_all() 调用来退出所有未平仓订单。
  • 需要关闭所有未平仓订单的条件,无论这些订单是多头还是空头。(例如,在周末结束时或回测日期范围结束时平仓)。

由于 strategy.close_all() 没有必需参数,我们只需调用该函数以关闭所有未平仓交易:

strategy.close_all()

示例策略

让我们看一个完整的策略,使用市价订单退出交易。下面的脚本交易 Keltner 通道。当价格穿过上轨时,我们开多。如果价格跌破下轨,我们开空。

这里有三个市价订单退出。当价格跌破上轨,然后再次上涨超过该轨时,多头平仓。类似地,如果价格再次跌破下轨,空头平仓。如果价格穿过 Keltner 通道的中线,我们也会平仓头寸。

策略的完整代码如下:

//@version=5
strategy(title="市价订单退出", overlay=true)

// 计算和绘制 Keltner 通道
[keltMa, keltUpper, keltLower] = ta.kc(close, 20, 1.75)

plot(keltUpper, color=color.blue, title="上轨")
plot(keltMa, color=color.orange, title="Keltner MA")
plot(keltLower, color=color.blue, title="下轨")

// 入场
// 当价格穿过 Keltner 上轨时开多头
if ta.crossover(close, keltUpper)
    strategy.entry("Enter Long", strategy.long)

// 当价格跌破 Keltner 下轨时开空头
if ta.crossunder(close, keltLower)
    strategy.entry("Enter Short", strategy.short)

// 退出
// 当价格再次穿过 Keltner 上轨时,关闭多头交易
if ta.crossover(close, keltUpper)
    strategy.close("Enter Long", comment="退出多头")

// 如果价格再次跌破 Keltner 下轨,退出空头交易
if ta.crossunder(close, keltLower)
    strategy.close("Enter Short", comment="退出空头")

// 当价格穿过中线时,以市价订单平仓头寸
if ta.cross(close, keltMa)
    strategy.close_all(comment="头寸退出")

在图表上,该策略使用市价订单交易 Keltner 通道如下:
Pine Script策略使用市价订单关闭交易

市价订单平仓总结

  • TradingView 策略使用市价订单关闭交易的方式有两种。
  • strategy.close() 函数对指定交易标识符的仓位市价平仓。
  • strategy.close_all() 函数以市价订单退出策略的头寸(多头或空头)。
  • 我们将这些函数放在一个 if 语句中。这样,它们只会在特定情况下执行。
  • 这两个函数仅用于平仓交易,并不能改变策略的头寸开仓方向。

Pine Script 使用止盈限价订单平仓

在 Pine Script 中,使用策略.exit() 函数可以生成限价止盈平仓订单

配置策略.exit() 函数有几种方法,但至少需要以下三个参数来设置限价止盈:

  • 将订单标识符(即订单名称)设置为第一个参数。例如,我们可以使用 "Exit Long" 和 "Exit Short" 作为多头和空头止盈的名称。
  • 使用 from_entry 参数告诉系统要从哪个入场订单退出。这样 Pine Script 就知道对哪个入场订单创建限价止盈订单。
  • 止盈价格有两种设置方法:
    • profit 参数用于将止盈设置为与入场价格相距多少个 ticks
    • limit 参数用于指定价格止盈

止盈平仓

上述步骤提供了两种可能的多头利润目标方法:使用 ticks 或指定价格价格。

要通过 ticks 数量设置多头退出水平可以这样使用 strategy.exit():

strategy.exit("Exit Long", from_entry="Enter Long", profit=200)

在这里,strategy.exit() 函数创建一个名为 'Exit Long' 的平仓订单。对 "Enter Long" 订单进行平仓。而止盈参数设置利润目标距离头寸入场价格 200 ticks。

要以特定价格退出可以这样使用 strategy.exit():

strategy.exit("Exit Long", from_entry="Enter Long", limit=close * 1.05)

这段代码也创建一个名为 'Exit Long' 的平仓订单,对 'Enter Long' 订单进行平仓。不过,这次限价参数设置止盈目标为当前价格的 5%。

这两个示例缺少创建平仓订单条件。目前的代码会在每根 K 线上生成平仓订单。那么何时创建止盈订单呢?一个好的时机是在满足开仓条件是同时创建止盈订单。

在代码层面,这意味着在创建策略.entry() 或 strategy.order() 函数同时执行 strategy.exit() 创建平仓订单。

因此,我们的策略如下:

// 当价格穿过20根移动平均线时开多头,并生成一个利润目标,距离入场价格200 ticks
if ta.crossover(close, ta.sma(close, 20))
    strategy.entry("Enter Long", strategy.long)
    strategy.exit("Exit Long", from_entry="Enter Long", profit=200)

这个 if 语句使用 ta.crossover() 函数检查收盘价是否上穿 20 根简单移动平均线。当发生这种交叉时,if 语句的代码会执行两个操作。

首先,它使用 strategy.entry() 函数生成一个市价订单入场。这个订单名为 "Enter Long",并采取多头策略(strategy.long)。

同时,策略使用 strategy.exit() 函数生成一个平仓订单。这个订单名为 "Exit Long"。from_entry 参数告诉 Pine Script 从 'Enter Long' 订单平仓,利润参数设置利润目标距离策略入场价格 200 ticks。也可以用特定价格设置利润目标,用 limit 参数替换 strategy.exit() 的 profit 参数。

空头平仓例子:

if ta.crossunder(close, ta.sma(close, 20))
    strategy.entry("Enter Short", strategy.short)
    strategy.exit("Exit Short", from_entry="Enter Short", profit=175)

限价止盈平仓示例策略

让我们看一个限价止盈的平仓退出的策略。下面的脚本交易相对强弱指数(RSI)。

当 RSI 上穿 20 时,策略以市价订单开多头,并提交止盈订单,目标价为当前 K 线高的 3% 以上。同样,当振荡器下穿 80 时,脚本以市价订单开空头,同时创建一个止盈订单,目标价为当前 K 线低的 3% 以下。

整个策略的代码如下:

//@version=5
strategy(title="限价订单退出")

// 计算相对强弱指数(RSI)
rsiValue = ta.rsi(hlcc4, 4)

// 在图表上绘制RSI及其超买和超卖水平
plot(rsiValue, color=color.teal, title="RSI")

hline(20, title="超卖")
hline(80, title="超买")

// 当RSI上穿20时,开多头,并生成一个止盈平仓订单
// 价格为高的3%以上
if ta.crossover(rsiValue, 20)
    strategy.entry("Enter Long", strategy.long)
    strategy.exit("Exit Long", from_entry="Enter Long", 
         limit=high * 1.03)

// 当RSI下穿80时,开空头,并提交一个3%利润目标
if ta.crossunder(rsiValue, 80)
    strategy.entry("Enter Short", strategy.short)
    strategy.exit("Exit Short", from_entry="Enter Short",
         limit=low * 0.97)

止盈平仓总结

  • TradingView 策略使用 strategy.exit() 函数创建止盈订单。
  • 对于这种订单,函数需要三个参数:订单标识符、开仓订单名称以及限价。
  • 设置限价的方法有两种:根据 ticks 数量(使用 profit 参数)或基于标的价格(使用 limit 参数)。
  • 在提交入场交易时同时生止盈订单,以此平仓订单将立即在入场 K 线上生效。

Pine Script 中使用止损订单平仓

在 Pine Script 中,使用 strategy.exit() 函数可以生成止损平仓订单,这样策略就可以通过市价订单在一定损失金额处平仓虚拟头寸,要使用止损订单平仓,需要以下函数参数:

  • 使用第一个参数设置订单标识符(即订单名称)。例如,我们可以使用 "Exit Long" 和 "Exit Short" 来命名多头和空头平仓订单。
  • 使用 from_entry 参数指定要从对哪个入场订单平仓,以此 Pine Script 就知道止损订单对哪个入场订单进行平仓。
  • 指定止损水平。有两种可能的参数:
    • loss 用于将止损目标设置为与头寸入场价格相距多少个 ticks
    • stop 用于以实际工具价格设置止损目标

不需要使用 strategy.cancel() 或 strategy.cancel_all() 取消止损订单。当我们将止损连接到特定入场订单时,TradingView 会在特定入场订单关闭时自动取消止损。因此,如果在止损之前另一个订单关闭交易,TradingView 会自动为我们删除止损。

 止损平仓

上述步骤提供了两种保护性多头止损的方式:基于 ticks 或基于价格。对于基于 ticks 的止损可以这样使用 strategy.exit() 函数:

// 为 'Enter Long' 入场订单设置一个损失150 ticks的止损
strategy.exit("Exit Long", from_entry="Enter Long", loss=150)

在这里,strategy.exit() 生成一个名为 "Exit Long" 的平仓订单,对 "Enter Long" 入场订单创建平仓订单。这将将平仓订单与指定的开仓订单关联。否则,Pine Script 将此止损应用于策略的任意尺寸(即使是空头头寸)。

设置为 150 的损失参数将止损设置为离头寸入场价格 150 ticks 的位置。(TradingView 会根据这个 ticks 数量自动计算正确的标的价格。)

另一种方法是使用特定价格设置止损。代码如下:

// 为 'Enter Long' 入场订单提交一个止损,价格为当前K线低的2%以下
strategy.exit("Exit Long", from_entry="Enter Long", stop=low * 0.98)

这段代码同样生成一个名为 "Exit Long" 的平仓订单。对 'Enter Long' 入场订单创建平仓订单。使用 stop 参数将止损设置为当前 K 线低的 2% 以下。

在生成入场订单时同时生成止损订单,这样做有两个重要好处:

  • 一旦入场订单成交,止损保护头寸就立即生效。(如果我们等到策略处于多头状态时才生成止损,会有一个 K 线的延迟,并且入场 K 线上没有保护性止损。)
  • 防止止损价格不断变化(因此无法执行)。假设止损价格低于低价 8%。但是我们在每根 K 线上更新订单。这会使止损始终低于每根 K 线的 8%,从而实际上远离市场。

以下是在生成入场订单同时生成止损订单代码的示例:

// 当价格突破20根最高高点时,开多头,并设置一个150 ticks的止损
if ta.crossover(high, ta.highest(high, 20)[1])
    strategy.entry("Enter Long", strategy.long)
    strategy.exit("Exit Long", from_entry="Enter Long", loss=150)

这个 if 语句使用 ta.crossover() 函数检查当前 K 线的高点是否突破了 20 根最高高点(ta.highest())。当发生这种交叉时,if 语句的条件为真(并且其代码运行)。

这段代码首先调用 strategy.entry() 函数生成一个名为 "Enter Long" 的多头入场订单。这会生成一个市价订单入场。

接下来,strategy.exit() 函数执行。我们将这个退出订单命名为 "Exit Long",并告诉它从 'Enter Long' 入场订单关闭。损失参数将止损设置为 'Enter Long' 订单平均入场价格的 150 ticks 处。

TradingView 首先生成入场订单。然后等待该订单成交后立即生成平仓订单。由于这种智能行为,我们在生成入场订单前执行 strategy.exit() 不会有问题。

空头止损实例:

// 当价格跌破20根最低低点时,开空头交易,并设置一个235 ticks的止损
if ta.crossunder(low, ta.lowest(low, 20)[1])
    strategy.entry("Enter Short", strategy.short)
    strategy.exit("Exit Short", from_entry="Enter Short", loss=235)

完整的止损策略例子

使用 strategy.exit() 函数生成止损订单的完整策略。下面的脚本使用两个指数移动平均线(EMA)进行交易。

当快速均线穿过慢速均线时,策略开多头。如果快速均线跌破慢速均线,策略开空头交易。这两个入场订单都会获得一个保护性止损,来自 strategy.exit()。该止损是一个特定价格,距离慢速均线 10 ticks 处。

策略的完整代码如下:

//@version=5
strategy(title="止损订单退出", overlay=true)

// 计算和绘制指数移动平均线(EMA)
fastEMA = ta.ema(close, 10)
slowEMA = ta.ema(close, 30)

plot(fastEMA, color=color.orange, title="快速EMA")
plot(slowEMA, color=color.teal, linewidth=2, title="慢速EMA")

// 当快速均线穿过慢速均线时开多头
if ta.crossover(fastEMA, slowEMA)
    strategy.entry("Enter Long", strategy.long)
    strategy.exit("Exit Long", from_entry="Enter Long", 
         stop=slowEMA - syminfo.mintick * 10)

// 当快速均线穿过慢速均线时开空头
if ta.crossunder(fastEMA, slowEMA)
    strategy.entry("Enter Short", strategy.short)
    strategy.exit("Exit Short", from_entry="Enter Short", 
         stop=slowEMA + syminfo.mintick * 10)

止损平仓总结

  • TradingView Pine Script 策略使用 strategy.exit() 函数创建止损订单
  • 对于这种订单,函数需要三个参数。首先是订单标识符(即订单名称)
  • 然后是 from_entry 参数将止损平仓订单与指定入场开仓订单关联
  • 对于止损本身,loss 参数将止损设置为与入场价格相距多少个 ticks 或使用 stop 参数将止损设置为特定价格。
  • 生成入场订单时同时生成止损订单。这样一来,当入场订单成交时,TradingView 立即激活止损以保护交易。
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请 注册新账号