
この戦略は,双均線突破信号とATR波動性フィルターとHMAトレンド偏差を融合した量化取引戦略である.この戦略は,二つの異なる周期の均線を用い,取引信号を構築し,波動性指標ATRを組み合わせて,無効信号の一部をフィルターし,HMAを使用してトレンド方向を判断し,逆転操作を避ける.
策略は,長さ37周期の平均線を基準平均線として使用し,価格がこの平均線の下から突破すると買い信号を生成し,上から突破すると売り信号を生成する.誤報信号をフィルターするために,策略は,価格がベース平均線を破った後に同じ方向に2倍以上のATR波動を継続すると,信号生成の有効指示を確認する.さらに,策略は,長さ11周期のHMAを使用して大トレンドの方向を判断し,価格がベース平均線を破ったときにHMAが同方向を示すときのみ,信号生成の有効指示を確認し,逆操作による損失を回避する.
利得モードでは,戦略が支持する選択は,1つのストップまたは2つまたは3つの異なる価格のストップを使用する. ストップモードでは,戦略は,長短単一のストップとして,軌道線を直接上下する.
単一の均線突破戦略と比較して,この戦略は,信号生成時にATR波動フィルターを追加し,無効信号のほとんどをフィルタリングすることができる.これは,視覚的なK線形戦略と非常に一致し,したがって,より高い勝利率を得ることができる.同時に,HMAを増加させ,トレンド偏差を判断し,逆転ポジションを回避し,不必要な損失を大幅に減らすことができる.
この戦略の最大のリスクは,ATRの波動的フィルタリングが有効な信号の一部を消去し,戦略が間に合わない状態になる可能性があることにある.さらに,HMAは大きなトレンドを判断する効果は目立たない.時には,価格は大きなトレンドの反転ではなく,短期的な調整にすぎず,これは不必要な損失を引き起こす可能性がある.上記のリスクを軽減するために,ATRの波動的フィルタリングのパラメータを適切に低下させ,波動範囲を拡大して,より多くのK線形状の信号を検証指令によって生成することができる.同時に,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)