
Chiến lược này dựa trên chỉ số động lực nén của LazyBear, kết hợp với các kênh Brin và Keltner, xác định hình thức nén và mở rộng hình thành từ các kênh phá vỡ giá, đánh giá hướng xu hướng tiềm ẩn của giá cổ phiếu, sử dụng phương pháp theo dõi xu hướng để quyết định hướng mở vị trí. Ưu điểm của chiến lược là tận dụng tối đa khả năng của chỉ số động lực để xác định xu hướng tiềm ẩn và thiết lập nhiều bộ lọc điều kiện để kiểm soát chất lượng tín hiệu giao dịch, có thể lọc hiệu quả các tín hiệu giao dịch không chắc chắn, tránh giao dịch quá thường xuyên trong toàn bộ bảng dao động.
Tính toán đường trung, đường trên và đường dưới trong vòng Brin. Đường trung là trung bình di chuyển đơn giản của giá đóng cửa n ngày, đường trên và đường dưới là đường trung cộng m lần chênh lệch tiêu chuẩn của giá đóng cửa n ngày.
Tính trung bình, đường lên và đường xuống trong kênh Keltner. Trung bình là trung bình di chuyển đơn giản của giá đóng cửa n ngày, đường lên và đường xuống là trung bình di chuyển đơn giản của tần số thực của n ngày nhân m.
Xác định xem giá có phá vỡ đường ray lên xuống của Brin Belt và Keltner Channel tạo thành hình thức nén và mở rộng không. Hình thức nén khi giá phá vỡ đường ray xuống từ trên và hình thức mở rộng khi giá phá vỡ đường ray lên từ dưới.
Tính toán giá trị của đường cong hồi quy tuyến tính, làm chỉ số động lực. Khi đường động lực đi qua 0 là tín hiệu mua, khi đi qua 0 là tín hiệu bán.
Kết hợp hình dạng nén mở rộng, hướng chỉ số động lực, bộ lọc giá trị trung bình và nhiều điều kiện để xác định tín hiệu giao dịch cuối cùng. Chỉ khi đáp ứng tất cả các điều kiện, tín hiệu giao dịch sẽ được tạo ra và tránh giao dịch sai.
Sử dụng bộ lọc kép của băng Brin và kênh Keltner để xác định hình dạng nén và mở rộng chất lượng cao.
Chỉ số động lượng có thể bắt kịp xu hướng giá đảo ngược, tạo ra sự tương tác với chỉ số kênh.
Giúp cho người mua có cơ hội tăng lợi nhuận.
Sử dụng nhiều điều kiện phán đoán để tránh thường xuyên mở các vị trí trong tình trạng động đất.
Các tham số chỉ số kỹ thuật có thể được tùy chỉnh để phù hợp với các giống và kết hợp tham số khác nhau.
Có thể thiết lập khoảng thời gian phản hồi để tối ưu hóa thử nghiệm cho chu kỳ thời gian cụ thể.
Chiến lược theo dõi xu hướng, dễ bị tổn thất khi xu hướng bị đảo ngược.
Thiết lập tham số không đúng có thể dẫn đến tần số giao dịch quá cao hoặc chất lượng tín hiệu kém.
Dựa vào các thử nghiệm dữ liệu lịch sử, không có gì đảm bảo về sự ổn định trong tương lai.
Không thể đối phó với sự biến động của thị trường và biến động mạnh của giá cả.
Cài đặt cửa sổ thời gian phản hồi không đúng, có thể dẫn đến quá phù hợp.
Tối ưu hóa các tham số của Burin và Keltner Channel để tìm sự kết hợp tốt nhất.
Thử nghiệm thêm dừng di động để kiểm soát lỗ tối đa trong một giao dịch.
Cố gắng tối ưu hóa hơn nữa trong một sự kết hợp các tham số cụ thể về giống và chu kỳ.
Một mô hình học máy đã được sử dụng để đánh giá xu hướng đảo ngược.
Kiểm tra các chiến lược quản lý thứ tự và vị trí khác nhau.
Nghiên cứu cách nhận ra các tín hiệu đảo ngược xu hướng và ngăn chặn chúng kịp thời.
Chiến lược này kết hợp nhiều chỉ số kỹ thuật để xác định hướng xu hướng giá và theo dõi xu hướng, có khả năng thích ứng mạnh mẽ. Thông qua tùy chỉnh tham số và lọc đa điều kiện, có thể kiểm soát hiệu quả tần số giao dịch và nâng cao chất lượng tín hiệu. Tuy nhiên, giao dịch đảo ngược và sự kiện bất ngờ vẫn cần cảnh giác, có thể tiếp tục khám phá tín hiệu đảo ngược xu hướng và cơ chế kiểm soát rủi ro để tối ưu hóa và làm cho chiến lược trở nên mạnh mẽ hơn.
/*backtest
start: 2022-11-06 00:00:00
end: 2023-11-12 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
//Strategy based on LazyBear Squeeze Momentum Indicator
//I added some custom feature and filters
//
// @author LazyBear
// List of all my indicators:
// https://docs.google.com/document/d/15AGCufJZ8CIUvwFJ9W-IKns88gkWOKBCvByMEvm5MLo/edit?usp=sharing
// v2 - fixed a typo, where BB multipler was always stuck at 1.5. [Thanks @ucsgears]
//
strategy(shorttitle = "SQZMOM_LB", title="Strategy for Squeeze Momentum Indicator [LazyBear]", overlay=false, calc_on_every_tick=true, pyramiding=0,default_qty_type=strategy.percent_of_equity,default_qty_value=100,currency=currency.USD)
length = input(14, title="BB Length")
mult = input(2.0,title="BB MultFactor")
lengthKC=input(16, title="KC Length")
multKC = input(1.5, title="KC MultFactor")
useTrueRange = input(true, title="Use TrueRange (KC)", type=bool)
//FILTERS
useExtremeOrders = input(false, title="Early entry on momentum change", type=bool)
useMomAverage = input(false, title="Filter for Momenutum value", type=bool)
MomentumMin = input(20, title="Min for momentum")
// Calculate BB
src = close
basis = sma(src, length)
dev = mult * stdev(src, length)
upperBB = basis + dev
lowerBB = basis - dev
// Calculate KC
ma = sma(src, 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(src - 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 : aqua
plot(val, color=bcolor, style=histogram, linewidth=4)
plot(0, color=scolor, style=cross, linewidth=2)
//LOGIC
//momentum filter
filterMom=useMomAverage?abs(val)>(MomentumMin/100000)?true:false:true
//standard condition
longCondition = scolor[1]!=aqua and scolor==aqua and bcolor==lime and filterMom
exitLongCondition = bcolor==green and not useExtremeOrders
shortCondition = scolor[1]!=aqua and scolor==aqua and bcolor==red and filterMom
exitShortCondition = bcolor==maroon and not useExtremeOrders
//early entry
extremeLong= useExtremeOrders and scolor==aqua and bcolor==maroon and bcolor[1]!=bcolor[0] and filterMom
exitExtLong = scolor==black or bcolor==red
extremeShort = useExtremeOrders and scolor==aqua and bcolor==green and bcolor[1]!=bcolor[0] and filterMom
exitExtShort = scolor==black or bcolor==lime
//STRATEGY
strategy.entry("SQ_Long", strategy.long, when = longCondition)
strategy.close("SQ_Long",when = exitLongCondition )
strategy.entry("SQ_Long_Ext", strategy.long, when = extremeLong)
strategy.close("SQ_Long_Ext",when = exitExtLong)
//strategy.exit("exit Long", "SQ_Long", when = exitLongCondition)
strategy.entry("SQ_Short", strategy.short, when = shortCondition)
strategy.close("SQ_Short",when = exitShortCondition)
strategy.entry("SQ_Short_Ext", strategy.short, when = extremeShort)
strategy.close("SQ_Short_Ext",when = exitExtShort)
//strategy.exit("exit Short", "SQ_Short", when = exitShortCondition)
// // === Backtesting Dates === thanks to Trost
// testPeriodSwitch = input(true, "Custom Backtesting Dates")
// testStartYear = input(2018, "Backtest Start Year")
// testStartMonth = input(1, "Backtest Start Month")
// testStartDay = input(1, "Backtest Start Day")
// testStartHour = input(0, "Backtest Start Hour")
// testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0)
// testStopYear = input(2018, "Backtest Stop Year")
// testStopMonth = input(12, "Backtest Stop Month")
// testStopDay = input(14, "Backtest Stop Day")
// testStopHour = input(23, "Backtest Stop Hour")
// testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0)
// testPeriod() =>
// time >= testPeriodStart and time <= testPeriodStop ? true : false
// isPeriod = testPeriodSwitch == true ? testPeriod() : true
// // === /END
// if not isPeriod
// strategy.cancel_all()
// strategy.close_all()