
Chiến lược này kết hợp ba chỉ số kỹ thuật khác nhau, tạo ra tín hiệu giao dịch bằng hệ thống hai đường đồng nhất và sử dụng màu sắc và thực thể của đường K làm điều kiện lọc bổ sung, do đó xây dựng một chiến lược giao dịch đường ngắn ổn định và hiệu quả hơn.
Toàn bộ chiến lược sử dụng sự kết hợp của các vùng Brin và các kênh KC để xác định các giai đoạn co thắt và mở rộng của thị trường. Cụ thể, khi vùng Brin nằm trong kênh KC được coi là co thắt, và khi vùng Brin vượt qua kênh KC được coi là mở rộng. Co thắt đại diện cho khả năng gia tăng biến động và đảo ngược xu hướng, khi đó sử dụng sự hồi phục tuyến tính làm chỉ số tín hiệu giao dịch chính.
Nếu biểu đồ hồi quy tuyến tính là dương () và thanh là đường K màu đỏ () và thực thể K lớn hơn 1⁄3 so với trung bình của 30 đường K trước đó, thì tín hiệu kết hợp này sẽ làm nhiều hơn. Ngược lại, nếu biểu đồ hồi quy tuyến tính là âm và thanh là đường K màu xanh lá cây và thực thể cũng lớn hơn, thì sẽ không có gì.
Chiến lược này cũng cung cấp hình ảnh về bối cảnh nén và mở rộng, hỗ trợ đánh giá giai đoạn thị trường.
Có thể giảm nguy cơ bằng cách điều chỉnh các tham số chỉ số, tối ưu hóa các điều kiện lọc.
Chiến lược này có thể được tối ưu hóa theo các khía cạnh sau:
Chiến lược này tổng hợp một số chỉ số, tăng điều kiện lọc đồng thời xác định cơ hội nén, tạo thành một chiến lược đường ngắn hiệu quả và hiệu quả hơn. Hiệu quả tốt hơn có thể đạt được thông qua tối ưu hóa các tham số và điều kiện lọc. Và khung chiến lược này linh hoạt, dễ điều chỉnh để sử dụng trong các giống khác nhau, đáng để thử nghiệm và tối ưu hóa thêm.
/*backtest
start: 2023-11-24 00:00:00
end: 2023-12-24 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//Noro
//2017
//@version=2
strategy(shorttitle = "Squeeze str 1.0", title="Noro's Squeeze Momentum Strategy v1.0", overlay = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0)
//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
length = input(20, title="BB Length")
mult = input(2.0,title="BB MultFactor")
lengthKC=input(20, title="KC Length")
multKC = input(1.5, title="KC MultFactor")
useTrueRange = true
usecolor = input(true, defval = true, title = "Use color of candle")
usebody = input(true, defval = true, title = "Use EMA Body")
needbg = input(false, defval = false, title = "Show trend background")
fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")
// Calculate BB
source = close
basis = sma(source, length)
dev = multKC * stdev(source, length)
upperBB = basis + dev
lowerBB = basis - dev
// Calculate KC
ma = sma(source, lengthKC)
range = useTrueRange ? tr : (high - low)
rangema = sma(range, lengthKC)
upperKC = ma + rangema * multKC
lowerKC = ma - rangema * multKC
sqzOn = (lowerBB > lowerKC) and (upperBB < upperKC)
sqzOff = (lowerBB < lowerKC) and (upperBB > upperKC)
noSqz = (sqzOn == false) and (sqzOff == false)
val = linreg(source - avg(avg(highest(high, lengthKC), lowest(low, lengthKC)),sma(close,lengthKC)), lengthKC,0)
bcolor = iff( val > 0, iff( val > nz(val[1]), lime, green), iff( val < nz(val[1]), red, maroon))
scolor = noSqz ? blue : sqzOn ? black : gray
trend = val > 0 ? 1 : val < 0 ? -1 : 0
//Background
col = needbg == false ? na : trend == 1 ? lime : red
bgcolor(col, transp = 80)
//EMA Body
body = abs(close - open)
emabody = ema(body, 30) / 3
//Signals
bar = close > open ? 1 : close < open ? -1 : 0
up = trend == 1 and (bar == -1 or usecolor == false) and (body > emabody or usebody == false)
dn = trend == -1 and (bar == 1 or usecolor == false) and (body > emabody or usebody == false)
if up
strategy.entry("Long", strategy.long)
if dn
strategy.entry("Short", strategy.short)