리소스 로딩... 로딩...

엘더의 힘 지수 표준편차와 이동 평균에 기초한 양적 거래 전략

저자:차오장, 날짜: 2024-11-28 17:08:24
태그:EFIATREMASMASD

img

전반적인 설명

이 전략은 엘더스 포스 인덱스 (EFI) 를 기반으로 한 양적 거래 시스템으로, 신호 발생을 위해 표준 편차와 이동 평균을 결합하고, 동적 스톱 로스 및 영리 포지셔닝을 위해 ATR을 사용합니다. 이 전략은 빠르고 느린 EFI 지표를 계산하고 표준 편차를 사용하여 정상화하고 크로스 오버 분석을 통해 거래 신호를 생성하여 완전한 거래 시스템을 만듭니다. 더 높은 수익을 추구하면서 위험을 효과적으로 제어하기 위해 동적 스톱 로스 및 트레일링 영리 메커니즘을 사용합니다.

전략 원칙

이 전략은 몇 가지 핵심 요소에 기반합니다.

  1. 두 개의 다른 기간 (13 및 50) 을 사용하여 빠르고 느린 힘 지수를 계산합니다.
  2. 신호를 통계적으로 의미있게 만들기 위해 표준편차를 사용하여 두 EFI 기간을 정상화합니다.
  3. 빠른 EFI와 느린 EFI가 동시에 표준편차 임계값을 넘을 때 긴 신호를 생성합니다.
  4. 빠른 EFI와 느린 EFI가 동시에 표준편차 문턱을 넘을 때 짧은 신호를 생성합니다.
  5. ATR을 가격 움직임에 따라 조정되는 동적 스톱 로스 포지셔닝을 위해 사용합니다.
  6. ATR 기반의 후속 영업 취득 메커니즘을 구현하여 수익을 보호하고 증가시킵니다.

전략적 장점

  1. 신호 시스템은 동력과 변동성을 결합하여 거래 신뢰성을 향상시킵니다.
  2. 표준편차 정상화는 신호를 통계적으로 유의미하게 만들고 거짓 신호를 감소시킵니다.
  3. 동적 스톱 로스 메커니즘은 위험을 효과적으로 제어하고 큰 마이너운드를 방지합니다.
  4. 이윤 취득 메커니즘은 이윤을 보호하고 성장시킬 수 있습니다.
  5. 조정 가능한 매개 변수와 함께 명확한 전략 논리, 다양한 시장에서 최적화를 위해 적합

전략 위험

  1. 매우 변동적인 시장에서 잘못된 신호를 생성 할 수 있으며 추가 필터링 메커니즘이 필요합니다.
  2. 민감한 매개 변수 선택은 거래 비용을 증가시키는 과잉 거래로 이어질 수 있습니다.
  3. 전략 성과에 영향을 미치는 트렌드 반전 지점의 잠재적 지연
  4. 부적절한 스톱 로스 포지셔닝은 조기 종료 또는 과도한 손실로 이어질 수 있습니다.
  5. 전략 수익에 대한 거래 비용의 영향을 고려해야 합니다.

최적화 방향

  1. 다른 시장 상태에서 다른 매개 변수를 사용하기 위해 시장 조건 평가 메커니즘을 추가합니다.
  2. 신호 신뢰성 향상을 위해 볼륨 필터를 도입
  3. 시장 변동에 더 잘 적응하기 위해 스톱 로스 및 영업 매개 변수를 최적화
  4. 트렌드 필터를 추가하여 다양한 시장에서 빈번한 거래를 피합니다.
  5. 불리한 기간 동안 거래를 피하기 위해 시간 필터를 추가하는 것을 고려하십시오.

요약

이 전략은 EFI 지표, 표준편차 및 ATR를 결합하여 완전한 거래 시스템을 구축합니다. 이 전략의 강점은 높은 신호 신뢰성과 합리적인 위험 통제에 있습니다. 그러나 여전히 다른 시장 환경에 대한 최적화가 필요합니다. 시장 상태 평가, 볼륨 필터링 및 기타 메커니즘을 추가하여 전략의 안정성과 수익성이 더욱 향상 될 수 있습니다. 전반적으로 실용적인 가치와 함께 탄탄한 양적 거래 프레임워크를 제공합니다.


/*backtest
start: 2019-12-23 08:00:00
end: 2024-11-27 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Elder's Force Index Strategy with ATR-Based SL and TP", overlay=true)

// Input parameters for fast and long EFI
efi_fast_length = input.int(13, "Fast EFI Length", minval=1)
efi_long_length = input.int(50, "Long EFI Length", minval=1)
stdev_length = input.int(50, "Standard Deviation Length", minval=2, maxval=300)
numdev = input.float(2, "Number of Deviations", minval=1, maxval=20, step=0.1)
atr_length = input.int(14, "ATR Length", minval=1)
atr_multiplier_sl = input.float(1.5, "ATR Multiplier for Stop Loss", step=0.1)
trailing_tp_multiplier = input.float(0.5, "Multiplier for Trailing Take Profit", step=0.1)

// Elder's Force Index Calculation for Fast and Long EFI
efi_fast = ta.ema((close - close[1]) * volume, efi_fast_length)
efi_long = ta.ema((close - close[1]) * volume, efi_long_length)

// Calculate Standard Deviation for Fast EFI
efi_fast_average = ta.sma(efi_fast, stdev_length)
efi_fast_stdev = ta.stdev(efi_fast, stdev_length)
efi_fast_diff = efi_fast - efi_fast_average
efi_fast_result = efi_fast_diff / efi_fast_stdev

// Calculate Standard Deviation for Long EFI
efi_long_average = ta.sma(efi_long, stdev_length)
efi_long_stdev = ta.stdev(efi_long, stdev_length)
efi_long_diff = efi_long - efi_long_average
efi_long_result = efi_long_diff / efi_long_stdev

// Define upper and lower standard deviation levels
upper_sd = numdev
lower_sd = -numdev

// Define entry conditions based on crossing upper and lower standard deviations
long_condition = efi_fast_result > upper_sd and efi_long_result > upper_sd
short_condition = efi_fast_result < lower_sd and efi_long_result < lower_sd

// Check if a position is already open
is_position_open = strategy.position_size != 0

// Calculate ATR for stop loss and take profit
atr = ta.atr(atr_length)

// Initialize stop loss and take profit variables
var float stop_loss = na
var float take_profit = na

// Execute trades based on conditions, ensuring only one trade at a time
if (long_condition and not is_position_open)
    strategy.entry("Long", strategy.long)
    stop_loss := close - atr * atr_multiplier_sl  // Set initial stop loss based on ATR
    take_profit := close + atr * trailing_tp_multiplier  // Set initial take profit based on ATR

if (short_condition and not is_position_open)
    strategy.entry("Short", strategy.short)
    stop_loss := close + atr * atr_multiplier_sl  // Set initial stop loss based on ATR
    take_profit := close - atr * trailing_tp_multiplier  // Set initial take profit based on ATR

// Update exit conditions
if (is_position_open)
    // Update stop loss for trailing
    if (strategy.position_size > 0)  // For long positions
        stop_loss := math.max(stop_loss, close - atr * atr_multiplier_sl)
        
        // Adjust take profit based on price movement
        take_profit := math.max(take_profit, close + atr * trailing_tp_multiplier)

    else if (strategy.position_size < 0)  // For short positions
        stop_loss := math.min(stop_loss, close + atr * atr_multiplier_sl)
        
        // Adjust take profit based on price movement
        take_profit := math.min(take_profit, close - atr * trailing_tp_multiplier)

    // Set exit conditions
    strategy.exit("Long Exit", from_entry="Long", stop=stop_loss, limit=take_profit)
    strategy.exit("Short Exit", from_entry="Short", stop=stop_loss, limit=take_profit)


관련

더 많은