Pine Script如何实现EMA交叉时绘制K线半价位止损线
Pine Script 实现金叉K线半价位画线及止损逻辑
ta.valuewhen 函数用法说明
这个函数的作用是当指定条件触发时,记录目标变量的取值,条件未触发时一直保留最近一次记录的值,一共3个入参:
- 第1个参数:触发条件,对应场景中金叉判断条件
EmaCross - 第2个参数:触发时需要记录取值的变量/计算表达式,对应场景中信号对应K线的半价位计算式
- 第3个参数:取历史上第几次触发的取值,
0代表最近一次,1代表上上次,以此类推
注意逻辑偏移问题
你提到的(open[1] + close[1]) / 2是计算当前K线的前一根K线的半价位,如果要取金叉信号发生当根K线的半价位,直接用(open + close)/2即可,不需要加[1]偏移,否则止损位会错移一根K线。
完整实现代码
//@version=5 // 纯指标显示场景:把下面的strategy行替换为 indicator(title="EMA 20/50/100 带半价线", overlay=true) 即可 strategy(title="EMA金叉半价止损策略", overlay=true, initial_capital=10000, default_qty_type=strategy.cash, default_qty_value=10000, commission_type=strategy.commission.percent, commission_value=0.1) // 计算EMA均线 shortest = ta.ema(close, 5) short = ta.ema(close, 10) longer = ta.ema(close, 20) // 识别EMA金叉信号 EmaCross = ta.crossover(shortest, short) // 记录最近一次金叉发生时,信号K线的半价位 crossHalfPrice = ta.valuewhen(EmaCross, (open + close)/2, 0) // 交易逻辑(纯指标显示场景可删除) if EmaCross and strategy.position_size == 0 strategy.entry("多仓", strategy.long) // 价格跌破半价位触发止损平仓 if strategy.position_size > 0 and close < crossHalfPrice strategy.close("多仓") // 绘图 plot(shortest, color=color.yellow, linewidth=2, title="EMA5") plot(short, color=color.red, linewidth=2, title="EMA10") plot(longer, color=color.purple, linewidth=2, title="EMA20") // 绘制半价位线,无有效信号时自动断开 plot(crossHalfPrice, color=color.blue, linewidth=2, title="金叉半价止损位", style=plot.style_linebr) // 标记金叉信号位置 plotshape(EmaCross, location=location.belowbar, color=color.green, style=shape.labelup, text="金叉", textcolor=color.white, size=size.small)
补充说明
- 如果确实需要取信号K线前一根的半价位,只需要把
ta.valuewhen的第二个参数改成(open[1] + close[1])/2即可。 - 如果需要在图上显示历史所有金叉对应的半价位固定水平线,可以搭配
line.new函数在每次EmaCross触发时绘制从信号K线开始延伸的固定线段;仅做最近一次止损位参考的话,上面的写法性能更高、逻辑更简单。 - 纯指标模式下删除交易逻辑相关的代码即可正常加载,不会影响线条绘制效果。
内容的提问来源于stack exchange,提问作者Lacey
相关产品推荐
相关产品推荐

