
Phương pháp này sử dụng MACD để xác định hướng xu hướng, kết hợp với chỉ số ATR để dừng lỗ và thực hiện giao dịch theo dõi xu hướng. Trong tên của chiến lược, các từ “thanh” và “thanh” nổi bật sử dụng MACD.
Khi đường MACD đi từ dưới lên qua đường Signal và trở thành giá trị tích cực, nó tạo ra tín hiệu mua, đây là tín hiệu gai vàng, cho thấy xu hướng giá cổ phiếu tăng lên. Khi đường MACD đi từ trên xuống qua đường Signal và trở thành giá trị âm, nó tạo ra tín hiệu bán, đây là tín hiệu gai chết, cho thấy xu hướng giá cổ phiếu giảm.
Chiến lược này là sử dụng nguyên tắc này, làm nhiều khi Gold Forks, làm trống khi Dead Forks, để thực hiện theo dõi xu hướng. Đồng thời, chiến lược này cũng giới thiệu chỉ số ATR tính toán dừng lỗ để hoàn thành việc xây dựng hệ thống giao dịch.
Cụ thể, chiến lược này đầu tiên tính toán các chỉ số MACD tiêu chuẩn như trung bình di chuyển nhanh, trung bình di chuyển chậm, chênh lệch MACD, đường tín hiệu. Sau đó, dựa trên năm tín hiệu được lựa chọn (tín hiệu tiếp tục, tín hiệu đảo ngược, tín hiệu biểu đồ cột, giao điểm MACD, giao điểm tín hiệu) để đánh giá giao điểm vàng. Cuối cùng, kết hợp với chỉ số ATR để thiết lập điểm dừng lỗ, hoàn thành logic vào và ra sân.
Chiến lược này có những ưu điểm sau:
Sử dụng chỉ số MACD để đánh giá xu hướng chính xác và đáng tin cậy, trong nhiều năm chỉ số MACD đã xuất hiện trong việc đánh giá xu hướng.
Cài đặt dừng lỗ kết hợp với chỉ số ATR có thể kiểm soát hiệu quả tỷ lệ rủi ro / lợi nhuận của một giao dịch, giảm khả năng thua lỗ.
Cung cấp năm tín hiệu tùy chọn, có thể sử dụng các tín hiệu phù hợp hơn cho các thị trường khác nhau, nâng cao khả năng thích ứng của chiến lược.
Có nhiều tham số có thể nhập, có thể đạt được kết quả giao dịch tốt hơn bằng cách tối ưu hóa tham số.
Chiến lược này cũng có một số rủi ro:
Chỉ số MACD dễ tạo ra tín hiệu sai, có thể gây ra tổn thất không cần thiết. Có thể kết hợp với các chỉ số khác để lọc tín hiệu.
Chỉ số ATR chỉ mô hình sự biến động trong khoảng thời gian gần đây, không thể dừng lại chính xác đối với tình huống cực đoan. Có thể giới thiệu dừng động để giải quyết.
Hiệu quả của tín hiệu được chọn có thể không ổn định, cần phải thử nghiệm lại rất nhiều để xác định các tham số tối ưu.
Các tham số tín hiệu và tham số quản lý rủi ro cần được tối ưu hóa đồng thời, nếu không sẽ khó đạt được kết quả tối ưu.
Chiến lược này cũng có thể được tối ưu hóa bằng cách:
Thử các đường trung bình di chuyển khác như TMA, HullMA, và lọc các tín hiệu MACD.
Các nhà nghiên cứu đã thử nghiệm các cơ chế dừng lỗ động để xử lý tốt hơn các biến động của các biến động cực đoan.
Tối ưu hóa từng bước đối với các tham số truyền thống của chỉ số MACD để tìm các tham số tốt hơn.
Sử dụng các phương pháp học máy để tìm ra ATR tối ưu để quản lý rủi ro tốt hơn.
Năm loại tín hiệu được kiểm tra lại để xác định tín hiệu tốt nhất.
Đào tạo mạng lưới thần kinh để đánh giá hiệu quả của loại tín hiệu, tìm kiếm tín hiệu mới dựa trên MACD.
Chiến lược theo dõi xu hướng của MACD, sử dụng chỉ số MACD để xác định hướng xu hướng, kết hợp với chỉ số ATR để dừng lỗ, có thể thu được cơ hội giao dịch xu hướng hiệu quả. Chiến lược có nhiều lợi thế như các tham số chỉ số có thể được tối ưu hóa, cơ chế dừng lỗ hoàn chỉnh, loại tín hiệu có thể được chọn.
/*backtest
start: 2023-11-21 00:00:00
end: 2023-12-21 00:00:00
period: 1h
basePeriod: 15m
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/
// © vuagnouxb
//@version=4
strategy("BV's MACD SIGNAL TESTER", overlay=true)
//------------------------------------------------------------------------
//---------- Confirmation Calculation ------------ INPUT
//------------------------------------------------------------------------
// Getting inputs
fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
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=false)
sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=false)
// 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)
// -- Trade entry signals
signalChoice = input(title = "Choose your signal", defval = "Continuation", options = ["Continuation", "Reversal", "Histogram", "MACD Line ZC", "Signal Line ZC"])
continuationSignalLong = signalChoice == "Continuation" ? crossover(macd, signal) and macd > 0 :
signalChoice == "Reversal" ? crossover(macd, signal) and macd < 0 :
signalChoice == "Histogram" ? crossover(hist, 0) :
signalChoice == "MACD Line ZC" ? crossover(macd, 0) :
signalChoice == "Signal Line ZC" ? crossover(signal, 0) :
false
continuationSignalShort = signalChoice == "Continuation" ? crossunder(macd, signal) and macd < 0 :
signalChoice == "Reversal" ? crossover(signal, macd) and macd > 0 :
signalChoice == "Histogram" ? crossunder(hist, 0) :
signalChoice == "MACD Line ZC" ? crossunder(macd, 0) :
signalChoice == "Signal Line ZC" ? crossunder(signal, 0) :
false
longCondition = continuationSignalLong
shortCondition = continuationSignalShort
//------------------------------------------------------------------------
//---------- ATR MONEY MANAGEMENT ------------
//------------------------------------------------------------------------
SLmultiplier = 1.5
TPmultiplier = 1
JPYPair = input(type = input.bool, title = "JPY Pair ?", defval = false)
pipAdjuster = JPYPair ? 1000 : 100000
ATR = atr(14) * pipAdjuster // 1000 for jpy pairs : 100000
SL = ATR * SLmultiplier
TP = ATR * TPmultiplier
//------------------------------------------------------------------------
//---------- TIME FILTER ------------
//------------------------------------------------------------------------
YearOfTesting = input(title = "How many years of testing ?" , type = input.integer, defval = 3)
_time = 2020 - YearOfTesting
timeFilter = (year > _time)
//------------------------------------------------------------------------
//--------- ENTRY FUNCTIONS ----------- INPUT
//------------------------------------------------------------------------
if (longCondition and timeFilter)
strategy.entry("Long", strategy.long)
if (shortCondition and timeFilter)
strategy.entry("Short", strategy.short)
//------------------------------------------------------------------------
//--------- EXIT FUNCTIONS -----------
//------------------------------------------------------------------------
strategy.exit("ATR", from_entry = "Long", profit = TP, loss = SL)
strategy.exit("ATR", from_entry = "Short", profit = TP, loss = SL)