Стратегия Trailing Stop - это количественная торговая стратегия, которая сочетает в себе индикаторы оценки тренда и механизмы trailing stop.
Стратегия сначала рассчитывает индикатор Supertrend, чтобы судить, является ли текущий тренд вверх или вниз. Индикатор Supertrend включает в себя индикатор ATR и поворотную точку для более точного определения направления тренда. Если индикатор Supertrend оценивает восходящий тренд, генерируется сигнал покупки. Если он оценивает нисходящий тренд, генерируется сигнал продажи.
Когда генерируется сигнал покупки, стратегия откроет длинную позицию. В то же время она рассчитывает линию остановки в режиме реального времени. Способ расчета этой линии остановки - это точка поворота минус значение индикатора ATR. До тех пор, пока текущая цена закрытия выше этой линии остановки, линия остановки будет двигаться вверх в режиме реального времени и поддерживать разумную позицию остановки потери. Если цена пройдет через линию остановки, позиция будет закрыта с остановкой потери.
Стратегия также включает в себя индикаторы ADX и RSI для фильтрации неуместных торговых сигналов. Только когда ADX превышает установленный порог и RSI находится на разумном уровне, сигналам от индикатора Supertrend можно доверять для открытия позиций.
Наибольшее преимущество этой стратегии заключается в том, что она может хорошо понять направление тренда и достичь отслеживания тренда. Индикатор Supertrend более точен, чем простые скользящие средние и может быстро определить поворотные точки. В то же время механизм отслеживания остановки может автоматически регулировать уровни остановки для максимизации блокировки прибыли и эффективного контроля рисков.
Кроме того, индикаторы ADX и RSI добавляются в стратегию фильтрации, избегая ошибок в периоды высокой волатильности рынка.
Наибольший риск этой стратегии заключается в том, что суждение о тренде ошибается, и индикатор Supertrend выдает неправильный сигнал. Хотя индикатор Supertrend превосходит простые скользящие средние, неизбежно, что ошибочные оценки будут происходить в сложных рыночных условиях. В этот момент необходимо полагаться на механизмы остановки потерь для контроля потерь.
Кроме того, неправильные настройки параметров стратегии также могут представлять собой риски. Например, слишком большой параметр ATR приведет к чрезмерно агрессивным корректировкам линии стоп-лосса. Неправильные настройки параметров ADX и RSI также могут упустить торговые возможности или увеличить вероятность ошибочных сделок. Это требует обширного исторического бэкстестинга для поиска оптимальных параметров.
Стратегия может быть дополнительно оптимизирована в следующих аспектах:
Попробуйте использовать другие индикаторы оценки тренда, такие как DMI и KDJ, в сочетании с индикатором Supertrend, чтобы сформировать систему оценки
Увеличить модуль адаптивной оптимизации параметров, основанный на машинном обучении, чтобы параметр ATR, параметр ADX, параметр RSI и так далее могли регулироваться в соответствии с рынком в реальном времени вместо фиксированных значений.
Внедрение индикаторов настроения для замены индикаторов RSI для фильтрации сигналов.
Увеличьте модуль управления размером позиции. В соответствии с расстоянием между линией остановки и текущей ценой динамически корректируйте размер позиции. Чем дальше от линии остановки, тем больше размер позиции может быть соответствующим образом увеличен для улучшения потенциала прибыли.
Стратегия Trailing Stop использует такие методы, как анализ трендов, trailing stops и мультифакторная фильтрация.
/*backtest start: 2023-01-16 00:00:00 end: 2024-01-16 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Bendre ADX Sup Trend", overlay = true) /////////////////////////// // SuperTrend + Pivot Point ////////////////////////// src = input(close, title="EMA Source") PPprd = input(defval = 2, title="Pivot Point Period") AtrFactor=input(defval = 2, title = "ATR Factor") AtrPd=input(defval = 18, title = "ATR Period") StartDate = input(timestamp("1 Dec 2022"), title="Start Date") EndDate = input(timestamp("12 Jan 2023"), title="End Date") var float ph = na var float pl = na ph := ta.pivothigh(PPprd, PPprd) pl :=ta.pivotlow(PPprd, PPprd) float center = na center := center[1] // float lastpp = ph ? ph : pl ? pl : 0.0 float lastpp = na(ph) ? na(pl) ? na : pl : ph if lastpp > 0 if na(center) center := lastpp else center := (center * 2 + lastpp) / 3 Up = center - (AtrFactor * ta.atr(AtrPd)) Dn = center + (AtrFactor * ta.atr(AtrPd)) var float TUp = na var float TDown = na Trend = 0 TUp := close[1] > TUp[1] ? math.max(Up, TUp[1]) : Up TDown := close[1] < TDown[1] ? math.min(Dn, TDown[1]) : Dn Trend := close > TDown[1] ? 1: close < TUp[1]? -1: nz(Trend[1], 1) Trailingsl = Trend == 1 ? TUp : TDown // Lines linecolor = Trend == 1 and nz(Trend[1]) == 1 ? color.lime : Trend == -1 and nz(Trend[1]) == -1 ? color.red : na plot(Trailingsl, color = linecolor , linewidth = 2, title = "PP SuperTrend") bsignalSSPP = close > Trailingsl ssignalSSPP = close < Trailingsl /////// // ADX ////// lenADX = 14 th = 14 TrueRange = math.max(math.max(high-low, math.abs(high-nz(close[1]))), math.abs(low-nz(close[1]))) DirectionalMovementPlus = high-nz(high[1]) > nz(low[1])-low ? math.max(high-nz(high[1]), 0): 0 DirectionalMovementMinus = nz(low[1])-low > high-nz(high[1]) ? math.max(nz(low[1])-low, 0): 0 SmoothedTrueRange = 0.0 SmoothedTrueRange := nz(SmoothedTrueRange[1]) - (nz(SmoothedTrueRange[1])/lenADX) + TrueRange SmoothedDirectionalMovementPlus = 0.0 SmoothedDirectionalMovementPlus := nz(SmoothedDirectionalMovementPlus[1]) - (nz(SmoothedDirectionalMovementPlus[1])/lenADX) + DirectionalMovementPlus SmoothedDirectionalMovementMinus = 0.0 SmoothedDirectionalMovementMinus := nz(SmoothedDirectionalMovementMinus[1]) - (nz(SmoothedDirectionalMovementMinus[1])/lenADX) + DirectionalMovementMinus DIPlus = SmoothedDirectionalMovementPlus / SmoothedTrueRange * 100 DIMinus = SmoothedDirectionalMovementMinus / SmoothedTrueRange * 100 DX = math.abs(DIPlus-DIMinus) / (DIPlus+DIMinus)*100 ADX = ta.sma(DX, lenADX) ////// // MA ///// lenMA = 21 srcMA = input(close, title="Source") // offsetMA = input(title="Offset", type=input.integer, defval=0, minval=-500, maxval=500) offsetMA = input(0, title="Offset") outMA = ta.sma(srcMA, lenMA) // // RSI // length = input( 14 ) overSold = input( 30 ) overBought = input( 65 ) price = close vrsi = ta.rsi(price, length) // Buy - Sell Entries buy = bsignalSSPP and outMA < close and ADX > th sell = ssignalSSPP if (buy and vrsi > overBought) // .order // Tuned version strategy.entry("Buy", strategy.long) // strategy.close("Sell", "close Sell") if (sell) and (strategy.position_size > 0) // strategy.entry("Sell", strategy.short) strategy.close("Buy", "Close Buy") // if(sell and vrsi < overSold ) // strategy.entry("Sell", strategy.short) // if(buy) and (strategy.position_size > 0) // strategy.close("Sell", "close Sell")