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 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)