A estratégia de negociação de média móvel de regressão linear gera sinais de compra e venda com base nos cruzamentos entre uma linha de regressão linear e a média móvel do preço das ações.
A estratégia primeiro calcula uma linha de regressão linear de n dias e uma média móvel de m dias do preço das ações.
Quando a média móvel cruza acima da linha de regressão, ela sinaliza o fortalecimento do ímpeto de alta e gera um sinal de compra.
Especificamente, a estratégia segue as seguintes etapas para determinar os sinais comerciais:
Calcular a linha de regressão linear de n dias de preços
Calcular a média móvel simples de m dias da lrLine chamada lrMA
Calcule a média móvel exponencial de m dias dos preços chamados ema
Quando o EMA cruzar acima do IRMA, gerar sinal de compra longEntry
Quando o EMA cruzar abaixo do IRMA, gerar sinal de venda longExit
Só considere os sinais de compra quando o mercado estiver em alta
Execução de operações com base nos sinais
Usando cruzamento entre regressão e médias móveis para determinar entradas, a estratégia pode efetivamente filtrar falhas e identificar reversões para comprar baixo e vender alto.
Os parâmetros devem ser ajustados para aumentar os períodos de média móvel e linha de regressão e reduzir a frequência de negociação. Stop-loss razoáveis devem ser implementados para controlar os riscos. Os filtros de mercado podem ser aprimorados para melhorar a precisão.
A estratégia pode ser otimizada em vários aspectos:
Optimização da média móvel através do ensaio de diferentes tipos de MAs
Optimização da linha de regressão por ajustamento do período de cálculo
Optimização do filtro de mercado através do teste de diferentes indicadores
Optimização de parâmetros através de backtesting rigoroso
Optimização do stop loss através do teste de diferentes lógicas de stop loss
Optimização dos custos através do ajustamento da frequência do comércio com base nos custos
Estas otimizações podem melhorar ainda mais a estabilidade e a rentabilidade da estratégia.
A estratégia de MA de regressão linear integra os pontos fortes da análise de tendências e da regressão linear para a identificação efetiva de reversão e compra de baixa venda alta. A estratégia direta é adequada para escolha de ações em horizontes de médio a longo prazo. Com ajuste de parâmetros e controle de risco, a estratégia pode alcançar uma estabilidade ainda maior.
/*backtest start: 2022-10-18 00:00:00 end: 2023-10-24 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/ // © lazy_capitalist //@version=5 strategy('Linear Regression MA', overlay=true, initial_capital=10000) datesGroup = "Date Info" startMonth = input.int(defval = 1, title = "Start Month", minval = 1, maxval = 12, group=datesGroup) startDay = input.int(defval = 1, title = "Start Day", minval = 1, maxval = 31, group=datesGroup) startYear = input.int(defval = 2022, title = "Start Year", minval = 1970, group=datesGroup) averagesGroup = "Averages" lrLineInput = input.int(title="Linear Regression Line", defval=55, minval = 1, group=averagesGroup) lrMAInput = input.int(title="Linear Regression MA", defval=55, minval = 1, group=averagesGroup) emaInput = input.int(title="EMA Length", defval=55, minval = 1, group=averagesGroup) tradesGroup = "Execute Trades" executeLongInput = input.bool(title="Execute Long Trades", defval=true) executeShortInput = input.bool(title="Execute Short Trades", defval=true) executeStopLoss = input.bool(title="Execute Stop Loss", defval=true) fourHrSMAExpr = ta.sma(close, 200) fourHrMA = request.security(symbol=syminfo.tickerid, timeframe="240", expression=fourHrSMAExpr) bullish = close > fourHrMA ? true : false maxProfitInput = input.float( title="Max Profit (%)", defval=10.0, minval=0.0) * 0.01 stopLossPercentageInput = input.float( title="Stop Loss (%)", defval=1.75, minval=0.0) * 0.01 start = timestamp(startYear, startMonth, startDay, 00, 00) // backtest start window window() => time >= start ? true : false // create function "within window of time" showDate = input(defval = true, title = "Show Date Range") lrLine = ta.linreg(close, lrLineInput, 0) lrMA = ta.sma(lrLine, lrMAInput) ema = ta.ema(close, emaInput) longEntry = ema < lrMA longExit = lrMA < ema shortEntry = lrMA < ema shortExit = ema < lrMA maxProfitLong = strategy.opentrades.entry_price(0) * (1 + maxProfitInput) maxProfitShort = strategy.opentrades.entry_price(0) * (1 - maxProfitInput) stopLossPriceShort = strategy.position_avg_price * (1 + stopLossPercentageInput) stopLossPriceLong = strategy.position_avg_price * (1 - stopLossPercentageInput) if(executeLongInput and bullish) strategy.entry( id="long_entry", direction=strategy.long, when=longEntry and window(), qty=10, comment="long_entry") strategy.close( id="long_entry", when=longExit, comment="long_exit") // strategy.close( id="long_entry", when=maxProfitLong <= close, comment="long_exit_mp") if(executeShortInput and not bullish) strategy.entry( id="short_entry", direction=strategy.short, when=shortEntry and window(), qty=10, comment="short_entry") strategy.close( id="short_entry", when=shortExit, comment="short_exit") // strategy.close( id="short_entry", when=maxProfitShort <= close, comment="short_exit_mp") if(strategy.position_size > 0 and executeStopLoss) strategy.exit( id="long_entry", stop=stopLossPriceLong, comment="exit_long_SL") strategy.exit( id="short_entry", stop=stopLossPriceShort, comment="exit_short_SL") // plot(series=lrLine, color=color.green) plot(series=lrMA, color=color.red) plot(series=ema, color=color.blue)