Chiến lược Đường trung bình động bao động


Ngày tạo: 2024-02-05 14:15:40 sửa đổi lần cuối: 2024-02-05 14:15:40
sao chép: 0 Số nhấp chuột: 641
1
tập trung vào
1617
Người theo dõi

Chiến lược Đường trung bình động bao động

Tổng quan

Chiến lược này dựa trên đường trung bình di chuyển và đường trục trặc động, thực hiện giao dịch hai chiều đa luồng. Nó sẽ theo dõi giá phá vỡ đường trục trặc để thiết lập vị trí, đồng bằng khi giá lại giảm xuống đường trung bình chuẩn. Chiến lược này áp dụng cho các cổ phiếu và tiền kỹ thuật số có xu hướng rõ ràng.

Nguyên tắc chiến lược

Đầu tiên, chiến lược này tính toán đường trung bình chuẩn dựa trên loại và độ dài đường trung bình mà người dùng chọn. Các đường trung bình phổ biến bao gồm SMA, EMA, v.v.

Sau đó, dựa trên các tham số phần trăm được thiết lập bởi người dùng, tính toán đường viền lên xuống. Ví dụ: 5% đại diện cho biến động giá ALLOWED_BRACKET105% khi kích hoạt thiết lập vị trí. Số lượng đường viền có thể được tùy chỉnh.

Trong quy tắc ra thị trường, nếu phá vỡ đường dây giao dịch dưới, hãy làm nhiều hơn; nếu phá vỡ đường dây giao dịch trên, hãy làm trống.

Cuối cùng, khi giá lại giảm xuống đường trung bình cơ sở, hãy xóa tất cả các vị trí. Đây là một điểm thoát ra khỏi xu hướng theo dõi.

Cần lưu ý rằng chiến lược này thực hiện việc phân chia các khoản tiền đặt cược. Nếu có nhiều đường dây liên kết, thì số tiền sẽ được phân bổ theo tỷ lệ. Điều này tránh nguy cơ chơi đơn phương.

Phân tích lợi thế

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

  1. Có tính năng tự động theo dõi xu hướng. Sử dụng đường trung bình để đánh giá xu hướng là rất phổ biến, vì vậy đây là một phương pháp hiệu quả.

  2. Sử dụng đường dây bao quanh để lọc một phần tiếng ồn, tránh các vấn đề quá nhạy cảm dẫn đến giao dịch không cần thiết. Thiết lập tham số hợp lý có thể tối ưu hóa đáng kể khả năng lợi nhuận của chiến lược.

  3. Xây dựng vị trí phân chia tăng cường tính kiên cường chiến lược. Các hướng khác có thể tiếp tục hoạt động tốt ngay cả khi đột phá đơn phương thất bại. Điều này tối ưu hóa tỷ lệ lợi nhuận rủi ro tổng thể.

  4. Cho phép tùy chỉnh số lượng đường trung bình và đường viền. Điều này làm tăng tính linh hoạt trong chiến lược, người dùng có thể điều chỉnh tham số cho các giống 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 là:

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

  2. Đường bao trùm được thiết lập quá rộng có thể làm tăng số lần giao dịch và rủi ro trượt. Đường được thiết kế quá hẹp có thể bị bỏ lỡ trong trường hợp lớn. Tìm điểm cân bằng cần được thử nghiệm đầy đủ.

  3. Trong tình huống chấn động, chiến lược này có thể có nhiều khả năng được đặt. Vì vậy, lựa chọn giống giống có xu hướng rõ ràng là tốt hơn.

  4. Việc xây dựng kho phân bổ sẽ hạn chế lợi nhuận của mỗi đơn vị. Nếu bạn chỉ muốn chấp nhận rủi ro đơn phương, bạn cũng cần tối ưu hóa bổ sung.

Hướng tối ưu hóa

Chiến lược này có thể được tối ưu hóa theo các hướng sau:

  1. Thay thế các chỉ số khác để quyết định xây dựng kho và kho. Ví dụ như chỉ số KDJ, v.v. hoặc kết hợp nhiều chỉ số để đặt điều kiện lọc.

  2. Thêm logic dừng lỗ. Điều này có thể khóa một phần lợi nhuận và chủ động tránh một phần rủi ro.

  3. Tối ưu hóa tham số để tìm kiếm kết hợp đường trung bình và đường tròn tốt nhất. Điều này đòi hỏi phải kiểm tra lại đầy đủ và tối ưu hóa để tìm kiếm cặp tham số tốt nhất.

  4. Kết hợp các kỹ thuật như học sâu để tối ưu hóa tham số thông minh. Luôn học và cập nhật các thiết lập tham số theo thời gian.

  5. Xem xét sự khác biệt về giống và thị trường, thiết lập nhiều tham số cho môi trường giao dịch khác nhau. Điều này sẽ làm tăng đáng kể sự ổn định của chiến lược.

Tóm tắt

Chiến lược trục trặc này rất phù hợp với giao dịch xu hướng. Nó đơn giản và hiệu quả, dễ hiểu và tối ưu hóa. Là một chiến lược cơ bản, nó có khả năng linh hoạt và mở rộng rất mạnh.

Mã nguồn chiến lược
/*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)))