trail_price参数为触发跟踪止损、止盈的价格,测试中我们使用了当时的收盘价close,加上一个偏移量offset。怎么区分多头持仓还是空头持仓的跟踪止盈、止损触发价格呢?strategy.exit函数会要求指定一个标签,来确定是对哪个仓位进行执行跟踪止损止盈计划单。我们使用strategy.entry("test 1", strategy.long, 1)函数开了一个多头仓位,指定了标签为test 1,所以在strategy.exit函数调用时我们也传入了这个标签。那么Pine语言脚本就知道是要对这个标签为test 1的多头仓位执行跟踪止损、止盈计划单了。
当对多头持仓使用trail_price参数时,是当价格高于这个trail_price价格时才会触发跟踪止损止盈。空头持仓则反之。
trail_offset参数为跟踪止损、止盈偏移量,跟踪止损止盈时会时时刻刻记录出现过的价格,用来动态调整跟踪止盈止损线(注意,不是触发启动跟踪止损止盈行为的线,是执行跟踪止损止盈的线)。拿本例子中开多仓之后跟踪止损止盈来说,这里就会监控行情出现的最高价格,当价格回撤到距离最高价格超过trail_offset参数设置的值时就会立即平仓止盈止损。如果是空头仓位的跟踪止损止盈,那么方向相反。
我们通过这个演示代码回测显示来具体说明:
因为测试的rb合约价格每跳为1元,我们设置了参数offset为30即30元距离,激活跟踪止损止盈计划单的价格就为close+30。然后当行情价格超过这个价格(close+30)之后就会进行跟踪止损止盈,记录最高价。当价格低于止损止盈触发线(记录的高价-30)时,立即平仓止损止盈。
跟踪止损止盈触发线
可以看到策略开始执行时马上开多仓,然后设置了触发移动止盈止损条件单的触发价格。之后期间没有任何操作,待到价格上升超过土黄色线,开始激活跟踪止盈止损条件单。开始记录此后行情的高价,根据最高价动态调整止损止盈线
跟踪止盈触发,平仓
可以观察到始终保持30元的距离(即因为设置了strategy.exit函数的参数trail_offset=offset),动态调整跟随。当价格下降跌破蓝色的线时,立即执行了平仓操作。
跟踪止盈止损例子回测日志
这样就实现了一次开仓、跟踪止盈止损操作。Pine语言是不是非常简单易用,便于设计。我们还可以把这样的止盈止损设计到策略里。例如我们有一个超级趋势策略,我们可以在策略中加入这样跟踪止损止盈。
// 反向信号,全平
if strategy.position_size > 0 and dir[2] < 0 and dir[1] > 0
strategy.cancel_all()
strategy.close_all()
runtime.log("趋势反转,多头全平")
else if strategy.position_size < 0 and dir[2] > 0 and dir[1] < 0
strategy.cancel_all()
strategy.close_all()
runtime.log("趋势反转,空头全平")
if not barstate.ishistory and findOrderIdx("open") >= 0 and state == 1
trail_price := strategy.position_size > 0 ? close + offset : close - offset
strategy.exit("exit", "open", 1, trail_price=trail_price, trail_offset=offset)
runtime.log("每点价格为:", syminfo.mintick, ",当前close:", close, ",trail_price:", trail_price)
state := 2
tradeBarIndex := bar_index
plot(superTrendPrice, "superTrendPrice", color=dir>0 ? color.red : color.green, overlay=true)