デュアルタイムフレームトレンド反転ローソク足パターン定量取引戦略

MA
作成日: 2025-01-10 15:47:53 最終変更日: 2025-01-10 15:47:53
コピー: 1 クリック数: 385
1
フォロー
1617
フォロワー

デュアルタイムフレームトレンド反転ローソク足パターン定量取引戦略

概要

この戦略は、ハンマー ラインとハンギング マンという 2 つの古典的なローソク足パターンに基づいた定量取引システムです。この戦略は、市場におけるこれらの反転パターンを特定し、価格変動の潜在的な転換点を予測することによって機能します。このシステムは、K ラインの実体と影の比例関係、トレンドの方向などの要素を含む複数のテクニカル指標を組み合わせて信号の有効性を確認し、市場の反転ポイントを正確に捉えます。

戦略原則

この戦略の核となるロジックは、2 つの主要なローソク足パターンをプログラム的に識別することです。

  1. ハンマー: 下降トレンドで出現し、上昇に反転する可能性があることを示唆します。実体が小さく、下ヒゲが長く(実体の 2 倍以上)、上ヒゲが非常に短いか存在しないことが特徴です。
  2. ハングマン: 上昇傾向で現れ、反転と下落の可能性を示唆します。形態的特徴はハンマー線と類似しているが、出現位置と意味は逆である。

この戦略では、次のような厳密なパラメータを設定することで、これらのパターンを定量化します。

  • ローソク足の最小本体長さ乗数
  • 下ヒゲとローソク足の高さの比率
  • 保有期間

戦略的優位性

  1. 体系的な識別: 人間の判断の主観を回避し、プログラム的な方法を通じて市場反転シグナルを正確に識別します。
  2. リスクは制御可能:過剰な保有によるリスクを回避するために、明確な保有期間が設定されています。
  3. シグナルの視覚化: チャート上に取引シグナルを直感的に表示し、簡単に分析および最適化できます。
  4. 柔軟なパラメータ: さまざまな市場状況に応じてパラメータを調整し、戦略の適応性を向上させることができます。

戦略リスク

  1. 誤ったブレイクアウトのリスク: 反転パターンは誤ったシグナルを生成する可能性があり、他のテクニカル指標と組み合わせて確認する必要があります。
  2. タイミングリスク: 保有期間を固定すると、価格変動の可能性を十分に捉えられない可能性があります。
  3. 市場環境への依存性: 不安定な市場では誤ったシグナルが多すぎる可能性があります。

戦略最適化の方向性

  1. トレンド フィルターの導入: 移動平均などのインジケーターを追加してトレンドをフィルターし、信号の品質を向上させることができます。
  2. 動的保有期間: 市場のボラティリティに応じて保有期間を動的に調整します。
  3. 複数期間の確認: より長い時間枠でのトレンド確認メカニズムを導入します。
  4. ストップロスの最適化: 動的なストップロス メカニズムを追加して、リスク管理機能を向上させます。

要約する

この戦略は、定量的な方法を通じて古典的なテクニカル分析理論を体系的に適用することを実現し、高い実用的価値を持っています。パラメータを最適化し、リスク管理メカニズムを改善することで、この戦略はさまざまな市場環境において安定したパフォーマンスを維持できます。戦略のモジュール設計は、その後の最適化のための優れた基盤も提供します。

ストラテジーソースコード
/*backtest
start: 2024-12-10 00:00:00
end: 2025-01-08 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":49999}]
*/

//@version=6
strategy("Hammer and Hanging Man Strategy", overlay=true)

// Input parameters
length = input.int(5, title="Minimum Candle Body Length (Multiplier)", minval=1)
shadowRatio = input.float(1, title="Lower Shadow to Candle Height Ratio", minval=1.0)
holdPeriods = input.int(26, title="Hold Periods (Bars)", minval=1)  // Holding period in bars

// Function to calculate the absolute value
absValue(x) =>
    x >= 0 ? x : -x

// Function to check if it is a Hammer
isHammer() =>
    bodyLength = absValue(close - open)
    candleHeight = high - low
    lowerShadow = math.min(open, close) - low
    upperShadow = high - math.max(open, close)
    smallBody = bodyLength <= candleHeight / length
    longLowerShadow = lowerShadow >= bodyLength * shadowRatio
    shortUpperShadow = upperShadow <= bodyLength
    smallBody and longLowerShadow and shortUpperShadow and close > open

// Function to check if it is a Hanging Man
isHangingMan() =>
    bodyLength = absValue(close - open)
    candleHeight = high - low
    lowerShadow = math.min(open, close) - low
    upperShadow = high - math.max(open, close)
    smallBody = bodyLength <= candleHeight / length
    longLowerShadow = lowerShadow >= bodyLength * shadowRatio
    shortUpperShadow = upperShadow <= bodyLength
    smallBody and longLowerShadow and shortUpperShadow and close < open

// Detect the candles
hammer = isHammer()
hangingMan = isHangingMan()

// Trading logic: Long on Hammer, Short on Hanging Man
if hammer
    strategy.entry("Long", strategy.long)  // Long entry on Hammer

if hangingMan
    strategy.entry("Short", strategy.short)  // Short entry on Hanging Man

// Exit after X bars
if strategy.position_size > 0 and bar_index - strategy.opentrades.entry_bar_index(0) >= holdPeriods
    strategy.close("Long")

if strategy.position_size < 0 and bar_index - strategy.opentrades.entry_bar_index(0) >= holdPeriods
    strategy.close("Short")

// Visualization of signals
plotshape(hammer, title="Hammer", location=location.belowbar, color=color.green, style=shape.labelup, text="Hammer")
plotshape(hangingMan, title="Hanging Man", location=location.abovebar, color=color.red, style=shape.labeldown, text="Hanging Man")