MACD 이동 평균 교차 추세 추적 손실 정지 전략


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

MACD 이동 평균 교차 추세 추적 손실 정지 전략

개요

이 전략은 MACD 지표를 사용하여 트렌드 방향을 판단하고, EMA 평균선과 SMA 평균선 교차를 보조 판단으로 사용합니다. 입문 신호는 MACD 직선에서 신호선을 통과하고 상승 추세이며, 정지는 ATR에 의해 계산된 부동의 정지선으로 가격이 떨어집니다. 전략은 또한 순차적으로 출전을 설정하여, 먼저 일부 포지션을 평정하여 이익을 얻습니다.

원칙

출입 신호

빠른 EMA 상에서 느린 EMA를 통과하면 단기 가격 변화의 추세가 장기적인 추세보다 낫다는 것을 나타내고 구매 신호로 판단한다. 동시에, 빠른 SMA 상에서 느린 SMA를 통과하는 것은 단기 가격 상승의 동력이 장기적인 것보다 낫다는 것을 나타냅니다. 따라서 MACD 직선 상의 신호 선과 추세 방향의 EMA&SMA 교차 신호를 결합하여 더 강한 입시 시기를 결정할 수 있다.

손해 방지 방법

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")