この戦略は,ボリンジャーバンドフィルターとダブルトレンドフィルターインジケーターを組み合わせたダブル移動平均比率指標に基づいています.トレンドフォローのための鎖出口メカニズムを採用しています.この戦略は,移動平均比率指標を通じて中長期のトレンド方向性を特定することを目的としています.トレンド方向性が明確であるときにより良いエントリーポイントで市場に参入します.また,利益を得たり,損失を減らすために利益を得たり,ストップ損失出口メカニズムを設定します.
この戦略は,中期から長期間のトレンドを決定するために,ダブルMA比指標とBBを統合している.これは,チェーンされた利益獲得メカニズムでトレンド確認後の最高の時点で市場に参入する.非常に信頼性と効率性がある.パラメータ最適化,トレンド逆転指標を追加し,機械学習を通じてさらなる改善を達成することができる.
/*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)