Esta estratégia combina a média móvel, o indicador Laguerre RSI e o indicador ADX para implementar a negociação de ruptura. Ela vai longa quando a média móvel rápida cruza acima da média móvel lenta, o Laguerre RSI é maior que 80, e o ADX é maior que 20; ela vai curta quando a média móvel rápida cruza abaixo da média móvel lenta, o Laguerre RSI é menor que 20 e o ADX é maior que 20. Esta estratégia capta as características de impulso do mercado e entra no mercado no início do desenvolvimento da tendência.
A estratégia utiliza principalmente os seguintes indicadores para determinar as tendências e o calendário de entrada:
Combinação de média móvel: EMA de 16 dias, EMA de 48 dias, SMA de 200 dias. Uma tendência de alta é determinada quando a média de curto prazo cruza acima da média de longo prazo e uma tendência de queda quando cruza abaixo.
Indicador RSI de Laguerre para determinar zonas de sobrecompra e sobrevenda.
Indicador ADX para determinar o estado da tendência.
Os sinais de entrada são determinados pela direção da combinação da média móvel, o tempo de entrada pelo RSI de Laguerre e os mercados não-trending são filtrados pelo ADX. Os sinais de saída são gerados quando as médias móveis cruzam de volta.
As vantagens desta estratégia incluem:
Captura de impulso da tendência: A estratégia só entra no mercado no início do desenvolvimento da tendência, capturando lucros exponenciais das tendências.
Perdas limitadas: as perdas de parada definidas adequadamente limitam as perdas de negócios individuais.
Indicadores combinados precisos: As médias móveis, Laguerre RSI e ADX podem determinar com relativa precisão a direção do mercado e o momento da entrada.
Implementação simples: a estratégia utiliza apenas 3 indicadores e é fácil de compreender e implementar.
Há também alguns riscos para a estratégia:
Riscos de inversão de tendência: como uma estratégia de tendência, podem ocorrer grandes perdas se as inversões de tendência não forem detectadas a tempo.
Riscos de retirada: Em mercados variáveis, podem ocorrer paradas que levam a retirada de contas.
Riscos de otimização de parâmetros: os parâmetros dos indicadores devem ser ajustados para diferentes mercados para evitar falhas.
Contramedidas:
O valor da posição em risco deve ser calculado de acordo com o método de classificação da posição em risco.
Otimizar os parâmetros do indicador e os limiares de ruptura.
Usar a cobertura de futuros, etc., para gerir os drawdowns.
Algumas maneiras de otimizar a estratégia incluem:
Optimização de parâmetros: teste de combinações de períodos de média móvel, parâmetros RSI de Laguerre, parâmetros ADX para encontrar configurações ideais.
Optimização do breakout: testar diferentes limiares de breakout da média móvel para equilibrar a frequência e a rentabilidade das transações.
Optimização da entrada: Teste outros indicadores combinados com o RSI de Laguerre para um cronograma de entrada mais preciso.
Optimização de saída: pesquise outros sinais de saída em combinação com médias móveis.
Optimização do lucro versus stop loss: Teste diferentes estratégias para otimizar os retornos.
Em resumo, esta estratégia captura efetivamente os movimentos da tendência usando a combinação de médias móveis, Laguerre RSI e ADX para determinar entradas e saídas. Ao entrar cedo nos desenvolvimentos da tendência e seguir de perto as corridas da tendência, lucros exponenciais podem ser feitos, enquanto stop losses ajudam a limitar as perdas. A estratégia é adequada para investidores confortáveis fazendo julgamentos de mercado, bem como aqueles que fazem negociação automatizada após otimização de parâmetros.
/*backtest start: 2023-12-05 00:00:00 end: 2023-12-12 00:00:00 period: 1m basePeriod: 1m 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/ // © PtGambler //@version=5 strategy("3MA + Laguerre RSI + ADX [Pt]", shorttitle = "3MA+LaRSI+ADX[Pt]", overlay=true, initial_capital = 10000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, calc_on_order_fills = false, max_bars_back = 500) // ********************************** Trade Period / Strategy Setting ************************************** startY = input(title='Start Year', defval=2011, group = "Backtesting window") startM = input.int(title='Start Month', defval=1, minval=1, maxval=12, group = "Backtesting window") startD = input.int(title='Start Day', defval=1, minval=1, maxval=31, group = "Backtesting window") finishY = input(title='Finish Year', defval=2050, group = "Backtesting window") finishM = input.int(title='Finish Month', defval=12, minval=1, maxval=12, group = "Backtesting window") finishD = input.int(title='Finish Day', defval=31, minval=1, maxval=31, group = "Backtesting window") timestart = timestamp(startY, startM, startD, 00, 00) timefinish = timestamp(finishY, finishM, finishD, 23, 59) use_entry_sess = input.bool(false, 'Use Entry Session Window', group = "Trading Session") t1_session = input("0930-1555:23456", "Entry Session", group="Trading Session", tooltip = "Entry Signal only generated within this period.") t1 = time(timeframe.period, t1_session) window = true margin_req = input.float(1, title="Margin Requirement / Leverage", step=0.1, group = "Trading Options") qty_per_trade = input.float(100, title = "% of initial capital per trade", group = "Trading Options") reinvest = input.bool(defval=false,title="Reinvest profit", group = "Trading Options") reinvest_percent = input.float(defval=100, title = "Reinvest percentage", group="Trading Options") close_eod = input.bool(false, "All trades will close at the close of trading window", group = "Trading Options") close_b4_open = input.bool(false, "Position must hit either SL/PT before entering new trade", group = "Trading Options") profit = strategy.netprofit strategy.initial_capital = 50000 float trade_amount = math.floor(strategy.initial_capital*margin_req / close) if strategy.netprofit > 0 and reinvest trade_amount := math.floor((strategy.initial_capital* (qty_per_trade/100)+(profit*reinvest_percent*0.01))*margin_req/ close) else trade_amount := math.floor(strategy.initial_capital* (qty_per_trade/100)*margin_req / close) // ****************************************************************************************** group_ma = "Moving Average Ribbon" group_larsi = "Laguerre RSI" group_adx = "ADX" group_SL = "Stop Loss / Profit Target" // ----------------------------------------- MA Ribbon ------------------------------------- ema1_len = input.int(16, "Fast EMA Length", group = group_ma) ema2_len = input.int(48, "Slow EMA Length ", group = group_ma) sma1_len = input.int(200, "Slow SMA Length", group = group_ma) ema1 = ta.ema(close, ema1_len) ema2 = ta.ema(close, ema2_len) sma1 = ta.sma(close, sma1_len) plot(ema1, "EMA 1", color.white, linewidth = 2) plot(ema2, "EMA 2", color.yellow, linewidth = 2) plot(sma1, "SMA 1", color.purple, linewidth = 2) ma_bull = ema1 > ema2 and ema2 > sma1 ma_bear = ema1 < ema2 and ema2 < sma1 // ------------------------------------------ Laguerre RSI --------------------------------------- alpha = input.float(0.2, title='Alpha', minval=0, maxval=1, step=0.1, group = group_larsi) gamma = 1 - alpha L0 = 0.0 L0 := (1 - gamma) * close + gamma * nz(L0[1]) L1 = 0.0 L1 := -gamma * L0 + nz(L0[1]) + gamma * nz(L1[1]) L2 = 0.0 L2 := -gamma * L1 + nz(L1[1]) + gamma * nz(L2[1]) L3 = 0.0 L3 := -gamma * L2 + nz(L2[1]) + gamma * nz(L3[1]) cu = (L0 > L1 ? L0 - L1 : 0) + (L1 > L2 ? L1 - L2 : 0) + (L2 > L3 ? L2 - L3 : 0) cd = (L0 < L1 ? L1 - L0 : 0) + (L1 < L2 ? L2 - L1 : 0) + (L2 < L3 ? L3 - L2 : 0) temp = cu + cd == 0 ? -1 : cu + cd LaRSI = temp == -1 ? 0 : cu / temp LaRSI := LaRSI * 100 bull_LaRSI = LaRSI > 80 bear_LaRSI = LaRSI < 20 // --------------------------------------- ADX ------------------------ adxlen = input(14, title="ADX Smoothing", group = group_adx) dilen = input(14, title="DI Length", group = group_adx) dirmov(len) => up = ta.change(high) down = -ta.change(low) plusDM = na(up) ? na : (up > down and up > 0 ? up : 0) minusDM = na(down) ? na : (down > up and down > 0 ? down : 0) truerange = ta.rma(ta.tr, len) plus = fixnan(100 * ta.rma(plusDM, len) / truerange) minus = fixnan(100 * ta.rma(minusDM, len) / truerange) [plus, minus] adx(dilen, adxlen) => [plus, minus] = dirmov(dilen) sum = plus + minus adx = 100 * ta.rma(math.abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen) sig = adx(dilen, adxlen) active_adx = sig > 20 //and sig > sig[1] // ******************************* Profit Target / Stop Loss ********************************************* use_SLPT = input.bool(false, 'Use Fixed SL / PT', group = group_SL) SL = input.float(50, 'Stop loss in ticks', step = 1, group = group_SL) * syminfo.mintick PT = input.float(100, "Profit target in ticks", step = 1, group = group_SL) * syminfo.mintick var L_PT = 0.0 var S_PT = 0.0 var L_SL = 0.0 var S_SL = 0.0 if strategy.position_size > 0 L_SL := L_SL[1] L_PT := L_PT[1] else if strategy.position_size < 0 S_SL := S_SL[1] S_PT := S_PT[1] else L_SL := close - SL L_PT := close + PT S_SL := close + SL S_PT := close - PT entry_line = plot(use_SLPT and strategy.position_size != 0 ? strategy.opentrades.entry_price(0) : na, "Entry Price", color.white, linewidth = 1, style = plot.style_linebr) L_PT_line = plot(use_SLPT and strategy.position_size > 0 ? L_PT : na, "L PT", color.green, linewidth = 2, style = plot.style_linebr) S_PT_line = plot(use_SLPT and strategy.position_size < 0 ? S_PT : na, "S PT", color.green, linewidth = 2, style = plot.style_linebr) L_SL_line = plot(use_SLPT and strategy.position_size > 0 ? L_SL : na, "L SL", color.red, linewidth = 2, style = plot.style_linebr) S_SL_line = plot(use_SLPT and strategy.position_size < 0 ? S_SL : na, "S SL", color.red, linewidth = 2, style = plot.style_linebr) fill(L_PT_line, entry_line, color = color.new(color.green,90)) fill(S_PT_line, entry_line, color = color.new(color.green,90)) fill(L_SL_line, entry_line, color = color.new(color.red,90)) fill(S_SL_line, entry_line, color = color.new(color.red,90)) // ---------------------------------- Strategy setup ------------------------------------------------------ L_entry1 = ma_bull and bull_LaRSI and active_adx S_entry1 = ma_bear and bear_LaRSI and active_adx L_exit1 = ta.crossunder(ema1, ema2) S_exit1 = ta.crossover(ema1, ema2) // Trigger zones bgcolor(ma_bull ? color.new(color.green ,90) : na) bgcolor(ma_bear ? color.new(color.red,90) : na) if L_entry1 and (use_entry_sess ? window : true) and (close_b4_open ? strategy.position_size == 0 : true) strategy.entry("Long", strategy.long, trade_amount) if S_entry1 and (use_entry_sess ? window : true) and (close_b4_open ? strategy.position_size == 0 : true) strategy.entry("Short", strategy.short, trade_amount) if use_SLPT strategy.exit("Exit Long", "Long", limit = L_PT, stop = L_SL, comment_profit = "Exit Long, PT hit", comment_loss = "Exit Long, SL hit") strategy.exit("Exit Short", "Short", limit = S_PT, stop = S_SL, comment_profit = "Exit Short, PT hit", comment_loss = "Exit Short, SL hit") else if L_exit1 strategy.close("Long", comment = "Exit Long") if S_exit1 strategy.close("Short", comment = "Exit Short") if use_entry_sess and not window and close_eod strategy.close_all(comment = "EOD close")