A estratégia Trailing Stop é uma estratégia quantitativa de negociação que combina indicadores de julgamento de tendência e mecanismos de trailing stop.
A estratégia primeiro calcula o indicador de Supertrend para julgar se a tendência atual é para cima ou para baixo. O indicador de Supertrend incorpora o indicador ATR e ponto de pivô para determinar com mais precisão a direção da tendência.
Quando um sinal de compra é gerado, a estratégia abrirá uma posição longa. Ao mesmo tempo, ele calcula uma linha de parada de rastreamento em tempo real. O método de cálculo desta linha de parada é o ponto pivô menos o valor do indicador ATR. Contanto que o preço de fechamento atual seja maior que essa linha de parada, a linha de parada se moverá para cima em tempo real e manterá uma posição de stop loss razoável. Se o preço atravessar a linha de parada, a posição será fechada com um stop loss.
A estratégia também incorpora os indicadores ADX e RSI para filtrar sinais de negociação inadequados.
A maior vantagem desta estratégia é que pode entender bem a direção da tendência e alcançar o rastreamento da tendência. O indicador Supertrend é mais preciso do que as médias móveis simples e pode determinar rapidamente pontos de virada. Ao mesmo tempo, o mecanismo de parada traseira pode ajustar automaticamente os níveis de parada para maximizar o bloqueio de lucro e controlar efetivamente os riscos.
Além disso, os indicadores ADX e RSI são adicionados à estratégia de filtragem, evitando erros durante períodos de alta volatilidade do mercado.
O maior risco desta estratégia é que o julgamento da tendência seja errado e o indicador Supertrend emita um sinal errado. Embora o indicador Supertrend seja superior às médias móveis simples, é inevitável que erros de julgamento ocorram em condições complexas de mercado. Neste ponto, é necessário confiar em mecanismos de stop loss para controlar as perdas.
Além disso, configurações incorretas de parâmetros de estratégia também podem representar riscos. Por exemplo, um parâmetro ATR que é muito grande levará a ajustes agressivos de linha de stop-loss.
A estratégia pode ser ainda melhorada nos seguintes aspectos:
Tente outros indicadores de avaliação da tendência, como o DMI e o KDJ, em combinação com o indicador Supertrend para formar um sistema de avaliação
Aumentar o módulo de otimização de parâmetros adaptativos baseado em aprendizagem de máquina para que o parâmetro ATR, o parâmetro ADX, o parâmetro RSI e assim por diante possam ser ajustados de acordo com o mercado em tempo real em vez de valores fixos.
Introduzir indicadores de sentimento para substituir os indicadores do RSI para a filtragem de sinais.
Aumentar o módulo de gerenciamento de dimensionamento de posição. De acordo com a distância entre a linha de parada e o preço atual, ajuste dinamicamente o tamanho da posição. Quanto mais longe da linha de parada, maior o tamanho da posição pode ser aumentado adequadamente para melhorar o potencial de lucro.
A estratégia de rastreamento de tendências trailing stop emprega métodos como análise de tendências, trailing stops e filtragem de múltiplos fatores.
/*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")