
Динамическая регрессионная стратегия - это количественная торговая стратегия, которая использует линейную регрессионную аналитику ценовых тенденций в сочетании с динамическими остановками для отслеживания тенденций. Эта стратегия использует линейную регрессионную стратегию, чтобы нарисовать ценовые каналы, определять сигналы, когда цены прорывают каналы, и выпускать инструкции на покупку и продажу.
Эта стратегия сначала рассчитывает линейную регрессионную кривую цены, чтобы определить, прорвет ли она восходящий или нисходящий обратный канал. Когда цена превышает верхний канал, генерируется сигнал покупки; когда цена падает ниже нижнего канала, генерируется сигнал продажи.
После выхода на рынок, стратегия будет отслеживать в реальном времени, когда цена превышает среднюю линию остановки убытков. Если вы делаете много заказов, цена падает ниже средней линии убытков, вы будете выдавать указания на продажу с убытком; если вы делаете пустые заказы, цена превышает среднюю линию убытков, вы будете выдавать указания на покупку с убытком. Таким образом, можно блокировать прибыль и контролировать риск.
Следует отметить, что если цена вновь пробивается через канал и внедряется обратная операция, стратегия немедленно ликвидирует первоначальную позицию и заменяет ее на обратную торговлю.
Эта стратегия, объединяющая трендовые и обратные торговые идеи, позволяет придерживаться общего движения цен, а также использовать возможности для краткосрочной корректировки. Стоп-лосс, обновляемый в режиме реального времени, также может эффективно контролировать риск и является более сбалансированным методом торговли.
По сравнению с простой стратегией движущейся средней линии, стратегия динамического возвратного канала более чувствительна к изменениям цены и может уменьшить количество ошибочных сделок. Кроме того, эта стратегия используется только в тех случаях, когда цена прорывается вверх и вниз по каналу, что помогает избежать беспорядочных радикальных сделок.
Эта стратегия в основном рискует неточным соответствием кривой возвращения. Если диапазон обратных каналов установлен неправильно, слишком широкий, это увеличивает вероятность неэффективных сделок. Если каналы слишком узкие, то они пропускают торговые возможности.
Кроме того, очень важно установить положение стоп-поста. Стоп-поста слишком близко и может быть вызван краткосрочными ценовыми колебаниями, а слишком мягкий стоп-пост не может быть эффективным для контроля риска. Параметры необходимо корректировать в зависимости от разных сортов.
Можно рассмотреть возможность автоматической оптимизации параметров в зависимости от различных циклов или разновидностей, чтобы сделать обратный путь и стоп-лайн более подходящими для ценовой тенденции. Например, можно использовать алгоритмы машинного обучения для обучения оптимальным параметрам.
С другой стороны, можно попробовать различные типы методов возврата, такие как многополюсный возврат, местный взвешенный возврат и т. д., чтобы улучшить эффективность приспособления. Или объединить несколько показателей возврата для построения правил торговли и повышения стабильности стратегии.
Стратегия динамического регрессивного канала использует комплексный метод анализа тренда и обратного хода, чтобы использовать краткосрочные возможности для корректировки, а также следовать общему движению цены. Настройка ключевых регрессивных каналов и стоп-позиций имеет важное влияние на эффективность стратегии.
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Estratégia de Regressão Linear", shorttitle="Regressão Linear Estratégia", overlay=true, initial_capital = 100, default_qty_value = 10, default_qty_type = strategy.percent_of_equity)
// média móvel exponencial para definição de regressao linear
var SlopeEMASize = input.int(defval = 21, title = "Slope EMA" )
// ema_length = 21
slope_ema = ta.ema(close, SlopeEMASize)
// média móvel exponencial para definição de nivel de stop
var StopEMASize = input.int(defval = 13, title = "Stop EMA" )
stop_ema = ta.ema(close, StopEMASize)
// Variáveis para controle de posição
var float long_stop_level = na
var float long_entry_level = na
var bool long_signal = false
var bool long_order_open = false
var int long_order_id = 0
var float short_stop_level = na
var float short_entry_level = na
var bool short_signal = false
var bool short_order_open = false
var int short_order_id = 0
// Regressão linear para uso como sinal de entrada
var SlopeLenght = input.int(defval = 21, title = "Slope Lenght" )
entry_signal = ta.linreg(slope_ema, SlopeLenght, 0)
//Variaveis com a indicação do pivot da regressao
long_entry_signal = ta.crossover(entry_signal, entry_signal[1])
short_entry_signal = ta.crossunder(entry_signal, entry_signal[1])
// Condição de entrada (reversão da regressão)
if long_entry_signal
long_signal := true
short_signal := false
long_entry_level := high
long_stop_level := low
if short_entry_signal
short_signal := true
long_signal := false
short_entry_level := low
short_stop_level := high
// Indica quando o preço cruzou o nível de stop
price_cross_stop_ema_up = ta.crossover(close, stop_ema)
price_cross_stop_ema_down = ta.crossunder(close, stop_ema)
// Mover o stop quando o preço cruzar a nível stop e operação long ativa
if long_signal and long_order_open and price_cross_stop_ema_down
if low > long_entry_level
long_stop_level := high
// Mover o stop quando o preço cruzar a nível stop e operação short ativa
if short_signal and short_order_open and price_cross_stop_ema_up
if high < short_stop_level
short_stop_level := low
// Sair da posição se houver nova reversão da regressão
if long_order_open or short_order_open
if long_entry_signal //and short_order_open
strategy.close(str.tostring(short_order_id), comment ="Inversão Sinal("+str.tostring(short_order_id)+")")
short_order_open:= false
if short_entry_signal //and long_order_open
strategy.close(str.tostring(long_order_id), comment = "Inversão Sinal("+str.tostring(long_order_id)+")")
long_order_open:=false
// Sinais de compra e venda com base no stop
if long_signal and close > long_entry_level and not long_order_open
if strategy.opentrades != 0
strategy.cancel_all()
long_order_id+=1
// strategy.order(str.tostring(long_order_id), strategy.long, comment="Open Long("+str.tostring(long_order_id)+")", limit = long_entry_level)
strategy.entry(str.tostring(long_order_id), strategy.long, comment="Open Long("+str.tostring(long_order_id)+")", limit = long_entry_level)
long_order_open := true
// log.info("Open Long:"+str.tostring(long_order_id))
if short_signal and close < short_entry_level and not short_order_open
if strategy.opentrades != 0
strategy.cancel_all()
short_order_id+=1
// strategy.order(str.tostring(short_order_id), strategy.short, comment="Open Short("+str.tostring(short_order_id)+")", limit = short_entry_level)
strategy.entry(str.tostring(short_order_id), strategy.short, comment="Open Short("+str.tostring(short_order_id)+")", limit = short_entry_level)
short_order_open := true
// log.info("Open Short:"+str.tostring(short_order_id))
// Sinais de compra e venda com base no stop
if long_signal and close < long_stop_level and long_order_open
strategy.close(str.tostring(long_order_id), comment = "Stop Atingido("+str.tostring(long_order_id)+")", immediately = true)
long_order_open := false
if short_signal and close > short_stop_level and short_order_open
strategy.close(str.tostring(short_order_id),comment = "Stop Atingido("+str.tostring(short_order_id)+")", immediately = true)
short_order_open := false
// Plotagem da regressão e do stop
plot(stop_ema, title="Stop Signal", color=color.red)
plot(entry_signal,"Entry Signal", linewidth = 5, color = color.rgb(155, 0, 140))
plotshape(long_order_open?long_stop_level:na, title = "Long Stop Level", color = color.green, location = location.absolute)
plotshape(long_order_open?long_entry_level:na, title="Long Entry Value",location=location.absolute, color = color.green, style = shape.circle)
plotshape(series=long_entry_signal, title="Long Signal", location=location.abovebar, color=color.green, style=shape.triangleup, size=size.small, text = "Long Signal")
plotshape(short_order_open?short_stop_level:na, title = "Short Stop Level", color = color.red, location = location.absolute)
plotshape(short_order_open?short_entry_level:na, title="Short Entry Value",location=location.absolute, color = color.red, style = shape.circle)
plotshape(series=short_entry_signal, title="Short Signal", location=location.belowbar, color=color.red, style=shape.triangledown, size=size.small, text="Short Signal")