Стратегия прорыва двойной полосы


Дата создания: 2023-12-13 17:33:24 Последнее изменение: 2023-12-13 17:33:24
Копировать: 2 Количество просмотров: 374
1
Подписаться
1166
Подписчики

Стратегия прорыва двойной полосы

Обзор

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

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

Стратегия использует две бринговые зоны: верхняя и нижняя полосы внутренней бринговой зоны на 20-дневную простую скользящую среднюю ± 1-кратное стандартное отклонение; верхняя и нижняя полосы внешней бринговой зоны на 20-дневную простую скользящую среднюю ± 2-кратное стандартное отклонение.

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

После увеличения ставки, настройка стоп-лойда на минимальную цену - 2 ATR, чтобы закрепить прибыль и контролировать риск; при падении цены ниже Небринской полосы на рельсы, ликвидация позиции.

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

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

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

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

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

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

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

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

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

Исходный код стратегии
/*backtest
start: 2022-12-06 00:00:00
end: 2023-12-12 00:00:00
period: 1d
basePeriod: 1h
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/
// © DojiEmoji

//@version=4
strategy("[KL] Double BB Strategy",overlay=true,pyramiding=1)
ENUM_LONG = "LONG"

// Timeframe {
backtest_timeframe_start = input(defval = timestamp("01 Apr 2020 13:30 +0000"), title = "Backtest Start Time", type = input.time)
USE_ENDTIME = input(false,title="Define backtest end-time (If false, will test up to most recent candle)")
backtest_timeframe_end = input(defval = timestamp("19 Apr 2021 19:30 +0000"), title = "Backtest End Time (if checked above)", type = input.time)
within_timeframe = true
// }

// Bollinger bands
BOLL_length = 20, BOLL_src = close, SMA20 = sma(BOLL_src, BOLL_length)
BOLL_sDEV = stdev(BOLL_src, BOLL_length)
BOLL_upper1 = SMA20 + BOLL_sDEV, BOLL_lower1 = SMA20 - BOLL_sDEV
BOLL_upper2 = SMA20 + BOLL_sDEV*2, BOLL_lower2 = SMA20 - BOLL_sDEV*2
SMA_20_plot = plot(SMA20, "Basis", color=#872323, offset = 0)
BOLL_upper1_plot = plot(BOLL_upper1, "BOLL Upper1", color=color.navy, offset = 0, transp=50)
BOLL_lower1_plot = plot(BOLL_lower1, "BOLL Lower1", color=color.navy, offset = 0, transp=50)
BOLL_upper2_plot = plot(BOLL_upper2, "BOLL Upper2", color=color.navy, offset = 0, transp=50)
BOLL_lower2_plot = plot(BOLL_lower2, "BOLL Lower2", color=color.navy, offset = 0, transp=50)
fill(BOLL_upper2_plot, BOLL_upper1_plot, title = "Background", color=#198787, transp=85)
fill(BOLL_upper1_plot, SMA_20_plot, title = "Background", color=#198787, transp=75)
fill(SMA_20_plot, BOLL_lower1_plot, title = "Background", color=#198787, transp=75)
fill(BOLL_lower1_plot, BOLL_lower2_plot, title = "Background", color=#198787, transp=85)


// Trailing stop loss {
ATR_X2_TSL = atr(input(14,title="Length of ATR for trailing stop loss")) * input(2.0,title="ATR Multiplier for trailing stop loss",type=input.float)
TSL_source = low
var stop_loss_price = float(0)
TSL_line_color = color.green, TSL_transp = 100
if strategy.position_size == 0 or not within_timeframe
    TSL_line_color := color.black
    stop_loss_price := TSL_source - ATR_X2_TSL 
else if strategy.position_size > 0
    stop_loss_price := max(stop_loss_price, TSL_source - ATR_X2_TSL)
    TSL_transp := 0
plot(stop_loss_price, color=color.new(TSL_line_color, TSL_transp))
// }

// Signals for entry
is_neutral = close < BOLL_upper1 and close > BOLL_lower2
is_consol = is_neutral and is_neutral[2]
entry_signal = is_consol[1] and close > BOLL_upper1


// MAIN:
if within_timeframe
    // EXIT ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
	exit_msg = close <= strategy.position_avg_price ? "stop loss" : "take profit"
	end_of_rally = close < BOLL_upper1 and strategy.position_avg_price > stop_loss_price	// also detects false breakouts
	if strategy.position_size > 0 and (TSL_source <= stop_loss_price or end_of_rally)
        strategy.close(ENUM_LONG, comment=exit_msg)

    // ENTRY :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    if (strategy.position_size == 0 or (strategy.position_size > 0 and close > stop_loss_price)) and entry_signal
		entry_msg = strategy.position_size > 0 ? "adding" : "initial"
		strategy.entry(ENUM_LONG, strategy.long, comment=entry_msg)

// CLEAN UP:
if strategy.position_size == 0
	stop_loss_price := float(0)