ベースライン・クロス・クリアフィカント ATR 波動性&HMA トレンドバイアス 平均逆転戦略

作者: リン・ハーンチャオチャン,日付: 2024-01-17 16:37:23
タグ:

img

概要

この戦略は,ベースライン平均逆転信号,ATR波動性フィルター,およびHMAトレンドフィルターを統合し,定量的なトレード戦略のための強力なトレード信号を生成する.これは,トレード信号を構築するために異なる期間の2つの移動平均値を使用し,ATR波動性指標を組み合わせて,いくつかの無効な信号をフィルタリングし,不利な選択を避けるために主要なトレンド方向を決定するためにHMAを使用する.

戦略の論理

この戦略は,37期移動平均値をベースラインとして使用する.価格がこのベースラインから上向きに突破すると,購入信号を生成し,上から突破すると,販売信号を生成する.偽信号を避けるために,戦略は,シグナルの有効性を確認するためにベースラインに突入した後,2xATR波動性を超えて移動することを要求する.また,戦略は主要なトレンドを判断するために11期HMAを使用する.不利な選択を防ぐために,価格の突入ベースラインがHMA方向に並んだときにのみ有効な信号を確認する.

ストップ・ロスの場合,それは単にロング・ショート・ポジションの上下帯線をSLとして取る.

利点分析

簡単な移動平均ブレイクアウト戦略と比較して,この戦略は多くの無効な信号を削除するATR波動性フィルターを追加する.これは視覚パターンブレイクアウト技術と非常によく一致し,より高い勝利率につながります.また,HMAトレンドバイアスは不利な選択を防止し,不必要な損失を大幅に削減します.マルチテイク・プロフィート・スキームはまた,より多くの利益をロックすることができます.

リスク と 解決策

主なリスクは,ATR波動性フィルタが有効なシグナルを削除し,ポジションを間に合うように開けないことにある.また,価格が逆転ではなく短期的なリトラセクションをしているとき,HMAトレンド判断はあまり重要ではない.これは不必要なストップ損失につながる可能性があります.リスクを軽減するために,より多くのシグナルを許可するためにATR波動性フィルタパラメータを下げることができます.また,短期変動による干渉を防ぐため,主要なトレンドを判断するために長期間のHMAを使用するためにHMA期間パラメータを調整することができます.

オプティマイゼーションの方向性

戦略は以下の側面で最適化できます.

  1. 基準期,ATR期,波動系数など,最適な値のセットを見つけるために,より多くのパラメータの組み合わせをテストする.

  2. モデルの安定性を高めるため,より多くのフィルターや振動器を追加して市場状況を判断します.

  3. 利得のメカニズムのパラメータを最適化し,より多くの価格レベルと配分システムをテストする.

  4. 機械学習モデルを組み込み より効果的な取引信号を生成する.

結論

この戦略は,二重移動平均ベースライン信号,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)


もっと