Pine Script v5技术求助:检测K线信号与通道突破
Pine Script 5 基于LuxAlgo Nadaraya-Watson Envelope的策略问题解决
前提:获取指标核心变量
首先要拿到LuxAlgo指标的上轨(绿线)、下轨(红线)、买卖信号变量。如果直接调用公开指标,可通过以下方式引用(假设指标为公开脚本):
// 引用LuxAlgo的Nadaraya-Watson Envelope指标 lwEnv = request.security("LuxAlgo/Nadaraya-Watson-Envelope", timeframe.period, [upper, lower, longSignal, shortSignal]) upper = lwEnv[0] lower = lwEnv[1] longSignal = lwEnv[2] // 绿三角买入信号 shortSignal = lwEnv[3] // 红三角卖出信号
如果不想依赖外部指标,也可以用Pine原生函数实现核心逻辑:
// 自定义Nadaraya-Watson Envelope length = 20 deviation = 1.5 nw = ta.nadarayaWatson(close, length) upper = nw + ta.stdev(close, length) * deviation lower = nw - ta.stdev(close, length) * deviation // 复刻红绿三角信号(以价格穿越上下轨为例,可根据LuxAlgo实际逻辑调整) longSignal = ta.crossover(close, lower) shortSignal = ta.crossunder(close, upper)
问题1:检测最近X根K线内是否存在红绿三角信号
假设要检测最近5根K线内的信号,提供两种实现方式:
方法1:用ta.barssince判断信号距离
X = 5 // 自定义检测的K线数量 // 最近X根内存在绿三角买入信号 hasRecentLong = ta.barssince(longSignal) <= X and ta.barssince(longSignal) != na // 最近X根内存在红三角卖出信号 hasRecentShort = ta.barssince(shortSignal) <= X and ta.barssince(shortSignal) != na
ta.barssince(signal)返回上次信号出现至今的K线数,若最近X根内出现过,该值会≤X且不为空值。
方法2:用ta.highest判断信号是否存在
X = 5 // 最近X根内有买入信号(信号为true时取1,否则0,取最大值判断是否有1) hasRecentLong = ta.highest(longSignal ? 1 : 0, X) == 1 // 最近X根内有卖出信号 hasRecentShort = ta.highest(shortSignal ? 1 : 0, X) == 1
这种方式更简洁,适合批量判断多周期信号。
问题2:判断收盘价是否收在绿线(上轨)上方或红线(下轨)下方
直接通过价格与上下轨的比较即可实现:
// 收盘价收在绿线(上轨)上方 closeAboveUpper = close > upper // 收盘价收在红线(下轨)下方 closeBelowLower = close < lower
如果需要确认是实体突破(而非盘中穿越),可叠加开盘价条件:
// 实体突破上轨(收盘价>上轨且开盘价<上轨) bullishBreakout = close > upper and open < upper // 实体突破下轨(收盘价<下轨且开盘价>下轨) bearishBreakout = close < lower and open > lower
整合到策略的示例代码
//@version=5 strategy("NW Envelope 策略", overlay=true, default_qty_type=strategy.cash, default_qty_value=10000) // 1. 定义NW Envelope核心参数与变量 length = input.int(20, "NW长度") deviation = input.float(1.5, "偏差值") X = input.int(5, "检测最近X根K线的信号") nw = ta.nadarayaWatson(close, length) upper = nw + ta.stdev(close, length) * deviation lower = nw - ta.stdev(close, length) * deviation // 2. 生成红绿三角信号 longSignal = ta.crossover(close, lower) shortSignal = ta.crossunder(close, upper) // 3. 检测最近X根内的信号 hasRecentLong = ta.highest(longSignal ? 1 : 0, X) == 1 hasRecentShort = ta.highest(shortSignal ? 1 : 0, X) == 1 // 4. 判断收盘价位置 closeAboveUpper = close > upper closeBelowLower = close < lower // 5. 入场条件(结合两个问题的结果) longCondition = hasRecentLong and closeBelowLower shortCondition = hasRecentShort and closeAboveUpper // 执行交易 if (longCondition) strategy.entry("多单", strategy.long) if (shortCondition) strategy.entry("空单", strategy.short) // 绘制指标与信号 plot(upper, color=color.new(color.green, 0), title="上轨") plot(lower, color=color.new(color.red, 0), title="下轨") plotshape(longSignal, style=shape.triangleup, location=location.belowbar, color=color.green, size=size.small) plotshape(shortSignal, style=shape.triangledown, location=location.abovebar, color=color.red, size=size.small)
内容的提问来源于stack exchange,提问作者DonBastardoFX
相关产品推荐
相关产品推荐

