この戦略は,ベースライン平均逆転信号,ATR波動性フィルター,およびHMAトレンドフィルターを統合し,定量的なトレード戦略のための強力なトレード信号を生成する.これは,トレード信号を構築するために異なる期間の2つの移動平均値を使用し,ATR波動性指標を組み合わせて,いくつかの無効な信号をフィルタリングし,不利な選択を避けるために主要なトレンド方向を決定するためにHMAを使用する.
この戦略は,37期移動平均値をベースラインとして使用する.価格がこのベースラインから上向きに突破すると,購入信号を生成し,上から突破すると,販売信号を生成する.偽信号を避けるために,戦略は,シグナルの有効性を確認するためにベースラインに突入した後,2xATR波動性を超えて移動することを要求する.また,戦略は主要なトレンドを判断するために11期HMAを使用する.不利な選択を防ぐために,価格の突入ベースラインがHMA方向に並んだときにのみ有効な信号を確認する.
ストップ・ロスの場合,それは単にロング・ショート・ポジションの上下帯線をSLとして取る.
簡単な移動平均ブレイクアウト戦略と比較して,この戦略は多くの無効な信号を削除するATR波動性フィルターを追加する.これは視覚パターンブレイクアウト技術と非常によく一致し,より高い勝利率につながります.また,HMAトレンドバイアスは不利な選択を防止し,不必要な損失を大幅に削減します.マルチテイク・プロフィート・スキームはまた,より多くの利益をロックすることができます.
主なリスクは,ATR波動性フィルタが有効なシグナルを削除し,ポジションを間に合うように開けないことにある.また,価格が逆転ではなく短期的なリトラセクションをしているとき,HMAトレンド判断はあまり重要ではない.これは不必要なストップ損失につながる可能性があります.リスクを軽減するために,より多くのシグナルを許可するためにATR波動性フィルタパラメータを下げることができます.また,短期変動による干渉を防ぐため,主要なトレンドを判断するために長期間のHMAを使用するためにHMA期間パラメータを調整することができます.
戦略は以下の側面で最適化できます.
基準期,ATR期,波動系数など,最適な値のセットを見つけるために,より多くのパラメータの組み合わせをテストする.
モデルの安定性を高めるため,より多くのフィルターや振動器を追加して市場状況を判断します.
利得のメカニズムのパラメータを最適化し,より多くの価格レベルと配分システムをテストする.
機械学習モデルを組み込み より効果的な取引信号を生成する.
この戦略は,二重移動平均ベースライン信号,ATR波動性フィルターおよびHMAトレンドバイアスフィルターを非常に実践的な定量取引システムに統合しています.パラメータチューニングを通じてパフォーマンスを向上させる余地があるにもかかわらず,すでに規律的なルールベースの取引に役立ちます.
/*backtest start: 2023-01-10 00:00:00 end: 2024-01-16 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/ // © sevencampbell //@version=5 strategy(title="Baseline Cross Qualifier Volatility Strategy with HMA Trend Bias", overlay=true) // --- User Inputs --- // Baseline Inputs baselineLength = input.int(title="Baseline Length", defval=20) baseline = ta.sma(close, baselineLength) // PBCQ Inputs pbcqEnabled = input.bool(title="Post Baseline Cross Qualifier Enabled", defval=true) pbcqBarsAgo = input.int(title="Post Baseline Cross Qualifier Bars Ago", defval=3) // Volatility Inputs atrLength = input.int(title="ATR Length", defval=14) multiplier = input.float(title="Volatility Multiplier", defval=2.0) rangeMultiplier = input.float(title="Volatility Range Multiplier", defval=1.0) qualifierMultiplier = input.float(title="Volatility Qualifier Multiplier", defval=0.5) // Take Profit Inputs takeProfitType = input.string(title="Take Profit Type", options=["1 Take Profit", "2 Take Profits", "3 Take Profits"], defval="1 Take Profit") // HMA Inputs hmaLength = input.int(title="HMA Length", defval=50) // --- Calculations --- // ATR atr = ta.atr(atrLength) // Range Calculation rangeHigh = baseline + rangeMultiplier * atr rangeLow = baseline - rangeMultiplier * atr rangeColor = rangeLow <= close and close <= rangeHigh ? color.yellow : na bgcolor(rangeColor, transp=90) // Qualifier Calculation qualifier = qualifierMultiplier * atr // Dot Calculation isLong = close > baseline and (close - baseline) >= qualifier and close > ta.hma(close, hmaLength) isShort = close < baseline and (baseline - close) >= qualifier and close < ta.hma(close, hmaLength) colorDot = isLong ? color.green : isShort ? color.red : na plot(isLong or isShort ? baseline : na, color=colorDot, style=plot.style_circles, linewidth=3) // --- Strategy Logic --- // PBCQ pbcqValid = not pbcqEnabled or low[pbcqBarsAgo] > baseline // Entry Logic longCondition = isLong and pbcqValid shortCondition = isShort and pbcqValid if (longCondition) strategy.entry("Long", strategy.long) if (shortCondition) strategy.entry("Short", strategy.short) // Exit Logic if (takeProfitType == "1 Take Profit") strategy.exit("TP/SL", "Long", limit=rangeHigh, stop=rangeLow) strategy.exit("TP/SL", "Short", limit=rangeLow, stop=rangeHigh) else if (takeProfitType == "2 Take Profits") strategy.exit("TP1", "Long", qty=strategy.position_size * 0.5, limit=rangeHigh / 2) strategy.exit("TP2", "Long", qty=strategy.position_size * 0.5, limit=rangeHigh) strategy.exit("TP1", "Short", qty=strategy.position_size * 0.5, limit=rangeLow / 2) strategy.exit("TP2", "Short", qty=strategy.position_size * 0.5, limit=rangeLow) else if (takeProfitType == "3 Take Profits") strategy.exit("TP1", "Long", qty=strategy.position_size * 0.5, limit=rangeHigh / 2) strategy.exit("TP2", "Long", qty=strategy.position_size * 0.25, limit=rangeHigh * 0.75) strategy.exit("TP3", "Long", qty=strategy.position_size * 0.25, limit=rangeHigh * 1.5)