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


Дата создания: 2023-11-03 17:16:02 Последнее изменение: 2023-11-03 17:16:02
Копировать: 1 Количество просмотров: 623
1
Подписаться
1617
Подписчики

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

Обзор

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

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

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

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

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

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

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

  • Используйте определенные многомерные точки прорыва для определения пояса Брин, чтобы использовать возможности тренда.
  • Фильтрация индексов ADX, чтобы избежать волнообразного движения при отсутствии четкой тенденции
  • Ограничение убытков может быть эффективным для контроля одиночных убытков
  • Повышенный отслеживаемый стоп может закрепить большую часть прибыли

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

  • Прорыв пояса Бурин не учитывает количественно-энергетическую связь и может привести к ложному прорыву.
  • Неправильный анализ фильтрации ADX может привести к упущению возможности тренда
  • Стоп-стоп может быть отключен, если стоп-стоп приблизился слишком близко.
  • Неправильно настроенные параметры могут повлиять на эффективность стратегии

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

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

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

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

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

Исходный код стратегии
/*backtest
start: 2023-10-26 00:00:00
end: 2023-11-02 00:00:00
period: 1m
basePeriod: 1m
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/
// © tweakerID

// This strategy uses Bollinger Bands to buy when the price 
// crosses over the lower band and sell when it crosses down
// the upper band. It only takes trades when the ADX is 
// below a certain level, and exits all trades when it's above it.

//@version=4
strategy("BB + ADX Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_value = 0.04, initial_capital=100)

//Inputs
i_reverse=input(false, title="Reverse Trades")
i_ADXClose=input(true, title="ADX Close")
i_SL=input(false, title="Use Swing Lo/Hi Stop Loss & Take Profit")
i_SwingLookback=input(20, title="Swing Lo/Hi Lookback")
i_SLExpander=input(defval=0, step=.5, title="SL Expander")
i_TPExpander=input(defval=0, step=.5, title="TP Expander")

//ADX Calculations
adxlen = input(14, title="ADX Smoothing")
dilen = input(20, title="DI Length")
dirmov(len) =>
	up = change(high)
	down = -change(low)
	plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
	minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
	truerange = rma(tr, len)
	plus = fixnan(100 * rma(plusDM, len) / truerange)
	minus = fixnan(100 * rma(minusDM, len) / truerange)
	[plus, minus]
adx(dilen, adxlen) =>
	[plus, minus] = dirmov(dilen)
	sum = plus + minus
	adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
sig = adx(dilen, adxlen)
adxlevel=input(30, step=5)

//BB Calculations
BBCALC=input(false, title="-----------BB Inputs-----------")

length = input(20, minval=1)
mult = input(2.0, minval=0.001, maxval=50)
MAlen=input(defval=9)
source = close
basis = sma(source, length)
dev = mult * stdev(source, length)
upper = basis + dev
lower = basis - dev

//Entry Logic
BUY = crossover(source, lower) and sig < adxlevel
SELL = crossunder(source, upper) and sig < adxlevel

//SL & TP Calculations
SwingLow=lowest(i_SwingLookback)
SwingHigh=highest(i_SwingLookback)
bought=strategy.position_size != strategy.position_size[1]
LSL=valuewhen(bought, SwingLow, 0)-((valuewhen(bought, atr(14), 0))*i_SLExpander)
SSL=valuewhen(bought, SwingHigh, 0)+((valuewhen(bought, atr(14), 0))*i_SLExpander)
lTP=strategy.position_avg_price + (strategy.position_avg_price-(valuewhen(bought, SwingLow, 0))+((valuewhen(bought, atr(14), 0))*i_TPExpander))
sTP=strategy.position_avg_price - (valuewhen(bought, SwingHigh, 0)-strategy.position_avg_price)-((valuewhen(bought, atr(14), 0))*i_TPExpander)
islong=strategy.position_size > 0
isshort=strategy.position_size < 0
SL= islong ? LSL : isshort ? SSL : na
TP= islong ? lTP : isshort ? sTP : na

//Entries
strategy.entry("long", long=i_reverse?false:true, when=BUY)
strategy.entry("short", long=i_reverse?true:false, when=SELL)

//EXITS
if i_ADXClose
    strategy.close_all(when=sig > adxlevel)
if i_SL
    strategy.exit("longexit", "long", stop=SL, limit=TP)
    strategy.exit("shortexit", "short", stop=SL, limit=TP)

//Plots	
plot(i_SL ? SL : na, color=color.red, style=plot.style_cross, title="SL")
plot(i_SL ? TP : na, color=color.green, style=plot.style_cross, title="TP")
plot(upper)
plot(lower)