指数移動平均クロスオーバーインテリジェント固定投資チェーンストップロス追跡システム

EMA DCA ATR SO SL
作成日: 2025-04-16 15:30:15 最終変更日: 2025-07-17 08:57:10
コピー: 7 クリック数: 387
2
フォロー
319
フォロワー

指数移動平均クロスオーバーインテリジェント固定投資チェーンストップロス追跡システム 指数移動平均クロスオーバーインテリジェント固定投資チェーンストップロス追跡システム

概要

指数移動平均クロスインテリジェント投機式ストップトラッキングシステムは,技術分析と精細な資金管理に基づく量化取引戦略である.指数移動平均 (EMA) のクロスシグナルを利用して,潜在的上昇傾向を識別し,ドルコスト平均法 (DCA) と組み合わせて,スマートな加仓を行い,ダブルトラッキングストップトラッキングメカニズムで利益を保護する.戦略の中心は,急速EMAと遅いEMAのクロスを利用して,価格が下がったときにエントリー時間を決定し,最大2つのセキュリティオーダー (Safety Orders) を自動で展開し,平均リアル波動範囲 (ATR) または固定パーセントの計算により,加仓位置を計算し,ダブルトラッキングストップシステムの標準的なトラッキング (ストップトラッキング) を使用する.

戦略原則

この戦略は,以下のいくつかの重要な要素に基づいています.

  1. トレンド識別: 潜在的な上昇傾向を識別するために,高速EMA (デフォルト9サイクル) と遅いEMA (デフォルト21サイクル) の交差を使用する.高速EMAが遅いEMAを上方へ通過すると,システムは買い信号を生成する.

  2. 基本命令と安全命令戦略は,階層化された資金管理方法を採用し,基本注文から開始し (デフォルトは1000ドル),価格が下がると2つの追加のセキュリティ注文を追加します (デフォルトは1250ドル,SO2は1750ドル).

  3. ダイナミック間隔計算セキュリティオーダーのトリガー価格は,次の2つの方法で計算できます.

    • ATRの間隔:市場変動に対応するためにATRを特定の倍数で乗算する (SO1はデフォルトの1.2倍,SO2はデフォルトの2.5倍)
    • 固定パーセントの区間: 既定の価格下落のパーセント ((SO1 既定 4%,SO2 既定 8%)
  4. ダブル・トラッキング・ストロー・システム:

    • スタンダード・トラッキング・ストップ: 最大値から一定パーセントで設定 (デフォルトは8%)
    • 利益のロック追跡ストップ:利益が特定の値に達したときに起動する (デフォルト2.5%),より緊密な追跡パーセントを使用する (デフォルト1.5%)
  5. 退出条件戦略は,次の状況で平仓する.

    • 追跡停止が起動する
    • 急速なEMAは下向きにゆっくりとしたEMAを横切る (トレンドの逆転)
  6. 冷却期と日付のフィルター: 策略には,基本注文後の冷却期間 (デフォルトは4時間) と,特定の時間帯を制限するために選択可能な日付フィルターが含まれています.

戦略的優位性

この戦略のコードを詳しく分析すると,以下の主な利点が明らかになる.

  1. 適応性資金管理: 戦略は,ドルコスト平均法と動的セキュリティオーダーを組み合わせて,市場条件に応じて自動的にポジションを調整する.この方法は,波動的な市場において特に有効であり,平均入場価格を下げ,潜在的な利益を増やすことができる.

  2. 位置の変動による調整ATRは,セキュリティオーダーの位置を計算することで,戦略は,固定パーセント方法よりも柔軟に,現在の市場の変動に応じて,加仓間隔を自動的に調整することができます.

  3. 利益の2層の保護: ダブル・トラッキング・ストップ・システムは,革新的なリスク管理を提供し,標準のトラッキング・ストップは,資金の大部分を保護し,利益のロックメカニズムは,特定の利益目標を達成した後に活性化され,獲得した利益をより緊密な割合で保護する.

  4. 完全にカスタマイズできます: すべての重要なパラメータ (EMA長さ,オーダーサイズ,ストップ・パーセンテージ,セーフティー・オーダーの間隔) は,トレーダーのリスクの好みや市場条件に応じて調整できます.

  5. 集積された早期警報システム戦略には,フォーマットされた警告条件が含まれ,第三者の自動化プラットフォーム (例えば3Commas) と統合され,完全に自動化された取引を実現します.

  6. 透明な受験情報: 詳細なデビュー表が含まれており,重要な取引指標と状態を表示し,リアルタイムで監視し,戦略を最適化します.

戦略リスク

この戦略は多くの利点があるものの,以下の潜在的なリスクがあります.

  1. 資金損失のリスク: 強い下落傾向では,分層の加仓さえも深刻な損失を引き起こす可能性があります. 引き下がりは予想以上に起こりうる,特に市場の変動が突然増加した場合.

解決方法: トラッキングのストップ・パーセンテージとセーフティ・オーダーの間隔を特定の取引品種と時間枠に合わせて調整する. 追加の保護層として全局的なストップ・パーセンテージを追加することを検討する.

  1. パラメータ感度: 戦略の性能はEMAパラメータ,ATR倍数,追跡ストップセットに大きく依存する.パラメータの設定を誤って行うと,良いトレンドから早すぎる退出や悪いトレンドから遅すぎる退出を引き起こす可能性があります.

解決方法: 特定の取引品種と市場条件に対して,詳細な反省と最適化を行う. 適応パラメータ調整メカニズムを実施する.

  1. 起動していないセキュリティ命令のリスク: 迅速な反発の場合,安全命令は決して起動されない可能性があり,平均コストの機会を逃す可能性があります.

解決方法: タイムベースでの強制執行や特定の市場条件に応じて間隔を調整するなど,より柔軟なセキュリティオーダーのトリガーメカニズムを導入することを検討する.

  1. 過剰な取引横断市場では,EMAの交差が頻繁に起こり,過度取引と手数料のコストが増加する可能性があります.

解決方法: 波動性下落やトレンド強度確認などの取引フィルターを追加する. 取引頻度を減らすために冷却期間を延長する.

  1. 技術指標に依存するこの戦略は,EMAの交差と価格行動に完全に依存し,基本的要素やマクロ市場の状況を無視しています.

解決方法: 基本的フィルターまたはリスク感情指標を統合することを検討し,確認信号としてクロスマーケット関連性チェックを追加する.

戦略最適化の方向性

戦略コードの詳細な分析に基づいて,以下のいくつかの可能性のある最適化方向が示されています.

  1. 適応パラメータの調整:市場の変動や取引量に基づいてEMA長さとATR倍数を自動的に調整する仕組みを実現する.例えば,高変動の環境でより長いEMAとより大きなATR倍数を使用し,低変動の環境でより短いEMAとより小さなATR倍数を使用する.これは,異なる市場条件における戦略の適応性を向上させるだろう.

  2. 複数の確認信号: 偽信号を減らすために,相対強弱指数 ((RSI),交差量またはブリン帯のような追加の確認指標を追加する. 入場信号を同時に確認する複数の技術指標を要求するフィルターを実現し,信号品質を向上させる.

  3. 動的資金配分: 市場状況と歴史的変動に応じて注文サイズを調整する.例えば,変動が低い,または歴史的に上昇する可能性が高い市場の段階でベース注文サイズを増加させ,リスクの高い環境では減少させる.

  4. スマート脱退戦略: 部分利益のメカニズムを実現し,単一の平仓ではなく,異なる利益レベルで段階的な退出を許可する.これは,複数の利益目標と相応の退出比率を設定して,リスクと報酬の比率を最適化することによって実現できる.

  5. 感情指標の統合: 市場情緒分析,例えば恐怖と貪欲の指数や取引量分析を追加して,入場と出場のための追加のフィルターとして.これは,戦略が極端な市場情緒の時期に不必要な取引を避けるのを助けます.

  6. リスク暴露管理: 最大リスク露出を動的に計算する機能 ((すべての可能な安全注文の合計) を実装し,受け入れ可能な最大リスク制限を設定します.これは,戦略が1つの取引に資金を過度に露出させないようにすることを保証します.

要約する

指数移動平均クロスインテリジェント定投鎖型ストップトラッキングシステムは,トレンド検出,分層加減,および高度なストップ管理を組み合わせた,精巧に設計された量化取引戦略である.その核心的な優点は,市場の変動に適応する能力,スマートな資金管理,および二重利潤保護システムにある.この戦略は,トレンドが十分な持続性と方向性を持つ中等波動性の市場環境に特に適している.

適切なパラメータの最適化と推奨の強化により,この戦略はさらに性能と安定性を向上させることができます.特に,自主的なパラメータの調整と複数の確認シグナルは,入場品質を大幅に向上させることができ,ダイナミックな資金配分とスマートな退出戦略は,リスクリターン特性を最適化できます.

最終的には,この戦略は,取引ごとに利益の最大化を追求するよりも,資金の保存と一致性に重点を置くバランスの取れた量的な取引方法を表しています.これは,個人リスクの好みと市場条件に応じてカスタマイズできる強力な枠組みを提供し,長期的な持続可能な取引結果を潜在的に実現します.

ストラテジーソースコード
/*backtest
start: 2025-04-15 00:00:00
end: 2025-07-13 19:30:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT","balance":200000}]
*/

//@version=5
strategy(
     title="DCA + Dual Trailing Strategy", 
     overlay=true 
     )

// --- Trend ---
fastMALen = input.int(9, title="Fast EMA Length")
slowMALen = input.int(21, title="Slow EMA Length")

// --- Trailing Stops ---
trailStopPerc   = input.float(8.0, title="Standard Trailing Stop (%)", minval=0.1) / 100
lockInThreshold = input.float(2.5,  title="Profit Lock-In Trigger (%)", minval=0.1) / 100
lockInTrailPct  = input.float(1.5,  title="Lock-In Trail (%) after Trigger", minval=0.1) / 100

// --- Safety Orders (SO) ---
useATRSpacing     = input.bool(true, title="Use ATR-Based Spacing?")
atrLength         = input.int(14,   title="ATR Length", minval=1)
atrSo1Multiplier  = input.float(1.2, title="ATR SO1 Multiplier", minval=0.1)
atrSo2Multiplier  = input.float(2.5, title="ATR SO2 Multiplier", minval=0.1)

// --- Fallback SO Spacing (if not using ATR) ---
fallbackSo1Perc = input.float(4.0,  title="Fallback SO1 Drop (%) ", minval=0.1) / 100
fallbackSo2Perc = input.float(8.0, title="Fallback SO2 Drop (%) ", minval=0.1) / 100

// --- Entry Cooldown ---
cooldownBars = input.int(4, "Cooldown Bars After Base Entry", minval=0)

// --- Order Sizes in USD ---
baseUsd = input.float(10000.0, title="Base Order Size (USD)", minval=1.0)
so1Usd  = input.float(12500.0, title="Safety Order 1 Size (USD)", minval=1.0)
so2Usd  = input.float(17500.0, title="Safety Order 2 Size (USD)", minval=1.0)

// 2) CALCULATIONS

// --- Trend & Reversal Detection ---
fastMA    = ta.ema(close, fastMALen)
slowMA    = ta.ema(close, slowMALen)
trendUp   = ta.crossover(fastMA, slowMA)
trendDown = ta.crossunder(fastMA, slowMA)

// --- ATR Value ---
atrValue = ta.atr(atrLength)

// 3) BASE ENTRY LOGIC

// Base Buy Signal: EMA crossover
baseBuySignal = trendUp

var int   lastBuyBar     = na // Tracks the bar index of the last base entry
inCooldown = not na(lastBuyBar) and (bar_index - lastBuyBar < cooldownBars)

var float baseEntryPrice = na // Stores the price of the initial base entry for SO calculations

// --- Execute Base Entry ---
if baseBuySignal and strategy.position_size == 0 and not inCooldown
    baseQty = baseUsd / close // Calculate quantity based on USD
    strategy.order("Base Order", strategy.long, qty=baseQty, comment="Base Entry")
    baseEntryPrice := close
    lastBuyBar     := bar_index

// 4) SAFETY ORDERS LOGIC

// --- Calculate SO Trigger Prices ---
float so1TriggerPrice = na
float so2TriggerPrice = na

if strategy.position_size > 0 // Only calculate if a base order has been placed
    so1TriggerPrice := useATRSpacing ?
         (baseEntryPrice - atrValue * atrSo1Multiplier) :
         (baseEntryPrice * (1 - fallbackSo1Perc))

    so2TriggerPrice := useATRSpacing ?
         (baseEntryPrice - atrValue * atrSo2Multiplier) :
         (baseEntryPrice * (1 - fallbackSo2Perc))


// --- Conditions for SO Execution ---
// Added 'inDateRange' check
// Ensure base order exists, price trigger hit, and the specific SO hasn't filled yet
bool so1Condition = strategy.position_size > 0 and close <= so1TriggerPrice and strategy.opentrades == 1
bool so2Condition = strategy.position_size > 0 and close <= so2TriggerPrice and strategy.opentrades == 2


// --- Execute SO1 ---
if so1Condition
    so1Qty = so1Usd / close // Calculate quantity based on USD
    strategy.order("Safety Order 1", strategy.long, qty=so1Qty, comment="SO1")

// --- Execute SO2 ---
if so2Condition
    so2Qty = so2Usd / close // Calculate quantity based on USD
    strategy.order("Safety Order 2", strategy.long, qty=so2Qty, comment="SO2")

// 5) AVERAGE ENTRY PRICE

// Use the built-in variable for the average price of the open position
avgEntryPrice = strategy.position_avg_price

// 6) DUAL TRAILING STOP LOGIC

// Variables to track trailing stop levels and states
var float highestSinceEntry = na
var float trailStopPrice    = na
var bool  stopHitNormal     = false

var bool  lockInTriggered = false
var float lockInPeak      = na
var float lockInStopPrice = na
var bool  stopHitLockIn   = false

// --- Update Trailing Logic when in a Position ---
if strategy.position_size > 0
    // --- Standard Trail ---
    highestSinceEntry := na(highestSinceEntry) ? close : math.max(highestSinceEntry, close)
    trailStopPrice    := highestSinceEntry * (1 - trailStopPerc)
    stopHitNormal     := close < trailStopPrice

    // --- Lock-In Trail ---
    if not lockInTriggered and close >= avgEntryPrice * (1 + lockInThreshold)
        lockInTriggered := true
        lockInPeak      := close

    if lockInTriggered
        lockInPeak      := math.max(lockInPeak, close)
        lockInStopPrice := lockInPeak * (1 - lockInTrailPct)
        stopHitLockIn   := close < lockInStopPrice
    else
        stopHitLockIn   := false
        lockInStopPrice := na

// --- Reset Variables when Flat ---
else

    highestSinceEntry := na
    trailStopPrice    := na
    stopHitNormal     := false

    lockInTriggered   := false
    lockInPeak        := na
    lockInStopPrice   := na
    stopHitLockIn     := false


    // lastBuyBar is intentionally NOT reset here, cooldown depends on it

// 7) EXIT CONDITIONS

// Added 'inDateRange' check
// Exit if either trailing stop is hit OR if the trend reverses downward
exitCondition = (stopHitNormal or stopHitLockIn or trendDown) and strategy.position_size > 0

if exitCondition
    strategy.close_all(comment="Exit: SL / LockIn / TrendDown")


// 9) PLOTS & DEBUG TABLE

// --- Plot MAs ---
plot(fastMA, color=color.new(color.green, 0), title="Fast EMA", linewidth=2)
plot(slowMA, color=color.new(color.red, 0),   title="Slow EMA", linewidth=2)

// --- Plot Trailing Stops ---
plot(strategy.position_size > 0 ? trailStopPrice : na, color=color.new(color.orange, 0), title="Standard Trailing Stop", style=plot.style_linebr, linewidth=2)
plot(lockInTriggered ? lockInStopPrice : na, color=color.new(color.fuchsia, 0), title="Lock-In Trailing Stop", style=plot.style_linebr, linewidth=2)