Тенденция полос Боллинджера в соответствии со стратегией

Автор:Чао Чжан, Дата: 2024-01-15 14:31:21
Тэги:

img

Обзор

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

Принципы

Стратегия основана в основном на индикаторе Bollinger Bands для определения ценовой тенденции и пунктов входа.

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

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

В частности, логика стратегии заключается:

  1. Введите длинный, когда ближайший выходит вверх от нижней линии полос.
  2. Заходите коротко, когда ближайший перерыв снижается с верхней линии полос.

Чтобы избежать ложных прорывов, добавляется фильтр скользящей средней.

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

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

  1. Длинный сигнал: закрытие прорывы полосы верхняя линия && закрытие прорывы скользящей средней
  2. Короткий сигнал: закрытие выходит полосы нижней линии && закрытие выходит скользящая средняя

После входа, стоп-лосс отслеживает среднюю линию. Выходит, когда цена снова касается средней линии.

Анализ силы

К основным сильным сторонам этой стратегии относятся:

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

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

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

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

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

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

Руководство по оптимизации

На основе анализа рисков можно сделать дальнейшие оптимизации в следующих областях:

  1. Оптимизация параметров: Использовать более систематические методы, такие как генетические алгоритмы, чтобы найти оптимальные комбинации параметров для полос и скользящих средних, чтобы сделать стратегию более стабильной и прибыльной.

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

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

  4. Оптимизация критериев поступления: Добавьте другие соображения, такие как условия тренда, ненормальный объем и т. Д., Чтобы строго выбрать время входа, избегайте ненужных записей.

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

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

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

Заключение

В заключение, Bollinger Bands Trend Following Strategy определяет ценовые тенденции с использованием индикатора полос и скользящих средних, входя в ключевые точки прорыва. Он имеет преимущества четкой логики, простоты, простоты внедрения, а также имеет области для улучшений, такие как настройка параметров, механизмы остановки потерь. Дальнейшие усовершенствования, такие как оптимизация параметров, улучшения остановки потерь, интеграции машинного обучения, могут превратить его в надежную и стабильную систему торговли алгоритмами.


/*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)

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


Больше