Esta estratégia identifica a direção da tendência do preço combinando três médias móveis suavizadas, índice de força relativa (RSI) e indicador de Williams, e procura oportunidades de negociação quando a tendência se inverte.
A estratégia usa três médias móveis com períodos diferentes, incluindo MA rápido, médio e lento. Quando o MA rápido cruza o MA médio, ele sinaliza uma tendência de preço ascendente. Quando o MA rápido cruza abaixo do MA médio, ele sinaliza uma tendência de preço descendente. Depois de identificar a tendência ascendente ou descendente, a estratégia aguarda a primeira oportunidade de negociação.
Especificamente, depois que o preço entra em uma tendência de alta, a estratégia espera até que as seguintes cinco condições sejam atendidas antes de ir longo:
As MAs rápidas, médias e lentas apontam para cima.
RSI superior a 50;
Aparece um padrão Williams negativo;
O preço cruza a MA lenta;
Não há posição atual.
Após o preço entrar em uma tendência de queda, a estratégia espera até que as seguintes cinco condições sejam atendidas antes de ficar curto:
As MAs rápidas, médias e lentas apontam para baixo.
RSI inferior a 50;
Aparece um padrão de Williams para cima;
O preço cruza abaixo da MA lenta;
Não há posição atual.
Após o longo ou curto, a estratégia define um stop loss a uma certa porcentagem abaixo do preço de entrada e um objetivo de lucro a uma certa porcentagem acima do preço de entrada.
A combinação de vários indicadores para confirmar entradas pode efetivamente evitar falhas. Os MAs triplos identificam a direção da tendência, Williams capta sinais de reversão e o RSI filtra a ação de preços dentro do intervalo, melhorando conjuntamente a precisão das entradas.
A definição de stop loss e take profit pode controlar o risco/recompensa de cada negociação, garantindo que as negociações vencedoras excedam as negociações perdedoras.
A lógica da estratégia é clara e fácil de entender. Os parâmetros são razoavelmente definidos.
Os indicadores podem gerar sinais incorretos durante os mercados de faixa, causando entradas desnecessárias.
O cruzamento MA rápido e médio pode apresentar falhas. Recomenda-se a utilização de outros indicadores em combinação, por exemplo, volume.
Se o stop loss estiver muito perto do preço de entrada, ele pode ser interrompido prematuramente.
Se o lucro do take for muito distante do preço de entrada, ele pode não ser atingido.
Ensaiar diferentes combinações de parâmetros para os três MA e RSI.
Adicione outros indicadores, como volume, para verificar se o volume aumenta em breakouts.
Parâmetros de ensaio baseados respectivamente em diferentes produtos.
Desenhe curvas de lucro com base nos resultados do backtest para otimizar o stop loss e o take profit.
Tente negociar em papel antes de permitir a otimização dos parâmetros.
A estratégia tem uma lógica geral clara, entrando e saindo de posições com uma combinação de indicadores, o que controla efetivamente o risco. Há um grande espaço para otimização de parâmetros. Testando diferentes configurações de parâmetros, esta estratégia pode se tornar uma estratégia de negociação quantitativa lucrativa constante. No entanto, nenhuma estratégia pode evitar completamente as perdas. Os traders precisam seguir disciplinas de negociação - tirar lucros quando ganham e cortar perdas quando perdem.
/*backtest start: 2023-08-28 00:00:00 end: 2023-09-27 00:00:00 period: 3h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //This script is a combination of 3 smoothed moving averages, and RSI. When moving averages are aligned upward (downward) and RSI is above (below) 50 and a down (up) William fractal appears, it enters long (short) position. Exiting from long and short entries are defined by StopLoss and TargetProfit. //@version=5 strategy(title="3SmmaCrossUp + Fractal + RSI", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, currency=currency.USD, commission_type=strategy.commission.percent, commission_value=0.03) ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// inputs // Global src = input(close, title="Source") stopLoss = input.float(defval = 0.1, title = "Stop Loss %", minval = 0, maxval=100, step = 0.1) targetProfit = input.float(defval = 0.4, title = "Target Profit %", minval = 0, maxval=100, step = 0.1) // Smooth Moving Average fastSmmaLen = input.int(21, minval=1, title="Fast Length", group = "Smooth Moving Average") midSmmaLen = input.int(50, minval=1, title="Mid Length",group = "Smooth Moving Average") slowSmmaLen = input.int(200, minval=1, title="Slow Length",group = "Smooth Moving Average") // RSI rsiLen = input.int(defval=14, title="length", minval=1, maxval=1000, step=1, group="RSI") // Fractals n = input.int(title="Periods", defval=2, minval=2, group = "Fractals") ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// initialization var waitingFirstTradeInUpwardTrend = false var waitingFirstTradeInDownwardTrend = false ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// functions smma(ma, src, len) => smma = 0.0 smma := na(smma[1]) ? ma : (smma[1] * (len - 1) + src) / len smma fractals(n, highs, lows) => // UpFractal bool upflagDownFrontier = true bool upflagUpFrontier0 = true bool upflagUpFrontier1 = true bool upflagUpFrontier2 = true bool upflagUpFrontier3 = true bool upflagUpFrontier4 = true for i = 1 to n upflagDownFrontier := upflagDownFrontier and (highs[n-i] < highs[n]) upflagUpFrontier0 := upflagUpFrontier0 and (highs[n+i] < highs[n]) upflagUpFrontier1 := upflagUpFrontier1 and (highs[n+1] <= highs[n] and highs[n+i + 1] < highs[n]) upflagUpFrontier2 := upflagUpFrontier2 and (highs[n+1] <= highs[n] and highs[n+2] <= highs[n] and highs[n+i + 2] < highs[n]) upflagUpFrontier3 := upflagUpFrontier3 and (highs[n+1] <= highs[n] and highs[n+2] <= highs[n] and highs[n+3] <= highs[n] and highs[n+i + 3] < highs[n]) upflagUpFrontier4 := upflagUpFrontier4 and (highs[n+1] <= highs[n] and highs[n+2] <= highs[n] and highs[n+3] <= highs[n] and highs[n+4] <= highs[n] and highs[n+i + 4] < highs[n]) flagUpFrontier = upflagUpFrontier0 or upflagUpFrontier1 or upflagUpFrontier2 or upflagUpFrontier3 or upflagUpFrontier4 upFractal = (upflagDownFrontier and flagUpFrontier) // downFractal bool downflagDownFrontier = true bool downflagUpFrontier0 = true bool downflagUpFrontier1 = true bool downflagUpFrontier2 = true bool downflagUpFrontier3 = true bool downflagUpFrontier4 = true for i = 1 to n downflagDownFrontier := downflagDownFrontier and (lows[n-i] > lows[n]) downflagUpFrontier0 := downflagUpFrontier0 and (lows[n+i] > lows[n]) downflagUpFrontier1 := downflagUpFrontier1 and (lows[n+1] >= lows[n] and lows[n+i + 1] > lows[n]) downflagUpFrontier2 := downflagUpFrontier2 and (lows[n+1] >= lows[n] and lows[n+2] >= lows[n] and lows[n+i + 2] > lows[n]) downflagUpFrontier3 := downflagUpFrontier3 and (lows[n+1] >= lows[n] and lows[n+2] >= lows[n] and lows[n+3] >= lows[n] and lows[n+i + 3] > lows[n]) downflagUpFrontier4 := downflagUpFrontier4 and (lows[n+1] >= lows[n] and lows[n+2] >= lows[n] and lows[n+3] >= lows[n] and lows[n+4] >= lows[n] and lows[n+i + 4] > lows[n]) flagDownFrontier = downflagUpFrontier0 or downflagUpFrontier1 or downflagUpFrontier2 or downflagUpFrontier3 or downflagUpFrontier4 downFractal = (downflagDownFrontier and flagDownFrontier) [upFractal, downFractal] ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// calcs [upFractal, downFractal] = fractals(n, high, low) rsiIsHigh = ta.rsi(src, rsiLen) >= 50 slowMa = ta.sma(src, slowSmmaLen) midMa = ta.sma(src, midSmmaLen) fastMa = ta.sma(src, fastSmmaLen) slowSmma = smma(slowMa ,src, slowSmmaLen) midSmma = smma(midMa, src, midSmmaLen) fastSmma = smma(fastMa, src, fastSmmaLen) isFastSmmaUpward = ta.rising(fastSmma, 1) isMidSmmaUpward = ta.rising(midSmma, 1) isSlowSmmaUpward = ta.rising(slowSmma, 1) isFastSmmaDownward = ta.falling(fastSmma, 1) isMidSmmaDownward = ta.falling(midSmma, 1) isSlowSmmaDownward = ta.falling(slowSmma, 1) slowMovingAveragesAreUpward = isMidSmmaUpward and isSlowSmmaUpward slowMovingAveragesAreDownward = isMidSmmaDownward and isSlowSmmaDownward justEnteredUpwardTrend = ta.crossover(fastSmma, midSmma) ? true : false justEnteredDownwardTrend = ta.crossunder(fastSmma, midSmma) ? true : false waitingFirstTradeInUpwardTrend := justEnteredUpwardTrend == true ? true : (isFastSmmaDownward or isMidSmmaDownward or isSlowSmmaDownward ? false : waitingFirstTradeInUpwardTrend) waitingFirstTradeInDownwardTrend := justEnteredDownwardTrend == true ? true : (isFastSmmaUpward or isMidSmmaUpward or isSlowSmmaUpward ? false : waitingFirstTradeInDownwardTrend) priceCrossedOverSlowMa = ta.crossover(close, slowSmma) priceCrossedUnderSlowMa = ta.crossunder(close, slowSmma) enterLongCondition = barstate.isconfirmed and low > fastSmma and rsiIsHigh and (downFractal or priceCrossedOverSlowMa) and waitingFirstTradeInUpwardTrend and strategy.position_size == 0 enterShortCondition = barstate.isconfirmed and high < fastSmma and (not rsiIsHigh) and (upFractal or priceCrossedUnderSlowMa) and waitingFirstTradeInDownwardTrend and strategy.position_size == 0 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// strategy if(enterLongCondition) strategy.entry(id="L", direction=strategy.long) waitingFirstTradeInUpwardTrend := false if(enterShortCondition) strategy.entry(id="S", direction=strategy.short) waitingFirstTradeInDownwardTrend := false if(strategy.position_size > 0) strategy.exit(id="EL", stop=strategy.position_avg_price * (1 - stopLoss/100), limit=strategy.position_avg_price * (1+targetProfit/100)) if(strategy.position_size < 0) strategy.exit(id="ES", stop=strategy.position_avg_price * (1 + stopLoss/100), limit=strategy.position_avg_price * (1-targetProfit/100)) ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// plots plot(series = slowSmma, title="Slow SMMA", linewidth=3) plot(series = midSmma, title="Mid SMMA", linewidth=2) plot(series = fastSmma, title="Fast SMMA", linewidth=1) plotchar(series=rsiIsHigh, title='rsiIsHigh', char='') plotchar(series=justEnteredUpwardTrend, title='justEnteredUpwardTrend', char='') plotchar(series=justEnteredDownwardTrend, title='justEnteredDownwardTrend', char='') plotchar(series=waitingFirstTradeInUpwardTrend, title='waitingFirstTradeInUpwardTrend', char='') plotchar(series=waitingFirstTradeInDownwardTrend, title='waitingFirstTradeInDownwardTrend', char='') plotchar(series=enterLongCondition, title='enterLongCondition' , char='') plotchar(series=enterShortCondition, title='enterShortCondition' , char='') plotshape(series=upFractal, title='upFractal', style=shape.triangleup, location=location.abovebar, color=#009688, size = size.tiny) plotshape(series=downFractal, title='downFractal', style=shape.triangledown, location=location.belowbar, color=color.red, size = size.tiny)