Chiến lược tỷ lệ MA Premium Double Trend Filter

Tác giả:ChaoZhang, Ngày: 2023-12-28 17:37:14
Tags:

img

Tổng quan

Chiến lược này dựa trên chỉ số tỷ lệ trung bình di chuyển kép kết hợp với bộ lọc Bollinger Bands và chỉ số bộ lọc xu hướng kép. Nó áp dụng các cơ chế thoát chuỗi để theo dõi xu hướng. Chiến lược này nhằm xác định hướng xu hướng trung và dài hạn thông qua chỉ số tỷ lệ trung bình di chuyển. Nó đi vào thị trường tại các điểm nhập tốt hơn khi hướng xu hướng rõ ràng. Nó cũng thiết lập các cơ chế thoát lợi nhuận, dừng lỗ để khóa lợi nhuận và giảm lỗ.

Chiến lược logic

  1. Tính toán trung bình di chuyển nhanh (10 ngày) và trung bình di chuyển chậm (50 ngày), lấy tỷ lệ của họ được gọi là tỷ lệ trung bình di chuyển giá. Tỷ lệ này có thể xác định hiệu quả những thay đổi xu hướng trung hạn đến dài hạn.
  2. Chuyển tỷ lệ giá trung bình động thành phần trăm, đại diện cho sức mạnh tương đối của tỷ lệ hiện tại trong các giai đoạn trước.
  3. Khi dao động vượt trên ngưỡng mua vào (10), tín hiệu dài sẽ được kích hoạt. Khi vượt dưới ngưỡng bán (90), tín hiệu ngắn sẽ được kích hoạt để theo xu hướng.
  4. Kết hợp với chỉ số chiều rộng Bollinger Bands để lọc tín hiệu.
  5. Sử dụng chỉ số lọc xu hướng kép, chỉ mất thời gian dài khi giá ở kênh xu hướng tăng và ngắn khi ở xu hướng giảm để tránh giao dịch ngược.
  6. Các chiến lược thoát khỏi chuỗi được đặt, bao gồm lấy lợi nhuận, dừng lỗ và thoát kết hợp. Nhiều điều kiện thoát có thể được đặt trước với ưu tiên thoát khỏi lợi nhuận tối đa.

Ưu điểm

  1. Bộ lọc xu hướng kép đảm bảo độ tin cậy trong việc xác định xu hướng chính, tránh giao dịch ngược.
  2. Chỉ số tỷ lệ MA phát hiện sự thay đổi xu hướng tốt hơn so với MA đơn.
  3. Độ rộng BB xác định hiệu quả các giai đoạn biến động thấp cho các tín hiệu đáng tin cậy hơn.
  4. Cơ chế thoát hàng xích tối đa hóa lợi nhuận tổng thể.

Rủi ro và giải pháp

  1. Nhiều tín hiệu sai và đảo ngược với xu hướng không rõ ràng trong các thị trường dao động.
  2. MA có hiệu ứng chậm trễ, không thể phát hiện sự đảo ngược xu hướng ngay lập tức.
  3. Stop loss có thể bị ảnh hưởng ngay lập tức với khoảng cách giá, gây ra tổn thất lớn.

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

  1. Tối ưu hóa tham số trên thời gian MA, ngưỡng dao động, tham số BB thông qua các thử nghiệm đầy đủ để tìm kết hợp tốt nhất.
  2. Kết hợp các chỉ số khác đánh giá sự đảo ngược xu hướng như KD, MACD để cải thiện độ chính xác.
  3. Đào tạo mô hình học máy với dữ liệu lịch sử để tối ưu hóa tham số động.

Tóm lại

Chiến lược này tích hợp chỉ số tỷ lệ MA kép và BB để xác định xu hướng trung và dài hạn. Nó vào thị trường tại thời điểm tốt nhất sau khi xác nhận xu hướng với các cơ chế lấy lợi nhuận dây chuyền. Nó rất đáng tin cậy và hiệu quả. Có thể đạt được những cải tiến hơn nữa thông qua tối ưu hóa tham số, thêm các chỉ số đảo ngược xu hướng và học máy.


/*backtest
start: 2023-12-20 00:00:00
end: 2023-12-27 00:00:00
period: 3m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Premium MA Ratio Strategy", overlay = true)

// Input: Adjustable parameters for Premium MA Ratio
fast_length = input(10, title = "Fast MA Length")
slow_length = input(50, title = "Slow MA Length")
oscillator_threshold_buy = input(10, title = "Oscillator Buy Threshold")
oscillator_threshold_sell = input(90, title = "Oscillator Sell Threshold")

// Input: Adjustable parameters for Bollinger Bands
bb_length = input(20, title = "Bollinger Bands Length")
bb_source = input(close, title = "Bollinger Bands Source")
bb_deviation = input(2.0, title = "Bollinger Bands Deviation")
bb_width_threshold = input(30, title = "BB Width Threshold")
use_bb_filter = input(true, title = "Use BB Width Filter?")

// Input: Adjustable parameters for Trend Filter
use_trend_filter = input(true, title = "Use Trend Filter?")
trend_filter_period_1 = input(50, title = "Trend Filter Period 1")
trend_filter_period_2 = input(200, title = "Trend Filter Period 2")
use_second_trend_filter = input(true, title = "Use Second Trend Filter?")

// Input: Adjustable parameters for Exit Strategies
use_exit_strategies = input(true, title = "Use Exit Strategies?")
use_take_profit = input(true, title = "Use Take Profit?")
take_profit_ticks = input(150, title = "Take Profit in Ticks")
use_stop_loss = input(true, title = "Use Stop Loss?")
stop_loss_ticks = input(100, title = "Stop Loss in Ticks")
use_combined_exit = input(true, title = "Use Combined Exit Strategy?")
combined_exit_ticks = input(50, title = "Combined Exit Ticks")

// Input: Adjustable parameters for Time Filter
use_time_filter = input(false, title = "Use Time Filter?")
start_hour = input(8, title = "Start Hour")
end_hour = input(16, title = "End Hour")

// Calculate moving averages
fast_ma = sma(close, fast_length)
slow_ma = sma(close, slow_length)

// Calculate the premium price moving average ratio
premium_ratio = fast_ma / slow_ma * 100

// Calculate the percentile rank of the premium ratio
percentile_rank(src, length) =>
    rank = 0.0
    for i = 1 to length
        if src > src[i]
            rank := rank + 1.0
    percentile = rank / length * 100

// Calculate the percentile rank for the premium ratio using slow_length periods
premium_ratio_percentile = percentile_rank(premium_ratio, slow_length)

// Calculate the oscillator based on the percentile rank
oscillator = premium_ratio_percentile

// Dynamic coloring for the oscillator line
oscillator_color = oscillator > 50 ? color.green : color.red

// Plot the oscillator on a separate subplot as a line
hline(50, "Midline", color = color.gray)
plot(oscillator, title = "Oscillator", color = oscillator_color, linewidth = 2)

// Highlight the overbought and oversold areas
bgcolor(oscillator > oscillator_threshold_sell ? color.red : na, transp = 80)
bgcolor(oscillator < oscillator_threshold_buy ? color.green : na, transp = 80)

// Plot horizontal lines for threshold levels
hline(oscillator_threshold_buy, "Buy Threshold", color = color.green)
hline(oscillator_threshold_sell, "Sell Threshold", color = color.red)

// Calculate Bollinger Bands width
bb_upper = sma(bb_source, bb_length) + bb_deviation * stdev(bb_source, bb_length)
bb_lower = sma(bb_source, bb_length) - bb_deviation * stdev(bb_source, bb_length)
bb_width = bb_upper - bb_lower

// Calculate the percentile rank of Bollinger Bands width
bb_width_percentile = percentile_rank(bb_width, bb_length)

// Plot the Bollinger Bands width percentile line
plot(bb_width_percentile, title = "BB Width Percentile", color = color.blue, linewidth = 2)

// Calculate the trend filters
trend_filter_1 = sma(close, trend_filter_period_1)
trend_filter_2 = sma(close, trend_filter_period_2)

// Strategy logic
longCondition = crossover(premium_ratio_percentile, oscillator_threshold_buy)
shortCondition = crossunder(premium_ratio_percentile, oscillator_threshold_sell)

// Apply Bollinger Bands width filter if enabled
if (use_bb_filter)
    longCondition := longCondition and bb_width_percentile < bb_width_threshold
    shortCondition := shortCondition and bb_width_percentile < bb_width_threshold

// Apply trend filters if enabled
if (use_trend_filter)
    longCondition := longCondition and (close > trend_filter_1)
    shortCondition := shortCondition and (close < trend_filter_1)

// Apply second trend filter if enabled
if (use_trend_filter and use_second_trend_filter)
    longCondition := longCondition and (close > trend_filter_2)
    shortCondition := shortCondition and (close < trend_filter_2)

// Apply time filter if enabled
if (use_time_filter)
    longCondition := longCondition and (hour >= start_hour and hour <= end_hour)
    shortCondition := shortCondition and (hour >= start_hour and hour <= end_hour)

// Generate trading signals with exit strategies
if (use_exit_strategies)
    strategy.entry("Buy", strategy.long, when = longCondition)
    strategy.entry("Sell", strategy.short, when = shortCondition)
    
    // Define unique exit names for each order
    buy_take_profit_exit = "Buy Take Profit"
    buy_stop_loss_exit = "Buy Stop Loss"
    sell_take_profit_exit = "Sell Take Profit"
    sell_stop_loss_exit = "Sell Stop Loss"
    combined_exit = "Combined Exit"
    
    // Exit conditions for take profit
    if (use_take_profit)
        strategy.exit(buy_take_profit_exit, from_entry = "Buy", profit = take_profit_ticks)
        strategy.exit(sell_take_profit_exit, from_entry = "Sell", profit = take_profit_ticks)
    
    // Exit conditions for stop loss
    if (use_stop_loss)
        strategy.exit(buy_stop_loss_exit, from_entry = "Buy", loss = stop_loss_ticks)
        strategy.exit(sell_stop_loss_exit, from_entry = "Sell", loss = stop_loss_ticks)
    
    // Combined exit strategy
    if (use_combined_exit)
        strategy.exit(combined_exit, from_entry = "Buy", loss = combined_exit_ticks, profit = combined_exit_ticks)



Thêm nữa