一文中局部震荡趋势识别策略


创建日期: 2024-03-19 15:10:59 最后修改: 2024-03-19 15:10:59
复制: 0 点击次数: 411
avatar of ChaoZhang ChaoZhang
1
关注
1251
关注者

一文中局部震荡趋势识别策略

概述

该策略是基于一文云指标(Ichimoku Cloud)结合黄金分割率(Fibonacci Ratio)设计的一种趋势识别和交易策略。策略使用一文云指标中的转换线(Conversion Line)、基线(Base Line)、云(Kumo Cloud)以及延迟线(Lagging Span)来判断当前市场趋势,并结合1.618和0.618两个黄金分割率来设置止损位和识别震荡市场。此外,策略还引入了两条额外的中线来过滤假信号。

策略原理

一文云指标由转换线、基线、云以及延迟线四个部分组成。其中,转换线和基线分别由不同周期的最高价和最低价的平均值计算得出,云由基线向前推移26个周期形成,延迟线则是收盘价向后推移26个周期。

该策略的多头开仓条件如下:

  1. 延迟线在云上方
  2. 转换线高于基线
  3. 收盘价高于1.618止损位
  4. 0.618线高于1.618止损位
  5. 收盘价在云上方

空头开仓条件则与多头相反。

止损位置的设置使用了1.618和0.618两个黄金分割率。多头止损位为云的上沿减去上下沿距离的1.618倍,空头止损位则相反。0.618线用于识别震荡市场,当云为绿色且0.618线低于1.618止损位时,认为市场处于震荡状态。

除了一文云指标外,该策略还引入了两条中线来过滤假信号。中线由不同周期的最高最低价平均值计算得出。

优势分析

  1. 同时使用价格和趋势指标,可以较好地识别当前市场趋势。
  2. 引入黄金分割率动态设置止损位,风险可控。
  3. 0.618线可以有效识别震荡市场,避免在震荡行情下频繁开仓。
  4. 两条额外的中线可以进一步过滤假信号,提高信号质量。
  5. 参数可调,适用于不同的市场和周期。

风险分析

  1. 在极端行情下,如暴涨暴跌行情,趋势指标可能失效,导致信号失真。
  2. 止损位基于云的距离计算,在云很薄的情况下可能导致止损过于靠近开仓价。
  3. 黄金分割率止损和0.618线判断震荡市场的方法缺乏理论支撑,可能并不适用于所有市场。
  4. 参数优化可能导致过拟合,在实际市场中表现不佳。

优化方向

  1. 可以考虑引入更多趋势确认指标,如均线系统、MACD等,进一步提高信号质量。
  2. 止损位的设置可以考虑更多因素,如ATR、波动率等,使其更加动态化和个性化。
  3. 对于震荡市场的判断,可以尝试其他方法,如趋势强度指标ADX等。
  4. 参数的优化可以使用遗传算法等机器学习方法,并进行样本外测试来避免过拟合。
  5. 可以加入仓位管理和风险控制模块,如Kelly准则、固定风险等,以提高策略的稳健性和可靠性。

总结

该策略创新性地将一文云指标和黄金分割率结合,形成了一套完整的趋势识别和交易系统。同时引入额外的中线过滤,可以在一定程度上提高信号质量。策略的优势在于能够较好地适应趋势和震荡两种市场状态,并通过动态止损控制风险。但策略也存在一些不足之处,如缺乏理论支撑,参数优化可能过拟合等。未来可以从引入更多指标、优化止损和仓位管理、机器学习参数优化等方面对策略进行完善。总的来说,该策略思路新颖,具有一定的参考价值,但在实际应用中还需要进一步的测试和优化。

策略源码
/*backtest
start: 2023-03-13 00:00:00
end: 2024-03-18 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © manoharbauskar

//@version=5
// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © manoharbauskar

//@version=5
strategy("Advanced_Ichimoku_Cloud_Strategy", overlay=true, margin_long=100, margin_short=100)
conversionPeriods = input.int(9, minval=1, title="Conversion Line Length")
basePeriods = input.int(26, minval=1, title="Base Line Length")
laggingSpanPeriods = input.int(52, minval=1, title="Leading Span B Length")
pivotPeriods1 = input.int(17,minval = 1,title = "PPL1")
pivotPeriods2 = input.int(39,minval = 1,title = "PPL2")
displacement = input.int(26, minval=1, title="Lagging Span")
donchian(len) => math.avg(ta.lowest(len), ta.highest(len))
conversionLine = donchian(conversionPeriods)
baseLine = donchian(basePeriods)
midLine1 = donchian(pivotPeriods1)
midLine2 = donchian(pivotPeriods2)
midLine3 = donchian(laggingSpanPeriods)
leadLine1 = math.avg(conversionLine, baseLine, midLine1)
leadLine2 = math.avg(midLine2 , midLine3)


plot(conversionLine, color=#2962FF, title="Conversion Line")
plot(baseLine, color=#B71C1C, title="Base Line")

plot(close, offset = -displacement + 1, color=color.yellow, title="Lagging Span")
p1 = plot(leadLine1, offset = displacement - 1, color=#A5D6A7,
	 title="Leading Span A")
p2 = plot(leadLine2, offset = displacement - 1, color=#EF9A9A,
	 title="Leading Span B")
   
plot(leadLine1 > leadLine2 ? leadLine1 : leadLine2, offset = displacement - 1, title = "Kumo Cloud Upper Line", display = display.none) 
plot(leadLine1 < leadLine2 ? leadLine1 : leadLine2, offset = displacement - 1, title = "Kumo Cloud Lower Line", display = display.none) 
fill(p1, p2, color = leadLine1 > leadLine2 ? color.rgb(67, 160, 71, 90) : color.rgb(244, 67, 54, 90))

//stoploss calculating
mult1 = input.float(1.618, "Mult1")
mult2 = input.float(0.618, "Mult2")
stoploss1 = leadLine1 - (leadLine1 - leadLine2)*mult1
stoploss2 = leadLine1 - (leadLine1 - leadLine2)*mult2
plot(stoploss1,"Sl", color = color.fuchsia, linewidth = 2, style = plot.style_line, offset = displacement - 1)
plot(stoploss2,"S2", color = color.lime, linewidth = 2, style = plot.style_line, offset = displacement - 1)

longCondition = leadLine1 > leadLine2 
if (longCondition)
    strategy.entry("Buy", strategy.long)

shortCondition = leadLine1 < leadLine2
if (shortCondition)
    strategy.entry("Sell", strategy.short)