
Эта стратегия основана на плавных колебаниях цен, создает ценовые целевые полосы, и, когда цена прорывает целевые полосы, генерирует торговый сигнал.
Эта стратегия сначала рассчитывает среднюю величину колебаний цены в течение определенного периода, а затем производит плавную обработку колебаний с помощью показателей скользящих средних, чтобы получить плавную волатильность. Плавная волатильность, умноженная на коэффициент, дает область целевой полосы. Когда цена прорывает целевую полосу, генерирует сигнал покупки; когда цена прорывает целевую полосу, генерирует сигнал продажи.
В частности, в стратегии с помощью функции smoothrng вычисляется плавная волатильность smrng, а затем рассчитываются верхние и нижние полосы hband и lband целевой полосы на основе значения smrng. На этой основе устанавливаются условия длинной позиции longCondition и условия короткой позиции shortCondition. Когда выполняются условия длинной позиции, генерируется сигнал покупки; когда выполняются условия короткой позиции, генерируется сигнал продажи.
Эта стратегия имеет следующие преимущества:
Используя волатильность цен для построения торговых сигналов, можно эффективно отслеживать изменения рынка.
С помощью индекса можно сгладить колебания скользящей средней, отфильтровать шум и создать более надежный торговый сигнал.
Целевой диапазон может быть скорректирован с помощью коэффициента волатильности, что делает стратегию более гибкой.
В сочетании с оценкой ценовых прорывов, можно вовремя поймать торговые возможности при повороте тренда.
Однако эта стратегия также несет в себе некоторые риски:
При аномальных колебаниях на рынке, скольжение может не точно отражать реальные колебания, что приводит к ошибочным сигналам. Модель может быть оптимизирована путем корректировки параметров.
Целевой диапазон, если он неправильно установлен, может привести к слишком высокой частоте или недостаточному сигналу. Можно протестировать различные параметры, чтобы найти оптимальный диапазон.
Определение прорывного сигнала задержкой времени может привести к досрочному или позднему поступлению. Подтверждение может быть осуществлено в сочетании с другими показателями.
Эта стратегия может быть оптимизирована в следующих направлениях:
Испытание различных циклов ценовых данных, чтобы найти наиболее подходящий циклический параметр для расчета волатильности.
Попробуйте различные алгоритмы скользящих средних, такие как линейно-весовая скользящая средняя.
Введение объема торгов или других показателей для подтверждения прорыва.
Установка стоп-листов или trailing stops для контроля одиночных стопов.
Оптимизируйте значение коэффициента колебания mult для определения оптимального целевого диапазона полос.
Общая концепция этой стратегии ясна. Целевая полоса построена с помощью колебаний цен, использование ценовых прорывов для создания торговых сигналов позволяет эффективно отслеживать тенденции изменения рынка. Однако также существует определенный простор для улучшения, что позволяет сделать стратегию более стабильной и надежной путем оптимизации параметров и введения подтверждающих показателей.
/*backtest
start: 2023-01-22 00:00:00
end: 2024-01-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("1SmSm1 Strategy", shorttitle="1SmSm1", overlay=true)
// Source
src = input(defval=close, title="Source")
// Sampling Period
per = input(defval=100, minval=1, title="Sampling Period")
// Range Multiplier
mult = input(defval=3.0, minval=0.1, title="Range Multiplier")
// Smooth Average Range
smoothrng(x, t, m) =>
wper = (t * 2) - 1
avrng = ema(abs(x - x[1]), t)
smoothrng = ema(avrng, wper) * m
smoothrng
smrng = smoothrng(src, per, mult)
// Range Filter
rngfilt(x, r) =>
rngfilt = x
rngfilt := x > nz(rngfilt[1]) ? ((x - r) < nz(rngfilt[1]) ? nz(rngfilt[1]) : (x - r)) : ((x + r) > nz(rngfilt[1]) ? nz(rngfilt[1]) : (x + r))
rngfilt
filt = rngfilt(src, smrng)
// Filter Direction
upward = 0.0
upward := filt > filt[1] ? nz(upward[1]) + 1 : filt < filt[1] ? 0 : nz(upward[1])
downward = 0.0
downward := filt < filt[1] ? nz(downward[1]) + 1 : filt > filt[1] ? 0 : nz(downward[1])
// Target Bands
hband = filt + smrng
lband = filt - smrng
// Breakouts
longCondition = (src > filt) and (src > src[1]) and (upward > 0)
shortCondition = (src < filt) and (src < src[1]) and (downward > 0)
strategy.entry("Buy", strategy.long, when = longCondition)
strategy.entry("Sell", strategy.short, when = shortCondition)
// Plotting
plot(filt, color=upward > 0 ? color.lime : downward > 0 ? color.red : color.orange, linewidth=3, title="Range Filter")
hbandplot = plot(hband, color=color.aqua, transp=100, title="High Target")
lbandplot = plot(lband, color=color.fuchsia, transp=100, title="Low Target")
// Fills
fill(hbandplot, lbandplot, color=color.aqua, title="Target Range")
// Bar Color
barcolor(longCondition ? color.green : shortCondition ? color.red : na)
// Alerts
alertcondition(longCondition, title="Buy Alert", message="BUY")
alertcondition(shortCondition, title="Sell Alert", message="SELL")