Uma estratégia de otimização de tendências baseada no gráfico de nuvens de Ichimoku

Autora:ChaoZhang, Data: 2024-01-19 14:45:21
Tags:

img

Resumo

Esta estratégia combina o gráfico de nuvens Ichimoku com vários indicadores auxiliares para rastrear as tendências.

Princípios

Esta estratégia utiliza principalmente a transformação da nuvem de Ichimoku para julgar a direção da tendência. Ele vai longo quando o Tenkan-sen cruza acima da nuvem e vai curto quando o Tenkan-sen cruza abaixo. Enquanto isso, ele usa Chikou Span, histograma MACD, CMF e TSI para filtragem de várias camadas para garantir a qualidade do sinal.

Especificamente, o sinal longo é acionado quando:

  1. Tenkan-sen atravessa acima da nuvem
  2. A nuvem é grande e Tenkan-sen está acima de Kijun-sen.
  3. Chikou Span está acima da linha zero.
  4. O preço de fechamento está acima da nuvem
  5. O histograma MACD está acima de 0
  6. CMF é superior a 0,1
  7. ETI acima de 0

O sinal curto é desencadeado quando as condições acima são invertidas. Por tais critérios abrangentes, a maioria dos falsos sinais pode ser filtrada e as principais tendências no mercado são capturadas.

Vantagens

A maior vantagem desta estratégia é filtrar sinais falsos e detectar tendências fortes através da combinação de múltiplos indicadores.

  1. A nuvem de Ichimoku determina a direcção da tendência principal.
  2. Os indicadores auxiliares filtram ainda mais os sinais e reduzem os riscos
  3. Considera de forma abrangente vários prazos para sinais mais confiáveis
  4. Regras rigorosas para negociar apenas configurações de alta qualidade e evitar mercados agitados
  5. Mecanismo de acompanhamento da tendência para maximizar os lucros da tendência

Através de tais julgamentos, a estratégia pode identificar efetivamente os setores quentes a médio e longo prazo e lucrar com a negociação de tendências.

Riscos

Os principais riscos desta estratégia incluem:

  1. Risco de ruptura falsa que provoque sinais errados
  2. Risco de reversão da tendência levando à perda de todos os lucros
  3. Relativamente baixa frequência de negociação oportunidades perdidas

Soluções:

  1. Relaxar adequadamente os critérios de filtragem para aumentar a frequência do comércio
  2. Adicionar condição de stop loss para limitar o tamanho da perda
  3. Otimizar parâmetros para melhorar a precisão do sinal

Reforço

As principais direcções de otimização:

  1. Optimização de parâmetros através de mais backtests para encontrar uma melhor combinação de parâmetros

  2. Adicionar um mecanismo de stop loss ao controlo dos riscos

  3. Adicionar stop loss para bloquear os lucros

  4. Teste mais indicadores para encontrar uma melhor combinação de filtros

  5. Adicionar regras para distinguir a fuga real

Conclusão

Esta estratégia combina efetivamente a nuvem Ichimoku e vários indicadores auxiliares. Melhorias adicionais na otimização de parâmetros, mecanismo de stop loss, seleção de indicadores podem melhorar a estabilidade e qualidade do sinal para maiores retornos constantes.


/*backtest
start: 2024-01-11 00:00:00
end: 2024-01-13 14:00:00
period: 1m
basePeriod: 1m
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/
// © exlux99

//@version=4
strategy("Ichimoku with MACD/ CMF/ TSI", overlay=true, margin_long=0, margin_short=0)



//Inputs
ts_bars = input(10, minval=1, title="Tenkan-Sen Bars")
ks_bars = input(30, minval=1, title="Kijun-Sen Bars")
ssb_bars = input(52, minval=1, title="Senkou-Span B Bars")
cs_offset = input(26, minval=1, title="Chikou-Span Offset")
ss_offset = input(26, minval=1, title="Senkou-Span Offset")
long_entry = input(true, title="Long Entry")
short_entry = input(true, title="Short Entry")

middle(len) => avg(lowest(len), highest(len))

// Ichimoku Components
tenkan = middle(ts_bars)
kijun = middle(ks_bars)
senkouA = avg(tenkan, kijun)
senkouB = middle(ssb_bars)


ss_high = max(senkouA[ss_offset-1], senkouB[ss_offset-1])
ss_low = min(senkouA[ss_offset-1], senkouB[ss_offset-1])

// Entry/Exit Signals
fast_length = input(title="Fast Length", type=input.integer, defval=17)
slow_length = input(title="Slow Length", type=input.integer, defval=28)
src = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 5)
sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=true)
sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=true)

// Calculating
fast_ma = sma_source ? sma(src, fast_length) : ema(src, fast_length)
slow_ma = sma_source ? sma(src, slow_length) : ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal


tk_cross_bull = tenkan > kijun
tk_cross_bear = tenkan < kijun
cs_cross_bull = mom(close, cs_offset-1) > 0
cs_cross_bear = mom(close, cs_offset-1) < 0
price_above_kumo = close > ss_high
price_below_kumo = close < ss_low


//CMF
lengthA = input(8, minval=1, title="CMF Length")
ad = close==high and close==low or high==low ? 0 : ((2*close-low-high)/(high-low))*volume
mf = sum(ad, lengthA) / sum(volume, lengthA)


//TSI
long = input(title="Long Length", type=input.integer, defval=8)
short = input(title="Short Length", type=input.integer, defval=8)
price = close
double_smooth(src, long, short) =>
	fist_smooth = ema(src, long)
	ema(fist_smooth, short)
pc = change(price)
double_smoothed_pc = double_smooth(pc, long, short)
double_smoothed_abs_pc = double_smooth(abs(pc), long, short)
tsi_value = 100 * (double_smoothed_pc / double_smoothed_abs_pc)



bullish = tk_cross_bull and cs_cross_bull and price_above_kumo and hist > 0 and mf > 0.1 and tsi_value > 0
bearish = tk_cross_bear and cs_cross_bear and price_below_kumo and hist < 0  and mf < -0.1 and tsi_value < 0



strategy.entry("Long", strategy.long, when=bullish and long_entry)
strategy.entry("Short", strategy.short, when=bearish and short_entry)

strategy.close("Long", when=bearish and not short_entry)
strategy.close("Short", when=bullish and not long_entry)

Mais.