在 Pine Script 中,使用市价平仓策略的虚拟头寸是一种常见方法。Pine Script 有两个生成这种退出的订单函数:
使用 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_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 中,使用策略.exit() 函数可以生成限价止盈平仓订单
配置策略.exit() 函数有几种方法,但至少需要以下三个参数来设置限价止盈:
profit
参数用于将止盈设置为与入场价格相距多少个 tickslimit
参数用于指定价格止盈上述步骤提供了两种可能的多头利润目标方法:使用 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)
在 Pine Script 中,使用 strategy.exit() 函数可以生成止损平仓订单,这样策略就可以通过市价订单在一定损失金额处平仓虚拟头寸,要使用止损订单平仓,需要以下函数参数:
不需要使用 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% 以下。
在生成入场订单时同时生成止损订单,这样做有两个重要好处:
以下是在生成入场订单同时生成止损订单代码的示例:
// 当价格突破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)