基于EMA的日内 skillet 商交策略

Author: ChaoZhang, Date: 2024-01-24 15:43:31
Tags:

基于EMA的日内 skillet 商交策略

概要

本策略通过计算9日和15日的指数移动平均线,识别EMA金叉和死叉形成的买入和卖出信号,用于日内短线交易。当9EMA上穿15EMA,并且最近一根K线为阳线时产生买入信号;当9EMA下穿15EMA,并且最近一根K线为阴线时产生卖出信号。该策略同时结合ATR指标绘制止损线。

策略原理

  1. 计算9日EMA和15日EMA
  2. 识别最近一根K线的涨跌性质,判断为阳线或阴线
  3. 当9EMA上穿15EMA,并且最近一根K线为阳线时,产生买入信号
  4. 当9EMA下穿15EMA,并且最近一根K线为阴线时,产生卖出信号
  5. 通过ATR指标计算ATR值,在持仓时绘制止损线

优势分析

该策略具有以下优势:

  1. 使用了双EMA指标组合,能够捕捉中短期趋势
  2. 结合K线实体方向过滤假信号
  3. 采用ATR动态止损,可以在保证盈利的前提下控制风险
  4. 时间周期短,适合利用短线价格波动进行日内skillet交易
  5. 操作简单,容易实施

风险分析

该策略也存在一定的风险:

  1. EMA指标具有滞后性,可能错过部分价格波动
  2. 双EMA均值回归可能产生 whipsaws 信号
  3. 日内短线交易容易受到价格震荡的影响
  4. 止损距离过小容易被突破,过大则影响盈利空间

对策:

  1. 适当调整EMA参数,缩短均线周期
  2. 结合其他指标如MACD等过滤信号
  3. 动态调整止损距离,优化止损策略

优化方向

该策略可以从以下几个方面进行优化:

  1. 测试不同的EMA参数组合,寻找最佳均线周期
  2. 增加其他指标判断,构建多因子模型
  3. 采用时间段滤波,只在特定时间段发出信号
  4. 结合波动率指标,调整止损距离
  5. 利用机器学习技术动态优化参数

总结

本策略整合了双EMA指标判断趋势方向和K线实体过滤信号,采用ATR动态止损,是一个简单实用的日内skillet交易策略。通过参数优化和多因子组合,可以进一步提高策略的稳定性和盈利能力。


/*backtest
start: 2023-01-17 00:00:00
end: 2024-01-23 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("EMA Scalping Strategy", shorttitle="EMAScalp", overlay=true)

// Input parameters
ema9_length = input(9, title="9 EMA Length")
ema15_length = input(15, title="15 EMA Length")

// Calculate EMAs
ema9 = ta.ema(close, ema9_length)
ema15 = ta.ema(close, ema15_length)

// Plot EMAs on the chart
plot(ema9, color=color.blue, title="9 EMA")
plot(ema15, color=color.red, title="15 EMA")

// Identify Bullish and Bearish candles
bullish_candle = close > open
bearish_candle = close < open

// Bullish conditions for Buy Signal
buy_condition = ta.crossover(close, ema9) and ema15 < ema9 and bullish_candle

// Bearish conditions for Sell Signal
sell_condition = ta.crossunder(close, ema9) and ema15 > ema9 and bearish_candle

// Plot Buy and Sell signals
plotshape(series=buy_condition, title="Buy Signal", color=color.green, style=shape.triangleup, location=location.belowbar)
plotshape(series=sell_condition, title="Sell Signal", color=color.red, style=shape.triangledown, location=location.abovebar)

// Optional: Add stop-loss levels
atr_length = input(14, title="ATR Length for Stop Loss")
atr_multiplier = input(1.5, title="ATR Multiplier for Stop Loss")

atr_value = ta.atr(atr_length)
stop_loss_level = strategy.position_size > 0 ? close - atr_multiplier * atr_value : close + atr_multiplier * atr_value
plot(stop_loss_level, color=color.gray, title="Stop Loss Level", linewidth=2)

// Strategy rules
if (buy_condition)
    strategy.entry("Buy", strategy.long)
    strategy.exit("Exit Buy", from_entry="Buy", loss=stop_loss_level)

if (sell_condition)
    strategy.entry("Sell", strategy.short)
    strategy.exit("Exit Sell", from_entry="Sell", loss=stop_loss_level)


更多内容