この戦略は,多期間のEMAトレンドをモメンタム分析と組み合わせる定量的な取引戦略である.この戦略は主に,日・週間のタイムフレームの両方でモメンタム指標と組み合わせた20,50,100,200日指数関数移動平均 (EMA) の調整を分析する.ATRベースのストップロスを採用し,EMAが調整されモメンタム条件が満たされたときに取引を開始し,ATR多期ストップロスと利益目標を介してリスクを管理する.
基本的な論理にはいくつかの重要な要素が含まれます.
これは,よく設計された,論理的に厳格なトレンドフォロー戦略である.複数の技術指標の組み合わせを通じて,戦略の堅牢性と効果的なリスク管理の両方を保証する. 戦略の高いカスタマイズ可能性は,異なる市場特性に最適化することを可能にします. 固有のリスクが存在する一方で,提案された最適化方向は戦略のパフォーマンスをさらに向上させることができます. 全体的に,これは実験し,深く研究する価値のある定量的な取引戦略です.
/*backtest start: 2024-10-01 00:00:00 end: 2024-10-31 23:59:59 period: 1h basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Swing Trading with EMA Alignment and Custom Momentum", overlay=true) // User inputs for customization atrLength = input.int(14, title="ATR Length", minval=1) atrMultiplierSL = input.float(1.5, title="Stop-Loss Multiplier (ATR)", minval=0.1) // Stop-loss at 1.5x ATR atrMultiplierTP = input.float(3.0, title="Take-Profit Multiplier (ATR)", minval=0.1) // Take-profit at 3x ATR pullbackRangePercent = input.float(1.0, title="Pullback Range (%)", minval=0.1) // 1% range for pullback around 20 EMA lengthKC = input.int(20, title="Length for Keltner Channels (Momentum Calculation)", minval=1) // EMA settings ema20 = ta.ema(close, 20) ema50 = ta.ema(close, 50) ema100 = ta.ema(close, 100) ema200 = ta.ema(close, 200) // ATR calculation atrValue = ta.atr(atrLength) // Custom Momentum Calculation based on Linear Regression for Daily Timeframe highestHighKC = ta.highest(high, lengthKC) lowestLowKC = ta.lowest(low, lengthKC) smaCloseKC = ta.sma(close, lengthKC) // Manually calculate the average of highest high and lowest low averageKC = (highestHighKC + lowestLowKC) / 2 // Calculate daily momentum using linear regression dailyMomentum = ta.linreg(close - (averageKC + smaCloseKC) / 2, lengthKC, 0) // Custom daily momentum calculation // Fetch weekly data for momentum calculation using request.security() [weeklyHigh, weeklyLow, weeklyClose] = request.security(syminfo.tickerid, "W", [high, low, close]) // Calculate weekly momentum using linear regression on weekly timeframe weeklyHighestHighKC = ta.highest(weeklyHigh, lengthKC) weeklyLowestLowKC = ta.lowest(weeklyLow, lengthKC) weeklySmaCloseKC = ta.sma(weeklyClose, lengthKC) weeklyAverageKC = (weeklyHighestHighKC + weeklyLowestLowKC) / 2 weeklyMomentum = ta.linreg(weeklyClose - (weeklyAverageKC + weeklySmaCloseKC) / 2, lengthKC, 0) // Custom weekly momentum calculation // EMA alignment condition (20 EMA > 50 EMA > 100 EMA > 200 EMA) emaAligned = ema20 > ema50 and ema50 > ema100 and ema100 > ema200 // Momentum increasing condition (daily and weekly momentum is positive and increasing) dailyMomentumIncreasing = dailyMomentum > 0 and dailyMomentum > dailyMomentum[1] //and dailyMomentum[1] > dailyMomentum[2] weeklyMomentumIncreasing = weeklyMomentum > 0 and weeklyMomentum > weeklyMomentum[1] //and weeklyMomentum[1] > weeklyMomentum[2] // Redefine Pullback condition: price within 1% range of the 20 EMA upperPullbackRange = ema20 * (1 + pullbackRangePercent / 100) lowerPullbackRange = ema20 * (1 - pullbackRangePercent / 100) pullbackToEma20 = (close <= upperPullbackRange) and (close >= lowerPullbackRange) // Entry condition: EMA alignment and momentum increasing on both daily and weekly timeframes longCondition = emaAligned and dailyMomentumIncreasing and weeklyMomentumIncreasing and pullbackToEma20 // Initialize stop loss and take profit levels as float variables var float longStopLevel = na var float longTakeProfitLevel = na // Calculate stop loss and take profit levels based on ATR if (longCondition) longStopLevel := close - (atrMultiplierSL * atrValue) // Stop loss at 1.5x ATR below the entry price longTakeProfitLevel := close + (atrMultiplierTP * atrValue) // Take profit at 3x ATR above the entry price // Strategy execution if (longCondition) strategy.entry("Long", strategy.long) // Exit conditions: Stop-loss at 1.5x ATR and take-profit at 3x ATR if (strategy.position_size > 0) strategy.exit("Take Profit/Stop Loss", "Long", stop=longStopLevel, limit=longTakeProfitLevel)