Эта стратегия сочетает в себе индикаторы импульса с индексом относительной силы (RSI) вместе с динамическим механизмом остановки, чтобы определить направление тренда при одновременном контроле риска.
Использование индикатора ADX для определения направления ценового тренда
ADX выше 20 показывает наличие тенденции
+DI пересечение выше -DI является длинным сигналом
-ДИ пересечение ниже +DI является коротким сигналом
RSI для определения перекупленности/перепроданности
RSI выше 70 указывает на перекуп, короткий сигнал
RSI ниже 30 указывает на перепроданность, длинный сигнал
Принимать длинные/короткие позиции, когда ADX показывает тренд + сигнал подтверждения RSI.
Стратегия использует динамический механизм остановки с двумя параметрами:
Уровень активации: активация последней остановки, когда цена достигает установленного процента после входа
Процент отставания: процент отставания от максимальной прибыли
После активации, стоп-стоп будет следовать за самым высоким уровнем прибыли. По мере того, как цена возвращается, стоп-уровень движется ниже. Если ретрассе превышает процент отслеживания, стоп-стоп запускается, закрывая все позиции.
Momentum ADX определяет направление тренда, избегая ложных прорывов
Подтверждение RSI гарантирует, что возможности для изменения не будут упущены
Регулируемая задержка блокирует прибыль и минимизирует потери
Простая и понятная логика стратегии, легко понятная
Применяется на разных рынках и в разные периоды времени
ADX может сигнализировать о ложном прорыве
RSI может дать несколько ложных сигналов
Плохие параметры остановки
Пробелы могут привести к пропущенным остановкам
Испытать комбинации ADX/RSI для оптимизации записей
Проверка различных уровней активации и процентов следов
Добавление дополнительных фильтров для улучшения качества сигнала
Испытание на разных рынках для поиска надежных параметров
Эта стратегия объединяет анализ импульса, RSI и последующие остановки для эффективного определения направления тренда, спотовых переворотов и контроля риска. Простая логика делает ее простой для реализации на фондовых, форекс, крипто и других трендовых рынках. Дальнейшие улучшения могут произойти за счет оптимизации параметров и добавления фильтров. В целом она предоставляет трейдерам надежную количественную торговую структуру.
/*backtest start: 2023-10-01 00:00:00 end: 2023-10-03 00:00:00 period: 30m basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Trailing Stop with RSI", overlay=true) length = input.int(12, "Momentum Length") price = close momentum(seria, length) => mom = seria - seria[length] mom mom0 = momentum(price, length) mom1 = momentum(mom0, 1) rsiLength = input.int(14, "RSI Length") rsiOverbought = input(70, "RSI Overbought Level") rsiOversold = input(30, "RSI Oversold Level") rsiValue = ta.rsi(close, rsiLength) tsact = input.float(0.0, "Trailing Stop Activation (%)", group="strategy", tooltip="Activates the Trailing Stop once this PnL is reached.") / 100 tsact := tsact ? tsact : na ts = input.float(0.0, "Position Trailing Stop (%)", group="strategy", tooltip="Trails your position with a stop loss at this distance from the highest PnL") / 100 ts := ts ? ts : na in_long = strategy.position_size > 0 in_short = strategy.position_size < 0 var ts_ = array.new_float() ts_size = array.size(ts_) ts_get = ts_size > 0 ? array.get(ts_, ts_size - 1) : 0 if in_long if tsact and high > strategy.position_avg_price + strategy.position_avg_price * tsact if ts_size > 0 and ts_get < high array.push(ts_, high) if ts_size < 1 array.push(ts_, high) if not tsact if ts_size > 0 and ts_get < high array.push(ts_, high) if ts_size < 1 array.push(ts_, high) if in_short if tsact and low < strategy.position_avg_price - strategy.position_avg_price * tsact if ts_size > 0 and ts_get > low array.push(ts_, low) if ts_size < 1 array.push(ts_, low) if not tsact if ts_size > 0 and ts_get > low array.push(ts_, low) if ts_size < 1 array.push(ts_, low) trail = in_long and ts_size > 0 ? low < ts_get - ts_get * ts : in_short and ts_size > 0 ? high > ts_get + ts_get * ts : na if (mom0 > 0 and mom1 > 0) strategy.entry("MomLE", strategy.long, stop=high+syminfo.mintick, comment="MomLE") else strategy.cancel("MomLE") if (mom0 < 0 and mom1 < 0) strategy.entry("MomSE", strategy.short, stop=low-syminfo.mintick, comment="MomSE") else strategy.cancel("MomSE") tsClose = in_long ? ts_get - ts_get * ts : in_short ? ts_get + ts_get * ts : na if trail strategy.close_all() if not strategy.opentrades array.clear(ts_) rsiOverboughtCondition = rsiValue >= rsiOverbought rsiOversoldCondition = rsiValue <= rsiOversold if rsiOverboughtCondition strategy.close("SHORT", "SX") strategy.entry("LONG", strategy.long) if rsiOversoldCondition strategy.close("LONG", "LX") strategy.entry("SHORT", strategy.short) plotchar(ts_get, "GET", "") plot(strategy.position_avg_price > 0 ? strategy.position_avg_price : na, "Average", color.rgb(251, 139, 64), 2, plot.style_cross) plot(tsClose > 0 ? tsClose : na, "Trailing", color.rgb(251, 64, 64), 2, plot.style_cross) plot(strategy.position_avg_price - strategy.position_avg_price * tsact > 0 ? strategy.position_avg_price - strategy.position_avg_price * tsact : na, "TS Activation", color.fuchsia, 2, plot.style_cross)