Estratégia de monitoramento de tendências de curto prazo e supressão de choques


Data de criação: 2023-12-12 15:52:37 última modificação: 2023-12-12 15:52:37
cópia: 1 Cliques: 657
1
focar em
1621
Seguidores

Estratégia de monitoramento de tendências de curto prazo e supressão de choques

Visão geral

A estratégia combina os indicadores EMA, a estratégia de acompanhamento de tendências TTS e a estratégia de acompanhamento de tendências STC, formando uma estratégia de acompanhamento de tendências de linha curta mais forte. Concretamente, a estratégia julga simultaneamente se os três indicadores são consistentes. Se for consistente, produzirá um sinal de negociação; se não for consistente, não será vendido. Isso pode filtrar alguns sinais falsos, tornando a estratégia mais confiável.

Princípio da estratégia

A estratégia é composta por três partes principais: o EMA Smoothing Indicator, a estratégia de acompanhamento de tendências TTS e o indicador de ciclo de tendências STC Shuffle.

Em primeiro lugar, calcula-se a média móvel do índice EMA de 200 ciclos para determinar se o preço está abaixo ou acima da linha EMA. Se o preço estiver abaixo da linha, o indicador EMA dará um sinal de cabeça vazia;-1; Se o preço estiver acima da linha, o indicador EMA dará um sinal de cabeça múltipla:

Em segundo lugar, calcule os parâmetros relevantes para a estratégia de acompanhamento de tendências TTS, para determinar a direção da tendência de mercado com base na ruptura do preço para cima e para baixo. Se o preço se rompe para cima, gera um sinal de múltiplas cabeças; se o preço se rompe para baixo, gera um sinal de cabeças -1.

Finalmente, calcule o STC do ciclo de tendência de Shuffle, que reflete a tendência de mudança no centro de preço. Se o STC sobe, produz um sinal de múltiplo cabeçalho 1; se o STC cai, produz um sinal de cabeçalho -1.

Depois de receber os três sinais de julgamento dos indicadores, a estratégia julga se eles estão de acordo. Somente quando os três sinais de julgamento dos indicadores estão de acordo, é produzido um sinal de negociação real. Isso pode filtrar efetivamente alguns sinais falsos, tornando a estratégia mais confiável.

Se for confirmado que um sinal de negociação foi gerado, uma ordem de fazer mais ou fazer menos será feita e um ponto de parada será estabelecido.

Vantagens estratégicas

  1. A estratégia utiliza três tipos diferentes de indicadores para determinar a direção das tendências do mercado.

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

  3. Estabeleça um ponto de parada razoável para bloquear o lucro e evitar a expansão dos prejuízos.

  4. Os parâmetros selecionados foram otimizados para a maioria das ações e variedades de divisas.

  5. A lógica de transação é clara e concisa, fácil de entender e modificar.

Risco estratégico

  1. Quando há discordância entre os três indicadores de julgamento, dimers aparecem e é fácil perder oportunidades de negociação. Pode-se considerar a otimização da regra de julgamento.

  2. Os indicadores STC são mais sensíveis aos parâmetros, e diferentes variedades precisam ajustar os parâmetros.

  3. Em um cenário de recessão, o stop loss pode ser ultrapassado, causando grandes perdas. Pode-se considerar o stop loss de otimização em tempo real.

  4. A falta de um juízo efetivo sobre o que está acontecendo pode levar à prisão domiciliar.

Otimização de Estratégia

  1. É possível testar mais combinações de indicadores para encontrar regras de julgamento mais fortes. Por exemplo, adicionar o indicador RSI.

  2. Optimizar os parâmetros dos indicadores STC para que sejam mais adequados para diferentes variedades. Adicionar o módulo de otimização de parâmetros de adaptação.

  3. A adição de um módulo de stop loss adaptável, que pode ser otimizado em tempo real para definir o ponto de parada de acordo com a situação.

  4. Reforçar o módulo de equilíbrio, para determinar se a caixa lateral está sendo ordenada, evitando o confinamento.

  5. Otimizar o algoritmo para transações de alta frequência, reduzir a latência do sistema e aumentar a taxa de sucesso do comitê.

Resumir

A estratégia utiliza três indicadores, EMA, TTS e STC, para determinar a direção da tendência. A regra de julgamento é definida para gerar um sinal de negociação quando os três estão de acordo, para filtrar de forma eficaz os falsos sinais. A estratégia ainda tem muito espaço para otimização, testando mais combinações de indicadores, adicionando algoritmos de adaptação e otimizando o módulo de negociação de alta frequência.

Código-fonte da estratégia
/*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")