
Esta estratégia usa o indicador de média de dois índices para determinar a direção da tendência do mercado, em combinação com o indicador de bandas de Bryn para determinar o fenômeno de sobrecompra e sobrevenda, alcançar baixo preço de compra e venda, e sair com lucro.
Esta estratégia usa a média binária para avaliar a tendência geral do mercado, e a linha de base para avaliar o momento específico de entrada.
A operação da média binária é a de calcular uma média de curto prazo e uma média de longo prazo, respectivamente, quando a curta prazo se torna um sinal de expectativa quando a linha de curto prazo se torna um sinal de expectativa quando a linha de curto prazo se torna um sinal de expectativa quando a linha de longo prazo se torna um sinal de expectativa.
O indicador da faixa de Brin determina se o preço está sobre comprado ou sobre vendido. A faixa de Brin é a média móvel de n dias do preço de fechamento, e a largura de banda é a diferença padrão de n dias antes da média móvel. O preço está sobre comprado quando está perto da faixa de cima e super vendido quando está perto da faixa de baixo.
As regras da política são: Quando a média curta ultrapassa a média longa de baixo para cima e o preço de fechamento ultrapassa a faixa de Brin para cima, faça mais; quando a média curta ultrapassa a média longa de cima para baixo e o preço de fechamento ultrapassa a faixa de Brin para baixo, faça zero.
O ponto de parada após o aumento é o preço mais baixo nos n dias anteriores, e o ponto de parada é 1,6 vezes o preço de abertura; o ponto de parada após o fechamento é o preço mais alto nos n dias anteriores, e o ponto de parada é 1,6 vezes o preço de abertura.
Além disso, a estratégia leva em consideração o índice de EMAs em aberto para avaliar a tendência geral e evitar posições de desvantagem.
Para os riscos acima, otimizar a combinação de parâmetros da faixa de Brin, testar diferentes níveis de stop-loss e escolher o parâmetro ideal.
Esta estratégia usa a média de dois índices para avaliar o movimento geral do mercado, e o Binance para avaliar o momento específico de compra e venda, e tem um bom desempenho em dados de retrospectiva. Otimizando os parâmetros e modificando as regras, espera-se obter melhores resultados. Seu mecanismo de parada de perda também pode ser transferido para outras estratégias, com valor de referência.
/*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)