Стратегия тренда колебаний переменных полос Боллинджера

Автор:Чао Чжан, Дата: 2023-10-31 14:30:45
Тэги:

img

Обзор

Это стратегия обратного колебания тренда, основанная на канале Болинджеровских полос.

Логика стратегии

Стратегия использует полосы Боллинджера в качестве основного технического индикатора. Полосы Боллинджера состоят из скользящей средней за n периоды и отклонения верхних/нижних полос. Верхняя полоса = n-периодный MA + m * n-периодный стандартный отклонение, Нижняя полоса = n-периодный MA - m * n-периодный стандартный отклонение. n и m являются параметрами.

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

Специфическими правилами торговли являются:

  1. Идите длинный, когда близко > верхняя полоса, идти короткий, когда близко < нижняя полоса.

  2. Использовать скользящую среднюю за n периодов в качестве сигнала получения прибыли и остановки убытков.

  3. Используйте фиксированное количество для каждой сделки.

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

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

Преимущества этой стратегии:

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

  2. Движущаяся средняя - это надежный сигнал получения прибыли/остановки убытков, который блокирует большинство прибылей.

  3. Фиксированное количество просто и легко внедряется, не требуется сложных расчетов.

  4. Фиксированный размер позиции увеличивает прибыль, контролируя риск путем корректировки позиции.

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

Риски этой стратегии:

  1. Болинджерские полосы могут генерировать неверные сигналы, вызывая убытки в торговле против тренда.

  2. Отставание передвижной средней может привести к недостаточному получению прибыли.

  3. Фиксированное количество не может адаптироваться к рыночным условиям, риски перераспределения позиций.

  4. Агрессивная корректировка размеров позиций в методе фиксированной дроби может увеличить потери.

Решения: оптимизировать параметры полос Боллинджера для улучшения точности сигнала. Добавить другие индикаторы для определения тренда. Уменьшить размер фиксированной величины. Уменьшить коэффициент корректировки размеров позиций в методе дробного размещения позиций.

Направления к улучшению

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

  1. Оптимизируйте параметры полос Боллинджера, такие как n и m, чтобы повысить точность.

  2. Добавьте другие индикаторы, такие как MACD, KD, чтобы избежать неправильных сигналов.

  3. Изменение фиксированного количества на динамическое позиционирование на основе рыночных условий.

  4. Уменьшение коэффициента корректировки размеров позиций в частичном размещении позиций к плавной кривой собственного капитала.

  5. Добавьте стратегии стоп-лосса, такие как перемещение стоп-лосса, прорыв стоп-лосса, чтобы контролировать риск.

  6. Оптимизация параметров для поиска оптимальных комбинаций параметров.

Резюме

В целом, это типичная стратегия обратного движения полос Боллинджера. Она определяет точки обратного движения полос Боллинджера, устанавливает прием прибыли/стоп-потерю по скользящей средней, контролирует риск по фиксированному количеству и дробному размещению позиций.


/*backtest
start: 2023-09-30 00:00:00
end: 2023-10-30 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © gsanson66


//This strategy uses the well-known Bollinger Bands Indicator
//@version=5
strategy("BOLLINGER BANDS BACKTESTING", shorttitle="BB BACKTESTING", overlay=true, initial_capital=1000, default_qty_type=strategy.cash, default_qty_value=950, commission_type=strategy.commission.percent, commission_value=0.18)


//----------------------------------------FUNCTIONS---------------------------------------//

//@function Displays text passed to `txt` when called.
debugLabel(txt, color) =>
    label.new(bar_index, high, text = txt, color=color, style = label.style_label_lower_right, textcolor = color.black, size = size.small)

//@function which looks if the close date of the current bar falls inside the date range
inBacktestPeriod(start, end) => (time >= start) and (time <= end)


//---------------------------------------USER INPUTS--------------------------------------//

//Technical parameters
bbLength = input.int(defval=20, minval=1, title="BB Length", group="Technical Parameters")
mult = input.float(defval=2, minval=0.1, title="Standard Deviation Multipler", group="Technical Parameters")
smaLength = input.int(defval=20, minval=1, title="SMA Exit Signal Length", group="Technical Parameters")
//Money Management
fixedRatio = input.int(defval=400, minval=1, title="Fixed Ratio Value ($)", group="Money Management")
increasingOrderAmount = input.int(defval=200, minval=1, title="Increasing Order Amount ($)", group="Money Management")
//Backtesting period
startDate = input(title="Start Date", defval=timestamp("1 Jan 2020 00:00:00"), group="Backtesting Period")
endDate = input(title="End Date", defval=timestamp("1 July 2024 00:00:00"), group="Backtesting Period")


//----------------------------------VARIABLES INITIALISATION-----------------------------//
strategy.initial_capital = 50000
//Exit SMA
smaExit = ta.sma(close, smaLength)
//BB Calculation
basis = ta.sma(close, bbLength)
dev = mult * ta.stdev(close, bbLength)
upperBB = basis + dev
lowerBB = basis - dev
//Money management
equity = strategy.equity - strategy.openprofit
var float capital_ref = strategy.initial_capital
var float cashOrder = strategy.initial_capital * 0.95
//Backtesting period
bool inRange = na


//------------------------------CHECKING SOME CONDITIONS ON EACH SCRIPT EXECUTION-------------------------------//

//Checking if the date belong to the range
inRange := true

//Checking performances of the strategy
if equity > capital_ref + fixedRatio
    spread = (equity - capital_ref)/fixedRatio
    nb_level = int(spread)
    increasingOrder = nb_level * increasingOrderAmount
    cashOrder := cashOrder + increasingOrder
    capital_ref := capital_ref + nb_level*fixedRatio
if equity < capital_ref - fixedRatio
    spread = (capital_ref - equity)/fixedRatio
    nb_level = int(spread)
    decreasingOrder = nb_level * increasingOrderAmount
    cashOrder := cashOrder - decreasingOrder
    capital_ref := capital_ref - nb_level*fixedRatio

//Checking if we close all trades in case where we exit the backtesting period
if strategy.position_size!=0 and not inRange
    strategy.close_all()
    debugLabel("END OF BACKTESTING PERIOD : we close the trade", color=color.rgb(116, 116, 116))


//-----------------------------------EXIT SIGNAL------------------------------//

if strategy.position_size > 0 and close < smaExit
    strategy.close("Long")
if strategy.position_size < 0 and close > smaExit
    strategy.close("Short")


//----------------------------------LONG/SHORT CONDITION---------------------------//

//Long Condition
if close > upperBB and inRange
    qty = cashOrder/close
    strategy.entry("Long", strategy.long, qty)
//Short Condition
if close < lowerBB and inRange
    qty = cashOrder/close
    strategy.entry("Short", strategy.short, qty)


//---------------------------------PLOTTING ELEMENT----------------------------------//

plot(smaExit, color=color.orange)
upperBBPlot = plot(upperBB, color=color.blue)
lowerBBPlot = plot(lowerBB, color=color.blue)
fill(upperBBPlot, lowerBBPlot, title = "Background", color=strategy.position_size>0 ? color.rgb(0, 255, 0, 90) : strategy.position_size<0 ? color.rgb(255, 0, 0, 90) : color.rgb(33, 150, 243, 95))


Больше