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.
A estratégia baseia-se principalmente em três indicadores personalizados:
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.
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.
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:
Indicador de duplo impulso > 0, os preços sobem para romper o trilho superior, que pertence a tendência de seguir, ir longo.
Indicador de duplo impulso < 0, queda de preço para quebrar o trilho inferior, que pertence à inversão de tendência, ir curto.
Preço de fechamento > Preço de abertura > Nível de pivô, considerado como rompendo o pivô para ir longo, ir longo.
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:
Indicador de empuxo duplo < 0, o preço cai para quebrar o trilho inferior, que pertence a tendência seguinte, ir curto.
Indicador de duplo impulso > 0, o preço sobe para quebrar o trilho superior, que pertence à inversão de tendência, vá longo.
Preço de abertura > Preço de fechamento < Nível de pivô, considerado como quebra do pivô para curto, curto.
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.
A estratégia apresenta as seguintes vantagens:
O indicador de duplo empuxo pode determinar com precisão a tendência do mercado e é o indicador central da estratégia.
O canal de sobrecompra/supervenda combinado com o indicador pode revelar potenciais oportunidades de reversão.
A linha básica da média móvel pode servir como sinal de filtragem auxiliar para evitar falsas rupturas.
O ponto de pivô combinado com o indicador de duplo empuxo forma pontos de negociação de alta probabilidade.
Possui capacidades de negociação de tendência e inversão para obter mais oportunidades de lucro.
O canal stop loss sobrecomprado/supervendido é simples e claro, o que é benéfico para o controlo do risco.
A estratégia apresenta igualmente os seguintes riscos:
O indicador de empuxo duplo pode emitir sinais errados e deve ser filtrado com outros indicadores.
A negociação de breakout é propensa a ficar presa, por isso é necessário um stop loss rigoroso.
A definição inadequada da média móvel de período pode deixar passar as tendências ou gerar sinais falsos.
Os pontos de pivô precisam de backtesting para verificar a confiabilidade da probabilidade.
O canal de sobrecompra/supervenda necessita de otimização dos parâmetros para se adaptar a diferentes produtos.
O desajuste dos parâmetros dos indicadores pode conduzir a negociações frequentes.
Para combater estes riscos, podem ser tomadas as seguintes medidas:
Combine outros indicadores como K-line, volume para verificar os sinais do indicador de empuxo duplo.
Seguir rigorosamente a estratégia de stop loss do canal sobrecomprado/sobrevendido para obter uma stop loss rápida.
Teste diferentes parâmetros de período da média móvel para encontrar o ideal.
Teste completamente a probabilidade da estratégia do ponto de pivô.
Otimizar os parâmetros para encontrar a combinação ideal para cada produto.
Ajustar os parâmetros do indicador para manter o funcionamento do sistema em geral sem problemas.
A estratégia pode também ser otimizada nos seguintes aspectos:
Aumentar os algoritmos de aprendizagem de máquina para treinar o indicador duplo de empuxo com grandes volumes de dados.
Adicionar canais adaptativos para ajustar automaticamente os parâmetros do canal com base na volatilidade do mercado.
Utilize a aprendizagem profunda para extrair indicadores mais variáveis para otimizar as estratégias de entrada e saída.
Adicionar algoritmos avançados de stop loss que podem rastrear tendências para stop loss, evitando ser interrompido por reversões.
Realizar testes de otimização de parâmetros e combinações para melhorar a estabilidade geral da estratégia.
Adicionar módulos de gestão de riscos para um controlo mais científico dos riscos.
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)