
Эта стратегия, называемая BollingerBands Trend Tracking Strategy, использует индикатор BollingerBands, чтобы определить тенденцию цены и сделать дополнительный пробел, когда цена прорывается через канал BollingerBands. Она включает в себя однолинейный фильтр, который определяет направление тенденции, когда происходит прорыв, и поэтому принимает решение о дополнительном провале.
Стратегия основывается на показателях BollingerBands для определения ценовых тенденций и определения точек входа. BollingerBands включают в себя три линии:
Когда цена пересекает нижнюю линию, считается, что формируется тенденция к повышению; когда цена пересекает нижнюю линию, считается, что формируется тенденция к снижению.
В частности, логика стратегии заключается в следующем:
Чтобы отфильтровать ложные прорывы, стратегия включает в себя усредненную оценку. Вход в рынок может быть инициирован только в том случае, если цена закрытия прорывает среднюю линию одновременно с прорывом Bands.
Здесь используется экспоненциальная скользящая средняя как средний показатель.
В общем, стратегия оценивает прорыв в тренде следующим образом:
После входа, стоп-модуль состоит в том, чтобы следить за средней линией. Выйти из стопа, когда цена снова касается средней линии.
Основные преимущества этой стратегии:
Несмотря на определенные преимущества этой стратегии, существуют следующие риски:
Для управления указанными рисками можно оптимизировать следующие аспекты:
В соответствии с вышеприведенным анализом рисков, данная стратегия может быть оптимизирована в следующих аспектах:
Параметры оптимизацииПоиск оптимального сочетания Bands и Average Line Parameters с помощью более системных методов, таких как генетические алгоритмы, делает стратегию более стабильной и прибыльной.
Оптимизация убытков: тестирование различных методов остановки, таких как остановка ATR, отслеживание остановки и т. д., для определения оптимального механизма остановки.
Оптимизация фильтровПопытка включить другие показатели, такие как RSI, KD и т. Д. в качестве дополнительных фильтрующих условий, снижает вероятность ложного сигнала и повышает доходность.
Оптимизация условий поступленияВключение других факторов, таких как определение тенденции, аномальный VOLUME, строгий отбор времени входа, уменьшение ненужных позиций.
Машинное обучениеВ частности, в рамках исследования было выявлено следующее: сбор большего количества исторических данных, моделирование с использованием моделей глубокого обучения, таких как LSTM, RNN и т. Д., использование ИИ для определения наилучших точек входа и выхода из игры.
Управление динамикой риска и прибылиВключение фиксированной ставки стоп-стоп, увеличение стоп-стоп-магнитности после достижения целевой прибыли, динамическое управление рисками и доходами.
Благодаря оптимизации вышеперечисленных аспектов, такие показатели, как стабильность, доходность и способность регулировать риски, могут быть полностью улучшены, чтобы стать алгоритмической стратегией для реальных торгов.
В целом, стратегия BollingerBands для отслеживания трендов использует индикатор Bands и среднюю линию для определения ценовой тенденции, вступает в игру при прорыве ключевых точек, относится к стратегии типа отслеживания трендов. Она обладает преимуществами четкости суждения, логической лаконичности, простоты реализации и т. Д. Также существуют некоторые оптимизируемые параметры, такие как оптимизация и остановка потерь.
/*backtest
start: 2023-12-15 00:00:00
end: 2024-01-14 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//VERSION =================================================================================================================
//@version=5
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// This strategy is intended to study.
// It can also be used to signal a bot to open a deal by providing the Bot ID, email token and trading pair in the strategy settings screen.
// As currently written, this strategy uses a Bollinger Bands for trend folling, you can use a EMA as a filter.
//Autor Credsonb (M4TR1X_BR)
//▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
//STRATEGY ================================================================================================================
strategy(title = 'BT-Bollinger Bands - Trend Following',
shorttitle = 'BBTF',
overlay = true )
//▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
// CONFIG =================================================================================================================
// TIME INPUTS
usefromDate = input.bool(defval = true, title = 'Start date', inline = '0', group = "Time Filters")
initialDate = input(defval = timestamp('01 Jan 2022 00:00 UTC'), title = '', inline = "0",group = 'Time Filters',tooltip="This start date is in the time zone of the exchange ")
usetoDate = input.bool(defval = true, title = 'End date', inline = '1', group = "Time Filters")
finalDate = input(defval = timestamp('31 Dec 2029 23:59 UTC'), title = '', inline = "1",group = 'Time Filters',tooltip="This end date is in the time zone of the exchange")
// TIME LOGIC
inTradeWindow = true
// ENABLE LONG SHORT OPTIONS
string entrygroup ='Long/Short Options ==================================='
checkboxLong = input.bool(defval=true, title="Enable Long Entrys",group=entrygroup)
checkboxShort = input.bool(defval=true, title="Enable Short Entrys",group=entrygroup)
// BOLLINGER BANDS INPUTS ==================================================================================================
string bbgroup ='Bollinger Bands ======================================'
bbLength = input.int(defval=20,title='BB Length', minval=1, step=5, group=bbgroup)
bbStddev = input.float(defval=2, title='BB StdDev', minval=0.5, group=bbgroup)
//BOLLINGER BANDS LOGIC
[bbMiddle, bbUpper, bbLower] = ta.bb(close, bbLength, bbStddev)
// MOVING AVERAGES INPUTS ================================================================================================
string magroup = 'Moving Average ======================================='
useEma = input.bool(defval = true, title = 'Moving Average Filter',inline='', group= magroup,tooltip='This will enable or disable Exponential Moving Average Filter on Strategy')
emaType=input.string (defval='Ema',title='Type',options=['Ema','Sma'],inline='', group= magroup)
emaSource = input.source(defval=close,title=" Source",inline="", group= magroup)
emaLength = input.int(defval=100,title="Length",minval=0,inline='', group= magroup)
// MOVING AVERAGE LOGIC
float ema = emaType=='Ema'? ta.ema(emaSource,emaLength): ta.sma(emaSource,emaLength)
// BOT MESSAGES
string msgroup='Alert Message For Bot ================================'
messageEntry = input.string("", title="Strategy Entry Message",group=msgroup)
messageExit =input.string("",title="Strategy Exit Message",group=msgroup)
messageClose = input.string("", title="Strategy Close Message",group=msgroup)
// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
// POSITIONS =============================================================================================================
//VERIFY IF THE BUY FILTERS ARE ON OR OFF
bool emaFilterBuy = useEma? (close > ema):(close >= ema) or (close <= ema)
//LONG / SHORT POSITIONS LOGIC
bool openLongPosition = (close[1] < bbUpper) and (close > bbUpper) and (emaFilterBuy)
bool openShortPosition = (close[1] > bbLower) and (close < bbLower) and (emaFilterBuy)
//bool closeLongPosition = (close > bbMiddle)
//bool closeShortPosition= (close < bbLower)
// CHEK OPEN POSITONS =====================================================================================================
// open signal when not already into a position
bool validOpenLongPosition = openLongPosition and strategy.opentrades.size(strategy.opentrades - 1) <= 0
bool longIsActive = validOpenLongPosition or strategy.opentrades.size(strategy.opentrades - 1) > 0
bool validOpenShortPosition = openShortPosition and strategy.opentrades.size(strategy.opentrades - 1) <= 0
bool shortIsActive = validOpenShortPosition or strategy.opentrades.size(strategy.opentrades - 1) < 0
longEntryPoint = high
if (openLongPosition) and (inTradeWindow) and (checkboxLong)
strategy.entry(id = 'Long Entry', direction = strategy.long, stop = longEntryPoint, alert_message=messageEntry)
if not (openLongPosition)
strategy.cancel('Long Entry')
//submit exit orders for trailing take profit price
if (longIsActive) and (inTradeWindow)
strategy.exit(id = 'Long Exit', stop=bbMiddle, alert_message=messageExit)
//if (closeLongPosition)
// strategy.close(id = 'Long Entry', alert_message=messageClose)
shortEntryPoint = low
if (openShortPosition) and (inTradeWindow) and (checkboxShort)
strategy.entry(id = 'Short Entry', direction = strategy.short, stop = shortEntryPoint, alert_message=messageEntry)
if not(openShortPosition)
strategy.cancel('Short Entry')
if (shortIsActive)
strategy.exit(id = 'Short Exit', stop = bbMiddle, alert_message=messageExit)
//if (closeShortPosition)
//strategy.close(id = 'Short Close', alert_message=messageClose)
// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
// PLOTS ===============================================================================================================
// TRADE WINDOW ========================================================================================================
bgcolor(color = inTradeWindow ? color.new(#089981,90):na, title = 'Time Window')
// EMA/SMA
var emafilterColor = color.new(color.white, 0)
plot(series=useEma? ema:na, title = 'EMA Filter', color = emafilterColor, linewidth = 2, style = plot.style_line)
// BOLLINGER BANDS
plot(series=bbUpper, title = "Upper Band", color = color.aqua)//, display = display.none)
plot(series=bbMiddle, title = "MA Band", color = color.red)//, display = display.none)
plot(series=bbLower, title = "Lower Band", color = color.aqua)//, display = display.none)
// PAINT BARS COLORS
bool bulls = (close[1] < bbUpper[1]) and (close > bbUpper)
bool bears = (close[1] > bbLower [1]) and (close < bbLower)
neutral_color = color.new(color.black, 100)
barcolors = bulls ? color.green : bears ? color.red : neutral_color
barcolor(barcolors)
// ======================================================================================================================