Стратегия следования за трендом на основе полос Боллинджера


Дата создания: 2024-01-15 14:31:21 Последнее изменение: 2024-01-15 14:31:21
Копировать: 0 Количество просмотров: 556
1
Подписаться
1617
Подписчики

Стратегия следования за трендом на основе полос Боллинджера

Обзор

Эта стратегия, называемая BollingerBands Trend Tracking Strategy, использует индикатор BollingerBands, чтобы определить тенденцию цены и сделать дополнительный пробел, когда цена прорывается через канал BollingerBands. Она включает в себя однолинейный фильтр, который определяет направление тенденции, когда происходит прорыв, и поэтому принимает решение о дополнительном провале.

Стратегический принцип

Стратегия основывается на показателях BollingerBands для определения ценовых тенденций и определения точек входа. BollingerBands включают в себя три линии:

  1. Средняя линия: скользящая средняя за n дней
  2. Верхняя линия: перемещение вверх на расстоянии в n дней от стандартной разницы
  3. Нижняя линия: перемещение вниз на расстоянии n дней от стандартного разрыва

Когда цена пересекает нижнюю линию, считается, что формируется тенденция к повышению; когда цена пересекает нижнюю линию, считается, что формируется тенденция к снижению.

В частности, логика стратегии заключается в следующем:

  1. Когда конечная цена пробивается вниз от Bands, сделайте дополнительный вход
  2. Когда конечная цена прорывает нижнюю линию с верхней линии Bands, декодируйте.

Чтобы отфильтровать ложные прорывы, стратегия включает в себя усредненную оценку. Вход в рынок может быть инициирован только в том случае, если цена закрытия прорывает среднюю линию одновременно с прорывом Bands.

Здесь используется экспоненциальная скользящая средняя как средний показатель.

В общем, стратегия оценивает прорыв в тренде следующим образом:

  1. Повышение сигнала: цена закрытия пробивает среднюю линию
  2. Открытый сигнал: цена закрытия пробивает нижнюю линию Bands && цена закрытия пробивает среднюю линию

После входа, стоп-модуль состоит в том, чтобы следить за средней линией. Выйти из стопа, когда цена снова касается средней линии.

Анализ преимуществ

Основные преимущества этой стратегии:

  1. Новые тенденции, которые могут быть зафиксированы в результате прорыва в середине линии. Канал Bands имеет пространство для колебаний цен, а прорыв в канале означает, что цены начинают формировать новое направление.
  2. В сочетании с однолинейной фильтрацией избегается проблема ложных прорывов, гарантируя, что они будут использоваться только в случае реального перехода.
  3. Имеет встроенный механизм остановки, который активно останавливает убытки, когда цена возвращается к средней линии Bands, эффективно контролируя риск.
  4. Стратегическая логика проста и понятна, легко понятна и реализуема, а алгоритмические стратегии подходят для количественной торговли.
  5. Используя каналы Bands и среднелинейный индикатор, нет необходимости прогнозировать цены, а лучше отслеживать тенденции на основе последующих доказательств.

Анализ рисков

Несмотря на определенные преимущества этой стратегии, существуют следующие риски:

  1. Неправильная настройка параметров Bands может привести к увеличению частоты торгов и риска торгов. Если параметры будут слишком чувствительны, то будет создано множество ложных прорывов, что приведет к частому открытию позиций системы.
  2. Неправильный выбор среднелинейных параметров может привести к пропуску реальной тенденции или созданию ложного сигнала. Параметры требуют повторного тестирования и оптимизации.
  3. Стоп-убыток зависит от центральной линии, может быть преждевременно выпущен или дается слишком много места для корректировки цены. Это может привести к тому, что вы пропустите большую часть прибыли или увеличите риск убытков.

Для управления указанными рисками можно оптимизировать следующие аспекты:

  1. Правильная корректировка параметров Bands, увеличение ширины канала и уменьшение вероятности ложного прорыва
  2. Проверка средних линий разных типов и длин, чтобы найти оптимальную комбинацию
  3. Попробуйте другие способы остановки, такие как трендовый стоп или постепенное перемещение стоп

Направление оптимизации

В соответствии с вышеприведенным анализом рисков, данная стратегия может быть оптимизирована в следующих аспектах:

  1. Параметры оптимизацииПоиск оптимального сочетания Bands и Average Line Parameters с помощью более системных методов, таких как генетические алгоритмы, делает стратегию более стабильной и прибыльной.

  2. Оптимизация убытков: тестирование различных методов остановки, таких как остановка ATR, отслеживание остановки и т. д., для определения оптимального механизма остановки.

  3. Оптимизация фильтровПопытка включить другие показатели, такие как RSI, KD и т. Д. в качестве дополнительных фильтрующих условий, снижает вероятность ложного сигнала и повышает доходность.

  4. Оптимизация условий поступленияВключение других факторов, таких как определение тенденции, аномальный VOLUME, строгий отбор времени входа, уменьшение ненужных позиций.

  5. Машинное обучениеВ частности, в рамках исследования было выявлено следующее: сбор большего количества исторических данных, моделирование с использованием моделей глубокого обучения, таких как LSTM, RNN и т. Д., использование ИИ для определения наилучших точек входа и выхода из игры.

  6. Управление динамикой риска и прибылиВключение фиксированной ставки стоп-стоп, увеличение стоп-стоп-магнитности после достижения целевой прибыли, динамическое управление рисками и доходами.

Благодаря оптимизации вышеперечисленных аспектов, такие показатели, как стабильность, доходность и способность регулировать риски, могут быть полностью улучшены, чтобы стать алгоритмической стратегией для реальных торгов.

Подвести итог

В целом, стратегия 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)

// ======================================================================================================================