双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)