Chiến lược Squeeze Momentum Breakout

Tác giả:ChaoZhang, Ngày: 2024-01-30 17:33:49
Tags:

img

Tổng quan

Đâ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.

Chiến lược logic

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ị máo bởi các kênh Keltner. Khi sự ép xảy ra, nó đại diện cho thị trường đã bước vào một điểm bùng phát tiềm năng. Bằng cách kết hợp hướng của chỉ số đà, các giao dịch có thể được thực hiện khi sự ép được giải phóng để nắm bắt sự bùng phát của thị trường.

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 máp bởi các Keltner Channel, một tín hiệu ép được kích hoạt. Ngoài ra, chiến lược cũng tính toán động lực của giá tương đối với điểm giữa của kênh giá của chính nó trong một khoảng thời gian. Khi một sự ép xảy ra, kết hợp với hướng của chỉ số động lực, nó xác định liệu nên mua hay bán.

Đố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.

Ưu điểm

  1. Tích hợp nhiều chỉ số kỹ thuật để cải thiện độ chính xá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.

  1. Các điểm nén động lượng chính xác với tiềm năng lợi nhuận lớn

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.

  1. Đạt được tỷ lệ thành công cao trong giao dịch thoát

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.

Rủi ro

  1. Nguy cơ cài đặt tham số không chính xác

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.

  1. Rủi ro thất bại đột phá

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.

  1. Rủi ro đảo ngược xu hướng

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.

Hướng dẫn tối ưu hóa

  1. Tối ưu hóa cài đặt tham số

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.

  1. Thêm chiến lược dừng lỗ

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.

  1. Thêm các điều kiện nhập lại

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.

  1. Bao gồm nhiều chỉ số hơn

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.

Tóm lại

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")

Thêm nữa