Стратегия отслеживания тренда двойной скользящей средней полосы Боллинджера

Автор:Чао Чжан, Дата: 2023-12-11 15:10:02
Тэги:

img

Обзор

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

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

  1. Если 200-периодная EMA больше 30-периодной EMA, то долгосрочная тенденция определяется как повышающаяся, в противном случае она определяется как понижающаяся.

  2. После определения направления тренда вычисляются базовая линия, верхняя полоса и нижняя полоса полос Боллинджера.

  3. Когда долгосрочный тренд повышается, нижний диапазон прорыва сигнализирует о длинном входе; когда долгосрочный тренд понижается, верхний диапазон прорыва сигнализирует о коротком входе.

  4. Чтобы отфильтровать ложные прорывы, скорость изменения за последнюю свечу до прорыва проверяется ниже конфигурируемого порога (например, 3%), а ширина диапазона проверяется выше конфигурируемого уровня (например, 2,2% от цены закрытия).

  5. После открытия позиций конфигурируемые стоп-лосс (например, -3%) и прибыль (например, 10%) устанавливаются для блокировки прибыли.

Сильные стороны стратегии

  1. Двойные EMA определяют основную тенденцию и избегают беспорядочного открытия позиций, когда основная тенденция неясна.

  2. Адаптивные полосы Боллинджера устанавливают точки входа вдоль тренда.

  3. Скорость изменения и требования к минимальной ширине эффективно фильтруют ложные прорывы.

  4. Настройки стоп-лосса и прибыли разумно блокируют прибыль, контролируя риски.

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

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

  2. Неправильные параметры BB могут вызвать ложные сигналы.

  3. Фиксированные стоп-лосс и прибыль не могут адаптироваться к колебаниям рынка.

Руководство по оптимизации

  1. Включить другие показатели для определения основных и вторичных сдвигов тенденций.

  2. Принять динамическую настройку параметров BB.

  3. Назначьте условные ордера на остановку потерь и получение прибыли на основе конкретных критериев.

Заключение

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


/*backtest
start: 2022-12-04 00:00:00
end: 2023-12-10 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
//////////////////////////////////////////////////////////////////////
// Component Code Start
testStartYear = input(2019, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

testStopYear = input(2039, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

// A switch to control background coloring of the test period
testPeriodBackground = input(title="Color Background?", type=bool, defval=true)
testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=97)

testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
// Component Code Stop

strategy("Custom Band Strategy", overlay=true)
source = close //종가 기준

//추세 조건 설정
emaLong = ema(source, input(200, minval=0))
emaShort = ema(source, input(30, minval=0))
trend = if emaShort>=emaLong
    1
else
    -1
    
plot(emaLong, color=red, transp=0)
plot(emaShort, color=blue, transp=0)


//BB 계산(default 14/3.2)
length = input(8, minval=1)

basis = sma(source, length)
plot(basis, color=green, transp=0)
max=highest(abs(source-basis), length)

factor1 = input(1.3, minval=0.5)
factor2 = input(1.1, minval=0.5)

upper = if trend==1
    basis + max*factor1
else
    basis + max*factor2
lower = if trend==-1
    basis - max*factor1
else
    basis - max*factor2

plot1 = plot(upper)
plot2 = plot(lower)
fill(plot1, plot2, transp=80, color=green)

//밴드 이탈 후 재진입 조건 설정
cross_over = (low<=lower and close>=lower) or crossover(close,lower)
cross_under = (high>=upper and close<=upper) or crossunder(close,upper)

//변동율 계산
maxCandle=highest(abs(open-close), length)
    
roc = abs(open-close)/open*100
changerate = input(3, minval=0.0)

//수익률 계산
value = abs(strategy.position_size)*strategy.position_avg_price
roe = strategy.openprofit/value * 100
expRoeL = (upper-lower)/lower*100
expRoeS = (upper-lower)/upper*100
exp = input(2.2, minval=0.0)

target = input(10, minval=0.0)
stop = input(-3, minval=-10.0)

strategy.close_all(when=roc>=changerate and testPeriod())
strategy.close_all(when=roe>=target and testPeriod())
strategy.close_all(when=roe<=stop and testPeriod())

plotchar(crossover(close,lower) and crossunder(close,upper),color=blue, transp=0, text="cross")
plotchar(roc>=changerate,color=red, transp=0, text="roc")
plotchar(roe>=target,color=blue, transp=0, text="target")
plotchar(roe<=stop,color=green, transp=0, text="stop")

minroe = input(2, minval=0.0)

strategy.close_all(when=cross_under and roe>minroe and testPeriod())
strategy.entry("BBandLE", strategy.long, stop=source, oca_name="BollingerBands",  comment="BBandLE", when=(cross_over) and trend==1 and roc<changerate and expRoeL>exp and source>emaLong and strategy.position_size==0 and testPeriod()) //trend==1 and 
//else
strategy.close_all(when=cross_over and roe>minroe and testPeriod())
strategy.entry("BBandSE", strategy.short, stop=source, oca_name="BollingerBands",  comment="BBandSE", when=(cross_under) and trend==-1 and roc<changerate and expRoeS>exp and source<emaLong and strategy.position_size==0 and testPeriod()) //trend==-1 and 

Больше