В процессе загрузки ресурсов... загрузка...

Стратегия отслеживания тренда

Автор:Чао Чжан, Дата: 2024-01-17 11:19:06
Тэги:

img

Обзор

Стратегия Trailing Stop - это количественная торговая стратегия, которая сочетает в себе индикаторы оценки тренда и механизмы trailing stop.

Принципы стратегии

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

Когда генерируется сигнал покупки, стратегия откроет длинную позицию. В то же время она рассчитывает линию остановки в режиме реального времени. Способ расчета этой линии остановки - это точка поворота минус значение индикатора ATR. До тех пор, пока текущая цена закрытия выше этой линии остановки, линия остановки будет двигаться вверх в режиме реального времени и поддерживать разумную позицию остановки потери. Если цена пройдет через линию остановки, позиция будет закрыта с остановкой потери.

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

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

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

Кроме того, индикаторы ADX и RSI добавляются в стратегию фильтрации, избегая ошибок в периоды высокой волатильности рынка.

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

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

Кроме того, неправильные настройки параметров стратегии также могут представлять собой риски. Например, слишком большой параметр ATR приведет к чрезмерно агрессивным корректировкам линии стоп-лосса. Неправильные настройки параметров ADX и RSI также могут упустить торговые возможности или увеличить вероятность ошибочных сделок. Это требует обширного исторического бэкстестинга для поиска оптимальных параметров.

Руководство по оптимизации

Стратегия может быть дополнительно оптимизирована в следующих аспектах:

  1. Попробуйте использовать другие индикаторы оценки тренда, такие как DMI и KDJ, в сочетании с индикатором Supertrend, чтобы сформировать систему оценки многофакторной, что может улучшить точность оценки.

  2. Увеличить модуль адаптивной оптимизации параметров, основанный на машинном обучении, чтобы параметр ATR, параметр ADX, параметр RSI и так далее могли регулироваться в соответствии с рынком в реальном времени вместо фиксированных значений.

  3. Внедрение индикаторов настроения для замены индикаторов RSI для фильтрации сигналов.

  4. Увеличьте модуль управления размером позиции. В соответствии с расстоянием между линией остановки и текущей ценой динамически корректируйте размер позиции. Чем дальше от линии остановки, тем больше размер позиции может быть соответствующим образом увеличен для улучшения потенциала прибыли.

Заключение

Стратегия 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")





Больше