O núcleo desta estratégia baseia-se no indicador desenvolvido no artigo
A estratégia primeiro calcula a média móvel ponderada de 21 dias da faixa média verdadeira (ATR) como faixa de volatilidade da linha de base. Em seguida, calcula os preços mais altos e mais baixos nos últimos 21 dias. Comparando o preço de fechamento atual com os limites superior e inferior da faixa de base, ele julga se o preço rompe o canal para determinar a direção da tendência.
Especificamente, o limite superior do canal é definido como o preço mais alto nos últimos 21 dias menos 3 vezes o ATR da linha de base, e o limite inferior do canal é o preço mais baixo nos últimos 21 dias mais 3 vezes o ATR da linha de base.
Ao mesmo tempo em que determina a direção da tendência, esta estratégia também introduz o indicador MACD para filtragem.
Esta estratégia combina a determinação de tendências e a filtragem de indicadores, o que permite identificar eficazmente a direcção da tendência do mercado a médio e longo prazos, sem ser induzido em erro pelas flutuações a curto prazo.
A estratégia apresenta também alguns riscos, principalmente nos seguintes aspectos:
Estes riscos podem ser reduzidos através da otimização dos parâmetros, do dimensionamento rigoroso das posições e da suspensão oportuna das perdas.
A estratégia pode ser otimizada nos seguintes aspectos principais:
Teste diferentes combinações de comprimento ou multiplicador para encontrar a combinação de parâmetros que produz o maior retorno com base no backtest.
Teste que incorpore RSI, KDJ e outros indicadores para filtrar os sinais e melhorar a rentabilidade.
Adaptar os parâmetros de forma dinâmica com base nas condições do mercado, tais como alargar adequadamente a gama de canais quando a tendência for forte ou restringir a gama quando o mercado estiver mais limitado à gama.
Em resumo, esta é uma estratégia geral de tendência robusta. Combinando a determinação da tendência do canal de preços e a filtragem MACD, ele pode identificar efetivamente tendências de médio e longo prazo e gerar retornos constantes. Com otimização de parâmetros, gerenciamento de risco e ajustes apropriados, essa estratégia pode se tornar parte integrante de um sistema de negociação.
/*backtest start: 2023-01-26 00:00:00 end: 2024-02-01 00:00:00 period: 1d basePeriod: 1h 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/ // © melihtuna //@version=1 strategy("Trend Trader Strategy with MACD", overlay=true) // === Trend Trader Strategy === Length = input(21), Multiplier = input(3, minval=1) MacdControl = input(true, title="Control 'MACD Histogram is positive?' when Buy condition") avgTR = wma(atr(1), Length) highestC = highest(Length) lowestC = lowest(Length) hiLimit = highestC[1]-(avgTR[1] * Multiplier) loLimit = lowestC[1]+(avgTR[1] * Multiplier) ret = iff(close > hiLimit and close > loLimit, hiLimit, iff(close < loLimit and close < hiLimit, loLimit, nz(ret[1], 0))) pos = iff(close > ret, 1, iff(close < ret, -1, nz(pos[1], 0))) barcolor(pos == -1 ? red: pos == 1 ? green : blue ) plot(ret, color= blue , title="Trend Trader Strategy with MACD") // === INPUT BACKTEST RANGE === FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12) FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31) FromYear = input(defval = 2020, title = "From Year", minval = 2017) ToMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12) ToDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31) ToYear = input(defval = 9999, title = "To Year", minval = 2017) // === FUNCTION EXAMPLE === start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) // backtest finish window window() => true // === MACD === [macdLine, signalLine, histLine] = macd(close, 12, 26, 9) macdCond= MacdControl ? histLine[0] > 0 ? true : false : true strategy.entry("BUY", strategy.long, when = window() and pos == 1 and macdCond) strategy.entry("SELL", strategy.short, when = window() and pos == -1)