지수 이동 평균 교차 지능형 고정 투자 체인 손절 추적 시스템

EMA DCA ATR SO SL
생성 날짜: 2025-04-16 15:30:15 마지막으로 수정됨: 2025-07-17 08:57:10
복사: 7 클릭수: 387
avatar of ianzeng123 ianzeng123
2
집중하다
319
수행원

지수 이동 평균 교차 지능형 고정 투자 체인 손절 추적 시스템 지수 이동 평균 교차 지능형 고정 투자 체인 손절 추적 시스템

개요

지수 이동 평균 교차 지능형 투기 체인형 손실 추적 시스템은 기술 분석과 정밀 자금 관리에 기반한 양적 거래 전략이다. 이 전략은 지수 이동 평균 (EMA) 교차 신호를 사용하여 잠재적인 상승 추세를 식별하고, 달러 비용 평균법 (DCA) 과 결합하여 지능적인 입장을 수행하고, 쌍방향 중지 장치로 수익을 보호한다. 전략의 핵심은 빠른 EMA와 느린 EMA의 교차를 사용하여 진입 시점을 결정하고, 가격이 떨어지면 자동으로 최대 두 개의 안전 주문 (Safety Orders) 을 배치하고, 평균 실제 변동 범위 (ATR) 또는 고정 비율로 입장을 계산하고, 쌍방향 손실 추적 시스템 표준을 사용하여 손실을 추적한다.

전략 원칙

이 전략은 다음과 같은 몇 가지 핵심 요소를 기반으로 작동합니다.

  1. 트렌드 식별 메커니즘: 빠른 EMA (기본 9주기) 와 느린 EMA (기본 21주기) 의 교차를 사용하여 잠재적인 상승 추세를 식별한다. 빠른 EMA가 느린 EMA를 상향으로 가로지르면 시스템이 구매 신호를 발생시킨다.

  2. 기본 주문과 보안 주문이 전략은 기본 주문 (기본 주문은 \(1,000) 에서 시작하여 SO1 (기본 주문은 \)1,250), SO2 (기본 주문은 $1,750) 에서 시작하여 가격 하락에 따라 두 개의 추가 보안 주문을 추가하는 계층화 된 자금 관리 방법을 사용합니다.

  3. 동적 간격 계산보안 주문의 발동 가격은 두 가지 방법으로 계산할 수 있습니다.

    • 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. 이중 이익 보호이중 추적 중지 시스템은 혁신적인 위험 관리를 제공하며, 표준 추적 중단은 대부분의 자금을 보호하고, 이익 잠금 메커니즘은 특정 수익 목표가 달성되면 활성화되어 더 긴밀하게 백분율로 이미 얻은 이익을 보호합니다.

  4. 완전히 맞춤형: 모든 핵심 매개 변수들 (EMA 길이, 주문 크기, 추적 스톱 로즈 비율, 안전 주문 간격) 은 거래자의 위험 선호와 시장 조건에 따라 조정할 수 있습니다.

  5. 융합된 사전 경보 시스템: 전략에는 형식화된 예고 조건이 포함되어 있으며, 3Commas와 같은 제3자 자동화 플랫폼과 통합하여 완전히 자동화된 거래를 구현할 수 있습니다.

  6. 투명성: 상세한 시동표가 포함되어 있으며, 주요 거래 지표와 상태를 표시하여 실시간 모니터링과 전략 최적화를 용이하게 합니다.

전략적 위험

이 전략은 여러 장점이 있지만 다음과 같은 잠재적인 위험도 있습니다.

  1. 자금 손실 위험: 강한 하향 추세에서, 계층적 인수도 심각한 손실을 초래할 수 있습니다. 회수율은 예상보다 높을 수 있습니다. 특히 시장의 변동성이 급격히 증가하는 경우.

해결 방법: 특정 거래 유형과 시간 프레임에 따라 추적 중지 손실 비율과 보안 주문 간격을 조정합니다. 추가 보호 계층으로 전 세계 중지 손실을 추가하는 것을 고려하십시오.

  1. 매개변수 민감도전략 성능은 EMA 변수, ATR 곱하기 및 추적 중지 설정에 크게 의존합니다. 변수 설정이 잘못되면 우수한 추세에서 조기 퇴출하거나 나쁜 추세에서 너무 늦게 퇴출 할 수 있습니다.

해결 방법: 특정 거래 종류와 시장 조건에 대한 철저한 피드백과 최적화; 적응 변수 조정 메커니즘을 구현한다.

  1. 보안 명령이 활성화되지 않은 위험: 급격한 반발의 경우, 보안 명령은 결코 활성화되지 않을 수 있으며, 이는 평균 비용을 놓칠 수 있는 기회를 초래한다.

해결 방법: 특정 시장 조건에 따라 시간 기반의 강제 실행 또는 간격 조정과 같은 보다 유연한 보안 주문 트리거 메커니즘을 적용하는 것을 고려하십시오.

  1. 과도한 거래상자 시장에서는 EMA 교차가 자주 발생할 수 있으며, 과도한 거래와 수수료 비용이 증가합니다.

*해결 방법*거래 필터를 추가합니다. 예를 들어, 변동성 하락 또는 트렌드 강도 확인; 거래 빈도를 줄이기 위해 냉각 기간을 연장합니다.

  1. 기술 지표 의존이 전략은 EMA의 교차와 가격행동에 전적으로 의존하며, 기본 요소와 거시 시장 상황을 무시한다.

*해결 방법*기본 필터 또는 위험 감정 지표를 통합하는 것을 고려하십시오. 확인 신호로 시장 간 연관성 검사를 추가하십시오.

전략 최적화 방향

정책 코드의 심층적인 분석을 바탕으로 몇 가지 가능한 최적화 방향은 다음과 같습니다.

  1. 적응 변수 조정: 시장의 변동성이나 거래량에 따라 EMA 길이를 자동으로 조정하는 메커니즘을 구현한다. 예를 들어, 높은 변동성 환경에서 긴 EMA와 큰 ATR 곱수를 사용하거나 낮은 변동성 환경에서 짧은 EMA와 작은 ATR 곱수를 사용한다. 이것은 다양한 시장 조건에 대한 전략의 적응성을 향상시킵니다.

  2. 다중 확인 신호: 상대적으로 약한 지수 ((RSI) 와 교차량 또는 브린 밴드와 같은 추가 확인 지표를 추가하여 가짜 신호를 줄일 수 있다. 필터를 구현하여 여러 기술 지표가 동시에 입력 신호를 확인하여 신호 품질을 향상시킬 수 있다.

  3. 역동적인 재원 분배: 시장 상황과 역사적인 변동성에 따라 주문 크기를 조정한다. 예를 들어, 변동성이 낮거나 역사적으로 상승할 가능성이 높은 시장 단계에서 기본 주문 크기를 증가시키고, 고위험 환경에서 감소한다.

  4. 똑똑한 탈퇴 전략: 부분 수익 메커니즘을 구현하여 한 번의 평형이 아닌 다양한 수익 수준에서 점진적으로 퇴출 할 수 있습니다. 이것은 여러 수익 목표와 그에 따른 퇴출 비율을 설정하여 리스크 수익률을 최적화 할 수 있습니다.

  5. 감정 지표 통합: 시장 감정 분석을 추가합니다. 공포와 탐욕 지수 또는 거래량 분석은 입출금에 대한 추가 필터입니다. 이것은 극단적인 시장 감정 기간에 전략이 불필요한 거래를 피하는 데 도움이 될 것입니다.

  6. 위험 노출 관리: 동적으로 최대 위험 노출을 계산하는 기능을 구현하고, 허용 가능한 최대 위험 한계를 설정합니다. 이것은 전략이 한 거래에 돈을 과도하게 노출하지 않도록 보장합니다.

요약하다

지수 이동 평균 교차 지능형 고정 스펙트럼형 손실 추적 시스템은 트렌드 탐지, 계층적 포지션 및 고급 손실 관리를 결합한 정교하게 설계된 양적 거래 전략이다. 그것의 핵심 장점은 시장의 변동에 적응하는 능력, 지능형 자금 관리 및 쌍 계층 이익 보호 시스템이다. 이 전략은 특히 트렌드가 충분한 지속성과 방향성을 갖는 중간 변동성 시장 환경에 적합하다.

적절한 변수 최적화와 권고의 강화로 이 전략은 그 성능과 안정성을 더욱 향상시킬 수 있다. 특히, 적응 변수 조정과 여러 확인 신호는 진출의 질을 크게 향상시킬 수 있으며, 동적 자금 분배와 지능적인 탈퇴 전략은 위험의 수익 특성을 최적화할 수 있다.

결국, 이 전략은 거래당 수익을 극대화하기보다는 자금 보존과 일관성에 중점을 둔 균형 잡힌 양적 거래 방법을 나타냅니다. 개인 위험 선호와 시장 조건에 따라 사용자 정의 할 수있는 강력한 프레임 워크를 제공하여 장기적으로 지속 가능한 거래 결과를 잠재적으로 달성 할 수 있습니다.

전략 소스 코드
/*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)