В процессе загрузки ресурсов... загрузка...

Динамическая средняя скользящая кроссоверная комбинация

Автор:Чао Чжан, Дата: 2024-02-05 10:23:10
Тэги:

img

Обзор

Динамическая стратегия пересечения скользящей средней является комбинированной торговой стратегией, которая объединяет несколько технических индикаторов и обнаружение рыночных условий. Она динамически рассчитывает волатильность рынка и определяет три фазы рынка на основе расстояния цены от долгосрочной скользящей средней и волатильности: волатильности, тренда и консолидации. В различных рыночных условиях стратегия принимает различные правила входа и выхода и генерирует сигналы купли и продажи с использованием комбинации индикаторов, таких как EMA/SMA crossover, MACD и полосы Боллинджера.

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

Расчет волатильности рынка

Используйте индикатор ATR для измерения волатильности рынка за последние 14 дней. Затем примените 100-дневный фильтр SMA для получения средней волатильности.

Определить фазы рынка

Если абсолютное расстояние превышает 1,5 раза средней волатильности с четким направлением, это определяется как трендовый рынок. Если текущая волатильность превышает 1,5 раза средней, это волатильный рынок.

Кроссовер EMA/SMA

Период быстрой EMA составляет 10 дней. Период медленной SMA составляет 30 дней. Сигнал покупки генерируется, когда быстрая EMA пересекает медленную SMA.

MACD

Вычислить MACD с 12, 26, 9 параметрами. Положительная гистограмма MACD дает сигнал покупки.

Боллингерские полосы

Если ширина канала меньше, чем 20-дневная SMA, то он консолидируется.

Правила въезда

Волатильность: вводить длинный, когда кроссовер или MACD положительный с ценой в пределах диапазонов.

Тенденция: вводить длинный, когда кроссовер или MACD положительный.

Консолидация: ввести длинный, когда кроссовер и цена выше нижней полосы.

Правила выхода

Общий: выход, когда MACD отрицательный на 2 бара и цена падает на 2 дня.

Волатильность: плюс выход, когда StockRSI перекуплен.

Консолидация: плюс выход, когда цена ниже верхней полосы.

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

Стратегия имеет следующие преимущества:

  1. Систематические операции с менее субъективными вмешательствами.

  2. Адаптивные параметры, скорректированные на основе рыночных условий.

  3. Более высокая точность сигнала с множественным индикатором.

  4. Меньший риск с автостоп-потерями по полосам Боллинджера.

  5. Все округлое фильтрация состояния, чтобы избежать ложных сигналов.

  6. Динамическая остановка потерь и получение прибыли для следования тенденциям.

Риски

Основными рисками являются:

  1. Недействительная стратегия при неправильной настройке параметров.

  2. Неудача модели из-за внезапных событий.

  3. Сжатая прибыль от стоимости торговли.

  4. Высокая сложность с несколькими модулями.

Улучшение

Потенциальные направления оптимизации:

  1. Улучшить критерии оценки рыночной среды.

  2. Внедрить машинное обучение для автоматической адаптации параметров.

  3. Добавьте текстовую аналитику для обнаружения событий.

  4. Многорыночное обратное тестирование, чтобы найти лучшие параметры.

  5. Используйте стратегию остановки для получения большей прибыли.

Заключение

Динамическая движущаяся средняя стратегия кроссовера - это интеллектуальная мультииндикаторная количественная торговая система. Она динамически регулирует параметры на основе рыночных условий для реализации систематической торговли на основе правил. Стратегия является высоко адаптивной и детерминированной. Но параметры и дополнительные модули должны быть тщательно введены, чтобы избежать чрезмерной сложности.


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


Больше