双指数移动平均线RSI交易策略

Author: ChaoZhang, Date: 2024-01-30 15:44:11
Tags:

双指数移动平均线RSI交易策略

概述

本策略名称为“双指数移动平均线RSI交易策略”。该策略利用双指数移动平均线(Double EMA)和相对强弱指数(RSI)作为主要交易指标,实现机械化交易。

策略原理

该策略首先计算价格的双指数移动平均线(MA),然后基于MA计算RSI,再计算RSI的指数移动平均线(Smooth)。当RSI上穿其移动平均线时生成买入信号;当RSI下穿其移动平均线时生成卖出信号。 optionally,该策略还设定了每日最大交易次数、交易资金份额、交易时间段、止损止盈点数以及追踪止损点数等参数进行风险控制。

策略优势

  1. 使用双指数移动平均线,能更快地响应价格变化,过滤掉部分噪音。
  2. 基于移动平均线计算RSI,使其更稳定,避免误交易。
  3. RSI的移动平均线有助于确认交易信号,过滤假突破。
  4. 设定最大交易次数,有助于控制每日风险。
  5. 设定交易资金份额,避免单笔损失过大。
  6. 设定交易时间段,避开关键时间节点,控制流动性风险。
  7. 设定止损止盈点数,有助于限制单笔损益。
  8. 追踪止损点数有助于锁定浮利,减少回撤。

策略风险

  1. 双指数移动平均线对市场突发事件反应较慢,可能错过短线交易机会。
  2. RSI容易形成死叉和黄金交叉误导信号。需结合其他指标谨慎交易。
  3. 固定交易资金比例无法对应市场波动幅度,存在资金利用率不足的风险。
  4. 固定止损止盈难以适应不同品种和市况,存在过早止损或止盈的风险。
  5. 追踪止损在震荡行情中可能过于频繁被触发。

对策: 1. 适当缩短移动平均线周期,提高敏感性。 2. 结合其它指标如成交量过滤信号。
3. 动态调整交易资金比例。
4. 根据市场波动性和变化调整止损止盈幅度。 5. 适当放宽追踪止损点数。

策略优化方向

  1. 测试不同长短周期的双指数移动平均线组合,找到最优参数。
  2. 测试RSI的计算周期参数,提高黄金/死叉信号的可靠性。
  3. 添加交易量、布林带等指标过滤信号噪音。
  4. 结合当日收盘价、波动率等动态调整交易资金比例和止损止盈幅度。
  5. 根据不同品种特性和市场环境优化追踪止损机制。

总结

本策略整体 mechanic 规则明确,可靠性较高,适用于中长线趋势品种。优化后可成为基础的趋势跟踪机械交易策略,风险可控,值得进一步评估实盘效果。


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy(title='[STRATEGY][RS]DemaRSI V0', shorttitle='D', overlay=false, initial_capital=100000, currency=currency.USD)
src = input(close)
ma_length = input(21)
rsi_length = input(4)
rsi_smooth = input(4)

ma = ema(ema(src, ma_length), ma_length)
marsi = rsi(ma, rsi_length)
smooth = ema(marsi, rsi_smooth)
plot(title='M', series=marsi, color=black)
plot(title='S', series=smooth, color=red)
hline(0)
hline(50)
hline(100)

max_order_per_day = input(6)
// strategy.risk.max_intraday_filled_orders(max_order_per_day)
trade_size_as_equity_factor = input(false)
trade_size = input(type=float, defval=10000.00) * (trade_size_as_equity_factor ? strategy.equity : 1)
take_profit_in_points = input(100000)
stop_loss_in_points = input(100000)
trail_in_points = input(150)

USE_SESSION = input(true)
trade_session = input(title='Trade Session:', defval='0400-1500', confirm=false)
istradingsession = not USE_SESSION ? true : not na(time('1', trade_session))

buy_entry = istradingsession and crossover(marsi, smooth)
sel_entry = istradingsession and crossunder(marsi, smooth)

strategy.entry('buy', long=true, qty=1, when=buy_entry)
strategy.entry('sel', long=false, qty=1, when=sel_entry)

strategy.exit('buy.Exit', from_entry='buy', profit=take_profit_in_points, loss=stop_loss_in_points, trail_points=trail_in_points, trail_offset=trail_in_points)
strategy.exit('sel.Exit', from_entry='sel', profit=take_profit_in_points, loss=stop_loss_in_points, trail_points=trail_in_points, trail_offset=trail_in_points)
strategy.close_all(when=not istradingsession)

更多内容