
이 전략은 계산 속도가 더 빠른 지수 선형 가중 평균 ((EHMA) 과 적응 통로를 사용하여 트렌드 추적 기법을 구축한다. EHMA 계산 속도가 더 빠르므로 가격 변화의 트렌드를 효과적으로 식별할 수 있으며, 가짜 돌파구가 불필요한 거래 신호를 생성하는 것을 피할 수 있다. 동시에, 적응 통로는 일부 가격 흔들림을 필터링 할 수 있으며, 가격 돌파구가있을 때만 거래 신호를 발산하여 비효율 거래의 확률을 줄이고 수익률을 높일 수 있다.
매개 변수 Period에 따라 계산된 지수형 선형 가중 평균 EHMA. EHMA 계산 속도가 빠르고 가격 변화의 흐름을 효과적으로 추적할 수 있다.
변수 RangeWidth에 따라, EHMA의 상하에 각 확장하는 적응 통로가 있다. 가격이 상하의 통로선보다 높거나 낮을 때만 트렌드가 변한 것으로 간주되어 거래 신호를 발산한다.
가격과 통로의 관계를 판단한다. 가격이 위쪽 통로선에 들어가면 더 많이 하고, 아래쪽 통로선에 들어가면 공백을 한다. 가격이 아래쪽 통로선에 들어가면 평량, 위쪽 통로선 아래쪽 통로선에 들어가면 평량이다.
일반적인 이동 평균 전략에 비해 이 전략은 다음과 같은 장점이 있다:
EHMA 알고리즘을 사용하여 평균을 계산한다. EHMA는 가격 변화의 추세에 대한 반응에 더 민감하며, 트렌드 변화를 효과적으로 식별하여 가짜 돌파구가 불필요한 거래를 초래하는 것을 피한다.
적응 통로는 가격 변동을 효과적으로 필터링할 수 있다. 가격이 트렌드 변화를 확인했을 때만 거래 신호를 생성한다. 일부 비효율 거래를 필터링하여 수익 가능성을 높일 수 있다.
채널의 폭을 유연하게 조정하여 다른 시장 환경에 맞게 조정할 수 있습니다. 넓은 채널은 더 많은 흔들림을 필터링하여 거래 빈도를 줄일 수 있습니다. 좁은 채널은 트렌드 변화를 더 빨리 인식하여 거래 빈도를 증가시킬 수 있습니다.
이 전략에는 다음과 같은 위험도 있습니다.
가짜 돌파구를 완전히 피하는 것은 불가능하다. 가격에 파열이 발생할 수 있으며, 통로띠를 직접 뚫고 올라갈 수도 있고, 내려갈 수도 있다. 적절한 매개 변수를 조정하여 위험을 통제해야 한다.
채널이 너무 넓으면 일부 거래 기회를 놓칠 수 있습니다. 채널을 적절히 좁혀서 민감성을 높일 수 있습니다.
통로가 너무 좁으면 무효 거래의 수가 증가한다. 통로의 폭을 적절히 확장하여 안정성을 높일 수 있다.
이 전략은 다음과 같은 부분에서 최적화될 수 있습니다.
최적화 매개 변수: Period ᆞ 다른 품종과 주기 도표의 특성에 맞게 평균 계산 주기를 조정한다.
최적화 매개 변수: RangeWidth. 시장의 변동성과 개인 위험 선호도에 따라 채널 범위를 조정한다.
손실을 막는 전략을 늘리십시오. 포지션을 보유하는 과정에서 합리적인 손실을 막는 점을 설정하여 단일 거래의 최대 손실을 효과적으로 제어하십시오.
다른 지표와 결합하여 엔트리를 필터링합니다. 예를 들어, 거래량 판단을 높이고 엔트리의 비효율성을 감소시킵니다.
다품종화 응용 및 매개 변수 최적화. 더 많은 품종과 주기에서 테스트하고, 일반 매개 변수를 최적화한다.
이 전략은 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)