该策略是基于双EMA指标的金叉死叉交易策略。策略通过计算快线EMA和慢线EMA,在快线上穿慢线时做多,在快线下穿慢线时平仓。该策略简单易行,适合中短期交易。
该策略主要基于双EMA指标实现。首先计算快线EMA和慢线EMA。快线EMA周期短,能 sensitively 反映价格变化;慢线EMA周期长,反映长期趋势。 当快线从下方上穿慢线时产生金叉信号,表示短期价格上涨势头强劲,可以买入做多;当快线从上方下穿慢线时产生死叉信号,表示短期价格下跌势头强劲,应该平仓。
具体来说,该策略主要包含以下步骤:
输入快线EMA和慢线EMA的参数,包括SMA周期长度,数据源等
计算快线EMA和慢线EMA
定义金叉时机:快线从下方上穿慢线
定义死叉时机:快线从上方下穿慢线
在金叉时买入做多
在死叉时平仓
可选择是否允许做空,以及是否使用止损止盈策略
输出买入卖出的消息通知
通过这种简单的双EMA交叉策略,可以顺势捕捉价格短期趋势,实现收益。
该策略具有以下优势:
策略思路简单清晰,容易理解掌握。
仅需要双EMA指标,实现方便。
可以顺势捕捉价格短期趋势,套利获得波动收益。
可自定义EMA周期,灵活适应不同周期的市场环境。
可选择是否允许做空,灵活控制策略风险。
可选择是否使用止损止盈策略,控制交易风险。
可输出买卖消息通知,方便监控。
策略容易优化,可灵活设置EMA参数,优化获利空间。
该策略也存在一些风险:
双EMA策略容易产生虚假信号,可能导致不必要的亏损。
止损点设置不合理可能扩大亏损。
交易频率可能过高,增加交易成本和滑点风险。
固定EMA参数无法适应市场变化。
容易追高杀跌,失去平静判断。
无法判断趋势反转,可能反向开仓。
对应风险管理措施:
优化EMA参数,降低虚假信号概率。
合理设置止损点,控制单笔亏损。
优化EMA周期,降低交易频率。
不同市场阶段可以动态调整EMA参数。
增加趋势判断指标,避免追涨杀跌。
结合趋势判断指标,确定大趋势方向。
该策略可以从以下方面进行优化:
动态优化EMA参数,不同市场阶段采用不同EMA周期组合,优化参数套利效果。
增加股票筛选条件,满足一定条件的股票再进行策略交易,提高成功率。
结合波动率指标,在低波动阶段降低仓位规避风险。
结合成交量指标,在高量能确认趋势才产生信号。
设置价格条件,例如突破20日线再进行EMA策略交易。
优化止损策略,并设置止盈条件锁定利润。
增加对大级别趋势判断,避免逆势开仓。
结合深度学习算法以及各种机器学习算法持续优化策略。
综上所述,该双EMA金叉死叉策略整体思路简单清晰,易于理解和实现,可以顺势捕捉价格波动获利,但也存在一定盈利风险。我们可以通过参数优化、止损止盈、股票过滤、大级别趋势判断等手段来控制风险,平稳获得满意回报。该策略可以不断优化升级,值得持续研究与改进。
/*backtest start: 2023-09-15 00:00:00 end: 2023-10-15 00:00:00 period: 4h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("EMA Strategy", shorttitle="EMA Strategy", overlay=true, pyramiding=0, default_qty_type=strategy.percent_of_equity, default_qty_value=100) // === Inputs === // short ma maFastSource = input(defval=close, title="Fast MA Source") maFastLength = input(defval=3, title="Fast MA Period", minval=1) // long ma maSlowSource = input(defval=close, title="Slow MA Source") maSlowLength = input(defval=9, title="Slow MA Period", minval=1) // invert trade direction shorting = input(defval=false, title="Allow Shorting?") // risk management useStop = input(defval=false, title="Use Initial Stop Loss?") slPoints = input(defval=25, title="Initial Stop Loss Points", minval=1) useTS = input(defval=false, title="Use Trailing Stop?") tslPoints = input(defval=120, title="Trail Points", minval=1) useTSO = input(defval=false, title="Use Offset For Trailing Stop?") tslOffset = input(defval=20, title="Trail Offset Points", minval=1) // Messages for buy and sell message_buy = input("Buy message", title="Buy Alert Message") message_sell = input("Sell message", title="Sell Alert Message") // Calculate start/end date and time condition startDate = input(timestamp("2021-01-01T00:00:00"), type = input.time) finishDate = input(timestamp("2021-12-31T00:00:00"), type = input.time) time_cond = true // === Vars and Series === fastMA = ema(maFastSource, maFastLength) slowMA = ema(maSlowSource, maSlowLength) plot(fastMA, color=color.blue) plot(slowMA, color=color.purple) goLong() => crossover(fastMA, slowMA) killLong() => crossunder(fastMA, slowMA) strategy.entry("Buy", strategy.long, when=goLong() and time_cond, alert_message = message_buy) strategy.close("Buy", when=killLong() and time_cond, alert_message = message_sell) // Shorting if using if shorting strategy.entry("Sell", strategy.short, when=killLong() and time_cond, alert_message = message_sell) strategy.close("Sell", when=goLong() and time_cond, alert_message = message_buy) if useStop strategy.exit("XLS", from_entry="Buy", stop=strategy.position_avg_price / 1.08) strategy.exit("XSS", from_entry="Sell", stop=strategy.position_avg_price * 1.08)