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


Ngày tạo: 2024-03-22 11:13:12 sửa đổi lần cuối: 2024-03-22 11:13:12
sao chép: 0 Số nhấp chuột: 685
1
tập trung vào
1617
Người theo dõi

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

Tổng quan

Chiến lược này kết hợp các chỉ số MACD và nhiều đường EMA để nắm bắt xu hướng mạnh mẽ của thị trường từ hai quy mô thời gian đường tuần và đường phút. Sử dụng chỉ số MACD trên đường tuần để xác định hướng của xu hướng lớn, sử dụng ba đường EMA ngày 5, 15 và 30 trên đường phút để xác nhận xu hướng và giao dịch tại điểm phá vỡ. Ý tưởng chính của chiến lược này là đi theo xu hướng mạnh mẽ, cưỡi trên làn sóng lớn, đường EMA ngắn phá vỡ đường EMA dài vào thời gian giao dịch, đường EMA rút lui hoặc dừng lại khi điều kiện gây ra.

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

  1. MACD đường viền để xác định xu hướng lớn: tính toán MACD đường viền, so với MACD của tuần này và tuần trước, chênh lệch lớn hơn 0 cho thấy xu hướng lên, nhỏ hơn 0 cho thấy xu hướng xuống. Cập nhật hướng xu hướng mỗi tuần khi mở cửa.

  2. Xác định xu hướng của nhiều đường EMA: vẽ ba đường EMA 5, 15 và 30 ngày trên biểu đồ đường phút. Khi EMA ngắn hạn chạy trên và lên trên EMA dài hạn, xu hướng lên; ngược lại, xu hướng xuống.

  3. EMA giao dịch tại điểm giao nhau:

    • Lấy nhiều: Lấy nhiều khi MACD tuần tròn đi lên và giá đóng cửa trên đường phút vượt qua EMA 15 ngày. Giới hạn dừng lỗ được thiết lập ở mức điểm cố định dưới giá trung bình của vị trí, hoặc bằng phẳng khi vượt qua EMA 15 ngày dưới EMA 5 ngày.
    • Hạn chế: Khi MACD theo chiều hướng giảm và vượt qua 30 ngày EMA dưới 5 ngày EMA. Đặt điểm dừng trên giá trung bình của vị trí giữ một số điểm cố định, hoặc khi vượt qua 15 ngày EMA trên 5 ngày EMA.
  4. Không có điều kiện đặt hàng.

Phân tích lợi thế

  1. Kết hợp hai thang thời gian, đánh giá xu hướng đáng tin cậy hơn. MACD đường tròn đánh giá xu hướng lớn, tránh làm quá nhiều khi thị trường bị chấn động; EMA đường phút xác nhận xu hướng chéo, nắm bắt mọi làn sóng trong xu hướng.

  2. Các tham số EMA của dòng phút được chọn trong 5, 15, 30 ngày, và kết hợp ba dòng có thể lọc rất tốt tiếng ồn và nắm bắt xu hướng rõ ràng.

  3. Cài đặt mức dừng lỗ hợp lý, kiểm soát rủi ro giao dịch đơn. Cài đặt số điểm dừng và EMA dừng kết hợp, có thể kiểm soát tổn thất và theo xu hướng.

  4. Thiết kế mô-đun của mã, các mô-đun chính như tính toán MACD, tính toán EMA, v.v., có khả năng sử dụng nhiều và mở rộng.

Phân tích rủi ro

  1. Lưu ý rằng nếu bạn không chọn đúng ngưỡng chênh lệch của MACD, nó có thể dẫn đến tiêu chuẩn đánh giá xu hướng quá lỏng lẻo hoặc nghiêm ngặt, khiến phán đoán không chính xác. Bạn có thể chọn ngưỡng tối ưu bằng cách đo lại và tối ưu hóa tham số.

  2. Các tham số EMA của dòng phút được chọn không đúng, chu kỳ quá ngắn sẽ dẫn đến giao dịch thường xuyên, quá dài sẽ bỏ lỡ cơ hội tốt. Bạn có thể chọn kết hợp tham số tốt nhất bằng cách kiểm tra lại và tối ưu hóa tham số.

  3. Chọn vị trí dừng lỗ số điểm cố định không phù hợp, thiết lập quá nhỏ sẽ dẫn đến dừng lỗ thường xuyên, thiết lập quá lớn sẽ dẫn đến thua lỗ đơn quá nhiều. Có thể thiết lập dừng lỗ cá nhân theo đặc điểm biến động của giống.

  4. Tuy nhiên, trong thời gian dài, chiến lược này có thể kiểm soát rủi ro một cách hiệu quả và hoạt động tốt.

Hướng tối ưu hóa

  1. Có thể xem xét dựa trên MACD để đánh giá xu hướng, sau đó xếp chồng các chỉ số như RSI để xác nhận cường độ của xu hướng, tăng độ chính xác của phán đoán xu hướng.

  2. Các chỉ số như CCI có thể được thêm vào để lọc các tín hiệu giao dịch, giảm tần suất giao dịch và rủi ro.

  3. Có thể thiết lập điểm dừng cá nhân dựa trên tính năng biến động lịch sử của từng cổ phiếu, làm cho chiến lược phù hợp hơn với đặc điểm của giống.

  4. Có thể xem xét các chiến lược gia tăng và giảm vị thế, tăng dần khi xu hướng mạnh, giảm dần khi xu hướng yếu, tăng hiệu quả sử dụng vốn.

Tóm tắt

Chiến lược phá vỡ MACD + EMA là một chiến lược theo dõi xu hướng, có cơ sở khoa học để đánh giá xu hướng và xác nhận xu hướng, có thể nắm bắt được xu hướng chính của thị trường một cách hiệu quả, thu được lợi nhuận ổn định. Đồng thời, chiến lược này cũng khá hoàn hảo về kiểm soát rủi ro, bằng cách thiết lập các điều kiện dừng lỗ và vị trí hợp lý, kiểm soát hiệu quả chiến lược rút lui.

Mã nguồn chiến lược
/*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)