策略
双EMA金叉死叉策略Dual-EMA-Crossover-Strategy
ChaoZhang · PineScript · 趋势跟踪 · 2023-10-16 16:15:38
概述
该策略是基于双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金叉死叉策略整体思路简单清晰,易于理解和实现,可以顺势捕捉价格波动获利,但也存在一定盈利风险。我们可以通过参数优化、止损止盈、股票过滤、大级别趋势判断等手段来控制风险,平稳获得满意回报。该策略可以不断优化升级,值得持续研究与改进。
参数
| 参数 | 默认值 | 说明 |
|---|---|---|
| v_input_1_close | 0 | Fast MA Source: close |
| v_input_2 | 3 | Fast MA Period |
| v_input_3_close | 0 | Slow MA Source: close |
| v_input_4 | 9 | Slow MA Period |
| v_input_5 | false | Allow Shorting? |
| v_input_6 | false | Use Initial Stop Loss? |
| v_input_7 | 25 | Initial Stop Loss Points |
| v_input_8 | false | Use Trailing Stop? |
| v_input_9 | 120 | Trail Points |
| v_input_10 | false | Use Offset For Trailing Stop? |
| v_input_11 | 20 | Trail Offset Points |
| v_input_12 | Buy message | Buy Alert Message |
| v_input_13 | Sell message | Sell Alert Message |
| v_input_14 | timestamp(2021-01-01T00:00:00) | startDate |
| v_input_15 | timestamp(2021-12-31T00:00:00) | finishDate |
源码(64 行)
/*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)