Strategi ini menggunakan garis rata-rata bergerak ganda untuk menentukan arah tren pasar dikombinasikan dengan Bollinger Bands untuk mengidentifikasi kondisi overbought dan oversold, untuk mencapai membeli rendah dan menjual tinggi untuk mengambil keuntungan.
Strategi ini menggunakan rata-rata bergerak ganda untuk memastikan arah pasar secara keseluruhan, sementara mengandalkan Bollinger Bands untuk sinyal masuk tertentu.
Aturan rata-rata bergerak ganda menetapkan perhitungan garis rata-rata bergerak eksponensial jangka pendek dan jangka panjang, dengan garis jangka pendek melintasi garis jangka panjang ke atas menunjukkan sinyal beli; garis jangka pendek melintasi ke bawah melalui jangka panjang merupakan sinyal jual.
Indikator Bollinger Bands menentukan apakah harga terlalu banyak dibeli atau terlalu banyak dijual. Band tengah Bollinger Bands adalah garis rata-rata bergerak dari harga penutupan n periode, sementara lebar band mewakili standar deviasi dari rata-rata bergerak selama n periode terakhir. Harga mendekati band atas menunjukkan kondisi overbought dan yang mendekati band bawah merupakan situasi oversold.
Aturan strategi didefinisikan sebagai: Ketika garis rata-rata pendek melintasi garis rata-rata panjang ke atas ditambah harga penutupan menembus di atas band atas Bollinger, pergi panjang.
Stop loss setelah pergi panjang ditetapkan pada level terendah selama n hari terakhir, sementara take profit ditempatkan pada 1,6 kali harga masuk. Stop loss setelah short sale diikat pada level tertinggi selama n hari terakhir dengan take profit pada 0,6 kali harga masuk.
Selain itu, strategi ini mempertimbangkan indeks tren EMA untuk menghindari pembalikan tren.
Untuk mengatasi risiko di atas, optimalkan kombinasi parameter Bollinger dan uji tingkat ambang stop loss / profit capture yang berbeda untuk memilih pengaturan yang optimal.
Strategi ini telah berkinerja baik dalam backtest dengan mengkonfirmasi tren keseluruhan menggunakan rata-rata bergerak ganda dan mengandalkan Bollinger Bands untuk sinyal masuk tertentu. peningkatan kinerja tambahan dapat diantisipasi melalui optimasi parameter berkelanjutan dan modifikasi aturan. mekanisme stop loss / profit taking juga dapat ditransfer ke sistem lain untuk beradaptasi.
/*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)