Динамическая стратегия пересечения скользящей средней является комбинированной торговой стратегией, которая объединяет несколько технических индикаторов и обнаружение рыночных условий. Она динамически рассчитывает волатильность рынка и определяет три фазы рынка на основе расстояния цены от долгосрочной скользящей средней и волатильности: волатильности, тренда и консолидации. В различных рыночных условиях стратегия принимает различные правила входа и выхода и генерирует сигналы купли и продажи с использованием комбинации индикаторов, таких как EMA/SMA crossover, MACD и полосы Боллинджера.
Используйте индикатор ATR для измерения волатильности рынка за последние 14 дней. Затем примените 100-дневный фильтр SMA для получения средней волатильности.
Если абсолютное расстояние превышает 1,5 раза средней волатильности с четким направлением, это определяется как трендовый рынок. Если текущая волатильность превышает 1,5 раза средней, это волатильный рынок.
Период быстрой EMA составляет 10 дней. Период медленной SMA составляет 30 дней. Сигнал покупки генерируется, когда быстрая EMA пересекает медленную SMA.
Вычислить MACD с 12, 26, 9 параметрами. Положительная гистограмма MACD дает сигнал покупки.
Если ширина канала меньше, чем 20-дневная SMA, то он консолидируется.
Волатильность: вводить длинный, когда кроссовер или MACD положительный с ценой в пределах диапазонов.
Тенденция: вводить длинный, когда кроссовер или MACD положительный.
Консолидация: ввести длинный, когда кроссовер и цена выше нижней полосы.
Общий: выход, когда MACD отрицательный на 2 бара и цена падает на 2 дня.
Волатильность: плюс выход, когда StockRSI перекуплен.
Консолидация: плюс выход, когда цена ниже верхней полосы.
Стратегия имеет следующие преимущества:
Систематические операции с менее субъективными вмешательствами.
Адаптивные параметры, скорректированные на основе рыночных условий.
Более высокая точность сигнала с множественным индикатором.
Меньший риск с автостоп-потерями по полосам Боллинджера.
Все округлое фильтрация состояния, чтобы избежать ложных сигналов.
Динамическая остановка потерь и получение прибыли для следования тенденциям.
Основными рисками являются:
Недействительная стратегия при неправильной настройке параметров.
Неудача модели из-за внезапных событий.
Сжатая прибыль от стоимости торговли.
Высокая сложность с несколькими модулями.
Потенциальные направления оптимизации:
Улучшить критерии оценки рыночной среды.
Внедрить машинное обучение для автоматической адаптации параметров.
Добавьте текстовую аналитику для обнаружения событий.
Многорыночное обратное тестирование, чтобы найти лучшие параметры.
Используйте стратегию остановки для получения большей прибыли.
Динамическая движущаяся средняя стратегия кроссовера - это интеллектуальная мультииндикаторная количественная торговая система. Она динамически регулирует параметры на основе рыночных условий для реализации систематической торговли на основе правил. Стратегия является высоко адаптивной и детерминированной. Но параметры и дополнительные модули должны быть тщательно введены, чтобы избежать чрезмерной сложности.
/*backtest start: 2024-01-28 00:00:00 end: 2024-02-04 00:00:00 period: 10m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Improved Custom Strategy", shorttitle="ICS", overlay=true) // Volatility volatility = ta.atr(14) avg_volatility_sma = ta.sma(volatility, 100) avg_volatility = na(avg_volatility_sma) ? 0 : avg_volatility_sma // Market Phase detection long_term_ma = ta.sma(close, 200) distance_from_long_term_ma = close - long_term_ma var bool isTrending = math.abs(distance_from_long_term_ma) > 1.5 * avg_volatility and not na(distance_from_long_term_ma) var bool isVolatile = volatility > 1.5 * avg_volatility // EMA/MA Crossover fast_length = 10 slow_length = 30 fast_ma = ta.ema(close, fast_length) slow_ma = ta.sma(close, slow_length) crossover_signal = ta.crossover(fast_ma, slow_ma) // MACD [macdLine, signalLine, macdHistogram] = ta.macd(close, 12, 26, 9) macd_signal = crossover_signal or (macdHistogram > 0) // Bollinger Bands source = close basis = ta.sma(source, 20) upper = basis + 2 * ta.stdev(source, 20) lower = basis - 2 * ta.stdev(source, 20) isConsolidating = (upper - lower) < ta.sma(upper - lower, 20) // StockRSI length = 14 K = 100 * (close - ta.lowest(close, length)) / (ta.highest(close, length) - ta.lowest(close, length)) D = ta.sma(K, 3) overbought = 75 oversold = 25 var float potential_SL = na var float potential_TP = na var bool buy_condition = na var bool sell_condition = na // Buy and Sell Control Variables var bool hasBought = false var bool hasSold = true // Previous values tracking prev_macdHistogram = macdHistogram[1] prev_close = close[1] // Modify sell_condition with the new criteria if isVolatile buy_condition := not hasBought and crossover_signal or macd_signal and (close > lower) and (close < upper) sell_condition := hasBought and (macdHistogram < 0 and prev_macdHistogram < 0) and (close < prev_close and prev_close < close[2]) potential_SL := close - 0.5 * volatility potential_TP := close + volatility if isTrending buy_condition := not hasBought and crossover_signal or macd_signal sell_condition := hasBought and (macdHistogram < 0 and prev_macdHistogram < 0) and (close < prev_close and prev_close < close[2]) potential_SL := close - volatility potential_TP := close + 2 * volatility if isConsolidating buy_condition := not hasBought and crossover_signal and (close > lower) sell_condition := hasBought and (close < upper) and (macdHistogram < 0 and prev_macdHistogram < 0) and (close < prev_close and prev_close < close[2]) potential_SL := close - 0.5 * volatility potential_TP := close + volatility // Update the hasBought and hasSold flags if buy_condition hasBought := true hasSold := false if sell_condition hasBought := false hasSold := true // Strategy Entry and Exit if buy_condition strategy.entry("BUY", strategy.long, stop=potential_SL, limit=potential_TP) strategy.exit("SELL_TS", from_entry="BUY", trail_price=close, trail_offset=close * 0.05) if sell_condition strategy.close("BUY") // Visualization plotshape(series=buy_condition, style=shape.labelup, location=location.belowbar, color=color.green, text="BUY", size=size.small) plotshape(series=sell_condition, style=shape.labeldown, location=location.abovebar, color=color.red, text="SELL", size=size.small) plot(long_term_ma, color=color.gray, title="200-Day MA", linewidth=1) plot(potential_SL, title="SL Level", color=color.red, linewidth=1, style=plot.style_linebr) plot(potential_TP, title="TP Level", color=color.green, linewidth=1, style=plot.style_linebr) bgcolor(isVolatile ? color.new(color.purple, 90) : isTrending ? color.new(color.blue, 90) : isConsolidating ? color.new(color.orange, 90) : na)