
Đây là một chiến lược giao dịch định lượng được phát triển dựa trên các chỉ số đè bẹp động lực của LazyBear. Chiến lược này tích hợp các chỉ số đè bẹp động lực, kênh Kalkin và chỉ số động lực để tạo ra các giao dịch đè bẹp động lực có tỷ lệ thắng cao thông qua sự kết hợp của nhiều chỉ số kỹ thuật.
Các chỉ số trung tâm của chiến lược này là chỉ số đè nén động lực của LazyBear. Chỉ số này đánh giá xem các băng Bowring có bị đè nén bởi các đường Kalkin hay không, và khi đè nén xảy ra, nó đại diện cho thị trường đi vào một điểm nổ tiềm năng.
Cụ thể, chiến lược này tính toán ban đầu các băng tần Brin 21 chu kỳ, với băng tần là chênh lệch tiêu chuẩn giá gấp 2 lần. Đồng thời tính toán các kênh Calcin 20 chu kỳ, với băng tần là sự gia tăng giá gấp 1,5 lần.
Trên sân chơi, xu hướng có thể đảo ngược khi màu chỉ số động lượng chuyển sang màu xám, làm bằng vị trí, đại diện cho kết thúc tình trạng ép.
Chiến lược này tích hợp các chỉ số như băng tần Brin, kênh Kalkin và động lực, và bằng cách đánh giá mối quan hệ tổng hợp của các chỉ số này, có thể cải thiện độ chính xác của quyết định giao dịch và giảm khả năng giao dịch sai.
Chiến lược đè nén động lực có thể nắm bắt các điểm mấu chốt của sự bùng nổ thị trường, các điểm này thường là các điểm quan trọng mà thị trường đưa ra quyết định về hướng đi, và nếu được đánh giá đúng, thì sau đó hoạt động theo xu hướng sẽ tương đối dài, do đó chiến lược có tiềm năng lợi nhuận rất lớn.
So với các giao dịch đột phá ngẫu nhiên, các điểm vào được lựa chọn trong chiến lược này nằm ở các điểm chèn của Burin Belt và Kalkin Channel, được đánh giá là có tỷ lệ giao dịch thành công cao hơn bằng cách tích hợp các chỉ số.
Các tham số thời gian và các tham số băng thông của các kênh Brink và Kalkin có ảnh hưởng lớn đến kết quả giao dịch chiến lược. Nếu tham số được thiết lập không đúng cách, sẽ dẫn đến sai lầm. Điều này đòi hỏi phải tìm ra tham số tốt nhất thông qua nhiều lần lặp lại.
Bất kỳ giao dịch phá vỡ nào cũng có nguy cơ thất bại, và khi giá vượt qua điểm chọn của chiến lược, có thể sẽ quay trở lại và gây thiệt hại. Điều này cần phải kiểm soát chặt chẽ.
Khi kết thúc trạng thái ép, chiến lược này sẽ xóa tất cả các vị trí. Tuy nhiên, đôi khi xu hướng giá có thể vẫn tiếp tục, điều này có thể gây ra nguy cơ chiến lược ra đi sớm. Điều này đòi hỏi phải tối ưu hóa logic phán đoán ra đi.
Có thể tìm kiếm các tham số tốt hơn cho chu kỳ và thiết lập băng thông của các kênh Brin và Kalkin, bằng cách kiểm tra dữ liệu và lỗi phản hồi nhiều hơn, để cải thiện hiệu quả của chiến lược.
Có thể thiết lập dừng di chuyển hoặc dừng dao động, dừng nhanh khi giá đảo ngược để kiểm soát sự rút lui tối đa của chiến lược.
Khi chiến lược thoát khỏi vị trí, bạn có thể đặt một số điều kiện nhập lại và có thể vào lại nếu xu hướng tiếp tục.
Có thể thử kết hợp nhiều loại chỉ số khác nhau, chẳng hạn như các chỉ số biến động khác, chỉ số giao dịch, v.v., để tạo ra một chiến lược tổng hợp tích hợp các 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 chỉ số về băng tần Brin, kênh Calc and động lực, và bằng cách đánh giá các mối quan hệ của các chỉ số này, chọn điểm đột phá có tỷ lệ thành công cao. Có nhiều khía cạnh tối ưu hóa trong các tham số tối ưu hóa, chiến lược dừng lỗ, điều kiện tái nhập cảnh và tích hợp các chỉ số phức tạp, có thể nâng cao hiệu quả của chiến lược hơn nữa.
/*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")