基于双移动平均策略

Author: ChaoZhang, Date: 2024-02-21 14:43:26
Tags:

基于双移动平均策略

概述

本策略利用双移动平均线形成通道,以捕捉趋势的方向。当价格突破通道时产生交易信号。同时结合RSI指标过滤假突破。仅在伦敦交易时段操作,每天最多5单,最大亏损不超过2%。

策略原理

该策略使用两个长度为5的移动平均线,一个计算自最高价,一个计算自最低价,形成一个价格通道。当收盘价突破通道上沿时做多,突破通道下沿时做空。

为过滤假突破,还引入RSI指标判断超买超卖。仅在RSI高于80时做多,低于20时做空。

此外,策略只在伦敦交易时段(上午3点至11点)交易,每天最多5笔订单,最大亏损不超过股票权益的2%。

优势分析

捕捉趋势

双移动平均线构建趋势通道,能较好地判断价格趋势方向。当价格向上突破通道上轨时,捕捉到价格的上扬趋势;当价格向下突破通道下轨时,捕捉到价格的下跌趋势。

减少假突破

结合RSI指标判断超买超卖区域,可以一定程度上减少因价格震荡导致的假突破。

有效控制风险

策略仅在主要活跃交易时间段进行交易,每天最多5笔订单可有效控制交易频率;最大亏损设置为2%可将单日最大损失控制在可承受范围。

风险分析

价格震荡大时假突破风险

当价格出现大幅震荡时,可能出现一定的假突破信号,这会导致不必要的交易亏损。可以通过调整参数优化,或增加过滤条件来减少该风险。

固定止损止盈易被套风险

策略采用固定数量的点数止损止盈,当价格出现大幅波动时,固定点数的止损止盈容易被套,应对此采用百分比或者动态止损止盈。

限定交易时段风险

策略仅在固定的交易时段开仓,如果在该时段没有产生信号,会错过其他时段潜在的交易机会。可以考虑适当扩大交易时间或根据实时情况动态调整。

优化方向

参数优化

可以对移动平均线长度、RSI参数、固定止损止盈点数等进行优化,找到最优参数组合。

增加过滤条件

可以增加其他指标或条件对突破信号进行二次校验,如增大交易量、缩小布林线通道等,减少假突破。

动态止损止盈

可以采用百分比止损或动态止损策略,而不是简单的固定点数止损,更好对冲单边行情的风险。

结合人工判断

对信号进行人工复核,或者只在确认突破后入场,避免被套。

总结

本策略总体较为简单实用,通过双移动平均构建通道判断趋势方向;同时RSI指标可有效过滤部分假突破。风险控制方面,限定交易时段和最大损失可控制总体风险。优化空间还比较大,可从参数优化、止损机制升级等方面进行改进。


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-16 23:59:59
period: 1h
basePeriod: 15m
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/
// © SoftKill21
//@version=4
strategy(title="Moving Average", shorttitle="MA", overlay=true)
timeinrange(res, sess) => time(res, sess) != 0
len = input(5, minval=1, title="Length")
src = input(high, title="Source")
offset = input(title="Offset", type=input.integer, defval=0, minval=-500, maxval=500)
out = sma(src, len)
plot(out, color=color.white, title="MA", offset=offset)

len2 = input(5, minval=1, title="Length")
src2 = input(low, title="Source")
offset2 = input(title="Offset", type=input.integer, defval=0, minval=-500, maxval=500)
out2 = sma(src2, len2)
plot(out2, color=color.white, title="MA", offset=offset2)

length = input( 5 )
overSold = input( 10 )
overBought = input( 80 )
price = input(close, title="Source RSI")

vrsi = rsi(price, length)

longcond= close > out and close > out2 and vrsi > overBought
shortcont = close < out and close < out2 and vrsi < overSold
tp=input(150,title="tp")
sl=input(80,title="sl")


strategy.entry("long",1,when=longcond)
//strategy.close("long",when= close < out2)
strategy.exit("long_exit","long",profit=tp,loss=sl)

strategy.entry("short",1,when=shortcont)
//strategy.close("short",when=close >out)
strategy.exit("short_exit","short",profit=tp,loss=sl)

// maxOrder = input(6, title="max trades per day")
// maxRisk = input(2,type=input.float, title="maxrisk per day")
// strategy.risk.max_intraday_filled_orders(maxOrder)

// strategy.risk.max_intraday_loss(maxRisk, strategy.percent_of_equity)


// strategy.close_all(when =not timeinrange(timeframe.period, "0300-1100"))






更多内容