Mckinnon 동적 이동 평균 거래 전략


생성 날짜: 2023-11-14 15:48:46 마지막으로 수정됨: 2023-11-14 15:48:46
복사: 0 클릭수: 838
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

Mckinnon 동적 이동 평균 거래 전략

개요

이 전략은 맥킨 비동기평균 지표에 기반한 거래 전략이다. 맥킨 비동기평균 지표는 시장 추세의 변화를 더 잘 포착할 수 있는 향상된 버전의 이동 평균 지표이다. 이 전략은 맥킨 비동기평균 지표의 신호를 사용하여 가격의 평균선을 뚫는 신호와 결합하여 구매 및 판매 규칙을 설정하여 수익을 창출합니다.

전략 원칙

이 전략은 주로 두 개의 평균선을 사용한다. 21일 지수 이동 평균선과 42일 지수 이동 평균선이다. 단기 평균선 위에 장기 평균선을 뚫을 때, 구매 신호로 간주되며, 단기 평균선 아래에 장기 평균선을 뚫을 때, 판매 신호로 간주된다.

또한, 이 전략은 동시에 맥킨非동기평균선보다 가격이 높거나, 가격이 단기평균선을 돌파하는 조건을 충족시켜야 구매 신호를 생성한다. 판매 신호는 마찬가지로 맥킨非평균선보다 가격이 낮거나, 가격이 단기평균선을 넘어가는 조건을 충족시켜야 한다.

구체적으로, 구매 신호의 촉발 조건은: 짧은 평균선에서 긴 평균선을 통과하고, 마킹 비평균선보다 높은 닫기 가격과, 닫기 가격이 아래로 짧은 평균선을 돌파한다. 판매 신호의 촉발 조건은: 짧은 평균선 아래로 긴 평균선을 통과하고, 마킹 비평균선보다 낮은 닫기 가격과, 닫기 가격이 위로 짧은 평균선을 돌파한다.

맥킨 비동기평균선의 계산 공식은: MDIt = MDIt-1 + (Close - MDIt-1) / Max(k * Period * (Close / MDIt-1) ^ 4, 1) ᅳ. 그 중, MDIt는 현재 값을 나타내고, MDIt-1는 전날의 값을 나타내고, Close는 당일 종결 가격을 나타내고, k는 평행 상수를 나타내고, Period은 계산을 나타낸다.

전략적 이점

  1. 맥킨피 평균선 지표는 전통적인 평균선의 지연성을 개선하여 가격 경향의 변화를 더 빨리 포착할 수 있다.

  2. 쌍평선과 결합하여 거래 신호를 형성하여 가짜 돌파구를 효과적으로 필터링 할 수 있습니다.

  3. 맥기니피 평균보다 높거나 낮은 가격의 조건을 추가하고, 충격적인 지역에서 자주 거래되는 것을 피하십시오.

  4. 지수 이동 평균을 사용하여 최근 가격 변화에 더 민감하게 조정합니다.

전략적 위험

  1. 수평 변동 시장에서는 가짜 신호가 발생하여 손실이 발생할 수 있습니다. 적절한 매개 변수를 조정하여 신호를 필터링 할 수 있습니다.

  2. 대규모 폭파가 발생하면 적시에 창고가 건설되지 않을 수 있으며, 입시 조건이 적절히 완화되어야 한다.

  3. 매개 변수 설정이 잘못되면 정책 효과에 영향을 미치며, 매개 변수에 대한 최적화 테스트를 해야 한다.

  4. 장기 보유에 따른 체계적인 위험은 주의해야 하며, 스톱포인트를 설정할 수 있다.

전략 최적화

  1. 다른 길이의 평균선 변수를 테스트하여 더 적합한 조합을 찾을 수 있다.

  2. KD, MACD 등과 같은 다른 기술 지표를 추가하여 구매 및 판매 지점을 최적화 할 수 있습니다.

  3. 다른 품종, 시장에 따라 k의 값을 조정할 수 있으며, 맥킨 비평균의 계산을 최적화한다.

  4. 변동률 지표와 결합하여 dynamical position sizing을 구현하여 단독 위험을 제어할 수 있다.

  5. 손실 위험을 통제하기 위해 스톱포트를 설정할 수 있고, 수익을 잠금하기 위해 스톱포드를 이동시킬 수도 있다.

요약하다

이 전략은 맥킨 비평준 지표의 빠른 추적 능력을 활용하여 가격의 반평준 형성 된 거래 신호와 함께 트렌드를 효과적으로 추적하고 트렌드가 변하면 즉시 위치를 전환 할 수 있습니다. 전통적인 쌍평준 전략에 비해 이 전략은 가격 트렌드 변화를 더 빠르게 포착 할 수 있습니다. 그러나 이 전략에는 약간의 위험도 있습니다.

전략 소스 코드
/*backtest
start: 2022-11-07 00:00:00
end: 2023-11-13 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © LucasZancheta

//@version=4
strategy(shorttitle="Maguila", title="McGinley Dynamic Indicator", overlay=true)

//Médias móveis
MA1Period=input(21, title="MA1")
MA2Period=input(42, title="MA2")

MA1 = ema(close, MA1Period)
MA2 = ema(close, MA2Period)

aboveAverage = MA1 >= MA2
hunderAverage = MA2 >= MA1

//Período do backtest
startDate = input(title="Start Date", type=input.integer, defval=28, minval=1, maxval=31)
startMonth = input(title="Start Month", type=input.integer, defval=5, minval=1, maxval=12)
startYear = input(title="Start Year", type=input.integer, defval=2019, minval=1800, maxval=2100)

endDate = input(title="End Date", type=input.integer, defval=28, minval=1, maxval=31)
endMonth = input(title="End Month", type=input.integer, defval=5, minval=1, maxval=12)
endYear = input(title="End Year", type=input.integer, defval=2030, minval=1800, maxval=2100)

//Verifica se o candle está dentro do período do backtest
inDateRange = (time >= timestamp(syminfo.timezone, startYear, startMonth, startDate, 0, 0)) and (time < timestamp(syminfo.timezone, endYear, endMonth, endDate, 0, 0))

//Número de periodos da média móvel
period  = input(title="Períodos", type=input.integer, defval=20)
//Constante K (0.6)
k = input(title="Constante K", type=input.float, defval=0.6)
//Preço de fechamento 
closePrice = input(title="Preço", type=input.source, defval=close)

mdi = 0.0

//Fórmula de McGinley
mdi := na(mdi[1]) ? closePrice : mdi[1] + (closePrice - mdi[1]) / max((k * period * pow(closePrice / mdi[1], 4)), 1)

//Regra de coloração 
mdiColor = closePrice > mdi ? color.green : closePrice < mdi ? color.red : color.black

//Inserindo as informações no gráfico    
plot(MA1, color=color.blue, linewidth=2)
plot(MA2, color=color.purple, linewidth=2)

barcolor(mdiColor)

//Estratégia
buySignal = aboveAverage and closePrice > mdi and crossunder(low, MA1) and close > MA1  
buyLoss = closePrice < mdi and close < MA1 and close < MA2

if (inDateRange)
    strategy.entry("Compra", strategy.long, qty=1, when= buySignal)
    strategy.exit("Gain da compra", "Compra", qty=1, profit=20)
    strategy.close("Compra", qty=1, when= buyLoss, comment="Loss na operação")

sellSignal = hunderAverage and closePrice < mdi and crossover(high, MA1) and close < MA1
sellLoss = closePrice > mdi and close > MA1 and close > MA2

if (inDateRange)
    strategy.entry("Venda", strategy.short, qty=1, when= sellSignal)
    strategy.exit("Gain da venda", "Venda", qty=1, profit=20)
    strategy.close("Venda", qty=1, when= sellLoss, comment="Loss na operação")

if (not inDateRange)
    strategy.close_all()