多时间框架趋势追踪策略


创建日期: 2023-11-14 14:29:39 最后修改: 2023-11-14 14:29:39
复制: 0 点击次数: 452
avatar of ChaoZhang ChaoZhang
1
关注
1259
关注者

多时间框架趋势追踪策略

概述

本策略通过组合使用均线、MACD和RSI等多个指标在多时间框架内识别趋势方向,实现对SPX500指数的趋势追踪交易。

策略原理

  1. 使用10日简单移动平均线判断价格趋势方向。当价格上穿10日线时看涨,下穿看跌。

  2. 应用正负双向MACD判断动量。计算12和21日指数移动平均线的差值,再通过均线差值的快慢线交叉识别买卖信号。快线上穿慢线看涨,下穿看跌。

  3. 计算14日RSI和其50日均线,RSI上穿均线为看涨信号,下穿为看跌信号。

  4. 通过1分钟、3分钟和5分钟 timeframe 确认趋势一致性。

  5. 当价格上穿10日线、RSI上穿均线、MACD快线上穿慢线时产生买入信号;当价格下穿10日线、RSI下穿均线、MACD快线下穿慢线时产生卖出信号。

策略优势

  1. 多指标组合识别趋势,提高信号准确性。10日均线判断主趋势方向,MACD判定动量强弱,RSI确认超买超卖。指标组合可互相验证,减少错误交易。

  2. 多时间框架确认,避免被市场噪音误导。1分钟、3分钟、5分钟时间框架双重验证,确保信号同步出现,过滤假信号。

  3. 结合图形判断形态,直观可靠。图形辅助判断价格形态特征,避免买卖点极端区域,降低损失风险。

  4. 交易频率适中,符合指数交易特点。使用10日均线作为主要判断指标,交易频率不会过高,避免反复交易而付出过多交易成本。

策略风险

  1. 无法识别突发事件造成的断裂行情。非理性事件会打乱模型判断,此时应降低仓位规避风险。

  2. 参数设置固定,未考虑市场环境变化。实战中应根据大市环境动态调整参数,使策略适应多种行情。

  3. 买卖点过于理想化,实际执行难度大。应结合滑点成本等因素微调买卖点,使信号更具可执行性。

  4. 多时间框架增加决策延迟。应针对突发事件做好风控,降低延迟带来的亏损。

策略优化方向

  1. 增加止损机制,如移动止损、百分比止损等,控制单笔损失。

  2. 优化参数设置,使参数动态适应市场环境,提高策略稳健性。

  3. 结合市场热点事件风控,避免重大事件对策略造成冲击。

  4. 考虑实际交易成本如滑点,调整买卖点位使信号可执行。

  5. 测试不同取值方法,如K线等,作为信号确认来源,丰富多时间框架验证手段。

  6. 增加机器学习算法,利用大数据训练模型,自动优化策略参数。

总结

本策略通过多指标识别趋势、多时间框架确认信号的方式实现了对SPX500指数的趋势追踪交易。策略优势在于信号准确性高、抗噪音干扰能力强,但需要注意风险控制,保持策略参数动态优化。作为一种优化简单移动平均线策略的有效尝试,本策略为量化交易策略优化提供了有益的启发和借鉴。

策略源码
/*backtest
start: 2022-11-07 00:00:00
end: 2023-11-13 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// USE HEIEN ASHI, 1 min, SPX 500 USD OANDA
// © connor2279
//@version=5
strategy(title="SPX Strategy", shorttitle="SPXS", overlay=true)

//SMA
len1 = 10
src1 = input(close, title="SMA Source #1")
out1 = ta.sma(src1, len1)
plot(out1, title="SMA #1", color=close >= out1 ? color.lime : color.red, linewidth=2)

data_over = ta.crossover(close, out1)
dataO = close >= out1
data_under = ta.crossunder(close, out1)
dataU = close < out1

bgcolor(color=ta.crossover(close, out1) ? color.new(color.lime, 90) : na)
bgcolor(color=ta.crossunder(close, out1) ? color.new(color.red, 90) : na)     

//Norm MacD
sma = 12
lma = 21
tsp = 10
np = 50
    
sh = ta.ema(close,sma)  

lon= ta.ema(close,lma) 

ratio = math.min(sh,lon)/math.max(sh,lon)

Mac = ratio - 1
if(sh>lon)
    Mac := 2-ratio - 1
else
    Mac := ratio - 1

MacNorm = ((Mac-ta.lowest(Mac, np)) /(ta.highest(Mac, np)-ta.lowest(Mac, np)+.000001)*2)- 1

MacNorm2 = MacNorm

if(np<2)
    MacNorm2 := Mac
else
    MacNorm2 := MacNorm
    
Trigger = ta.wma(MacNorm2, tsp)

trigger_above = Trigger >= MacNorm
trigger_under = Trigger < MacNorm
plotshape(ta.crossover(Trigger, MacNorm2), style=shape.triangledown, color=color.red)
plotshape(ta.crossunder(Trigger, MacNorm2), style=shape.triangledown, color=color.lime)

//RSI / SMA RSI
swr=input(true,title="RSI")
src = close
len = 14
srs = 50
up = ta.rma(math.max(ta.change(src), 0), len)
down = ta.rma(-math.min(ta.change(src), 0), len)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
mr = ta.sma(rsi,srs)
rsi_above = rsi >= mr
rsi_under = rsi < mr

//All
buySignal = rsi_above and trigger_under and dataO
shortSignal = rsi_under and trigger_above and dataU
bgcolor(color=buySignal ? color.new(color.lime,97) : na)     
bgcolor(color=shortSignal ? color.new(color.red, 97) : na)     
     
sellSignal = ta.cross(close, out1) or ta.cross(Trigger, MacNorm2) or ta.cross(rsi, mr)
if (buySignal)
    strategy.entry("LONG", strategy.long, 1)

if (shortSignal)
    strategy.entry("SHORT", strategy.short, 1)

// Submit exit orders
strategy.close("LONG", when=sellSignal)
strategy.close("SHORT", when=sellSignal)