Chiến lược đột phá nhiều khung thời gian của MACD+EMA

Tác giả:ChaoZhang, Ngày: 2024-03-22 11:13:12
Tags:

img

Tổng quan

Chiến lược này kết hợp chỉ số MACD và nhiều đường EMA để nắm bắt xu hướng thị trường mạnh từ hai khung thời gian - hàng tuần và trong ngày. Nó sử dụng chỉ số MACD trên biểu đồ hàng tuần để xác định hướng xu hướng tổng thể và ba đường EMA (5 ngày, 15 ngày, 30 ngày) trên biểu đồ trong ngày để xác nhận xu hướng và thực hiện giao dịch tại các điểm đột phá. Ý tưởng chính là theo dõi xu hướng mạnh và đi trên các làn sóng lớn, vào giao dịch khi EMA ngắn hạn vượt qua EMA dài hạn và thoát khi EMA kéo trở lại hoặc các điều kiện dừng lỗ được kích hoạt.

Nguyên tắc chiến lược

  1. MACD hàng tuần xác định xu hướng tổng thể: Tính toán chỉ số MACD hàng tuần và so sánh sự khác biệt giữa các giá trị biểu đồ MACD của tuần hiện tại và tuần trước. Sự khác biệt dương cho thấy xu hướng tăng, trong khi sự khác biệt âm cho thấy xu hướng giảm. Cập nhật hướng xu hướng mỗi thứ Hai khi thị trường mở.

  2. Nhiều đường EMA xác nhận xu hướng: Chụp các đường EMA 5 ngày, 15 ngày và 30 ngày trên biểu đồ nội ngày. Khi đường EMA ngắn hạn chạy trên và xa đường EMA dài hạn, xu hướng tăng; ngược lại, xu hướng giảm.

  3. Giao dịch tại các điểm giao thông EMA:

    • Nhập dài: Khi xu hướng MACD hàng tuần tăng và đóng cửa trong ngày vượt qua đường EMA 15 ngày, mua dài. Đặt lệnh dừng lỗ ở một điểm cố định dưới giá nhập hoặc thoát khi đường EMA 5 ngày vượt qua đường EMA 15 ngày.
    • Nhập ngắn: Khi xu hướng MACD hàng tuần giảm và EMA 5 ngày vượt qua dưới EMA 30 ngày, đi ngắn. Đặt lệnh dừng lỗ ở một điểm cố định trên giá nhập hoặc thoát khi EMA 5 ngày vượt qua EMA 15 ngày.
  4. Thêm các vị trí: Hiện tại không có điều kiện nhập cảnh bổ sung nào được thiết lập.

Phân tích lợi thế

  1. Việc kết hợp hai khung thời gian làm cho việc xác định xu hướng đáng tin cậy hơn. MACD hàng tuần tránh bị mắc kẹt trong các thị trường giới hạn phạm vi, trong khi các đường chéo EMA trong ngày nắm bắt từng làn sóng trong xu hướng.

  2. Việc lựa chọn EMA 5/15/30 ngày trên biểu đồ nội ngày có hiệu quả lọc tiếng ồn và nắm bắt xu hướng rõ ràng.

  3. Các thiết lập stop-loss là hợp lý, kiểm soát rủi ro trên các giao dịch cá nhân.

  4. Thiết kế mã mô-đun, với các thành phần chính như tính toán MACD và EMA, có khả năng tái sử dụng và mở rộng cao.

Phân tích rủi ro

  1. Chọn sai ngưỡng chênh lệch biểu đồ MACD có thể dẫn đến các tiêu chí xu hướng quá lỏng lẻo hoặc nghiêm ngặt, gây ra những đánh giá sai.

  2. Chọn không đúng các thông số EMA trong ngày - quá ngắn có thể dẫn đến giao dịch quá mức, trong khi quá dài có thể bỏ lỡ cơ hội.

  3. Các điểm dừng lỗ cố định không chính xác - đặt quá chặt có thể dẫn đến việc dừng lại thường xuyên, trong khi quá rộng có thể dẫn đến tổn thất quá mức cho mỗi giao dịch.

  4. Các EMA có thể chậm lại ở các điểm chuyển hướng, có khả năng bỏ lỡ các điểm vào / ra tốt nhất.

Hướng dẫn tối ưu hóa

  1. Xem xét thêm các chỉ số khác như RSI trên đỉnh của MACD hàng tuần để xác nhận sức mạnh xu hướng và cải thiện độ chính xác.

  2. Xem xét thêm các chỉ số khác như CCI làm bộ lọc bổ sung cho các tín hiệu chéo EMA trong ngày để giảm tần suất giao dịch và rủi ro.

  3. Đặt điểm dừng lỗ tùy chỉnh dựa trên sự biến động lịch sử của mỗi cổ phiếu để phù hợp hơn với các đặc điểm của nó.

  4. Xem xét thêm các quy tắc chiến lược để mở rộng và loại bỏ các vị trí - dần dần thêm vào các xu hướng mạnh và giảm xu hướng suy yếu để cải thiện hiệu quả vốn.

Tóm lại

Chiến lược MACD + EMA Multi-Timeframe Breakout là một chiến lược theo xu hướng với cơ sở khoa học cho cả xác định và xác nhận xu hướng. Nó có thể nắm bắt hiệu quả các xu hướng thị trường chính và tạo ra lợi nhuận ổn định. Trong khi đó, chiến lược khá hoàn chỉnh trong kiểm soát rủi ro, hạn chế hiệu quả các khoản rút thông qua các quy tắc dừng lỗ và thoát hợp lý. Tuy nhiên, cũng có một số thiếu sót, chẳng hạn như tín hiệu xu hướng tụt hậu và thiếu các quy tắc mở rộng quy mô, có thể được tối ưu hóa và cải thiện hơn nữa. Nhìn chung, đây là một chiến lược giao dịch định lượng rất đáng để học và sử dụng.


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

Thêm nữa