
この戦略は,指数移動平均 (EMA) 交差信号に基づくスマートドルコスト平均 (DCA) 戦略であり,自適性的な変動性のあるセキュリティオーダーの (SO) 展開と革新的な二線ストップメカニズムを組み合わせている.上昇傾向が確認されたときに市場に入り,その後,市場の変動性に応じて追加のセキュリティオーダーを自動的に展開し,標準的なトラッキングストップと利益のロック追跡システムを使用して利益を保護する.この戦略は,特に波動性の高い市場環境で動作するのに適しており,1時間の周期に最適化され,総資金が4000ドルの取引操作を使用しています.
この戦略の核心的な論理は,以下の重要な要素を中心に展開されています.
トレンド認識システム: 潜在的な上昇傾向を識別するために,高速EMA ((デフォルト9サイクル) とスローEMA ((デフォルト21サイクル) の交差を使用する.高速EMAがスローEMAを上向きに通過すると,システムは上昇傾向を確認し,ベースエントリーオーダーを誘発する.
多層 DCA アクセスシステム戦略は3段階の入学メカニズムです
波動的自己適応機構: セキュリティオーダーのトリガー価格はATR ((平均実数範囲) の指標に基づいて動的に計算され,市場における現在の変動状況に応じて戦略が自動的に入場位置を調整できるようにする.ユーザーはATRの倍数 ((デフォルトSO1はATRの1.2倍,SO2はATRの2.5倍) または固定パーセントの下落 ((デフォルトSO1は4%で,SO2は8%) を使用してセキュリティオーダーのトリガーポイントを計算するオプションがある.
双線路の防犯システム:
冷却期メカニズム: 基本注文の実行後に冷却期を適用する ((デフォルト4Kライン),短時間で過度の取引を防止する。
この戦略は,分析した結果,以下のような大きな利点を示しています.
適応力があるATRによる安全注文のトリガー価格の計算により,戦略が異なる市場の変動環境に賢く適応し,高い波動期には適切な安全注文の間隔を広げ,低い波動期には間隔を緊縮することができます.
資金管理の最適化: 増加する資金配分方法 ((1000ドル→1250ドル→1750ドル) を採用し, “ピラミッド式”のポジション管理原則に適合し,価格が下がる時に戦略がより大きな資金規模でより優良な平均入場価格を得ることを可能にします.
双重保護機構: 革新的な二線ストップシステムは,基本的な下行リスク保護を提供し,利益の発生時に自動的により保守的なストップモードに切り替えることができ,利益の最大化とリスク管理を効果的にバランスさせます.
柔軟性をカスタマイズ: EMA周期,ATR長さ,セーフードオーダーの間隔,ストップ・ロズ比率,オーダーのサイズなど,すべての重要なパラメータをカスタマイズでき,個人リスクの好みや市場状況に応じて最適化することができます.
統合性: 策略は,JSONメッセージとしてフォーマットされた警告条件を内蔵し,第三者の自動取引プラットフォーム (例えば3Commas) と統合し,完全な自動取引実行を実現します.
この戦略は包括的に設計されていますが,以下の潜在的なリスクと課題があります.
トレンド反転リスク策略はEMA交差信号に依存し,市場の急速な変化や揺れ動いている市場で誤信号が生じ,不必要な入場を引き起こす可能性があります. 解決策はEMA周期の長さを調整するか,追加の確認指標を追加することです.
資金の消耗のリスク: 継続的に下落する市場では,すべてのセキュリティオーダーが展開されても,平均エントリー価格は市場価格よりはるかに高くなり,長期の損失につながる可能性があります. 最大損失制限または全体的なポジションサイズ制限を設定することが推奨されています.
過剰取引のリスク: 波動的な市場では,EMAは頻繁に交差し,過度に取引を誘発する可能性があります. 冷却期メカニズムが内蔵されているにもかかわらず,さらなる最適化または追加の取引頻度制限が必要になる可能性があります.
双線停止は互いに干渉する: いくつかの市場の状況では,この2つのストップメカニズムが相互に干渉し,早期退出または反復シグナルを引き起こす可能性があります. この2つのストップパラメータのバランスは定期的に再測定され,調整されるべきです.
パラメータ最適化の難しさ: 戦略の複数のパラメータが相互に協調して最適な効果を得ることが必要であり,パラメータ最適化の複雑さを増す. 総括的なパラメータ分析を回帰最適化ツールを使用して行うことを推奨する.
この戦略の潜在的最適化方向は以下の通りです.
多重トレンド確認メカニズムの導入:現在の戦略は単一のEMAの交差信号のみに依存している. 誤った信号を減らすために,RSI,MACD,またはより長い周期のトレンド判断などの追加のトレンド確認指標を追加することを考慮することができます.
ダイナミックな資金配分システム: 現行の戦略は,注文サイズとして固定されたドル額を使用し,市場の変動または口座の利益に基づくダイナミックな調整システムとして最適化され,異なる市場条件下で適切なリスク露出レベルが維持されることを保証します.
最適化された止損退出策: より複雑なストップロジックを開発できる.例えば,市場の変動に基づく自律的なストップトラッキング,または,短期的な変動で早期退出を避けるために,離脱決定を最適化するために動量と取引量指標を統合する.
撤回規制強化: 戦略が既定の最大撤回比率に達すると,新しい注文を自動的に停止したり,既存のポジションを閉鎖したりする,極端な市場条件下での壊滅的な損失を防止する,全額撤回制限機能を追加した.
サイクル最適化システム: 自動サイクル最適化機能を開発し,近年の市場状況に基づいて,戦略が自動的にEMAの長さ,ATRサイクル,および他の時間に関連するパラメータを,市場状態の変化に適応するように調整できるようにする.
“インテリジェントの波動追跡型DCA戦略と双線ストップシステム”は,優れた設計の量化取引方案で,波動的な市場での上昇傾向を捕捉し,リスクを管理するのに特に適しています. それは巧妙にトレンド追跡,ドルコスト平均法と波動率自適化メカニズムを組み合わせ,革新的な双線ストップシステムで利益を保護しています.
この戦略の核心的な優点は,その適応性とリスク管理のバランスであり,異なる市場環境で自動的に入場と出場の決定を調整できるという点にある.ATRを使用することで,安全注文のトリガーポイントを動的に計算することで,戦略は,既定の静的なパラメータに依存するのではなく,リアルタイム市場条件に基づいてスマートに反応することができる.
トレンド識別と資金管理に関する潜在的なリスクはありますが,これらのリスクは,提案された最適化方向によって効果的に緩和できます. 特に,複数のトレンド確認とダイナミックな資金配分システムの導入により,戦略の安定性と長期的なパフォーマンスは著しく向上します.
この戦略は,波動的な市場で体系的な取引方法を探している定量トレーダーにとって,上向きのトレンドの機会を捉え,不利な市場条件下で十分なリスク保護を提供する,包括的で拡張可能な枠組みを提供します.
/*backtest
start: 2025-03-14 00:00:00
end: 2025-04-02 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=5
strategy(
title="BONK/USD (1H) - $4k DCA + Dual Trailing + Date Filter", // Updated Title
overlay=true,
initial_capital=4000,
currency=currency.USD,
default_qty_type=strategy.fixed,
default_qty_value=0, // Quantity calculated dynamically based on USD value
commission_type=strategy.commission.percent, // Example: Add commission settings
commission_value=0.1 // Example: 0.1% commission
)
// 1) USER INPUTS (Defaults adjusted for 1H timeframe - REQUIRES BACKTESTING/TUNING)
// --- Trend ---
fastMALen = input.int(9, title="Fast EMA Length (Default for 1H)")
slowMALen = input.int(21, title="Slow EMA Length (Default for 1H)")
// --- Trailing Stops ---
trailStopPerc = input.float(8.0, title="Standard Trailing Stop (%) (Default for 1H)", minval=0.1) / 100
lockInThreshold = input.float(2.5, title="Profit Lock-In Trigger (%) (Default for 1H)", minval=0.1) / 100
lockInTrailPct = input.float(1.5, title="Lock-In Trail (%) after Trigger (Default for 1H)", 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 (Default for 1H)", minval=0.1)
atrSo2Multiplier = input.float(2.5, title="ATR SO2 Multiplier (Default for 1H)", minval=0.1)
// --- Fallback SO Spacing (if not using ATR) ---
fallbackSo1Perc = input.float(4.0, title="Fallback SO1 Drop (%) (Default for 1H)", minval=0.1) / 100
fallbackSo2Perc = input.float(8.0, title="Fallback SO2 Drop (%) (Default for 1H)", minval=0.1) / 100
// --- Entry Cooldown ---
cooldownBars = input.int(4, "Cooldown Bars After Base Entry (Default for 1H)", minval=0)
// --- Order Sizes in USD ---
baseUsd = input.float(1000.0, title="Base Order Size (USD)", minval=1.0)
so1Usd = input.float(1250.0, title="Safety Order 1 Size (USD)", minval=1.0)
so2Usd = input.float(1750.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 ---
// Added 'inDateRange' to the condition
if baseBuySignal and strategy.position_size == 0 and not inCooldown
baseQty = baseUsd / close // Calculate quantity based on USD
strategy.entry("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 not na(baseEntryPrice) // 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 = not na(baseEntryPrice) and strategy.position_size > 0 and close <= so1TriggerPrice and strategy.opentrades == 1
bool so2Condition = not na(baseEntryPrice) and strategy.position_size > 0 and close <= so2TriggerPrice and strategy.opentrades == 2
// --- Execute SO1 ---
if so1Condition
so1Qty = so1Usd / close // Calculate quantity based on USD
strategy.entry("Safety Order 1", strategy.long, qty=so1Qty, comment="SO1")
// --- Execute SO2 ---
if so2Condition
so2Qty = so2Usd / close // Calculate quantity based on USD
strategy.entry("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
baseEntryPrice := na
// 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, within the active date range
exitCondition = (stopHitNormal or stopHitLockIn or trendDown) and strategy.position_size > 0
if exitCondition
strategy.close_all(comment="Exit: SL / LockIn / TrendDown")
// 8) ALERT CONDITIONS (Potential 3Commas Integration)
// WARNING: Verify and adapt these JSON message strings for your specific 3Commas bot configuration!
// The required format ('action', parameters, etc.) can vary.
// Added 'inDateRange[1]' check for Base Alert
alertcondition(inDateRange[1] and baseBuySignal and strategy.position_size[1] == 0 and not inCooldown[1],
title="Base Buy Alert",
message='{"action":"start_deal","order":"base"} // Verify/Adapt JSON for your 3Commas bot!')
// Added 'inDateRange' check for SO1 Alert
alertcondition(so1Condition, title="SO1 Alert",
message='{"action":"add_funds","order":"so1"} // Verify/Adapt JSON for your 3Commas bot!')
// Added 'inDateRange' check for SO2 Alert
alertcondition(so2Condition, title="SO2 Alert",
message='{"action":"add_funds","order":"so2"} // Verify/Adapt JSON for your 3Commas bot!')
// Added 'inDateRange' check for Exit Alert
alertcondition(exitCondition, title="Exit Alert",
message='{"action":"close_at_market_price"} // Verify/Adapt JSON for your 3Commas bot!')
// 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)
// --- Debug Info Table ---
var table tradeInfo = table.new(position=position.bottom_right, columns=2, rows=10, border_width=1)