
Strategi regresi dinamis adalah strategi perdagangan kuantitatif yang menggunakan regresi linier untuk menganalisis tren harga, dan menggabungkan stop loss dinamis untuk melakukan pelacakan tren. Strategi ini menggunakan regresi linier untuk memetakan saluran harga, menilai sinyal harga untuk menembus saluran, dan mengeluarkan instruksi untuk membeli dan menjual.
Strategi ini pertama-tama menghitung kurva regresi linier harga untuk menentukan apakah harga akan menembus saluran regresi ke atas atau ke bawah. Sinyal beli dihasilkan ketika harga melampaui saluran uptrend; Sinyal jual dihasilkan ketika harga jatuh ke saluran downtrend.
Setelah masuk ke pasar, strategi akan melacak secara real-time apakah harga telah menembus stop loss line. Jika ada banyak pesanan, harga jatuh di bawah stop loss line, akan mengeluarkan perintah stop loss sell; Jika ada pesanan kosong, harga melebihi stop loss line, akan mengeluarkan perintah stop loss buy. Dengan demikian, Anda dapat mengunci keuntungan dan mengendalikan risiko.
Perlu dicatat bahwa jika harga kembali menembus saluran dan melakukan operasi reversal, maka strategi akan segera dihapus dari posisi sebelumnya dan digantikan dengan perdagangan reversal.
Strategi ini menggabungkan tren dan pemikiran perdagangan reversal, yang dapat mengikuti pergerakan harga secara keseluruhan, sambil menangkap peluang penyesuaian jangka pendek. Strategi stop loss yang diperbarui secara real-time juga dapat secara efektif mengendalikan risiko, merupakan metode perdagangan yang lebih seimbang.
Strategi ini lebih sensitif terhadap perubahan harga dibandingkan dengan strategi Moving Average Line. Strategi ini dapat mengurangi kesalahan perdagangan. Selain itu, strategi ini hanya digunakan ketika harga menembus saluran dan turun, yang membantu menghindari perdagangan radikal yang tidak teratur.
Strategi ini terutama menghadapi risiko yang ditimbulkan oleh ketidakcocokan yang tidak tepat pada kurva regresi. Jika regresi saluran diatur dengan tidak tepat, terlalu luas, akan meningkatkan probabilitas transaksi yang tidak efektif. Saluran yang terlalu sempit akan kehilangan peluang perdagangan.
Selain itu, pengaturan posisi stop loss juga sangat penting. Stop loss terlalu dekat, mudah dipicu oleh fluktuasi harga jangka pendek; dan stop loss yang terlalu longgar tidak dapat berfungsi sebagai kontrol risiko. Parameter perlu disesuaikan dengan varietas yang berbeda.
Parameter pengoptimalan otomatis dapat dipertimbangkan berdasarkan siklus atau varietas yang berbeda, sehingga jalur kembalinya dan garis stop loss lebih sesuai dengan tren harga. Misalnya, parameter optimal dapat dilatih dengan algoritma pembelajaran mesin.
Di sisi lain, Anda dapat mencoba berbagai jenis metode pengembalian, seperti pengembalian multipolar, pengembalian bertekanan lokal, dan lain-lain, untuk mendapatkan hasil yang lebih baik. Atau menggabungkan beberapa indikator pengembalian untuk membangun aturan perdagangan dan meningkatkan stabilitas strategi.
Strategi saluran regresi dinamis menggunakan metode analisis tren dan reversal secara komprehensif, untuk melakukan perdagangan sambil mengikuti pergerakan harga secara keseluruhan. Pengaturan saluran regresi dan posisi stop loss yang penting memiliki pengaruh penting pada efektivitas strategi. Strategi perdagangan dapat disempurnakan lebih lanjut melalui pengoptimalan parameter dan iterasi model.
/*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")