基于AO震荡指标的EMA交叉日内交易策略


创建日期: 2023-12-25 10:53:48 最后修改: 2023-12-25 10:53:48
复制: 3 点击次数: 653
avatar of ChaoZhang ChaoZhang
1
关注
1621
关注者

基于AO震荡指标的EMA交叉日内交易策略

概述

该策略是一个利用AO震荡指标以及EMA移动平均线的交叉进行日内交易的策略。其主要思想是在AO指标交叉零轴的同时,快速EMA线穿过中期EMA线来产生交易信号。

策略原理

该策略主要利用两个指标进行入场和出场:

  1. AO震荡指标:该指标是5日高低价平均线和34日高低价平均线的差值,用于判断目前的市场趋势。当AO为正时代表着目前处于上涨趋势,当为负时代表着目前处于下跌趋势。

  2. EMA移动平均线:策略中使用3日和20日两个EMA进行计算,3日EMA代表短期趋势,20日EMA代表中期趋势。当短期EMA从下方突破中期EMA时产生买入信号,相反从上方下破时产生卖出信号。

该策略的入场条件是,AO指标交叉零轴时,同时EMA出现金叉或死叉时才会产生交易信号。这样可以避免AO指标震荡时产生错误信号。而出场条件则是伦敦交易时间结束后全部平仓。

优势分析

该策略主要有以下几点优势:

  1. 利用AO指标确保大趋势判断准确,避免EMA假突破带来亏损;
  2. 双重指标结合,可以过滤掉一些噪音,使信号更加清晰;
  3. 仅在主要交易时间段进行交易,避免隔夜风险;
  4. 策略逻辑简单清晰,容易理解实现;
  5. 无需优化和曲线拟合,参数稳定;

风险分析

该策略也存在一些风险:

  1. 日内交易亏损扩大的风险。当发生重大黑天鹅事件时,短期内无法止损可能造成较大亏损;
  2. EMA指标假突破带来的风险。当市场处于震荡阶段时,EMA可能出现多次交叉造成错误信号;
  3. 参数固定可能缺乏适应性。在不同市场周期参数需要调整;

为了规避这些风险,我们可以设置止损机制,或者根据不同周期调整参数,使策略更具弹性。

优化方向

对于该策略,主要的优化方向在于参数的调整:

  1. EMA周期的调整。可以测试更短周期的EMA组合,或者加入更多EMA来构建交易信号;

  2. AO参数的调整。测试不同长短周期参数对AO指标造成的影响;

  3. 添加其他辅助指标。比如加入RSIbord指标来避免超买超卖的风险;

  4. 交易时间的调整。测试不同地区或者更长交易时间的效果。

通过参数调整和加入新的指标,该策略可以变得更加稳健和高效。

总结

总的来说,该交易策略结合趋势判断指标AO和短中期EMA交叉,构建了一个简单实用的日内交易策略。它有着策略信号清晰,容易实现等优点。同时也存在一些参数固定的缺陷。通过不断测试和优化,该策略可以进一步改进,变得更加稳定和适应市场的需要。它为日内交易者提供了一个非常好的选择。

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

//@version=4
//@author SoftKill21

strategy(title="MA cross + AO", shorttitle="MA_AO")
ao = sma(hl2,5) - sma(hl2,34)

len = input(3, minval=1, title="Length")
src = input(close, title="Source")
out = ema(src, len)

len1 = input(20, minval=1, title="Length")
src1 = input(close, title="Source")
out1 = sma(src1, len1)

timeinrange(res, sess) => time(res, sess) != 0
londopen = timeinrange(timeframe.period, "0300-1100") 
nyopen = timeinrange(timeframe.period, "0800-1600") 

longC = crossover(out,out1) and ao>0 and londopen
shortC = crossunder(out,out1) and ao<0 and londopen

invert = input(title="Reverse position ?", type=input.bool, defval=false)

if(invert==false)
    strategy.entry("LONG",1,when=longC)
    strategy.entry("SHORT",0,when=shortC)



if(invert==true)
    strategy.entry("short",0,when=longC)
    strategy.entry("long",1,when=shortC)
    
strategy.close_all(when= not (londopen))