该策略基于移动平均线位移包络线指标进行交易信号生成。其中,包络线通过移动平均线的百分比因子来计算。如果前期高点突破上轨,则产生卖出信号;如果前期低点跌破下轨,则产生买入信号。
该策略使用 displaced exponential moving average (EMA)作为核心指标,并在其一定周期之后,通过百分比因子扩大形成上下轨。这构成了完整的移动平均位移包络线系统。具体来说,包络线系统由以下组成:
其中Percent above和Percent below分别控制上下轨相对核心指数移动平均线的百分比区间。Displacement参数用于控制上下轨线与核心指数移动平均线之间的周期位移。
通过这种方式,我们可以通过调整上述参数,形成合适的交易区间。如果价格突破区间,则产生交易信号。具体来说:
需要注意的是,该策略还提供了reverse参数,如果设置为true,则信号方向与上述相反。
该策略主要具有以下优势:
该策略也存在一些风险,主要包括:
为防范这些风险,我们可以从以下几个方面进行优化:
该策略还有很大的优化空间,主要可以考虑从以下几个方面进行:
通过这些优化,可以进一步增强策略的稳定性、适应性和效果。
移动平均位移包络线策略利用简单的指数移动平均系统与参数化区间,形成清晰的交易规则,易于解释和实施,属于一种较为典型的趋势跟踪策略。通过参数调整和优化,该策略可以产生较好的效果。但也需要充分考虑市场环境的影响,并防范潜在的风险。本策略为基础模板,后续仍有很大的拓展与优化空间。
/*backtest
start: 2024-01-25 00:00:00
end: 2024-02-01 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
////////////////////////////////////////////////////////////
// Copyright by HPotter v1.0 14/08/2020
// Moving Average Displaced Envelope. These envelopes are calculated
// by multiplying percentage factors with their displaced expotential
// moving average (EMA) core.
// How To Trade Using:
// Adjust the envelopes percentage factors to control the quantity and
// quality of the signals. If a previous high goes above the envelope
// a sell signal is generated. Conversely, if the previous low goes below
// the envelope a buy signal is given.
//
// WARNING:
// - For purpose educate only
// - This script to change bars colors.
////////////////////////////////////////////////////////////
strategy(title="Moving Average Displaced Envelope Backtest", shorttitle="MA DE", overlay = true)
Price = input(title="Source", type=input.source, defval=close)
Period =input(defval=9, minval=1)
perAb = input(title = "Percent above", defval=.5, minval=0.01, step = 0.1)
perBl = input(title = "Percent below", defval=.5, minval=0.01, step = 0.1)
disp = input(title = "Displacement", defval=13, minval=1)
reverse = input(false, title="Trade reverse")
pos = 0
sEMA = ema(Price, Period)
top = sEMA[disp] * ((100 + perAb)/100)
bott = sEMA[disp]* ((100 - perBl)/100)
pos := iff(close < bott , 1,
iff(close > top, -1, pos[1]))
possig = iff(reverse and pos == 1, -1,
iff(reverse and pos == -1 , 1, pos))
if (possig == 1)
strategy.entry("Long", strategy.long)
if (possig == -1)
strategy.entry("Short", strategy.short)
if (possig == 0)
strategy.close_all()
barcolor(possig == -1 ? #b50404: possig == 1 ? #079605 : #0536b3 )