策略知识库.EN
策略

逐级铺垫的均线兼顾策略Level-by-Level-Build-Up-Moving-Average-Strategy

ChaoZhang · PineScript · 波动率与通道 · 2023-09-26 16:00:20

全部策略 →
仓位
—
风控
—
出场
—

概述

逐级铺垫的均线兼顾策略是一种基于RENKO图表的交易策略。该策略使用均线 indicaotr 对价格进行平滑处理,利用不同时间周期均线的交叉作为买卖信号。同时,该策略还会根据ATR指标来确定止损位,使止损更加合理。

策略原理

该策略主要通过以下几个部分实现:

  1. 使用input选择RENKO时间周期和ATR周期
  2. 计算RENKO价格和颜色,当价格突破前一个RENKO价格加上当前ATR时转为涨,价格低于前一个RENKO价格减去当前ATR时转为空
  3. 使用两个整数BUY和SELL记录当前多单和空单数量
  4. 当涨突破时,如果没有空单则开多,空单则平掉

当跌突破时,如果没有多单则开空,多单则平掉

  1. 使用plot绘制RENKO图

通过这样的逻辑,策略可以在价格突破前一级别时开仓做多做空,并且会在价格反转时平掉当前头寸。同时,使用ATR来确定突破幅度,可以基于当下的波动率来确定合理的止损位置。

优势

该策略具有以下几个优势:

  1. 使用RENKO消除噪音,识别趋势

RENKO图可以有效消除价格震荡的噪音,识别出较明显的趋势方向。这对发现趋势且跟随趋势是一个很好的组合。

  1. 均线交叉发出交易信号

不同时间周期均线交叉可以作为较为可靠的交易信号指标,避免被噪音欺骗。

  1. ATR动态止损

使用ATR动态设置止损位,可以根据当下波动率合理设置止损,避免止损过大或过小。

  1. 兼顾趋势和均线

结合趋势和均线指标,可以同时利用两者优势,在抓取趋势的同时也确保交易信号更加可靠。

风险

该策略也存在一些风险:

  1. 趋势判断错误

RENKO决定价格趋势的方式可能存在错误,从而导致不必要的买卖开平。需要优化参数以减少误判。

  1. 均线交叉假信号

均线交叉信号可能存在假信号,这会导致不必要的买卖动作。可以适当优化均线周期参数。

  1. ATR参数不当

ATR周期设置不当也会导致止损过大或过小。需要测试不同市场确定较优参数。

  1. 大幅震荡行情

在横盘和大幅震荡行情下,RENKO图会出现许多不必要的买卖开平操作,会造成资金占用。这需要 通过其它指标进行过滤,避免这种行情交易。

优化方向

该策略可以从以下几个方向进行优化:

  1. 优化RENKO和ATR参数

调整这两个参数可以尽量减少RENKO的误判,使RENKO更准确抓取趋势。

  1. 添加均线交叉过滤

添加更多均线,并要求大部分均线同向交叉才产生信号,可以过滤假信号。

  1. 增加其他指标过滤

比如增加量能指标,只在量能同向确认时才产生交易信号,可以避免被套。

  1. 优化止损策略

可以研究如何只在趋势反转时止损,而不是简单跟踪ATR,使止损更加合理。

  1. 优化资金管理

研究如何在该策略下最优化资金管理,以提高盈利率同时控制风险。

总结

该策略整体来说是一个值得优化和实盘验证的策略,核心思路是利用RENKO识别趋势,并用均线交叉作为过滤后的交易信号。结合ATR动态止损,可以成为一个具有优势的趋势跟踪策略。下一步需要针对已知风险继续进行优化测试,使策略参数更加完善,从而获得更好的实盘表现。

参数

参数默认值说明
v_input_1DTimeFrame
v_input_214ATR 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)