逐级铺垫的均线兼顾策略Level-by-Level-Build-Up-Moving-Average-Strategy
ChaoZhang · PineScript · 波动率与通道 · 2023-09-26 16:00:20
概述
逐级铺垫的均线兼顾策略是一种基于RENKO图表的交易策略。该策略使用均线 indicaotr 对价格进行平滑处理,利用不同时间周期均线的交叉作为买卖信号。同时,该策略还会根据ATR指标来确定止损位,使止损更加合理。
策略原理
该策略主要通过以下几个部分实现:
- 使用input选择RENKO时间周期和ATR周期
- 计算RENKO价格和颜色,当价格突破前一个RENKO价格加上当前ATR时转为涨,价格低于前一个RENKO价格减去当前ATR时转为空
- 使用两个整数BUY和SELL记录当前多单和空单数量
- 当涨突破时,如果没有空单则开多,空单则平掉
当跌突破时,如果没有多单则开空,多单则平掉
- 使用plot绘制RENKO图
通过这样的逻辑,策略可以在价格突破前一级别时开仓做多做空,并且会在价格反转时平掉当前头寸。同时,使用ATR来确定突破幅度,可以基于当下的波动率来确定合理的止损位置。
优势
该策略具有以下几个优势:
- 使用RENKO消除噪音,识别趋势
RENKO图可以有效消除价格震荡的噪音,识别出较明显的趋势方向。这对发现趋势且跟随趋势是一个很好的组合。
- 均线交叉发出交易信号
不同时间周期均线交叉可以作为较为可靠的交易信号指标,避免被噪音欺骗。
- ATR动态止损
使用ATR动态设置止损位,可以根据当下波动率合理设置止损,避免止损过大或过小。
- 兼顾趋势和均线
结合趋势和均线指标,可以同时利用两者优势,在抓取趋势的同时也确保交易信号更加可靠。
风险
该策略也存在一些风险:
- 趋势判断错误
RENKO决定价格趋势的方式可能存在错误,从而导致不必要的买卖开平。需要优化参数以减少误判。
- 均线交叉假信号
均线交叉信号可能存在假信号,这会导致不必要的买卖动作。可以适当优化均线周期参数。
- ATR参数不当
ATR周期设置不当也会导致止损过大或过小。需要测试不同市场确定较优参数。
- 大幅震荡行情
在横盘和大幅震荡行情下,RENKO图会出现许多不必要的买卖开平操作,会造成资金占用。这需要 通过其它指标进行过滤,避免这种行情交易。
优化方向
该策略可以从以下几个方向进行优化:
- 优化RENKO和ATR参数
调整这两个参数可以尽量减少RENKO的误判,使RENKO更准确抓取趋势。
- 添加均线交叉过滤
添加更多均线,并要求大部分均线同向交叉才产生信号,可以过滤假信号。
- 增加其他指标过滤
比如增加量能指标,只在量能同向确认时才产生交易信号,可以避免被套。
- 优化止损策略
可以研究如何只在趋势反转时止损,而不是简单跟踪ATR,使止损更加合理。
- 优化资金管理
研究如何在该策略下最优化资金管理,以提高盈利率同时控制风险。
总结
该策略整体来说是一个值得优化和实盘验证的策略,核心思路是利用RENKO识别趋势,并用均线交叉作为过滤后的交易信号。结合ATR动态止损,可以成为一个具有优势的趋势跟踪策略。下一步需要针对已知风险继续进行优化测试,使策略参数更加完善,从而获得更好的实盘表现。
参数
| 参数 | 默认值 | 说明 |
|---|---|---|
| v_input_1 | D | TimeFrame |
| v_input_2 | 14 | ATR length |
源码(57 行)
/*backtest
start: 2022-09-19 00:00:00
end: 2023-09-25 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("Renko Level Strategy 2", shorttitle="RLS2", overlay=true, pyramiding=2, currency=currency.USD, default_qty_value=50, initial_capital=2000, default_qty_type=strategy.percent_of_equity)
TF = input(title='TimeFrame', type=input.resolution, defval="D")
ATRlength = input(title="ATR length", type=input.integer, defval=14, minval=2, maxval=100)
HIGH = security(syminfo.tickerid, TF, high)
LOW = security(syminfo.tickerid, TF, low)
CLOSE = security(syminfo.tickerid, TF, close)
ATR = security(syminfo.tickerid, TF, atr(ATRlength))
float RENKO = na
color COLOR = na
int BUY = na
int SELL = na
bool UP = na
bool DN = na
RENKO := na(RENKO[1]) ? close : RENKO[1]
COLOR := na(COLOR[1]) ? color.white : COLOR[1]
BUY := na(BUY[1]) ? 0 : BUY[1]
SELL := na(SELL[1]) ? 0 : SELL[1]
UP := false
DN := false
if(close > RENKO[1]+ATR[1])
UP := true
RENKO := close
COLOR := color.lime
SELL := 0
BUY := BUY+1
if(close < RENKO[1]-ATR[1])
DN := true
RENKO := close
COLOR := color.red
BUY := 0
SELL := SELL+1
if(BUY[1]==1 and BUY==2)
strategy.entry("long", strategy.long)//, limit = RENKODN)
if(DN)
strategy.cancel_all()
strategy.close_all(comment = "close")
plot(RENKO, style=plot.style_line, linewidth=2, color=COLOR)