
이 전략은 MACD 지표와 이동 평균 신호 선의 교차를 계산하여 트렌드 방향을 결정하고, EMA 지표와 결합하여 현재 트렌드 강점을 판단하여 트렌드 추적을 구현한다. MACD 선이 아래에서 위로 신호선을 돌파 할 때 더 많은 것을 할 때, 위에서 아래로 돌파 할 때, EMA 선도 트렌드 강점을 판단하여 가짜 돌파를 필터링 할 수 있습니다.
이 전략은 주로 MACD 지표에 기반하여 트렌드 방향과 입시 시기를 판단한다. MACD 라인 브레이크 신호 라인은 가격 트렌드가 반전되었다는 것을 나타내고, 따라서 브레이크 방향에 따라 더 많은 공백을 판단한다. 구체적인 판단 논리는, 닫기 가격이 EMA 평균보다 높고 MACD 라인이 아래에서 신호 라인을 깨면 더 많이; 닫기 가격이 EMA 평균보다 낮고 MACD 라인이 위 방향에서 신호 라인을 깨면 공백한다.
EMA 평균선의 역할은 보조 판단 트렌드입니다. 가격이 EMA 평균선 표시보다 높으면 상승 추세에 있으며, 이 때 MACD 아래의 돌파구가 실행되는 금색 교차 신호를 형성하기 쉽다. 가격이 EMA 평균선 표시보다 낮으면 하향 추세에 있다면, 이 때 MACD 위의 돌파구가 죽은 교차 신호를 형성하기 쉽다. EMA의 길이는 또한 판단 트렌드의 중장기 정도를 결정한다.
위와 같은 방법으로, 가격이 반전되어 새로운 추세가 형성되기 시작했을 때 적시에 진입할 수 있으며, 트렌드 추적 효과를 얻을 수 있다.
이 전략은 가격의 트렌드 방향을 고려하면서도 지표를 사용하여 특정 진입 시점을 판단하여 가짜 돌파의 위험을 피함으로써 전략의 신뢰성을 강화합니다. MACD 지표만 사용하면 새로운 트렌드의 시작을 더 정확하게 판단 할 수 있습니다.
EMA의 평균선 사용은 전략이 짧은 기간의 변동의 영향을 필터링하는 데 도움이 됩니다. 이것은 MACD 지표 판단의 반전 효과를 발휘하는 데 도움이 됩니다.
또한, 전략은 동시에 상장과 하위 조건을 설정하여, 하락 하락하는 마켓 환경에 적용할 수 있으며, 이는 전략의 적응력을 강화한다.
이 전략의 주요 위험은 MACD 지표 자체가 Fakeout를 판단할 확률이 높기 때문에 신호가 잘못 인식될 수 있다는 것이다. 이때는 EMA의 평균선의 보조 기능이 필요하지만, 특별한 상황에서는 무효가 될 수도 있다.
또한, 전략은 수익/손실 비율을 사용하여 스톱 로드 스톱 조건을 설정합니다. 이것은 어느 정도 주관성이 있으며, 잘못 설정되면 전략 효과에도 영향을 미칩니다.
마지막으로, 전략은 상장 개시 수를 100%의 계정 지분으로 간단하게 설정하고, 자금 관리 문제를 고려하지 않습니다. 이것은 실장에서도 약간의 위험이 있습니다.
이 전략은 다음과 같은 몇 가지 최적화 방향을 가지고 있습니다.
다른 지표 판단을 추가하여 여러 지표 조합을 형성하면 MACD에서 잘못된 신호를 발산하는 확률을 더욱 피할 수 있다. 예를 들어 KDJ, BOLL 등이 고려될 수 있다.
EMA 평균선 길이는 여러 조합으로 최적화하여 트렌드 방향을 판단하는 최적의 매개 변수를 찾을 수 있다.
MACD 파라미터는 또한 역전 시기를 결정하는 가장 정확한 파라미터를 찾기 위해 추가적으로 최적화 할 수 있습니다.
돈 관리 모듈을 추가하여 수익/손실 비율을 동적으로 입력할 수 있으며 슬라이드 스톱 손실을 설정할 수 있습니다.
다양한 종류의 계약의 효과를 테스트하여 가장 적합한 거래 유형을 찾습니다. 예를 들어, 암호화폐, 주식 지수 선물 등.
이 MACD EMA 골드 크로스 트렌드 추적 전략은 전체적으로 간단하고 실용적이며, 쌍방향 지표 판단을 통해 신호의 신뢰성을 보장하고, 합리적인 스톱 스톱 방식을 설정하여 수익을 잠금합니다. 주요 최적화 공간은 매개 변수 선택, 지표 포지션, 재원 관리 등에 있습니다. 테스트를 더 최적화하면 이 전략이 효율적인 트렌드 추적 전략 중 하나가 될 수 있다고 믿습니다.
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy(title="MACD EMA Strategy", shorttitle="MACD EMA STRAT", overlay = true, pyramiding = 0, max_bars_back=3000, calc_on_order_fills = false, commission_type = strategy.commission.percent, commission_value = 0, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, initial_capital=5000, currency=currency.USD)
// Time Range
FromMonth=input(defval=1,title="FromMonth",minval=1,maxval=12)
FromDay=input(defval=1,title="FromDay",minval=1,maxval=31)
FromYear=input(defval=2020,title="FromYear",minval=2016)
ToMonth=input(defval=1,title="ToMonth",minval=1,maxval=12)
ToDay=input(defval=1,title="ToDay",minval=1,maxval=31)
ToYear=input(defval=9999,title="ToYear",minval=2017)
start=timestamp(FromYear,FromMonth,FromDay,00,00)
finish=timestamp(ToYear,ToMonth,ToDay,23,59)
window()=>true
// STEP 2:
// See if this bar's time happened on/after start date
afterStartDate = true
//EMA
emasrc = close
res = input(title="EMA Timeframe", type=input.resolution, defval="15")
len1 = input(title="EMA Length", type=input.integer, defval=206)
col1 = color.yellow
// Calculate EMA
ema1 = ema(emasrc, len1)
emaSmooth = security(syminfo.tickerid, res, ema1, barmerge.gaps_on, barmerge.lookahead_off)
// Draw EMA
plot(emaSmooth, title="EMA", linewidth=1, color=col1)
//MACD
fast_length = input(title="Fast Length", type=input.integer, defval=15)
slow_length = input(title="Slow Length", type=input.integer, defval=24)
src = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
sma_source = input(title="Simple MA (Oscillator)", type=input.bool, defval=true)
sma_signal = input(title="Simple MA (Signal Line)", type=input.bool, defval=true)
zeroline = 0
// 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)
//plot(zeroline, title="Zero Line", color=color.black, transp=0)
///////////////////////////LONG////////////////////////////////////////////////////////////////////
enablelong = input(true, title="Enable long?")
//Long Signal
upcondition = close > emaSmooth and close[1] > emaSmooth[1]
macdunderhis = macd < zeroline
macdcrossup = crossover(macd, signal)
longcondition = upcondition and macdunderhis and macdcrossup
//strategy buy long
if (longcondition) and (afterStartDate) and strategy.opentrades < 1 and (enablelong == true)
strategy.entry("long", strategy.long)
//////////////////////////////////////SHORT//////////////////////////////////////////////////////////////////////////////////
enableshort = input(true, title="Enable short?")
//Short Signal
downcondition = close < emaSmooth and close[1] < emaSmooth[1]
macdoverhis = macd > zeroline
macdcrosunder = crossunder(macd, signal)
shortcondition = downcondition and macdoverhis and macdcrosunder
//strategy buy short
if (shortcondition) and (afterStartDate) and strategy.opentrades < 1 and (enableshort == true)
strategy.entry("short", strategy.short)
//////////////////////////////////////EXIT CONDITION//////////////////////////////////////////////////////////////////////////////////
bought = strategy.position_size[1] < strategy.position_size
sold = strategy.position_size[1] > strategy.position_size
barsbought = barssince(bought)
barssold = barssince(sold)
//////LOWEST LOW//////
//Lowest Low LONG
profitfactorlong = input(title="ProfitfactorLong", type=input.float, step=0.1, defval=1.9)
loLen = input(title="Lowest Low Lookback", type=input.integer,
defval=46, minval=2)
stop_level_long = lowest(low, loLen)[1]
if strategy.position_size>0
profit_level_long = strategy.position_avg_price + ((strategy.position_avg_price - stop_level_long[barsbought])*profitfactorlong)
strategy.exit(id="TP/ SL", stop=stop_level_long[barsbought], limit=profit_level_long)
//Lowest Low SHORT
profitfactorshort = input(title="ProfitfactorShort", type=input.float, step=0.1, defval=2.1)
highLen = input(title="highest high lookback", type=input.integer,
defval=25, minval=2)
stop_level_short = highest(high, highLen)[1]
if strategy.position_size<0
profit_level_short = strategy.position_avg_price - ((stop_level_short[barssold] - strategy.position_avg_price)*profitfactorshort)
strategy.exit(id="TP/ SL", stop=stop_level_short[barssold], limit=profit_level_short)
//PLOTT TP SL
plot(stop_level_long, title="SL Long", linewidth=1, color=color.red)
plot(stop_level_short, title="SL Short", linewidth=1, color=color.red)