
A estratégia combina a linha de parada dinâmica formada pelo indicador de tendência super, os pontos de pivô e a amplitude real média, bem como o indicador de direção média, o índice de movimento direcional (ADX), para permitir o julgamento e o acompanhamento da tendência. A estratégia é adequada para negociação de linhas curtas, pode capturar a continuação da tendência após a composição do disco médio, e o controle de retração também é bom.
O indicador de supertrend combina o ponto central e o ATR para determinar a direção em que o preço quebra a linha de parada dinâmica para determinar a direção da posição. Ao mesmo tempo, o indicador ADX determina a força da tendência e emite um sinal de negociação somente quando a tendência é forte o suficiente.
Especificamente, o ponto central recebe a resistência de suporte mais recente e, em seguida, forma uma média dinâmica com a média aritmética dos dois últimos dias. Em seguida, calcula-se o ATR e multiplica-se o fator ATR, e, em seguida, é adicionado e subtraído com a média dinâmica, obtendo ascensão e descensão.
A linha de stop-loss ajusta-se dinamicamente com base nos preços mais recentes e nos valores ATR, permitindo um bom acompanhamento da tendência.
A estratégia tem as seguintes vantagens:
O uso de indicadores de super-tendência para acompanhar a direção da tendência e evitar que os lucros sejam bloqueados por um mercado em turbulência.
O indicador ADX é usado para avaliar a força da tendência, evitando erros de negociação durante a liquidação.
A linha de stop loss é ajustada dinamicamente para maximizar o lucro.
A combinação com o RSI evita que as transações sejam negociadas.
Em geral, a configuração dos parâmetros da estratégia é razoável, a seleção do dframe leva em consideração a continuidade, e a configuração de stop loss também é boa.
A estratégia também apresenta alguns riscos:
O indicador de tendência ultra e o indicador de MA podem emitir sinais de conflito.
O indicador ADX está definido para 14 ciclos, com insuficiente sensibilidade a eventos de emergência.
Os parâmetros do RSI são definidos como padrões e podem não ser totalmente evitados.
Não tem em conta o impacto de eventos inesperados, como grandes perdas de lucro/notícias positivas.
Resolução:
Ajustar o ciclo de MA para que ele coincida com o indicador de tendência ultra.
Tente reduzir o ciclo ADX e aumentar a sensibilidade a eventos de emergência.
Optimizar os parâmetros do RSI para encontrar o melhor valor.
O blogueiro também fez um post sobre o assunto, no qual ele explica que o blogueiro não tem acesso a notícias importantes.
A estratégia também pode ser melhorada nos seguintes aspectos:
Aumentar a tendência de julgamento de modelos de aprendizagem de máquina para tornar as decisões de negociação mais inteligentes.
Tente introduzir indicadores alternativos como o índice de emoção (ADX) para avaliar a força da tendência.
Adição de módulo de parada de perda adaptável, para que a parada de perda seja mais dinâmica e precisa.
O objetivo é extrair mais características e otimizar a estratégia global com técnicas de aprendizagem profunda.
O desenvolvimento de estratégias em linguagens avançadas, como Python, aumenta a escalabilidade das estratégias.
Esta estratégia é muito prática em geral, o núcleo é acompanhar a direção da tendência e participar quando a tendência é forte o suficiente. A configuração de stop loss e stop loss também está bem posicionada, maximizando o bloqueio de lucros e evitando a expansão de perdas.
/*backtest
start: 2023-01-15 00:00:00
end: 2024-01-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Bendre ADX STrend", 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 = 21, title = "ATR Period")
StartDate = input(timestamp("1 Dec 2023"), title="Start Date")
EndDate = input(timestamp("12 Jan 2024"), title="End Date")
window() => true
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)
//
// DMI - Direction Movement Index
//
[diplus1, diminus1, adx] = ta.dmi(14, 14)
// Buy - Sell Entries
buy = bsignalSSPP and outMA < close and ADX > th
sell = ssignalSSPP
if (buy and vrsi > overBought and adx > 19)
// .order // Tuned version
strategy.entry("Buy", strategy.long, when = window())
// 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 and adx > 25)
strategy.entry("Sell", strategy.short, when = window())
if ( ta.crossover( diminus1, diplus1) or ((buy) and (strategy.position_size > 0)) )
strategy.close("Sell", "close Sell")
// if(sell) and (diminus1 > diplus1) and adx > 23 and adx > adx[1] and (vrsi < overSold)
// strategy.entry("Sell", strategy.short, when = window())
// if (strategy.position_size > 0 and ta.crossunder(diminus1, adx)) or (strategy.position_size > 0 and (buy))
// strategy.close("Sell", "close Sell")