O recurso está a ser carregado... Carregamento...

Estratégia de média móvel quintuplicada

Autora:ChaoZhang, Data: 2024-05-23 18:14:35
Tags:EMAWMASMATMAVARWWMAZLEMATSF

img

Resumo

A estratégia de média móvel quintupla é uma estratégia de negociação baseada em múltiplas médias móveis. Esta estratégia utiliza 5 médias móveis de diferentes prazos e tipos para identificar tendências fortes no mercado. As primeiras 3 médias móveis são os principais componentes da estratégia, usadas principalmente para identificação de tendências e geração de sinal, enquanto as médias móveis 4 e 5 são usadas principalmente para julgamento auxiliar e análise visual.

Através da análise abrangente das tendências e das relações de posição relativas das médias móveis de diferentes prazos e tipos, esta estratégia pode determinar com precisão a direção e a força da tendência atual do mercado e ajustar as posições em tempo útil de acordo com as alterações da tendência, de modo a alcançar uma boa rentabilidade.

Princípio da estratégia

Esta estratégia utiliza 5 médias móveis de diferentes prazos e tipos, nomeadamente:

  1. Média móvel de nível 1: visualização personalizável, rótulo, fonte de dados, prazo, comprimento, largura de linha, cor e tipo.
  2. Média móvel de nível 2: visualização personalizável, rótulo, fonte de dados, prazo, comprimento, largura de linha, cor e tipo.
  3. Média móvel de nível 3: exibição personalizável, rótulo, fonte de dados, prazo, comprimento, largura de linha, cor e tipo.
  4. Média móvel de nível 4: utilizada principalmente para julgamentos auxiliares, exibição personalizável, rótulo, fonte de dados, período de tempo, comprimento, largura de linha e cor.
  5. Média móvel de nível 5: utilizada principalmente para julgamentos auxiliares, exibição personalizável, rótulo, fonte de dados, período de tempo, comprimento, largura de linha e cor.

Os tipos destas 5 médias móveis podem ser definidos de forma flexível, incluindo SMA, EMA, WMA, TMA, VAR, WWMA, ZLEMA, TSF e outros 8 tipos.

A ideia central desta estratégia é determinar a direção e a força da tendência utilizando múltiplas confirmações de tendência de médias móveis de diferentes prazos e tipos:

  • Quando o preço de fechamento estiver acima das médias móveis dos níveis 1, 2 e 3, negociar;
  • Quando o preço de fechamento estiver abaixo das médias móveis dos níveis 1, 2 e 3, proceder a operações de curto prazo;
  • Ao manter uma posição longa, se o preço de encerramento cair abaixo das médias móveis dos níveis 1 e 2, fechar a posição longa;
  • Ao manter uma posição curta, se o preço de fechamento subir acima das médias móveis dos níveis 1 e 2, fechar a posição curta.

Além disso, esta estratégia irá exibir a cor dos candelabros de acordo com a posição atual:

  • Quando se mantém uma posição longa, o candelabro é verde;
  • Quando se mantém uma posição curta, o candelabro é vermelho;
  • Em outros casos, o candelabro é cinzento.

Vantagens da estratégia

  1. Esta estratégia utiliza uma combinação de múltiplas médias móveis de médio e longo prazo para determinar tendências, com uma forte capacidade de reconhecimento de tendências, que pode captar eficazmente as principais tendências do mercado.
  2. Parâmetros flexíveis ajustáveis: os parâmetros desta estratégia podem ser definidos de forma flexível, incluindo o tipo, o prazo, a duração das médias móveis, etc., que podem ser otimizados de acordo com diferentes características do mercado e preferências dos investidores.
  3. Adaptabilidade a múltiplos mercados. Este julgamento de tendências é baseado principalmente no movimento do preço em si, com forte adaptabilidade aos mercados, e pode ser usado em múltiplos mercados, como ações, futuros, câmbio, criptomoedas, etc.
  4. A lógica central desta estratégia é simples e clara, fácil de compreender e implementar, sem exigir modelos matemáticos excessivamente complexos.

Riscos estratégicos

  1. Esta estratégia funciona geralmente em mercados limitados ao intervalo, e pode experimentar mais negociações de pequenas perdas, resultando em uma diminuição do lucro líquido.
  2. Risco de otimização de parâmetros. Esta estratégia usa muitos parâmetros. Se não forem realizados backtesting de dados históricos suficientes e otimização de parâmetros, isso pode levar a maiores reduções nas futuras negociações ao vivo.
  3. Risco de reversão de tendência. Esta estratégia é principalmente adequada para mercados de tendência. Uma vez que a tendência do mercado se inverta, esta estratégia pode continuar a negociar na direção da tendência original, causando perdas.

Para reduzir os riscos acima referidos, podem ser consideradas as seguintes melhorias:

  1. Adicionar uma lógica de detecção e julgamento de mercados de intervalo para reduzir o número de transações em mercados não tendentes.
  2. Realizar testes de otimização de parâmetros suficientes nesta estratégia para encontrar uma combinação robusta e ótima de parâmetros.
  3. Estabelecer níveis razoáveis de stop-loss para controlar o risco máximo de uma única negociação.

Orientações para a otimização da estratégia

  1. Introduzir mais indicadores de confirmação da tendência, tais como MACD, DMI, etc., para melhorar a precisão do julgamento da tendência.
  2. Para os mercados limitados ao intervalo, considerar a introdução de uma lógica operacional que possa adaptar-se aos mercados limitados ao intervalo, como a negociação de redes.
  3. Para diferentes características do mercado, otimizar os parâmetros da estratégia separadamente para melhorar a adaptabilidade.
  4. Considerar a combinação desta estratégia com outras estratégias, tais como uma combinação de estratégia de tendência + estratégia de intervalo, estratégia de tendência + estratégia de contra-tendência, etc., para melhorar a robustez da estratégia.

Resumo

A estratégia de média móvel Quintuple Strong é uma estratégia de negociação baseada em múltiplas confirmações de tendência. Considerando de forma abrangente as tendências e relações de posição relativa das médias móveis de diferentes prazos e tipos, ele pode determinar com relativa precisão a direção e força da tendência atual do mercado e ajustar as posições de acordo com as mudanças na tendência. A lógica da estratégia é simples e clara, os parâmetros são flexíveis e ajustáveis e é adaptável a vários mercados. No entanto, ele executa geralmente mercados de faixa de entrada, e há certos riscos de otimização de parâmetros e riscos de reversão de tendência. No futuro, podemos considerar a introdução de mais indicadores, otimização de parâmetros, adição de lógica operacional para mercados de faixa e combinação com outros tipos de estratégias para melhorar ainda mais a robustez e lucratividade desta estratégia.


/*backtest
start: 2023-05-17 00:00:00
end: 2024-05-22 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Quintuple Strong Moving Average Strategy","QuisMa", overlay=true, margin_long=100, margin_short=100)

// 1
mav1_show = input.bool(true, 'Show Plot', group='Level 1 ', inline='mav1_0')
mav1_label = input.bool(true, 'Show Label', group='Level 1 ', inline='mav1_0')
mav1_source = input.source(close, '', group='Level 1 ', inline='mav1_1')
mav1_timeframe = input.timeframe('5', '', group='Level 1 ', inline='mav1_1')
mav1_length = input.int(50, 'Length', group='Level 1 ', inline='mav1_3')
mav1_size = input.int(2000, 'Size', minval=1, group='Level 1 ', inline='mav1_3')
mav1_width = input.int(2, '', minval=0, group='Level 1 ', inline='mav1_2')
mav1_color = input.color(color.new(#ffd000, 0), '', group='Level 1 ', inline='mav1_2')
mav1_type = input.string(title='Moving Average Type 1', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])

// 2
mav2_show = input.bool(true, 'Show Plot', group='Level 2', inline='mav2_0')
mav2_label = input.bool(true, 'Show Label', group='Level 2', inline='mav2_0')
mav2_source = input.source(close, '', group='Level 2', inline='mav2_1')
mav2_timeframe = input.timeframe('30', '', group='Level 2', inline='mav2_1')
mav2_length = input.int(50, 'Length', group='Level 2', inline='mav2_3')
mav2_size = input.int(2000, 'Size', minval=1, group='Level 2', inline='mav2_3')
mav2_width = input.int(2, '', minval=0, group='Level 2', inline='mav2_2')
mav2_color = input.color(color.new(#ffd000, 0), '', group='Level 2', inline='mav2_2')
mav2_type = input.string(title='Moving Average Type 2', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])

// 3
mav3_show = input.bool(true, 'Show Plot', group='Level 3', inline='mav3_0')
mav3_label = input.bool(true, 'Show Label', group='Level 3', inline='mav3_0')
mav3_source = input.source(close, '', group='Level 3', inline='mav3_1')
mav3_timeframe = input.timeframe('60', '', group='Level 3', inline='mav3_1')
mav3_length = input.int(50, 'Length', group='Level 3', inline='mav3_3')
mav3_size = input.int(2000, 'Size', minval=1, group='Level 3', inline='mav3_3')
mav3_width = input.int(2, '', minval=0, group='Level 3', inline='mav3_2')
mav3_color = input.color(color.new(#ffd000, 0), '', group='Level 3', inline='mav3_2')
mav3_type = input.string(title='Moving Average Type 3', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])

// 4
mav4_show = input.bool(true, 'Show Plot', group='Level 4', inline='mav4_0')
mav4_label = input.bool(true, 'Show Label', group='Level 4', inline='mav4_0')
mav4_source = input.source(close, '', group='Level 4', inline='mav4_1')
mav4_timeframe = input.timeframe('480', '', group='Level 4', inline='mav4_1')
mav4_length = input.int(50, 'Length', group='Level 4', inline='mav4_3')
mav4_size = input.int(2000, 'Size', minval=1, group='Level 4', inline='mav4_3')
mav4_width = input.int(2, '', minval=0, group='Level 4', inline='mav4_2')
mav4_color = input.color(color.new(#ffd000, 0), '', group='Level 4', inline='mav4_2')
mav4_type = input.string(title='Moving Average Type 4', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])

// 5
mav5_show = input.bool(true, 'Show Plot', group='Level 5', inline='mav5_0')
mav5_label = input.bool(true, 'Show Label', group='Level 5', inline='mav5_0')
mav5_source = input.source(close, '', group='Level 5', inline='mav5_1')
mav5_timeframe = input.timeframe('720', '', group='Level 5', inline='mav5_1')
mav5_length = input.int(50, 'Length', group='Level 5', inline='mav5_3')
mav5_size = input.int(2000, 'Size', minval=1, group='Level 5', inline='mav5_3')
mav5_width = input.int(2, '', minval=0, group='Level 5', inline='mav5_2')
mav5_color = input.color(color.new(#ffd000, 0), '', group='Level 5', inline='mav5_2')
mav5_type = input.string(title='Moving Average Type 5', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])


// FUNCTIONS {{{
candle_size_ms = time - time[1]  // milliseconds of a candle

timetostring(tms) =>
    d_ = math.floor(tms / 86400)
    h_ = math.floor((tms - d_ * 86400) / 3600)
    m_ = math.floor((tms - d_ * 86400 - h_ * 3600) / 60)
    s_ = math.floor(tms - d_ * 86400 - h_ * 3600 - m_ * 60)
    ret = d_ > 0 ? str.tostring(d_) + ' D ' : ''
    ret += (h_ > 0 ? str.tostring(h_) + ' H ' : '')
    ret += (m_ > 0 ? str.tostring(m_) + ' m ' : '')
    if d_ == 0
        ret += (s_ > 0 ? str.tostring(s_) + ' s ' : '')
        ret
    ret

tftostring(tf) =>
    tfa = str.split(tf, '')
    tfalast = array.get(tfa, array.size(tfa) - 1)
    tfalastIsNum = na(str.tonumber(tfalast)) ? false : true
    txt = tfalastIsNum ? timetostring(str.tonumber(tf) * 60) : tf
    txt

htfLabel(htfy, tf, col) =>
    txt = tftostring(tf)
    htftxt = 'ᐊ ' + txt
    htftip = 'HTF  [ ' + txt + ' ] ' + str.tostring(htfy, '#.##')
    label.new(x=time + candle_size_ms * 2, y=htfy, xloc=xloc.bar_time, yloc=yloc.price, color=color.new(color.black, 100), textcolor=col, style=label.style_label_left, size=size.normal, text=htftxt, tooltip=htftip)

// Moving Averages Functions {{{
Var_Func(src, length) =>
    valpha = 2 / (length + 1)
    vud1 = src > src[1] ? src - src[1] : 0
    vdd1 = src < src[1] ? src[1] - src : 0
    vUD = math.sum(vud1, 9)
    vDD = math.sum(vdd1, 9)
    vCMO = nz((vUD - vDD) / (vUD + vDD))
    VAR = 0.0
    VAR := nz(valpha * math.abs(vCMO) * src) + (1 - valpha * math.abs(vCMO)) * nz(VAR[1])
    VAR

Wwma_Func(src, length) =>
    wwalpha = 1 / length
    WWMA = 0.0
    WWMA := wwalpha * src + (1 - wwalpha) * nz(WWMA[1])
    WWMA

Zlema_Func(src, length) =>
    zxLag = length / 2 == math.round(length / 2) ? length / 2 : (length - 1) / 2
    zxEMAData = src + src - src[zxLag]
    ZLEMA = ta.ema(zxEMAData, length)
    ZLEMA

Tsf_Func(src, length) =>
    lrc = ta.linreg(src, length, 0)
    lrc1 = ta.linreg(src, length, 1)
    lrs = lrc - lrc1
    TSF = ta.linreg(src, length, 0) + lrs
    TSF

getMA(src, length, mav_type) =>
    ma = 0.0
    if mav_type == 'SMA'
        ma := ta.sma(src, length)
    if mav_type == 'EMA'
        ma := ta.ema(src, length)
    if mav_type == 'WMA'
        ma := ta.wma(src, length)
    if mav_type == 'TMA'
        ma := ta.sma(ta.sma(src, math.ceil(length / 2)), math.floor(length / 2) + 1)
    if mav_type == 'VAR'
        ma := Var_Func(src, length)
    if mav_type == 'WWMA'
        ma := Wwma_Func(src, length)
    if mav_type == 'ZLEMA'
        ma := Zlema_Func(src, length)
    if mav_type == 'TSF'
        ma := Tsf_Func(src, length)
    ma

mav1 = request.security(syminfo.tickerid, mav1_timeframe, getMA(mav1_source, mav1_length, mav1_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav1_show ? mav1 : na, 'mav 1', color=mav1_color, linewidth=mav1_width, show_last=mav1_size)
var label mav1lbl = na
label.delete(mav1lbl)
mav1lbl := mav1_label ? htfLabel(mav1, mav1_timeframe, mav1_color) : na

mav2 = request.security(syminfo.tickerid, mav2_timeframe, getMA(mav2_source, mav2_length, mav2_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav2_show ? mav2 : na, 'mav 2', color=mav2_color, linewidth=mav2_width, show_last=mav2_size)
var label mav2lbl = na
label.delete(mav2lbl)
mav2lbl := mav2_label ? htfLabel(mav2, mav2_timeframe, mav2_color) : na

mav3 = request.security(syminfo.tickerid, mav3_timeframe, getMA(mav3_source, mav3_length, mav3_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav3_show ? mav3 : na, 'mav 3', color=mav3_color, linewidth=mav3_width, show_last=mav3_size)
var label mav3lbl = na
label.delete(mav3lbl)
mav3lbl := mav3_label ? htfLabel(mav3, mav3_timeframe, mav3_color) : na

mav4 = request.security(syminfo.tickerid, mav4_timeframe, getMA(mav4_source, mav4_length, mav4_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav4_show ? mav4 : na, 'mav 4', color=mav4_color, linewidth=mav4_width, show_last=mav4_size)
var label mav4lbl = na
label.delete(mav4lbl)
mav4lbl := mav4_label ? htfLabel(mav4, mav4_timeframe, mav4_color) : na

mav5 = request.security(syminfo.tickerid, mav5_timeframe, getMA(mav5_source, mav5_length, mav5_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav5_show ? mav5 : na, 'mav 5', color=mav5_color, linewidth=mav5_width, show_last=mav5_size)
var label mav5lbl = na
label.delete(mav5lbl)
mav5lbl := mav5_label ? htfLabel(mav5, mav5_timeframe, mav5_color) : na

// Alış ve Satış Koşulları
alisKosulu = close > mav1 and close > mav2 and close > mav3
satisKosulu = close < mav1 and close < mav2 and close < mav3

// Alış ve Satış Sinyalleri
if (alisKosulu and not satisKosulu)
    strategy.entry("Alış", strategy.long)
if (satisKosulu and not alisKosulu)
    strategy.entry("Satış", strategy.short)

// Pozisyonları Kapatma Koşulları
if (strategy.opentrades > 0)
    if (close < mav1 and close < mav2 and strategy.position_size > 0)
        strategy.close("Alış")
    if (close > mav1 and close > mav2 and strategy.position_size < 0)
        strategy.close("Satış")

// Mum Rengi Ayarlama
longKosul = strategy.opentrades > 0 and strategy.position_size > 0
shortKosul = strategy.opentrades > 0 and strategy.position_size < 0

barcolor(longKosul ? color.green : shortKosul ? color.red : color.gray)


Relacionados

Mais.