Đây là một chiến lược giao dịch định lượng được phát triển dựa trên chỉ số Momentum Squeeze của LazyBear.
Chỉ số cốt lõi của chiến lược này là chỉ số Momentum Squeeze của LazyBear. Chỉ số này xác định xem các Băng Bollinger đang bị
Cụ thể, chiến lược đầu tiên tính toán các Bollinger Band 21 giai đoạn, với chiều rộng 2 độ lệch chuẩn của giá. Đồng thời, nó tính toán các Keltner Channel 20 giai đoạn, với chiều rộng 1,5 lần chiều rộng giá. Khi các Bollinger Band được
Đối với lối ra, khi màu sắc của chỉ số động lượng thay đổi thành màu xám, nó đại diện cho tình trạng ép đã kết thúc và xu hướng có thể đảo ngược.
Bằng cách đánh giá mối quan hệ tổng thể giữa các chỉ số này, độ chính xác của các quyết định giao dịch có thể được cải thiện và giảm khả năng giao dịch sai.
Chiến lược áp lực có thể nắm bắt các điểm chính nơi thị trường có khả năng bùng nổ. Những điểm này thường là các điểm biến động nơi thị trường đưa ra các phán đoán hướng quan trọng. Nếu đánh giá chính xác, chuyển động thị trường tiếp theo sẽ tương đối dài, vì vậy không gian lợi nhuận tiềm năng của chiến lược là rất lớn.
So với giao dịch đột phá ngẫu nhiên, điểm vào được chọn bởi chiến lược này là ở điểm ép giữa Bollinger Bands và Keltner Channels.
Các thông số chu kỳ và thông số băng thông của các băng tần Bollinger và Keltner có tác động lớn đến kết quả giao dịch. Nếu các thông số được đặt không phù hợp, những đánh giá sai có thể xảy ra. Điều này đòi hỏi phải tìm các thông số tối ưu thông qua nhiều backtesting.
Luôn có nguy cơ rằng giá có thể quay trở lại sau khi phá vỡ điểm được chọn bởi chiến lược này, gây ra tổn thất.
Khi trạng thái ép kết thúc, chiến lược này sẽ đóng tất cả các vị trí. Tuy nhiên, đôi khi xu hướng giá vẫn có thể tiếp tục, gây ra nguy cơ thoát sớm.
Thông qua nhiều thử nghiệm dữ liệu backtesting, cài đặt tham số chu kỳ và băng thông tốt hơn có thể được tìm thấy để cải thiện hiệu suất chiến lược.
Thiết lập dừng di chuyển hoặc dao động để nhanh chóng cắt giảm lỗ khi giá đảo ngược.
Khi chiến lược thoát khỏi các vị trí, một số điều kiện tái nhập cảnh có thể được thiết lập để tái nhập thị trường nếu xu hướng tiếp tục.
Cố gắng kết hợp nhiều chỉ số khác nhau, chẳng hạn như các chỉ số biến động khác, chỉ số khối lượng, v.v., để thiết lập một chiến lược tổng hợp tích hợp chỉ số, để cải thiện độ chính xác của quyết định.
Chiến lược này tích hợp các dải Bollinger, kênh Keltner và các chỉ số động lực. Bằng cách đánh giá các mối quan hệ giữa các chỉ số này, nó đi vào các điểm đột phá tỷ lệ thành công cao. Có không gian tối ưu hóa trong nhiều khía cạnh như tối ưu hóa tham số, chiến lược dừng lỗ, điều kiện nhập lại và tích hợp chỉ số tổng hợp để cải thiện hơn nữa hiệu suất chiến lược.
/*backtest start: 2023-12-01 00:00:00 end: 2023-12-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 //All credits to LazyBear. All I did was turn it into a strategy! strategy(title = "SQZMOM STRAT", overlay=false) // --- GENERAL INPUTS --- FromMonth = input(defval = 4, title = "From Month", minval = 1, maxval = 12) FromYear = input(defval = 2020, title = "From Year", minval = 2012) ToMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12) ToYear = input(defval = 9999, title = "To Year", minval = 2017) FromDay = 1 ToDay = 1 start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) // backtest finish window window() => true get_round(value, precision) => round(value * (pow(10, precision))) / pow(10, precision) trade_leverage = input(1, title = "Trade - Leverage", step = 0.25) trade_risk = input(100, title = "Trade - Risk Percent", type = input.float, step = 0.1, minval = 0.1, maxval = 100) tradeType = input("LONG", title="What trades should be taken : ", options=["LONG", "SHORT", "BOTH"]) // --- SQZMOM CODE length = input(21, title="BB Length") mult = input(2.0,title="BB MultFactor") lengthKC=input(20, title="KC Length") multKC = input(1.5, title="KC MultFactor") useTrueRange = input(true, title="Use TrueRange (KC)", type=input.bool) // 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 = color.gray if (val > 0 and val > nz(val[1])) bcolor := color.green if (val < 0 and val < nz(val[1])) bcolor := color.red scolor = noSqz ? color.blue : sqzOn ? color.black : color.gray plot(val, color=bcolor, style=plot.style_histogram, linewidth=4) plot(0, color=scolor, style=plot.style_cross, linewidth=2) // --- VWMA CODE --- useVWMA = input(false, title = "Use VWMA to selectively long/short?", type = input.bool) lengthVWMA=input(42, title = "VWMA Length", step = 1, minval = 1) useCV=input(false, type=input.bool, title="Use Cumulative Volume for VWMA?") nbfs = useCV ? cum(volume) : sum(volume, lengthVWMA) medianSrc=close calc_evwma(price, lengthVWMA, nb_floating_shares) => data = (nz(close[1]) * (nb_floating_shares - volume)/nb_floating_shares) + (volume*price/nb_floating_shares) m=calc_evwma(medianSrc, lengthVWMA, nbfs) // ---STRATEGY--- if ((tradeType == "LONG" or tradeType == "BOTH") and (m>0 or useVWMA == false)) longCondition = (val > 0 and noSqz == 0 and sqzOn == 0 and sqzOn[1] == 1) if (longCondition) contracts = get_round((strategy.equity * trade_leverage / close) * (trade_risk / 100), 4) strategy.entry("LONG", strategy.long, qty = contracts, when = window()) if((tradeType == "SHORT" or tradeType == "BOTH") and (m<0 or useVWMA == false)) shortCondition = (val < 0 and noSqz == 0 and sqzOn == 0 and sqzOn[1] == 1) if (shortCondition) contracts = get_round((strategy.equity * trade_leverage / close) * (trade_risk / 100), 4) strategy.entry("SHORT", strategy.short, qty = contracts, when = window()) if (bcolor == color.gray) strategy.close("LONG") strategy.close("SHORT")