
Strategi ini memanfaatkan naik dan turun dari saluran regresi linier, yang digabungkan dengan sinyal beli dan jual dengan pengaturan spread standar ganda, untuk membuka posisi setelah harga terobosan. Pada saat yang sama, menggunakan persimpangan garis tengah saluran sebagai sinyal posisi kosong, untuk mencapai stop loss setelah keuntungan.
Logika inti dari strategi ini didasarkan pada lintasan atas dan bawah jalur regresi linier dan garis tengah. Proses perhitungan spesifiknya adalah sebagai berikut:
Menghitung nilai regresi linier harga, dan regresi linier untuk siklus berikutnya
Slope dan intersection of linear regression line calculated from linear regression value
Perhitungan deviasi harga terhadap garis regresi
Setting deviasi pada dev, untuk mendapatkan up-track dan down-track deviasi
Ketika harga naik dari tren bawah, pasang sinyal buy
Ketika harga menembus dari atas ke bawah, setel sell
Saat harga berbalik dari garis tengah saluran, atur sinyal stop exit
Logika perdagangan berdasarkan sinyal beli, sinyal jual dan sinyal stop
Keuntungan terbesar dari strategi ini adalah memanfaatkan tren jangka menengah dan panjang dari harga yang tercermin dari saluran regresi linier. Hal ini dapat dilihat dalam beberapa aspek berikut:
Jalur atas dan bawah dari saluran regresi linier dapat secara efektif mencerminkan rentang normal dari fluktuasi harga, menggunakan rentang saluran untuk mengatur sinyal perdagangan, dapat mengurangi sinyal yang salah.
Garis tengah berpotongan sebagai sinyal berhenti, dapat mengunci keuntungan maksimal, menghindari kerugian yang ditimbulkan oleh perputaran terus setelah keuntungan.
Linear Regression Instrument memiliki keterlambatan tertentu yang dapat secara efektif menyaring kebisingan pasar jangka pendek dan membuat sinyal perdagangan lebih dapat diandalkan.
Strategi ini memiliki parameter yang lebih sedikit, mudah untuk diterapkan, dan cocok untuk algoritma yang berskala besar.
Strategi ini juga memiliki beberapa risiko, terutama di:
Saluran regresi linier memiliki keterlambatan dan mungkin melewatkan tren setelah perubahan drastis jangka pendek. Anda dapat mengurangi siklus saluran dengan tepat dan mengoptimalkan parameter.
Pengaturan yang salah pada perkalian deviasi juga dapat menyebabkan sinyal yang salah.
Hanya berdasarkan sinyal pecah, kemungkinan lebih besar terjadi kerugian getaran. Anda dapat mempertimbangkan untuk melakukan penyaringan dalam kombinasi dengan indikator lain.
Ada risiko tertentu dari pencocokan kurva. Anda dapat mempertimbangkan untuk menggabungkan dengan indikator saluran lainnya, atau menguji sumber data yang berbeda.
Strategi ini dapat dioptimalkan dalam beberapa hal:
Optimalkan panjang jalur regresi linier, seimbang dengan keterbelakangan dan sensitivitas reaksi.
Optimalkan deviasi kelipatan, meningkatkan kualitas sinyal dengan mengontrol risiko maksimum.
Menambahkan indikator lain untuk memfilter sinyal dan meningkatkan strategi kemenangan. Misalnya EMA, KDJ, dll.
Menambahkan mekanisme stop loss, seperti stop loss ATR, tracking stop loss, dan lain sebagainya.
Uji pengaruh berbagai sumber data terhadap strategi. Misalnya, menggunakan data retribusi, data indeks, dll.
Kombinasi dengan kondisi pasar ((pasar multihead) dinamika penyesuaian parameter atau bobot sinyal.
Secara keseluruhan, strategi ini adalah sistem terobosan yang menggunakan saluran regresi linier sebagai indikator sinyal. Ide strategi jelas dan mudah dimengerti, parameternya sedikit, dan tidak terlalu sulit untuk diimplementasikan secara langsung. Tetapi bagaimana parameter disesuaikan dan dioptimalkan sesuai dengan dinamika lingkungan pasar, digabungkan dengan indikator lain untuk memfilter sinyal, adalah kunci keberhasilan strategi ini. Dengan terus-menerus menguji dan mengoptimalkan, strategi ini dapat menjadi sistem kuantitatif yang stabil dan menguntungkan.
/*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)