
指数移動平均クロスインテリジェント投機式ストップトラッキングシステムは,技術分析と精細な資金管理に基づく量化取引戦略である.指数移動平均 (EMA) のクロスシグナルを利用して,潜在的上昇傾向を識別し,ドルコスト平均法 (DCA) と組み合わせて,スマートな加仓を行い,ダブルトラッキングストップトラッキングメカニズムで利益を保護する.戦略の中心は,急速EMAと遅いEMAのクロスを利用して,価格が下がったときにエントリー時間を決定し,最大2つのセキュリティオーダー (Safety Orders) を自動で展開し,平均リアル波動範囲 (ATR) または固定パーセントの計算により,加仓位置を計算し,ダブルトラッキングストップシステムの標準的なトラッキング (ストップトラッキング) を使用する.
この戦略は,以下のいくつかの重要な要素に基づいています.
トレンド識別: 潜在的な上昇傾向を識別するために,高速EMA (デフォルト9サイクル) と遅いEMA (デフォルト21サイクル) の交差を使用する.高速EMAが遅いEMAを上方へ通過すると,システムは買い信号を生成する.
基本命令と安全命令戦略は,階層化された資金管理方法を採用し,基本注文から開始し (デフォルトは1000ドル),価格が下がると2つの追加のセキュリティ注文を追加します (デフォルトは1250ドル,SO2は1750ドル).
ダイナミック間隔計算セキュリティオーダーのトリガー価格は,次の2つの方法で計算できます.
ダブル・トラッキング・ストロー・システム:
退出条件戦略は,次の状況で平仓する.
冷却期と日付のフィルター: 策略には,基本注文後の冷却期間 (デフォルトは4時間) と,特定の時間帯を制限するために選択可能な日付フィルターが含まれています.
この戦略のコードを詳しく分析すると,以下の主な利点が明らかになる.
適応性資金管理: 戦略は,ドルコスト平均法と動的セキュリティオーダーを組み合わせて,市場条件に応じて自動的にポジションを調整する.この方法は,波動的な市場において特に有効であり,平均入場価格を下げ,潜在的な利益を増やすことができる.
位置の変動による調整ATRは,セキュリティオーダーの位置を計算することで,戦略は,固定パーセント方法よりも柔軟に,現在の市場の変動に応じて,加仓間隔を自動的に調整することができます.
利益の2層の保護: ダブル・トラッキング・ストップ・システムは,革新的なリスク管理を提供し,標準のトラッキング・ストップは,資金の大部分を保護し,利益のロックメカニズムは,特定の利益目標を達成した後に活性化され,獲得した利益をより緊密な割合で保護する.
完全にカスタマイズできます: すべての重要なパラメータ (EMA長さ,オーダーサイズ,ストップ・パーセンテージ,セーフティー・オーダーの間隔) は,トレーダーのリスクの好みや市場条件に応じて調整できます.
集積された早期警報システム戦略には,フォーマットされた警告条件が含まれ,第三者の自動化プラットフォーム (例えば3Commas) と統合され,完全に自動化された取引を実現します.
透明な受験情報: 詳細なデビュー表が含まれており,重要な取引指標と状態を表示し,リアルタイムで監視し,戦略を最適化します.
この戦略は多くの利点があるものの,以下の潜在的なリスクがあります.
解決方法: トラッキングのストップ・パーセンテージとセーフティ・オーダーの間隔を特定の取引品種と時間枠に合わせて調整する. 追加の保護層として全局的なストップ・パーセンテージを追加することを検討する.
解決方法: 特定の取引品種と市場条件に対して,詳細な反省と最適化を行う. 適応パラメータ調整メカニズムを実施する.
解決方法: タイムベースでの強制執行や特定の市場条件に応じて間隔を調整するなど,より柔軟なセキュリティオーダーのトリガーメカニズムを導入することを検討する.
解決方法: 波動性下落やトレンド強度確認などの取引フィルターを追加する. 取引頻度を減らすために冷却期間を延長する.
解決方法: 基本的フィルターまたはリスク感情指標を統合することを検討し,確認信号としてクロスマーケット関連性チェックを追加する.
戦略コードの詳細な分析に基づいて,以下のいくつかの可能性のある最適化方向が示されています.
適応パラメータの調整:市場の変動や取引量に基づいてEMA長さとATR倍数を自動的に調整する仕組みを実現する.例えば,高変動の環境でより長いEMAとより大きなATR倍数を使用し,低変動の環境でより短いEMAとより小さなATR倍数を使用する.これは,異なる市場条件における戦略の適応性を向上させるだろう.
複数の確認信号: 偽信号を減らすために,相対強弱指数 ((RSI),交差量またはブリン帯のような追加の確認指標を追加する. 入場信号を同時に確認する複数の技術指標を要求するフィルターを実現し,信号品質を向上させる.
動的資金配分: 市場状況と歴史的変動に応じて注文サイズを調整する.例えば,変動が低い,または歴史的に上昇する可能性が高い市場の段階でベース注文サイズを増加させ,リスクの高い環境では減少させる.
スマート脱退戦略: 部分利益のメカニズムを実現し,単一の平仓ではなく,異なる利益レベルで段階的な退出を許可する.これは,複数の利益目標と相応の退出比率を設定して,リスクと報酬の比率を最適化することによって実現できる.
感情指標の統合: 市場情緒分析,例えば恐怖と貪欲の指数や取引量分析を追加して,入場と出場のための追加のフィルターとして.これは,戦略が極端な市場情緒の時期に不必要な取引を避けるのを助けます.
リスク暴露管理: 最大リスク露出を動的に計算する機能 ((すべての可能な安全注文の合計) を実装し,受け入れ可能な最大リスク制限を設定します.これは,戦略が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)