A estratégia do MACD TrueLevel usa o indicador MACD e as faixas do TrueLevel para determinar os sinais de compra e venda.
A estratégia primeiro calcula o indicador MACD, em seguida, calcula 14 faixas TrueLevel de diferentes períodos. As faixas TrueLevel são calculadas com base na linha de regressão linear e no desvio padrão dos preços em diferentes períodos de comprimento.
Especificamente, o sinal de entrada é um cruzamento da linha MACD acima da linha de sinal, ou quebra de preço acima da faixa inferior do TrueLevel selecionada.
A vantagem de usar bandas TrueLevel é que combina a direção da tendência e a faixa de volatilidade para determinar com mais precisão o início e o fim das tendências.
O MACD julga a direcção da tendência de forma eficaz e acompanha bem as tendências.
A adição de bandas TrueLevel pode filtrar falhas e confirmar tendências.
As bandas TrueLevel incluem vários períodos, julgando as alterações da tendência de forma abrangente.
Parâmetros de banda TrueLevel ajustáveis adequados a diferentes ambientes de mercado.
Apoiar posições longas e curtas para aproveitar plenamente as oportunidades de tendência.
O MACD sozinho pode gerar mais sinais falsos, necessitando de um filtro TrueLevel.
A configuração incorreta do parâmetro da faixa TrueLevel pode causar entradas ou saídas perdidas.
As posições longas e curtas exigem um apoio de capital suficiente, caso contrário, podem provocar uma chamada de margem.
A própria negociação de breakout tem o risco de ser interrompida, exigindo um stop loss oportuno.
Qualquer estratégia de indicador tem o risco de não funcionar bem em produtos altamente voláteis como commodities e criptomoedas.
Teste mais parâmetros de período para encontrar valores ideais para o mercado.
Adicionar estratégia de stop loss para reduzir o risco de perda.
Adicionar outros filtros de indicadores, como volume, KDJ, etc., para reduzir as falhas.
Otimizar os pontos de entrada, como quebrar altos/baixos anteriores para melhorar a taxa de lucro.
Adicionar modelos de aprendizagem de máquina para julgar a probabilidade de tendência, reduzindo o ajuste manual de parâmetros.
A estratégia do MACD TrueLevel integra a análise de tendência e intervalo. Ele adiciona bandas de TrueLevel no topo do MACD para localizar com mais precisão o início e o fim das tendências em comparação com apenas o MACD. Ele pode efetivamente filtrar sinais falsos e capturar tendências. Ainda há riscos que precisam de parâmetro e otimização de stop loss.
/*backtest start: 2023-09-06 00:00:00 end: 2023-10-06 00:00:00 period: 4h basePeriod: 15m 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/ // © Julien_Eche //@version=4 strategy("MACD TrueLevel Strategy", shorttitle="MACD TL", overlay=true) // Input parameters for MACD fastLength = input(12, title="Fast Length", type=input.integer) slowLength = input(26, title="Slow Length", type=input.integer) signalLength = input(9, title="Signal Length", type=input.integer) // Inputs for selecting bands entry_band = input(12, title="Entry TrueLevel Band", type=input.integer, minval=1, maxval=14) exit_band = input(12, title="Exit TrueLevel Band", type=input.integer, minval=1, maxval=14) // Input for long and short mode long_and_short = input(false, title="Enable Long and Short", type=input.bool) // Calculate the MACD [macdLine, signalLine, _] = macd(close, fastLength, slowLength, signalLength) // User inputs len1 = input(title="Length 1", type=input.integer, defval=126) len2 = input(title="Length 2", type=input.integer, defval=189) len3 = input(title="Length 3", type=input.integer, defval=252) len4 = input(title="Length 4", type=input.integer, defval=378) len5 = input(title="Length 5", type=input.integer, defval=504) len6 = input(title="Length 6", type=input.integer, defval=630) len7 = input(title="Length 7", type=input.integer, defval=756) len8 = input(title="Length 8", type=input.integer, defval=1008) len9 = input(title="Length 9", type=input.integer, defval=1260) len10 = input(title="Length 10", type=input.integer, defval=1638) len11 = input(title="Length 11", type=input.integer, defval=2016) len12 = input(title="Length 12", type=input.integer, defval=2646) len13 = input(title="Length 13", type=input.integer, defval=3276) len14 = input(title="Length 14", type=input.integer, defval=4284) fill_color = input(title="Fill Color", type=input.color, defval=color.rgb(0, 191, 255, 95)) mult = input(title="Multiple", type=input.float, defval=1, step=0.2, options=[0.6, 0.8, 1, 1.2, 1.4]) src = input(title="Source", type=input.source, defval=close) // Upper band calculation function upperBand(length) => linreg = linreg(src, length, 0) stddev = mult * stdev(src, length) upperband = linreg + stddev upperband // Lower band calculation function lowerBand(length) => linreg = linreg(src, length, 0) stddev = mult * stdev(src, length) lowerband = linreg - stddev lowerband // Calculate upper and lower bands for each length upperband_1 = upperBand(len1) upperband_2 = upperBand(len2) upperband_3 = upperBand(len3) upperband_4 = upperBand(len4) upperband_5 = upperBand(len5) upperband_6 = upperBand(len6) upperband_7 = upperBand(len7) upperband_8 = upperBand(len8) upperband_9 = upperBand(len9) upperband_10 = upperBand(len10) upperband_11 = upperBand(len11) upperband_12 = upperBand(len12) upperband_13 = upperBand(len13) upperband_14 = upperBand(len14) lowerband_1 = lowerBand(len1) lowerband_2 = lowerBand(len2) lowerband_3 = lowerBand(len3) lowerband_4 = lowerBand(len4) lowerband_5 = lowerBand(len5) lowerband_6 = lowerBand(len6) lowerband_7 = lowerBand(len7) lowerband_8 = lowerBand(len8) lowerband_9 = lowerBand(len9) lowerband_10 = lowerBand(len10) lowerband_11 = lowerBand(len11) lowerband_12 = lowerBand(len12) lowerband_13 = lowerBand(len13) lowerband_14 = lowerBand(len14) // Plot envelope bands for each length upperband_1_plot = plot(upperband_1, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 1") lowerband_1_plot = plot(lowerband_1, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 1") upperband_2_plot = plot(upperband_2, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 2") lowerband_2_plot = plot(lowerband_2, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 2") upperband_3_plot = plot(upperband_3, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 3") lowerband_3_plot = plot(lowerband_3, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 3") upperband_4_plot = plot(upperband_4, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 4") lowerband_4_plot = plot(lowerband_4, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 4") upperband_5_plot = plot(upperband_5, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 5") lowerband_5_plot = plot(lowerband_5, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 5") upperband_6_plot = plot(upperband_6, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 6") lowerband_6_plot = plot(lowerband_6, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 6") upperband_7_plot = plot(upperband_7, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 7") lowerband_7_plot = plot(lowerband_7, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 7") upperband_8_plot = plot(upperband_8, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 8") lowerband_8_plot = plot(lowerband_8, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 8") upperband_9_plot = plot(upperband_9, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 9") lowerband_9_plot = plot(lowerband_9, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 9") upperband_10_plot = plot(upperband_10, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 10") lowerband_10_plot = plot(lowerband_10, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 10") upperband_11_plot = plot(upperband_11, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 11") lowerband_11_plot = plot(lowerband_11, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 11") upperband_12_plot = plot(upperband_12, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 12") lowerband_12_plot = plot(lowerband_12, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 12") upperband_13_plot = plot(upperband_13, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 13") lowerband_13_plot = plot(lowerband_13, color=color.rgb(14, 139, 212, 95), linewidth=1, title="Lower Band 13") upperband_14_plot = plot(upperband_14, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 14") lowerband_14_plot = plot(lowerband_14, color=color.rgb(14, 139, 212, 95), linewidth=1, title="Lower Band 14") // Plot fills for each length fill(upperband_1_plot, lowerband_1_plot, color=fill_color, title="Fill 1") fill(upperband_2_plot, lowerband_2_plot, color=fill_color, title="Fill 2") fill(upperband_3_plot, lowerband_3_plot, color=fill_color, title="Fill 3") fill(upperband_4_plot, lowerband_4_plot, color=fill_color, title="Fill 4") fill(upperband_5_plot, lowerband_5_plot, color=fill_color, title="Fill 5") fill(upperband_6_plot, lowerband_6_plot, color=fill_color, title="Fill 6") fill(upperband_7_plot, lowerband_7_plot, color=fill_color, title="Fill 7") fill(upperband_8_plot, lowerband_8_plot, color=fill_color, title="Fill 8") fill(upperband_9_plot, lowerband_9_plot, color=fill_color, title="Fill 9") fill(upperband_10_plot, lowerband_10_plot, color=fill_color, title="Fill 10") fill(upperband_11_plot, lowerband_11_plot, color=fill_color, title="Fill 11") fill(upperband_12_plot, lowerband_12_plot, color=fill_color, title="Fill 12") fill(upperband_13_plot, lowerband_13_plot, color=fill_color, title="Fill 13") fill(upperband_14_plot, lowerband_14_plot, color=fill_color, title="Fill 14") // Add variables to store the highest upper band and lowest lower band values var float highestUpperBand = na var float lowestLowerBand = na // Calculate the trueLevelUpperBand and trueLevelLowerBand trueLevelUpperBand = max(upperband_1, max(upperband_2, max(upperband_3, max(upperband_4, max(upperband_5, max(upperband_6, max(upperband_7, max(upperband_8, max(upperband_9, max(upperband_10, max(upperband_11, max(upperband_12, max(upperband_13, upperband_14))))))))))))) trueLevelLowerBand = min(lowerband_1, min(lowerband_2, min(lowerband_3, min(lowerband_4, min(lowerband_5, min(lowerband_6, min(lowerband_7, min(lowerband_8, min(lowerband_9, min(lowerband_10, min(lowerband_11, min(lowerband_12, min(lowerband_13, lowerband_14))))))))))))) // Update the highest upper band and lowest lower band highestUpperBand := highest(trueLevelUpperBand, 1) lowestLowerBand := lowest(trueLevelLowerBand, 1) // Store the upper and lower bands in an array for easy access upperbands = array.new_float(14) lowerbands = array.new_float(14) array.set(upperbands, 0, upperband_1) array.set(upperbands, 1, upperband_2) array.set(upperbands, 2, upperband_3) array.set(upperbands, 3, upperband_4) array.set(upperbands, 4, upperband_5) array.set(upperbands, 5, upperband_6) array.set(upperbands, 6, upperband_7) array.set(upperbands, 7, upperband_8) array.set(upperbands, 8, upperband_9) array.set(upperbands, 9, upperband_10) array.set(upperbands, 10, upperband_11) array.set(upperbands, 11, upperband_12) array.set(upperbands, 12, upperband_13) array.set(upperbands, 13, upperband_14) array.set(lowerbands, 0, lowerband_1) array.set(lowerbands, 1, lowerband_2) array.set(lowerbands, 2, lowerband_3) array.set(lowerbands, 3, lowerband_4) array.set(lowerbands, 4, lowerband_5) array.set(lowerbands, 5, lowerband_6) array.set(lowerbands, 6, lowerband_7) array.set(lowerbands, 7, lowerband_8) array.set(lowerbands, 8, lowerband_9) array.set(lowerbands, 9, lowerband_10) array.set(lowerbands, 10, lowerband_11) array.set(lowerbands, 11, lowerband_12) array.set(lowerbands, 12, lowerband_13) array.set(lowerbands, 13, lowerband_14) // Get the selected bands for entry and exit selected_entry_lowerband = array.get(lowerbands, entry_band - 1) selected_exit_upperband = array.get(upperbands, exit_band - 1) // Entry conditions longCondition = crossover(macdLine, signalLine) or crossover(close, selected_entry_lowerband) shortCondition = crossunder(macdLine, signalLine) or crossunder(close, selected_exit_upperband) // Exit conditions exitLongCondition = crossunder(macdLine, signalLine) or crossunder(close, selected_exit_upperband) exitShortCondition = crossover(macdLine, signalLine) or crossover(close, selected_entry_lowerband) // Strategy execution strategy.entry("Long", strategy.long, when = longCondition) strategy.entry("Short", strategy.short, when = shortCondition and long_and_short) strategy.close("Long", when = exitLongCondition) strategy.close("Short", when = exitShortCondition)