Анализ адаптивной стратегии полос Боллинджера на основе последовательности Фибоначчи

ATR BB SMA FIB
Дата создания: 2025-01-06 16:41:48 Последнее изменение: 2025-01-06 16:41:48
Копировать: 2 Количество просмотров: 434
1
Подписаться
1617
Подписчики

Анализ адаптивной стратегии полос Боллинджера на основе последовательности Фибоначчи

Обзор

Эта стратегия представляет собой инновационную торговую систему, объединяющую последовательность Фибоначчи и полосы Боллинджера. Он формирует уникальную систему оценки диапазона колебаний цен, заменяя множители стандартных отклонений традиционных полос Боллинджера на соотношение Фибоначчи (1,618, 2,618, 4,236). Стратегия включает в себя полный набор функций управления транзакциями, включая настройки стоп-профита и стоп-лосса, а также фильтрацию временных окон транзакций, что делает ее очень практичной и гибкой.

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

Основная логика стратегии основана на взаимодействии цены и полос Фибоначчи-Боллинджера. Сначала рассчитайте простую скользящую среднюю (SMA) цены как среднюю дорожку, а затем используйте ATR, умноженный на различные коэффициенты Фибоначчи, чтобы сформировать верхнюю и нижнюю дорожки. Когда цена пробивает выбранную пользователем полосу Фибоначчи, система генерирует торговый сигнал. В частности, длинный сигнал срабатывает, когда самая низкая цена ниже целевого диапазона покупки, а самая высокая цена выше диапазона; короткий сигнал срабатывает, когда самая низкая цена ниже целевого диапазона продажи, а самая высокая цена выше. чем группа.

Стратегические преимущества

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

Стратегический риск

  1. Риск ложного прорыва: цены могут упасть сразу после прорыва, что создаст ложный сигнал.
  2. Чувствительность параметров: Различные варианты коэффициентов Фибоначчи могут существенно влиять на эффективность стратегии.
  3. Зависимость от времени: если вы включите временные окна для торговли, вы можете упустить важные торговые возможности.
  4. Зависимость от рыночной среды: может генерировать слишком много торговых сигналов на нестабильном рынке

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

  1. Механизм подтверждения сигнала: рекомендуется добавлять индикаторы объема или импульса в качестве подтверждения прорыва.
  2. Динамическая оптимизация параметров: коэффициенты Фибоначчи могут автоматически корректироваться в зависимости от волатильности рынка.
  3. Фильтрация рыночной среды: добавьте функцию оценки тенденций и используйте различные параметры в различных рыночных средах.
  4. Система взвешивания сигнала: внедрение анализа нескольких временных интервалов для повышения надежности сигнала.
  5. Оптимизация управления позициями: динамическая регулировка размера позиции в зависимости от волатильности рынка и силы сигнала

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

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

Исходный код стратегии
/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-04 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
// © sapphire_edge 

// # ========================================================================= #
// #                  
// #        _____                   __    _              ______    __         
// #      / ___/____ _____  ____  / /_  (_)_______     / ____/___/ /___ ____ 
// #      \__ \/ __ `/ __ \/ __ \/ __ \/ / ___/ _ \   / __/ / __  / __ `/ _ \
// #     ___/ / /_/ / /_/ / /_/ / / / / / /  /  __/  / /___/ /_/ / /_/ /  __/
// #    /____/\__,_/ .___/ .___/_/ /_/_/_/   \___/  /_____/\__,_/\__, /\___/ 
// #              /_/   /_/                                     /____/       
// #                                      
// # ========================================================================= #

strategy(shorttitle="⟡Sapphire⟡ FiboBands Strategy", title="[Sapphire] Fibonacci Bollinger Bands Strategy", initial_capital= 50000, currency= currency.USD,default_qty_value = 1,commission_type= strategy.commission.cash_per_contract,overlay= true )

// # ========================================================================= #
// #                       // Settings Menu //
// # ========================================================================= #

// --------------------    Main Settings    -------------------- //
groupFiboBands = "FiboBands"
length = input.int(20, minval = 1, title = 'Length', group=groupFiboBands)
src = input(close, title = 'Source', group=groupFiboBands)
offset = input.int(0, 'Offset', minval = -500, maxval = 500, group=groupFiboBands)

fibo1 = input(defval = 1.618, title = 'Fibonacci Ratio 1', group=groupFiboBands)
fibo2 = input(defval = 2.618, title = 'Fibonacci Ratio 2', group=groupFiboBands)
fibo3 = input(defval = 4.236, title = 'Fibonacci Ratio 3', group=groupFiboBands)

fiboBuy = input.string(options = ['Fibo 1', 'Fibo 2', 'Fibo 3'], defval = 'Fibo 1', title = 'Fibonacci Buy', group=groupFiboBands)
fiboSell = input.string(options = ['Fibo 1', 'Fibo 2', 'Fibo 3'], defval = 'Fibo 1', title = 'Fibonacci Sell', group=groupFiboBands)

showSignals = input.bool(true, title="Show Signals", group=groupFiboBands)
signalOffset = input.int(5, title="Signal Vertical Offset", group=groupFiboBands)

// --------------------    Trade Management Inputs    -------------------- //
groupTradeManagement = "Trade Management"
useProfitPerc    = input.bool(false, title="Enable Profit Target", group=groupTradeManagement)
takeProfitPerc  = input.float(1.0, title="Take Profit (%)", step=0.1, group=groupTradeManagement)
useStopLossPerc    = input.bool(false, title="Enable Stop Loss", group=groupTradeManagement)
stopLossPerc    = input.float(1.0, title="Stop Loss (%)", step=0.1, group=groupTradeManagement)

// --------------------    Time Filter Inputs    -------------------- //
groupTimeOfDayFilter = "Time of Day Filter"
useTimeFilter1  = input.bool(false, title="Enable Time Filter 1", group=groupTimeOfDayFilter)
startHour1      = input.int(0, title="Start Hour (24-hour format)", minval=0, maxval=23, group=groupTimeOfDayFilter)
startMinute1    = input.int(0, title="Start Minute", minval=0, maxval=59, group=groupTimeOfDayFilter)
endHour1        = input.int(23, title="End Hour (24-hour format)", minval=0, maxval=23, group=groupTimeOfDayFilter)
endMinute1      = input.int(45, title="End Minute", minval=0, maxval=59, group=groupTimeOfDayFilter)
closeAtEndTimeWindow = input.bool(false, title="Close Trades at End of Time Window", group=groupTimeOfDayFilter)

// --------------------    Trading Window    -------------------- //
isWithinTradingWindow(startHour, startMinute, endHour, endMinute) =>
    nyTime            = timestamp("America/New_York", year, month, dayofmonth, hour, minute)
    nyHour            = hour(nyTime)
    nyMinute          = minute(nyTime)
    timeInMinutes     = nyHour * 60 + nyMinute
    startInMinutes    = startHour * 60 + startMinute
    endInMinutes      = endHour * 60 + endMinute
    timeInMinutes    >= startInMinutes and timeInMinutes <= endInMinutes

timeCondition =  (useTimeFilter1 ? isWithinTradingWindow(startHour1, startMinute1, endHour1, endMinute1) : true)

// Check if the current bar is the last one within the specified time window
isEndOfTimeWindow() =>
    nyTime            = timestamp("America/New_York", year, month, dayofmonth, hour, minute)
    nyHour            = hour(nyTime)
    nyMinute          = minute(nyTime)
    timeInMinutes     = nyHour * 60 + nyMinute
    endInMinutes      = endHour1 * 60 + endMinute1
    timeInMinutes == endInMinutes

// Logic to close trades if the time window ends
if timeCondition and closeAtEndTimeWindow and isEndOfTimeWindow()
    strategy.close_all(comment="Closing trades at end of time window")

// # ========================================================================= #
// #                       // Calculations //
// # ========================================================================= #

sma = ta.sma(src, length)
atr = ta.atr(length)

ratio1 = atr * fibo1
ratio2 = atr * fibo2
ratio3 = atr * fibo3

upper3 = sma + ratio3
upper2 = sma + ratio2
upper1 = sma + ratio1

lower1 = sma - ratio1
lower2 = sma - ratio2
lower3 = sma - ratio3

// # ========================================================================= #
// #                       // Signal Logic //
// # ========================================================================= #

// --------------------    Entry Logic    -------------------- //
targetBuy = fiboBuy == 'Fibo 1' ? upper1 : fiboBuy == 'Fibo 2' ? upper2 : upper3
buy = low < targetBuy and high > targetBuy

// --------------------    User-Defined Exit Logic    -------------------- //
targetSell = fiboSell == 'Fibo 1' ? lower1 : fiboSell == 'Fibo 2' ? lower2 : lower3
sell = low < targetSell and high > targetSell

// # ========================================================================= #
// #                       // Strategy Management //
// # ========================================================================= #

// --------------------    Trade Execution Flags    -------------------- //
var bool buyExecuted = false
var bool sellExecuted = false

float labelOffset = ta.atr(14) * signalOffset

// --------------------    Buy Logic    -------------------- //
if buy and timeCondition 
    if useProfitPerc or useStopLossPerc
        strategy.entry("Buy", strategy.long, stop=(useStopLossPerc ? close * (1 - stopLossPerc / 100) : na), limit=(useProfitPerc ? close * (1 + takeProfitPerc / 100) : na))
    else
        strategy.entry("Buy", strategy.long)

    if showSignals and not buyExecuted
        buyExecuted := true  
        sellExecuted := false  
        label.new(bar_index, high - labelOffset, "◭", style=label.style_label_up, color = color.rgb(119, 0, 255, 20), textcolor=color.white)

// --------------------    Sell Logic    -------------------- //
if sell and timeCondition
    if useProfitPerc or useStopLossPerc
        strategy.entry("Sell", strategy.short, stop=(useStopLossPerc ? close * (1 + stopLossPerc / 100) : na), limit=(useProfitPerc ? close * (1 - takeProfitPerc / 100) : na))
    else
        strategy.entry("Sell", strategy.short)

    if showSignals and not sellExecuted
        sellExecuted := true 
        buyExecuted := false  
        label.new(bar_index, low + labelOffset, "⧩", style=label.style_label_down, color = color.rgb(255, 85, 0, 20), textcolor=color.white)



// # ========================================================================= #
// #                         // Plots and Charts //
// # ========================================================================= #

plot(sma, style = plot.style_line, title = 'Basis', color = color.new(color.orange, 0), linewidth = 2, offset = offset)

upp3 = plot(upper3, title = 'Upper 3', color = color.new(color.teal, 90), offset = offset)
upp2 = plot(upper2, title = 'Upper 2', color = color.new(color.teal, 60), offset = offset)
upp1 = plot(upper1, title = 'Upper 1', color = color.new(color.teal, 30), offset = offset)

low1 = plot(lower1, title = 'Lower 1', color = color.new(color.teal, 30), offset = offset)
low2 = plot(lower2, title = 'Lower 2', color = color.new(color.teal, 60), offset = offset)
low3 = plot(lower3, title = 'Lower 3', color = color.new(color.teal, 90), offset = offset)

fill(upp3, low3, title = 'Background', color = color.new(color.teal, 95))