Chiến lược giao dịch trung bình di chuyển McGinley

Tác giả:ChaoZhang, Ngày: 23-11-14 15:48:46
Tags:

img

Tổng quan

Chiến lược này dựa trên chỉ số trung bình động động McGinley. Chỉ số MA McGinley là một phiên bản cải tiến của các đường trung bình động có thể theo dõi xu hướng giá tốt hơn. Chiến lược sử dụng các tín hiệu được tạo ra bởi chỉ số MA McGinley kết hợp với sự đột phá giá của MA để thiết lập các quy tắc giao dịch để kiếm lợi nhuận.

Chiến lược logic

Chiến lược này chủ yếu sử dụng hai đường trung bình động, EMA 21 giai đoạn và EMA 42 giai đoạn. Khi MA ngắn hơn vượt trên MA dài hơn, nó được coi là tín hiệu mua. Khi MA ngắn hơn vượt dưới MA dài hơn, nó được coi là tín hiệu bán.

Ngoài ra, chiến lược cũng yêu cầu giá phải ở trên MA Động lực McGinley và phá vỡ trên MA ngắn hơn để tạo ra tín hiệu mua. Đối với tín hiệu bán, nó cũng cần giá phải ở dưới MA McGinley và phá vỡ dưới MA ngắn hơn.

Cụ thể, tín hiệu mua được kích hoạt khi: MA ngắn hơn vượt qua MA dài hơn, giá đóng trên MA McGinley, giá đóng phá vỡ dưới MA ngắn hơn.

MA McGinley được tính như sau: 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ị trước đó, Close là giá đóng, k là hằng số làm mịn và Period là thời gian tính toán. Công thức này cho phép MA theo dõi sự thay đổi giá trong thời gian thực.

Ưu điểm

  1. McGinley MA cải thiện vấn đề chậm trễ của các MA truyền thống và có thể nhanh chóng nắm bắt sự thay đổi xu hướng.

  2. Sử dụng hai MAs để tạo ra tín hiệu có thể lọc hiệu quả các sự đột phá sai.

  3. Thêm giá trên/dưới McGinley MA tránh giao dịch quá mức trong các thị trường giới hạn phạm vi.

  4. Sử dụng EMA làm cho MA nhạy cảm hơn với những thay đổi giá gần đây.

Rủi ro

  1. Whipsaws có thể tạo ra tín hiệu sai trong thị trường bên, gây ra tổn thất.

  2. Các lỗ hổng có thể không kích hoạt nhập cảnh kịp thời. Quy tắc nhập cảnh có thể được nới lỏng.

  3. Việc điều chỉnh tham số không đầy đủ có thể ảnh hưởng đến hiệu suất chiến lược.

  4. Thời gian giữ dài gây ra rủi ro hệ thống.

Những cải tiến

  1. Kiểm tra các chiều dài MA khác nhau để tìm kết hợp tối ưu.

  2. Thêm các chỉ số khác như KD, MACD để cải thiện thời gian nhập / xuất.

  3. Điều chỉnh giá trị k dựa trên các sản phẩm và thị trường khác nhau để tối ưu hóa tính toán MA McGinley.

  4. Bao gồm các biện pháp biến động cho kích thước vị trí động và kiểm soát rủi ro.

  5. Đặt dừng lỗ để kiểm soát lỗ.

Kết luận

Chiến lược này sử dụng khả năng theo dõi nhanh của McGinley MA kết hợp với các tín hiệu đột phá giá để theo dõi hiệu quả xu hướng và chuyển vị trí khi xu hướng đảo ngược.


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




Thêm nữa