Estratégia de cruzamento de média móvel de vários períodos


Data de criação: 2024-02-19 15:41:29 última modificação: 2024-02-19 15:41:29
cópia: 0 Cliques: 335
1
focar em
1166
Seguidores

Estratégia de cruzamento de média móvel de vários períodos

Visão geral

Multi Timeframe Moving Average Crossover Strategy é uma estratégia de negociação algorítmica que usa sinais de cruzamento entre médias móveis de diferentes períodos de tempo para determinar a direção da tendência. A estratégia utiliza uma combinação de indicadores de tendência, indicadores de dinâmica e indicadores de taxa de flutuação, tornando o sinal da estratégia mais confiável.

Princípio da estratégia

A estratégia determina a direção da tendência do mercado com base no cálculo dos indicadores CCI de diferentes períodos, em combinação com o indicador MACD para procurar um sinal de troco de ouro e, finalmente, com o indicador ATR para definir um stop loss para obter um preço baixo e um preço alto.

Concretamente, primeiro, calcule o indicador CCI de 20 ciclos, para julgar a tendência do mercado com base em seus positivos e negativos; em seguida, calcule se a linha média rápida e lenta do indicador MACD ocorreu, para determinar se um sinal de compra e venda foi gerado; em seguida, use o indicador ATR para gerar um mecanismo de stop loss de rastreamento, para bloquear ainda mais o lucro; finalmente, sintetize os sinais de vários dos indicadores acima, para gerar o sinal de compra e venda final.

Vantagens estratégicas

  1. Combinação de múltiplos indicadores para melhorar a precisão do sinal

A estratégia usa uma combinação de três indicadores, CCI, MACD e ATR, para avaliar a tendência, a dinâmica e a volatilidade do mercado, tornando os sinais de estratégia mais precisos e confiáveis.

  1. Análise de quadros de tempo múltiplos para entender o ritmo do mercado

Usando o CCI de diferentes períodos para avaliar a tendência geral do mercado, em conjunto com o MACD de alta periodicidade para encontrar pontos de baixa e alta, é possível capturar o ritmo de tendência maior do mercado.

  1. ATR para o rastreamento de danos e controle de riscos

Com a ajuda do indicador de stop loss gerado pelo ATR, pode-se definir um limite razoável de stop loss de acordo com a volatilidade do mercado, além de ter uma função de rastreamento de stop loss, o risco da estratégia pode ser bem controlado.

Risco estratégico

  1. Espaço limitado para otimizar parâmetros

A maior parte dos parâmetros da estratégia não tem muito espaço para ajustes, o que limita a sua eficácia.

  1. Combinação de múltiplos indicadores aumenta a carga de cálculo

Como a estratégia usa vários indicadores para a operação de combinação, a carga de cálculo da estratégia aumenta em certa medida. Pode ocorrer problemas de cartão em negociações de alta frequência.

  1. Sinais frequentes, controle de risco limitado

Os sinais de estratégia podem ser mais frequentes, enquanto o controle de risco depende principalmente do rastreamento de perdas do indicador ATR, e o controle de risco para situações extremas não é completo.

Otimização de Estratégia

  1. Otimização de parâmetros com algoritmos de aprendizagem de máquina

Pode-se tentar usar alguns algoritmos de otimização de hiperparametros de aprendizagem de máquina, como otimização de Bayes, algoritmos genéticos, etc., para tornar o ajuste de parâmetros mais inteligente e eficiente.

  1. Aumentar os indicadores funcionais e aumentar a flexibilidade estratégica

Pode-se considerar a inclusão de alguns outros indicadores funcionais, como indicadores de volatilidade, indicadores de energia quantitativa, indicadores de emoção, etc., para melhorar a adaptabilidade e robustez da estratégia.

  1. Reforço do módulo de gestão de riscos e estratégia de controlo de riscos

Pode-se projetar um princípio de parada mais científico, ou pode-se adicionar um determinado controle de posição ou módulo de gerenciamento de fundos, para melhor proteger o risco de situações extremas e garantir a estabilidade da estratégia.

Resumir

A estratégia multicamadas atravessa a linha de equilíbrio através da combinação dos três principais indicadores CCI, MACD e ATR, para obter um julgamento de tendências mais confiável e controle de risco eficiente. A estratégia compreende a tendência, a dinâmica e a oscilação em três dimensões, com alta precisão do sinal, o ritmo do mercado e as vantagens de controle eficaz do risco.

Código-fonte da estratégia
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy('smplondonclinic Strategy', shorttitle='SMPLC Strategy', overlay=true, pyramiding = 0, process_orders_on_close = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100)

direction   = input.string(title='Entry Direction', defval='Long', options=['Long', 'Short', 'Both'],group = "Strategy Entry Direction")

TPPerc = input.float(title='Take Profit (%)', minval=0.0, step=0.1, defval=0.5, group='Strategy TP & SL')
SLPerc = input.float(title='Stop Loss (%)', minval=0.0, step=0.1, defval=0.5, group='Strategy TP & SL')

period = input(20, 'CCI period',group = "TREND MAGIC")
coeff = input(1, 'ATR Multiplier',group = "TREND MAGIC")
AP = input(5, 'ATR Period',group = "TREND MAGIC")
ATR = ta.sma(ta.tr, AP)
srctm = close
upT = low - ATR * coeff
downT = high + ATR * coeff
MagicTrend = 0.0
MagicTrend := ta.cci(srctm, period) >= 0 ? upT < nz(MagicTrend[1]) ? nz(MagicTrend[1]) : upT : downT > nz(MagicTrend[1]) ? nz(MagicTrend[1]) : downT
color1 = ta.cci(srctm, period) >= 0 ? #0022FC : #FC0400
plot(MagicTrend, color=color1, linewidth=3)
tmb = ta.cci(srctm, period) >= 0 and close>MagicTrend
tms = ta.cci(srctm, period) <= 0 and close<MagicTrend

//MACD

res           = input.timeframe("",  "Indicator TimeFrame", group = "MACD")
fast_length   = input.int(title="Fast Length", defval=12, group = "MACD")
slow_length   = input.int(title="Slow Length", defval=26, group = "MACD")
src           = input.source(title="Source", defval=close, group = "MACD")
signal_length = input.int(title="Signal Smoothing", minval = 1, maxval = 999, defval = 9, group = "MACD")
sma_source    = input.string(title="Oscillator MA Type", defval="EMA", options=["SMA", "EMA"], group = "MACD")
sma_signal    = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"], group = "MACD")

fast_ma = request.security(syminfo.tickerid, res, sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length))
slow_ma = request.security(syminfo.tickerid, res, sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length))
macd = fast_ma - slow_ma
signal = request.security(syminfo.tickerid, res, sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length))
hist = macd - signal

trend_up   = macd > signal
trend_dn   = macd < signal
cross_UP   = signal[1] >= macd[1] and signal < macd
cross_DN   = signal[1] <= macd[1] and signal > macd
cross_UP_A = (signal[1] >= macd[1] and signal < macd) and macd > 0
cross_DN_B = (signal[1] <= macd[1] and signal > macd) and macd < 0


//UT Bot

srcut = close
showut = input.bool(false, 'Show UT Bot Labels', group = "UT BOT")
keyvalue = input.float(2, title='Key Vaule. \'This changes the sensitivity\'', step=.5, group = "UT BOT")
atrperiod = input(7, title='ATR Period', group = "UT BOT")
xATR = ta.atr(atrperiod)
nLoss = keyvalue * xATR

xATRTrailingStop = 0.0
iff_1 = srcut > nz(xATRTrailingStop[1], 0) ? srcut - nLoss : srcut + nLoss
iff_2 = srcut < nz(xATRTrailingStop[1], 0) and srcut[1] < nz(xATRTrailingStop[1], 0) ? math.min(nz(xATRTrailingStop[1]), srcut + nLoss) : iff_1
xATRTrailingStop := srcut > nz(xATRTrailingStop[1], 0) and srcut[1] > nz(xATRTrailingStop[1], 0) ? math.max(nz(xATRTrailingStop[1]), srcut - nLoss) : iff_2

pos = 0
iff_3 = srcut[1] > nz(xATRTrailingStop[1], 0) and srcut < nz(xATRTrailingStop[1], 0) ? -1 : nz(pos[1], 0)
pos := srcut[1] < nz(xATRTrailingStop[1], 0) and srcut > nz(xATRTrailingStop[1], 0) ? 1 : iff_3

xcolor = pos == -1 ? color.red : pos == 1 ? color.green : color.blue

//plot(xATR, color=xcolor, title='Trailing Stop')
buy = ta.crossover(srcut, xATRTrailingStop)
sell = ta.crossunder(srcut, xATRTrailingStop)
barcolor = srcut > xATRTrailingStop

plotshape(showut ? buy:na, title='Buy', text='Buy', style=shape.labelup, location=location.belowbar, color=color.new(color.green, 0), textcolor=color.new(color.white, 0), size=size.tiny)
plotshape(showut ? sell:na, title='Sell', text='Sell', style=shape.labeldown, color=color.new(color.red, 0), textcolor=color.new(color.white, 0), size=size.tiny)

//barcolor(barcolor ? color.green : color.red)

goLong = buy and tmb and cross_UP
goShort = sell and tms and cross_DN

plotshape(goLong, location=location.bottom, style=shape.triangleup, color=color.lime, size=size.small)
plotshape(goShort, location=location.top, style=shape.triangledown, color=color.red, size=size.small)

percentAsPoints(pcnt) =>
    strategy.position_size != 0 ? math.round(pcnt / 100.0 * strategy.position_avg_price / syminfo.mintick) : float(na)

percentAsPrice(pcnt) =>
    strategy.position_size != 0 ? (pcnt / 100.0 + 1.0) * strategy.position_avg_price : float(na)

current_position_size = math.abs(strategy.position_size)
initial_position_size = math.abs(ta.valuewhen(strategy.position_size[1] == 0.0, strategy.position_size, 0))

TP = strategy.position_avg_price + percentAsPoints(TPPerc) * syminfo.mintick * strategy.position_size / math.abs(strategy.position_size)
SL = strategy.position_avg_price - percentAsPoints(SLPerc) * syminfo.mintick * strategy.position_size / math.abs(strategy.position_size)

var long = false
var short = false

if direction == 'Long' 
    long := goLong
    short := false

if direction == 'Short'
    short := goShort
    long := false

if direction == 'Both' 
    long := goLong
    short := goShort

if long and strategy.opentrades == 0
    strategy.entry(id='Long', direction=strategy.long)

if short and strategy.opentrades == 0
    strategy.entry(id='Short', direction=strategy.short)

if strategy.position_size > 0

    strategy.exit('TPSL', from_entry='Long', qty=initial_position_size, limit=TP, stop=SL)

if strategy.position_size < 0

    strategy.exit('TPSL2', from_entry='Short', qty=initial_position_size, limit=TP, stop=SL)