적응적 기하급수적 이동 평균 범위 전략

저자:차오장, 날짜: 2024-02-26 14:58:32
태그:

img

전반적인 설명

이 전략은 더 빠른 기하급수적 홀 이동 평균 (EHMA) 과 적응 채널을 사용하여 트렌드를 따르는 전략을 구축합니다. EHMA가 더 빨리 계산하기 때문에 가격 트렌드 변화를 효과적으로 식별하고 잘못된 브레이크로 인한 불필요한 거래를 피할 수 있습니다. 동시에 적응 채널은 일부 가격 변동을 필터링 할 수 있습니다. 거래는 가격이 채널을 통과 할 때만 시작되며 비효율적인 거래의 가능성을 줄이고 수익성을 높입니다.

전략 원칙

  1. 기간 매개 변수를 기반으로 지수 가중 이동 평균 EHMA를 계산합니다. EHMA는 더 빨리 계산하고 가격 트렌드 변화를 효과적으로 추적 할 수 있습니다.

  2. RangeWidth 매개 변수를 기반으로 EHMA 위와 아래의 적응 채널을 구축합니다. 가격이 상위 채널 라인을 넘거나 하위 채널 라인을 넘으면 트렌드가 변경된 것으로 간주되며 거래 신호가 활성화됩니다.

  3. 채널과의 가격 관계를 결정합니다. 가격이 상선을 넘을 때 긴, 하선을 넘을 때 짧은. 가격이 상선을 넘을 때 긴 포지션을 닫고, 가격이 하선을 넘을 때 짧은 포지션을 닫습니다.

이점 분석

일반 이동 평균 전략에 비해 이 전략은 다음과 같은 장점을 가지고 있습니다.

  1. 이동 평균을 계산하기 위해 EHMA 알고리즘을 사용하십시오. EHMA는 가격 변화에 더 민감하게 반응하고 잘못된 브레이크로 인한 불필요한 거래를 피하기 위해 트렌드 변화를 효과적으로 식별 할 수 있습니다.

  2. 적응 채널은 가격 변동을 효과적으로 필터링할 수 있습니다. 거래 신호는 가격 추세가 확고하게 변했을 때만 활성화됩니다. 이것은 일부 비효율적인 거래를 필터링하고 수익성을 향상시킬 수 있습니다.

  3. 채널 폭은 다양한 시장 조건에 적응하기 위해 유연하게 조정할 수 있습니다. 더 넓은 채널은 더 많은 변동을 필터링하고 거래 주파수를 줄일 수 있습니다. 좁은 채널은 트렌드 변화를 더 일찍 식별하고 거래 주파수를 증가시킬 수 있습니다.

위험 분석

이 전략에는 몇 가지 위험도 있습니다.

  1. 가짜 브레이크는 여전히 완전히 피할 수 없습니다. 가격은 채널을 넘어 갈 수 있습니다. 매개 변수는 위험을 조절하기 위해 적절히 조정해야합니다.

  2. 채널 이 너무 넓다면 어떤 거래 기회 는 놓칠 수 있다. 민감성 을 높이기 위해 합리적으로 채널 을 좁혀라.

  3. 너무 좁은 채널은 비효율적인 거래를 증가시킬 수 있습니다. 안정성을 높이기 위해 적절한 채널 폭을 확장하십시오.

최적화 방향

이 전략은 다음과 같은 측면에서 최적화 될 수 있습니다.

  1. 기간 매개 변수를 최적화합니다. 다른 제품과 시간 프레임에 적응하도록 이동 평균 계산 주기를 조정합니다.

  2. 범위를 최적화하고 시장 변동성과 개인적인 위험 선호도에 따라 채널 범위를 조정합니다.

  3. 스톱 로스 전략을 추가합니다. 거래당 최대 손실을 효과적으로 제어하기 위해 포지션을 보유하는 동안 합리적인 스톱 로스 포인트를 설정합니다.

  4. 항목 필터링을 위한 다른 지표와 결합합니다. 예를 들어, 잘못된 항목을 줄이기 위해 볼륨을 추가합니다.

  5. 전략 응용 프로그램을 다양화하고 매개 변수를 최적화합니다. 더 많은 제품과 시간 프레임에서 보편적 매개 변수를 테스트하고 최적화합니다.

요약

이 전략은 EHMA 지표와 적응 채널 지표를 결합하여 트렌드 다음 전략을 형성합니다. 불필요한 거래를 피하기 위해 시장 트렌드를 효과적으로 식별하고 가격 변동을 필터링 할 수 있습니다. 일련의 매개 변수 최적화 및 위험 통제 후에 다양한 제품 및 시간 틀에서 안정적인 이익을 얻을 수 있습니다.


/*backtest
start: 2023-02-25 00:00:00
end: 2024-02-25 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
args: [["v_input_1",1]]
*/

// Credit is due where credit is due:
// Hull Moving Average: developed by Alan Hull
// EHMA: coded by Twitter @borserman
// I've built on their work in an attempt to create a strategy more robust to fake moves
// @0xLetoII

//@version=4
strategy(
  title="EHMA Range Strategy",
  process_orders_on_close=true,
  explicit_plot_zorder=true,
  overlay=true, 
  initial_capital=1500, 
  default_qty_type=strategy.percent_of_equity, 
  commission_type=strategy.commission.percent, 
  commission_value=0.085,
  default_qty_value=100
  )
  

// Position Type
pos_type = input(defval = "Long", title="Position Type", options=["Both", "Long", "Short"])

// Inputs
Period = input(defval=180, title="Length")
RangeWidth = input(defval=0.02, step=0.01, title="Range Width")
sqrtPeriod = sqrt(Period)

// Function for the Borserman EMA
borserman_ema(x, y) =>
    alpha = 2 / (y + 1)
    sum = 0.0
    sum := alpha * x + (1 - alpha) * nz(sum[1])

// Calculate the Exponential Hull Moving Average
EHMA = borserman_ema(2 * borserman_ema(close, Period / 2) - borserman_ema(close, Period), sqrtPeriod)

// Create upper & lower bounds around the EHMA for broader entries & exits
upper = EHMA + (EHMA * RangeWidth)
lower = EHMA - (EHMA * RangeWidth)

// Plots
EHMAcolor = (close > EHMA ? color.green : color.red)
plot(EHMA, color=EHMAcolor, linewidth=2)
plot(lower, color=color.orange, linewidth=2)
plot(upper, color=color.blue, linewidth=2)


// Strategy
long = close > upper
exit_long = close < lower
short = close < lower
exit_short = close > upper


// Calculate start/end date and time condition
startDate  = input(timestamp("2017-01-01T00:00:00"))
finishDate = input(timestamp("2029-01-01T00:00:00"))
 
time_cond  = true


// Entries & Exits
if pos_type == "Both"
    strategy.entry("Long", strategy.long, comment="Long", when=long and time_cond)
    strategy.close("Long", comment="Exit Long", when=exit_long and time_cond)
    strategy.entry("Short", strategy.short, comment="Short", when=short and time_cond)
    strategy.close("Short", comment="Exit Short", when=exit_short and time_cond)
if pos_type == "Long"
    strategy.entry("Long", strategy.long, comment="Long", when=long and time_cond)
    strategy.close("Long", comment="Exit Long", when=exit_long and time_cond)
if pos_type == "Short"
    strategy.entry("Short", strategy.short, comment="Short", when=short and time_cond)
    strategy.close("Short", comment="Exit Short", when=exit_short and time_cond)
    

더 많은