맥킨리 이동 평균 거래 전략

저자:차오장, 날짜: 2023-11-14 15:48:46
태그:

img

전반적인 설명

이 전략은 매킨리 동적 이동 평균 지표에 기반을 두고 있다. 매킨리 MA 지표는 가격 추세를 더 잘 추적할 수 있는 이동 평균의 개선된 버전이다. 이 전략은 매킨리 MA 지표가 생성하는 신호를 매킨리 MA 지표의 가격 파격과 결합하여 수익을 위한 거래 규칙을 설정한다.

전략 논리

이 전략은 주로 21주기 EMA와 42주기 EMA라는 두 개의 이동 평균을 사용합니다. 짧은 MA가 더 긴 MA를 넘으면 구매 신호로 간주됩니다. 짧은 MA가 더 긴 MA를 넘으면 판매 신호로 간주됩니다.

또한, 전략은 또한 가격이 매킨리 다이내믹 MA보다 높고 짧은 MA보다 낮아 구매 신호를 생성하도록 요구합니다. 판매 신호에 대해서도 가격이 매킨리 MA보다 낮고 짧은 MA보다 낮아 깨질 필요가 있습니다.

특히, 구매 신호는: 짧은 MA가 더 긴 MA를 넘어서고, 맥킨리 MA를 넘어서고, 짧은 MA를 넘어서고, 짧은 MA를 넘어서고, 짧은 MA를 넘어서고, 맥킨리 MA를 넘어서고, 짧은 MA를 넘어서고, 짧은 MA를 넘어서고, 짧은 MA를 넘어서고, 짧은 MA를 넘어서고, 짧은 MA를 넘어서고, 짧은 MA를 넘어서고, 짧은 MA를 넘어서고, 짧은 MA를 넘어서고, 짧은 MA를 넘어서고, 짧은 MA를 넘어서고, 짧은 MA를 넘어서고, 짧은 MA를 넘어서고, 짧은 MA를 넘어서고, 짧은 MA를 넘어서고, 짧은 MA를 넘어서고, 짧은 MA를 넘어서고, 짧은 MA를 넘어서고, 짧은 MA를 넘어서고, 짧은 MA를 넘어서고, 짧은 MA를 넘어서고, 짧은 MA를 넘어서고, 짧은 MA를 넘어서고, 짧은 MA를 넘어서고, 짧은 MA를 넘어서고, 짧은 MA를 넘어서고, 짧은 MA를 넘어서고, 짧은 MA를 넘어서고, 짧은 MA를 넘어가고, 짧은 MA를

맥긴리 MA는 다음과 같이 계산됩니다: MDIt = MDIt-1 + (Close - MDIt-1) / Max(k * Period * (Close / MDIt-1) ^ 4, 1). MDIt가 현재 값, MDIt-1가 이전 값, Close가 닫기 가격, k가 평형 상수, Period가 계산 기간입니다. 이 공식은 MA가 실시간으로 가격 변화를 추적 할 수 있습니다.

장점

  1. 맥긴리 MA는 전통적인 MA의 후퇴 문제를 개선하고 트렌드 변화를 빠르게 파악 할 수 있습니다.

  2. 신호를 생성하기 위해 이중 MAs를 사용하면 가짜 브레이크를 효과적으로 필터할 수 있습니다.

  3. 맥킨리 MA보다 높고 낮을 가격을 추가하면 범위 시장에서 과도한 거래가 피할 수 있습니다.

  4. EMA를 사용하면 최근 가격 변화에 더 민감하게 반응합니다.

위험성

  1. 윙사브는 옆 시장에서 잘못된 신호를 생성하여 손실을 유발할 수 있습니다. 매개 변수를 필터 신호에 조정할 수 있습니다.

  2. 틈이 열리는 게 적시에 출입을 유발하지 못할 수도 있습니다. 출입 규칙은 완화 될 수 있습니다.

  3. 부적절한 매개 변수 조정은 전략 성능에 영향을 미칠 수 있습니다. 매개 변수는 최적화되어야 합니다.

  4. 장기간 보유 기간은 시스템적 위험을 초래합니다.

개선

  1. 최적의 조합을 찾기 위해 다른 MA 길이를 테스트합니다.

  2. KD, MACD와 같은 다른 지표를 추가하여 입출시기를 개선합니다.

  3. 매킨리 MA 계산을 최적화하기 위해 다른 제품과 시장을 기반으로 k 값을 조정합니다.

  4. 역동적인 포지션 크기와 리스크 통제를 위한 변동성 척도를 포함합니다.

  5. 손실을 제어하기 위해 스톱 로스를 설정하십시오. 수익을 잠금하기 위해 트레일링 스톱도 테스트 할 수 있습니다.

결론

이 전략은 매킨리 MA의 빠른 추적 능력을 가격 브레이크 아웃 신호와 결합하여 트렌드를 효과적으로 따라가며 트렌드가 역전될 때 포지션을 전환합니다. 전통적인 듀얼 MA 전략과 비교하면 트렌드 변화를 더 빠르게 파악 할 수 있습니다. 그러나 위험을 제어하기 위해 매개 변수를 최적화하고 조정해야하는 위험이 있습니다.


/*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()




더 많은