Премиум двойной тренд фильтр MA соотношение стратегия

Автор:Чао Чжан, Дата: 2023-12-28 17:37:14
Тэги:

img

Обзор

Эта стратегия основана на двойном индикаторе коэффициента скользящей средней в сочетании с фильтром Болинджеровских полос и двойным индикатором фильтра тренда. Она использует цепные механизмы выхода для отслеживания тренда. Эта стратегия направлена на определение направления среднесрочного и долгосрочного тренда с помощью индикатора коэффициента скользящего среднего. Она входит на рынок в лучших точках входа, когда направление тренда ясно.

Логика стратегии

  1. Вычислите быструю скользящую среднюю (10 дней) и медленно скользящую среднюю (50 дней), получите их соотношение, называемое соотношением скользящей средней цены. Это соотношение может эффективно идентифицировать средне- и долгосрочные изменения тренда.
  2. Преобразовать коэффициент скользящей средней цены в процентный показатель, который представляет собой относительную силу текущего коэффициента в прошлые периоды.
  3. Когда осциллятор пересекает порог покупки (10), длинный сигнал запускается. Когда он пересекает порог продажи (90), короткий сигнал запускается для следующего тренда.
  4. Комбинируйте с индексом ширины полос Боллинджера для фильтрации сигнала.
  5. Используйте двойной индикатор фильтра тренда, используя только длинный, когда цена находится в канале восходящего тренда, и короткий, когда в нисходящем тренде, чтобы избежать обратной торговли.
  6. Установлены стратегии выхода из цепи, включая получение прибыли, стоп-лосс и комбинированный выход.

Преимущества

  1. Двойной трендовый фильтр обеспечивает надежность в определении основного тренда, избегая обратной торговли.
  2. Показатель коэффициента MA лучше определяет изменение тренда, чем однократный MA.
  3. Ширина BB эффективно определяет периоды низкой волатильности для более надежных сигналов.
  4. Механизм выхода с цепью максимизирует общую прибыль.

Риски и решения

  1. Больше ложных сигналов и обратных с неясной тенденцией во время рыночных диапазонов.
  2. MA имеет задерживающий эффект, не обнаруживая мгновенное изменение тренда.
  3. Стоп-лосс может быть нанесен мгновенно с ценовыми разрывами, вызывая большие потери.

Руководство по оптимизации

  1. Оптимизация параметров на периоды MA, пороги осциллятора, параметры BB с помощью исчерпывающих испытаний для поиска лучшей комбинации.
  2. Для повышения точности используйте другие индикаторы, определяющие изменение тренда, такие как KD, MACD.
  3. Обучение модели машинного обучения с историческими данными для оптимизации динамических параметров.

Резюме

Эта стратегия объединяет двойной показатель соотношения 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)



Больше