Estratégia de indicador de duplo impulso

Autora:ChaoZhang, Data: 23 de janeiro de 2021
Tags:

Resumo

A ideia central desta estratégia é combinar o indicador de impulso duplo com uma linha média móvel básica para implementar a negociação de tendência e inversão de tendência.

Estratégia lógica

A estratégia baseia-se principalmente em três indicadores personalizados:

  1. Indicador de impulso duplo (Tendência): Calcula a relação entre o preço e o canal de sobrecompra / sobrevenda para determinar as tendências de alta e baixa, retornando 1, 0, -1 três estados.

  2. Canal de sobrecompra/supervenda (Tsl): Calcula os carris superiores e inferiores com referência ao ATR. A ruptura do carris superior é considerada como sobrecompra e a ruptura do carris inferior é considerada como sobrevenda.

  3. Linha de média móvel básica (MA): Calcula a média móvel simples de 20 períodos do preço de fechamento.

Especificamente, a estratégia julga se o preço está em estado de alta, lateral ou baixa de acordo com o valor do indicador de impulso duplo. Quando o indicador de impulso duplo é 1, significa um estado de alta; quando o indicador de impulso duplo é -1, significa um estado de baixa. Neste ponto, se o preço estiver na mesma direção que o indicador, é adotada uma estratégia de tendência, indo longo ou curto no local certo.

Além disso, a quebra do preço na linha média móvel também serve como um sinal auxiliar para orientar a direção da negociação.

As estratégias específicas de negociação a longo prazo são as seguintes:

  1. Indicador de duplo impulso > 0, os preços sobem para romper o trilho superior, que pertence a tendência de seguir, ir longo.

  2. Indicador de duplo impulso < 0, queda de preço para quebrar o trilho inferior, que pertence à inversão de tendência, ir curto.

  3. Preço de fechamento > Preço de abertura > Nível de pivô, considerado como rompendo o pivô para ir longo, ir longo.

  4. O preço de fechamento quebra o trilho superior e o preço de fechamento > Linha média móvel, vai longo.

As estratégias de negociação a curto prazo são as seguintes:

  1. Indicador de empuxo duplo < 0, o preço cai para quebrar o trilho inferior, que pertence a tendência seguinte, ir curto.

  2. Indicador de duplo impulso > 0, o preço sobe para quebrar o trilho superior, que pertence à inversão de tendência, vá longo.

  3. Preço de abertura > Preço de fechamento < Nível de pivô, considerado como quebra do pivô para curto, curto.

  4. O preço de fechamento quebra através do trilho inferior e o preço de fechamento < linha média móvel, fica curto.

A estratégia de saída é simples, interrompendo a perda quando o preço atravessa novamente o canal de sobrecompra/supervenda.

Análise das vantagens

A estratégia apresenta as seguintes vantagens:

  1. O indicador de duplo empuxo pode determinar com precisão a tendência do mercado e é o indicador central da estratégia.

  2. O canal de sobrecompra/supervenda combinado com o indicador pode revelar potenciais oportunidades de reversão.

  3. A linha básica da média móvel pode servir como sinal de filtragem auxiliar para evitar falsas rupturas.

  4. O ponto de pivô combinado com o indicador de duplo empuxo forma pontos de negociação de alta probabilidade.

  5. Possui capacidades de negociação de tendência e inversão para obter mais oportunidades de lucro.

  6. O canal stop loss sobrecomprado/supervendido é simples e claro, o que é benéfico para o controlo do risco.

Análise de riscos

A estratégia apresenta igualmente os seguintes riscos:

  1. O indicador de empuxo duplo pode emitir sinais errados e deve ser filtrado com outros indicadores.

  2. A negociação de breakout é propensa a ficar presa, por isso é necessário um stop loss rigoroso.

  3. A definição inadequada da média móvel de período pode deixar passar as tendências ou gerar sinais falsos.

  4. Os pontos de pivô precisam de backtesting para verificar a confiabilidade da probabilidade.

  5. O canal de sobrecompra/supervenda necessita de otimização dos parâmetros para se adaptar a diferentes produtos.

  6. O desajuste dos parâmetros dos indicadores pode conduzir a negociações frequentes.

Para combater estes riscos, podem ser tomadas as seguintes medidas:

  1. Combine outros indicadores como K-line, volume para verificar os sinais do indicador de empuxo duplo.

  2. Seguir rigorosamente a estratégia de stop loss do canal sobrecomprado/sobrevendido para obter uma stop loss rápida.

  3. Teste diferentes parâmetros de período da média móvel para encontrar o ideal.

  4. Teste completamente a probabilidade da estratégia do ponto de pivô.

  5. Otimizar os parâmetros para encontrar a combinação ideal para cada produto.

  6. Ajustar os parâmetros do indicador para manter o funcionamento do sistema em geral sem problemas.

Orientações de otimização

A estratégia pode também ser otimizada nos seguintes aspectos:

  1. Aumentar os algoritmos de aprendizagem de máquina para treinar o indicador duplo de empuxo com grandes volumes de dados.

  2. Adicionar canais adaptativos para ajustar automaticamente os parâmetros do canal com base na volatilidade do mercado.

  3. Utilize a aprendizagem profunda para extrair indicadores mais variáveis para otimizar as estratégias de entrada e saída.

  4. Adicionar algoritmos avançados de stop loss que podem rastrear tendências para stop loss, evitando ser interrompido por reversões.

  5. Realizar testes de otimização de parâmetros e combinações para melhorar a estabilidade geral da estratégia.

  6. Adicionar módulos de gestão de riscos para um controlo mais científico dos riscos.

Resumo

A estratégia combina seguimento de tendências e reversão de tendências organicamente, julgando a estrutura do mercado com o indicador de duplo impulso e gerando sinais de negociação com canais e linhas médias móveis. Tem as vantagens de boa eficácia do indicador, abundantes oportunidades de negociação e clara stop loss. Ao mesmo tempo, também tem certos riscos que precisam de otimização adicional para melhorar a estabilidade.


/*backtest
start: 2023-08-25 00:00:00
end: 2023-09-24 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © amysojexson

//@version=3
strategy(title="Pivots strategy", overlay=true)

// Input settings
// Create a pull-down menu for the pivot type
pivotType = input(title="Pivot Type",
     options=["Daily", "Intraday", "Weekly"], defval="Daily")

// Make toggles for pivot level options
plotPP   = input(title="Plot PP", type=bool, defval=true)
plotS1R1 = input(title="Plot S1 and R1", type=bool, defval=true)
plotS2R2 = input(title="Plot S2 and R2", type=bool, defval=true)
plotS3R3 = input(title="Plot S3 and R3", type=bool, defval=true)
plotTCBC = input(title="Plot S3 and R3", type=bool, defval=true)
// Configure session options
sessRange = input(title="Trading Session",  defval="0800-1600")
showSess  = input(title="Highlight Session?", type=bool, defval=false)

// Enable or disable pivot labels
showLabels = input(title="Show Labels?", type=bool, defval=false)

// Step 2. Calculate indicator values
// Create a function to fetch daily and weekly data
GetData(res, data) =>
    security(syminfo.tickerid, res, data[1],
         lookahead=barmerge.lookahead_on)

// Fetch daily and weekly price data
dailyHigh  = GetData("D", high)
dailyLow   = GetData("D", low)
dailyClose = GetData("D", close)

weeklyHigh  = GetData("W", high)
weeklyLow   = GetData("W", low)
weeklyClose = GetData("W", close)

// Determine session pivot data
// First see how the price bar relates to
// the session time range
inSession = not na(time(timeframe.period, sessRange)[1])
sessStart = inSession and not inSession[1]
sessEnd   = not inSession and inSession[1]

// Determine session price data
sessHigh  = 0.0
sessLow   = 0.0
sessClose = 0.0

sessHigh := sessStart ? high :
     inSession ? max(high, sessHigh[1]) : na
sessLow := sessStart ? low :
     inSession ? min(low, sessLow[1]) : na
sessClose := sessEnd ? close[1] : na

// Compute high, low, close from previous intra-day session
highPrevSess  = 0.0
lowPrevSess   = 0.0
closePrevSess = 0.0

highPrevSess  := sessEnd ? fixnan(sessHigh) : highPrevSess[1]
lowPrevSess   := sessEnd ? fixnan(sessLow) : lowPrevSess[1]
closePrevSess := sessEnd ? fixnan(sessClose) : closePrevSess[1]

// Now figure out which kind of price data
// to use for the pivot calculation
theHigh = if (pivotType == "Daily")
    dailyHigh
else
    if (pivotType == "Intraday")
        highPrevSess
    else
        weeklyHigh

theLow = if (pivotType == "Daily")
    dailyLow
else
    if (pivotType == "Intraday")
        lowPrevSess
    else
        weeklyLow

theClose = if (pivotType == "Daily")
    dailyClose
else
    if (pivotType == "Intraday")
        closePrevSess
    else
        weeklyClose

// Finally calculate the pivot levels
pp = (theHigh + theLow + theClose) / 3
bc= (theHigh + theLow)/2
tc= (pp-bc)+pp

r1 = pp+(.382*(theHigh-theLow))
s1 = pp-(.382*(theHigh-theLow))
r2 = pp +(.618*(theHigh-theLow))
s2 = pp -(.618*(theHigh-theLow))
r3 = pp +(1*(theHigh-theLow))
s3 = pp -(1*(theHigh-theLow))

// Step 3. Output indicator data
// Plot the various pivot levels
plot(series=plotS3R3 ? r3 : na, title="R3",
     style=circles, linewidth=1, color=#0023FF)
plot(series=plotS2R2 ? r2 : na, title="R2",
     style=circles, linewidth=1, color=#1E90FF)
plot(series=plotS1R1 ? r1 : na, title="R1",
     style=circles, linewidth=1, color=#09E0F3)

plot(series=plotTCBC ? tc : na, title="TC",
     style=circles, linewidth=.75, color=#FF00D1)
plot(series=plotPP ? pp : na, title="PP",
     style=circles, linewidth=1, color=#000000)
plot(series=plotTCBC ? bc : na, title="BC",
     style=circles, linewidth=.75, color=#FF00D1)

plot(series=plotS1R1 ? s1 : na, title="S1",
     style=circles, linewidth=1, color=#09E0F3)
plot(series=plotS2R2 ? s2 : na, title="S2",
     style=circles, linewidth=1, color=#1E90FF)
plot(series=plotS3R3 ? s3 : na, title="S3",
     style=circles, linewidth=1, color=#0023FF)

// Display the pivot names on the chart, if applicable
newPivots = (showLabels == false) ? false :
     (pivotType == "Intraday") ? sessEnd :
     (pivotType == "Daily") ? dayofmonth != dayofmonth[1] :
     dayofweek == monday and dayofmonth != dayofmonth[1]

plotchar(series=newPivots and plotS3R3 ? r3 : na,
     char='', text="R3", offset=1,
     location=location.absolute,
     color=#0023FF, title="R3 label")

plotchar(series=newPivots and plotS2R2 ? r2 : na,
     char='', text="R2", offset=1,
     location=location.absolute,
     color=#1E90FF, title="R2 label")

plotchar(series=newPivots and plotS1R1 ? r1 : na,
     char='', text="R1", offset=1,
     location=location.absolute,
     color=#09E0F3, title="R1 label")

plotchar(series=newPivots and plotTCBC ? r1 : na,
     char='', text="TC", offset=1,
     location=location.absolute,
     color=#FF00D1, title="TC label")
     
plotchar(series=newPivots and plotTCBC ? r1 : na,
     char='', text="BC", offset=1,
     location=location.absolute,
     color=#FF00D1, title="BC label")

plotchar(series=newPivots and plotS1R1 ? s1 : na,
     char='', text="S1", offset=1,
     location=location.absolute,
     color=#09E0F3, title="S1 label")

plotchar(series=newPivots and plotS2R2 ? s2 : na,
     char='', text="S2", offset=1,
     location=location.absolute,
     color=#1E90FF, title="S2 label")

plotchar(series=newPivots and plotS3R3 ? s3 : na,
     char='', text="S3", offset=1,
     location=location.absolute,
     color=#0023FF, title="S3 label")

// Highlight the intra-day price data session on the chart
bgcolor(color=showSess and inSession and (pivotType == "Intraday") ?
     orange : na, transp=95)

// Step 4. Create indicator alerts
alertcondition(condition=cross(close, s3),
     title="Pivot S3 Cross",
     message="Prices crossed Pivot S3 level")

alertcondition(condition=cross(close, s2),
     title="Pivot S2 Cross",
     message="Prices crossed Pivot S2 level")

alertcondition(condition=cross(close, s1),
     title="Pivot S1 Cross",
     message="Prices crossed Pivot S1 level")
     
alertcondition(condition=cross(close, tc),
     title="Pivot TC Cross",
     message="Prices crossed Pivot TC level")

alertcondition(condition=cross(close, pp),
     title="Pivot PP Cross",
     message="Prices crossed the main Pivot Point level")
     
alertcondition(condition=cross(close, bc),
     title="Pivot BC Cross",
     message="Prices crossed Pivot BC level")

alertcondition(condition=cross(close, r1),
     title="Pivot R1 Cross",
     message="Prices crossed Pivot R1 level")

alertcondition(condition=cross(close, r2),
     title="Pivot R2 Cross",
     message="Prices crossed Pivot R2 level")

alertcondition(condition=cross(close, r3),
     title="Pivot R3 Cross",
     message="Prices crossed Pivot R3 level")
    
MA = sma(close, 20)
plot(MA, color=red)

Factor				= input(2, type=float)
Pd					= input(10, minval=1,maxval = 100)
Up					= hl2-(Factor*atr(Pd))
Dn					= hl2+(Factor*atr(Pd))
TrendUp				= 0.0
TrendUp				:= close[1]>TrendUp[1]? max(Up,TrendUp[1]) : Up
TrendDown			= 0.0
TrendDown			:= close[1]<TrendDown[1]? min(Dn,TrendDown[1]) : Dn
Trend				= 0.0
Trend 				:= close > TrendDown[1] ? 1: close< TrendUp[1]? -1: nz(Trend[1],1)
Tsl 				= Trend==1? TrendUp: TrendDown

plot(Tsl, color=blue)

if close>open
    if open<pp
        if close>pp
            if close>MA
                strategy.entry("long", true) 
if close<open
    if open>pp
        if close<pp
            if close<MA
                strategy.entry("short", false) 
                
strategy.close("long", when = open<Tsl)
strategy.close("short", when = open>Tsl)

Mais.