Esta estratégia utiliza duas linhas médias móveis para determinar a direção da tendência do mercado combinadas com Bandas de Bollinger para identificar condições de sobrecompra e sobrevenda, a fim de alcançar a compra baixa e a venda alta para obter lucro.
A estratégia utiliza médias móveis duplas para determinar a direção geral do mercado, contando com Bandas de Bollinger para sinais de entrada específicos.
A regra da média móvel dupla estipula o cálculo de uma linha média móvel exponencial de curto prazo e de longo prazo, com a linha de curto prazo cruzando a linha de longo prazo para cima indicando um sinal de compra; a linha de curto prazo cruzando para baixo através do longo prazo constitui um sinal de venda.
O indicador Bollinger Bands determina se os preços estão sobrecomprados ou sobrevendidos. A faixa média de Bollinger Bands é a linha média móvel dos preços de fechamento de n períodos, enquanto a largura da faixa representa o desvio padrão da média móvel nos últimos n períodos. Os preços que se aproximam da faixa superior indicam uma condição de sobrecompra e aqueles que se aproximam da faixa inferior constituem uma situação de sobrevenda.
As regras de estratégia são definidas como: Quando a linha média curta cruza a linha média longa para cima mais o preço de fechamento penetrando acima da faixa superior de Bollinger, vá longo.
O stop loss após uma venda curta é fixado ao máximo máximo durante os últimos n dias com o take profit em 0,6 vezes o preço de entrada.
Além disso, a estratégia considera o índice de tendência do EMA para evitar inversões de tendência.
Para abordar os riscos acima, otimizar as combinações dos parâmetros de Bollinger e testar diferentes níveis de limiar de stop loss/captura de lucro para selecionar configurações ideais.
Esta estratégia tem um desempenho credível nos backtests, confirmando a tendência geral usando médias móveis duplas e contando com Bandas de Bollinger para sinais de entrada específicos. Melhorias adicionais de desempenho podem ser antecipadas através da otimização contínua de parâmetros e modificações de regras.
/*backtest start: 2023-12-05 00:00:00 end: 2023-12-06 22:00:00 period: 15m basePeriod: 5m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This close code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © AugustoErni //@version=5 strategy('Bollinger Bands Modified (Stormer)', overlay=true) bbL = input.int(20, title='BB Length/Comprimento da Banda de Bollinger', minval=1, step=1, tooltip='Calculate the length of bollinger bands./Calcula o comprimento das bandas de bollinger.') mult = input.float(0.38, title='BB Standard Deviation/Desvio Padrão da Banda de Bollinger', minval=0.01, step=0.01, tooltip='Calculate the standard deviation of bollinger bands./Calcula o desvio padrão das bandas de bollinger.') emaL = input.int(80, title='EMA Length/Comprimento da Média Móvel Exponencial', minval=1, step=1, tooltip='Calculate the length of EMA./Calcula o comprimento da EMA.') highestHighL = input.int(7, title='Highest High Length/Comprimento da Alta Maior', minval=1, step=1, tooltip='Fetches the highest high candle from length input. Use to set stop loss for short position./Obtém a vela de maior alta com base na medida fornecida. Usa para definir o stop loss para uma posição curta.') lowestLowL = input.int(7, title='Lowest Low Length/Comprimento da Baixa Menor', minval=1, step=1, tooltip='Fetches the lowest low candle from length input. Use to set stop loss for long position./Obter a vela de menor baixa com base na medida fornecida. Usa para definir o stop loss para uma posição longa.') targetFactor = input.float(1.6, title='Target Take Profit/Objetivo de Lucro Alvo', minval=0.1, step=0.1, tooltip='Calculate the take profit factor when entry position./Calcula o fator do alvo lucro ao entrar na posição.') emaTrend = input.bool(true, title='Check Trend EMA/Verificar Tendência da Média Móvel Exponencial', tooltip='Use EMA as trend verify for opening position./Usa a EMA como verificação de tendência para abrir posição.') crossoverCheck = input.bool(false, title='Add Another Crossover Check/Adicionar Mais uma Verificação de Cruzamento Superior', tooltip='This option is to add one more veryfication attempt to check if price is crossover upper bollinger band./Esta opção é para adicionar uma verificação adicional para avaliar se o preço cruza a banda superior da banda de bollinger.') crossunderCheck = input.bool(false, title='Add Another Crossunder Check/Adicionar Mais uma Verificação de Cruzamento Inferior', tooltip='This option is to add one more veryfication attempt to check if price is crossunder lower bollinger band./Esta opção é para adicionar uma verificação adicional para avaliar se o preço cruza a banda inferior da banda de bollinger.') insideBarPatternCheck = input.bool(true, title='Show Inside Bar Pattern/Mostrar Padrão de Inside Bar', tooltip='This option is to show possible inside bar pattern./Esta opção é para mostrar um possível padrão de inside bar.') [middle, upper, lower] = ta.bb(close, bbL, mult) ema = ta.ema(close, emaL) highestHigh = ta.highest(high, highestHighL) lowestLow = ta.lowest(low, lowestLowL) isCrossover = ta.crossover(close, upper) ? 1 : 0 isCrossunder = ta.crossunder(close, lower) ? 1 : 0 isPrevBarHighGreaterCurBarHigh = high[1] > high ? 1 : 0 isPrevBarLowLesserCurBarLow = low[1] < low ? 1 : 0 isInsideBar = isPrevBarHighGreaterCurBarHigh and isPrevBarLowLesserCurBarLow ? 1 : 0 isBarLong = ((close - open) > 0) ? 1 : 0 isBarShort = ((close - open) < 0) ? 1 : 0 isLongCross = crossoverCheck ? ((isBarLong and not isBarShort) and (open < upper and close > upper)) ? 1 : 0 : isCrossover ? 1 : 0 isShortCross = crossunderCheck ? ((isBarShort and not isBarLong) and (close < lower and open > lower)) ? 1 : 0 : isCrossunder ? 1 : 0 isCandleAboveEma = close > ema ? 1 : 0 isCandleBelowEma = close < ema ? 1 : 0 isLongCondition = emaTrend ? isLongCross and isCandleAboveEma ? 1 : 0 : isLongCross isShortCondition = emaTrend ? isShortCross and isCandleBelowEma ? 1 : 0 : isShortCross isPositionNone = strategy.position_size == 0 ? 1 : 0 isPositionLong = strategy.position_size > 0 ? 1 : 0 isPositionShort = strategy.position_size < 0 ? 1 : 0 var float enterLong = 0.0 var float stopLossLong = 0.0 var float targetLong = 0.0 var float enterShort = 0.0 var float stopLossShort = 0.0 var float targetShort = 0.0 var bool isLongEntry = false var bool isShortEntry = false if (isPositionNone) isLongEntry := false isShortEntry := false enterLong := 0.0 stopLossLong := 0.0 targetLong := 0.0 enterShort := 0.0 stopLossShort := 0.0 targetShort := 0.0 if (isPositionShort or isPositionNone) isLongEntry := false enterLong := 0.0 stopLossLong := 0.0 targetLong := 0.0 if (isPositionLong or isPositionNone) isShortEntry := false enterShort := 0.0 stopLossShort := 0.0 targetShort := 0.0 if (isPositionLong and isLongEntry) isLongEntry := true isShortEntry := false enterShort := 0.0 stopLossShort := 0.0 targetShort := 0.0 if (isPositionShort and isShortEntry) isShortEntry := true isLongEntry := false enterLong := 0.0 stopLossLong := 0.0 targetLong := 0.0 if (isLongCondition and not isLongEntry) isLongEntry := true enterLong := close stopLossLong := lowestLow targetLong := (enterLong + (math.abs(enterLong - stopLossLong) * targetFactor)) alertMessage = '{ "side/lado": "buy", "entry/entrada": ' + str.tostring(enterLong) + ', "stop": ' + str.tostring(stopLossLong) + ', "target/alvo": ' + str.tostring(targetLong) + ' }' alert(alertMessage) strategy.entry('Long', strategy.long) strategy.exit('Exit Long', 'Long', stop=stopLossLong, limit=targetLong) if (isShortCondition and not isShortEntry) isShortEntry := true enterShort := close stopLossShort := highestHigh targetShort := (enterShort - (math.abs(enterShort - stopLossShort) * targetFactor)) alertMessage = '{ "side/lado": "sell", "entry/entrada": ' + str.tostring(enterShort) + ', "stop": ' + str.tostring(stopLossShort) + ', "target/alvo": ' + str.tostring(targetShort) + ' }' alert(alertMessage) strategy.entry('Short', strategy.short) strategy.exit('Exit Short', 'Short', stop=stopLossShort, limit=targetShort) plot(upper, title='Upper Band', color=color.blue) plot(middle, title='Middle Band', color=color.gray) plot(lower, title='Lower Band', color=color.blue) plot(ema, title='EMA', color=color.white) barcolor(insideBarPatternCheck and isInsideBar and isBarLong ? color.lime : insideBarPatternCheck and isInsideBar and isBarShort ? color.maroon : na, title='Inside Bar Color in Long Bar Long and in Short Bar Short/Cor do Inside Bar em Barra Longa Longa e em Barra Curta Curta') tablePosition = position.bottom_right tableColumns = 2 tableRows = 5 tableFrameWidth = 1 tableBorderColor = color.gray tableBorderWidth = 1 tableInfoTrade = table.new(position=tablePosition, columns=tableColumns, rows=tableRows, frame_width=tableFrameWidth, border_color=tableBorderColor, border_width=tableBorderWidth) table.cell(table_id=tableInfoTrade, column=0, row=0) table.cell(table_id=tableInfoTrade, column=1, row=0) table.cell(table_id=tableInfoTrade, column=0, row=1, text='Entry Side/Lado da Entrada', text_color=color.white) table.cell(table_id=tableInfoTrade, column=0, row=2, text=isLongEntry ? 'LONG' : isShortEntry ? 'SHORT' : 'NONE/NENHUM', text_color=color.yellow) table.cell(table_id=tableInfoTrade, column=1, row=1, text='Entry Price/Preço da Entrada', text_color=color.white) table.cell(table_id=tableInfoTrade, column=1, row=2, text=isLongEntry ? str.tostring(enterLong) : isShortEntry ? str.tostring(enterShort) : 'NONE/NENHUM', text_color=color.blue) table.cell(table_id=tableInfoTrade, column=0, row=3, text='Take Profit Price/Preço Alvo Lucro', text_color=color.white) table.cell(table_id=tableInfoTrade, column=0, row=4, text=isLongEntry ? str.tostring(targetLong) : isShortEntry ? str.tostring(targetShort) : 'NONE/NENHUM', text_color=color.green) table.cell(table_id=tableInfoTrade, column=1, row=3, text='Stop Loss Price/Preço Stop Loss', text_color=color.white) table.cell(table_id=tableInfoTrade, column=1, row=4, text=isLongEntry ? str.tostring(stopLossLong) : isShortEntry ? str.tostring(stopLossShort) : 'NONE/NENHUM', text_color=color.red)