
Стратегия использует линейную обратную каналу для построения позиции после прорыва цены, используя в ней в качестве сигнала для открытия позиции после прорыва цены, в сочетании с двумя стандартными дифференциальными настройками для построения позиции после покупки и продажи. В то же время использует перекрестку средней линии канала в качестве сигнала для закрытия позиции после получения прибыли.
Основная логика стратегии основана на линейных регрессионных каналах с верхним и нижним траекториями, а также на средних линиях. Конкретный расчетный процесс выглядит так:
Вычислить линейную регрессию цены linreg, а также линейную регрессию следующего цикла linreg_p
Склон и пересечение линии линейной регрессии, рассчитанные на основе линейной регрессии
Расчет отклонения цены от линии регрессии
Устанавливается кратность отклонения dev, получается отклонение вверх и вниз по рельсам
Настройка сигнала “buy” при прорыве цены с нижней полосы вверх
Настройка sell сигнал продажи, когда цена прорывается вниз с верхнего трека
Настройка стоп-сигнала exit, когда цена отклоняется от центральной линии канала
Логика торговли на основе сигналов покупки, продажи и стоп-сигналов
Наибольшее преимущество этой стратегии заключается в том, что она использует среднесрочные и долгосрочные тенденции цены, отраженные в канале линейного возврата. В частности, это проявляется в следующих аспектах:
Верхняя и нижняя полосы линейного регрессивного канала могут эффективно отражать нормальный диапазон колебаний цены, используя диапазон канала для настройки торговых сигналов, что позволяет уменьшить ошибочные сигналы.
Пересечение центральной линии служит сигналом остановки, чтобы максимально зафиксировать прибыль и избежать убытков, связанных с продолжением обратного пути после получения прибыли.
Линейный регрессионный инструмент имеет определенную задержку, что позволяет эффективно устранить шум краткосрочного рынка и сделать торговые сигналы более надежными.
Эта стратегия имеет меньше параметров, ее легко реализовать и подходит для алгоритмизации количественных сделок.
В этой стратегии также есть некоторые риски, в частности:
Линейно-регрессивный канал имеет запаздывающий характер и может пропускать тенденции после кратковременных резких изменений. Можно соответствующим образом сократить цикл канала и оптимизировать параметры.
Неправильное задание коэффициента отклонения также может привести к ошибочному сигналу.
На основании только прорывного сигнала, может быть больше потерь от шока. Можно рассмотреть возможность фильтрации в сочетании с другими показателями.
Существует определенный риск корреляции кривой. Можно рассмотреть возможность объединения с другими индикаторами каналов или тестирования различных источников данных.
Эта стратегия может быть оптимизирована в следующих аспектах:
Оптимизация длины линейных каналов возврата, балансируя задержку и чувствительность реакции.
Оптимизация коэффициента отклонения, повышение качества сигнала при максимальном контроле риска.
Добавление других показателей для фильтрации сигналов, повышает стратегическую победоспособность. Например, EMA, KDJ и т. д.
Добавление механизмов остановки убытков, таких как остановка ATR, остановка слежения и т. д.
Тестирование влияния различных источников данных на стратегию. Например, использование данных о возврате прав, индексных данных и т. Д.
В сочетании с рыночной обстановкой ((паритетный рынок) динамически корректируются параметры или вес сигналов.
Стратегия в целом является прорывной системой, использующей линейный регрессионный канал в качестве индикатора сигнала. Идея стратегии ясна и понятна, параметры меньше, реализация в реальном мире не представляет особой сложности. Но то, как оптимизировать параметры в соответствии с динамикой рыночной среды, в сочетании с другими показателями для фильтрации сигнала, является ключом к успеху стратегии.
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//Robotrading
//@version=4
strategy("robotrading linreg", "linreg", overlay=true, default_qty_type = strategy.percent_of_equity, default_qty_value = 10, commission_value = 0.1)
//Settings
source = input(close)
length = input(100, minval=1)
offset = input(0, minval=0)
dev = input(2.0, "Deviation")
smoothing = input(1, minval=1)
mtf_val = input("", "Resolution", input.resolution)
signals = input("Recent", "Signals Display", options=["Recent", "All"])
goto = input(0, "End At Bar Index")
//Lin.reg.
cc(x) => x=="Red"?color.red:x=="Lime"?color.lime:x=="Orange"?color.orange:x=="Teal"?color.teal:x=="Yellow"?color.yellow:x=="Black"?color.black:color.white
data(x) => sma(security(syminfo.tickerid, mtf_val!="" ? mtf_val : timeframe.period, x), smoothing)
linreg = data(linreg(source, length, offset))
linreg_p = data(linreg(source, length, offset+1))
//Deviation
x = bar_index
slope = linreg - linreg_p
intercept = linreg - x*slope
deviationSum = 0.0
for i = 0 to length-1
deviationSum:= deviationSum + pow(source[i]-(slope*(x-i)+intercept), 2)
deviation = sqrt(deviationSum/(length))
x1 = x-length
x2 = x
y1 = slope*(x-length)+intercept
y2 = linreg
//Cross
dm_current = -deviation*dev + y2
dp_current = deviation*dev + y2
ex_current = (dm_current + dp_current) / 2
buy = crossunder(close, dm_current)
sell = crossover(close, dp_current)
exit = crossover(close, ex_current) or crossunder(close, ex_current)
//Channel
updating = goto <= 0 or x < goto
// if updating
// line b = line.new(x1, y1, x2, y2, xloc.bar_index, extend.right, color.aqua, width = 3)
// line.delete(b[1])
// line dp = line.new(x1, deviation*dev + y1, x2, deviation*dev + y2, xloc.bar_index, extend.right, color.red, width = 3)
// line.delete(dp[1])
// line dm = line.new(x1, -deviation*dev + y1, x2, -deviation*dev + y2, xloc.bar_index, extend.right, color.lime, width = 3)
// line.delete(dm[1])
//Lines
plot(dm_current, color = color.lime)
plot(dp_current, color = color.red)
plot(ex_current)
//Trading
if ex_current > 0
strategy.entry("Long", strategy.long, na, limit = dm_current)
strategy.entry("Short", strategy.short, na, limit = dp_current)
strategy.exit("ExitLong", "Long", limit = ex_current)
strategy.exit("ExitShort", "Short", limit = ex_current)