정규화된 MACD를 기반으로 한 양적 거래 전략


생성 날짜: 2023-09-14 20:01:07 마지막으로 수정됨: 2023-09-14 20:01:07
복사: 1 클릭수: 1118
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

이 문서에서는 표준화 MACD 지표에 기반한 양적 거래 전략에 대해 자세히 설명합니다. 이 전략은 고전적인 MACD 전략을 최적화하여 신호 품질을 향상시킵니다.

1 전략

이 전략의 핵심 아이디어는 기존의 MACD 지표들을 통일적으로 처리하여 오류율을 낮추는 것이다. 구체적인 단계는 다음과 같다:

  1. 단기 및 장기 헐 이동 평균을 계산하여 대동향을 크로스 관계로 판단합니다.

  2. MACD의 차이를 계산합니다.

  3. MACD 지표에 대해 일정한 주기 내의 통일화 처리를 한다.

  4. 통일 MACD의 평균선을 계산하여 거래 트리거를 형성합니다.

  5. 통일 MACD 상단 트리거 일률화 할 때 더, 하단 트리거 공백;

  6. 그리고, 이러한 추세들을 필터링하여 큰 추세들을 놓치지 않도록 합니다.

  7. 단편 거래의 위험을 통제하기 위해 Stop Loss을 설정합니다.

통일화 처리는 MACD 차이의 절대적 폭을 축소하여 노이즈를 줄이고 신호 품질을 향상시킵니다. 추세 필터링은 또한 지역 조정으로 인해 역 동작을 방지합니다. 손실 차단기는 단일 손실을 제어합니다.

2 전략적 장점

이 전략은 간단한 MACD 전략에 비해, 통일 처리, MACD의 오류율을 효과적으로 줄이고 신호의 정확도를 향상시키는 것이 가장 큰 장점이다.

또 다른 장점은 트렌드를 판단하는 필터를 추가하여 트렌드에서 역으로 작동하는 것을 피하는 것입니다. 이것은 전략의 안정성을 강화합니다.

마지막으로, 스톱로스 스톱 조건을 설정하는 것은 각 거래의 리스크/이익을 통제할 수 있도록 하며, 적극적인 자금 관리를 가능하게 한다.

  1. 잠재적인 위험

이 전략은 최적화되었지만 실제 사용에서는 다음과 같은 위험도 주의해야 합니다.

우선, 파라미터를 최적화하는 데 어려움이 많고, 부적절한 설정으로 인해 과도한 적합성이 발생할 수 있습니다.

두 번째, 스톱 손실 설정이 너무 가까워지면 손실이 커질 수 있습니다.

마지막으로, 트렌드 변동이 있을 때, 신호는 지연되어서, 적시에 반응할 수 없습니다.

네 가지 내용

이 글은 MACD 지표를 통일적으로 처리하는 한 가지 양적 거래 전략에 대해 자세히 소개한다. 이 전략은 고전적인 MACD 전략을 개선하여 신호 품질을 효과적으로 향상시키고 위험 관리 장치에 가입 할 수 있다. 그러나 여전히 매개 변수 최적화 난이도 및 중지 손실 설정과 같은 문제에 주의해야 한다.

전략 소스 코드
/*backtest
start: 2023-08-14 00:00:00
end: 2023-09-13 00:00:00
period: 6h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
// Normalized MACD but heavily modified by SeaSide420. Normalized MACD v420
strategy("Normalized MACD (v420)",shorttitle="NmacD(v420)",overlay=true, default_qty_type=strategy.percent_of_equity, max_bars_back=1440, default_qty_value=100, calc_on_order_fills= true, calc_on_every_tick=true, pyramiding=0) 
p=input(ohlc4)
jah=input(title="HullMA cross",defval=21)
tsp = input(34,title='Trigger')
np = input(50,title='Normalize')
SL = input(defval=-420.00, title="Stop Loss in $", step=1)
TP = input(defval=31.00, title="Target Point in $", step=1)
ot=1
n2ma=2*wma(p,round(jah/2))
nma=wma(p,jah)
diff=n2ma-nma
sqn=round(sqrt(jah))
n2ma1=2*wma(p[2],round(jah/2))
nma1=wma(p[2],jah)
diff1=n2ma1-nma1
sqn1=round(sqrt(jah))
n1=wma(diff,sqn)
n2=wma(diff1,sqn)
sh=n1
lon=n2
ratio = min(sh,lon)/max(sh,lon)
Mac = (iff(sh>lon,2-ratio,ratio)-1)
MacNorm = ((Mac-lowest(Mac, np)) /(highest(Mac, np)-lowest(Mac, np)+.000001)*2)- 1
MacNorm2 = iff(np<2,Mac,MacNorm)
Trigger = wma(MacNorm2, tsp)
Hist =(MacNorm2-Trigger)
Hist2= Hist>1?1:Hist<-1?-1:Hist
teh=MacNorm2+MacNorm2[2]-MacNorm2[1]
closelong = strategy.openprofit<SL or strategy.openprofit>TP or teh[1]<Trigger[1] and n1<n2[1]
if (closelong)
    strategy.close("Long")
closeshort = strategy.openprofit<SL or strategy.openprofit>TP or  teh[1]>Trigger[1] and n1>n2[1]
if (closeshort)
    strategy.close("Short")
longCondition = Trigger<0 and teh>Trigger and MacNorm>Trigger and strategy.opentrades<ot 
if (longCondition)
    strategy.entry("Long",strategy.long)
shortCondition = Trigger>0 and teh<Trigger and MacNorm<Trigger and strategy.opentrades<ot 
if (shortCondition)
    strategy.entry("Short",strategy.short)