Стратегия маркет-мейкера Bollinger Band Limit


Дата создания: 2024-01-24 11:05:56 Последнее изменение: 2024-01-24 11:05:56
Копировать: 0 Количество просмотров: 949
1
Подписаться
1617
Подписчики

Стратегия маркет-мейкера Bollinger Band Limit

Обзор

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

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

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

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

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

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

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

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

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

Однако эта стратегия также несет в себе некоторые риски:

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

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

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

В этой стратегии есть место для дальнейшей оптимизации:

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

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

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

Исходный код стратегии
/*backtest
start: 2023-12-24 00:00:00
end: 2024-01-23 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy(shorttitle="BBL", title="BB limit", overlay = true)


length = input(200, minval=1)
src = input(hlc3, title="Source")
xmult = input(44, minval=0.001, maxval=5000, title = "bb mult (0.1%)")
s = input(title="Trend source", defval = "sma", options = ["ema", "sma", "rma", "wma"])
basis = s == "ema" ? ema(src, length) : s == "sma" ? sma(src, length) : s =="rma" ? rma(src, length) : wma(src, length)
sd = input(title="Dev source", defval = "stdev", options = ["stdev", "dev"])
mult = xmult / 10  
dev = sd == "stdev" ? mult * stdev(src, length) : mult * dev(src, length)
diff = input(0.5, title = "Spread")
LongPrice(p) =>
    LongPrice = diff == 0 ? p : floor(p / diff) * diff

ShortPrice(p) =>
    ShortPrice = diff == 0 ? p : ceil(p / diff) * diff

pyr = input(1, title = "Pyramiding")
useStopLoss = input(true)
stoploss_xmult = input(15, minval=0.001, maxval=5000, title = "StopLoss 0.1%")
stopLoss_mult = sd == "simple" ? 1 + stoploss_xmult / 10 / 100 : stoploss_xmult / 10  
dev2 = sd == "stdev" ? stopLoss_mult * stdev(src, length) : sd == "dev" ? stopLoss_mult * dev(src, length) : (stopLoss_mult - 1) * basis
upper = basis + (1*dev)
lower = basis - (1*dev)
plot(basis, color=fuchsia, linewidth=2)
plot(upper, color=green, linewidth=2)
plot(lower, color=green, linewidth=2)


strategy.cancel_all()

if strategy.position_size > 0 and close <= basis + diff * 2
    strategy.order("Close long", strategy.short, strategy.position_size, limit = ShortPrice(basis))
else 
    if strategy.position_size < 0 and close >= basis - diff * 2
        strategy.order("Close short", strategy.long, -strategy.position_size, limit = LongPrice(basis))
            
stopLossPrice1 = na
stopLossPrice2 = na
add = na
openOrderCondition = close > lower - 2 * diff and (strategy.opentrades < pyr or (strategy.position_size < 0 and strategy.position_avg_price > lower * (1 + stopLoss_mult / 100)))
if openOrderCondition
    add := strategy.position_size > 0 ? -strategy.position_size : close >= basis - diff * 2 ? 0 : -strategy.position_size
    strategy.order("Open long", strategy.long, strategy.equity / pyr / lower + add, limit = LongPrice(lower))
if useStopLoss and (strategy.position_size > 0 or openOrderCondition)
    add = openOrderCondition ? strategy.equity / pyr / lower : 0
    posPrice = strategy.position_size <= 0 ? lower : strategy.position_avg_price
    posSize = strategy.position_size <= 0 ? 0 : strategy.position_size
    stopLossPrice1 := posPrice * (1 - stopLoss_mult / 100)
    strategy.order("StopLoss open short ", strategy.short, posSize + add + strategy.equity / pyr / stopLossPrice1, stop = ShortPrice(stopLossPrice1))


openOrderCondition := close < upper + 2 * diff and (strategy.opentrades < pyr or (strategy.position_size > 0 and strategy.position_avg_price * (1 + stopLoss_mult / 100) < upper))
if openOrderCondition
    add := strategy.position_size < 0 ? strategy.position_size : close <= basis + diff * 2 ? 0 : strategy.position_size
    strategy.order("Open short", strategy.short, strategy.equity / pyr / upper + add, limit = ShortPrice(upper))
if useStopLoss and (strategy.position_size < 0 or openOrderCondition)
    add = openOrderCondition ? strategy.equity / pyr / upper : 0
    posPrice = strategy.position_size >= 0 ? upper : strategy.position_avg_price
    posSize = strategy.position_size >= 0 ? 0 : -strategy.position_size
    stopLossPrice2 := posPrice * (1 + stopLoss_mult / 100)
    strategy.order("StopLoss open long", strategy.long, posSize + add + strategy.equity / pyr / stopLossPrice2, stop = LongPrice(stopLossPrice2))

plot(not useStopLoss ? na : stopLossPrice1, color=red, linewidth=2)
plot(not useStopLoss ? na : stopLossPrice2, color=red, linewidth=2)

// === Backtesting Dates ===
testPeriodSwitch = input(false, "Custom Backtesting Dates")
testStartYear = input(2018, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testStartHour = input(0, "Backtest Start Hour")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0)
testStopYear = input(2018, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(14, "Backtest Stop Day")
testStopHour = input(14, "Backtest Stop Hour")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0)
testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
isPeriod = testPeriodSwitch == true ? testPeriod() : true
// === /END
if not isPeriod
    strategy.cancel_all()
    strategy.close_all()