Chiến lược cân bằng xu hướng MACD

Tác giả:ChaoZhang, Ngày: 2023-10-17 16:15:53
Tags:

img

Tổng quan

Đây là một chiến lược theo xu hướng xác định hướng tăng và giảm bằng cách sử dụng chỉ số MACD. Nó tạo ra đường chính MACD bằng cách tính toán sự khác biệt giữa đường trung bình di chuyển nhanh và chậm. Chiến lược sử dụng đường chéo vàng của đường chính và đường tín hiệu MACD để tạo ra tín hiệu mua, và đường chéo chết để tạo ra tín hiệu bán, đạt được theo dõi các xu hướng cân bằng.

Chiến lược logic

Mã đầu tiên thiết lập khung thời gian backtesting để kiểm tra hiệu suất lịch sử của chiến lược.

Chỉ số MACD sau đó được tính toán, bao gồm các cài đặt chiều dài cho đường trung bình di chuyển nhanh, đường trung bình di chuyển chậm và đường trung bình di chuyển MACD. Đường nhanh phản ứng nhạy cảm hơn và đường chậm phản ứng ổn định hơn. Sự khác biệt của chúng tạo thành đường chính MACD, sau đó được làm mịn bằng đường trung bình di chuyển để tạo ra đường tín hiệu MACD. Khi sự khác biệt vượt qua đường không, một tín hiệu tăng được tạo ra. Khi nó vượt qua dưới, một tín hiệu giảm được tạo ra.

Dựa trên các tín hiệu tăng và giảm, ghi lại lần cuối cùng khi một tín hiệu được tạo ra. Khi các đường nhanh và chậm vượt qua, xác nhận và ghi lại các tín hiệu mua / bán, sau đó một vị trí có thể được mở.

Sau khi nhập vào một vị trí, liên tục theo dõi giá cao nhất và thấp nhất của vị trí.

Ưu điểm

  1. Chỉ số MACD có thể xác định hiệu quả xu hướng và là một trong những chỉ số kỹ thuật cổ điển.

  2. Sự khác biệt giữa các đường trung bình di chuyển nhanh và chậm có thể nắm bắt sớm động lực giá và thay đổi hướng.

  3. Hiệu ứng lọc của các đường trung bình động giúp lọc ra một số tín hiệu sai.

  4. Chiến lược bao gồm một cơ chế dừng lỗ để kiểm soát rủi ro.

Rủi ro

  1. MACD có xu hướng tạo ra các tín hiệu sai với không gian tối ưu hóa hạn chế.

  2. Việc đặt stop loss không đúng có thể quá tích cực hoặc bảo thủ, đòi hỏi tối ưu hóa cá nhân trên các sản phẩm.

  3. Định dạng vị trí cố định có thể dễ dàng dẫn đến đòn bẩy quá mức, xem xét định dạng vị trí dựa trên kích thước tài khoản.

  4. Lý do cho các khung thời gian backtest cần được xác nhận để ngăn ngừa quá mức.

Tối ưu hóa

  1. Tối ưu hóa sự kết hợp giữa trung bình động nhanh và chậm để tìm các thông số tốt nhất phù hợp với các sản phẩm khác nhau.

  2. Thêm các chỉ số khác như nến, Bollinger Bands, RSI để lọc tín hiệu.

  3. Đánh giá các mức dừng lỗ khác nhau dựa trên tỷ lệ rút, tỷ lệ Sharpe.

  4. Khám phá các kỹ thuật dừng lỗ như dừng lỗ, lệnh giới hạn.

  5. Kiểm tra kích thước vị trí động dựa trên vốn chủ sở hữu, biến động.

Kết luận

Chiến lược cân bằng xu hướng MACD dựa trên chỉ số MACD cổ điển. Nó có khả năng nắm bắt được đà tăng giá một cách nhạy cảm và có thể thích nghi tốt với các sản phẩm khác nhau thông qua tối ưu hóa tham số.


/*backtest
start: 2023-09-16 00:00:00
end: 2023-10-16 00:00:00
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy("MACD BF", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0)

/////////////// Component Code Start ///////////////
testStartYear = input(2017, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

// A switch to control background coloring of the test period
testPeriodBackground = input(title="Color Background?", type=bool, defval=true)
testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=97)

testPeriod() => true

///////////////  MACD Component - Default settings for one day. /////////////// 
fastLength = input(12) // 72 for 4hr
slowlength = input(26) // 156 for 4 hr
MACDLength = input(12)  // 12 for 4hr

MACD = ema(close, fastLength) - ema(close, slowlength)
aMACD = ema(MACD, MACDLength)
delta = MACD - aMACD

long = crossover(delta, 0) 
short = crossunder(delta, 0) 

last_long = long ? time : nz(last_long[1])
last_short = short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal = short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = long_signal ? time : nz(last_long_signal[1])
last_short_signal = short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low = not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

sl_inp = input(5.0, title='Stop Loss %', type=float)/100

/////////////// Strategy Component /////////////// 
// Strategy Entry
if testPeriod()
    strategy.entry("Long Entry",  strategy.long, when=long_signal)
    strategy.entry("Short Entry", strategy.short, when=short_signal)

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) // LONG SL
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) // SHORT SL

slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na

// Strategy SL Exit
if testPeriod()
    strategy.exit("Long SL", "Long Entry", stop=long_sl, when=since_longEntry > 1)
    strategy.exit("Short SL", "Short Entry", stop=short_sl, when=since_shortEntry > 1)

//plot(strategy.equity, title="equity", color=blue, linewidth=2, style=areabr)

Thêm nữa