MACD 이동 평균 크로스오버 트렌드

저자:차오장, 날짜: 2023-11-06 11:56:14
태그:

img

전반적인 설명

이 전략은 트렌드 방향을 결정하기 위해 MACD를 사용하여 EMA와 SMA 크로스오버와 결합하여 확인합니다. 입구 신호는 MACD 히스토그램이 신호 라인 위에 넘어가고 트렌드가 상승 할 때입니다. 스톱 손실은 부동 ATR 트레일링 스톱 이하의 가격 수준에 설정됩니다. 전략은 또한 수익을 얻기 위해 부분적으로 종료됩니다. 더 큰 가격 상승에 더 많이 종료되며 스톱 손실이 발생 할 때까지 트레일링 스톱과 함께 어떤 위치를 유지합니다.

논리

입력 신호

더 빠른 EMA가 느린 EMA를 넘을 때, 단기 트렌드가 장기 트렌드보다 낫다는 것을 나타내고, 구매를 신호합니다. 한편, 더 느린 SMA를 넘는 빠른 SMA는 또한 단기적으로 더 강한 상승 동력을 암시합니다. 따라서 EMA&SMA 크로스오버에 기반한 MACD 라인 신호를 넘고 상승 추세를 조합하면 더 강한 입점 신호를 식별하는 데 도움이됩니다.

손실 중지

ATR은 스톱 로스 수준을 계산하는 데 사용됩니다. ATR은 가격 변동 범위를 효과적으로 측정 할 수 있습니다. 가격이 이 범위 아래로 떨어지면 스톱 로스가 유발됩니다. ATR 기간은 조정 할 수 있습니다. 더 작은 기간은 더 정확한 스톱을 허용하지만 더 쉽게 중지 할 수 있습니다. 더 큰 기간은 더 넓은 스톱을 제공하지만 더 견고합니다. 스톱 레벨은 또한 가격 상승을 추적하여 트렌드 다음 효과를 달성합니다.

출구 신호

이윤을 얻기 위해 작은 가격 상승에 부분적으로 출출한다. 이윤을 잠금하기 위해 큰 가격 상승에 더 많이 출출한다. 스톱 손실이 발생할 때까지 추적 중지로 위치를 유지한다. 이것은 수익을 잠금하는 데 도움이되며, 여전히 일정 기간 동안 위치를 유지할 수 있다.

장점

  • MACD 평가 추세와 EMA/SMA 교차가 결합되어 진입 시기를 확인합니다.
  • ATR 트레일링 스톱은 트렌드를 따라가는 동안 효과적인 스톱 손실을 허용합니다.
  • 부분적인 출출은 수익을 취하고 수익을 고정하고 기간을 유지하도록 돕습니다.

위험 과 해결책

  • MACD 및 트렌드 지표에서 잘못된 신호의 위험이 있습니다. 매개 변수를 세밀하게 조정하거나 다른 지표를 추가하십시오.

  • ATR 스톱 로스가 발생 위험 ATR 기간 또는 스톱 로스 곱셈을 증가시킬 수 있습니다.

  • 후속 포지션이 갇힐 위험이 있습니다. 후속 포지션 크기를 줄이고 시간 손실을 줄이십시오.

더 나은 기회

  • 더 나은 트렌드 판단을 위해 MACD 매개 변수를 최적화

  • 더 나은 중지 손실 수준을 위해 ATR 기간을 최적화

  • 출구 비율 및 포지션 크기를 최적화하여 포착 위험을 줄이십시오.

  • 스톱 로스를 개선하기 위해 이동 수익 또는 변동성 인덱스를 추가하는 것을 고려하십시오.

요약

이 전략은 트렌드 및 엔트리 타이밍을 정확하게 결정하기 위해 MACD, EMA/SMA 및 기타 지표를 결합합니다. 부동 ATR 스톱 손실은 트렌드를 따라 수익을 잠금하는 데 도움이됩니다. 출구는 수익을 취하고 이익을 보장하고 위치를 유지하기 위해 일정합니다. 전반적으로 괜찮은 결과로 안정적입니다. 그러나 매개 변수 및 출구는 더 나은 수익을 위해 더 이상 최적화 될 수 있습니다.


/*backtest
start: 2022-10-30 00:00:00
end: 2023-11-05 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/
// © Deobald

//@version=4
strategy("MACD Strategy", overlay=true)

// FUNCTIONS

Ema(src,p) =>
    ema = 0.
    sf = 2/(p+1)
    ema := nz(ema[1] + sf*(src - ema[1]),src)

Sma(src,p) => a = cum(src), (a - a[max(p,0)])/max(p,0)

Atr(p) =>
    atr = 0.
    Tr = max(high - low, max(abs(high - close[1]), abs(low - close[1])))
    atr := nz(atr[1] + (Tr - atr[1])/p,Tr)

/// TREND
ribbon_period = input(34, "Period", step=1)

leadLine1 = ema(close, ribbon_period)
leadLine2 = sma(close, ribbon_period)

p3 = plot(leadLine1, color= #53b987, title="EMA", transp = 50, linewidth = 1)
p4 = plot(leadLine2, color= #eb4d5c, title="SMA", transp = 50, linewidth = 1)
fill(p3, p4, transp = 60, color = leadLine1 > leadLine2 ? #53b987 : #eb4d5c)


// MACD
fast_length = input(title="Fast Length", type=input.integer, defval=3)
slow_length = input(title="Slow Length", type=input.integer, defval=5)
src = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 2)
sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=true)

// Plot colors
col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350
col_macd = #0094ff
col_signal = #ff6a00

// Calculating
fast_ma = sma_source ? Sma(src, fast_length) : Ema(src, fast_length)
slow_ma = sma_source ? Sma(src, slow_length) : Ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? Sma(macd, signal_length) : Ema(macd, signal_length)
hist = macd - signal

//plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 )
// plot(macd, title="MACD", color=col_macd, transp=0)
// plot(signal, title="Signal", color=col_signal, transp=0)



// TAKE PROFIT AND STOP LOSS
long_tp1_inp = input(1, title='Long Take Profit 1 %', step=0.1)/100
long_tp1_qty = input(10, title="Long Take Profit 1 Qty", step=1)

long_tp2_inp = input(5, title='Long Take Profit 2%', step=0.1)/100
long_tp2_qty = input(50, title="Long Take Profit 2 Qty", step=1)

long_take_level_1 = strategy.position_avg_price * (1 + long_tp1_inp)
long_take_level_2 = strategy.position_avg_price * (1 + long_tp2_inp)




// Stop Loss
multiplier = input(2.2, "SL Mutiplier", minval=1, step=0.1)
ATR_period=input(17,"ATR period", minval=1, step=1)

// Strategy
entry_long=crossover(macd,signal) and leadLine2 < leadLine1
entry_price_long=valuewhen(entry_long,close,0)
SL_floating_long = entry_price_long - multiplier*Atr(ATR_period)
exit_long= close < SL_floating_long 

///// BACKTEST PERIOD ///////
testStartYear = input(2018, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, 0, 0)

testStopYear = input(2020, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0)

testPeriod() => true

if testPeriod()
    strategy.entry("long", strategy.long, comment="Long", when=entry_long)
    strategy.exit("TP1","long", qty_percent=long_tp1_qty, limit=long_take_level_1)//, trail_points=entry_price_long * long_trailing / syminfo.mintick, trail_offset=entry_price_long * long_trailing / syminfo.mintick)
    strategy.exit("TP2", qty_percent=long_tp2_qty, limit=long_take_level_2) //, trail_points=entry_price_long * long_trailing / syminfo.mintick, trail_offset=entry_price_long * long_trailing / syminfo.mintick)
    strategy.close_all("long", when=exit_long, comment="exit long" )


// LONG POSITION
plot(strategy.position_size > 0 ? long_take_level_1 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="1st Long Take Profit")
plot(strategy.position_size > 0 ? long_take_level_2 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="2nd Long Take Profit")
plot(strategy.position_size > 0 ? SL_floating_long : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Stop Loss")


더 많은