本策略结合了肯特纳通道、CCI指标以及RSI指标和交易量的条件,实现了一个较为完整的趋势过滤量化交易策略。该策略可以在突破关键价格区域、指标发出交易信号以及大额交易量出现时,产生买入和卖出信号。同时,策略加入了均线进行趋势判断,避免在没有明确趋势的情况下交易。
该策略主要基于以下几个指标和条件进行交易决策:
肯特纳通道:根据一定周期内的典型价格和ATR计算上下轨,判断价格是否处于通道区域内。
CCI指标:用于判断价格是否超买超卖。
RSI指标:辅助判断价格是否超买超卖。
交易量:要求交易量突破一定均值才产生交易。
均线趋势过滤:结合SMA、EMA等均线指标,判断价格整体趋势方向。
在符合趋势方向的条件下,如果价格突破肯特纳通道上下轨,且CCI和RSI指标发出信号,同时交易量大幅增加,则产生买入和卖出信号。
该策略结合多种指标和条件,可以有效滤除一些不确定的交易信号,使得交易决策更加稳定可靠。主要优势有:
趋势过滤机制可以避免不明朗的震荡市场。
肯特纳通道判断价格突破关键区域。
CCI和RSI发出超买超卖信号时机较准确。
大额交易量的条件可避免一些假突破。
该策略主要存在以下几方面风险:
趋势判断机制不完善,可能错过较强趋势机会。可以测试不同均线参数。
指标参数设置不当,可能错过关键交易时机或产生错误信号。可以优化参数。
交易量放大效应不明显时,存在一定假突破风险。可以测试不同交易量放大倍数。
该策略可以从以下几个方面进行优化:
测试不同类型和长度的均线,找到更合适的趋势过滤参数。
优化肯特纳通道、CCI、RSI等指标的参数,使信号更准确。
测试不同的交易量放大倍数,找到更合适倍数。
可以考虑加入止损策略,以控制单笔交易的最大损失。
总的来说,这个策略结合了Keltner通道、CCI、RSI指标和交易量条件,创建了一个相对完整的趋势过滤量化交易策略。当价格突破关键区域,指标给出交易信号,并且出现大额交易量时,它可以产生买入和卖出信号。同时,使用移动平均线进行趋势判断以避免没有明确趋势的交易。该策略具有诸如避免不清晰的波动市场、识别关键突破点、获取相对准确的超买/超卖信号以及防止一些假突破等优点。风险存在于参数设置不当和体积放大无效等方面。进一步优化可以在趋势过滤方法、指标参数、成交量倍增器以及添加止损机制上进行。
/*backtest start: 2024-01-27 00:00:00 end: 2024-02-26 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("Custom Keltner CCI Strategy with Trend Filter", overlay=true ) // Input Parameters for allowing long and short trades allowLong = input(true, title="Allow Long Trades") allowShort = input(true, title="Allow Short Trades") // Trend Filter Inputs maType = input(title="MA Type", options=["OFF", "SMA", "EMA", "SMMA", "CMA", "TMA"], defval="OFF") trendFilterMethod = input(title="Trend Filter Method", options=["OFF", "Normal", "Reversed"], defval="OFF") maLength = input(14, title="MA Length") // Other Input Parameters lengthKC = input(30, title="Keltner Channels Length") multKC = input(0.7, title="Keltner Channels Multiplier") lengthCCI = input(5, title="CCI Length") overboughtCCI = input(75, title="CCI Overbought Level") oversoldCCI = input(-75, title="CCI Oversold Level") rsiPeriod = input(30, title="RSI Period") rsiOverbought = input(60, title="RSI Overbought Level") rsiOversold = input(60, title="RSI Oversold Level") volumeMultiplier = input(0, title="Volume Multiplier", type=input.float, step=0.1, minval=0) // Define Moving Averages var float maValue = na if (maType == "SMA") maValue := sma(close, maLength) else if (maType == "EMA") maValue := ema(close, maLength) else if (maType == "SMMA") maValue := na(maValue[1]) ? sma(close, maLength) : (maValue[1] * (maLength - 1) + close) / maLength else if (maType == "CMA") maValue := na(maValue[1]) ? sma(close, maLength) : (sma(close, maLength) + (sma(close, maLength) - maValue[1])) / 2 else if (maType == "TMA") maValue := sma(sma(close, round(maLength/2)), round(maLength/2)+1) // Entry Conditions with Trend Filter longCondition = allowLong and (trendFilterMethod == "OFF" or (trendFilterMethod == "Normal" and close > maValue) or (trendFilterMethod == "Reversed" and close < maValue)) shortCondition = allowShort and (trendFilterMethod == "OFF" or (trendFilterMethod == "Normal" and close < maValue) or (trendFilterMethod == "Reversed" and close > maValue)) // Keltner Channels typicalPrice = hlc3 middleLine = sma(typicalPrice, lengthKC) range = multKC * atr(lengthKC) upperChannel = middleLine + range lowerChannel = middleLine - range // CCI cci = cci(close, lengthCCI) // RSI rsi = rsi(close, rsiPeriod) // Volume volCondition = volume > sma(volume, 50) * volumeMultiplier // Combined Entry Conditions with Trend Filter longCondition := longCondition and cci < oversoldCCI and low < lowerChannel and rsi < rsiOversold and volCondition shortCondition := shortCondition and cci > overboughtCCI and high > upperChannel and rsi > rsiOverbought and volCondition // Execute orders at the open of the new bar after conditions are met if (longCondition) strategy.entry("Long", strategy.long) if (shortCondition) strategy.entry("Short", strategy.short) // Exit Conditions strategy.close("Long", when = cci > 0) strategy.close("Short", when = cci < 0) // Plotting plot(upperChannel, color=color.red, linewidth=1) plot(lowerChannel, color=color.green, linewidth=1) hline(overboughtCCI, "Overbought", color=color.red) hline(oversoldCCI, "Oversold", color=color.green)