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.
Esta estratégia utiliza 5 médias móveis de diferentes prazos e tipos, nomeadamente:
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:
Além disso, esta estratégia irá exibir a cor dos candelabros de acordo com a posição atual:
Para reduzir os riscos acima referidos, podem ser consideradas as seguintes melhorias:
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)