该策略是一个结合了双均线交叉信号和动态风险管理的交易系统。通过短期和长期移动平均线的交叉来产生交易信号,同时利用ATR指标动态调整止损和获利点位,并引入时间过滤和冷却期来优化交易质量。该策略还包含了风险收益比和每笔交易风险百分比的管理机制。
策略主要基于以下几个核心组件: 1. 信号生成系统采用短期(10周期)和长期(100周期)简单移动平均线的交叉来触发交易。当短期均线向上穿越长期均线时产生做多信号,反之产生做空信号。 2. 风险管理系统使用14周期ATR乘以1.5倍系数来设置动态止损距离,获利目标则是止损距离的2倍(可调整的风险收益比)。 3. 时间过滤器允许用户设定交易的具体时间段,仅在指定时间范围内执行交易。 4. 交易冷却期机制设置10个周期的等待时间,防止过度交易。 5. 每笔交易的风险控制在账户的1%(可调整)。
该策略通过结合经典的技术分析方法和现代风险管理理念,构建了一个完整的交易系统。其核心优势在于动态风险管理和多重过滤机制,但仍需要在实际应用中根据具体市场特点进行参数优化。策略的成功运行需要交易者深入理解各个组件的作用,并根据市场变化及时调整参数。通过建议的优化方向,策略有望在不同市场环境下获得更稳定的表现。
/*backtest
start: 2024-09-18 00:00:00
end: 2025-02-19 00:00:00
period: 2h
basePeriod: 2h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Profitable Moving Average Crossover Strategy", shorttitle="Profitable MA Crossover", overlay=true)
// Input parameters for the moving averages
shortPeriod = input.int(10, title="Short Period", minval=1)
longPeriod = input.int(100, title="Long Period", minval=1)
// Input parameters for time filter
startHour = input.int(0, title="Start Hour (UTC)", minval=0, maxval=23)
startMinute = input.int(0, title="Start Minute (UTC)", minval=0, maxval=59)
endHour = input.int(23, title="End Hour (UTC)", minval=0, maxval=23)
endMinute = input.int(59, title="End Minute (UTC)", minval=0, maxval=59)
// Cooldown period input (bars)
cooldownBars = input.int(10, title="Cooldown Period (Bars)", minval=1)
// Risk management inputs
riskRewardRatio = input.float(2, title="Risk-Reward Ratio", minval=1)
riskPercent = input.float(1, title="Risk Per Trade (%)", minval=0.1)
// ATR settings
atrLength = input.int(14, title="ATR Length")
atrMultiplier = input.float(1.5, title="ATR Multiplier for Stop-Loss and Take-Profit")
// Calculate the moving averages
shortMA = ta.sma(close, shortPeriod)
longMA = ta.sma(close, longPeriod)
// Plot the moving averages
plot(shortMA, color=color.blue, title="Short MA")
plot(longMA, color=color.red, title="Long MA")
// Calculate ATR for dynamic stop-loss and take-profit
atr = ta.atr(atrLength)
stopLossOffset = atr * atrMultiplier
takeProfitOffset = stopLossOffset * riskRewardRatio
// Identify the crossover points
bullishCross = ta.crossover(shortMA, longMA)
bearishCross = ta.crossunder(shortMA, longMA)
// Get the current bar's time in UTC
currentTime = na(time("1", "UTC")) ? na : timestamp("UTC", year, month, dayofmonth, hour, minute)
// Define the start and end time in seconds from the start of the day
startTime = timestamp("UTC", year, month, dayofmonth, startHour, startMinute)
endTime = timestamp("UTC", year, month, dayofmonth, endHour, endMinute)
// Check if the current time is within the valid time range
isTimeValid = (currentTime >= startTime) and (currentTime <= endTime)
// Functions to check cooldown
var int lastSignalBar = na
isCooldownActive = (na(lastSignalBar) ? false : (bar_index - lastSignalBar) < cooldownBars)
// Handle buy signals
if (bullishCross and isTimeValid and not isCooldownActive)
entryPrice = close
stopLossBuy = entryPrice - stopLossOffset
takeProfitBuy = entryPrice + takeProfitOffset
strategy.entry("Buy", strategy.long)
strategy.exit("TakeProfit/StopLoss", "Buy", stop=stopLossBuy, limit=takeProfitBuy)
lastSignalBar := bar_index
// Handle sell signals
if (bearishCross and isTimeValid and not isCooldownActive)
entryPrice = close
stopLossSell = entryPrice + stopLossOffset
takeProfitSell = entryPrice - takeProfitOffset
strategy.entry("Sell", strategy.short)
strategy.exit("TakeProfit/StopLoss", "Sell", stop=stopLossSell, limit=takeProfitSell)
lastSignalBar := bar_index
// Plot signals on the chart
plotshape(series=bullishCross and isTimeValid and not isCooldownActive, location=location.belowbar, color=color.green, style=shape.labelup, text="Buy", title="Buy Signal", textcolor=color.white)
plotshape(series=bearishCross and isTimeValid and not isCooldownActive, location=location.abovebar, color=color.red, style=shape.labeldown, text="Sell", title="Sell Signal", textcolor=color.white)
// Strategy performance tracking
strategy.close("Buy", when=not isTimeValid)
strategy.close("Sell", when=not isTimeValid)