Esta estratégia é baseada na média móvel, pode ajustar automaticamente os parâmetros e é adequada para mercados ondulados em prazos altos.
Esta estratégia usa uma média móvel adaptativa como sinal de negociação. Primeiro, calcula a média móvel simples (CMA) do período especificado (inicio). Em seguida, testa os parâmetros do CMA ao redor do período, julgando qual combinação tem o menor número de toques pelo corpo do candelabro e da mecha. Finalmente, usa o CMA com o menor número de toques como linha de sinal.
Especificamente, a estratégia testa o CMA com período mais 1 (CMA_P1) e menos 1 (CMA_M1), conta o número de toques por corpo e mecha. Se o CMA tiver menos toques do que o CMA_P1 e o CMA_M1, então mantenha o período atual; se o CMA_P1 tiver menos toques, então aumente o período em 1; se o CMA_M1 tiver menos toques, então diminua o período em 1.
Quando o preço atravessa a CMA para cima, um sinal de compra é gerado; quando o preço atravessa a CMA para baixo, um sinal de venda é gerado.
Esta estratégia de média móvel adaptativa tem as seguintes vantagens:
Não é necessário selecionar manualmente o período da média móvel, a estratégia testará diferentes períodos e encontrará o ideal.
Em comparação com a MA de período fixo, a MA adaptativa pode filtrar mais ruído e reduzir muitos sinais falsos.
Adaptar-se às mudanças do mercado. Quando o mercado muda de intervalo para tendência, o período de MA aumentará automaticamente para gerar sinais; quando o mercado muda de tendência para intervalo, o período de MA diminuirá automaticamente. Assim, a estratégia pode se adaptar dinamicamente às mudanças do mercado.
Este método adaptativo pode simplificar todo o sistema de negociação sem otimização manual de parâmetros.
O conceito pode ser aplicado a outros indicadores como as bandas de Bollinger adaptativas, KD adaptativas, etc.
Há também alguns riscos a considerar para esta estratégia:
Risco de opção de compra. Quando o mercado tem um padrão de opção de compra, o corpo da vela pode não conseguir quebrar a linha MA, resultando em sinais errados.
Risco de fuga fracassada. A fuga MA nem sempre continua, algumas fuga fracassadas podem ocorrer. A validação da fuga é necessária para garantir uma alta taxa de sucesso.
Risco de reversão da tendência. A reversão da tendência após a entrada na tendência precisa ser mudada em tempo hábil, caso contrário pode causar perdas. O stop loss deve ser definido para controlar a perda.
Risco de otimização de parâmetros. Parâmetros ajustados adaptativos podem cair na otimização local, resultando em MA redundantes. Métodos de avaliação de modelos precisam ser introduzidos para evitar esse problema.
Risco de sobreajuste. Ajuste excessivo de parâmetros pode levar ao sobreajuste e perder a capacidade de generalização do modelo. Verificação prolongada em diferentes ambientes de mercado é necessária, não apenas confiar nos resultados dos backtests.
Algumas orientações para melhorar esta estratégia de MA adaptativa:
Adicionar a validação de rupturas de tendência através de rupturas consecutivas para filtrar rupturas falsas.
Aumentar a estratégia stop loss, stop loss quando o preço se move de volta para o outro lado da MA.
Adicione o filtro de opções para evitar sinais errados quando a opção de chamada aparecer.
Introduzir métricas de avaliação como IC, LIC, SIC, etc. para restringir o ajuste de parâmetros e evitar o sobreajuste.
Expandir para outros indicadores como estratégia de cruz de ouro adaptativa, bandas de Bollinger adaptativas, etc.
Otimizar o cálculo da MA utilizando a MA ponderada, a MA exponencial, etc., para obter uma MA mais suave.
Esta estratégia gera sinais de negociação ajustando adaptativamente o período de MA para encontrar parâmetros ideais. Em comparação com parâmetros fixos, ela pode reduzir muitos sinais falsos e se adaptar às mudanças do mercado. Mas também precisamos estar atentos aos riscos potenciais e fazer verificação e otimização do walk-forward antes de aplicá-la na negociação ao vivo para lucros constantes.
[/trans]
/*backtest start: 2022-11-10 00:00:00 end: 2023-11-16 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/ // © fondDealer96636 //@version=5 strategy('Automatic Moving Average', overlay=true, max_bars_back=201, pyramiding=0, currency=currency.USD, default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=10000) // input start = 20 lookback = input(20, "Sensitivity", tooltip="Low (High Sensitivity), High (Low Sensitivity).\n\nAdjust according to timeframe and asset.") smoothing = input(3, "Smoothing") source = input(close, "Source") startYear = input(2020, "Start year") resp = 1 in_date_range = time >= timestamp(syminfo.timezone, startYear, 1, 1, 0, 0) // global var ix = -1 var mal = array.new_int(0) // functions avg(source, len) => sum = 0.0 for i = 0 to len-1 sum += source[i] sum/len bull = close > open wick_touch(x) => bull ? ((close <= x and x <= high) or (low <= x and x <= open)) : ((open <= x and x <= high) or (low <= x and x <= close)) body_touch(x) => bull ? (open < x and x < close) : (close < x and x < open) touches(t) => touches = 0 for i = 0 to lookback-1 touches += t[i] ? 1 : 0 touches // local ix := ix+1 prev_mal = ix >= 1 ? array.get(mal, ix-1) : start cma = avg(source, prev_mal) cma_p1 = avg(source, prev_mal+1) cma_m1 = avg(source, prev_mal-1) d = touches(wick_touch(cma)) d_p1 = touches(wick_touch(cma_p1)) d_m1 = touches(wick_touch(cma_m1)) d_b = touches(body_touch(cma)) d_p1_b = touches(body_touch(cma_p1)) d_m1_b = touches(body_touch(cma_m1)) any_body_touch = d_b > 0 or d_p1_b > 0 or d_m1_b > 0 no_wick_touch = d <= 0 and d_p1 <= 0 and d_m1 <= 0 wick_maximized = d >= d_p1 and d >= d_m1 ? prev_mal : (d_p1 >= d and d_p1 >= d_m1 ? prev_mal+resp : (d_m1 >= d and d_m1 >= d_p1 ? prev_mal-resp : na)) up = cma > cma[1] down = cma < cma[1] against_trend = (up and close < cma) or (down and close > cma) new_mal = no_wick_touch or against_trend ? prev_mal-resp : (any_body_touch ? prev_mal+resp : wick_maximized) next_mal = na(new_mal) ? prev_mal : new_mal array.push(mal, next_mal < 2 ? 2 : (next_mal > 200 ? 200 : next_mal)) // graph scma = ta.ema(cma, smoothing) uptrend = scma > scma[1] downtrend = scma < scma[1] plot(scma, "Automatic MA", color=uptrend ? color.green : color.red) uptrending = close > scma and uptrend downtrending = close < scma and downtrend defy = not uptrending and not downtrending defy_cross = defy and body_touch(scma) barcolor(uptrending ? color.lime : (downtrending ? color.red : (defy_cross ? color.black : color.white))) // strategy change_to_uptrend = uptrending and downtrend[1] change_to_downtrend = downtrending and uptrend[1] long = in_date_range and change_to_uptrend short = in_date_range and change_to_downtrend if long strategy.entry("Long", strategy.long) if short strategy.entry("Short", strategy.short)