该策略基于两条不同参数设置的移动平均线的交叉来发出买入和卖出信号。当较短周期的移动平均线从下方向上突破较长周期的移动平均线时,发出买入信号;当较短周期的移动平均线从上方向下突破较长周期的移动平均线时,发出卖出信号。
该策略使用pine脚本语言编写。首先通过input定义了两条移动平均线的类型、长度和价格源,分别命名为p1和p2。其中p1代表较短周期的均线,p2代表较长周期的均线。
通过crossover和crossunder函数判断两条均线的交叉情况。当p1从下方向上突破p2时,即发出买入信号;当p1从上方向下突破p2时,即发出卖出信号。
为了实施交易,策略通过strategy.entry函数在发出信号时建立多头或空头仓位。如果启用了shortOnly参数,则只交易卖出信号。
该策略具有以下优势:
该策略也存在一些风险:
可通过调整均线长度,引入过滤条件等方式减少无效信号。也可以结合趋势指标判断大盘走势。
该策略可从以下几个方面进行优化:
引入Volume加权平均价或典型价格作为价格源,提高交叉信号的可靠性
增加 Validation Period 校验周期,避免短期错误交叉
结合ATR止损,根据市场波动幅度设定可承受的最大损失
使用曲线拟合优化参数,寻找最优参数组合
在大周期趋势一致时才考虑发出交易信号
该双均线交叉策略整体易于理解和实现,通过两个均线的交叉形成交易信号,可高度自定义。但也可能在震荡行情中产生较多无效信号。可通过参数优化与规则优化降低风险,其优化空间较大,值得进一步研究。
/*backtest
start: 2022-11-20 00:00:00
end: 2023-11-26 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/
// © RafaelPiccolo
//@version=4
strategy("Double MA Cross", overlay=true)
type1 = input("SMA", "MA Type 1", options=["SMA", "EMA", "WMA", "HMA", "VWMA", "RMA", "TEMA"])
len1 = input(10, minval=1, title="Length 1")
src1 = input(close, "Source 1", type=input.source)
type2 = input("SMA", "MA Type 2", options=["SMA", "EMA", "WMA", "HMA", "VWMA", "RMA", "TEMA"])
len2 = input(50, minval=2, title="Length 2")
src2 = input(close, "Source 2", type=input.source)
shortOnly = input(false, "Short only")
tema(src, len)=>
ema1 = ema(src, len)
ema2 = ema(ema1, len)
ema3 = ema(ema2, len)
return = 3 * (ema1 - ema2) + ema3
getPoint(type, len, src)=>
return = type == "SMA" ? sma(src, len) : type == "EMA" ? ema(src, len) : type == "WMA" ? wma(src, len) : type == "HMA" ? hma(src, len) : type == "VWMA" ? vwma(src, len) : type == "RMA" ? rma(src, len) : tema(src, len)
p1 = getPoint(type1, len1, src1)
p2 = getPoint(type2, len2, src2)
shortCondition = crossunder(p1, p2)
longCondition = crossover(p1, p2)
if (shortCondition)
strategy.entry("Short", strategy.short)
if (longCondition)
if (shortOnly)
strategy.close("Short")
else
strategy.entry("Long", strategy.long)
plot(p1, "MA 1", p1 < p2 ? color.red : color.green)
plot(p2, "MA 2", color.blue)