Стратегия динамического отслеживания тренда с использованием нескольких индикаторов на основе EMA и SMA

EMA SMA ATR PP supertrend
Дата создания: 2024-12-27 14:12:50 Последнее изменение: 2024-12-27 14:12:50
Копировать: 0 Количество просмотров: 426
1
Подписаться
1617
Подписчики

Стратегия динамического отслеживания тренда с использованием нескольких индикаторов на основе EMA и SMA

Обзор стратегии

Стратегия представляет собой динамическую систему отслеживания тенденций, которая сочетает в себе несколько технических показателей. Она идентифицирует рыночные тенденции и торговые возможности, объединяя скрещенные сигналы от Pivot Points, SuperTrend и Moving Averages.

Стратегический принцип

Стратегия действует на основе следующих основных механизмов:

  1. Используйте фиксированные временные циклы для анализа данных о ценах, чтобы избежать помех, вызванных различными временными циклами
  2. Вычисление SMA с использованием 8-циклической и 21-циклической EMA, формируя основу для отслеживания тренда
  3. Супертендный индикатор, используемый для определения направления тренда в сочетании с ATR и базисными пунктами
  4. Кроссовый сигнал SMA рассматривается как действительный только в течение трех периодов в точке опоры
  5. Динамический расчет и отслеживание уровней поддержки и сопротивления для принятия торговых решений

Стратегические преимущества

  1. Многомерная перекрестная проверка, повышение надежности сигнала
  2. Анализ с фиксированным временным циклом, снижение ложных помех
  3. Механизм проверки точек опоры, гарантирующий, что сделки происходят на ключевых уровнях цен
  4. Динамическое отслеживание поддерживает место сопротивления, помогает определить местоположение остановки остановки
  5. Использование индикаторов SuperTrend обеспечивает дополнительное подтверждение направления тренда
  6. Гибкие параметры, которые можно настроить в зависимости от рыночных условий

Стратегический риск

  1. Несколько индикаторов могут вызвать задержку сигнала
  2. На форекс-рынке может появиться слишком много ложных сигналов
  3. Анализ фиксированных временных циклов может пропустить важные сигналы других циклов
  4. Механизм проверки биткоина может привести к упущению важных торговых возможностей
  5. Избыточная оптимизация параметров может привести к избыточному совмещению

Направление оптимизации стратегии

  1. Внедрение механизма фильтрации волатильности для снижения частоты торгов в период низкой волатильности
  2. Повышение показателей подтверждения силы тренда, таких как ADX или MACD
  3. Разработка системы адаптивных параметров, динамически корректирующих параметры в соответствии с состоянием рынка
  4. Добавьте анализ объема торгов для повышения надежности сигнала
  5. Внедрение динамического механизма остановки, который позволяет корректировать позиции остановки в зависимости от рыночных колебаний

Подвести итог

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

Исходный код стратегии
/*backtest
start: 2019-12-23 08:00:00
end: 2024-12-25 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=6
strategy("Buy Sell Pivot Point", overlay=true)

// Input Parameters
prd = input.int(defval=2, title="Periodo Pivot Point", minval=1, maxval=50)
Factor = input.float(defval=3, title="Fator ATR", minval=1, step=0.1)
Pd = input.int(defval=10, title="Periodo ATR", minval=1)
showpivot = input.bool(defval=false, title="Mostrar Pivot Points")
showlabel = input.bool(defval=true, title="Mostrar Buy/Sell Labels")
showcl = input.bool(defval=false, title="Mostrar PP Center Line")
showsr = input.bool(defval=false, title="Mostrar Support/Resistance")
sma1_length = input.int(defval=8, title="SMA 1")
sma2_length = input.int(defval=21, title="SMA 2")
timeframe_fix = input.timeframe("D", title="Timeframe Fixo")

// Request data from the fixed timeframe
fix_close = request.security(syminfo.tickerid, timeframe_fix, close)
fix_high = request.security(syminfo.tickerid, timeframe_fix, high)
fix_low = request.security(syminfo.tickerid, timeframe_fix, low)
fix_ph = request.security(syminfo.tickerid, timeframe_fix, ta.pivothigh(prd, prd))
fix_pl = request.security(syminfo.tickerid, timeframe_fix, ta.pivotlow(prd, prd))
fix_atr = request.security(syminfo.tickerid, timeframe_fix, ta.atr(Pd))

// Convert Pivot High/Low to valid boolean for conditions
ph_cond = not na(fix_ph)
pl_cond = not na(fix_pl)

// Draw Pivot Points
plotshape(ph_cond and showpivot, title="Pivot High", text="H", style=shape.labeldown, color=color.red, textcolor=color.red, location=location.abovebar, offset=-prd)
plotshape(pl_cond and showpivot, title="Pivot Low", text="L", style=shape.labelup, color=color.lime, textcolor=color.lime, location=location.belowbar, offset=-prd)

// Calculate the Center line using pivot points
var float center = na
lastpp = ph_cond ? fix_ph : pl_cond ? fix_pl : na
if not na(lastpp)
    center := na(center) ? lastpp : (center * 2 + lastpp) / 3

// Upper/Lower bands calculation
Up = center - (Factor * fix_atr)
Dn = center + (Factor * fix_atr)

// Get the trend
var float TUp = na
var float TDown = na
var int Trend = 0
TUp := na(TUp[1]) ? Up : fix_close[1] > TUp[1] ? math.max(Up, TUp[1]) : Up
TDown := na(TDown[1]) ? Dn : fix_close[1] < TDown[1] ? math.min(Dn, TDown[1]) : Dn
Trend := fix_close > TDown[1] ? 1 : fix_close < TUp[1] ? -1 : nz(Trend[1], 1)
Trailingsl = Trend == 1 ? TUp : TDown

// Plot the trend
linecolor = Trend == 1 ? color.lime : Trend == -1 ? color.red : na
plot(Trailingsl, color=linecolor, linewidth=2, title="PP SuperTrend")

// Plot Center Line
plot(showcl ? center : na, color=showcl ? (center < fix_close ? color.blue : color.red) : na, title="Center Line")

// Calculate Base EMAs
ema_8 = ta.ema(fix_close, 8)
ema_21 = ta.ema(fix_close, 21)

// Calculate SMAs based on EMAs
sma1 = ta.sma(ema_8, sma1_length)
sma2 = ta.sma(ema_21, sma2_length)

// Plot SMAs
plot(sma1, color=#ffff00, linewidth=2, title="SMA 1 (based on EMA 8)")
plot(sma2, color=#aa00ff, linewidth=2, title="SMA 2 (based on EMA 21)")

// Initialize variables to track pivot points
var float last_pivot_time = na

// Update the pivot time when a new pivot is detected
if (ph_cond)
    last_pivot_time := bar_index
if (pl_cond)
    last_pivot_time := bar_index

// Calculate the crossover/crossunder signals
buy_signal = ta.crossover(sma1, sma2)  // SMA 8 crossing SMA 21 upwards
sell_signal = ta.crossunder(sma1, sma2)  // SMA 8 crossing SMA 21 downwards

// Ensure signal is only valid if it happens within 3 candles of a pivot point
valid_buy_signal = buy_signal and (bar_index - last_pivot_time <= 3)
valid_sell_signal = sell_signal and (bar_index - last_pivot_time <= 3)

// Plot Buy/Sell Signals
plotshape(valid_buy_signal and showlabel, title="Buy Signal", text="BUY", style=shape.labelup, color=color.lime, textcolor=color.black, location=location.belowbar)
plotshape(valid_sell_signal and showlabel, title="Sell Signal", text="SELL", style=shape.labeldown, color=color.red, textcolor=color.white, location=location.abovebar)

// Get S/R levels using Pivot Points
var float resistance = na
var float support = na
support := pl_cond ? fix_pl : support[1]
resistance := ph_cond ? fix_ph : resistance[1]

// Plot S/R levels
plot(showsr and not na(support) ? support : na, color=showsr ? color.lime : na, style=plot.style_circles, offset=-prd)
plot(showsr and not na(resistance) ? resistance : na, color=showsr ? color.red : na, style=plot.style_circles, offset=-prd)

// Execute trades based on valid signals
if valid_buy_signal
    strategy.entry("Buy", strategy.long)
if valid_sell_signal
    strategy.entry("Sell", strategy.short)

// Alerts
alertcondition(valid_buy_signal, title="Buy Signal", message="Buy Signal Detected")
alertcondition(valid_sell_signal, title="Sell Signal", message="Sell Signal Detected")
alertcondition(Trend != Trend[1], title="Trend Changed", message="Trend Changed")