Estratégia de reversão múltipla com base na média da tendência


Data de criação: 2023-11-21 14:53:48 última modificação: 2023-11-21 14:53:48
cópia: 0 Cliques: 604
1
focar em
1621
Seguidores

Estratégia de reversão múltipla com base na média da tendência

Visão geral

A estratégia calcula vários indicadores de tendência e executa operações de compra e venda quando ocorrem reversões. Os principais indicadores de tendência são TDI, TCF, TTF e TII. A estratégia escolhe em sua configuração qual indicador usar para gerar um sinal de negociação.

Princípio da estratégia

  • ### Indicadores de TDI

O indicador TDI é baseado na mudança de momentum do preço. É construído através de técnicas de soma e suavização. Quando o indicador de direção TDI cruza a curva TDI, faz mais e limpa a posição.

  • ### Indicador TCF

O indicador TCF calcula as variações positivas e negativas do preço para avaliar a força de uma posição a mais e a menos. Se a força da variação positiva for maior do que a força da variação negativa, então a posição é liquidada.

  • ### Índice TTF

O indicador TTF julga a tendência através da comparação da força dos pontos altos e baixos. O sinal de fazer mais é o indicador TTF passar de 100, ao contrário, o liquidar.

  • ### Indicadores TII

O indicador TII combina a linha média e o intervalo de preços para determinar a reversão de tendência. Ele considera simultaneamente as tendências de curto e longo prazo. Fazer mais sinais é o indicador TII com uma passagem de 80, e limpar a posição é uma passagem de 80 .

Entrando na lógica de fazer várias posições de paz, escolha o sinal de negociação apropriado de acordo com os indicadores da configuração.

Vantagens estratégicas

A estratégia combina vários indicadores de negociação de tendências comumente usados, permitindo a flexibilidade de adaptação ao ambiente de mercado. As vantagens específicas são:

  1. A utilização de sinais de reversão de tendência permite capturar oportunidades de mudança de tendência em tempo hábil
  2. Configuração de diferentes indicadores para otimização específica
  3. Uma rica combinação de indicadores que podem ser usados em combinação para confirmar sinais

Risco estratégico

A estratégia tem como principais riscos:

  1. Os sinais de negociação gerados pelos indicadores de tendência podem ser mal informados e causar prejuízos
  2. Indicadores individuais não são capazes de determinar a tendência e são vulneráveis ao ruído do mercado
  3. Parâmetros de indicadores e parâmetros de negociação mal configurados podem distorcer o mercado e gerar negociações erradas

As seguintes medidas podem ser tomadas para reduzir o risco:

  1. Optimizar os parâmetros do indicador para encontrar a melhor combinação de parâmetros
  2. Combinação de vários sinais de indicadores para a negociação, melhorar a qualidade do sinal
  3. Ajustar estratégias de gestão de posições para controlar perdas individuais

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

A estratégia pode ser melhorada em vários aspectos:

  1. Testar combinações ótimas de indicadores e parâmetros em diferentes ciclos de mercado
  2. Adicionar ou remover indicadores para encontrar o melhor conjunto de indicadores
  3. Filtração de sinais de transação para eliminar sinais de falsidade
  4. Optimizar estratégias de gestão de posições, como posições variáveis, rastreamento de stop loss, etc.
  5. Aumentar os indicadores de pontuação de aprendizagem de máquina para auxiliar na avaliação da qualidade do sinal

Resumir

A estratégia combina os benefícios de vários indicadores de reversão de tendência, sendo otimizada por meio da configuração de indicadores e parâmetros, que podem ser adaptados a diferentes condições de mercado, operando em pontos de reversão de tendência. A chave é encontrar a combinação ideal de parâmetros e indicadores, controlando o risco.

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

//@version=4
//
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © kruskakli
//
// Here is a collection of Trend Indicators as defined by M.H Pee and presented
// in various articles of the "STOCKS & COMMODITIES Magazine"
//
// The actual implementation of the indicators here are made by: everget
//
// I have gather them here so that they easily can be tested.
//
// My own test was made using 15 companies from the OMXS30 list
// during the time period of 2016-2018, and I only went LONG.
//
// The result was as follows:
//
//        Average    Std.Dev
//        profit
//  TDI    3.04%      5.97
//  TTF    1.22%.     5.73
//  TII    1.07%      6.2
//  TCF    0.32%      2.68
//
strategy("M.H Pee indicators", overlay=true)


use = input(defval="TDI", title="Use Indicator", type=input.string,
             options=["TDI","TCF","TTF","TII"])

src = close


//
// TDI
//
length = input(title="Length", type=input.integer, defval=20)
mom = change(close, length)
tdi = abs(sum(mom, length)) - sum(abs(mom), length * 2) + sum(abs(mom), length)
// Direction Indicator
tdiDirection = sum(mom, length)
tdiLong = crossover(tdiDirection, tdi)
tdiXLong = crossunder(tdiDirection, tdi)

//
// TCF
//
tcflength = input(title="Length", type=input.integer, defval=35)

plusChange(src) =>
    change_1 = change(src)
    change(src) > 0 ? change_1 : 0.0
minusChange(src) =>
    change_1 = change(src)
    change(src) > 0 ? 0.0 : -change_1

plusCF = 0.0
plusChange__1 = plusChange(src)
plusCF := plusChange(src) == 0 ? 0.0 : plusChange__1 + nz(plusCF[1])

minusCF = 0.0
minusChange__1 = minusChange(src)
minusCF := minusChange(src) == 0 ? 0.0 : minusChange__1 + nz(minusCF[1])

plusTCF = sum(plusChange(src) - minusCF, tcflength)
minusTCF = sum(minusChange(src) - plusCF, tcflength)

tcfLong = plusTCF > 0 
tcfXLong = plusTCF < 0

//
// TTF
//
ttflength = input(title="Lookback Length", type=input.integer, defval=15)

hh = highest(length)
ll = lowest(length)

buyPower = hh - nz(ll[length])
sellPower = nz(hh[length]) - ll

ttf = 200 * (buyPower - sellPower) / (buyPower + sellPower)

ttfLong = crossover(ttf, 100)
ttfXLong = crossunder(ttf, -100)

//
// TII
//
majorLength = input(title="Major Length", type=input.integer, defval=60)
minorLength = input(title="Minor Length", type=input.integer, defval=30)
upperLevel = input(title="Upper Level", type=input.integer, defval=80)
lowerLevel = input(title="Lower Level", type=input.integer, defval=20)

sma = sma(src, majorLength)

positiveSum = 0.0
negativeSum = 0.0

for i = 0 to minorLength - 1 by 1
    price = nz(src[i])
    avg = nz(sma[i])
    positiveSum := positiveSum + (price > avg ? price - avg : 0)
    negativeSum := negativeSum + (price > avg ? 0 : avg - price)
    negativeSum

tii = 100 * positiveSum / (positiveSum + negativeSum)

tiiLong = crossover(tii, 80)
tiiXLong = crossunder(tii,80)

//
// LOGIC 
//
enterLong = (use == "TDI" and tdiLong) or (use == "TCF" and tcfLong) or (use == "TTF" and ttfLong) or (use == "TII" and tiiLong)
exitLong = (use == "TDI" and tdiXLong) or (use == "TCF" and tcfXLong) or (use == "TTF" and ttfXLong) or (use == "TII" and tiiXLong)


// Time range for Back Testing
btStartYear  = input(title="Back Testing Start Year",  type=input.integer, defval=2016)
btStartMonth = input(title="Back Testing Start Month", type=input.integer, defval=1)
btStartDay   = input(title="Back Testing Start Day",   type=input.integer, defval=1)
startTime = timestamp(btStartYear, btStartMonth, btStartDay, 0, 0)

btStopYear  = input(title="Back Testing Stop Year",  type=input.integer, defval=2028)
btStopMonth = input(title="Back Testing Stop Month", type=input.integer, defval=12)
btStopDay   = input(title="Back Testing Stop Day",   type=input.integer, defval=31)
stopTime  = timestamp(btStopYear, btStopMonth, btStopDay, 0, 0)

window() => time >= startTime and time <= stopTime ? true : false


riskPerc     = input(title="Max Position  %", type=input.float, defval=20, step=0.5)
maxLossPerc  = input(title="Max Loss Risk %", type=input.float, defval=5, step=0.25)

// Average True Range (ATR) measures market volatility.
// We use it for calculating position sizes.
atrLen   = input(title="ATR Length", type=input.integer, defval=14)
stopOffset = input(title="Stop Offset", type=input.float, defval=1.5, step=0.25)
limitOffset = input(title="Limit Offset", type=input.float, defval=1.0, step=0.25)
atrValue = atr(atrLen)


// Calculate position size
maxPos = floor((strategy.equity * (riskPerc/100)) / src)
// The position sizing algorithm is based on two parts:
// a certain percentage of the strategy's equity and
// the ATR in currency value.
riskEquity  = (riskPerc / 100) * strategy.equity
// Translate the ATR into the instrument's currency value.
atrCurrency = (atrValue * syminfo.pointvalue)
posSize0    = min(floor(riskEquity / atrCurrency), maxPos)
posSize     = posSize0 < 1 ? 1 : posSize0

if (window())
    strategy.entry("Long", long=true, qty=posSize0, when=enterLong)
    strategy.close_all(when=exitLong)