Seguidor de tendência de fuga V2


Data de criação: 2023-11-01 17:24:08 última modificação: 2023-11-01 17:24:08
cópia: 0 Cliques: 754
1
focar em
1625
Seguidores

Seguidor de tendência de fuga V2

Visão geral

Esta estratégia é uma variante da minha anterior estratégia de outro rastreador de tendências de ruptura. Na outra estratégia, você pode usar a média móvel como um filtro de negociação (ou seja, se o preço estiver abaixo da média móvel, ela não fará muito). Depois de ter feito uma ferramenta para detectar tendências de quadros de tempo mais altos, eu gostaria de ver se ela poderia ser um filtro melhor do que a média móvel.

Portanto, a estratégia permite que você veja as tendências em um período de tempo mais longo (ou seja, se há altos mais altos e baixos mais baixos? Se assim for, é uma tendência ascendente). Você só faz uma posição na direção da tendência. Você pode escolher até duas tendências como filtros.

Eu descobri que esta estratégia geralmente não funciona muito bem em comparação com outras estratégias, mas ela realmente parece ser uma estratégia mais exigente para o negócio. Ela mostra uma maior taxa de vitória e um melhor fator de lucro.

Princípio da estratégia

A lógica central da estratégia é identificar tendências usando suportes e resistências que quebram quadros de tempo mais altos e negociar de acordo com a direção da tendência.

Em particular, ela se dá através dos seguintes passos:

  1. Calcular os pontos de suporte e resistência no período de tempo atual (por exemplo, uma linha de 1 hora). Isso é feito procurando os preços mais altos e mais baixos em um determinado período.

  2. Calcular o ponto de apoio e resistência de um ou mais quadros de tempo mais elevados (como o quadrado horário e o quadrado solar). Isso é implementado usando a mesma lógica do quadrado atual.

  3. A linha horizontal dessas áreas de suporte e resistência é traçada no gráfico. Quando os preços ultrapassam esses níveis, a tendência de um quadro de tempo mais alto é alterada.

  4. A direção da tendência é determinada se o preço ultrapassa esses níveis-chave. Se o preço ultrapassa um ponto alto, é considerado uma tendência ascendente. Se ele ultrapassa um ponto baixo, é considerado uma tendência descendente.

  5. Permitir que o usuário selecione uma ou mais tendências de um ou mais prazos superiores como condição de filtragem. Ou seja, apenas quando a direção da tendência do período atual coincide com a direção da tendência do período superior, a negociação será considerada.

  6. Quando as condições de filtragem de tendência são satisfeitas e o preço atual supera o nível crítico, compra-se ou vende-se. O nível de stop loss é definido como o suporte ou resistência anterior ao nível crítico.

  7. À medida que o preço avança, quando novos altos ou baixos são formados, o stop loss é movido para novos baixos para bloquear os lucros e acompanhar a tendência.

  8. Quando um stop loss é acionado ou um ponto de suporte/resistência crítico é ultrapassado, a posição de equilíbrio é retirada.

Através desta análise de tendências em vários prazos, a estratégia tenta negociar apenas na direção da tendência mais forte para aumentar a probabilidade de ganhar. Ao mesmo tempo, os níveis críticos fornecem sinais claros de entrada e parada.

Vantagens estratégicas

  • O uso de vários períodos de tempo para avaliar as tendências permite identificar com mais precisão as direções de tendências mais fortes e evitar ser enganado pelo ruído do mercado.

  • Operar apenas na direção das principais tendências pode aumentar significativamente a taxa de vitória. De acordo com os resultados do teste, a estratégia mostra uma maior taxa de vitória e melhor relação de risco de ganho em comparação com a filtragem de médias móveis simples.

  • Os pontos de suporte e resistência fornecem níveis claros de entrada e parada. Não há necessidade de complicar a escolha de pontos de entrada específicos.

  • A posição de parada pode ser ajustada conforme a tendência se desenvolve para maximizar o lucro.

  • A lógica da estratégia é simples e clara, fácil de entender e ajustar.

Risco estratégico

  • O julgamento de tendências que dependem de segmentos de linha mais longos pode ser facilmente manipulado quando a tendência se inverte. O período de tempo de julgamento de tendências deve ser apropriadamente reduzido ou outros indicadores devem ser usados para auxiliar o julgamento.

  • Sem levar em conta os efeitos fundamentais, o preço das ações pode se desviar quando ocorrem eventos importantes. Pode-se adicionar condições de filtragem, como eventos de ATM ou datas de resultados.

  • Não há controle de tamanho de posição. O tamanho da posição pode ser definido de acordo com o tamanho do capital da conta, a volatilidade e outros fatores.

  • O período de retrospectiva é limitado. O período de retrospectiva deve ser ampliado para testar a robustez em diferentes ambientes de mercado.

  • Os parâmetros da estratégia devem ser ajustados de acordo com os custos de transação específicos no disco físico.

  • Considere apenas a negociação de linha longa. Pode ser combinado com outras estratégias para desenvolver sinais de negociação de linha curta, para alcançar arbitragem de múltiplos períodos.

Direção de otimização da estratégia

  • Adicionar condições de filtro:

    • Dados básicos, como resultados financeiros, notícias, etc.

    • Indicadores como volume de transações, ATR de parada e assim por diante.

  • Parâmetros de optimização:

    • Ajustar o ciclo de cálculo de suporte/resistência

    • O quadro de tempo para ajustar a avaliação de tendências

  • Expandir o alcance da estratégia:

    • Desenvolver estratégias de negociação de curto prazo

    • Considere a possibilidade de vender

    • Arbitragem multivariada

  • Melhorar a gestão de riscos:

    • Dimensões de posições otimizadas de acordo com a volatilidade e o tamanho do capital

    • Optimizar estratégias de stop loss, como stop loss móvel, stop loss pendente, etc.

    • Introdução de um mecanismo de punição de recompensa de risco

  • Optimizar a lógica de execução:

    • Mudança de hora de entrada

    • Considerar a entrada de algumas posições

    • Otimização da estratégia de stop loss mobile

Resumir

A estratégia foi projetada para um sistema de ruptura mais robusto através da análise de tendências em múltiplos períodos de tempo. Comparado com a filtragem de indicadores como a média móvel simples, ela mostra uma maior taxa de ganho e risco de lucro. Mas também existem alguns aspectos que podem ser otimizados, como mecanismos de gerenciamento de risco imperfeitos, sem considerar fatores fundamentais, etc. Se otimizado ainda mais, pode ser uma estratégia de acompanhamento de tendências muito prática.

Código-fonte da estratégia
/*backtest
start: 2023-10-24 00:00:00
end: 2023-10-26 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

// Revision:        1
// Author:          @millerrh
// Strategy:  Enter long when recent swing high breaks out, using recent swing low as stop level.  Move stops up as higher lows print to act
// as trailing stops.  Ride trend as long as it is there and the higher lows aren't breached.  
// The difference between this one and the previous Breakout Trend Follower is that this one uses higher timeframe higher highs/higher lows as a filter instead 
// of an arbitrary Moving Average.  I wanted to test out whether waiting for longer term actual trend changes produced better stats than just the moving average.
// Conditions/Variables 
//    1. Manually configure which dates to back test
//    2. Can add a filter to only take setups that are above (or below for shorts) user-defined larger timeframe trends (helps avoid trading counter trend) 

// === CALL STRATEGY/STUDY, PROGRAMATICALLY ENTER STRATEGY PARAMETERS HERE SO YOU DON'T HAVE TO CHANGE THEM EVERY TIME YOU RUN A TEST ===
// (STRATEGY ONLY) - Comment out srategy() when in a study() 
strategy("Breakout Trend Follower V2", overlay=true, initial_capital=10000, currency='USD', 
   default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.1)
// (STUDY ONLY) - Comment out study() when in a strategy() 
//study("Breakout Trend Follower V2", overlay=true)

// === BACKTEST RANGE ===
Start = input(defval = timestamp("01 Jan 2019 06:00 +0000"), title = "Backtest Start Date", type = input.time, group = "Backtest Range")
Finish = input(defval = timestamp("01 Jan 2100 00:00 +0000"), title = "Backtest End Date", type = input.time, group = "Backtest Range")

// == USER INPUTS ==
tableLocation = input(defval="Top", options=["Top", "Bottom"], title = "Info Table Location", group = "Display",
  tooltip = "Place information table on the top of the pane or the bottom of the pane.")
lookback = input(defval = 3, title = "Pivot Lookback Period", group = "Pivot Points",
  tooltip = "Looks for pivot points within this number of bars both left and right.")
showPivotPoints = input(title = "Show Historical Pivot Points?", type = input.bool, defval = false, group = "Pivot Points",
  tooltip = "Toggle this on to see the historical pivot points that were used.  Change the Lookback Period to adjust the frequency of these points.
  The pivot points are only shown for the current chart timeframe - to see the Daily pivot pionts, use the Daily timeframe, etc.")
trendFilter = input(defval="1st Timeframe", options=["1st Timeframe", "Both Timeframes", "None"], title = "Use HTF Trend for Filtering?", group = "Higher Timeframe Levels",
  tooltip = "Signals will be ignored when price is not aligned with the higher timeframe trend(s).  The intent is to keep you out of bear periods and only buying when 
  price is showing strength and you are trading with the trend.")
twoSet = input(defval="D", title="1st High Timeframe", type=input.resolution, group = "Higher Timeframe Levels",
  tooltip = "Allows you to set two different time frames for looking at the trend.")
threeSet = input(defval="W", title="2nd High Timeframe", type=input.resolution, group = "Higher Timeframe Levels")
showMTFLevels = input(title = "Show Multiple Timeframe S/R Levels?", type = input.bool, defval = true, group = "Higher Timeframe Levels",
  tooltip = "Displays the pivot highs and lows of higher timeframes to use as support/resistance levels. When these levels break, the trend
  will change on these higher timeframes.")
currentColorS = input(color.new(color.orange,50), title = "Current Timeframe    Support", type = input.color, group = "Higher Timeframe Levels", inline = "MTF1")
currentColorR = input(color.new(color.blue,50), title = " Resistance", type = input.color, group = "Higher Timeframe Levels", inline = "MTF1")
oneColorS = input(color.new(color.yellow,50), title = "1st High Timeframe   Support", type = input.color, group = "Higher Timeframe Levels", inline = "MTF2")
oneColorR = input(color.new(color.yellow,50), title = " Resistance", type = input.color, group = "Higher Timeframe Levels", inline = "MTF2")
twoColorS = input(color.new(color.white,50), title = "2nd High Timeframe    Support", type = input.color, group = "Higher Timeframe Levels", inline = "MTF3")
twoColorR = input(color.new(color.white,50), title = " Resistance", type = input.color, group = "Higher Timeframe Levels", inline = "MTF3")

//  == DEFINE FUNCTIONS FOR USE IN MULTIPLE TIMEFRAMES (USING A TUPLE TO AVOID SO MANY SECURITY CALLS) ==  
f_getHTF() =>
    ph = pivothigh(high, lookback, lookback)
    pl = pivotlow(low, lookback, lookback)
    highLevel = valuewhen(ph, high[lookback], 0)
    lowLevel = valuewhen(pl, low[lookback], 0)
    barsSinceHigh = barssince(ph) + lookback
    barsSinceLow = barssince(pl) + lookback
    timeSinceHigh = time[barsSinceHigh]
    timeSinceLow = time[barsSinceLow]
    [ph, pl, highLevel, lowLevel, barsSinceHigh, barsSinceLow, timeSinceHigh, timeSinceLow]
    
[ph_01, pl_01, hL_01, lL_01, bsSH_01, bsSL_01, tSH_01, tSL_01] = security(syminfo.tickerid, "", f_getHTF())
[ph_02, pl_02, hL_02, lL_02, bsSH_02, bsSL_02, tSH_02, tSL_02] = security(syminfo.tickerid, twoSet, f_getHTF())
[ph_03, pl_03, hL_03, lL_03, bsSH_03, bsSL_03, tSH_03, tSL_03] = security(syminfo.tickerid, threeSet, f_getHTF())

// Plot historical pivot points for debugging and configuring the lookback period.
plot(showPivotPoints ? ph_01 : na, style=plot.style_cross, linewidth=3, color=color.new(color.yellow,50), offset=-lookback)
plot(showPivotPoints ? pl_01 : na, style=plot.style_cross, linewidth=3, color=color.new(color.yellow,50), offset=-lookback)

// == PLOT SUPPORT/RESISTANCE LINES ON THE HIGHER TIMEFRAMES ==
// Use a function to define the lines
f_line(x1, y1, y2, _color) =>
    var line id = na
    // line.delete(id)
    // id := line.new(x1, y1, time, y2, xloc.bar_time, extend.right, _color)

// 1st Timeframe
highLine1 = showMTFLevels ? f_line(tSH_01, hL_01, hL_01, currentColorR) : na
lowLine1 = showMTFLevels ? f_line(tSL_01, lL_01, lL_01, currentColorS) : na 
// 2nd Timeframe
highLine2 = showMTFLevels ? f_line(tSH_02, hL_02, hL_02, oneColorR) : na
lowLine2 = showMTFLevels ? f_line(tSL_02, lL_02, lL_02, oneColorS) : na
// 3rd Timeframe
highLine3 = showMTFLevels ? f_line(tSH_03, hL_03, hL_03, twoColorR) : na
lowLine3 = showMTFLevels ? f_line(tSL_03, lL_03, lL_03, twoColorS) : na

// == TREND CALCULATIONS (USING A TUPLE TO CONSOLIDATE REPETATIVE CODE AND GENERATE MULTIPE VARIABLES WITH ONE FUNCTION ==
f_signal(highLevel, lowLevel) =>
    uptrendSignal    = high > highLevel
    downtrendSignal  = low < lowLevel
    inUptrend        = bool(na)
    inDowntrend      = bool(na) 
    inUptrend       := uptrendSignal[1] ? true : downtrendSignal[1] ? false : inUptrend[1]
    inDowntrend     := not inUptrend
    [uptrendSignal, downtrendSignal, inUptrend, inDowntrend]

[uptrendSignal1, downtrendSignal1, inUptrend1, inDowntrend1] = f_signal(hL_01, lL_01)  // 1st Timeframe
[uptrendSignal2, downtrendSignal2, inUptrend2, inDowntrend2] = f_signal(hL_02, lL_02)  // 2nd Timeframe
[uptrendSignal3, downtrendSignal3, inUptrend3, inDowntrend3] = f_signal(hL_03, lL_03)  // 3rd Timeframe

// == TREND TABLE PLOTTING ==
tablePos = tableLocation == "Top" ? position.top_right : position.bottom_right
var table trendTable = table.new(tablePos, 3, 1, border_width = 3)
upColor = color.rgb(38, 166, 154)
downColor = color.rgb(240, 83, 80)

f_fillCell(_column, _row, _cellText, _c_color) =>
    table.cell(trendTable, _column, _row, _cellText, bgcolor = color.new(_c_color, 70), text_color = _c_color, width = 6)

if barstate.islast or barstate.islastconfirmedhistory
    f_fillCell(0, 0, inUptrend1 ? "▲" : "▼", inUptrend1 ? upColor : downColor)
    f_fillCell(1, 0, inUptrend2 ? "▲ " + twoSet : "▼ " + twoSet, inUptrend2 ? upColor : downColor)
    f_fillCell(2, 0, inUptrend3 ? "▲ " + threeSet : "▼ " + threeSet, inUptrend3 ? upColor : downColor)

// Conditions for entry and exit
buyConditions =  true
buySignal = high > hL_01 and buyConditions // Code to act like a stop-buy for the Study
sellSignal = low < lL_01 // Code to act like a stop-loss for the Study

// (STRATEGY ONLY) Comment out for Study
strategy.entry("Long", strategy.long, stop = hL_01, when = buyConditions)
// strategy.entry("Long", strategy.long, stop = buyLevel2, when = time > Start and time < Finish and high > maFilterCheck)
strategy.exit("Exit Long", from_entry = "Long", stop=lL_01)