트렌드 없는 MACD 전략

저자:차오장, 날짜: 2023-10-30 17:08:16
태그:

img

전반적인 설명

이 전략은 MACD 지표를 보다 명확하게 관찰하기 위해 주식 가격의 트렌드를 제거하는 방법을 사용합니다. DEMA 빠른 라인과 DEMA 느린 라인을 계산함으로써 MACD 라인과 신호 라인을 도출합니다. 거래 신호는 MACD 라인과 신호 라인의 교차로 생성됩니다. 이 전략은 또한 날짜 및 달 조건 필터와 스톱 로스 논리를 통합하여 보다 완전한 시스템을 형성합니다.

전략 논리

우선, 가격의 EMA는 가격 트렌드를 제거하고 유동화 된 EMA를 얻기 위해 계산된다. 그 다음 빠른 라인 DEMA, 느린 라인 DEMA 및 MACD 라인은 EMA를 기반으로 계산된다. 빠른 라인 DEMA는: 먼저 빠른 라인의 EMA1를 계산하고, EMA1의 EMA2를 계산하고, 마지막으로 DEMA=(2*EMA1-EMA2를 계산하여 계산된다. 느린 라인 DEMA와 신호 라인은 비슷하게 계산된다. MACD 라인 (빠른 라인 DEMA - 느린 라인 DEMA) 과 신호 라인을 얻은 후, MACD 라인이 신호 라인의 위를 넘을 때 구매 신호가 생성되고, MACD 라인이 신호 라인을 넘을 때 판매 신호가 생성된다. 마지막으로 날짜와 달 필터를 결합하고, 스톱 손실 논리를 설정한다.

이 전략의 핵심 논리는 다음과 같습니다.

  1. MACD 지표를 더 명확하게 보기 위해 가격 추세를 제거합니다.

  2. MACD 라인과 신호 라인을 도출하기 위해 DEMA 빠른 라인과 DEMA 느린 라인을 계산합니다.

  3. MACD 라인과 신호 라인 크로스오버는 거래 신호를 생성합니다.

  4. 날짜와 달 필터를 추가합니다.

  5. 스톱 손실 논리를 설정합니다.

이점 분석

이 전략의 주요 장점은 다음과 같습니다.

  1. 가격 트렌드를 제거하면 트렌드에 착각하지 않고 MACD의 크로스오버 상황을 더 명확하게 드러낼 수 있습니다.

  2. MACD를 계산하기 위해 DEMA 알고리즘을 사용하면 소음을 필터링하고 신호를 더 명확하게 만듭니다.

  3. 날짜와 달 필터를 결합하면 불필요한 거래가 줄어들 수 있습니다.

  4. 스톱 로스 로직은 시간적 손실을 줄이고 위험을 조절할 수 있습니다.

  5. 신호를 생성하기 위해 크로스오버를 사용하는 것은 잘못된 거래를 줄여줍니다.

  6. 전체적으로, 트렌드 제거, DEMA 계산 및 상태 필터를 결합하면 이 전략은 비교적 명확하고 신뢰할 수 있는 거래 신호를 생성할 수 있습니다.

위험 분석

이 전략의 일부 위험은 주의가 필요합니다.

  1. 트렌드를 제거 한 후 MACD 크로스오버 신호가 증가 할 수 있으며 실행 가능성을 확인하기 위해 실시간 테스트가 필요합니다.

  2. DEMA 알고리즘이 소음을 필터하긴 하지만, 여전히 많은 잘못된 신호가 나타낼 수 있습니다.

  3. 날짜와 달 필터 조건이 너무 딱딱해서 거래 기회를 놓칠 수도 있습니다.

  4. 스톱 러스 포지션은 합리적으로 설정되어야 합니다. 너무 느슨하면 위험을 증가시킬 것이고 너무 단단하면 종종 스톱 러스를 일으킬 것입니다.

  5. 전략은 주로 MACD에 의존합니다. 시장이이 지표에 적합하지 않으면 성능이 영향을받을 수 있습니다.

  6. 여전히 파라미터 최적화에 많은 공간이 남아 있습니다. 백테스트와 라이브 트레이딩을 통해 추가 테스트가 필요합니다.

해결책:

  1. 거짓 신호를 피하기 위해 다른 표시자 확인을 추가합니다.

  2. 날짜 필터 조건을 적절히 최적화합니다.

  3. 스톱 로스 포인트를 조심스럽게 테스트하고 최적화하세요.

  4. 트렌드 판단 메커니즘을 추가하여 트렌드에 반대하는 거래를 피합니다.

  5. 안정성을 높이기 위해 포괄적인 백테스트와 파라미터 최적화

최적화 방향

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

  1. 다른 가격 이동 평균을 테스트하여 EMA에 대한 더 나은 대안을 찾으십시오.

  2. MACD 빠른 라인, 느린 라인 및 신호 라인 길이를 최적화하기 위해 다른 매개 변수 조합을 시도하십시오.

  3. 잘못된 신호를 피하기 위해 볼륨과 같은 보조 표시기를 추가합니다.

  4. 스톱 로스 전략을 최적화하고 합리적인 움직임을 설정하거나 스톱 로스를 주문합니다.

  5. 날짜와 달 필터 조건을 최적화하여 보다 유연하게 만들 수 있습니다.

  6. 트렌드 판단을 추가해서 트렌드에 반대하는 거래를 피하세요.

  7. 안정성을 높이기 위해 포괄적인 파라미터 최적화

  8. 장기적인 성능을 확인하기 위해 더 긴 기간에 백테스트.

  9. 실제 거래에 기반한 매개 변수를 확인하고 추가로 수정하기 위한 실시간 거래

요약

요약하자면, 이 전략은 트렌드를 제거하고 날짜 필터와 결합한 DEMA MACD를 계산하여 거래 신호를 생성하는 아이디어를 사용합니다. 이것은 간단하지만 실행 가능한 전략 아이디어입니다. 가장 큰 장점은 가격 트렌드에 영향을 받지 않고 MACD 패턴을 명확히 밝히는 것입니다. 그러나, 아직 실용적인 응용을 위해 파라미터 최적화 및 위험 관리 조치가 구현되어야하는 이 전략의 몇 가지 위험이 있습니다. 또한 최적화 할 수있는 넓은 공간이 있으며, 충분한 검증과 최적화로,이 전략은 안정적이고 신뢰할 수있는 단기 거래 시스템이 될 수 있습니다.


/*backtest
start: 2022-10-23 00:00:00
end: 2023-10-29 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2

strategy(title = "Trendless MACD  Strategy",shorttitle="MACD-T Strategy",default_qty_type = strategy.percent_of_equity, default_qty_value = 100,commission_type=strategy.commission.percent,commission_value=0.01,initial_capital=100000)



maperiod=input(9)
ema=ema(close,maperiod)


fastmacd = input(12,title='MACD Fast  Line Length')
slowmacd = input(26,title='MACD Slow Line Length')
signalmacd = input(9,title='Signal Line Length')

macdslowline1 = ema(ema,slowmacd)
macdslowline2 = ema(macdslowline1,slowmacd)
DEMAslow = ((2 * macdslowline1) - macdslowline2 )

macdfastline1 = ema(ema,fastmacd)
macdfastline2 = ema(macdfastline1,fastmacd)
DEMAfast = ((2 * macdfastline1) - macdfastline2)

MACDLine = (DEMAfast - DEMAslow)

SignalLine1 = ema(MACDLine, signalmacd)
SignalLine2 = ema(SignalLine1, signalmacd)
SignalLine = ((2 * SignalLine1) - SignalLine2 )


MACDSignal = MACDLine-SignalLine


colorbar= MACDSignal>0?green:red

plot(MACDSignal,color=colorbar,style=columns,title='Histogram',histbase=0)
p1 = plot(MACDLine,color=blue,title='MACDLine')
p2=plot(SignalLine,color=red,title="SignalLine")
fill(p1,p2,color=blue)


longCond =  crossover(MACDLine,SignalLine) 

shortCond =  crossunder(MACDLine,SignalLine) 




monthfrom =input(1)
monthuntil =input(12)
dayfrom=input(1)
dayuntil=input(31)

yearfrom= input(2018)
yearuntil=input(2021)

if (  longCond   ) 
    strategy.entry("LONG", strategy.long, stop=close, oca_name="TREND",  comment="LONG")
    
else
    strategy.cancel(id="LONG")
    



if ( shortCond  ) 

    strategy.entry("SHORT", strategy.short,stop=close, oca_name="TREND", comment="SHORT")
else
    strategy.cancel(id="SHORT")





더 많은