헐 이동 평균을 기반으로 한 추세 추종 전략


생성 날짜: 2023-09-19 16:40:00 마지막으로 수정됨: 2023-09-19 16:40:00
복사: 1 클릭수: 638
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

개요

이 전략은 앨런 헐 (Alan Hull) 이 제안한 헐 이동 평균 지표에 기초하고 있으며, 트렌드 추적 전략에 속한다. 이 지표는 이동 평균의 지연 효과를 효과적으로 줄이고, 가격 변화에 대한 반응에 더 민감하다. 전략은 헐 이동 평균을 사용하여 트렌드 방향을 판단하고, 추가 필터 조건과 결합하여 거래 신호를 발송한다.

전략 원칙

  1. 짧은 주기 및 긴 주기 두 그룹의 헐 이동 평균을 계산한다. 짧은 주기 는 특정 거래 방향을 판단하고, 긴 주기 는 큰 트렌드 방향을 판단한다.

  2. 단기 Hull MA 상에서 횡단과 횡단할 때, 트렌드가 변하는 것을 판단한다. 큰 트렌드 방향과 결합된 필터링 노이즈 트레이딩.

  3. Hull MA를 돌파하기 위한 조건에 가격을 올리고 돌파가 성공하도록 한다.

  4. 가격 변동률 조건을 추가하여 바람직하지 않은 돌파구를 피하십시오.

  5. 스톱 및 스톱 조건을 설정하고 위험을 제어하십시오.

우위 분석

일반 이동 평균에 비해 이 전략은 다음과 같은 장점이 있다:

  1. Hull MA는 가격 변화에 더 빠르게 반응하여 트렌드 전환을 적시에 포착할 수 있다.

  2. 이중 헐 MA 구조는 큰, 작은 두 시간 차원의 경향을 판단할 수 있다.

  3. 가격 돌파와 변화율 조건은 가짜 돌파를 효과적으로 필터링 할 수 있습니다.

  4. 다이내믹 스톱로스 스톱은 수익을 잠금하고 위험을 통제합니다.

위험 분석

이 전략에는 다음과 같은 위험도 있습니다.

  1. 변수를 잘못 설정하면 가격 트렌드 전환을 놓칠 수 있습니다.

  2. 큰 트렌드를 잘못 판단하면 역대 거래가 될 수 있습니다.

  3. 스톱로스 설정이 너무 넓으면 큰 손실이 발생할 수 있습니다.

  4. 거래의 빈도가 너무 높아서 거래 비용과 슬라이드 포인트 위험이 증가합니다.

최적화 방향

다음의 몇 가지 측면에서 최적화할 수 있습니다.

  1. 헐 MA 사이클을 최적화하여 민감성과 부드러움을 균형 잡는다.

  2. Entry와 Exit의 파라미터를 최적화하여 최적의 값을 찾습니다.

  3. 다양한 품종의 매개 변수의 강도를 테스트하고, 전략의 적응성을 향상시킨다.

  4. 결합량 지표, 탈선으로 인한 위험을 피한다.

  5. 이 전략의 안정성을 높이기 위한 조건들을 추가합니다.

요약하다

이 전략은 전체적으로, Hull MA의 반응 속도를 활용하여 트렌드에 대한 적시에 따른 추적을 구현하고, 위험을 통제하는 전제 하에, 강력한 수익성을 갖는다. 그러나 파라미터 최적화에 주의를 기울이고, 피하기 어려운 일부 시스템적 위험을 예방할 필요가 있다.

전략 소스 코드
/*backtest
start: 2023-09-11 00:00:00
end: 2023-09-12 22:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
//SeaSide420
strategy("SS420FX", overlay=true, default_qty_type=strategy.percent_of_equity, max_bars_back=720, default_qty_value=100, calc_on_order_fills= true, calc_on_every_tick=true, pyramiding=0)
q=input(title="HullMA Short",defval=14)
z=input(title="HullMA Long",defval=14)
dt = input(defval=0.0010, title="Decision Threshold", type=float, step=0.0001)
SL = input(defval=-50000.00, title="Stop Loss in $", type=float, step=1)
TP = input(defval=100000.00, title="Target Point in $", type=float, step=1)
ot=1
n2ma=2*wma(close,round(q/2))
nma=wma(close,q)
diff=n2ma-nma
sqn=round(sqrt(q))
n2ma1=2*wma(close[1],round(q/2))
nma1=wma(close[1], q)
diff1=n2ma1-nma1
sqn1=round(sqrt(q))
n1=wma(diff,sqn)
n2=wma(diff1,sqn)
z2ma=2*wma(close[11],round(z/2))
zma=wma(close[11],z)
ziff=n2ma-nma
zqn=round(sqrt(z))
z2ma1=2*wma(close[12],round(z/2))
zma1=wma(close[12], z)
ziff1=n2ma1-nma1
zqn1=round(sqrt(z))
z1=wma(diff,sqn)
z2=wma(diff1,sqn)
z1e=z1>z2?green:black
z2e=z1>z2?black:red
z3e=z1>z2?green:red
n1e=plot(z1, title="HMA1", color=z1e, linewidth=2, offset=2)
n2e=plot(z2, title="HMA2", color=z2e, linewidth=2, offset=2)
fill(n1e, n2e, color=z3e, transp=80)
confidence=(security(syminfo.tickerid, 'D', close)-security(syminfo.tickerid, 'D', close[1]))/security(syminfo.tickerid, 'D', close[1])
closelong = n1<n2 and close<n2 and confidence<dt or strategy.openprofit<SL or strategy.openprofit>TP
if (closelong)
    strategy.close("Long")
closeshort = n1>n2 and close>n2 and confidence>dt or strategy.openprofit<SL or strategy.openprofit>TP
if (closeshort)
    strategy.close("Short")
longCondition = n1>n2 and z1>z2 and strategy.opentrades<ot and confidence>dt and close>n1
if (longCondition)
    strategy.entry("Long",strategy.long)
shortCondition = n1<n2 and z1<z2 and strategy.opentrades<ot and confidence<dt and close<n1 
if (shortCondition)
    strategy.entry("Short",strategy.short)