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

Tác giả:ChaoZhang, Ngày: 2024-02-05 14:15:40
Tags:

img

Tổng quan

Chiến lược này dựa trên đường bìa động và đường bìa động để thực hiện cả giao dịch dài và ngắn. Nó theo dõi sự đột phá giá vượt ra ngoài đường bìa để thiết lập các vị trí và đóng các vị trí khi giá vượt xuống dưới đường trung bình động cơ bản. Chiến lược này hoạt động tốt cho cổ phiếu và tiền điện tử có xu hướng rõ ràng.

Chiến lược logic

Đầu tiên, chiến lược này tính toán đường trung bình động cơ cơ bản dựa trên loại và chiều dài đường trung bình động được xác định bởi người dùng.

Sau đó, nó tính toán các đường bao bì trên và dưới dựa trên các thông số phần trăm được xác định bởi người dùng. Ví dụ, 5% có nghĩa là thiết lập các vị trí khi giá dao động 5% so với đường trung bình động cơ bản. Số lượng các đường bao bì có thể được tùy chỉnh.

Về các quy tắc nhập cảnh, đi dài khi giá phá vỡ dưới đường bao bì dưới, đi ngắn khi giá phá vỡ trên đường bao bì trên.

Cuối cùng, đóng tất cả các vị trí khi giá phá vỡ trở lại dưới đường trung bình động cơ cơ bản.

Đáng chú ý, chiến lược này thực hiện việc thiết lập vị trí một phần. Nếu có nhiều dòng phong bì, vốn sẽ được phân bổ theo tỷ lệ. Điều này ngăn ngừa rủi ro đặt cược một mặt.

Phân tích lợi thế

Những lợi thế lớn nhất của chiến lược này:

  1. Sử dụng trung bình động để xác định hướng xu hướng là một phương pháp được thiết lập tốt.

  2. lọc một số tiếng ồn với đường bìa, ngăn ngừa giao dịch quá nhạy cảm.

  3. Việc thiết lập vị trí một phần làm tăng khả năng phục hồi chiến lược. Ngay cả khi một bên thất bại, bên kia có thể tiếp tục chạy tốt. Điều này tối ưu hóa tỷ lệ rủi ro - phần thưởng tổng thể.

  4. Số đường đường và đường trung bình động có thể tùy chỉnh. Điều này làm tăng tính linh hoạt cho việc điều chỉnh tham số dựa trên các sản phẩm khác nhau.

Phân tích rủi ro

Những rủi ro chính của chiến lược này:

  1. Hệ thống trung bình động không nhạy cảm với tín hiệu chéo vàng. Nó có thể bỏ lỡ một số cơ hội nếu không có xu hướng rõ ràng.

  2. Đặt đường phong bì quá rộng có thể làm tăng tần suất giao dịch và rủi ro trượt. Đặt quá hẹp có thể bỏ lỡ những động thái lớn hơn. Tìm kiếm sự cân bằng đòi hỏi phải kiểm tra kỹ lưỡng.

  3. Chiến lược này có khả năng gặp nhiều chấn thương hơn ở các thị trường khác nhau.

  4. Nếu tìm kiếm đặt cược một mặt, cần tối ưu hóa thêm.

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

Các hướng chính để tối ưu hóa chiến lược này:

  1. Thay thế bằng các chỉ số nhập / xuất khác như KDJ vv hoặc thêm bộ lọc với nhiều chỉ số.

  2. Thêm logic dừng lợi nhuận / lỗ. Điều này khóa một số lợi nhuận và tích cực giảm thiểu một số rủi ro.

  3. Tối ưu hóa các thông số để tìm kết hợp trung bình động và phong bì tốt nhất.

  4. Kết hợp học sâu v.v. để điều chỉnh thông minh tham số.

  5. Xem xét sự khác biệt về sản phẩm và thị trường, thiết lập nhiều bộ tham số phù hợp với môi trường giao dịch khác nhau.

Kết luận

Tóm lại, chiến lược trung bình động phong bì động này hoạt động rất tốt cho giao dịch xu hướng. Nó đơn giản, hiệu quả, dễ hiểu và tối ưu hóa. Là một chiến lược cơ bản, nó có tính dẻo dai và khả năng mở rộng lớn. Khi kết hợp với các hệ thống phức tạp hơn, nó có thể được nâng cao hơn để có lợi nhuận cao hơn và các chỉ số điều chỉnh rủi ro tốt hơn. Vì vậy, nó phục vụ như một nền tảng tuyệt vời cho các chiến lược giao dịch định lượng.


/*backtest
start: 2024-01-05 00:00:00
end: 2024-02-04 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Envelope Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=1000, pyramiding = 5, commission_type=strategy.commission.percent, commission_value=0.0)

// CopyRight Crypto Robot

src = input(ohlc4, title="Source", group = "Base MA")
ma_base_window = input.int(5, "Base Mooving Average Window", step = 1, group = "Base MA")
ma_type = input.string(defval='1. SMA', options=['1. SMA', '2. PCMA', '3. EMA', '4. WMA', '5. DEMA', '6. ZLEMA', '7. HMA'], title='MA Type', group = "Base MA")


envelope_1_pct = input.float(0.05, "Envelope 1", step = 0.01, group = "Envelopes")
envelope_2_pct = input.float(0.10, "Envelope 2", step = 0.01, group = "Envelopes")
envelope_3_pct = input.float(0.15, "Envelope 3", step = 0.01, group = "Envelopes")
envelope_4_pct = input.float(0.0, "Envelope 4", step = 0.01, group = "Envelopes")
envelope_5_pct = input.float(0.0, "Envelope 5", step = 0.01, group = "Envelopes")

use_longs = input.bool(true, 'Long Positions') 
use_short = input.bool(true, 'Short Positions')

total_envelope = 0
if envelope_1_pct > 0
    total_envelope := total_envelope + 1
if envelope_2_pct > 0
    total_envelope := total_envelope + 1
if envelope_3_pct > 0
    total_envelope := total_envelope + 1
if envelope_4_pct > 0
    total_envelope := total_envelope + 1
if envelope_5_pct > 0
    total_envelope := total_envelope + 1

// ---------------------------------------------
// -------------- INDICATORS -------------------
ma_function(MA_type, MA_length) =>
    zlema_lag = (MA_length - 1) / 2
    hma_src = MA_type == '7. HMA' ? 2 * ta.wma(src, math.floor(MA_length / 2)) - ta.wma(src, MA_length) : na
    MA_type == '1. SMA' ? ta.sma(src, MA_length) : MA_type == '2. PCMA' ? (ta.highest(high, MA_length) + ta.lowest(low, MA_length)) / 2 : MA_type == '3. EMA' ? ta.ema(src, MA_length) : MA_type == '4. WMA' ? ta.wma(src, MA_length) : MA_type == '5. DEMA' ? 2 * ta.ema(src, MA_length) - ta.ema(ta.ema(src, MA_length), MA_length) : MA_type == '6. ZLEMA' ? ta.ema(src + src - src[zlema_lag], MA_length) : MA_type == '7. HMA' ? ta.wma(hma_src, math.floor(math.sqrt(MA_length))) : na

    
ma_base = ma_function(ma_type, ma_base_window)

ma_high_1 = envelope_1_pct > 0 ? ma_base * (1 + envelope_1_pct) : na
ma_high_2 = envelope_2_pct > 0 ? ma_base * (1 + envelope_2_pct) : na
ma_high_3 = envelope_3_pct > 0 ? ma_base * (1 + envelope_3_pct) : na
ma_high_4 = envelope_4_pct > 0 ? ma_base * (1 + envelope_4_pct) : na
ma_high_5 = envelope_5_pct > 0 ? ma_base * (1 + envelope_5_pct) : na

ma_low_1 = envelope_1_pct > 0 ? ma_base * (1 - envelope_1_pct) : na
ma_low_2 = envelope_2_pct > 0 ? ma_base * (1 - envelope_2_pct) : na
ma_low_3 = envelope_3_pct > 0 ? ma_base * (1 - envelope_3_pct) : na
ma_low_4 = envelope_4_pct > 0 ? ma_base * (1 - envelope_4_pct) : na
ma_low_5 = envelope_5_pct > 0 ? ma_base * (1 - envelope_5_pct) : na

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


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


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)

plot(ohlc4, color=color.purple)

// use_period = input.bool(false, "Période spécifique ?", group="periode")
// startDate = input.time(timestamp("01 Jan 2020"), "Date de début", group="periode")
// endDate = input.time(timestamp("01 Jan 2025"), "Date de fin", group="periode")


//------------------------------------------
//-------------Indicateurs------------------

// inDateRange = use_period ? ((time >= startDate) and (time < endDate)) : true

// //--------------Backtest-------------------

// strategy_pnl = strategy.netprofit + strategy.openprofit
// bnh_strategy_pnl_pcnt = (strategy_pnl / strategy.initial_capital) * 100

// float bnh_start_bar = na
// bnh_start_bar := na(bnh_start_bar[1]) or inDateRange != true? close : bnh_start_bar[1]
// float bnl_buy_hold_equity = na
// bnl_buy_hold_equity :=  inDateRange == true ? ((close - bnh_start_bar)/bnh_start_bar) * 100 : bnl_buy_hold_equity[1]

// bnh_vs_diff = bnh_strategy_pnl_pcnt - bnl_buy_hold_equity
// bnh_diff_color = bnh_vs_diff > 0 ? color.new(color.green, inDateRange ? 60 : 100) : color.new(color.red, inDateRange ? 60 : 100)

// var Table = table.new(position.top_right, columns = 2, rows = 4, border_width = 1, bgcolor = color.black, border_color = color.gray)
// table.cell(table_id = Table, column = 0, row = 0, text_color=(bnh_strategy_pnl_pcnt>bnl_buy_hold_equity)?color.gray:color.green, text_size = size.normal, text = "Buy & hold profit")
// table.cell(table_id = Table, column = 1, row = 0, text_color=(bnh_strategy_pnl_pcnt>bnl_buy_hold_equity)?color.gray:color.green, text_size = size.normal, text = str.tostring(bnl_buy_hold_equity, '#.##') + ' %')
// table.cell(table_id = Table, column = 0, row = 1, text_color=(bnh_strategy_pnl_pcnt<bnl_buy_hold_equity)?color.gray:color.green, text_size = size.normal, text = "Strategy profit")
// table.cell(table_id = Table, column = 1, row = 1, text_color=(bnh_strategy_pnl_pcnt<bnl_buy_hold_equity)?color.gray:color.green, text_size = size.normal, text = str.tostring(bnh_strategy_pnl_pcnt, '#.##') + ' %')
// table.cell(table_id = Table, column = 0, row = 2, text_color=color.yellow, text_size = size.normal, text = "Date de début")
// table.cell(table_id = Table, column = 1, row = 2, text_color=color.yellow, text_size = size.normal, text = str.format("{0,date,dd-MM-YYYY}",strategy.closedtrades.entry_time(1)))

Thêm nữa