大A超实用的60日均线+MACD战法
诚全而归之 • 1 个月前 • 35 次点击 •
买入信号是:价格前期在60均线上,呈下跌趋势,价格回踩到60均线,同时MACD慢线在0轴以上,出现买入信号。卖出信号:价格前期在60均线下,成上升趋势,价格升到60日均线,同时MACD慢线在0轴以下,出现卖出信号。
SMA60+MACD Strategy 指标说明
指标概述
SMA60+MACD Strategy 是一个基于趋势和均线回踩/突破的交易策略指标,结合了 60 周期简单移动平均线(SMA60)、5 周期简单移动平均线(SMA5)趋势判断和 MACD 指标,旨在捕捉价格在趋势中的回踩或突破机会。指标通过以下条件生成买入和卖出信号:
- 买入信号:价格在 SMA60 上方,SMA5 呈下降趋势,价格回踩到 SMA60 附近,等待 1 到 N 根绿色蜡烛(阳线)收盘价高于 SMA60,同时 MACD 慢线在 0 轴以上。
- 卖出信号:价格在 SMA60 下方,SMA5 呈上升趋势,价格突破到 SMA60 附近,等待 1 到 N 根红色蜡烛(阴线)收盘价低于 SMA60,同时 MACD 慢线在 0 轴以下。
输入参数
-
SMA Period (
smaLength
)- 默认值:60
- 描述:用于计算主均线的周期数,即 SMA60。
- 用途:确定价格回踩或突破的主要参考均线。
-
MACD Fast Length (
fastLength
)- 默认值:12
- 描述:MACD 快线的周期数。
- 用途:计算 MACD 指标的快线。
-
MACD Slow Length (
slowLength
)- 默认值:26
- 描述:MACD 慢线的周期数。
- 用途:计算 MACD 指标的慢线。
-
MACD Signal Length (
signalLength
)- 默认值:9
- 描述:MACD 信号线的周期数。
- 用途:计算 MACD 指标的信号线(慢线),用于判断趋势方向。
-
Trend Lookback Period (
trendLookback
)- 默认值:5
- 描述:用于判断趋势的回看周期数。
- 用途:确定 SMA5 的趋势方向(上升或下降)所需的最小周期数。
-
SMA Trend Period (
smaTrendLength
)- 默认值:5
- 描述:用于判断趋势的 SMA 周期数(即 SMA5)。
- 用途:计算用于趋势判断的短期均线。
-
Wait Candle Limit (
waitCandleLimit
)- 默认值:2
- 描述:回踩/突破后最多等待的蜡烛数量。
- 用途:控制信号触发的最长等待时间(以蜡烛数量计)。
-
Touch Tolerance (%) (
touchTolerance
)- 默认值:0.5
- 描述:回踩/突破 SMA60 的容差范围(以百分比表示)。
- 用途:允许价格在 SMA60 附近一定范围内(±容差)触发信号。
指标逻辑
买入信号条件
- 价格位置:前一根蜡烛的收盘价高于 SMA60(
close[1] > sma60[1]
)。 - 趋势方向:SMA5 呈下降趋势(当前 SMA5 小于
trendLookback
周期前的 SMA5,即smaTrend < smaTrend[trendLookback]
)。 - 回踩条件:价格从上方回踩到 SMA60 附近(
close <= sma60 + tolerance
且close[1] > sma60[1] - tolerance
)。 - MACD 条件:MACD 信号线(慢线)在 0 轴以上(
signalLine > 0
)。 - 确认信号:在回踩后的 1 到
waitCandleLimit
根蜡烛内,出现绿色蜡烛(阳线,close > open
),且收盘价高于 SMA60(close > sma60
)。
卖出信号条件
- 价格位置:前一根蜡烛的收盘价低于 SMA60(
close[1] < sma60[1]
)。 - 趋势方向:SMA5 呈上升趋势(当前 SMA5 大于
trendLookback
周期前的 SMA5,即smaTrend > smaTrend[trendLookback]
)。 - 突破条件:价格从下方突破到 SMA60 附近(
close >= sma60 - tolerance
且close[1] < sma60[1] + tolerance
)。 - MACD 条件:MACD 信号线(慢线)在 0 轴以下(
signalLine < 0
)。 - 确认信号:在突破后的 1 到
waitCandleLimit
根蜡烛内,出现红色蜡烛(阴线,close < open
),且收盘价低于 SMA60(close < sma60
)。
图表显示
-
SMA60 线
- 颜色:蓝色
- 描述:主图上的 60 周期简单移动平均线,用于判断价格的回踩或突破。
-
SMA5 线(可选,用于调试)
- 颜色:橙色
- 描述:主图上的 5 周期简单移动平均线,用于判断趋势方向。
-
买入信号
- 标记:绿色向上三角形
- 位置:K 线下方
- 描述:表示满足买入条件的信号点。
-
卖出信号
- 标记:红色向下三角形
- 位置:K 线上方
- 描述:表示满足卖出条件的信号点。
-
MACD 副图
- MACD 线:红色
- 信号线(慢线):黄色
- 零轴:灰色
- 描述:显示 MACD 指标,用于判断趋势方向。
使用方法
-
添加指标
- 在 TradingView 中打开 Pine Script 编辑器,复制并粘贴代码。
- 保存并添加到图表。
-
调整参数
- 根据交易需求调整输入参数,例如:
- 增加
touchTolerance
(例如从 0.5 改为 1.0),以放宽回踩/突破的容差。 - 减少
trendLookback
(例如从 5 改为 3),以放宽趋势要求。 - 调整
waitCandleLimit
(例如从 2 改为 3),以延长信号触发窗口。
- 增加
- 根据交易需求调整输入参数,例如:
-
观察信号
- 关注主图上的绿色向上三角形(买入信号)和红色向下三角形(卖出信号)。
- 结合 MACD 副图和 SMA5 趋势线,验证信号的有效性。
注意事项
-
信号频率
- 如果信号太少,可以:
- 减少
trendLookback
(例如从 5 改为 3),放宽趋势要求。 - 增加
touchTolerance
(例如从 0.5 改为 1.0),允许更大的回踩/突破范围。 - 调整
smaTrendLength
(例如从 5 改为 3 或 7),改变趋势均线的敏感度。 - 如果信号过多,可以反向调整上述参数。
-
等待周期
waitCandleLimit
控制信号触发的最大等待时间。如果设置为较大的值(例如 3 或 4),信号触发的窗口会变大,但可能增加延迟。
-
市场适用性
- 该指标更适合趋势性较强的市场,在震荡市场中可能产生较多假信号。建议结合其他指标(如 RSI 或布林带)进行过滤。
-
风险管理
- 交易信号仅供参考,建议结合止损和止盈策略进行风险管理。
代码
以下是完整的 Pine Script v6 代码:
//@version=6
// 指标名称
indicator("SMA60+MACD Strategy", overlay=true)
// 输入参数
smaLength = input.int(60, "SMA Period")
fastLength = input.int(12, "MACD Fast Length")
slowLength = input.int(26, "MACD Slow Length")
signalLength = input.int(9, "MACD Signal Length")
trendLookback = input.int(5, "Trend Lookback Period", minval=1)
smaTrendLength = input.int(5, "SMA Trend Period", minval=1) // 用于判断趋势的SMA周期
waitCandleLimit = input.int(2, "Wait Candle Limit", minval=1) // 等待蜡烛数量限制
touchTolerance = input.float(0.5, "Touch Tolerance (%)", minval=0.0, step=0.1) // 回踩容差(百分比)
// 计算SMA
sma60 = ta.sma(close, smaLength)
smaTrend = ta.sma(close, smaTrendLength) // 用于判断趋势的SMA5
// 计算MACD
[macdLine, signalLine, _] = ta.macd(close, fastLength, slowLength, signalLength)
// 定义趋势:基于SMA5的趋势方向
downTrend = smaTrend < smaTrend[trendLookback] // 当前SMA5低于trendLookback周期前的SMA5
upTrend = smaTrend > smaTrend[trendLookback] // 当前SMA5高于trendLookback周期前的SMA5
// 价格与SMA60的关系
priceAboveSMA = close[1] > sma60[1] // 前期价格在SMA60上方
priceBelowSMA = close[1] < sma60[1] // 前期价格在SMA60下方
// 价格回踩或突破SMA60的条件(放宽容差)
tolerance = sma60 * touchTolerance / 100 // 计算容差范围
priceTouchSMADown = close <= sma60 + tolerance and close[1] > sma60[1] - tolerance // 价格从上方回踩SMA60(允许容差)
priceTouchSMAUp = close >= sma60 - tolerance and close[1] < sma60[1] + tolerance // 价格从下方突破SMA60(允许容差)
// 蜡烛颜色和收盘价条件
isGreenCandle = close > open // 绿色蜡烛(阳线)
isRedCandle = close < open // 红色蜡烛(阴线)
closeAboveSMA = close > sma60 // 收盘价高于SMA60
closeBelowSMA = close < sma60 // 收盘价低于SMA60
// 使用变量记录回踩/突破状态及等待周期
var bool buySetup = false
var bool sellSetup = false
var int buyWaitCount = 0
var int sellWaitCount = 0
// 检查是否满足回踩/突破条件
if priceAboveSMA and downTrend and priceTouchSMADown and signalLine > 0
buySetup := true
buyWaitCount := 0
else if buySetup
buyWaitCount := buyWaitCount + 1
if priceBelowSMA and upTrend and priceTouchSMAUp and signalLine < 0
sellSetup := true
sellWaitCount := 0
else if sellSetup
sellWaitCount := sellWaitCount + 1
// 重置状态:如果等待超过 waitCandleLimit 根蜡烛仍未满足条件
if buyWaitCount > waitCandleLimit
buySetup := false
buyWaitCount := 0
if sellWaitCount > waitCandleLimit
sellSetup := false
sellWaitCount := 0
// 买入信号:回踩后1到waitCandleLimit根绿色蜡烛收盘价高于SMA60
buySignal = buySetup and isGreenCandle and closeAboveSMA and buyWaitCount <= waitCandleLimit
// 卖出信号:突破后1到waitCandleLimit根红色蜡烛收盘价低于SMA60
sellSignal = sellSetup and isRedCandle and closeBelowSMA and sellWaitCount <= waitCandleLimit
// 绘制SMA60线
plot(series=sma60, title="SMA60", color=color.new(color.blue, 0))
// 可选:绘制SMA5线(用于调试趋势判断)
plot(series=smaTrend, title="SMA5", color=color.new(color.orange, 0), style=plot.style_line, linewidth=1)
// 绘制买卖信号
plotshape(series=buySignal, title="Buy", location=location.belowbar, color=color.new(color.green, 0), style=shape.triangleup, size=size.small)
plotshape(series=sellSignal, title="Sell", location=location.abovebar, color=color.new(color.red, 0), style=shape.triangledown, size=size.small)
// 可选:显示MACD数值(在副图中)
plot(series=macdLine, title="MACD", color=color.new(color.red, 0), display=display.pane)
plot(series=signalLine, title="Signal", color=color.new(color.yellow, 0), display=display.pane)
plot(series=0, title="Zero Line", color=color.new(color.gray, 0), display=display.pane)