Tendência de seguir uma estratégia baseada no crossover TEMA de vários prazos

Autora:ChaoZhang, Data: 2023-12-25 14:20:36
Tags:

img

Resumo

Esta estratégia identifica a direção da tendência do mercado com base no cruzamento do indicador TEMA em vários prazos e usa o cruzamento do TEMA em prazos menores para encontrar pontos de entrada e saída específicos.

Estratégia lógica

A estratégia emprega dois indicadores TEMA, um com linha rápida e lenta baseada em períodos de 5 e 15, o outro baseado em um período de tempo mais longo definido pelo usuário, como diário ou semanal.

Quando a linha rápida TEMA de prazo superior cruza acima da linha lenta, uma entrada longa pode ser acionada quando a linha rápida TEMA de prazo inferior cruza acima da linha lenta; Um sinal de saída é dado quando a linha rápida cruza abaixo da linha lenta.

Vantagens

  1. Baseado no crossover TEMA, evita interferências de ruído
  2. O projeto multi-tempo combina ciclos altos e baixos, melhorando a precisão
  3. Configuração flexível apenas para longo, curto ou para ambas as direcções
  4. Regras simples, fáceis de compreender e de aplicar

Análise de riscos

  1. TEMA tem efeito de atraso, pode perder a mudança inicial de preço
  2. As correcções de curto prazo em relação a TF mais elevadas podem causar negociações reversíveis desnecessárias
  3. A definição incorreta de uma TF superior não reflete a tendência real
  4. A definição inadequada do TF inferior aumenta o risco de perda de paragem

Soluções de riscos:

  1. Parâmetros TEMA de ajuste fino para o equilíbrio
  2. Relaxar moderadamente a margem de stop loss
  3. Otimize as configurações de ciclo alto e baixo
  4. Robustez dos parâmetros de ensaio entre produtos

Oportunidades de melhoria

  1. Ajustar dinamicamente os parâmetros TEMA para otimização da sensibilidade
  2. Adicionar filtro de impulso para evitar tendências perdidas
  3. Adicionar índice de volatilidade para dimensionamento dinâmico do stop loss
  4. Aprendizagem de máquina para otimização de parâmetros

Resumo

A estratégia geral é simples e clara em lógica, identificando o viés da tendência através do crossover TEMA em vários prazos e contando com crossover adicional em entradas de tempo mais baixas do TF.


/*backtest
start: 2023-01-01 00:00:00
end: 2023-12-24 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/
// © Seltzer_

//@version=4
strategy(title="TEMA Cross +HTF Backtest", shorttitle="TEMA_X_+HTF_BT", overlay=true)

orderType = input("Longs+Shorts",title="What type of Orders", options=["Longs+Shorts","LongsOnly","ShortsOnly"])
isLong   = (orderType != "ShortsOnly")
isShort  = (orderType != "LongsOnly")

// Backtest Section {

// Backtest inputs
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=2010)
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)

// Define backtest timewindow
start = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish = timestamp(ToYear, ToMonth, ToDay, 23, 59)  // backtest finish window
window() => true

// }

//TEMA Section {

//LTF Section
xLength = input(20, minval=1, title="Fast Length")
xPrice = close
xEMA1 = ema(xPrice, xLength)
xEMA2 = ema(xEMA1, xLength)
xEMA3 = ema(xEMA2, xLength)
xnRes = (3 * xEMA1) - (3 * xEMA2) + xEMA3
xnResP = plot(xnRes, color=color.green, linewidth=2, title="TEMA1")

yLength = input(60, minval=1, title="Slow Length")
yPrice = close
yEMA1 = ema(yPrice, yLength)
yEMA2 = ema(yEMA1, yLength)
yEMA3 = ema(yEMA2, yLength)
ynRes = (3 * yEMA1) - (3 * yEMA2) + yEMA3
ynResP = plot(ynRes, color=color.red, linewidth=2, title="TEMA2")

fill(xnResP, ynResP, color=xnRes > ynRes ? color.green : color.red, transp=65, editable=true)

//HTF Section
HTFres = input(defval="D", type=input.resolution, title="HTF Resolution")

HTFxLength = input(5, minval=1, title="HTF Fast Length")
HTFxPrice = close
HTFxEMA1 = security(syminfo.tickerid, HTFres, ema(HTFxPrice, HTFxLength), barmerge.gaps_off, barmerge.lookahead_on)
HTFxEMA2 = security(syminfo.tickerid, HTFres, ema(HTFxEMA1, HTFxLength), barmerge.gaps_off, barmerge.lookahead_on)
HTFxEMA3 = security(syminfo.tickerid, HTFres, ema(HTFxEMA2, HTFxLength), barmerge.gaps_off, barmerge.lookahead_on)
HTFxnRes = (3 * HTFxEMA1) - (3 * HTFxEMA2) + HTFxEMA3
HTFxnResP = plot(HTFxnRes, color=color.yellow, linewidth=1,transp=30, title="TEMA1")

HTFyLength = input(15, minval=1, title="HTF Slow Length")
HTFyPrice = close
HTFyEMA1 = security(syminfo.tickerid, HTFres, ema(HTFyPrice, HTFyLength), barmerge.gaps_off, barmerge.lookahead_on)
HTFyEMA2 = security(syminfo.tickerid, HTFres, ema(HTFyEMA1, HTFyLength), barmerge.gaps_off, barmerge.lookahead_on)
HTFyEMA3 = security(syminfo.tickerid, HTFres, ema(HTFyEMA2, HTFyLength), barmerge.gaps_off, barmerge.lookahead_on)
HTFynRes = (3 * HTFyEMA1) - (3 * HTFyEMA2) + HTFyEMA3
HTFynResP = plot(HTFynRes, color=color.purple, linewidth=1, transp=30, title="TEMA2")

fill(HTFxnResP, HTFynResP, color=HTFxnRes > HTFynRes ? color.yellow : color.purple, transp=90, editable=true)
bgcolor(HTFxnRes > HTFynRes ? color.yellow : na, transp=90, editable=true)
bgcolor(HTFxnRes < HTFynRes ? color.purple : na, transp=90, editable=true)

// }

// Buy and Sell Triggers
LongEntryAlert = xnRes > ynRes and HTFxnRes > HTFynRes and window()
LongCloseAlert = xnRes < ynRes and window()
ShortEntryAlert = xnRes < ynRes and HTFxnRes < HTFynRes and window()
ShortCloseAlert = xnRes > ynRes

// Entry & Exit signals
if isLong
    strategy.entry("Long", strategy.long, when = LongEntryAlert)
    strategy.close("Long", when = LongCloseAlert)

if isShort
    strategy.entry("Short", strategy.short, when = ShortEntryAlert)
    strategy.close("Short", when = ShortCloseAlert)

Mais.