A estratégia de combinação de múltiplos fatores com média móvel adaptativa é uma estratégia composta que combina o uso de linhas HA, médias móveis, crossovers estocásticos e barras intradiárias.
A lógica central desta estratégia é combinar vários indicadores técnicos para marcar sinais de compra e venda e gerar sinais de negociação com forças variáveis com base nos resultados correspondentes.
Em especial, os quatro principais indicadores técnicos utilizados na estratégia incluem:
As barras intradiárias. A estratégia usa a cor das barras intradiárias para determinar as tendências de preços. Duas barras HA verdes consecutivas em corpo real dão sinais de compra, enquanto duas barras HA ocas vermelhas consecutivas dão sinais de venda.
A estratégia usa médias móveis rápidas, lentas e filtrantes com configurações de parâmetros diferentes simultaneamente. Quando a linha rápida cruza acima da linha lenta e a linha lenta cruza acima da linha de filtro, ela dá sinais de compra. E vice-versa. As médias móveis são boas para determinar tendências de médio a longo prazo.
Indicador Estocástico. Este indicador determina o momento dos cruzados de alta e baixa. Quando a linha %K atravessa a linha %D de baixo, ele dá sinais de compra. E quando %K quebra %D de cima, ele dá sinais de venda.
Mecanismo de pontuação de correspondência. De acordo com a correspondência dos fatores acima, a estratégia adota um mecanismo de pontuação. Quanto mais fatores de correspondência, mais forte o sinal de negociação correspondente.
Através do julgamento abrangente de múltiplos fatores, a estratégia pode capturar oportunidades de negociação mais sutis a médio e curto prazo, alcançando assim retornos excessivos durante os mercados de alta.
A maior vantagem desta estratégia multifator é que aumenta a confiabilidade dos sinais de negociação. Um único indicador técnico é propenso a gerar sinais falsos. Ao combinar vários indicadores, esta estratégia pode efetivamente reduzir a interferência de sinais falsos.
Além disso, em comparação com apenas seguir um único indicador, a combinação de vários fatores pode melhorar a taxa de vitória dos negócios.
O principal risco desta estratégia é que a própria combinação de vários fatores aumenta a complexidade da estratégia.
Além disso, durante os mercados de baixa, o tempo de retenção pode ser muito longo.
Além disso, os indicadores técnicos como as linhas estocásticas e HA podem ser impactados por eventos de cisne negro, que tendem a gerar sinais falsos e causar perdas desnecessárias.
A estratégia pode ser otimizada nos seguintes aspectos:
Otimizar as definições dos parâmetros de cada indicador para encontrar a combinação ideal.
Adicionar treinamento de modelos e módulos de parâmetros adaptativos para otimização de parâmetros em tempo real.
Adicionar estratégias de stop loss para reduzir o drawdown máximo.
Adicionar módulos de controlo de posição para ajustar dinamicamente as posições com base nas condições do mercado.
Incorporar algoritmos de aprendizagem de máquina para construir um modelo de rede neural para o sistema de pontuação multifator.
A estratégia de combinação de múltiplos fatores com média móvel adaptativa combina os pontos fortes de vários indicadores técnicos. Pode efetivamente melhorar a qualidade do sinal e alcançar retornos excessivos durante os mercados de alta. Mas ao mesmo tempo, também aumenta a complexidade da estratégia, exigindo mais testes e otimização.
/*backtest start: 2022-12-08 00:00:00 end: 2023-12-14 00:00:00 period: 1d basePeriod: 1h 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/ // © cyrule //@version=4 strategy("2nd Grade Strategy", overlay=true, shorttitle="2GTS", max_lines_count = 500, max_labels_count = 500, calc_on_every_tick = true, calc_on_order_fills = true, pyramiding = 1, default_qty_type = strategy.percent_of_equity, default_qty_value = 10) source = input(close, title = "Source") // ********************** // * Heikin-Ahshi * // * kudos to garethyeo * // ********************** showHA = input(true, title = "Show Heikin Ashi?", group = "Heikin Ashi") ha_open = security(heikinashi(syminfo.tickerid), timeframe.period, open) ha_high = security(heikinashi(syminfo.tickerid), timeframe.period, high) ha_low = security(heikinashi(syminfo.tickerid), timeframe.period, low) ha_close = security(heikinashi(syminfo.tickerid), timeframe.period, close) bgcolor(iff(showHA and ha_open < ha_close , color.new(#53b987, transp = 92.5), na), title = 'Green HA') bgcolor(iff(showHA and ha_open >= ha_close, color.new(#eb4d5c, transp = 92.5), na), title = 'Red HA' ) // ****************** // * Moving Average * // ****************** // MA Settings showMA = input(true, title = "Show Moving Averages?", group = "Moving Averages") fastMALength = input(title = "Fast MA Length", minval = 1, step = 1, defval = 20, group = "Moving Averages") slowMALength = input(title = "Slow MA Length", minval = 1, step = 1, defval = 50, group = "Moving Averages") maType = input(title = "Moving Average Type", defval = "SMA", options = ["SMA", "EMA", "RMA", "WMA", "VWMA"], group = "Moving Averages") filterMALength = input(title = "Filter MA Length", minval = 1, step = 1, defval = 200, group = "Moving Averages") filterMAType = input(title = "Filter MA Type", defval = "EMA", options = ["SMA", "EMA", "RMA", "WMA", "VWMA"], group = "Moving Averages") // Calculate MA var float maFast = na var float maSlow = na var float maFilter = na if (maType == "SMA") maFast := sma(source, fastMALength) maSlow := sma(source, slowMALength) if (maType == "EMA") maFast := ema(source, fastMALength) maSlow := ema(source, slowMALength) if (maType == "RMA") maFast := rma(source, fastMALength) maSlow := rma(source, slowMALength) maFilter := rma(source, filterMALength) if (maType == "WMA") maFast := wma(source, fastMALength) maSlow := wma(source, slowMALength) if (maType == "VWMA") maFast := vwma(source, fastMALength) maSlow := vwma(source, slowMALength) if (filterMAType == "SMA") maFilter := sma(source, filterMALength) if (filterMAType == "EMA") maFilter := ema(source, filterMALength) if (filterMAType == "RMA") maFilter := rma(source, filterMALength) if (filterMAType == "WMA") maFilter := wma(source, filterMALength) if (filterMAType == "VWMA") maFilter := vwma(source, filterMALength) BiruAtasMerah = (maFast >= maSlow) and (maSlow >= maFilter) MerahAtasBiru = (maFast <= maSlow) and (maSlow <= maFilter) // Lukis MA plot(series = showMA ? maFast : na, color = color.blue, title = "MA Fast") plot(series = showMA ? maSlow : na, color = color.red, title = "MA Slow") plot(series = showMA ? maFilter : na, color = #FFCC00, title = "MA Filter") // ************** // * Stochastic * // ************** // Stochastic Settings showSSC = input(true, title = "Show Stochastic Crossovers?", group = "Stochastic") Length = input (10, minval = 1, title = "%K Length", group = "Stochastic") SmoothK = input (3, minval = 1, title = "%K Smoothing", group = "Stochastic") SmoothD = input (3, minval = 1, title = "%D Smoothing", group = "Stochastic") // Calculate Stochastic var float K = na var float D = na if (maType == "SMA") K := sma(stoch(source, high, low, Length), SmoothK) D := sma(K, SmoothD) if (maType == "EMA") K := ema(stoch(source, high, low, Length), SmoothK) D := ema(K, SmoothD) if (maType == "RMA") K := rma(stoch(source, high, low, Length), SmoothK) D := rma(K, SmoothD) if (maType == "WMA") K := wma(stoch(source, high, low, Length), SmoothK) D := wma(K, SmoothD) if (maType == "VWMA") K := vwma(stoch(source, high, low, Length), SmoothK) D := vwma(K, SmoothD) StochasticCrossOver = crossover(K, D) StochasticCrossUnder = crossunder(K, D) // Lukis SS plotshape(showSSC and StochasticCrossOver and K <= 20 ? K : na, text = "Golden\nCrossover", color = color.new(color.green, transp = 25), location = location.belowbar, size = size.tiny, title = "Golden Crossover" ) plotshape(showSSC and StochasticCrossUnder and K >= 80 ? D : na, text = "Deadly\nCrossover", color = color.new(color.red, transp = 25), location = location.belowbar, size = size.tiny, title = "Deadly Crossover" ) plotshape(showSSC and StochasticCrossOver and K <= 80 and K > 20 ? K : na, text = "Bullish\nCrossover", color = color.new(color.green, transp = 50), location = location.belowbar, size = size.tiny, title = "Bullish Crossover") plotshape(showSSC and StochasticCrossUnder and K >= 20 and K < 80 ? D : na, text = "Bearish\nCrossover", color = color.new(color.red, transp = 50), location = location.belowbar, size = size.tiny, title = "Bearish Crossover") showBull = input(true, title = "Show Bullish Signal?", group = "Signal") showBear = input(false, title = "Show Bearish Signal?", group = "Signal") bullishCriteria = 0 if (ha_open < ha_close) and (ha_open[1] < ha_close[1]) and (ha_open[2] >= ha_close[2]) bullishCriteria := bullishCriteria + 1 if (maFast > maSlow) and (maSlow > maFilter) bullishCriteria := bullishCriteria + 1 if (K > D) and (K > K[1]) and (D > D[1]) bullishCriteria := bullishCriteria + 1 bearishCriteria = 0 if (ha_open >= ha_close) and (ha_open[1] >= ha_close[1]) and (ha_open[2] < ha_close[2]) bearishCriteria := bearishCriteria + 1 if (maFast < maSlow) and (maSlow < maFilter) bearishCriteria := bearishCriteria + 1 if (K < D) and (K < K[1]) and (D < D[1]) bearishCriteria := bearishCriteria + 1 signal = color.new(color.white, transp = 0) if bearishCriteria == 2 signal := color.new(color.orange, transp = 50) if bearishCriteria == 3 signal := color.new(color.red, transp = 50) if bullishCriteria == 2 signal := color.new(color.aqua, transp = 50) if bullishCriteria == 3 signal := color.new(color.green, transp = 50) bullishCriteria := showBull ? bullishCriteria : 0 bearishCriteria := showBear ? bearishCriteria : 0 bgcolor(iff(bullishCriteria > 1, signal, na), title = 'Bullish Signal') bgcolor(iff(bearishCriteria > 1, signal, na), title = 'Bearish Signal') longTPPerc = input(title = "Take Profit Threshold (%)" , minval = 0.0, step = 0.5, defval = 2.5, group = "Trading") / 100 profitRatio = input(title = "Profit-to-Loss ratio (risk tolerance)", minval = 1.0, step = 0.1, defval = 1.4, group = "Trading") longSLPerc = longTPPerc / profitRatio takeProfit = strategy.position_avg_price * (1 + longTPPerc) stopLoss = strategy.position_avg_price * (1 - longSLPerc) strategy.initial_capital = 50000 strategy.entry("Long" , strategy.long , floor(strategy.initial_capital*.1/close), stop = strategy.position_avg_price * 1.25, when = bullishCriteria > 1) strategy.entry("Short", strategy.short, floor(strategy.initial_capital*.1/close), stop = strategy.position_avg_price * 1.25, when = bearishCriteria > 1) strategy.close("Long" , when = (open >= takeProfit) or (open <= stopLoss) or (high >= takeProfit) or (low <= stopLoss)) strategy.close("Short", when = (open >= takeProfit) or (open <= stopLoss) or (high >= takeProfit) or (low <= stopLoss)) plotshape(bullishCriteria, location = location.belowbar, color = color.new(color.black, transp = 100)) plotshape(bearishCriteria, location = location.belowbar, color = color.new(color.black, transp = 100))