Несколько индикаторов динамически отслеживают стратегию торговли по трендовой полосе

EMA RSI ADX ATR TP SL
Дата создания: 2025-02-18 14:02:44 Последнее изменение: 2025-02-18 14:02:44
Копировать: 2 Количество просмотров: 327
1
Подписаться
1617
Подписчики

Несколько индикаторов динамически отслеживают стратегию торговли по трендовой полосе

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

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

Стратегия представляет собой торговую систему, которая сочетает в себе множество технических показателей для отслеживания тенденций. Она определяет направление ценовых тенденций с помощью EMA, RSI определяет состояние рынка перекупа и перепродажи, ADX проверяет силу тенденции и, наконец, использует ATR для динамического регулирования размеров позиций и параметров управления рисками.

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

  1. Входный сигнал: когда цена вверх по EMA и RSI> 50, а ADX больше, чем установленный порог, генерирует сигнал многодетной; когда цена вниз по EMA и RSI< 50, а ADX больше, чем установленный порог, генерирует сигнал пустой.
  2. Управление позициями: количество открытых позиций рассчитывается в зависимости от метода, выбранного пользователем, поддерживается четыре способа, основанные на соотношении риска, соотношении капитала, количестве фиксированных средств и количестве фиксированных контрактов.
  3. Управление рисками: использование ATR для динамического расчета стоп-лосс и прибыльных целей при одновременном отслеживании стоп-лосс и защите полученной прибыли.

Анализ преимуществ

  1. Многомерное подтверждение тренда: подтверждение тренда с помощью трех показателей EMA, RSI и ADX, повышение надежности торговых сигналов.
  2. Гибкий менеджмент позиций: поддержка различных методов расчета позиций для удовлетворения потребностей различных трейдеров.
  3. Динамический риск-менеджмент: на основе ATR устанавливаются динамические цели по остановке убытков и прибыли, адаптируясь к изменению волатильности рынка.
  4. Механизм отслеживания убытков: защищает полученную прибыль и повышает общую рентабельность путем отслеживания убытков.

Анализ рисков

  1. Риск отставания: технические показатели имеют определенную отсталость, что может привести к задержке вступления.
  2. Риск колебания рынка: часто могут возникать ложные сигналы в ходе рыночных колебаний.
  3. Чувствительность параметров: выбор нескольких параметров индикатора может существенно повлиять на эффективность стратегии.
  4. Риск возникновения ливеринга: поддержка высокого ливеринга может привести к более высокому финансовому риску.

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

  1. Адаптация к рыночной среде: возможно добавление механизмов идентификации рыночной среды, динамическая корректировка параметров в различных рыночных условиях.
  2. Фильтрация сигнала: введение вспомогательных показателей, таких как количество движения, для улучшения качества сигнала.
  3. Оптимизация стыковки: можно разработать более гибкие механизмы стыковки по партиям, повышая прибыльность.
  4. Усиление управления рисками: увеличение механизмов управления рисками, таких как максимальный контроль отмены.

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

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

Исходный код стратегии
/*backtest
start: 2025-02-10 00:00:00
end: 2025-02-17 00:00:00
period: 45m
basePeriod: 45m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("EMA Momentum Scalper", shorttitle="EMS", overlay=true, pyramiding=0)

// === ПАРАМЕТРЫ ===
posSizeMethod = input.string("Capital %", title="Метод расчета позиции", options=["% Based", "Capital %", "Fixed Capital Based", "Fixed Contract Size"])
riskPerTrade = input.float(3, title="Риск на сделку (%)", minval=0.1, maxval=100, step=0.5) / 100
capitalPctPerTrade = input.float(10, title="Доля капитала на сделку (%)", minval=0.1, maxval=100, step=0.5) / 100
fixedCapitalAmount = input.float(100, title="Фиксированная сумма капитала", minval=0)
fixedContractSize = input.int(10, title="Фиксированный размер контракта")
atrLength = input.int(14, title="Длина ATR")
atrMultiplierSL = input.float(2.5, title="ATR множитель для SL")
atrMultiplierTP = input.float(1.5, title="ATR множитель для TP")
timeoutBars = input.int(20, title="Выход через X баров, если нет TP/SL")
emaLength = input.int(50, title="Длина EMA")
rsiLength = input.int(14, title="Длина RSI")
rsiOverbought = input.int(70, title="RSI перекупленность")
rsiOversold = input.int(30, title="RSI перепроданность")
adxLength = input.int(14, title="Длина ADX")
adxThreshold = input.float(20, title="Порог ADX для тренда")
leverage = input.int(15, title="Плечо", minval=1, maxval=100)

// === ИНДИКАТОРЫ ===
atr = ta.atr(atrLength)
ema = ta.ema(close, emaLength)
rsi = ta.rsi(close, rsiLength)

// === ADX ===
diPlus = ta.rma(math.max(high - high[1], 0), adxLength)
diMinus = ta.rma(math.max(low[1] - low, 0), adxLength)
dx = 100 * math.abs(diPlus - diMinus) / (diPlus + diMinus)
adx = ta.rma(dx, adxLength)

// === УСЛОВИЯ ВХОДА ===
longEntry = ta.crossover(close, ema) and rsi > 50 and adx > adxThreshold
shortEntry = ta.crossunder(close, ema) and rsi < 50 and adx > adxThreshold

// === РАСЧЕТ РАЗМЕРА ПОЗИЦИИ ===
var float qty = na
riskAmount = strategy.equity * riskPerTrade
stopLossDistance = atr * atrMultiplierSL
positionSize = riskAmount / stopLossDistance

if (posSizeMethod == "% Based")
    qty := strategy.equity * riskPerTrade / (atr * atrMultiplierSL)
else if (posSizeMethod == "Capital %")
    qty := strategy.equity * capitalPctPerTrade / close
else if (posSizeMethod == "Fixed Capital Based")
    qty := fixedCapitalAmount / close
else if (posSizeMethod == "Fixed Contract Size")
    qty := fixedContractSize

qty := qty * leverage  // Умножаем на плечо

// === СТОП-ЛОСС И ТЕЙК-ПРОФИТ ===
entryPrice = close
stopLossLong = entryPrice - atrMultiplierSL * atr
stopLossShort = entryPrice + atrMultiplierSL * atr
takeProfit1 = entryPrice + atrMultiplierTP * atr * (longEntry ? 1 : -1)
takeProfit2 = entryPrice + atrMultiplierTP * atr * (longEntry ? 2 : -2) / 1.5

// === ТРЕЙЛИНГ-СТОП ===
trailStopDistance = atr * atrMultiplierSL

if (longEntry)
    strategy.entry("Long", strategy.long, qty=qty)
    strategy.exit("Exit Long", "Long", stop=stopLossLong, limit=takeProfit1, trail_points=trailStopDistance)
    alertMessage = syminfo.ticker + " LONG\n" +
                   "Leverage: Cross " + str.tostring(leverage) + "x\n" +
                   "➡️ Entry: " + str.tostring(entryPrice) + "\n" +
                   "🟢 Take profit 1: " + str.tostring(takeProfit1) + "\n" +
                   "🛑 Stop loss: " + str.tostring(stopLossLong)
    alert(alertMessage, alert.freq_once_per_bar_close)

if (shortEntry)
    strategy.entry("Short", strategy.short, qty=qty)
    strategy.exit("Exit Short", "Short", stop=stopLossShort, limit=takeProfit1, trail_points=trailStopDistance)
    alertMessage = syminfo.ticker + " SHORT\n" +
                   "Leverage: Cross " + str.tostring(leverage) + "x\n" +
                   "➡️ Entry: " + str.tostring(entryPrice) + "\n" +
                   "🟢 Take profit 1: " + str.tostring(takeProfit1) + "\n" +
                   "🛑 Stop loss: " + str.tostring(stopLossShort)
    alert(alertMessage, alert.freq_once_per_bar_close)

// === ВИЗУАЛИЗАЦИЯ ===
plotshape(longEntry, color=color.green, style=shape.labelup, location=location.belowbar, text="BUY")
plotshape(shortEntry, color=color.red, style=shape.labeldown, location=location.abovebar, text="SELL")
plot(ema, color=color.blue, title="EMA")
bgcolor(rsi > rsiOverbought or rsi < rsiOversold ? color.new(color.gray, 80) : na)