Количественная торговая стратегия, основанная на трендовом RSI и скользящей средней

RSI MA SMA TP SL
Дата создания: 2025-01-06 10:58:42 Последнее изменение: 2025-01-06 10:58:42
Копировать: 4 Количество просмотров: 376
1
Подписаться
1617
Подписчики

Количественная торговая стратегия, основанная на трендовом RSI и скользящей средней

Обзор

Эта стратегия представляет собой торговую систему, основанную на тренде, которая объединяет индекс относительной силы (RSI) и простую скользящую среднюю (SMA). Эта стратегия использует скользящую среднюю для определения направления рыночного тренда и индикатор RSI для подтверждения импульса, чтобы торговать, когда тренд и импульс совпадают. Стратегия разработала полноценный механизм стоп-профита и стоп-лосса, который позволяет эффективно контролировать риски.

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

Основная логика стратегии основана на комбинированном использовании двух технических индикаторов:

  1. Скользящая средняя (MA): используется для определения общей тенденции. Когда цена находится выше скользящей средней, это считается восходящим трендом, в противном случае — нисходящим.
  2. Индекс относительной силы (RSI): используется для подтверждения ценовой динамики. Когда RSI выше установленного порогового значения (например, 55), это подтверждает восходящий импульс, а когда он ниже порогового значения (например, 45), это подтверждает нисходящий импульс.

Логика генерации торгового сигнала:

  • Условия длинной позиции: цена выше МА, а RSI больше порога покупки
  • Условия короткой продажи: цена ниже МА и RSI ниже порога продажи

Контроль рисков использует методы процентного стоп-лосса и тейк-профита, которые устанавливаются как фиксированные проценты от цены входа соответственно.

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

  1. Стабильность сигнала: Объединяя двойное подтверждение тренда и импульса, можно эффективно сократить количество ложных сигналов.
  2. Идеальное управление рисками: фиксированные процентные стоп-лосс и тейк-профит устанавливаются для эффективного контроля риска каждой сделки.
  3. Гибкость параметров: ключевые параметры, такие как период MA, порог RSI и т. д., можно оптимизировать в соответствии с различными характеристиками рынка.
  4. Логика стратегии ясна: правила торговли просты и интуитивно понятны, их легко понять и выполнить.
  5. Высокая адаптивность: может применяться к транзакциям в различные периоды времени.

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

  1. Риск разворота тренда: в точках разворота тренда могут возникать непрерывные стоп-лоссы.
  2. Риск волатильности рынка: частая торговля может привести к убыткам в условиях ограниченного диапазона рынка.
  3. Зависимость от параметров: Оптимальные параметры могут существенно различаться в различных рыночных условиях.
  4. Риск проскальзывания: вы можете столкнуться с большим проскальзыванием, когда рынок резко колеблется.
  5. Задержка технического индикатора: как MA, так и RSI имеют определенную задержку, что может привести к задержке входа.

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

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

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

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

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

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © raiford87

//@version=6
strategy("RSI + MA Trend Strategy (v6)",
     shorttitle="RSI_MA_Trend_v6",
     overlay=true,
     initial_capital=50000,
     default_qty_type=strategy.fixed,
     default_qty_value=1)

// ─────────────────────────────────────────────────────────────────────────────────────
// 1. USER INPUTS
// ─────────────────────────────────────────────────────────────────────────────────────
maLength       = input.int(50,   "Moving Average Length")
rsiLength      = input.int(14,   "RSI Length")
rsiBuyLevel    = input.int(55,   "RSI > X for Buy",  minval=1, maxval=99)
rsiSellLevel   = input.int(45,   "RSI < X for Sell", minval=1, maxval=99)

stopLossPerc   = input.float(1.0,  "Stop Loss %",    minval=0.1)
takeProfitPerc = input.float(2.0,  "Take Profit %",  minval=0.1)

// ─────────────────────────────────────────────────────────────────────────────────────
// 2. INDICATOR CALCULATIONS
// ─────────────────────────────────────────────────────────────────────────────────────
maValue = ta.sma(close, maLength)
rsiVal  = ta.rsi(close, rsiLength)

// Trend conditions
bullTrend = close > maValue
bearTrend = close < maValue

// RSI conditions
rsiBull   = rsiVal > rsiBuyLevel
rsiBear   = rsiVal < rsiSellLevel

// ─────────────────────────────────────────────────────────────────────────────────────
// 3. ENTRY CONDITIONS
// ─────────────────────────────────────────────────────────────────────────────────────
longCondition  = bullTrend and rsiBull
shortCondition = bearTrend and rsiBear

if longCondition
    strategy.entry("RSI MA Long", strategy.long)
if shortCondition
    strategy.entry("RSI MA Short", strategy.short)

// ─────────────────────────────────────────────────────────────────────────────────────
// 4. STOP LOSS & TAKE PROFIT
// ─────────────────────────────────────────────────────────────────────────────────────
stopLossLevel   = stopLossPerc   * 0.01
takeProfitLevel = takeProfitPerc * 0.01

if strategy.position_size > 0
    stopPriceLong = strategy.position_avg_price * (1 - stopLossLevel)
    tpPriceLong   = strategy.position_avg_price * (1 + takeProfitLevel)
    strategy.exit("Exit Long", from_entry="RSI MA Long", stop=stopPriceLong, limit=tpPriceLong)

if strategy.position_size < 0
    stopPriceShort = strategy.position_avg_price * (1 + stopLossLevel)
    tpPriceShort   = strategy.position_avg_price * (1 - takeProfitLevel)
    strategy.exit("Exit Short", from_entry="RSI MA Short", stop=stopPriceShort, limit=tpPriceShort)

// ─────────────────────────────────────────────────────────────────────────────────────
// 5. PLOT SIGNALS & LEVELS
// ─────────────────────────────────────────────────────────────────────────────────────
plot(maValue, color=color.yellow, linewidth=2, title="Moving Average")

plotchar(longCondition,  title="Long Signal",  char='▲', location=location.belowbar, color=color.green, size=size.tiny)
plotchar(shortCondition, title="Short Signal", char='▼', location=location.abovebar, color=color.red,   size=size.tiny)

// Plot Stop & TP lines
posIsLong  = strategy.position_size > 0
posIsShort = strategy.position_size < 0

plotStopLong = posIsLong ? strategy.position_avg_price * (1 - stopLossLevel) : na
plotTpLong   = posIsLong ? strategy.position_avg_price * (1 + takeProfitLevel): na
plotStopShort= posIsShort? strategy.position_avg_price * (1 + stopLossLevel) : na
plotTpShort  = posIsShort? strategy.position_avg_price * (1 - takeProfitLevel): na

plot(plotStopLong,  color=color.red,   linewidth=2, style=plot.style_line, title="Stop Loss Long")
plot(plotTpLong,    color=color.green, linewidth=2, style=plot.style_line, title="Take Profit Long")
plot(plotStopShort, color=color.red,   linewidth=2, style=plot.style_line, title="Stop Loss Short")
plot(plotTpShort,   color=color.green, linewidth=2, style=plot.style_line, title="Take Profit Short")