资源加载中... loading...

双均线交叉策略

Author: ChaoZhang, Date: 2024-05-17 15:48:04
Tags: EMASMA

双均线交叉策略

概述

双均线交叉策略是一个经典的趋势跟踪交易策略。该策略使用两条移动平均线,一条是快速移动平均线,另一条是慢速移动平均线。当快速移动平均线从下往上穿过慢速移动平均线时,称为”黄金交叉”,表明上升趋势可能形成,此时开仓做多。当快速移动平均线从上往下穿过慢速移动平均线时,称为”死亡交叉”,表明下降趋势可能形成,此时开仓做空。该策略代码支持使用简单移动平均线(SMA)和指数移动平均线(EMA),并且可以设置止损。

策略原理

该策略的核心是利用移动平均线的趋势特性和交叉信号来判断趋势方向和开仓时机。首先通过参数设置快速移动平均线(默认50)和慢速移动平均线(默认200)的周期,以及选择使用SMA还是EMA。然后计算两条移动平均线,判断它们的交叉情况: 1. 当快速移动平均线向上穿过慢速移动平均线(黄金交叉)时,若当前无持仓则开仓做多,同时设置止损价格(根据止损百分比计算)。 2. 当快速移动平均线向下穿过慢速移动平均线(死亡交叉)时,若当前无持仓则开仓做空,同时设置止损价格。 3. 若已有多头仓位,当死亡交叉发生时平仓。 4. 若已有空头仓位,当黄金交叉发生时平仓。 通过移动平均线交叉信号开仓,并设置止损,以趋势跟踪的方式捕捉价格的中长期趋势。

策略优势

  1. 逻辑简单清晰,容易理解和实现,是趋势跟踪策略的基础。
  2. 通过两条不同周期的移动平均线的交叉,可以较好地判断趋势的形成和反转。
  3. 支持SMA和EMA两种类型的移动平均线,可以灵活选择。
  4. 设置了止损,一定程度上控制了损失风险。
  5. 适合把握中长期趋势,trend-following风格。

策略风险

  1. 参数选择不当(如移动平均线周期选择不当)可能导致信号频繁或者趋势判断滞后。
  2. 快速震荡行情可能导致频繁交易,表现不佳。
  3. 趋势反转或结束时可能出现较大回撤。
  4. 固定百分比止损可能无法很好地控制风险。

策略优化方向

  1. 对参数进行优化,包括移动平均线周期、止损百分比等,提高稳定性和收益风险比。
  2. 可以考虑引入ATR等与波动率相关的指标来动态调整止损位置。
  3. 趋势确认后再开仓而不是交叉时立即开仓,或者再加入其他趋势确认指标辅助判断,提高趋势把握的准确性。
  4. 可以通过加仓、减仓等资金管理策略来改进。
  5. 考虑与其他信号结合,形成多因子策略。

总结

双均线交叉策略是一个简单经典的趋势跟踪策略,通过两条不同周期移动平均线的交叉来判断趋势方向和开平仓时机,适合把握中长期趋势。但是固定参数可能在变化的市场环境中表现不稳定,需要进一步优化完善,如优化参数、改进止损、引入其他信号等,才能成为一个相对稳健的交易策略。该策略可以作为趋势策略的基础,并在此基础上不断改进和扩展。


/*backtest
start: 2023-05-11 00:00:00
end: 2024-05-16 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
//==============================================================================
// A baseline strategy with a well known concept, golden cross & death cross.
// Support for both Simple & Exponential moving averages.
// Support for long & short stop losses as a percentage.:well
//==============================================================================
strategy("Basic Moving Average Crosses", overlay=true)

//------------------------------------------------------------------------------
// configuration
//------------------------------------------------------------------------------
maQuickLength = input(50, title="Quick MA Length") 
maSlowLength  = input(200, title="Quick MA Length") 
useSma        = input(true, title="Use SMA? If false, EMA is used.")

maQuick = useSma ? ta.sma(close, maQuickLength) : ta.ema(close, maQuickLength)
maSlow  = useSma ? ta.sma(close, maSlowLength) : ta.ema(close, maSlowLength)

stop_loss_percentage = input(2.0, title="Stop Loss (%)")

var float longStopLevel = na
var float shortStopLevel = na

bool isGoldenCross = ta.crossover(maQuick, maSlow)
bool isDeathCross  = ta.crossunder(maQuick, maSlow)

//------------------------------------------------------------------------------
// position opening logic
//------------------------------------------------------------------------------

if(strategy.position_size == 0)
    // Golden cross, enter a long position
    if(isGoldenCross)
        strategy.entry("Buy", strategy.long)
        longStopLevel := close - close * stop_loss_percentage/100.0
        strategy.exit("StopLossLong", "Buy", stop=longStopLevel)
    // Death cross, enter short position
    else if(isDeathCross)
        strategy.entry("Sell", strategy.short)
        shortStopLevel := close + close * stop_loss_percentage/100.0
        strategy.exit("StopLossShort", "Sell", stop=shortStopLevel)

//------------------------------------------------------------------------------
// position closing logic
//------------------------------------------------------------------------------
else
    // Close long position on death cross
    if(strategy.position_size > 0 and isDeathCross)
        strategy.close("Buy")
    
    // Close short position on golden cross
    else if(strategy.position_size < 0 and isGoldenCross)
        strategy.close("Sell")

//------------------------------------------------------------------------------
// ploting
//------------------------------------------------------------------------------
plot(maQuick, color=color.yellow)
plot(maSlow, color=color.blue)

相关内容

更多内容