该策略基于EMA(指数移动平均线)和MAMA(MESA自适应移动平均线)两个指标,根据它们的交叉情况来判断行情趋势和产生交易信号。EMA常用于判断市场趋势方向,而MAMA可以更准确地捕捉市场转折点,两者配合使用可以提高策略的性能。
具体来说,策略首先计算快速EMA(fl)和慢速EMA(sl),分别反映短期和长期趋势。
然后根据John Ehlers的公式计算MAMA和FAMA: 1. 计算价格的 Hilbert Transform 并提取信号的相位信息 2. 根据相位信息计算信号的瞬时周期p 3. 根据p值计算α权重 4. 根据α权重计算MAMA和FAMA
最后,策略根据EMA和MAMA/FAMA的交叉情况来产生交易信号: - EMA金叉时做多 - EMA死叉时做空 - MAMA上穿FAMA时做多 - MAMA下穿FAMA时做空
该策略结合EMA和MAMA指标的优势,可以提高交易信号的准确性。
EMA的优势: - 能够有效平滑价格数据,减少噪音 - 能跟踪市场趋势且有一定的滞后性 - 参数灵活,可调整对短期和长期趋势的敏感度
MAMA的优势: - 自适应参数,不需要人为指定周期 - 响应迅速,可提前捕捉趋势转折 - 准确识别支撑和阻力区域
两者配合使用的优势: - EMA判断主要趋势方向 - MAMA验证信号并提前捕捉转折 - 提高信号的准确性和胜率
该策略主要存在以下风险:
对应措施:
该策略可从以下方面进行优化:
该策略整合EMA和MAMA两个指标的优势,能够顺势而为,及时捕捉趋势转折,是一种可靠的跟踪趋势类策略。通过参数优化和风险控制,可以提高策略的胜率和盈利能力。但用户仍需根据自身风险偏好谨慎操作。
/*backtest start: 2023-09-30 00:00:00 end: 2023-10-30 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 strategy("EMAMA strategy", overlay=true) //This entire strategy is courtesy of LazyBear for programming the original EMAMA system, I simply added a strategy element to everything to round things out. src=input(hl2, title="Source") fl=input(.5, title="Fast Limit") sl=input(.05, title="Slow Limit") sp = (4*src + 3*src[1] + 2*src[2] + src[3]) / 10.0 dt = (.0962*sp + .5769*nz(sp[2]) - .5769*nz(sp[4])- .0962*nz(sp[6]))*(.075*nz(p[1]) + .54) q1 = (.0962*dt + .5769*nz(dt[2]) - .5769*nz(dt[4])- .0962*nz(dt[6]))*(.075*nz(p[1]) + .54) i1 = nz(dt[3]) jI = (.0962*i1 + .5769*nz(i1[2]) - .5769*nz(i1[4])- .0962*nz(i1[6]))*(.075*nz(p[1]) + .54) jq = (.0962*q1 + .5769*nz(q1[2]) - .5769*nz(q1[4])- .0962*nz(q1[6]))*(.075*nz(p[1]) + .54) i2_ = i1 - jq q2_ = q1 + jI i2 = .2*i2_ + .8*nz(i2[1]) q2 = .2*q2_ + .8*nz(q2[1]) re_ = i2*nz(i2[1]) + q2*nz(q2[1]) im_ = i2*nz(q2[1]) - q2*nz(i2[1]) re = .2*re_ + .8*nz(re[1]) im = .2*im_ + .8*nz(im[1]) p1 = iff(im!=0 and re!=0, 360/atan(im/re), nz(p[1])) p2 = iff(p1 > 1.5*nz(p1[1]), 1.5*nz(p1[1]), iff(p1 < 0.67*nz(p1[1]), 0.67*nz(p1[1]), p1)) p3 = iff(p2<6, 6, iff (p2 > 50, 50, p2)) p = .2*p3 + .8*nz(p3[1]) spp = .33*p + .67*nz(spp[1]) phase = atan(q1 / i1) dphase_ = nz(phase[1]) - phase dphase = iff(dphase_< 1, 1, dphase_) alpha_ = fl / dphase alpha = iff(alpha_ < sl, sl, iff(alpha_ > fl, fl, alpha_)) mama = alpha*src + (1 - alpha)*nz(mama[1]) fama = .5*alpha*mama + (1 - .5*alpha)*nz(fama[1]) pa=input(false, title="Mark crossover points") plotarrow(pa?(cross(mama, fama)?mama<fama?-1:1:na):na, title="Crossover Markers") fr=input(false, title="Fill MAMA/FAMA Region") duml=plot(fr?(mama>fama?mama:fama):na, style=circles, color=gray, linewidth=0, title="DummyL") mamal=plot(mama, title="MAMA", color=red, linewidth=2) famal=plot(fama, title="FAMA", color=green, linewidth=2) fill(duml, mamal, red, transp=70, title="NegativeFill") fill(duml, famal, green, transp=70, title="PositiveFill") ebc=input(false, title="Enable Bar colors") bc=mama>fama?lime:red barcolor(ebc?bc:na) longCondition = crossover(mama, fama) if (longCondition) strategy.entry("My Long Entry Id", strategy.long) shortCondition = crossunder(mama, fama) if (shortCondition) strategy.entry("My Short Entry Id", strategy.short)