EMA Tracking Trend Suppressing Oscillation Strategy (Estratégia de acompanhamento da tendência da EMA para suprimir oscilações)

Autora:ChaoZhang, Data: 2023-12-12 15:52:37
Tags:

img

Resumo

Esta estratégia combina as vantagens de três indicadores: EMA, Trend Tracking Strategy (TTS) e Schaff Trend Cycle (STC) para formar uma forte estratégia de rastreamento de tendências de curto prazo. Especificamente, a estratégia julgará se os sinais de compra e venda dos três indicadores são consistentes.

Princípio da estratégia

A estratégia consiste em três partes principais: indicador EMA, estratégia de acompanhamento de tendências TTS e indicador STC.

Em primeiro lugar, é calculada a linha da média móvel exponencial EMA de 200 períodos.

Em segundo lugar, são calculados os parâmetros relevantes da estratégia de rastreamento de tendências TTS. De acordo com as rupturas de preços dos trilhos superior e inferior, a direção da tendência do mercado é determinada. Se o preço atravessar o trilho superior, um sinal de compra 1 é gerado; se o preço atravessar o trilho inferior, um sinal de venda -1 é gerado.

Por último, é calculado o indicador do Ciclo de Tendência de Schaff (STC), que reflete a tendência de mudança da consolidação de preços.

Depois de obter os sinais de julgamento dos três indicadores, a estratégia determinará se eles são consistentes. Somente quando todos os três sinais de julgamento do indicador forem consistentes, os sinais de negociação reais serão gerados. Isso pode efetivamente filtrar alguns sinais falsos e tornar a estratégia mais confiável.

Uma vez determinado o objetivo de gerar sinais de negociação, serão abertas posições longas ou curtas e fixados pontos de stop-profit/stop-loss.

Vantagens

  1. A estratégia combina três tipos diferentes de indicadores para determinar eficazmente a direcção da tendência do mercado.

  2. Usar a consistência dos sinais de julgamento de três indicadores para filtrar sinais falsos pode reduzir as negociações desnecessárias e tornar a estratégia mais confiável.

  3. A fixação de pontos razoáveis de stop-profit/stop-loss pode bloquear os lucros e evitar que as perdas se expandam.

  4. Os parâmetros otimizados são adequados para a maioria das ações e produtos forex.

  5. Lógica de negociação simples e fácil de entender.

Riscos

  1. A incoerência entre os juízos dos indicadores pode causar a perda de oportunidades de negociação.

  2. O indicador STC é sensível aos parâmetros.

  3. Em tendências de baixa, o stop loss pode ser penetrado, causando perdas enormes.

  4. As consolidações laterais não podem ser identificadas de forma eficaz, o que leva a posições de armadilha.

Melhorias

  1. Teste mais combinações de indicadores para encontrar regras de julgamento mais fortes, por exemplo, adicionando um indicador RSI.

  2. Optimizar parâmetros STC para melhor adaptação entre diferentes produtos.

  3. Aumentar o módulo de stop loss adaptativo para otimizar os pontos de stop loss dinamicamente.

  4. Melhorar o módulo de fechamento de posição para identificar distâncias laterais e evitar armadilhas.

  5. Otimizar algoritmos para negociação de alta frequência, reduzindo a latência e melhorando as taxas de execução de ordens.

Conclusão

A estratégia combina indicadores EMA, TTS e STC para determinar a direção do mercado, com julgamentos consistentes de todas as três negociações desencadeantes, filtrando efetivamente os falsos sinais. Ainda há um grande espaço para otimizações, por exemplo, testando mais combinações de indicadores, adicionando algoritmos adaptativos, otimizando módulos de negociação de alta frequência, etc., para fortalecer ainda mais a capacidade de rastreamento de tendências.


/*backtest
start: 2022-12-05 00:00:00
end: 2023-04-14 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/
// © ajahanbin1374

//@version=5
strategy(title = "EMA + TTS + STC", shorttitle = "EMA + TTS + STC", overlay = true, calc_on_order_fills=false, calc_on_every_tick = false, initial_capital = 100, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, commission_value = 0.01)

////////////////////////////////////////////////////////////
// Strategy entry
////////////////////////////////////////////////////////////
profit = input.float(defval = 0.1, minval = 0.0, title="Profit %", step=0.01, group = "Strategy") * 0.01

////////////////////////////////////////////////////////////
// Emponential Moving Average
////////////////////////////////////////////////////////////
ema = ta.ema(close, 200)
posEma = close < ema ? -1 : 1

////////////////////////////////////////////////////////////
// Trend Trader Strategy
////////////////////////////////////////////////////////////
Length = input.int(21, minval=1, group="Trend Trader Strategy")
Multiplier = input.float(3, minval=0.000001, group="Trend Trader Strategy")
avgTR = ta.wma(ta.atr(1), Length)
highestC = ta.highest(Length)
lowestC = ta.lowest(Length)
hiLimit = highestC[1] - avgTR[1] * Multiplier
loLimit = lowestC[1] + avgTR[1] * Multiplier
ret = 0.0
posTts = 0.0
ret:= close > hiLimit and close > loLimit ? hiLimit :
         close < loLimit and close < hiLimit ? loLimit : nz(ret[1], close)
posTts:=  close > ret ? 1 :close < ret ? -1 : nz(posTts[1], 0)


////////////////////////////////////////////////////////////
// Schaff Trend Cycle (STC)
////////////////////////////////////////////////////////////
EEEEEE = input.int(12, 'Length', group ="Schaff Trend Cycle")
BBBB = input.int(26, 'FastLength', group ="Schaff Trend Cycle")
BBBBB = input.int(50, 'SlowLength', group ="Schaff Trend Cycle")

AAAA(BBB, BBBB, BBBBB) =>
    fastMA = ta.ema(BBB, BBBB)
    slowMA = ta.ema(BBB, BBBBB)
    AAAA = fastMA - slowMA
    AAAA

AAAAA(EEEEEE, BBBB, BBBBB) =>
    AAA = input.float(0.5, group ="Schaff Trend Cycle")
    var CCCCC = 0.0
    var DDD = 0.0
    var DDDDDD = 0.0
    var EEEEE = 0.0
    BBBBBB = AAAA(close, BBBB, BBBBB)
    CCC = ta.lowest(BBBBBB, EEEEEE)
    CCCC = ta.highest(BBBBBB, EEEEEE) - CCC
    CCCCC := CCCC > 0 ? (BBBBBB - CCC) / CCCC * 100 : nz(CCCCC[1])
    DDD := na(DDD[1]) ? CCCCC : DDD[1] + AAA * (CCCCC - DDD[1])
    DDDD = ta.lowest(DDD, EEEEEE)
    DDDDD = ta.highest(DDD, EEEEEE) - DDDD
    DDDDDD := DDDDD > 0 ? (DDD - DDDD) / DDDDD * 100 : nz(DDDDDD[1])
    EEEEE := na(EEEEE[1]) ? DDDDDD : EEEEE[1] + AAA * (DDDDDD - EEEEE[1])
    EEEEE

mAAAAA = AAAAA(EEEEEE, BBBB, BBBBB)
mColor = mAAAAA > mAAAAA[1] ? color.new(color.green, 20) : color.new(color.red, 20)
posStc = mAAAAA > mAAAAA[1] ? 1 : -1

////////////////////////////////////////////////////////////
// Strategy entry
////////////////////////////////////////////////////////////
pos = posEma == 1 and posTts == 1 and posStc == 1 ? 1 : posEma == -1 and posTts == -1 and posStc == -1 ? -1 : 0

currentPostition = strategy.position_size > 0 ? 1 : strategy.position_size < 0 ? -1 : 0
noOpenPosition = strategy.position_size == 0

signal = pos != pos[1] and pos == 1 and noOpenPosition ? 1 : pos != pos[1] and pos == -1 and noOpenPosition ? -1 : 0

stopPriceForLong = math.min(close * (1 - profit), low[1] * 0.9998, low[2] * 0.9998)
limitPriceForLong = close + (close - stopPriceForLong)
stopPriceForShort = math.max(close * (1 + profit), high[1] * 1.0002, high[2] * 1.0002)
limitPriceForShort = close - (stopPriceForShort - close)

if signal == 1
    strategy.entry(id="L", direction=strategy.long)
    strategy.exit(id='EL', from_entry='L', limit=limitPriceForLong, stop=stopPriceForLong)
if signal == -1
    strategy.entry(id="S", direction=strategy.short)
    strategy.exit(id='ES', from_entry='S', limit=limitPriceForShort, stop=stopPriceForShort)

////////////////////////////////////////////////////////////
// Plots - Debuger
////////////////////////////////////////////////////////////
plotchar(signal, title='singal', char = '')
plotchar(posEma, title='posEma', char = '')
plotchar(posTts, title='posTts', char = '')
plotchar(pos, title='pos', char = '')
plotchar(currentPostition, title = 'currentPostition', char='')
plotchar(stopPriceForLong, title = "stopPriceForLong", char ='')
plotchar(limitPriceForLong, title = 'limitPriceForLong', char='')
plotchar(stopPriceForShort, title = "stopPriceForShort", char ='')
plotchar(limitPriceForShort, title = 'limitPriceForShort', char='')

////////////////////////////////////////////////////////////
// Plots
////////////////////////////////////////////////////////////
plot(ret, color=color.new(color.black, 0), title='Trend Trader Strategy')
plotchar(mAAAAA, color=mColor, title='STC', location = location.bottom, char='-', size=size.normal)
plot(series = ema, title = "ema")


Mais.