Chiến lược trung bình đảo ngược phong bì trung bình di chuyển

Tác giả:ChaoZhang, Ngày: 2023-12-04 16:12:39
Tags:

img

Tổng quan

Chiến lược trung bình chuyển động phong bì đảo ngược trung bình là một chiến lược giao dịch đảo ngược trung bình dựa trên trung bình chuyển động. Nó sử dụng trung bình chuyển động nhân tố kép (DEMA) làm tính toán cơ sở và thêm một số phong bì phía trên và phía dưới nó. Khi giá chạm vào các dải phong bì, nó mở các vị trí dài hoặc ngắn dựa trên hướng. Khi giá lùi xuống trung bình chuyển động, nó đóng tất cả các vị trí.

Chiến lược logic

Chiến lược này sử dụng DEMA (Double Exponential Moving Average) làm chỉ số cơ bản, đó là một đường trung bình động nhạy cảm hơn với những thay đổi giá gần đây.

Khi giá tăng và tiếp cận dải phong bì trên, chiến lược mở một vị trí ngắn. Khi giá giảm và chạm vào dải phong bì dưới, nó mở một vị trí dài. Nó thêm một vị trí mới mỗi khi một dải giá mới được chạm vào. Khi giá lùi lại gần mức trung bình động, tất cả các vị trí được đóng.

Thông qua việc nắm bắt các biến động giá quá mức với các dải bao bì và lợi nhuận từ sự đảo ngược, chiến lược nhằm mục đích mua thấp và bán cao. Nó phù hợp với chu kỳ thị trường với xu hướng đảo ngược trung bình rõ ràng, chẳng hạn như tiền điện tử như Bitcoin.

Ưu điểm

  • Sử dụng Đường trung bình di chuyển nhân tố kép, nhạy cảm với những thay đổi giá ngắn hạn để bắt được sự đảo ngược xu hướng.
  • Các dải phong bì xung quanh trung bình động có thể nắm bắt chính xác sự đảo ngược giá.
  • Mở các vị trí theo lô, sử dụng đầy đủ hiệu quả vốn.
  • Nhanh chóng thay đổi hướng sau khi kiếm được lợi nhuận để thích nghi với những thay đổi trên thị trường.
  • Các thông số có thể được tối ưu hóa tự do.

Rủi ro

  • Không thể lợi nhuận từ thị trường xu hướng mạnh mẽ.
  • Các thông số không chính xác có thể gây ra giao dịch quá mức.
  • Cần thị trường tương đối ổn định, không phù hợp với môi trường biến động cao.
  • Các phong bì quá hẹp có thể ngăn cản việc vào vị trí.

Các rủi ro có thể được giảm bằng cách mở rộng phạm vi bao bì một cách thích hợp để tăng độ nhạy và điều chỉnh chiều dài trung bình động để phù hợp với các chu kỳ thị trường khác nhau.

Hướng dẫn tối ưu hóa

Chiến lược có thể được tối ưu hóa trong các khía cạnh sau:

  1. Kiểm tra các thuật toán trung bình động khác nhau.

  2. Điều chỉnh tham số chiều dài trung bình động để thích nghi tốt hơn với biến động ngắn hạn.

  3. Tối ưu hóa các thông số phong bì bằng cách kiểm tra các cài đặt tỷ lệ phần trăm khác nhau.

  4. Thêm các phương pháp dừng lỗ như dừng lỗ để hạn chế lỗ giao dịch duy nhất.

  5. Thêm các điều kiện lọc với các chỉ số khác để tránh các mục nhập không hợp lệ trong các thị trường không hợp lý.

Kết luận

Chiến lược trung bình chuyển động bao bì chuyển động có hiệu quả nắm bắt các cơ hội đảo ngược trung bình bằng cách xây dựng một kênh giá xung quanh trung bình chuyển động. Nó có thể được điều chỉnh linh hoạt cho các môi trường thị trường khác nhau thông qua điều chỉnh tham số. Với chi phí giao dịch tương đối thấp và lợi nhuận cao, đây là một chiến lược giao dịch định lượng được khuyến cáo.


/*backtest
start: 2022-11-27 00:00:00
end: 2023-12-03 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Mean Reversion - Envelope Strategy", overlay=true )

// ----------------------- DESCRIPTION -----------------------
// THIS SCRIPT IS A MEAN REVERSION SYSTEM THAT USES A MOVING AVERAGE AS BASE CALCULATION AND A % OF THIS MOVING AVERAGE TO CALCULATE THE ENVELOPE
// BY DEFAULT, THE SYSTEM WILL PLACE LONG ORDERS ON THE MOVING AVERAGE -5% PER ENVELOPE COUNT (5%, 10% AND SO ON...)
// YOU CAN ENABLE THE SHORT ORDERS THAT WILL FOLLOW THE SAME LOGIC ON THE OPPOSITE SIDE
// THE SYSTEM WILL CLOSE EVERY ONGOING TRADE WHEN THE PRICE RETURNS TO THE MEAN

// ---------------------------------------------
// ---------------- SETTINGS -------------------
src = input(close, "Moving Average Source", group = "Moving Average")
ma_window = input.int(5, "Moving Average Window", step = 1, group = "Moving Average")
ma_type = input.string('4. DEMA', "Moving Average Type", options=['1. SMA', '2. EMA', '3. RMA', '4. DEMA'], group = "Moving Average")
enveloppe_step = input.float(0.05, "Delta Per Enveloppe", step = 0.01, group = "Envelope")
envelope_count = input.int(5, "Envelope count", options = [1, 2, 3, 4, 5], group = "Envelope")
use_longs = input.bool(true, 'Use Long Orders ?', group = "Orders") 
use_short = input.bool(false, 'Use Short Orders ?', group = "Orders")


// ---------------------------------------------
// -------------- INDICATORS -------------------
ma_funct() =>
    if(ma_type == '1. SMA') 
        ta.sma(src, ma_window)
    if(ma_type == '2. EMA') 
        ta.ema(src, ma_window)
    if(ma_type == '3. RMA') 
        ta.rma(src, ma_window)
    if(ma_type == '4. DEMA') 
        2 * ta.ema(src, ma_window) - ta.ema(ta.ema(src, ma_window), ma_window)

ma_base = ma_funct()

ma_high_1 = envelope_count > 0 ? ma_base * (1 + enveloppe_step) : na
ma_high_2 = envelope_count > 1 ? ma_base * (1 + enveloppe_step * 2) : na
ma_high_3 = envelope_count > 2 ? ma_base * (1 + enveloppe_step * 3) : na
ma_high_4 = envelope_count > 3 ? ma_base * (1 + enveloppe_step * 4) : na
ma_high_5 = envelope_count > 4 ? ma_base * (1 + enveloppe_step * 5) : na

ma_low_1 = envelope_count > 0 ? ma_base * (1 - enveloppe_step) : na
ma_low_2 = envelope_count > 0 ? ma_base * (1 - enveloppe_step * 2) : na
ma_low_3 = envelope_count > 0 ? ma_base * (1 - enveloppe_step * 3) : na
ma_low_4 = envelope_count > 0 ? ma_base * (1 - enveloppe_step * 4) : na
ma_low_5 = envelope_count > 0 ? ma_base * (1 - enveloppe_step * 5) : na


// ---------------------------------------------
// --------------- STRATEGY --------------------
if use_longs
    if envelope_count > 0 and strategy.opentrades < 1
        strategy.entry('long 1', strategy.long, limit=ma_low_1, qty=(strategy.equity / ma_low_1) * (1 / envelope_count))
    if envelope_count > 1 and strategy.opentrades < 2
        strategy.entry('long 2', strategy.long, limit=ma_low_2, qty=(strategy.equity / ma_low_2) * (1 / envelope_count))
    if envelope_count > 2 and strategy.opentrades < 3
        strategy.entry('long 3', strategy.long, limit=ma_low_3, qty=(strategy.equity / ma_low_3) * (1 / envelope_count))
    if envelope_count > 3 and strategy.opentrades < 4
        strategy.entry('long 4', strategy.long, limit=ma_low_4, qty=(strategy.equity / ma_low_4) * (1 / envelope_count))
    if envelope_count > 4 and strategy.opentrades < 5
        strategy.entry('long 5', strategy.long, limit=ma_low_5, qty=(strategy.equity / ma_low_5) * (1 / envelope_count))


if use_short
    if envelope_count > 0 and strategy.opentrades < 1
        strategy.entry('short 1', strategy.short, limit=ma_high_1, qty=(strategy.equity / ma_high_1) * (1 / envelope_count))
    if envelope_count > 1 and strategy.opentrades < 2
        strategy.entry('short 2', strategy.short, limit=ma_high_2, qty=(strategy.equity / ma_high_2) * (1 / envelope_count))
    if envelope_count > 2 and strategy.opentrades < 3
        strategy.entry('short 3', strategy.short, limit=ma_high_3, qty=(strategy.equity / ma_high_3) * (1 / envelope_count))
    if envelope_count > 3 and strategy.opentrades < 4
        strategy.entry('short 4', strategy.short, limit=ma_high_4, qty=(strategy.equity / ma_high_4) * (1 / envelope_count))
    if envelope_count > 4 and strategy.opentrades < 5
        strategy.entry('short 5', strategy.short, limit=ma_high_5, qty=(strategy.equity / ma_high_5) * (1 / envelope_count))

strategy.exit('close', limit=ma_base)


// ---------------------------------------------
// ------------------ PLOT ---------------------
ma_base_plot = plot(ma_base, title = "Base MA", color = color.orange, linewidth = 3, offset = 1)

ma_high_1_plot = plot(ma_high_1, title = "MA high 1", color = color.red, offset = 1)
ma_high_2_plot = plot(ma_high_2, title = "MA high 2", color = color.red, offset = 1)
ma_high_3_plot = plot(ma_high_3, title = "MA high 3", color = color.red, offset = 1)
ma_high_4_plot = plot(ma_high_4, title = "MA high 4", color = color.red, offset = 1)
ma_high_5_plot = plot(ma_high_5, title = "MA high 5", color = color.red, offset = 1)

ma_low_1_plot = plot(ma_low_1, title = "MA low 1", color = color.green, offset = 1)
ma_low_2_plot = plot(ma_low_2, title = "MA low 2", color = color.green, offset = 1)
ma_low_3_plot = plot(ma_low_3, title = "MA low 3", color = color.green, offset = 1)
ma_low_4_plot = plot(ma_low_4, title = "MA low 4", color = color.green, offset = 1)
ma_low_5_plot = plot(ma_low_5, title = "MA low 5", color = color.green, offset = 1)


Thêm nữa