
この戦略は,双均線交差信号と動的リスク管理を組み合わせた取引システムである.短期と長期の移動平均の交差によって取引信号を生成し,ATR指標を利用してストップ・ロスを動的に調整し,有利なポジションを獲得し,時間フィルタリングと冷却期を導入して取引品質を最適化する.この戦略には,リスク・リターン・レートと取引あたりのリスクのパーセントの管理機構も含まれている.
この戦略は、次のコアコンポーネントに基づいています。
この戦略は,古典的な技術分析方法と現代的なリスク管理理念を組み合わせて,完全な取引システムを構築している.その核心的な優点は,ダイナミックなリスク管理と複数のフィルタリング機構にあるが,実際のアプリケーションでは,特定の市場の特徴に応じてパラメータの最適化が必要である.戦略の成功運用には,各構成要素の役割を深く理解し,市場変化に応じてパラメータを適時に調整する必要があります.提案された最適化の方向によって,戦略は,異なる市場環境でより安定したパフォーマンスを得る見通しがある.
/*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)