Chiến lược theo dõi xu hướng giao thoa trung bình động đa dạng và lọc biến động

MA EMA SMA WMA VWMA SMMA RMA
Ngày tạo: 2024-07-29 13:37:09 sửa đổi lần cuối: 2024-07-29 13:37:09
sao chép: 0 Số nhấp chuột: 636
1
tập trung vào
1617
Người theo dõi

Chiến lược theo dõi xu hướng giao thoa trung bình động đa dạng và lọc biến động

Tổng quan

Chiến lược này là một hệ thống giao dịch theo dõi xu hướng dựa trên nhiều đường chéo trung bình di chuyển và lọc tỷ lệ biến động. Nó sử dụng các đường trung bình di chuyển trong ba chu kỳ khác nhau để xác định xu hướng thị trường và sử dụng đường trung bình di chuyển thứ tư làm chuẩn cho phán đoán thị trường bò và gấu.

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

  1. Lựa chọn đường trung bình di chuyển: Chiến lược sử dụng ba đường trung bình di chuyển chính: ngắn hạn, trung hạn và dài hạn để đánh giá xu hướng. Người dùng có thể chọn từ sáu đường trung bình di chuyển được xác định trước, mỗi đường trung bình di chuyển có thể được cấu hình riêng, bao gồm chu kỳ tính toán, nguồn dữ liệu và loại (như SMA, EMA, v.v.).

  2. Xu hướng:

    • Xu hướng đa đầu: khi đường trung bình ngắn hạn cao hơn đường trung bình dài hạn và đường trung bình trung bình vượt qua đường trung bình dài hạn.
    • Xu hướng ngược: khi đường trung bình ngắn hạn thấp hơn đường trung bình dài hạn và đường trung bình trung bình đi xuống xuyên qua đường trung bình dài hạn.
  3. Phán quyết thị trường bò và gấu: Có thể chọn sử dụng đường trung bình di chuyển thứ tư làm đường phân chia của thị trường bò và gấu. Chỉ khi giá nằm trên đường này, bạn chỉ được phép làm nhiều hơn; ngược lại, bạn chỉ được phép làm rỗng.

  4. Bộ lọc tỷ lệ biến động: Sử dụng một chỉ số tỷ lệ biến động dựa trên giá cao nhất và giá thấp nhất. Chiến lược chỉ phát ra tín hiệu giao dịch khi tỷ lệ biến động vượt quá ngưỡng được thiết lập bởi người dùng.

  5. Logic nhập cảnh:

    • Bước vào nhiều đầu: Bước vào nhiều đầu khi xác nhận xu hướng, đáp ứng điều kiện biến động và giá cao hơn đường trung bình dài hạn.
    • Bước vào đầu trống: Hạn chế khi xác nhận xu hướng đầu trống, điều kiện biến động được đáp ứng và giá thấp hơn đường trung bình dài hạn.
  6. Lập luận ra sân:

    • Cụ thể là khi xu hướng đảo ngược (trong trường hợp đường trung bình trung hạn và đường trung bình dài hạn lại giao nhau).
    • Tất cả các vị trí bằng phẳng: Khi giá vượt qua đường phân chia thị trường bò và gấu, bằng phẳng tất cả các vị trí ngược lại.
  7. Stop Loss: Sử dụng Stop Loss% cố định, người dùng có thể tùy chỉnh tỷ lệ Stop Loss.

  8. Quản lý vị trí: Mỗi lần mở vị trí, người dùng có thể tùy chỉnh tỷ lệ phần trăm cố định của quyền lợi tài khoản.

Lợi thế chiến lược

  1. Phân tích xu hướng đa chiều: Bằng cách sử dụng nhiều đường trung bình di chuyển, chiến lược có thể nắm bắt xu hướng thị trường một cách toàn diện hơn, giảm tín hiệu sai.

  2. Thiết lập tham số linh hoạt: Người dùng có thể điều chỉnh các tham số linh hoạt, bao gồm loại đường trung bình, chu kỳ và nguồn dữ liệu, tùy thuộc vào đặc điểm của các thị trường và loại giao dịch khác nhau.

  3. Bộ lọc tỷ lệ dao động: Bằng cách đưa ra chỉ số tỷ lệ dao động, chiến lược có thể tránh giao dịch trong môi trường dao động thấp và cải thiện chất lượng tín hiệu.

  4. Thị trường bò và gấu thích ứng: Cơ chế phán đoán thị trường bò và gấu có thể lựa chọn cho phép chiến lược thích ứng tốt hơn với các môi trường thị trường khác nhau, giảm giao dịch ngược.

  5. Quản lý vị trí động: Phương pháp quản lý vị trí dựa trên quyền lợi của tài khoản, có thể tự động điều chỉnh quy mô giao dịch khi quy mô tài khoản thay đổi.

  6. Kiểm soát rủi ro nhiều cấp: bao gồm các cơ chế kiểm soát rủi ro đa dạng như lọc tỷ lệ biến động, xác nhận xu hướng, bán bán và dừng cố định.

  7. Giao dịch hai chiều: hỗ trợ giao dịch mua và bán, có thể tìm kiếm cơ hội giao dịch trong nhiều môi trường thị trường.

  8. Hỗ trợ trực quan: Chiến lược vẽ trên biểu đồ các moving average và thẻ tín hiệu giao dịch để phân tích trực quan và phản hồi.

Rủi ro chiến lược

  1. Sự chậm trễ: Đường trung bình di chuyển là một chỉ số chậm trễ, có thể gây ra sự chậm trễ trong thời gian nhập cảnh và xuất cảnh, ảnh hưởng đến khả năng kiếm tiền.

  2. Thị trường sốc không hoạt động tốt: Trong thị trường sốc ngang, chiến lược có thể thường xuyên tạo ra tín hiệu sai, dẫn đến giao dịch quá mức và thua lỗ.

  3. Nhận thức tham số: Hiệu suất của chiến lược phụ thuộc rất nhiều vào cài đặt tham số, các thị trường và khung thời gian khác nhau có thể yêu cầu các kết hợp tham số khác nhau.

  4. Rủi ro rút lui: Chiến lược có thể không được thực hiện đầy đủ trong thời gian khi xu hướng đảo ngược, dẫn đến rút lui lớn hơn.

  5. Dựa quá nhiều vào các chỉ số kỹ thuật: Chiến lược dựa hoàn toàn vào các chỉ số kỹ thuật, bỏ qua các yếu tố cơ bản, có thể không hoạt động tốt khi tin tức hoặc sự kiện quan trọng xảy ra.

  6. Rủi ro quản lý tài chính: Phương pháp quản lý vị thế tỷ lệ cố định có thể dẫn đến lỗ hổng rủi ro quá lớn khi thua lỗ liên tục.

  7. Cài đặt dừng lỗ: Cài đặt dừng phần trăm cố định có thể không áp dụng cho tất cả các môi trường thị trường và có thể dẫn đến dừng lỗ sớm trong thời gian biến động cao.

Hướng tối ưu hóa chiến lược

  1. Các tham số thích ứng: giới thiệu cơ chế thích ứng, điều chỉnh các tham số trung bình di chuyển và ngưỡng biến động theo tình hình thị trường.

  2. Phân tích nhiều khung thời gian: kết hợp thông tin về khung thời gian dài và ngắn hơn để tăng độ chính xác trong việc đánh giá xu hướng.

  3. Tối ưu hóa chỉ số biến động: Hãy xem xét sử dụng các chỉ số biến động phức tạp hơn như ATR hoặc Bollinger Bandwidth để đánh giá chính xác hơn tình trạng thị trường.

  4. Tham gia chỉ số động lực: kết hợp với các chỉ số động lực như RSI hoặc MACD, tối ưu hóa thời gian nhập cảnh và xuất cảnh.

  5. Cải thiện cơ chế dừng lỗ: thực hiện dừng theo dõi hoặc dừng động dựa trên ATR để thích ứng tốt hơn với biến động thị trường.

  6. Tích hợp các chỉ số cảm xúc thị trường: giới thiệu các chỉ số cảm xúc thị trường như VIX, chiến lược tối ưu hóa hoạt động trong các môi trường thị trường khác nhau.

  7. Quản lý vị trí tối ưu hóa: thực hiện quản lý vị trí động dựa trên biến động hoặc lợi nhuận hiện tại, kiểm soát rủi ro tốt hơn.

  8. Thêm bộ lọc cơ bản: xem xét các yếu tố cơ bản như việc công bố dữ liệu kinh tế quan trọng hoặc báo cáo tài chính của công ty, tránh giao dịch trong thời gian rủi ro cao.

  9. Tối ưu hóa học máy: Sử dụng thuật toán học máy để tối ưu hóa các tham số và quy tắc ra quyết định, nâng cao khả năng thích ứng của chiến lược.

  10. Thử nghiệm ngược và thử nghiệm phía trước: Thử nghiệm ngược toàn diện hơn và thử nghiệm về phía trước trong các thị trường và khoảng thời gian khác nhau để xác minh tính mạnh mẽ của chiến lược.

Tóm tắt

Chiến lược theo dõi xu hướng chéo đa phương và lọc tỷ lệ dao động là một hệ thống giao dịch toàn diện và linh hoạt kết hợp nhiều trung bình di chuyển, chỉ số tỷ lệ dao động và nguyên tắc theo dõi xu hướng. Với phân tích xu hướng đa chiều và kiểm soát rủi ro nghiêm ngặt, chiến lược này có tiềm năng để nắm bắt xu hướng liên tục trong nhiều môi trường thị trường. Tuy nhiên, người dùng cần chú ý đến các vấn đề về tối ưu hóa tham số và khả năng thích ứng của thị trường và xem xét việc đưa ra nhiều chỉ số kỹ thuật tiên tiến hơn và kỹ thuật quản lý rủi ro để nâng cao hiệu suất chiến lược hơn nữa.

Mã nguồn chiến lược
/*backtest
start: 2023-07-23 00:00:00
end: 2024-07-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title="WODIsMA Strategy", shorttitle="WMA_Strategy", overlay=true, overlay=true, pyramiding=2, default_qty_value=6, default_qty_type=strategy.fixed, initial_capital=1000, currency=currency.USD)

// 用户输入参数
capital_pct = input.float(20, title="每笔订单使用的资金百分比(%)", minval=0.1, maxval=100, group="Position") / 100
close_pct = input.float(20, title="每次平仓使用的百分比(%)", minval=0, maxval=100, group="Position") / 100
stop_loss_user = input.float(10, title="止损百分比(%)", minval=0, maxval=100, group="Position") / 100
allow_long = input.bool(true, title="是否做多", group="Position")
allow_short = input.bool(true, title="是否做空", group="Position")

// 用户选择的移动平均线
short_term_ma = input.string("MA 0", title="短期趋势均线", options=["MA 0", "MA 1", "MA 2", "MA 3", "MA 4", "MA 5"], group="TrendIdentify")
mid_term_ma = input.string("MA 1", title="中期趋势均线", options=["MA 0", "MA 1", "MA 2", "MA 3", "MA 4", "MA 5"], group="TrendIdentify")
long_term_ma = input.string("MA 2", title="长期趋势均线", options=["MA 0", "MA 1", "MA 2", "MA 3", "MA 4", "MA 5"], group="TrendIdentify")
bull_bear_ma = input.string("MA 3", title="牛熊趋势均线", options=["MA 0", "MA 1", "MA 2", "MA 3", "MA 4", "MA 5"], group="TrendIdentify")
enable_bull_bear = input.bool(false, title="是否启用牛熊趋势线", group="TrendIdentify")
// 波动率指标参数
volatility_k = input.int(60, title="波动率数值K线数" , group="volatility")
volatility_threshold = input.float(1, minval=0, title="波动率值 0则不使用(%)", group="volatility")

// 定义不同类型的移动平均线函数
ma(source, length, type) =>
    switch type
        "SMA" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        "SMMA (RMA)" => ta.rma(source, length)
        "WMA" => ta.wma(source, length)
        "VWMA" => ta.vwma(source, length)

// 定义每根均线的输入参数和颜色
length0 = input.int(16, minval=1, title="Length 0", group="MA 0")
source0 = input.source(hl2, title="Source 0", group="MA 0")
type0 = input.string("SMA", title="Type 0", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 0")
timeframe0 = input.timeframe("", title="Timeframe 0", group="MA 0")
color0 = input.color(color.gray, title="Color 0", group="MA 0")
show0 = input.bool(true, title="Show MA 0", group="MA 0")

length1 = input.int(48, minval=1, title="Length 1", group="MA 1")
source1 = input.source(hl2, title="Source 1", group="MA 1")
type1 = input.string("SMA", title="Type 1", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 1")
timeframe1 = input.timeframe("", title="Timeframe 1", group="MA 1")
color1 = input.color(color.aqua, title="Color 1", group="MA 1")
show1 = input.bool(true, title="Show MA 1", group="MA 1")

length2 = input.int(144, minval=1, title="Length 2", group="MA 2")
source2 = input.source(hl2, title="Source 2", group="MA 2")
type2 = input.string("SMA", title="Type 2", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 2")
timeframe2 = input.timeframe("", title="Timeframe 2", group="MA 2")
color2 = input.color(color.orange, title="Color 2", group="MA 2")
show2 = input.bool(true, title="Show MA 2", group="MA 2")

length3 = input.int(432, minval=1, title="Length 3", group="MA 3")
source3 = input.source(hl2, title="Source 3", group="MA 3")
type3 = input.string("SMA", title="Type 3", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 3")
timeframe3 = input.timeframe("", title="Timeframe 3", group="MA 3")
color3 = input.color(color.green, title="Color 3", group="MA 3")
show3 = input.bool(true, title="Show MA 3", group="MA 3")

length4 = input.int(91, minval=1, title="Length 4", group="MA 4")
source4 = input.source(hl2, title="Source 4", group="MA 4")
type4 = input.string("SMA", title="Type 4", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 4")
timeframe4 = input.timeframe("D", title="Timeframe 4", group="MA 4")
color4 = input.color(color.rgb(159, 110, 208), title="Color 4", group="MA 4") // 浅紫色
style4 = input.string("step", title="Style 4", options=["line", "step"], group="MA 4")
show4 = input.bool(false, title="Show MA 4", group="MA 4")

length5 = input.int(182, minval=1, title="Length 5", group="MA 5")
source5 = input.source(hl2, title="Source 5", group="MA 5")
type5 = input.string("SMA", title="Type 5", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 5")
timeframe5 = input.timeframe("D", title="Timeframe 5", group="MA 5")
color5 = input.color(color.red, title="Color 5", group="MA 5")
style5 = input.string("step", title="Style 5", options=["line", "step"], group="MA 5")
show5 = input.bool(true, title="Show MA 5", group="MA 5")

// 计算每根均线的值
value0 = request.security(syminfo.tickerid, timeframe0, ma(source0, length0, type0))
value1 = request.security(syminfo.tickerid, timeframe1, ma(source1, length1, type1))
value2 = request.security(syminfo.tickerid, timeframe2, ma(source2, length2, type2))
value3 = request.security(syminfo.tickerid, timeframe3, ma(source3, length3, type3))
value4 = request.security(syminfo.tickerid, timeframe4, ma(source4, length4, type4))
value5 = request.security(syminfo.tickerid, timeframe5, ma(source5, length5, type5))

// 绘制每根均线
plot(show0 ? value0 : na, title="MA 0", color=color0)
plot(show1 ? value1 : na, title="MA 1", color=color1)
plot(show2 ? value2 : na, title="MA 2", color=color2)
plot(show3 ? value3 : na, title="MA 3", color=color3)
plot(show4 ? value4 : na, title="MA 4", color=color4, style=style4 == "step" ? plot.style_stepline : plot.style_line, linewidth=2)
plot(show5 ? value5 : na, title="MA 5", color=color5, style=style5 == "step" ? plot.style_stepline : plot.style_line, linewidth=2)

// 添加策略部分

// 选择均线值
get_ma_value(ma_name) =>
    if (ma_name == "MA 0")
        value0
    else if (ma_name == "MA 1")
        value1
    else if (ma_name == "MA 2")
        value2
    else if (ma_name == "MA 3")
        value3
    else if (ma_name == "MA 4")
        value4
    else
        value5

short_ma_value = get_ma_value(short_term_ma)
mid_ma_value = get_ma_value(mid_term_ma)
long_ma_value = get_ma_value(long_term_ma)
bull_bear_ma_value = get_ma_value(bull_bear_ma)

// 计算波动率
high_close = ta.highest(high, volatility_k)
low_close = ta.lowest(low, volatility_k)
volatility = 100 * (high_close - low_close) / low_close

// 波动率条件背景色
volatilityCondition = (volatility > volatility_threshold)
volatilityConditionBG = (volatility > volatility_threshold) and volatility_threshold != 0

bgcolor(volatilityConditionBG ? color.new(color.green, 90) : na, title="Volatility Background")

// 策略信号
long_condition = (short_ma_value > long_ma_value and ta.crossover(mid_ma_value, long_ma_value))
short_condition = (short_ma_value < long_ma_value and ta.crossunder(mid_ma_value, long_ma_value))

var float stop_level_long = na
var float stop_level_short = na

// 执行策略
if (volatilityCondition and allow_long and (not enable_bull_bear or close > bull_bear_ma_value)) 
    if (long_condition and close > long_ma_value)  // 判断是否立即触发止损
        strategy.entry("Long", strategy.long, qty=capital_pct * strategy.equity / close)
        label.new(bar_index, low*0.996, text="BUY", color=color.green, textcolor=color.white, style=label.style_label_up, size=size.small)

if (volatilityCondition and allow_short and (not enable_bull_bear or close < bull_bear_ma_value)) 
    if (short_condition and close < long_ma_value)  // 判断是否立即触发止损
        strategy.entry("Short", strategy.short, qty=capital_pct * strategy.equity / close)
        label.new(bar_index, high*1.004, text="SELL", color=color.red, textcolor=color.white, style=label.style_label_down, size=size.small)

// 部分平仓逻辑
if (enable_bull_bear)
    // 当当前价格处在牛熊趋势均线之下时
    if (close < bull_bear_ma_value)
        // 平所有多仓
        if (strategy.position_size > 0)
            strategy.close("Long", comment="平所有多仓")
            label.new(bar_index, low*0.996, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_up, size=size.small)
        // 当短期均线在长期均线之上时,中期均线向上穿过长期均线,平空
        if (short_ma_value > long_ma_value and ta.crossover(mid_ma_value, long_ma_value) and volatilityCondition)
            if (strategy.position_size < 0)
                strategy.close("Short", qty=close_pct * strategy.position_size, comment="部分平空")
                label.new(bar_index, high*1.004, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_down, size=size.small)

    // 当当前价格处在牛熊趋势均线之上时
    if (close > bull_bear_ma_value)
        // 平所有空仓
        if (strategy.position_size < 0)
            strategy.close("Short", comment="平所有空仓")
            label.new(bar_index, high*1.004, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_up, size=size.small)
        // 当短期均线在长期均线之下时,中期均线向下穿过长期均线,平多
        if (short_ma_value < long_ma_value and ta.crossunder(mid_ma_value, long_ma_value) and volatilityCondition)
            if (strategy.position_size > 0)
                strategy.close("Long", qty=close_pct * strategy.position_size, comment="部分平多")
                label.new(bar_index, low*0.996, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_down, size=size.small)
else if (not enable_bull_bear and not (allow_long and allow_short))
    // 当短期均线在长期均线之上时,中期均线向上穿过长期均线,平空
    if (short_ma_value > long_ma_value and ta.crossover(mid_ma_value, long_ma_value) and volatilityCondition)
        if (strategy.position_size < 0)
            strategy.close("Short", qty=close_pct * strategy.position_size, comment="部分平空")
            label.new(bar_index, low*0.996, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_up, size=size.small)

    // 当短期均线在长期均线之下时,中期均线向下穿过长期均线,平多
    if (short_ma_value < long_ma_value and ta.crossunder(mid_ma_value, long_ma_value) and volatilityCondition)
        if (strategy.position_size > 0)
            strategy.close("Long", qty=close_pct * strategy.position_size, comment="部分平多")
            label.new(bar_index, high*1.004, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_down, size=size.small)

// 止损处理
if (strategy.position_size > 0)
    stop_level_long_user = strategy.position_avg_price * (1 - stop_loss_user)
    strategy.exit("Stop Loss", from_entry="Long", stop=stop_level_long_user)
else if (strategy.position_size < 0)
    stop_level_short_user = strategy.position_avg_price * (1 + stop_loss_user)
    strategy.exit("Stop Loss", from_entry="Short", stop=stop_level_short_user)