基于枢轴点和斐波那契回撤的自动趋势追踪策略


创建日期: 2024-01-05 11:34:17 最后修改: 2024-01-05 11:34:17
复制: 0 点击次数: 390
1
关注
1188
关注者

基于枢轴点和斐波那契回撤的自动趋势追踪策略

概述

该策略基于枢轴点和斐波那契回撤比率自动识别股价的ABC波段,并给出长短仓信号。策略利用枢轴点判断股价波段,然后计算ABC波段之间的斐波那契回撤比例,如果符合一定条件就产生交易信号。

策略原理

  1. 计算股票的枢轴高点和低点
  2. 判断价格是否从上一波段高点下落或从上一波段低点上涨
  3. 计算当前波段与上一波段之间的斐波那契回撤比例
  4. 如果上涨波段和下跌波段的回撤比例都在适当范围内,则判定可能形成ABC波段
  5. 在ABC波段确认后,做多时设置止损为C点位,止盈为1.5倍波动;做空时设置止损为A点位,止盈为1.5倍波动

优势分析

  1. 利用枢轴点判断关键支撑阻力区域,提高信号准确率
  2. 应用斐波那契回撤识别ABC形态,自动捕捉趋势转换点
  3. 止盈止损清晰合理,避免出现巨大亏损

风险分析

  1. 枢轴点和斐波那契回撤并不能保证每次都精确判断趋势转换点,可能出现误判
  2. C点和A点止损可能被突破,造成损失扩大
  3. 需要参数优化,比如斐波那契回撤比率的范围

优化方向

  1. 可以结合更多技术指标辅助判断ABC形态,提高信号准确率
  2. 可以优化斐波那契回撤比率的范围,以适应更多市场情况
  3. 可以结合机器学习方法训练判断ABC形态的模型

总结

该策略基于枢轴点判断关键支撑阻力区域,并利用斐波那契回撤比例自动识别ABC形态,在波段转折点给出长短仓交易信号。策略逻辑清晰简洁,止盈止损设置合理,能够有效控制风险。但是也存在一定误判风险,需要进一步优化和改进以适应更多市场情况。

策略源码
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-19 23:59:59
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © kerok3g

//@version=5
strategy("ABCD Strategy", shorttitle="ABCDS", overlay=true, commission_value=0.04)
calcdev(fprice, lprice, fbars, lbars) =>
    rise = lprice - fprice
    run = lbars - fbars
    avg = rise/run
    ((bar_index - lbars) * avg) + lprice

len = input(5)

ph = ta.pivothigh(len, len)
pl = ta.pivotlow(len, len)

var bool ishigh = false
ishigh := ishigh[1]

var float currph = 0.0
var int currphb = 0
currph := nz(currph)
currphb := nz(currphb)

var float oldph = 0.0
var int oldphb = 0
oldph := nz(oldph)
oldphb := nz(oldphb)

var float currpl = 0.0
var int currplb = 0
currpl := nz(currpl)
currplb := nz(currplb)

var float oldpl = 0.0
var int oldplb = 0
oldpl := nz(oldpl)
oldplb := nz(oldplb)

if (not na(ph))
    ishigh := true
    oldph := currph
    oldphb := currphb
    currph := ph
    currphb := bar_index[len]
else
    if (not na(pl))
        ishigh := false
        oldpl := currpl
        oldplb := currplb
        currpl := pl
        currplb := bar_index[len]

endHighPoint = calcdev(oldph, currph, oldphb, currphb)
endLowPoint = calcdev(oldpl, currpl, oldplb, currplb)

plotshape(ph, style=shape.triangledown, color=color.red, location=location.abovebar, offset=-len)
plotshape(pl, style=shape.triangleup, color=color.green, location=location.belowbar, offset=-len)

// var line lnhigher = na
// var line lnlower = na
// lnhigher := line.new(oldphb, oldph, bar_index, endHighPoint)
// lnlower := line.new(oldplb, oldpl, bar_index, endLowPoint)
// line.delete(lnhigher[1])
// line.delete(lnlower[1])

formlong = oldphb < oldplb and oldpl < currphb and currphb < currplb
longratio1 = (currph - oldpl) / (oldph - oldpl)
longratio2 = (currph - currpl) / (currph - oldpl)

formshort = oldplb < oldphb and oldphb < currplb and currplb < currphb
shortratio1 = (oldph - currpl) / (oldph - oldpl)
shortratio2 = (currph - currpl) / (oldph - currpl)

// prevent multiple entry for one pattern
var int signalid = 0
signalid := nz(signalid[1])

longCond = formlong and 
           longratio1 < 0.7 and 
           longratio1 > 0.5 and 
           longratio2 > 1.1 and 
           longratio2 < 1.35 and 
           close < oldph and 
           close > currpl and 
           signalid != oldplb
if (longCond)
    signalid := oldplb
    longsl = currpl - ta.tr
    longtp = ((close - longsl) * 1.5) + close
    strategy.entry("Long", strategy.long)
    strategy.exit("Exit Long", "Long", limit=math.min(longtp, oldph), stop=longsl)

shortCond = formshort and 
             shortratio1 < 0.7 and 
             shortratio1 > 0.5 and 
             shortratio2 > 1.1 and 
             shortratio2 < 1.35 and 
             close > oldpl and 
             close < currph and 
             signalid != oldphb

if (shortCond)
    signalid := oldphb
    shortsl = currph + ta.tr
    shorttp = close - ((shortsl - close) * 1.5)
    strategy.entry("Short", strategy.short)
    strategy.exit("Exit Short", "Short", limit=math.max(shorttp, oldpl), stop=shortsl)
更多内容