이 전략은 MACD 지수와 여러 EMA 라인을 결합하여 시장의 강력한 추세를 주파수와 분자 선의 두 시간대에서 포착한다. 주파수에서 MACD 지수를 사용하여 큰 트렌드 방향을 판단하고, 분자 선에서 5 일, 15 일, 30 일 세 개의 EMA 라인을 사용하여 추세를 확인하고, 돌파구에서 거래한다. 이 전략의 주요 아이디어는 강한 추세를 따라, 큰 파도를 타고, 단기 EMA 라인이 장기 EMA 라인을 돌파하고 거래, EMA 라인이 철회 또는 상쇄 조건이 촉발 될 때.
회선 MACD 큰 트렌드를 판단: 회선 MACD 지표를 계산하여, 이번 주와 지난 주의 MACD 기둥 모양 도표 차치 값과 비교하여, 차치 값이 0보다 크면 트렌드가 상승하고, 0보다 작으면 트렌드가 하락하는 것을 나타냅니다. 매주 월요일 거래가 시작될 때 트렌드 방향을 업데이트합니다.
다중 EMA 선 확인 트렌드: 분기 선 그래프에 5일, 15일, 30일 세 개의 EMA 선을 그리십시오. 단기 EMA가 장기 EMA 위에 올라갈 때, 트렌드는 올라갑니다. 반대로 트렌드는 내려갑니다.
EMA의 교차점 거래:
가축: 가축 조건을 설정하지 마십시오.
두 개의 시간 척도가 결합되어, 추세를 판단하는 것이 더 신뢰할 수 있습니다. 회전선 MACD는 큰 추세를 판단하고, 흔들리는 시장에서 너무 많이 덮는 것을 피합니다. 분선 EMA는 트렌드를 확인하고, 트렌드의 모든 물결을 포착합니다.
분선 EMA 파라미터 선택 5, 15, 30일, 3선 조합은 노이즈를 잘 필터링하여 명확한 트렌드를 잡을 수 있습니다.
스톱 로즈 설정은 합리적이고, 단일 거래 위험을 제어한다. 고정 점수 스톱 로즈와 EMA 스톱 로즈가 결합되어 손실을 제어하고, 동향을 따라갈 수 있다.
코드 모듈화 설계, 주요 모듈은 MACD 계산, EMA 계산 등으로, 강력한 복용성과 확장성을 갖는다.
MACD 기둥 도표의 차치 값 선택이 부적절하여 트렌드 판단 기준이 너무 느슨하거나 엄격하여 판단이 부정확하게 될 수 있습니다. 회측과 변수 최적화를 통해 최적의 값을 선택할 수 있습니다.
분선 EMA 매개 변수 선택이 부적절하고, 주기가 너무 짧으면 거래가 빈번하게 이루어지고, 너무 길으면 기회를 놓치게 된다. 회전 및 매개 변수 최적화를 통해 최적의 매개 변수 조합을 선택할 수 있다.
고정점 손실 위치 선택이 부적절하고, 너무 작은 설정으로 인해 빈번한 손실이 발생하고, 너무 큰 설정으로 인해 일회성 손실이 너무 많습니다. 품종의 변동 특성에 따라 개인화 된 손실을 설정할 수 있습니다.
트렌드 전환점 EMA 라인은 지연될 수 있고, 최고의 매수점을 놓칠 수도 있다. 그러나 장기적으로 볼 때, 위험을 효과적으로 제어할 수 있고, 전략의 전체적인 성능은 여전히 좋은 것이다.
MACD의 추세 판단에 기초하여 RSI와 같은 지표를 겹쳐서 추세 강도를 확인하고 추세 판단의 정확성을 높이는 것을 고려할 수 있습니다.
EMA 라인을 교차하는 것을 기반으로 CCI와 같은 지표를 거래 신호의 필터링 조건으로 추가하여 거래 빈도 및 위험을 줄일 수 있습니다.
개별 주식의 역사적인 변동 특성에 따라 개인화 된 스톱포인트를 설정할 수 있으며, 전략이 품종 특성에 더 적합하도록 한다.
부채를 늘리고 하락시키는 전략을 고려할 수 있으며, 트렌드가 강할 때 점진적으로 부채를 늘리고, 트렌드가 약할 때 점진적으로 하락시켜 자금 활용 효율성을 높일 수 있다.
MACD+EMA 다시간 스케일 돌파 전략은 추세 판단과 확인 추세에 비교적 과학적 근거가 있는 추세 추적형 전략으로, 시장의 주요 추세를 효과적으로 파악하여 안정적인 수익을 얻을 수 있다. 동시에, 이 전략은 위험 관리에 있어서도 비교적 완벽하며, 합리적인 스톱 손실 설정과 포지션 조건을 통해 전략 회수를 효과적으로 제어한다. 그러나 전략에는 추세 판단 후 포지션 추가 및 감축 등의 결함이 있지만, 이 기초에서 추가적으로 최적화 및 개선 할 수 있다.
/*backtest
start: 2023-03-16 00:00:00
end: 2024-03-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// 1) 전주와 전전주의 히스토그램의 차이를 계산하여, 매주 월요일에 매매 방향을 표시하고,
// 2) 5일, 15일, 30일 선을 호출하여 평행하게 그리고, 매매 방향에 따라
// 3) 분봉기준의 이동평균선 매매전략
// 4) 수익 실현은 미설정 해둠
//@version=5
strategy('Last week MACD+ 15day, 30day break through, by Ho.J', overlay=true, initial_capital=30000, commission_value = 7.5, commission_type=strategy.commission.cash_per_order, slippage = 0)
// 백테스팅 기간 설정
start_time = input(timestamp("Jan 19 2024 00:00:01"), confirm = true)
end_time = input(timestamp("MAR 19 2024 23:59:59"), confirm = true)
is_in_time = true
stopLoss = input.int(100, title="손절 수준")
// 지난주 값 불러오기 입력 매개변수, 1은 5일, 3은 15일, 6은 30일 이동평균선을 구하는 변수임
emaLength1 = input(1, title="EMA Length")
emaLength2 = input(3, title="EMA Length")
emaLength3 = input(6, title="EMA Length")
timeframePeriod = "W" // 'D'는 일간 데이터를 의미
// 분봉기준 EMA 계산
shortEMA = ta.ema(close, 50)
mediumEMA = ta.ema(close, 60)
longEMA = ta.ema(close, 150)
// 분봉기준 EMA 그리기
plot(shortEMA, color=color.blue, title="5일 EMA")
plot(mediumEMA, color=color.orange, title="15일 EMA")
plot(longEMA, color=color.red, title="30일 EMA")
// 주간 MACD 계산, 전주와 전전주 히스토그램을 계산하여 상대적인 상승, 하락을 계산
[macdLine, signalLine, _] = ta.macd(close, 12, 26, 9)
histogram = macdLine - signalLine
histLastWeek = request.security(syminfo.tickerid, timeframePeriod, histogram[1], lookahead=barmerge.lookahead_on)
histWeekBeforeLast = request.security(syminfo.tickerid, timeframePeriod, histogram[2], lookahead=barmerge.lookahead_on)
histDiff = histLastWeek - histWeekBeforeLast
// 현재 주의 월요일 첫 봉인지 확인
isMondayFirstBar = (dayofweek == dayofweek.monday) and (hour == 09) and (minute == 00) // 여기서 시간은 시장 개장 시간에 따라 조정해야 함
// 월요일 첫봉에, 주간 MACD 히스토그램이 상승하면 '매수', 하락하면 '매도' 표시
var label myLabel = na
if (isMondayFirstBar)
if (histDiff > 0)
myLabel := label.new(bar_index, high, "이번주는 매수만", color=color.green, textcolor=color.white, style=label.style_label_down, size=size.large)
else if (histDiff < 0)
myLabel := label.new(bar_index, low, "이번주는 매도만", color=color.red, textcolor=color.white, style=label.style_label_up, size=size.large)
// 지난주 EMA 값 요청
// 'lookahead'를 사용하여 지난 데이터를 기준으로 계산
lastWeekEMA1 = request.security(syminfo.tickerid, timeframePeriod, ta.ema(close[1], emaLength1), lookahead=barmerge.lookahead_on)
lastWeekEMA2 = request.security(syminfo.tickerid, timeframePeriod, ta.ema(close[1], emaLength2), lookahead=barmerge.lookahead_on)
lastWeekEMA3 = request.security(syminfo.tickerid, timeframePeriod, ta.ema(close[1], emaLength3), lookahead=barmerge.lookahead_on)
// 지난주 EMA 그리기
plot(lastWeekEMA1, color=color.red, title="Last Week EMA1")
plot(lastWeekEMA2, color=color.rgb(157, 126, 126), title="Last Week EMA2")
plot(lastWeekEMA3, color=color.rgb(199, 192, 192), title="Last Week EMA3")
// 매수/매도 조건
buySignal = ta.crossover(close, lastWeekEMA2) and histDiff > 0
// addbuySignal = ta.crossover(close, lastWeekEMA3) and histDiff > 0
sellSignal = ta.crossunder(shortEMA, longEMA) and histDiff < 0
// addSellSignal = ta.crossunder(close, lastWeekEMA3) and histDiff < 0
// 매수 조건
if (buySignal)
strategy.entry('Buy', strategy.long)
alert('Buy Signal', alert.freq_once_per_bar_close)
// if (addbuySignal)
// strategy.entry('Buy', strategy.long)
// alert('add Buy Signal', alert.freq_once_per_bar_close)
if (strategy.position_size > 0 and ((strategy.position_avg_price - close) >= stopLoss) or ta.crossunder(close, mediumEMA))
strategy.close('Buy')
alert('Close Buy Signal', alert.freq_once_per_bar_close)
// 매도 조건
if (sellSignal)
strategy.entry('Sell', strategy.short)
alert('Sell Signal', alert.freq_once_per_bar_close)
//if (addSellSignal)
// strategy.entry('Sell', strategy.short)
// alert('add Sell Signal', alert.freq_once_per_bar_close)
if (strategy.position_size < 0 and ((close - strategy.position_avg_price) >= stopLoss) or ta.crossover(shortEMA, mediumEMA))
strategy.close('Sell')
alert('Close Sell Signal', alert.freq_once_per_bar_close)