双EMA黄金交叉策略是一种典型的趋势跟踪策略。该策略运用两条不同周期的EMA均线,根据它们的交叉形态来产生买入和卖出信号。当短周期EMA上穿长周期EMA时,产生买入信号;当短周期EMA下穿长周期EMA时,产生卖出信号。这种策略可以跟踪中长线趋势,在趋势开始阶段能够及时捕捉交易机会。
该策略主要由以下几部分组成:
设置快线EMA和慢线EMA的长度。在这里快线EMA长度为12,慢线EMA长度为26。
计算快线EMA和慢线EMA。快线EMA反应更快,慢线EMA反应更稳定。
判断EMA的交叉情况,产生交易信号。当快线EMA上穿慢线EMA时,产生买入信号;当快线EMA下穿慢线EMA时,产生卖出信号。
根据信号入场。做多时,若有反向做空头寸,先平掉做空头寸,再开多头寸。做空同理。
设置止损点。做多时,若价格跌破之前低点一定比例则止损。做空同理。
根据信号出场。快线EMA下穿慢线EMA时平掉多单。快线EMA上穿慢线EMA时平掉空单。
该策略简单明了,通过EMA两线的交叉来判断趋势方向和强度,可以有效跟踪趋势。快线EMA对短期价格变化敏感,慢线EMA对长期趋势响应更稳定。两线交叉是比较经典的判定趋势变化的方法。
该策略具有以下优势:
概念简单,易于理解和实现。EMA和交叉是公认有效的技术指标和信号。
可以有效跟踪中长线趋势,及时捕捉趋势机会。
采用双EMA设定,可以避免被短期市场噪声干扰。
有明确的入场规则,出场规则和止损规则,不会出现死拿重仓的情况。
仅需要少量参数,不容易过度优化。参数调整简单,适合新手学习。
回测结果良好,具有实战价值。可以独立使用,也可以和其他策略组合使用。
该策略也存在一些风险:
双EMA交叉容易产生错误信号和频繁交叉。应适当调整参数,过滤无效信号。
无法很好应对震荡区间和趋势反转。需要辅助其他指标进行确认。
双EMA策略容易追高杀跌,应适当控制仓位规模,或设置止盈止损。
回测曲线可能存在一定程度的过拟合。应进行参数敏感性测试,评估稳定性。
没有及时止损可能导致较大亏损。应设置合理的止损位置。
交易费用可能影响实际盈利。应考虑不同品种的手续费因素。
该策略可以从以下几个方面进行优化:
优化EMA周期参数,找到最优参数组合。可以引入步进优化和机器学习方法。
增加趋势过滤器,如ADX,CCI等指标,避免不确定趋势下的错误交易。
增加量能指标,如交易量,能量潮等,确保存在真实交易推动。
设置动态止损机制,能根据市场波动自动调整止损位置。
结合相关品种进行组合,利用品种相关性进行风险调整。
增加机器学习算法,利用AI进行参数优化、特征工程、信号过滤等。
考虑交易成本因素,调整止损点和仓位规模,减少交易频率。
针对不同品种特点设计参数,使策略更具适应性。
设计复合策略框架,与其他策略组合,提高稳定性。
通过这些优化,可以使策略更完善、稳定,在实际交易中获得更持续、稳定的盈利。
本策略采用双EMA交叉产生交易信号,可以有效跟踪中长线趋势。策略优势在于简单易用,回测效果良好,适合新手学习使用。但也存在一定风险,需要注意防范。通过参数优化、增加辅助技术指标、设置动态止损、考虑交易成本等措施,可以使策略更完善。该策略可以独立使用,也可以和其它策略组合,具有很好的实用性。
/*backtest start: 2022-10-23 00:00:00 end: 2023-10-29 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 strategy(title = "EMA Cross Strategy", shorttitle = "EMA Cross",calc_on_order_fills=true,calc_on_every_tick =true, initial_capital=21000,commission_value=.25,overlay = true,default_qty_type = strategy.percent_of_equity, default_qty_value = 100) StartYear = input(2018, "Backtest Start Year") StartMonth = input(1, "Backtest Start Month") StartDay = input(1, "Backtest Start Day") UseStopLoss = input(true,"UseStopLoss") window() => time >= timestamp(StartYear, StartMonth, StartDay,00,00) ? true : false stopLoss = input(20, title = "Stop loss percentage(0.1%)") maFastSource = input(defval = open, title = "Fast MA Source") maFastLength = input(defval = 12, title = "Fast MA Period", minval = 1) // long ma maSlowSource = input(defval = open, title = "Slow MA Source") maSlowLength = input(defval = 26, title = "Slow MA Period", minval = 1) maFast = ema(maFastSource, maFastLength) maSlow = ema(maSlowSource, maSlowLength) fast = plot(maFast, title = "Fast MA", color = #7a8598, linewidth = 2, style = line, transp = 50) slow = plot(maSlow, title = "Slow MA", color = #e08937, linewidth = 2, style = line, transp = 50) longEMA = crossover(maFast, maSlow) exitLong = crossunder(maFast, maSlow) shortEMA = crossover(maSlow, maFast) exitShort = crossover(maFast, maSlow) if (longEMA) strategy.entry("LongId", strategy.long, when=window()) if (shortEMA) strategy.entry("ShortId", strategy.short, when=window()) if (UseStopLoss) strategy.exit("StopLoss", "LongId", loss = close * stopLoss / 1000 / syminfo.mintick) strategy.exit("StopLoss", "ShortId", loss = close * stopLoss / 1000 / syminfo.mintick)