
Chiến lược này là một chiến lược giao dịch dựa trên chỉ số đường trung bình không động của McKin. Chỉ số đường trung bình không động của McKin là một phiên bản cải tiến của chỉ số đường trung bình di chuyển, có thể nắm bắt tốt hơn các thay đổi trong xu hướng thị trường. Chiến lược này sử dụng tín hiệu của chỉ số đường trung bình không động của McKin, kết hợp với tín hiệu của đường trung bình phá vỡ giá, để xây dựng các quy tắc mua và bán để đạt được lợi nhuận.
Chiến lược này chủ yếu sử dụng hai đường trung bình, lần lượt là đường trung bình di chuyển chỉ số 21 ngày và đường trung bình di chuyển chỉ số 42 ngày. Khi đường trung bình ngắn hạn vượt qua đường trung bình dài hạn, nó được coi là tín hiệu mua; khi đường trung bình ngắn hạn vượt qua đường trung bình dài hạn, nó được coi là tín hiệu bán.
Ngoài ra, chiến lược này cũng cần đáp ứng các điều kiện khi giá cao hơn đường trung bình không động của McKinsey, giá vượt qua đường trung bình ngắn hạn, để tạo ra tín hiệu mua. Đối với tín hiệu bán cũng cần đáp ứng các điều kiện khi giá thấp hơn đường trung bình không động của McKinsey, giá giảm xuống đường trung bình ngắn hạn.
Cụ thể, các điều kiện kích hoạt tín hiệu mua là: Đi qua đường trung bình dài trên đường trung bình ngắn, giá đóng cửa cao hơn đường trung bình không trung bình của McKin, giá đóng cửa phá vỡ đường trung bình ngắn xuống. Các điều kiện kích hoạt tín hiệu bán là: Đi qua đường trung bình dài dưới đường trung bình ngắn, giá đóng cửa thấp hơn đường trung bình không trung bình của McKin, giá đóng cửa phá vỡ đường trung bình ngắn lên.
Công thức tính toán của đường trung bình không động của McKin là: MDIt = MDIt-1 + (Close - MDIt-1) / Max(k * Period * (Close / MDIt-1) ^ 4, 1) ◄ trong đó, MDIt là giá trị hiện tại, MDIt-1 là giá trị ngày trước, Close là giá đóng cửa ngày hôm đó, k là hằng số mài mòn, và Period là tính toán.
Chỉ số đường trung bình McKinsey đã cải thiện sự chậm trễ của đường trung bình truyền thống, giúp nắm bắt được sự thay đổi của xu hướng giá nhanh hơn.
Kết hợp với hai đường cong tạo ra tín hiệu giao dịch, có thể lọc hiệu quả các đột phá giả.
Thêm các điều kiện giá cao hơn / thấp hơn đường trung bình của McKinsey để tránh giao dịch thường xuyên trong các vùng xung đột.
Các chỉ số di chuyển trung bình được sử dụng để làm cho đường trung bình nhạy cảm hơn với sự thay đổi giá gần đây.
Trong thị trường dao động ngang, có thể tạo ra tín hiệu giả, do đó gây thiệt hại. Các tham số có thể được điều chỉnh thích hợp, lọc tín hiệu.
Sự đột phá lớn có thể dẫn đến việc không thể xây dựng kho hàng kịp thời, điều kiện nhập cảnh nên được nới lỏng thích hợp.
Thiết lập tham số không đúng cách cũng ảnh hưởng đến hiệu quả của chiến lược, nên kiểm tra tối ưu hóa tham số.
Cần chú ý đến các rủi ro hệ thống liên quan đến việc nắm giữ lâu dài và có thể thiết lập điểm dừng lỗ.
Các tham số đường trung bình có thể được thử nghiệm với các độ dài khác nhau để tìm ra sự kết hợp phù hợp hơn.
Có thể thêm các chỉ số kỹ thuật khác, chẳng hạn như KD, MACD, để tối ưu hóa lựa chọn điểm mua và bán.
Các giá trị của tham số k có thể được điều chỉnh theo các giống và thị trường khác nhau, để tối ưu hóa tính toán đường trung bình của McKinsey.
Có thể kết hợp với chỉ số biến động để thực hiện kích thước vị trí động, kiểm soát rủi ro đơn lẻ.
Bạn có thể đặt điểm dừng để kiểm soát rủi ro mất mát, hoặc thử nghiệm di chuyển dừng để khóa lợi nhuận.
Chiến lược này sử dụng khả năng theo dõi nhanh chóng của chỉ số không đồng nhất của McKin, kết hợp với tín hiệu giao dịch được hình thành bởi giá phá vỡ đường trung bình, có thể theo dõi xu hướng một cách hiệu quả và chuyển vị trí kịp thời khi xu hướng biến đổi. So với chiến lược đường hai đồng nhất truyền thống, chiến lược này có thể nắm bắt sự thay đổi xu hướng giá nhanh hơn.
/*backtest
start: 2022-11-07 00:00:00
end: 2023-11-13 00:00:00
period: 1d
basePeriod: 1h
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/
// © LucasZancheta
//@version=4
strategy(shorttitle="Maguila", title="McGinley Dynamic Indicator", overlay=true)
//Médias móveis
MA1Period=input(21, title="MA1")
MA2Period=input(42, title="MA2")
MA1 = ema(close, MA1Period)
MA2 = ema(close, MA2Period)
aboveAverage = MA1 >= MA2
hunderAverage = MA2 >= MA1
//Período do backtest
startDate = input(title="Start Date", type=input.integer, defval=28, minval=1, maxval=31)
startMonth = input(title="Start Month", type=input.integer, defval=5, minval=1, maxval=12)
startYear = input(title="Start Year", type=input.integer, defval=2019, minval=1800, maxval=2100)
endDate = input(title="End Date", type=input.integer, defval=28, minval=1, maxval=31)
endMonth = input(title="End Month", type=input.integer, defval=5, minval=1, maxval=12)
endYear = input(title="End Year", type=input.integer, defval=2030, minval=1800, maxval=2100)
//Verifica se o candle está dentro do período do backtest
inDateRange = (time >= timestamp(syminfo.timezone, startYear, startMonth, startDate, 0, 0)) and (time < timestamp(syminfo.timezone, endYear, endMonth, endDate, 0, 0))
//Número de periodos da média móvel
period = input(title="Períodos", type=input.integer, defval=20)
//Constante K (0.6)
k = input(title="Constante K", type=input.float, defval=0.6)
//Preço de fechamento
closePrice = input(title="Preço", type=input.source, defval=close)
mdi = 0.0
//Fórmula de McGinley
mdi := na(mdi[1]) ? closePrice : mdi[1] + (closePrice - mdi[1]) / max((k * period * pow(closePrice / mdi[1], 4)), 1)
//Regra de coloração
mdiColor = closePrice > mdi ? color.green : closePrice < mdi ? color.red : color.black
//Inserindo as informações no gráfico
plot(MA1, color=color.blue, linewidth=2)
plot(MA2, color=color.purple, linewidth=2)
barcolor(mdiColor)
//Estratégia
buySignal = aboveAverage and closePrice > mdi and crossunder(low, MA1) and close > MA1
buyLoss = closePrice < mdi and close < MA1 and close < MA2
if (inDateRange)
strategy.entry("Compra", strategy.long, qty=1, when= buySignal)
strategy.exit("Gain da compra", "Compra", qty=1, profit=20)
strategy.close("Compra", qty=1, when= buyLoss, comment="Loss na operação")
sellSignal = hunderAverage and closePrice < mdi and crossover(high, MA1) and close < MA1
sellLoss = closePrice > mdi and close > MA1 and close > MA2
if (inDateRange)
strategy.entry("Venda", strategy.short, qty=1, when= sellSignal)
strategy.exit("Gain da venda", "Venda", qty=1, profit=20)
strategy.close("Venda", qty=1, when= sellLoss, comment="Loss na operação")
if (not inDateRange)
strategy.close_all()