Эта стратегия определяет направление общей тенденции рынка путем расчета двух экспоненциальных скользящих средних значений (EMA) за разные временные рамки и определяет возможности перекупки и перепродажи вдоль направления тренда с использованием адаптивных полос Боллинджера для реализации трендовой торговли.
Если 200-периодная EMA больше 30-периодной EMA, то долгосрочная тенденция определяется как повышающаяся, в противном случае она определяется как понижающаяся.
После определения направления тренда вычисляются базовая линия, верхняя полоса и нижняя полоса полос Боллинджера.
Когда долгосрочный тренд повышается, нижний диапазон прорыва сигнализирует о длинном входе; когда долгосрочный тренд понижается, верхний диапазон прорыва сигнализирует о коротком входе.
Чтобы отфильтровать ложные прорывы, скорость изменения за последнюю свечу до прорыва проверяется ниже конфигурируемого порога (например, 3%), а ширина диапазона проверяется выше конфигурируемого уровня (например, 2,2% от цены закрытия).
После открытия позиций конфигурируемые стоп-лосс (например, -3%) и прибыль (например, 10%) устанавливаются для блокировки прибыли.
Двойные EMA определяют основную тенденцию и избегают беспорядочного открытия позиций, когда основная тенденция неясна.
Адаптивные полосы Боллинджера устанавливают точки входа вдоль тренда.
Скорость изменения и требования к минимальной ширине эффективно фильтруют ложные прорывы.
Настройки стоп-лосса и прибыли разумно блокируют прибыль, контролируя риски.
Двойные EMA не могут точно определить точки переворота тренда, упуская возможности в поворотные моменты.
Неправильные параметры BB могут вызвать ложные сигналы.
Фиксированные стоп-лосс и прибыль не могут адаптироваться к колебаниям рынка.
Включить другие показатели для определения основных и вторичных сдвигов тенденций.
Принять динамическую настройку параметров BB.
Назначьте условные ордера на остановку потерь и получение прибыли на основе конкретных критериев.
Эта стратегия реализует торговлю трендом, оценивая основные тренды с использованием двойных 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